Bremsweg JavaScript

/***********************************************
 * Modul: 307
 * Autor: philipp gressly / Santis Training AG
 * Datum: März 2010
 ***********************************************/


/* Initialize: Disable buttons, empty fields and set Default Color*/
function initialisieren() {
  document.getElementById("kmhField")  .value   = "";
  document.getElementById("zustandBox").checked = false;

  setButtonState("", false);
  javaScriptEinschalten();
  bildEinschalten(false);
}


/**
 * Falls JavaScript ausgeschaltet ist: mache nichts ;-) (ginge auch nicht)
 * Falls JavaScript eingeschaltet ist: zeige die JavaScript-abhängige Seite.
 */
function javaScriptEinschalten() {
  var ohneScript = document.getElementById("ohneJavaScript");
  var mitScript  = document.getElementById("mitJavaScript");

  ohneScript.style.display = "none";
  mitScript .style.display = "block";
}


/* Check on every keyUp-Event ...*/
function entryCheck() {

  var kmh     = document.getElementById("kmhField")  .value;
  var zustand = document.getElementById("zustandBox").checked;

  alertUserOnIllegalEntry(kmh);
  setLabelColors();

  setButtonState(kmh, zustand);
}


function setButtonState(kmh, zustand) {
  var submitButton = document.getElementById("submit");
  var resetButton  = document.getElementById("reset");

  submitButton.disabled = ! isFormSubmitable(kmh);
  resetButton.disabled  = ! isFormResetable (kmh, zustand);
}


/* Alert wrong entries and set label colors. */
function alertUserOnIllegalEntry(kmh)
{ 
  alertWrongEntry(kmh,   "kmh");
}	


/* set colors for all labels */
function setLabelColors() {
  setLabelColor("kmh");
}


/* color a single label according to its value.
 *  See "bremsweg.css". 
 */
function setLabelColor(type) {  
  var cls;
  label = document.getElementById(type + "Label");
  value = document.getElementById(type + "Field").value;
  if("" == value)                   { cls = "empty";    }
  else if(isNumericalValue(value))  { cls = "ok";       }
  else if(isOKWhileEntering(value)) { cls = "entering"; }
  else                              { cls = "illegal";  }
  label.setAttribute("class", "entry_" + cls);
}


/**
 * check, if fields are OK (ready to submit).
 * In our case: check, if exactly two (2) fields are
 * filled in.
 */
function isFormSubmitable(kmh) {
  return isNumericalValue(kmh);
}


/* check, if "txt" is a nonempty number */
function isNumericalValue(txt) {
  return ("" != txt && isFinite(txt));
}


/* A value can be wrong while entering - but should not be
 * alerted. E. g. To enter "-6" you have to enter "-" first,
 * which is not ok.
 */
function isOKWhileEntering(value) {
  return (/^(\+)?[0-9]*(\.[0-9]*)?$/.test(value));
}


/**
 * missedValue ist die falsch eingegebene Zahl.
 * Sollte jemand auf dem Dialog (alert) "ENTER" drücken, so wird wieder ein "onchange"
 * ausgelöst, was zu einem neune alert führen würde.
 */
var missedValue = "";
function alertWrongEntry(value, label) {
  // check Field while entering
  if(! isOKWhileEntering(value)) {
    if(missedValue != value) {
      window.alert(label + " muss eine positive Zahl sein!");
      missedValue = value;
    }
  }
}


/*check, if any of the 3 Fields contains a value
 *       so that "reset" makes sense. */
function isFormResetable(kmh, zustand) {
  return ("" != kmh) || (zustand);
}


/* The calculation takes place */
function submitClick() {
  var kmh     = document.getElementById("kmhField"  ).value;
  var nass    = document.getElementById("zustandBox").checked;

  if(isNumericalValue(kmh)) {
    showResult(kmh, nass);
  }
}


/* Show the result in a given "output" field (id = "ausgabe") */
function showResult(kmh, nass) {
  var resultText;
  resultText = bremsweg(kmh, nass).toFixed(2);
  document.getElementById("ausgabeBremsweg").innerHTML = resultText;

  resultText = anhaltestrecke(kmh, nass).toFixed(2);
  document.getElementById("ausgabeAnhaltestrecke").innerHTML = resultText;

  resultText = bremszeit(kmh, nass).toFixed(1);
  document.getElementById("ausgabeBremszeit").innerHTML = resultText;

  resultText = anhaltezeit(kmh, nass).toFixed(1);
  document.getElementById("ausgabeAnhaltezeit").innerHTML = resultText;

  bildEinschalten(bremszeit(kmh, nass) > 3);
}


function bildEinschalten(sichtbar) {
  var vis = sichtbar ? "block" : "none";
  var cDiv = document.getElementById("crashBild");
  cDiv.style.display = vis;
}


/** Berechnugen **/

var reaktionszeitInSekunden  = 1.0;
var bremsverzoegerungTrocken = 7.7;
var bremsverzoegerungNass    = 4;

function bremsverzoegerung(nass) {
  return nass ? bremsverzoegerungNass : bremsverzoegerungTrocken;
}

function bremsweg(kmh, nass) {
  var vms = kmh / 3.6;
  var a   = bremsverzoegerung(nass);
  return vms * vms / 2 / a;
}

function anhaltestrecke(kmh, nass) {
  var vms = kmh / 3.6;
  return bremsweg(kmh, nass) + vms * reaktionszeitInSekunden;
}

function bremszeit(kmh, nass) {
  var vms = kmh / 3.6;
  var a   = bremsverzoegerung(nass);
  return vms / a;
}

function anhaltezeit(kmh, nass) {
  return bremszeit(kmh, nass) + reaktionszeitInSekunden;
}