<!------- hide the script from old browsers (biofilm JavaScripts)
// functions for the biofilm & biodiversity activities

function launch(file)
{
  // need to open window twice because of a bug in X and Mac versions...
  // from http://www.parallax.co.uk/~rolf by Rolf Howarth
  hwnd =   window.open(file,"calc","toolbar=no,directories=no,menubar=no,width=180,height=290");
  hwnd = window.open(file,"calc");
}

// following script written by Dan Jacobs, Maryland Sea Grant

function get_calculator() {
  var msg = "For each exercise, you can use your own calculator, ";
  msg += "scratch paper or <A href=\"javascript:launch('scalc.htm')\" ";
  msg += "onMouseOver=\"on_msover('Pop up window with the calculator');";
  msg += "return true;\" ";
  msg += "onMouseOut=\"on_msout();return true;\">";
  msg += "Rolf's calculator</A>.\n";
  document.write(msg);
}

function calc(form,which) {
  precision = 0.001; // +/- accuracy of student math
  // names of the organisms
  Org1 ='Whip Mud Worms';
  Org2 ='Mussels';
  Org3 ='Barnacles';
  Org4 ='White Anemones';
  Org5 ='Dusky Sea Slugs';
  Org6 ='Isopods';
  // calculation answers
  N1 = 8;
  N2 = 20;
  N3 = 15;
  N4 = 5;
  N5 = 2;
  N6 = 6;
  if (form.NORG.value == 3) { S = 3; TotOrg = N1 + N2 + N3; }
  else { S = 6; TotOrg = N1 + N2 + N3 + N4 + N5 + N6; }
  Pi1 = N1/TotOrg; Pi21 = Pi1 * Pi1; Pil1 = Pi1*Math.log(Pi1);
  Pi2 = N2/TotOrg; Pi22 = Pi2 * Pi2; Pil2 = Pi2*Math.log(Pi2);
  Pi3 = N3/TotOrg; Pi23 = Pi3 * Pi3; Pil3 = Pi3*Math.log(Pi3);
  if (form.NORG.value == 6) {
    Pi4 = N4/TotOrg; Pi24 = Pi4 * Pi4; Pil4 = Pi4*Math.log(Pi4);
    Pi5 = N5/TotOrg; Pi25 = Pi5 * Pi5; Pil5 = Pi5*Math.log(Pi5);
    Pi6 = N6/TotOrg; Pi26 = Pi6 * Pi6; Pil6 = Pi6*Math.log(Pi6);
  }
  if (which == "part1a") { richness(form); }
  else if (which == "part1b") { Pi_calc(form); }
  else if (which == "part1c") { Pi2_calc(form); }
  else if (which == "part1d") { D_calc(form); }
  else if (which == "part2c") { PiLogPi_calc(form); }
  else if (which == "part2d") { H_calc(form); }
}

function correct (next_step) {
  var msg = 'part ' + next_step;
  if (next_step == "next") { msg = 'the next activity'; }
  alert("Congratulations!\nPlease go to " + msg + ".\n");
  top.location.href = "#" + next_step; // go to next step
 
}

function checkInt(input, target, msg) {
  // input - student entry, target - correct value, msg - which variable
  var str = input;
  if (!input)
    { alert(msg + " was not entered.\n\nPlease try again."); return false; }
  for (var i = 0; i < str.length; i++) {
    var ch = str.substring(i, i + 1)
    if (ch < "0" || "9" < ch) { 
      alert(msg + " is not a positive integer.\n\nPlease try again."); 
      return false; 
    }
  }
  if (str != S) {
    msg = msg + " is not correct.\nIt looks like you made a math error.";
    alert(msg + "\n\nPlease try again.")
    return false;
  }
  input.value = str;
  return true;
}

function checkNum (input, target, msg) {
  // input - student entry, target - correct value, msg - which variable
  var str = input;
  var dot = 0;
  var neg = 0;
  if (!input) 
    { alert(msg + " was not entered.\n\nPlease try again."); return false; }
  for (var i = 0; i < str.length; i++) {
    var ch = str.substring(i, i + 1)
    if (ch == "-") { neg++; }
    if (ch == ".") { dot++; }
    if ( dot > 1 || neg > 1 ) { 
      alert(msg + " is not a number.\n\nPlease try again."); 
      return false; 
    }
    if ((ch < "0" || "9" < ch) && ch != '.' && ch !="-") { 
      alert(msg + " is not a number.\n\nPlease try again."); 
      return false; 
    }
  }
  var num = 1 * str; // convert from text to number
  var min = target - precision;
  var max = target + precision;
  if (num < min || max < num) {
    msg = msg + " is not correct.\nIt looks like you made a math error.";
    alert(msg + "\n\nPlease try again.")
    return false;
  }
  input.value = str;
  return true;
}

function proceed(form,check_value,true_value,part,step) { 
  // check if previous part finished
  var round_value= round_off(true_value*1000)/1000;
  var min = round_value - precision;
  var max = round_value + precision;
  if (check_value < min || max < check_value) {
    alert("You skipped part " + step + ".\n\nPlease try again."); 
    clearForm(form,part); return false; 
  }
  else return true;
}

function round_off(value) {
  // round off the value to the nearest 0.001
  //var a = Math.round(value*10000);
  //var b = Math.round(value*1000) * 10;
  //if (a - b >=  5) { b += 10; }
  //b = Math.round(b/10)/1000;

  var b = Math.round(value*1000) / 1000;

  if (browser_name == "Netscape" && browser_version < 5.0)  {
    if (b < 1.0 && b > 0.1) { b = '0' + b; }
    else if (b > -1 && b < -0.1) { b = '-0' + -1*b; }
  }
  return b;
}

function clearForm (form,which) {
  if (which == "part1a") {
    form.S.value = form.Sb.value = form.Sc.value = form.Sd.value = "";
  }
  else if (which == "part1b") {
    form.Pi1.value = form.Pi2.value = form.Pi3.value = "";
    form.PiTot.value = "";
    form.Pic1.value = form.Pic2.value = form.Pic3.value = "";
    form.PicTot.value = "";
    form.Pid1.value = form.Pid2.value = form.Pid3.value = "";
    form.PidTot.value = "";
    if (form.NORG.value == 6) { 
      form.Pi4.value = form.Pi5.value = form.Pi6.value = "";
      form.Pic4.value = form.Pic5.value = form.Pic6.value = "";
      form.Pid4.value = form.Pid5.value = form.Pid6.value = "";
    }
  }
  else if (which == "part1c" || which == "part2c") {
    form.Pi21.value = form.Pi22.value = form.Pi23.value = "";
    form.Pi2Tot.value = "";
    form.Pi2d1.value = form.Pi2d2.value = form.Pi2d3.value = "";
    form.Pi2dTot.value = "";
    if (which == "part1c") { form.D.value = ""; }
    if (form.NORG.value == 6) { 
      form.Pi24.value = form.Pi25.value = form.Pi26.value = "";
      form.Pi2d4.value = form.Pi2d5.value = form.Pi2d6.value = "";
    }
  }
  else { form.D1.value = form.D2.value = ""; }
}

function richness(form) { // part a
  var value = form.S.value;
  if (!checkInt(value,S,'S')) 
    { form.Sb.value = form.Sc.value = form.Sd.value = ""; }
  else { 
    form.Sb.value = form.Sc.value = form.Sd.value = form.S.value;
    correct('b');
  }
}

function Pi_calc(form) { // part b
  var org;
  var org = 'Pi for ' + Org1;
  if (!proceed(form,form.Sb.value,S,'part1b','a')) { return; }
  if (!checkNum(form.Pi1.value,Pi1,org)) 
    { form.Pic1.value = form.Pid1.value = ''; return; }
  var value = 1 * form.Pi1.value;
  var sum = value * 1;
  form.Pi1.value = form.Pic1.value = form.Pid1.value = round_off(value);
  org = 'Pi for ' + Org2;
  if (!checkNum(form.Pi2.value,Pi2,org)) 
    { form.Pic2.value = form.Pid2.value = '';  return; }
  value = 1 * form.Pi2.value;
  sum += value;
  form.Pi2.value = form.Pic2.value = form.Pid2.value = round_off(value);
  org = 'Pi for ' + Org3;
  if (!checkNum(form.Pi3.value,Pi3,org)) 
    { form.Pic3.value = form.Pid3.value = ''; return; }
  value = 1 * form.Pi3.value;
  sum += value;
  form.Pi3.value = form.Pic3.value = form.Pid3.value = round_off(value);
  if (form.NORG.value == 6) { 
   org = 'Pi for ' + Org4;
   if (!checkNum(form.Pi4.value,Pi4,org)) 
    { form.Pic4.value = form.Pid4.value = ''; return; }
   value = 1 * form.Pi4.value;
   sum += value;
   form.Pi4.value = form.Pic4.value = form.Pid4.value = round_off(value);
   org = 'Pi for ' + Org5;
   if (!checkNum(form.Pi5.value,Pi5,org)) 
    { form.Pic5.value = form.Pid5.value = ''; return; }
   value = 1 * form.Pi5.value;
   sum += value;
   form.Pi5.value = form.Pic5.value = form.Pid5.value = round_off(value);
   org = 'Pi for ' + Org6;
   if (!checkNum(form.Pi6.value,Pi6,org)) 
    { form.Pic6.value = form.Pid6.value = ''; return; }
   value = 1 * form.Pi6.value;
   sum += value;
   form.Pi6.value = form.Pic6.value = form.Pid6.value = round_off(value);
  }
  form.PiTot.value = form.PicTot.value = form.PidTot.value = round_off(sum);
  correct('c');
}

function Pi2_calc(form) { // part c - Simpson's index
  var org;
  if (!proceed(form,form.Sc.value,S,'part1c','a')) { return; }
  if (!proceed(form,form.Pic1.value,Pi1,'part1c','b')) { return; }
  if (!proceed(form,form.Pic2.value,Pi2,'part1c','b')) { return; }
  if (!proceed(form,form.Pic3.value,Pi3,'part1c','b')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pic4.value,Pi4,'part1c','b')) { return; }
    if (!proceed(form,form.Pic5.value,Pi5,'part1c','b')) { return; }
    if (!proceed(form,form.Pic6.value,Pi6,'part1c','b')) { return; }
  }
  org = 'Pi2 for ' + Org1;
  if (!checkNum(form.Pi21.value,Pi21,org)) { form.Pi2d1.value = ''; return;}
  var value = 1 * form.Pi21.value;
  var sum = value * 1;
  form.Pi2d1.value = form.Pi21.value = round_off(value); 
  org = 'Pi2 for ' + Org2;
  if (!checkNum(form.Pi22.value,Pi22,org)) { form.Pi2d2.value = ''; return;}
  value = 1 * form.Pi22.value;
  sum += value;
  form.Pi2d2.value = form.Pi22.value = round_off(value); 
  org = 'Pi2 for ' + Org3;
  if (!checkNum(form.Pi23.value,Pi23,org)) { form.Pi2d3.value = ''; return;}
  value = 1 * form.Pi23.value;
  sum += value;
  form.Pi2d3.value = form.Pi23.value = round_off(value); 
  if (form.NORG.value == 6) {
    org = 'Pi2 for ' + Org4;
    if (!checkNum(form.Pi24.value,Pi24,org)) { form.Pi2d4.value = ''; return;}
    value = 1 * form.Pi24.value;
    sum += value;
    form.Pi2d4.value = form.Pi24.value = round_off(value);
    org = 'Pi2 for ' + Org5;
    if (!checkNum(form.Pi25.value,Pi25,org)) { form.Pi2d5.value = ''; return;}
    value = 1 * form.Pi25.value;
    sum += value;
    form.Pi2d5.value = form.Pi25.value = round_off(value);
    org = 'Pi2 for ' + Org6;
    if (!checkNum(form.Pi26.value,Pi26,org)) { form.Pi2d6.value = ''; return;}
    value = 1 * form.Pi26.value;
    sum += value;
    form.Pi2d6.value = form.Pi26.value = round_off(value);
  }
  form.Pi2dTot.value = form.D.value = form.Pi2Tot.value = round_off(sum);
  correct('d');
}

function D_calc(form) { // part d - Simpson's index
  if (!proceed(form,form.Sd.value,S,'part1d','a')) { return; }
  if (!proceed(form,form.Pid1.value,Pi1,'part1d','b')) { return; }
  if (!proceed(form,form.Pid2.value,Pi2,'part1d','b')) { return; }
  if (!proceed(form,form.Pid3.value,Pi3,'part1d','b')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pid4.value,Pi4,'part1d','b')) { return; }
    if (!proceed(form,form.Pid5.value,Pi5,'part1d','b')) { return; }
    if (!proceed(form,form.Pid6.value,Pi6,'part1d','b')) { return; }
  }
  if (!proceed(form,form.Pi2d1.value,Pi21,'part1d','c')) { return; }
  if (!proceed(form,form.Pi2d2.value,Pi22,'part1d','c')) { return; }
  if (!proceed(form,form.Pi2d3.value,Pi23,'part1d','c')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pi2d4.value,Pi24,'part1d','c')) { return; }
    if (!proceed(form,form.Pi2d5.value,Pi25,'part1d','c')) { return; }
    if (!proceed(form,form.Pi2d6.value,Pi26,'part1d','c')) { return; }
  }
  D1 = 1 - form.D.value;
  D2 = 1/form.D.value;
  if (!checkNum(form.D1.value,D1,'1 - D')) { return; }
  form.D1.value = round_off(form.D1.value);
  if (!checkNum(form.D2.value,D2,'1/D')) { return; }
  form.D2.value = round_off(form.D2.value); 
  correct('next');
}

function PiLogPi_calc(form){ // part c - Shannon-Wiener index
  var org;
  if (!proceed(form,form.Sc.value,S,'part2c','a')) { return; }
  if (!proceed(form,form.Pic1.value,Pi1,'part2c','b')) { return; }
  if (!proceed(form,form.Pic2.value,Pi2,'part2c','b')) { return; }
  if (!proceed(form,form.Pic3.value,Pi3,'part2c','b')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pic4.value,Pi4,'part2c','b')) { return; }
    if (!proceed(form,form.Pic5.value,Pi5,'part2c','b')) { return; }
    if (!proceed(form,form.Pic6.value,Pi6,'part2c','b')) { return; }
  }
  org = 'Pi*ln(Pi) for ' + Org1;
  if (!checkNum(form.Pi21.value,Pil1,org)) { form.Pi2d1.value = ''; return;}
  var value = 1 * form.Pi21.value;
  var sum = value * 1;
  form.Pi2d1.value = form.Pi21.value = round_off(value);
  org = 'Pi*log(Pi) for ' + Org2;
  if (!checkNum(form.Pi22.value,Pil2,org)) { form.Pi2d2.value = ''; return;}
  value = 1 * form.Pi22.value;
  sum += value;
  form.Pi2d2.value = form.Pi22.value = round_off(value);
  org = 'Pi*log(Pi) for ' + Org3;
  if (!checkNum(form.Pi23.value,Pil3,org)) { form.Pi2d3.value = ''; return;}
  value = 1 * form.Pi23.value;
  sum += value;
  form.Pi2d3.value = form.Pi23.value = round_off(value);
  if (form.NORG.value == 6) {
    org = 'Pi*log(Pi) for ' + Org4;
    if (!checkNum(form.Pi24.value,Pil4,org)) { form.Pi2d4.value = ''; return;}
    value = 1 * form.Pi24.value;
    sum += value;
    form.Pi2d4.value = form.Pi24.value = round_off(value); 
    org = 'Pi*log(Pi) for ' + Org5;
    if (!checkNum(form.Pi25.value,Pil5,org)) { form.Pi2d5.value = ''; return;}
    value = 1 * form.Pi25.value;
    sum += value;
    form.Pi2d5.value = form.Pi25.value = round_off(value);
    org = 'Pi*log(Pi) for ' + Org6;
    if (!checkNum(form.Pi26.value,Pil6,org)) { form.Pi2d6.value = ''; return;}
    value = 1 * form.Pi26.value;
    sum += value;
    form.Pi2d6.value = form.Pi26.value = round_off(value);
  }
  form.Pi2dTot.value = form.Pi2Tot.value = round_off(sum);
  correct('part d');
}

function H_calc(form) { // part d - Shannon-Wiener index
  if (!proceed(form,form.Sd.value,S,'part1d','a')) { return; }
  if (!proceed(form,form.Pid1.value,Pi1,'part1d','b')) { return; }
  if (!proceed(form,form.Pid2.value,Pi2,'part1d','b')) { return; }
  if (!proceed(form,form.Pid3.value,Pi3,'part1d','b')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pid4.value,Pi4,'part1d','b')) { return; }
    if (!proceed(form,form.Pid5.value,Pi5,'part1d','b')) { return; }
    if (!proceed(form,form.Pid6.value,Pi6,'part1d','b')) { return; }
  }
  if (!proceed(form,form.Pi2d1.value,Pil1,'part1d','c')) { return; }
  if (!proceed(form,form.Pi2d2.value,Pil2,'part1d','c')) { return; }
  if (!proceed(form,form.Pi2d3.value,Pil3,'part1d','c')) { return; }
  if (form.NORG.value == 6) { 
    if (!proceed(form,form.Pi2d4.value,Pil4,'part1d','c')) { return; }
    if (!proceed(form,form.Pi2d5.value,Pil5,'part1d','c')) { return; }
    if (!proceed(form,form.Pi2d6.value,Pil6,'part1d','c')) { return; }
  }


  D1 = -1 * form.Pi2dTot.value;
  D2 = D1 / Math.log(form.Sd.value);
  if (!checkNum(form.D1.value,D1,'H')) { return; }
  form.D1.value = round_off(form.D1.value);
  if (!checkNum(form.D2.value,D2,'E')) { return; }
  form.D2.value = round_off(form.D2.value);
  correct('the next activity.');
}

//close off comment to hide this script from old browsers----------->

