Correction for Phosforic SG. Water treatment is a viewer. Start reordering and optimizing the calculations.

Sat, 06 Aug 2022 18:44:22 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 06 Aug 2022 18:44:22 +0200
changeset 825
8b87ad5bd3c3
parent 824
26ffc2fb0eaf
child 826
4e681bc073bd

Correction for Phosforic SG. Water treatment is a viewer. Start reordering and optimizing the calculations.

www/js/global.js file | annotate | diff | comparison | revisions
www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/js/rec_view.js file | annotate | diff | comparison | revisions
www/prod_edit.php file | annotate | diff | comparison | revisions
--- a/www/js/global.js	Fri Aug 05 20:11:11 2022 +0200
+++ b/www/js/global.js	Sat Aug 06 18:44:22 2022 +0200
@@ -393,7 +393,7 @@
  /* Note: AcidSG is for 100% use. AcidPrc is the default setting. */
  { id: 0, en: 'Lactic', nl: 'Melkzuur', pK1: 3.86, pK2: 20, pK3: 20, MolWt: 90.08, AcidSG: 1238, AcidPrc: 80 },
  { id: 1, en: 'Hydrochloric', nl: 'Zoutzuur', pK1: -7, pK2: 20, pK3: 20, MolWt: 36.46, AcidSG: 1497, AcidPrc: 28 },
- { id: 2, en: 'Phosphoric', nl: 'Fosforzuur', pK1: 2.12, pK2: 7.20, pK3: 12.44, MolWt: 98.00, AcidSG: 1982, AcidPrc: 75 },
+ { id: 2, en: 'Phosphoric', nl: 'Fosforzuur', pK1: 2.12, pK2: 7.20, pK3: 12.44, MolWt: 98.00, AcidSG: 1773, AcidPrc: 75 },
  { id: 3, en: 'Sulfuric', nl: 'Zwavelzuur', pK1: -1, pK2: 1.92, pK3: 20, MolWt: 98.07, AcidSG: 1884, AcidPrc: 93 }
 ],
 AcidTypeSource = {
--- a/www/js/prod_edit.js	Fri Aug 05 20:11:11 2022 +0200
+++ b/www/js/prod_edit.js	Sat Aug 06 18:44:22 2022 +0200
@@ -35,17 +35,6 @@
   cancelButton: $('#volumeReady')
  });
 
- $('#popupMash').jqxWindow({
-  width: 800,
-  height: 400,
-  position: { x: 230, y: 100 },
-  resizable: false,
-  theme: theme,
-  isModal: true,
-  autoOpen: false,
-  cancelButton: $('#MashReady'),
-  modalOpacity: 0.40
- });
 }
 
 
@@ -604,7 +593,7 @@
    $('#sparge_ph').val(dataRecord.sparge_ph);
    $('#sparge_volume').val(dataRecord.sparge_volume);
    $('#sparge_source').val(dataRecord.sparge_source);
-   $('#sparge_acid_type').val(dataRecord.sparge_acid_type);
+   $('#sparge_acid_type').val(AcidTypeData[dataRecord.sparge_acid_type].nl);
    $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
    $('#sparge_acid_amount').val(dataRecord.sparge_acid_amount * 1000);
    $('#calc_acid').val(dataRecord.calc_acid);
@@ -946,19 +935,19 @@
      if (row.m_use_use == 6) {  // Sparge
       switch (row.m_name) {
        case 'CaCl2':
-//        $('#ss_cacl2').val(row.m_amount * 1000);
+        $('#ss_cacl2').val(row.m_amount * 1000);
         break;
        case 'CaSO4':
-//        $('#ss_caso4').val(row.m_amount * 1000);
+        $('#ss_caso4').val(row.m_amount * 1000);
         break;
        case 'MgSO4':
-//        $('#ss_mgso4').val(row.m_amount * 1000);
+        $('#ss_mgso4').val(row.m_amount * 1000);
         break;
        case 'NaCl':
-//        $('#ss_nacl').val(row.m_amount * 1000);
+        $('#ss_nacl').val(row.m_amount * 1000);
         break;
        case 'MgCl2':
-//        $('#ss_mgcl2').val(row.m_amount * 1000);
+        $('#ss_mgcl2').val(row.m_amount * 1000);
         break;
       }
      }
@@ -1137,8 +1126,6 @@
     { name: 'step_ph', type: 'float' },
     { name: 'step_sg', type: 'float' }
    ],
-   addrow: function(rowid, rowdata, position, commit) { commit(true); },
-   deleterow: function(rowid, commit) { commit(true); }
   },
   mashAdapter = new $.jqx.dataAdapter(mashSource);
 
@@ -1148,62 +1135,21 @@
    source: mashAdapter,
    theme: theme,
    selectionmode: 'singlerow',
-   showtoolbar: true,
-   rendertoolbar: function(toolbar) {
-    var container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
-    toolbar.append(container);
-    container.append('<input style="float: left; margin-left: 165px;" id="saddrowbutton" type="button" value="Nieuwe stap" />');
-    container.append('<input style="float: left; margin-left: 565px;" id="sdeleterowbutton" type="button" value="Verwijder stap" />');
-    $('#saddrowbutton').jqxButton({ template: 'primary', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) });
-    $('#saddrowbutton').on('click', function() {
-     var row = {}, rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
-     row['step_name'] = 'Stap ' + (rowscount + 1);
-     if (rowscount > 0) {
-      row['step_type'] = 1;
-      row['step_infuse_amount'] = 0.0;
-      row['step_volume'] = mash_infuse;
-     } else {
-      row['step_type'] = 0;
-      row['step_infuse_amount'] = 15.0;
-      row['step_volume'] = 15;
-     }
-     row['step_infuse_temp'] = 0;
-     row['step_temp'] = 62.0;
-     row['step_time'] = 20.0;
-     row['step_wg_ratio'] = 0.0;
-     row['ramp_time'] = 1.0;
-     row['end_temp'] = 62.0;
-     row['step_ph'] = 0.0;
-     row['step_sg'] = 0.0;
-     $('#mashGrid').jqxGrid('addrow', null, row);
-     calcMash();
-    });
-    // delete selected step.
-    $('#sdeleterowbutton').jqxButton({ template: 'danger', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) });
-    $('#sdeleterowbutton').on('click', function() {
-     var rowscount, id, selectedrowindex = $('#mashGrid').jqxGrid('getselectedrowindex');
-     rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
-     if (selectedrowindex >= 0 && selectedrowindex < rowscount) {
-      id = $('#mashGrid').jqxGrid('getrowid', selectedrowindex);
-      $('#mashGrid').jqxGrid('deleterow', id);
-      calcMash();
-     }
-    });
-   },
+   editable: false,
    ready: function() {
     /* Calculate the whole recipe */
     console.log('ready mashs, start calculations');
-    calcFermentables();
-    whirlpoolHops();
-    calcIBUs();
-    calcMiscs();
-    calcViability();
-    showStarter();
-    calcYeast();
-    calcInit();
+    /* calcFermentables() must be first and is done by the grid load. Here it is too late. */
     calcMash();
     calcWater();
-    kookTijd();
+    calcIBUs();
+    whirlpoolHops();
+    calcMiscs();
+//    calcViability();
+//    showStarter();
+//    calcYeast();
+//    calcInit();
+//    kookTijd();
     console.log('calculations ready');
     $('#jqxLoader').jqxLoader('close');
     $('#jqxTabs').jqxTabs('first');
@@ -1246,78 +1192,13 @@
       }
     },
     { text: 'pH', datafield: 'step_ph', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f2' },
-    { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' },
-    { text: '', columntype: 'button', width: 15, align: 'center',
-     cellsrenderer: function(row) {
-      if (row < 2)
-       return ' ';
-      return '▴';
-     }, buttonclick: function(row) {
-      if (row >= 2) {
-       swapMash(row, row-1);
-      }
-     }
-    },
-    { text: '', columntype: 'button', width: 15, align: 'center',
-     cellsrenderer: function(row) {
-      rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
-      if (row < 1 || row > (rowscount -2))
-       return ' ';
-      return '▾';
-     }, buttonclick: function(row) {
-      rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
-      if (row >= 1 && row <= (rowscount -2)) {
-       swapMash(row, row+1);
-      }
-     }
-    },
-    { text: '', datafield: 'Edit', columntype: 'button', width: 80, align: 'center',
-     cellsrenderer: function() {
-      return 'Wijzig';
-     }, buttonclick: function(row) {
-      if (dataRecord.stage > 3) {
-       alert('Het maischen is al gedaan.');
-      } else {
-       mashRow = row;
-       mashData = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-       if (mashRow == 0)
-        $("#wstep_type").jqxDropDownList('disableAt', 2);
-       else
-        $("#wstep_type").jqxDropDownList('enableAt', 2);
-       $('#wstep_name').val(mashData.step_name);
-       $('#wstep_type').val(mashData.step_type);
-       $('#wstep_infuse_amount').val(mashData.step_infuse_amount);
-       $('#wstep_infuse_temp').val(mashData.step_infuse_temp);
-       $('#wstep_temp').val(mashData.step_temp);
-       $('#wend_temp').val(mashData.end_temp);
-       $('#wstep_time').val(mashData.step_time);
-       $('#wramp_time').val(mashData.ramp_time);
-       $('#wstep_infuse_amount').hide(); // Hide all untile we need it.
-       $('#wstep_infuse_temp').hide();
-       $('#wstep_pmpt_amount').hide();
-       $('#wstep_pmpt_temp').hide();
-       if (mashData.step_type == 0) {
-        if (mashRow == 0) {
-         $('#wstep_infuse_amount').show();
-         $('#wstep_pmpt_amount').show();
-        } else {
-         $('#wstep_infuse_temp').show();
-         $('#wstep_pmpt_temp').show();
-        }
-       }
-       $('#wstep_ph').val(mashData.step_ph);
-       $('#wstep_sg').val(mashData.step_sg);
-       // show the popup window.
-       $('#popupMash').jqxWindow('open');
-      }
-     }
-    }
+    { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' }
    ]
   });
  };
 
  /*
-  * Remove the top menu so that we MUST use the buttons to leave the editor.
+  * Remove the top menu so that we MUST use the button to leave the editor.
   */
  $('#jqxMenu').jqxMenu('destroy');
  console.log('record:' + my_record + '  return:' + my_return + '  theme:' + theme);
@@ -1338,21 +1219,6 @@
   }
  }
 
- function swapMash(r1, r2) {
-
-  console.log('swap mash rows ' + r1 + ' ' + r2);
-  var row1 = $('#mashGrid').jqxGrid('getrowdata', r1);
-  var row2 = $('#mashGrid').jqxGrid('getrowdata', r2);
-  var obj1 = { step_name: row1.step_name, step_type: row1.step_type, step_volume: row1.step_volume, step_infuse_amount: row1.step_infuse_amount,
-               step_infuse_temp: row1.step_infuse_temp, step_temp: row1.step_temp, step_time: row1.step_time,
-               ramp_time: row1.ramp_time, end_temp: row1.end_temp, step_wg_ratio: row1.step_wg_ratio, step_ph: row1.step_ph, step_sg: row1.step_sg };
-  var obj2 = { step_name: row2.step_name, step_type: row2.step_type, step_volume: row2.step_volume, step_infuse_amount: row2.step_infuse_amount,
-               step_infuse_temp: row2.step_infuse_temp, step_temp: row2.step_temp, step_time: row2.step_time,
-               ramp_time: row2.ramp_time, end_temp: row2.end_temp, step_wg_ratio: row2.step_wg_ratio, step_ph: row2.step_ph, step_sg: row2.step_sg };
-  $("#mashGrid").jqxGrid('updaterow', r1, obj2);
-  $("#mashGrid").jqxGrid('updaterow', r2, obj1);
- }
-
  function infusionVol(step_infused, step_mashkg, infuse_temp, step_temp, last_temp) {
   var a = last_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt);
   var b = step_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt);
@@ -1796,40 +1662,6 @@
   $('#brew_sparge_est').val(spoelw);
  }
 
- /*
-  * Change OG of recipe but keep the water volumes.
-  */
- function calcFermentablesFromOG(OG) {
-
-  console.log('calcFermentablesFromOG(' + OG + ')');
-  var amount, row, d, i, sug, tot = 0, totmass = 0, rowscount, efficiency = parseFloat($('#efficiency').jqxNumberInput('decimal'));
-  sug = sg_to_plato(OG) * parseFloat($('#batch_size').jqxNumberInput('decimal')) * OG / 100;      //total amount of sugars in kg
-  rowscount = dataRecord.fermentables.length;
-
-  for (i = 0; i < rowscount; i++) {
-   row = dataRecord.fermentables[i];
-   if (row.f_added < 4) {
-    d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100);
-    if (row.f_added == 0)   // Mash
-     d = efficiency / 100 * d;
-    tot += d;
-   }
-  }
-  if (tot)
-   totmass = Round(sug / tot, 3);
-
-  if (totmass) {
-   for (i = 0; i < rowscount; i++) {
-    row = dataRecord.fermentables[i];
-    if (row.f_added < 4) {
-     amount = Math.round(row.f_percentage * 10 * totmass) / 1000;
-     dataRecord.fermentables[i].f_amount = amount;
-     $('#fermentableGrid').jqxGrid('setcellvalue', i, 'f_amount', amount);
-    }
-   }
-  }
- };
-
  function getNeededYeastCells() {
 
   var plato, volume, sg = dataRecord.brew_fermenter_sg;
@@ -2310,20 +2142,6 @@
   $('#plato_cells').val(parseFloat(use_cells / (volume * plato)));
  };
 
- function adjustHops(factor) {
-
-  //console.log('adjustHops(' + factor + ')');
-  var row, i, amount, rowscount = dataRecord.hops.length;
-  if (rowscount == 0)
-   return;
-  for (i = 0; i < rowscount; i++) {
-   row = dataRecord.hops[i];
-   amount = row.h_amount * factor;
-   dataRecord.hops[i].h_amount = amount;
-   $('#hopGrid').jqxGrid('setcellvalue', i, 'h_amount', amount);
-  }
- };
-
  function whirlpoolHops() {
   var row, i, time, rowscount = dataRecord.hops.length;
   if (rowscount == 0)
@@ -2357,96 +2175,6 @@
   calcSupplies();
  };
 
- function adjustMiscs(factor) {
-
-  //console.log('adjustMiscs(' + factor + ')');
-  var row, i, amount, rowscount = dataRecord.miscs.length;
-  if (rowscount == 0)
-   return;
-  for (i = 0; i < rowscount; i++) {
-   row = dataRecord.miscs[i];
-   amount = row.m_amount * factor;
-   dataRecord.miscs[i].m_amount = amount;
-   $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount);
-   switch (row.m_name) {
-    case 'CaCl2':
-     $('#wa_cacl2').val(row.m_amount * 1000);
-     break;
-    case 'CaSO4':
-     $('#wa_caso4').val(row.m_amount * 1000);
-     break;
-    case 'MgSO4':
-     $('#wa_mgso4').val(row.m_amount * 1000);
-     break;
-    case 'NaCl':
-     $('#wa_nacl').val(row.m_amount * 1000);
-     break;
-    case 'MgCl2':
-     $('#wa_mgcl2').val(row.m_amount * 1000);
-     break;
-    case 'NaHCO3':
-     $('#wa_nahco3').val(row.m_amount * 1000);
-     break;
-    case 'CaCO3':
-     $('#wa_caco3').val(row.m_amount * 1000);
-     break;
-    case 'Melkzuur':
-    case 'Zoutzuur':
-    case 'Fosforzuur':
-    case 'Zwavelzuur':
-     $('#wa_acid').val(row.m_amount * 1000);
-     break;
-   }
-  }
- };
-
- function adjustYeasts(factor) {
-
-  //console.log('adjustYeasts(' + factor + ')');
-  var row, i, amount, rowscount = dataRecord.yeasts.length;
-  if (rowscount == 0)
-   return;
-  for (i = 0; i < rowscount; i++) {
-   row = dataRecord.yeasts[i];
-   if (! dataRecord.starter_enable) { // Only adjust without a starter
-    amount = row.y_amount * factor;
-    dataRecord.yeasts[i].y_amount = amount;
-    $('#yeastGrid').jqxGrid('setcellvalue', i, 'y_amount', amount);
-   }
-  }
-  calcYeast();
- };
-
- function adjustWaters(factor) {
-
-  console.log('adjustWaters(' + factor + ')');
-  var amount, row, i, rowscount = dataRecord.mashs.length;
-  if (rowscount == 0)
-   return;
-  mash_infuse = 0;
-  for (i = 0; i < rowscount; i++) {
-   row = dataRecord.mashs[i];
-   if (row.step_type == 0) { // Infusion
-    amount = Round(parseFloat(row.step_infuse_amount) * factor, 1);
-    dataRecord.mashs[i].step_infuse_amount = amount;
-    $('#mashGrid').jqxGrid('setcellvalue', i, 'step_infuse_amount', amount);
-    mash_infuse += amount;
-   }
-  }
-  if (dataRecord.w2_amount == 0) {
-   dataRecord.w1_amount = mash_infuse;
-   $('#w1_amount').val(mash_infuse);
-  } else {
-   var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
-   var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
-   dataRecord.w1_amount = Round(w1_amount, 3);
-   dataRecord.w2_amount = Round(w2_amount, 3);
-   $('#w1_amount').val(dataRecord.w1_amount);
-   $('#w2_amount').val(dataRecord.w2_amount);
-  }
-  $('#wg_amount').val(mash_infuse);
- };
-
  function calcMashEfficiency() {
   var c, m;
   if (parseFloat($('#brew_mash_sg').jqxNumberInput('decimal')) < 1.002)
@@ -2513,20 +2241,16 @@
  }
 
  function GetOptSO4Clratio() {
-  if (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) > 0 && parseFloat($('#pr_chloride').jqxNumberInput('decimal'))) {
-   return (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) / parseFloat($('#pr_chloride').jqxNumberInput('decimal')));
-  } else {
    var BUGU = GetBUGU();
    return (1.0 / (-1.2 * BUGU + 1.4));
-  }
  }
 
- function setWaterAgent(name, amount) {
+ function setWaterAgent(name, amount, use) {
   var row, i, id, found = false, miscs, rows = $('#miscGrid').jqxGrid('getrows');
   if (amount == 0) {
    for (i = 0; i < rows.length; i++) {
     row = rows[i];
-    if (row.m_name == name) {
+    if (row.m_name == name && row.m_use_use == use) {
      id = $('#miscGrid').jqxGrid('getrowid', i);
      $('#miscGrid').jqxGrid('deleterow', id);
     }
@@ -2534,7 +2258,7 @@
   } else {
    for (i = 0; i < rows.length; i++) {
     row = rows[i];
-    if (row.m_name == name) {
+    if (row.m_name == name && row.m_use_use == use) {
      found = true;
      $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount / 1000);
      break;
@@ -2551,7 +2275,7 @@
         row['m_amount'] = amount / 1000;
         row['m_cost'] = record.cost;
         row['m_type'] = record.type;
-        row['m_use_use'] = record.use_use;
+        row['m_use_use'] = use;
         row['m_time'] = 0;
         row['m_amount_is_weight'] = record.amount_is_weight;
         row['m_inventory'] = record.inventory;
@@ -2703,9 +2427,11 @@
    return;
   }
 
+  $('#w1_hardness').val(Hardness(dataRecord.w1_calcium, dataRecord.w1_magnesium));
+  $('#w1_ra').val(ResidualAlkalinity(dataRecord.w1_total_alkalinity, dataRecord.w1_calcium, dataRecord.w1_magnesium));
+
   // If there is a dillute water source, mix the waters.
   if ((dataRecord.w2_name != '') && (dataRecord.w2_name != 'Geen mengwater')) {
-console.log("calcWater() mixed " + dataRecord.w2_name);
    liters = dataRecord.w1_amount + dataRecord.w2_amount;
    calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium);
    magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium);
@@ -2714,8 +2440,9 @@
    sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate);
    total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity);
    ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters);
+   $('#w2_hardness').val(Hardness(dataRecord.w2_calcium, dataRecord.w2_magnesium));
+   $('#w2_ra').val(ResidualAlkalinity(dataRecord.w2_total_alkalinity, dataRecord.w2_calcium, dataRecord.w2_magnesium));
   } else {
-console.log("calcWater() single");
    liters = dataRecord.w1_amount;
    calcium = dataRecord.w1_calcium;
    magnesium = dataRecord.w1_magnesium;
@@ -2725,7 +2452,7 @@
    total_alkalinity = dataRecord.w1_total_alkalinity;
    ph = dataRecord.w1_ph;
   }
-  var bicarbonate = total_alkalinity * 1.22;
+  var bicarbonate = Bicarbonate(total_alkalinity, ph);
 
   /* Save mixed water ions for later */
   var wg_calcium = calcium;
@@ -2735,6 +2462,9 @@
   var wg_sulfate = sulfate;
   var wg_bicarbonate = bicarbonate;
 
+  dataRecord.wg_amount = liters;
+  dataRecord.wg_ph = ph;
+
   $('#wg_amount').val(liters);
   $('#wg_calcium').val(Round(calcium, 1));
   $('#wg_magnesium').val(Round(magnesium, 1));
@@ -2744,6 +2474,8 @@
   $('#wg_chloride').val(Round(chloride, 1));
   $('#wg_sulfate').val(Round(sulfate, 1));
   $('#wg_ph').val(Round(ph, 2));
+  $('#wg_hardness').val(Round(Hardness(calcium, magnesium), 1));
+  $('#wg_ra').val(Round(ResidualAlkalinity(total_alkalinity, calcium, magnesium), 1));
 
   var mash_ph = Round(MashpH(), 3);
   console.log('Distilled water mash pH: ' + mash_ph);
@@ -2796,16 +2528,19 @@
     Acid = protonDeficit / frac;
     Acid *= AcidTypeData[AT].MolWt; // mg
     Acidmg = Acid;
-    Acid = Acid / AcidTypeData[AT].AcidSG; // ml
-    Acid = Round(Acid / (parseFloat(dataRecord.wa_acid_perc) / 100), 2); // ml
+    var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (parseFloat(dataRecord.wa_acid_perc) / 100)) + 1000, 2);
+    Acid /= RealSG;
+    Acid /= AcidTypeData[AT].AcidPrc / 100;
+    Acid = Round(Acid, 2);
     console.log('Mash auto Acid final ml: ' + Acid);
     $('#wa_acid').val(Acid);
-    setWaterAgent(AcidTypeData[AT].nl, Acid);
+    setWaterAgent(AcidTypeData[AT].nl, Acid, 1);
 
     bicarbonate = bicarbonate - protonDeficit * frac / liters;
     total_alkalinity = bicarbonate * 50 / 61;
    }
    ph = TpH;
+   dataRecord.wb_ph = ph;
    $('#wb_ph').val(Round(ph, 2));
    $('#est_mash_ph').val(Round(ph, 2));
   } else {
@@ -2840,9 +2575,8 @@
      pd = ProtonDeficit(pHa);
    }
    //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa);
-   RA = wg_bicarbonate - protonDeficit * frac / liters;
-   bicarbonate = RA;
-   total_alkalinity = RA * 50 / 61;
+   bicarbonate = wg_bicarbonate - protonDeficit * frac / liters;
+   total_alkalinity = bicarbonate * 50 / 61;
    ph = pHa;
    $('#wb_ph').val(Round(ph, 2));
    $('#est_mash_ph').val(Round(ph, 2));
@@ -2914,6 +2648,8 @@
   $('#wb_chloride').val(Round(chloride, 1));
   $('#wb_bicarbonate').val(Round(bicarbonate, 1));
   $('#wb_total_alkalinity').val(Round(total_alkalinity, 1));
+  $('#wb_hardness').val(Hardness(calcium, magnesium));
+  $('#wb_ra').val(ResidualAlkalinity(total_alkalinity, calcium, magnesium));
 
   if (calcium < 40) {
    setRangeIndicator('calcium', 'laag');
@@ -2975,79 +2711,130 @@
  function calcSparge() {
 
   /* Based on the work of ajDeLange. */
+  var ws_calcium, ws_magnesium, ws_total_alkalinity, ws_sodium, ws_chloride;
+  var ws_sulfate, ws_ph, ws_hardness, ws_ra;
   var TargetpH = dataRecord.sparge_ph;
-  var Source_pH = dataRecord.w1_ph;
-  var Source_alkalinity = dataRecord.w1_total_alkalinity;
+  var Source_pH = 7.0;
+
   // Select watersource or fallback to the first source.
-  if (dataRecord.sparge_source == 1) {    // Source 2
-   if (dataRecord.w2_ph > 0.0) {
+  if ((dataRecord.sparge_source == 1) && (dataRecord.w2_ph > 0.0)) { // Source 2
+    ws_calcium = dataRecord.w2_calcium;
+    ws_magnesium = dataRecord.w2_magnesium;
+    ws_total_alkalinity = dataRecord.w2_total_alkalinity;
+    ws_sodium = dataRecord.w2_sodium;
+    ws_chloride = dataRecord.w2_chloride;
+    ws_sulfate = dataRecord.w2_sulfate;
     Source_pH = dataRecord.w2_ph;
-    Source_alkalinity = dataRecord.w2_total_alkalinity;
-   } else {
-    dataRecord.sparge_source = 0;   // Source 1
-    $('#sparge_source').val(0);
-   }
-  } else if (dataRecord.sparge_source == 2) {     // Mixed
-   if (dataRecord.w2_ph > 0.0) {
-    Source_pH = parseFloat(dataRecord.wg_ph);
-    Source_alkalinity = parseFloat(dataRecord.wg_total_alkalinity);
-   } else {
-    dataRecord.sparge_source = 0;
-    $('#sparge_source').val(0);
-   }
+    $('#w2_button').jqxRadioButton({ checked: true });
+  } else if ((dataRecord.sparge_source == 2) && (dataRecord.w2_ph > 0.0)) { // Mixed
+    ws_calcium = dataRecord.wg_calcium;
+    ws_magnesium = dataRecord.wg_magnesium;
+    ws_total_alkalinity = dataRecord.wg_total_alkalinity;
+    ws_sodium = dataRecord.wg_sodium;
+    ws_chloride = dataRecord.wg_chloride;
+    ws_sulfate = dataRecord.wg_sulfate;
+    Source_pH = dataRecord.wg_ph;
+    $('#wg_button').jqxRadioButton({ checked: true });
+  } else {
+    ws_calcium = dataRecord.w1_calcium;
+    ws_magnesium = dataRecord.w1_magnesium;
+    ws_total_alkalinity = dataRecord.w1_total_alkalinity;
+    ws_sodium = dataRecord.w1_sodium;
+    ws_chloride = dataRecord.w1_chloride;
+    ws_sulfate = dataRecord.w1_sulfate;
+    Source_pH = dataRecord.w1_ph;
+    $('#w1_button').jqxRadioButton({ checked: true });
   }
 
-  // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH
-  var r1 = Math.pow(10, Source_pH - 6.35);
-  var r2 = Math.pow(10, Source_pH - 10.33);
-  var d = 1 + r1 + r1 * r2;
-  var f1 = 1 / d;
-  var f3 = r1 * r2 / d;
-
-  //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity)
-  var r143 = Math.pow(10, 4.3 - 6.35);
-  var r243 = Math.pow(10, 4.3 - 10.33);
-  var d43 = 1 + r143 + r143 * r243;
-  var f143 = 1 / d43;
-  var f343 = r143 * r243 / d43;
-
-  //Step 4. Solve
-  var Ct = Source_alkalinity / 50 / ((f143 - f1) + (f3 - f343));
-
-  //Step 5. Compute mole fractions at desired pH
-  var r1g = Math.pow(10, TargetpH - 6.35);
-  var r2g = Math.pow(10, TargetpH - 10.33);
-  var dg = 1 + r1g + r1g * r2g;
-  var f1g = 1 / dg;
-  var f3g = r1g * r2g / dg;
-
-  //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L)
-  var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH);  //mEq/l
-  Acid += 0.01;   // Add acid that would be required for distilled water.
-
-  //Step 8. Get the acid data.
-  var AT = dataRecord.sparge_acid_type;
+  if (dataRecord.sparge_volume > 0) {
+   ws_calcium += (parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 +
+    parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / dataRecord.sparge_volume;
+   ws_magnesium += (parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000 +
+    parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMMg / MMMgCl2 * 1000) / dataRecord.sparge_volume;
+   ws_sodium += (parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000) / dataRecord.sparge_volume;
+   ws_sulfate += (parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 +
+    parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / dataRecord.sparge_volume;
+   ws_chloride += (2 * parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 +
+    parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000 +
+    parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMCl / MMMgCl2 * 1000) / dataRecord.sparge_volume;
+  }
+
+  /* Show the spargewate with salt additions */
+  $('#sw_calcium').val(Round(ws_calcium, 1));
+  $('#sw_magnesium').val(Round(ws_magnesium, 1));
+  $('#sw_sodium').val(Round(ws_sodium, 1));
+  $('#sw_sulfate').val(Round(ws_sulfate, 1));
+  $('#sw_chloride').val(Round(ws_chloride, 1));
+  $('#sw_bicarbonate').val(Round(Bicarbonate(ws_total_alkalinity, Source_pH), 1));
+  $('#sw_total_alkalinity').val(Round(ws_total_alkalinity, 1));
+  $('#sw_ph').val(dataRecord.sparge_ph);
+  $('#sw_hardness').val(Hardness(ws_calcium, ws_magnesium));
+  $('#sw_ra').val(ResidualAlkalinity(ws_total_alkalinity, ws_calcium, ws_magnesium));
+
+  AT = dataRecord.sparge_acid_type;
   if (AT < 0 || AT >= AcidTypeData.length) {
    AT = 0;
    dataRecord.sparge_acid_type = 0;
-   $('#sparge_acid_type').val(0);
+   $('#sparge_acid_type').val(AcidTypeData[0].nl);
    dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc;
    $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
   }
-  var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
-
-  //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid.
-  Acid /= fract;
-
-  //Step 10. Multiply by molecular weight of the acid
-  Acid *= AcidTypeData[AT].MolWt; //mg
-
-  //Step 11. Divide by Specific Gravity and Percentage to get the final ml.
-  Acid = Acid / AcidTypeData[AT].AcidSG / (dataRecord.sparge_acid_perc / 100); //ml
-  Acid *= dataRecord.sparge_volume; //ml acid total
-  Acid = Round(Acid, 2);
-  dataRecord.sparge_acid_amount = Acid / 1000;
-  $('#sparge_acid_amount').val(Acid);
+
+  /*
+   * Auto calculate the required acid
+   */
+  if (dataRecord.calc_acid) {
+   // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH
+   var r1 = Math.pow(10, Source_pH - 6.35);
+   var r2 = Math.pow(10, Source_pH - 10.33);
+   var d = 1 + r1 + r1 * r2;
+   var f1 = 1 / d;
+   var f3 = r1 * r2 / d;
+
+   //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity)
+   var r143 = Math.pow(10, 4.3 - 6.35);
+   var r243 = Math.pow(10, 4.3 - 10.33);
+   var d43 = 1 + r143 + r143 * r243;
+   var f143 = 1 / d43;
+   var f343 = r143 * r243 / d43;
+
+   //Step 4. Solve
+   var Ct = ws_total_alkalinity / 50 / ((f143 - f1) + (f3 - f343));
+
+   //Step 5. Compute mole fractions at desired pH
+   var r1g = Math.pow(10, TargetpH - 6.35);
+   var r2g = Math.pow(10, TargetpH - 10.33);
+   var dg = 1 + r1g + r1g * r2g;
+   var f1g = 1 / dg;
+   var f3g = r1g * r2g / dg;
+
+   //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L)
+   var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH);  //mEq/l
+   Acid += 0.01;   // Add acid that would be required for distilled water.
+
+   //Step 8. Get the acid data.
+   var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
+
+   //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid.
+   Acid /= fract;
+
+   //Step 10. Multiply by molecular weight of the acid
+   Acid *= AcidTypeData[AT].MolWt; //mg
+
+   //Step 11. Divide by Specific Gravity and Percentage to get the final ml.
+   var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (dataRecord.sparge_acid_perc / 100)) + 1000, 2);
+   Acid = Acid / RealSG;           //ml
+   Acid *= dataRecord.sparge_volume; //ml acid total at 100%
+   Acid /= AcidTypeData[AT].AcidPrc / 100;     //ml acid at supplied strength
+   Acid = Round(Acid, 2);
+   dataRecord.sparge_acid_amount = Acid / 1000;
+   $('#sparge_acid_amount').val(Acid);
+  }
+
+  // Finally calculate the estimate preboil pH
+  var ph = -Math.log10(((Math.pow(10, -dataRecord.wb_ph) * dataRecord.wg_amount) + (Math.pow(10, -dataRecord.sparge_ph) * dataRecord.sparge_volume)) /
+          (dataRecord.wg_amount + dataRecord.sparge_volume));
+  $('#preboil_ph').val(ph);
  }
 
  function calcFermentation() {
@@ -3107,6 +2894,8 @@
 
   var TSec, ABV, bvol, balc, babv, mvol, malc, tvol, talc, i, row, SFactor, pvol, pabv, Pressure, kabv;
 
+  console.log('calcCarbonation()');
+
   TSec = dataRecord.secondary_temp;
   if (TSec < 1)
    TSec = dataRecord.primary_end_temp;
@@ -3197,35 +2986,7 @@
  }
 
  function en_stage_afterbrew(state) {
-
-  var onval = { disabled: (state) ? true:false };
-  var spinstate = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 90:110 };
-  var spinsmall = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 70:90 };
-
   $('#jqxTabs').jqxTabs((state) ? 'enableAt':'disableAt', 9);	// Fermentation tab
-  $('#mash_select').jqxDropDownList(onval);
-  $('#w1_name').jqxDropDownList(onval);
-  $('#w2_name').jqxDropDownList(onval);
-  $('#w2_amount').jqxNumberInput(onval);
-  $('#pr_name').jqxDropDownList(onval);
-  $('#wa_cacl2').jqxNumberInput(spinstate);
-  $('#wa_caso4').jqxNumberInput(spinstate);
-  $('#wa_mgso4').jqxNumberInput(spinstate);
-  $('#wa_nacl').jqxNumberInput(spinstate);
-  $('#wa_mgcl2').jqxNumberInput(spinstate);
-  $('#wa_nahco3').jqxNumberInput(spinstate);
-  $('#wa_caco3').jqxNumberInput(spinstate);
-  $('#mash_ph').jqxNumberInput(spinstate);
-  $('#calc_acid').jqxCheckBox(onval);
-  $('#wa_acid_name').jqxDropDownList(onval);
-  $('#wa_acid').jqxNumberInput(spinstate);
-  $('#wa_acid_perc').jqxNumberInput(spinsmall);
-  $('#sparge_temp').jqxNumberInput(spinstate);
-  $('#sparge_volume').jqxNumberInput(spinstate);
-  $('#sparge_ph').jqxNumberInput(spinstate);
-  $('#sparge_source').jqxDropDownList(onval);
-  $('#sparge_acid_type').jqxDropDownList(onval);
-  $('#sparge_acid_perc').jqxNumberInput(spinstate);
  }
 
  function en_stage_afterprimary(istate) {
@@ -3415,324 +3176,19 @@
 
  function calcInit() {
 
+  console.log('** calcInit() start');
   calcMashEfficiency();
   calcEfficiencyBeforeBoil();
   calcEfficiencyAfterBoil();
-
-  $('#calc_acid').on('checked', function(event) {
-   dataRecord.calc_acid = 1;
-   calcWater();
-  });
-  $('#calc_acid').on('unchecked', function(event) {
-   dataRecord.calc_acid = 0;
-   calcWater();
-  });
-  $('#w1_name').jqxDropDownList('selectItem', dataRecord.w1_name);
-  $('#w2_name').jqxDropDownList('selectItem', dataRecord.w2_name);
-  // Fix tap water if zero using mash infuse amount.
-console.log("mash_infuse: " + mash_infuse + " w1: " + parseFloat($('#w1_amount').jqxNumberInput('decimal')) + " " + dataRecord.w1_amount);
-  if (parseFloat($('#w1_amount').jqxNumberInput('decimal')) == 0 && mash_infuse > 0) {
-   $('#w1_amount').val(mash_infuse);
-   dataRecord.w1_amount = mash_infuse;
-   $('#wg_amount').val(mash_infuse);
-   $('#w2_amount').val(0);
-   dataRecord.w2_amount = 0;
-  }
   calcWater();
-  $('#w2_amount').on('change', function(event) {
-   var newval = parseFloat(event.args.value);
-   if (newval > parseFloat($('#wg_amount').jqxNumberInput('decimal'))) {
-    $('#w2_amount').val(dataRecord.w2_amount);
-    return;
-   }
-   dataRecord.w1_amount = parseFloat($('#wg_amount').jqxNumberInput('decimal')) - newval;
-   $('#w1_amount').val(dataRecord.w1_amount);
-   dataRecord.w2_amount = newval;
-   console.log('new: ' + event.args.value + ' w1: ' + dataRecord.w1_amount + '  w2: ' + dataRecord.w2_amount);
-   calcWater();
-  });
-  $('#wa_cacl2').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('CaCl2', 0);      // This prevents double entries.
-    setWaterAgent('CaCl2', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_caso4').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('CaSO4', 0);
-    setWaterAgent('CaSO4', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_mgso4').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('MgSO4', 0);
-    setWaterAgent('MgSO4', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_nacl').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('NaCl', 0);
-    setWaterAgent('NaCl', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_mgcl2').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('MgCl2', 0);
-    setWaterAgent('MgCl2', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_nahco3').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('NaHCO3', 0);
-    setWaterAgent('NaHCO3', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_caco3').on('change', function(event) {
-   if (event.args) {
-    setWaterAgent('CaCO3', 0);
-    setWaterAgent('CaCO3', event.args.value);
-    calcWater();
-   }
-  });
-  $('#wa_acid_name').on('select', function(event) {
-   if (event.args) {
-    var index = event.args.index;
-    console.log('wa_acid_name ' + index + ' last_acid: ' + last_acid);
-    setWaterAgent(last_acid, 0);
-    last_acid = AcidTypeData[index].nl;
-    dataRecord.wa_acid_name = index;
-    dataRecord.wa_acid_perc = AcidTypeData[index].AcidPrc;
-    $('#wa_acid_perc').val(dataRecord.wa_acid_perc);
-    calcWater();
-    setWaterAgent(last_acid, parseFloat($('#wa_acid').jqxNumberInput('decimal')));
-   }
-  });
-  $('#wa_acid').on('change', function(event) {
-   var name = AcidTypeData[dataRecord.wa_acid_name].nl;
-   setWaterAgent(name, parseFloat(event.args.value));
-   calcWater();
-  });
-  $('#wa_acid_perc').on('change', function(event) {
-   dataRecord.wa_acid_perc = parseFloat(event.args.value);
-   calcWater();
-  });
-
-  $('#sparge_ph').on('change', function(event) {
-   dataRecord.sparge_ph = parseFloat(event.args.value);
-   calcSparge();
-  });
-  $('#sparge_volume').on('change', function(event) {
-   dataRecord.sparge_volume = parseFloat(event.args.value);
-   $('#brew_sparge_volume').val(dataRecord.sparge_volume);
-   calcSparge();
-  });
-  $('#sparge_temp').on('change', function(event) {
-   dataRecord.sparge_temp = parseFloat(event.args.value);
-   $('#brew_sparge_temperature').val(dataRecord.sparge_temp);
-  });
-  $('#sparge_source').on('select', function(event) {
-   if (event.args) {
-    dataRecord.sparge_source = event.args.index;
-    calcSparge();
-   }
-  });
-  $('#sparge_acid_type').on('select', function(event) {
-   if (event.args) {
-    dataRecord.sparge_acid_type = event.args.index;
-    console.log('new sparge_acid_type: ' + dataRecord.sparge_acid_type);
-    dataRecord.sparge_acid_perc = AcidTypeData[event.args.index].AcidPrc;
-    $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
-    calcSparge();
-   }
-  });
-  $('#sparge_acid_perc').on('change', function(event) {
-   dataRecord.sparge_acid_perc = parseFloat(event.args.value);
-   calcSparge();
-  });
-
   calcFermentation();
-  calcCarbonation();
-  $('#package_volume').on('change', function(event) {
-   var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount;
-   dataRecord.package_volume = parseFloat(event.args.value);
-   if (dataRecord.package_volume > dataRecord.brew_fermenter_volume) {
-    dataRecord.package_volume = dataRecord.brew_fermenter_volume;
-    $('#package_volume').val(dataRecord.package_volume);
-   }
-   tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
-   diff = Round(tnew - told, 3);
-   if (told > 0) {
-    dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3);
-    dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3);
-   } else {
-    dataRecord.bottle_amount = tnew;
-    dataRecord.keg_amount = 0;
-   }
-   $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
-   $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
-   calcCarbonation();
-  });
-  $('#package_infuse_amount').on('change', function(event) {
-   var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount;
-   dataRecord.package_infuse_amount = parseFloat(event.args.value);
-   tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
-   diff = Round(tnew - told, 3);
-   if (told > 0) {
-    dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3);
-    dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3);
-   } else {
-    dataRecord.bottle_amount = tnew;
-    dataRecord.keg_amount = 0;
-   }
-   $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
-   $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
-   calcCarbonation();
-  });
-  $('#package_infuse_abv').on('change', function(event) {
-   dataRecord.package_infuse_abv = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#bottle_amount').on('change', function(event) {
-   var vtot, vnew = parseFloat(event.args.value);
-   vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.keg_amount, 3);
-   if (vnew > vtot)
-    vnew = vtot;
-   dataRecord.bottle_amount = Round(vnew, 3);
-   $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
-   console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount);
-   calcCarbonation();
-  });
-  $('#bottle_priming_water').on('change', function(event) {
-   dataRecord.bottle_priming_water = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#keg_amount').on('change', function(event) {
-   var vtot, vnew = parseFloat(event.args.value);
-   vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.bottle_amount, 3);
-   if (vnew > vtot)
-    vnew = vtot;
-   dataRecord.keg_amount = Round(vnew, 3);
-   $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
-   console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount);
-   calcCarbonation();
-  });
-  $('#keg_priming_water').on('change', function(event) {
-   dataRecord.keg_priming_water = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#bottle_carbonation').on('change', function(event) {
-   dataRecord.bottle_carbonation = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#bottle_carbonation_temp').on('change', function(event) {
-   dataRecord.bottle_carbonation_temp = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#keg_carbonation').on('change', function(event) {
-   dataRecord.keg_carbonation = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-  $('#keg_forced_carb').on('checked', function(event) {
-   dataRecord.keg_forced_carb = 1;
-   calcCarbonation();
-  });
-  $('#keg_forced_carb').on('unchecked', function(event) {
-   dataRecord.keg_forced_carb = 0;
-   calcCarbonation();
-  });
-  $('#keg_carbonation_temp').on('change', function(event) {
-   dataRecord.keg_carbonation_temp = parseFloat(event.args.value);
-   calcCarbonation();
-  });
-
-  $('#brew_fermenter_extrawater').on('change', function(event) {
-   dataRecord.brew_fermenter_extrawater = parseFloat(event.args.value);
-   calcFermentables();
-   calcIBUs();
-   calcYeast();
-  });
-  $('#brew_fermenter_tcloss').on('change', function(event) {
-   dataRecord.brew_fermenter_tcloss = parseFloat(event.args.value);
-   calcFermentables();
-   calcIBUs();
-   calcYeast();
-  });
-  $('#primary_end_sg').on('change', function(event) {
-   dataRecord.primary_end_sg = parseFloat(event.args.value);
-   calcFermentation();
-  });
-  $('#primary_end_brix').on('change', function(event) {
-   var OBrix, FBrix, FG;
-   if (dataRecord.brew_fermenter_sg >= 1.020) {
-    OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
-    FBrix = parseFloat(event.args.value);
-    FG = brix_to_fg(OBrix, FBrix);
-    if (FBrix > 0.05) {
-     $('#primary_end_sg').val(FG);
-     dataRecord.primary_end_sg = FG;
-    }
-    calcFermentation();
-   }
-  });
-  $('#secondary_end_sg').on('change', function(event) {
-   dataRecord.secondary_end_sg = parseFloat(event.args.value);
-   calcFermentation();
-  });
-  $('#secondary_end_brix').on('change', function(event) {
-   var OBrix, FBrix, FG;
-   if (dataRecord.brew_fermenter_sg >= 1.020) {
-    OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
-    FBrix = parseFloat(event.args.value);
-    FG = brix_to_fg(OBrix, FBrix);
-    if (FBrix > 0.05) {
-     $('#secondary_end_sg').val(FG);
-     dataRecord.secondary_end_sg = FG;
-    }
-    calcFermentation();
-   }
-  });
-  $('#final_brix').on('change', function(event) {
-   var OBrix, FBrix, FG;
-   if (dataRecord.brew_fermenter_sg >= 1.020) {
-    OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
-    FBrix = parseFloat(event.args.value);
-    FG = brix_to_fg(OBrix, FBrix);
-    if (FBrix > 0.05) {
-     $('#fg').val(FG);
-     dataRecord.fg = FG;
-    }
-    calcFermentation();
-   }
-  });
-  $('#fg').on('change', function(event) {
-   dataRecord.fg = parseFloat(event.args.value);
-   calcFermentation();
-  });
-  $('#brew_whirlpool9').on('valueChanged', function(event) {
-   dataRecord.brew_whirlpool9 = event.args.value;
-   whirlpoolHops();
-   calcIBUs();
-  });
-  $('#brew_whirlpool7').on('valueChanged', function(event) {
-   dataRecord.brew_whirlpool7 = event.args.value;
-   whirlpoolHops();
-   calcIBUs();
-  });
-  $('#brew_whirlpool6').on('valueChanged', function(event) {
-   dataRecord.brew_whirlpool6 = event.args.value;
-   whirlpoolHops();
-   calcIBUs();
-  });
+//  calcCarbonation();
+  calcIBUs();
   $('#BLog').jqxButton({ disabled: (dataRecord.log_brew) ? false : true});
   $('#FLog').jqxButton({ disabled: (dataRecord.log_fermentation) ? false : true});
   $('#ILog').jqxButton({ disabled: (dataRecord.log_ispindel) ? false : true});
   $('#CLog').jqxButton({ disabled: (dataRecord.log_co2pressure) ? false : true});
+  console.log('** calcInit() ready');
  }
 
 
@@ -3947,410 +3403,113 @@
  // Tab 7, Mashing
  $('#mash_name').jqxTooltip({ content: 'De omschrijving van dit maisch profiel.' });
  $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 });
- $('#mash_select').jqxDropDownList({
-  placeHolder: 'Kies schema:',
-  theme: theme,
-  source: mashlist,
-  displayMember: 'name',
-  width: 250,
-  height: 23,
-  dropDownWidth: 500,
-  dropDownHeight: 500,
-  dropDownHorizontalAlignment: 'right'
- });
- $('#mash_select').on('select', function(event) {
-  if (event.args) {
-   var infused = 0, data, datarecord, rowIDs, rows, i, row, index = event.args.index;
-   // First delete all current steps
-   rowIDs = new Array();
-   rows = $('#mashGrid').jqxGrid('getdisplayrows');
-   for (i = 0; i < rows.length; i++) {
-    row = rows[i];
-    rowIDs.push(row.uid);
-   }
-   $('#mashGrid').jqxGrid('deleterow', rowIDs);
-   // Then add the new steps
-   datarecord = mashlist.records[index];
-   $('#mash_name').val(datarecord.name);
-   for (i = 0; i < datarecord.steps.length; i++) {
-    data = datarecord.steps[i];
-    row = {};
-    row['step_name'] = data.step_name;
-    row['step_type'] = parseInt(data.step_type);
-    row['step_temp'] = parseFloat(data.step_temp);
-    row['end_temp'] = parseFloat(data.end_temp);
-    row['step_time'] = parseFloat(data.step_time);
-    row['ramp_time'] = parseFloat(data.ramp_time);
-    row['step_infuse_temp'] = 0.0;
-    row['step_infuse_amount'] = 0.0;
-    if (mash_infuse == 0 && dataRecord.wg_amount > 0)
-     mash_infuse = dataRecord.wg_amount;
-    if (data.step_type == 0) { // Infusion
-     if (i == 0) {
-      row['step_infuse_amount'] = parseFloat(mash_infuse);
-     } else {
-      row['step_infuse_temp'] = 99.0;
-     }
-    }
-    row['step_ph'] = 0.0;
-    row['step_sg'] = 0.0;
-    //console.log(i + ' type: ' + row['step_type'] + ' start infusion: ' + parseFloat(row['step_infuse_amount']) + ' mash_infuse: ' + mash_infuse);
-    infused += parseFloat(row['step_infuse_amount']);
-    row['step_volume'] = infused;
-    if (mashkg > 0)
-     row['step_wg_ratio'] = Round(parseFloat(mash_infuse / mashkg), 6);
-    else
-     row['step_wg_ratio'] = 0.0;
-    $('#mashGrid').jqxGrid('addrow', null, row);
-   }
-   calcMash();
-  }
- });
  $('#est_mashvol').jqxTooltip({ content: 'Het totale volume van het maishwater en de mout in de maish pan.' });
  $('#est_mashvol').jqxNumberInput(Show1dec);
  $('#est_mashtime').jqxTooltip({ content: 'De totale tijdsduur van het maischen.' });
  $('#est_mashtime').jqxInput({ theme: theme, width: 70, height: 23 });
- $('#MashReady').jqxButton({ template: 'success', width: '90px', theme: theme });
- $('#MashReady').click(function() {
-  calcFermentables();
-  calcWater();
-  calcSparge();
-  calcMash();
- });
- $('#wstep_name').jqxInput({ theme: theme, width: 320, height: 23 });
- $('#wstep_name').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_name = $('#wstep_name').val();
- });
- $('#wstep_type').jqxDropDownList({
-  theme: theme,
-  source: MashStepTypeAdapter,
-  valueMember: 'id',
-  displayMember: 'nl',
-  width: 180,
-  height: 23,
-  autoDropDownHeight: true
- });
- $('#wstep_type').on('select', function(event) {
-  if (event.args) {
-   var rowdata, i, rows, row, index = event.args.index;
-   rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-   if (rowdata.step_type != index) {
-    rowdata.step_type = index;
-    $('#wstep_infuse_amount').hide();
-    $('#wstep_infuse_temp').hide();
-    $('#wstep_pmpt_amount').hide();
-    $('#wstep_pmpt_temp').hide();
-    if (index == 0) { // Infusion
-     if (mashRow == 0) {
-      $('#wstep_infuse_amount').show();
-      $('#wstep_pmpt_amount').show();
-     } else {
-      $('#wstep_infuse_temp').show();
-      $('#wstep_pmpt_temp').show();
-     }
-    }
-    if (index == 1) { // Temperature
-     if (mashRow > 0)
-      rowdata.step_infuse_amount = 0;
-     rowdata.step_infuse_temp = 0;
-    }
-    if (index == 2) { // Decoction
-     var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
-     rowdata.step_infuse_temp = 99;
-     rowdata.step_infuse_amount = decoctionVol(rowdata.step_volume, rowdata.step_temp, rowprev.end_temp);
-     console.log('decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp);
-    }
-    $('#mashGrid').jqxGrid('updaterow', mashRow, rowdata);
-    mash_infuse = 0;
-    rows = $('#mashGrid').jqxGrid('getrows');
-    for (i = 0; i < rows.length; i++) {
-     row = rows[i];
-     if (row.step_type == 0) // Infusion
-      mash_infuse += parseFloat(row.step_infuse_amount);
-    }
-    calcMash();
-   }
-  }
- });
- $('#wstep_temp').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  if (rowdata.step_type == 2) { // Decoction
-   var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
-   var a = (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + rowdata.step_volume * SpecificHeatWater) *
-           (parseFloat(event.args.value) - rowprev.end_temp);
-   var b = SpecificHeatWater * (99 - parseFloat(event.args.value));
-   if (b > 0) {
-    rowdata.step_temp = parseFloat(event.args.value);
-    rowdata.step_infuse_amount = Round(a / b, 2);
-   } else
-    rowdata.step_infuse_amount = 0;
-   console.log('change temp ' + rowdata.step_temp + ' decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp);
-  } else {
-   rowdata.step_temp = parseFloat(event.args.value);
-  }
- });
- $('#wstep_temp,#wend_temp,#wstep_infuse_amount,#wstep_infuse_temp').jqxNumberInput(Spin1dec);
- $('#wend_temp').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.end_temp = parseFloat(event.args.value);
- });
- $('#wstep_time,#wramp_time').jqxNumberInput(PosInt);
- $('#wstep_time').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_time = parseFloat(event.args.value);
-  calcMash();
- });
- $('#wstep_ph').jqxNumberInput(Spin2pH);
- $('#wstep_ph').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_ph = parseFloat(event.args.value);
- });
- $('#wstep_sg').jqxNumberInput(SGopts);
- $('#wstep_sg').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_sg = parseFloat(event.args.value);
- });
- $('#wstep_brix').jqxNumberInput(Spin1dec);
- $('#wstep_brix').on('change', function(event) {
-  /* Use plato_to_sg at this stage */
-  var sg = Round(plato_to_sg(parseFloat(event.args.value)), 4);
-console.log('brix: ' + parseFloat(event.args.value) + ' sg: ' + sg);
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  if (sg <= 1.005) {
-   sg = 0.0;
-  }
-  rowdata.step_sg = sg;
-  $('#wstep_sg').val(sg);
- });
- $('#wramp_time').on('change', function(event) {
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.ramp_time = parseFloat(event.args.value);
-  calcMash();
- });
- $('#wstep_infuse_amount').on('change', function(event) {
-  var row, i, rows, rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_infuse_amount = parseFloat(event.args.value);
-  if (mashRow == 0) {
-   rowdata.step_infuse_amount = parseFloat(event.args.value);
-   mash_infuse = 0;
-   rows = $('#mashGrid').jqxGrid('getrows');
-   for (i = 0; i < rows.length; i++) {
-    row = rows[i];
-    if (row.step_type == 0) // Infusion
-     mash_infuse += parseFloat(row.step_infuse_amount);
-   }
-   if (dataRecord.w2_amount == 0) {
-    dataRecord.w1_amount = mash_infuse;
-    $('#w1_amount').val(mash_infuse);
-   } else {
-    var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
-    var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
-    dataRecord.w1_amount = Round(w1_amount, 3);
-    dataRecord.w2_amount = Round(w2_amount, 3);
-    $('#w1_amount').val(dataRecord.w1_amount);
-    $('#w2_amount').val(dataRecord.w2_amount);
-   }
-   $('#wg_amount').val(mash_infuse);
-   console.log('new infuse amount: ' + mash_infuse);
-   calcWater();
-   calcMash();
-  }
- });
- $('#wstep_infuse_temp').on('change', function(event) {
-  var prevdata = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
-  var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
-  rowdata.step_infuse_temp = parseFloat(event.args.value);
-  var vol = infusionVol(prevdata.step_volume, mashkg, rowdata.step_infuse_temp, rowdata.step_temp, prevdata.end_temp);
-  console.log('new vol: ' + vol);
-  rowdata.step_infuse_amount = vol;
-  $('#wstep_infuse_amount').val(vol);
- });
 
  // Tab 8, Water
  $('#tgt_bu').jqxNumberInput(Show2wat);
  $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat);
+ $('#preboil_ph').jqxNumberInput(Show2wat);
 
  // Water source 1
- $('#w1_name').jqxDropDownList({
-  placeHolder: 'Kies hoofd water:',
-  theme: theme,
-  source: waterlist,
-  displayMember: 'name',
-  width: 200,
-  height: 27,
-  dropDownWidth: 400,
-  dropDownHeight: 400
- });
- $('#w1_name').on('select', function(event) {
-  if (event.args) {
-   var datarecord, index = event.args.index;
-   datarecord = waterlist.records[index];
-   dataRecord.w1_name = datarecord.name;
-   $('#w1_calcium').val(datarecord.calcium);
-   dataRecord.w1_calcium = datarecord.calcium;
-   $('#w1_sulfate').val(datarecord.sulfate);
-   dataRecord.w1_sulfate = datarecord.sulfate;
-   $('#w1_chloride').val(datarecord.chloride);
-   dataRecord.w1_chloride = datarecord.chloride;
-   $('#w1_sodium').val(datarecord.sodium);
-   dataRecord.w1_sodium = datarecord.sodium;
-   $('#w1_magnesium').val(datarecord.magnesium);
-   dataRecord.w1_magnesium = datarecord.magnesium;
-   $('#w1_total_alkalinity').val(datarecord.total_alkalinity);
-   $('#w1_bicarbonate').val(datarecord.total_alkalinity * 1.22);
-   dataRecord.w1_total_alkalinity = datarecord.total_alkalinity;
-   $('#w1_ph').val(datarecord.ph);
-   dataRecord.w1_ph = datarecord.ph;
-   $('#w1_cost').val(datarecord.cost);
-   dataRecord.w1_cost = datarecord.cost;
-   calcWater();
-  }
- });
+ $('#w1_name').jqxInput({ theme: theme, width: 200, height: 23 });
+ $('#w1_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
  $('#w1_amount,#w1_calcium,#w1_magnesium,#w1_sodium,#w1_bicarbonate,#w1_total_alkalinity,#w1_chloride,#w1_sulfate').jqxNumberInput(Show1wat);
  $('#w1_ph').jqxNumberInput(Show2wat);
+ $('#w1_hardness').jqxNumberInput(Show1wat);
+ $('#w1_ra').jqxNumberInput(Show1wat);
  // Water source 2
- $('#w2_name').jqxDropDownList({
-  placeHolder: 'Kies meng water:',
-  theme: theme,
-  source: water2list,
-  displayMember: 'name',
-  width: 200,
-  height: 27,
-  dropDownWidth: 400,
-  dropDownHeight: 400
- });
- $('#w2_name').on('select', function(event) {
-  if (event.args) {
-   var datarecord, index = event.args.index;
-   datarecord = water2list.records[index];
-   if (index == 0) {
-    dataRecord.w2_amount = 0;
-    $('#w2_amount').val(0);
-    dataRecord.w1_amount = mash_infuse;
-    $('#w1_amount').val(mash_infuse);
-   }
-   dataRecord.w2_name = datarecord.name;
-   $('#w2_calcium').val(datarecord.calcium);
-   dataRecord.w2_calcium = datarecord.calcium;
-   $('#w2_sulfate').val(datarecord.sulfate);
-   dataRecord.w2_sulfate = datarecord.sulfate;
-   $('#w2_chloride').val(datarecord.chloride);
-   dataRecord.w2_chloride = datarecord.chloride;
-   $('#w2_sodium').val(datarecord.sodium);
-   dataRecord.w2_sodium = datarecord.sodium;
-   $('#w2_magnesium').val(datarecord.magnesium);
-   dataRecord.w2_magnesium = datarecord.magnesium;
-   $('#w2_total_alkalinity').val(datarecord.total_alkalinity);
-   $('#w2_bicarbonate').val(datarecord.total_alkalinity * 1.22);
-   dataRecord.w2_total_alkalinity = datarecord.total_alkalinity;
-   $('#w2_ph').val(datarecord.ph);
-   dataRecord.w2_ph = datarecord.ph;
-   $('#w2_cost').val(datarecord.cost);
-   dataRecord.w2_cost = datarecord.cost;
-   $('#w2_amount').jqxNumberInput({ max: 100000, readOnly: false }); // Set high max to enable the spinbuttons.
-   calcWater();
-  }
- });
- $('#w2_amount').jqxTooltip({ content: 'De verdeling van het hoofd en meng water. Het totale maisch water volume blijft gelijk.'});
- $('#w2_amount').jqxNumberInput({
-  inputMode: 'simple', spinMode: 'simple', theme: theme, width: 94, height: 23, min: 0, max: 0, decimalDigits: 1,
-  spinButtons: true, spinButtonsStep: 0.1, readOnly: true
- });
+ $('#w2_name').jqxInput({ theme: theme, width: 200, height: 23 });
+ $('#w2_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
+ $('#w2_amount').jqxNumberInput(Show1wat);
  $('#w2_calcium,#w2_magnesium,#w2_sodium,#w2_bicarbonate,#w2_total_alkalinity,#w2_chloride,#w2_sulfate').jqxNumberInput(Show1wat);
  $('#w2_ph').jqxNumberInput(Show2wat);
+ $('#w2_hardness').jqxNumberInput(Show1wat);
+ $('#w2_ra').jqxNumberInput(Show1wat);
  // Water mixed
+ $('#wg_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
  $('#wg_amount,#wg_calcium,#wg_magnesium,#wg_sodium,#wg_bicarbonate,#wg_total_alkalinity,#wg_chloride,#wg_sulfate').jqxNumberInput(Show1wat);
  $('#wg_ph').jqxNumberInput(Show2wat);
+ $('#wg_hardness').jqxNumberInput(Show1wat);
+ $('#wg_ra').jqxNumberInput(Show1wat);
  // Water treated
  $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'});
+ $('#wb_calcium').jqxNumberInput(Show1wat);
  $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'});
+ $('#wb_magnesium').jqxNumberInput(Show1wat);
  $('#wb_sodium').jqxTooltip({ content: 'De ideale hoeveelheid Natrium is lager dan 150.'});
+ $('#wb_sodium').jqxNumberInput(Show1wat);
  $('#wb_chloride').jqxTooltip({ content: 'De ideale hoeveelheid Chloride is tussen 50 en 150. Samen met Sulfaat minder dan 500.'});
+ $('#wb_chloride').jqxNumberInput(Show1wat);
  $('#wb_sulfate').jqxTooltip({ content: 'De ideale hoeveelheid Sulfaat is tussen 50 en 400. Samen met Chloride minder dan 500.'});
+ $('#wb_sulfate').jqxNumberInput(Show1wat);
  $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'});
- $('#wb_calcium,#wb_magnesium,#wb_sodium,#wb_bicarbonate,#wb_total_alkalinity,#wb_chloride,#wb_sulfate').jqxNumberInput(Show1wat);
+ $('#wb_bicarbonate').jqxNumberInput(Show1wat);
  $('#wb_ph').jqxNumberInput(Show2wat);
- // Water target profile
- $('#pr_name').jqxDropDownList({
-  placeHolder: 'Kies doel profiel:',
-  theme: theme,
-  source: waterprofiles,
-  displayMember: 'name',
-  width: 200,
-  height: 27,
-  dropDownWidth: 400,
-  dropDownHeight: 300
- });
- $('#pr_name').on('select', function(event) {
-  if (event.args) {
-   var datarecord, index = event.args.index;
-   datarecord = waterprofiles.records[index];
-   $('#pr_calcium').val(datarecord.calcium);
-   $('#pr_sulfate').val(datarecord.sulfate);
-   $('#pr_chloride').val(datarecord.chloride);
-   $('#pr_sodium').val(datarecord.sodium);
-   $('#pr_magnesium').val(datarecord.magnesium);
-   $('#pr_total_alkalinity').val(datarecord.total_alkalinity);
-   $('#pr_bicarbonate').val(datarecord.total_alkalinity * 1.22);
-   calcWater();
-  }
- });
- $('#pr_calcium,#pr_magnesium,#pr_sodium,#pr_bicarbonate,#pr_total_alkalinity,#pr_chloride,#pr_sulfate').jqxNumberInput(Show1wat);
+ $('#wb_hardness').jqxNumberInput(Show1wat);
+ $('#wb_ra').jqxNumberInput(Show1wat);
+ // Sparge water
+ $('#sw_amount').jqxNumberInput(Show1wat);
+ $('#sw_calcium').jqxNumberInput(Show1wat);
+ $('#sw_magnesium').jqxNumberInput(Show1wat);
+ $('#sw_sodium').jqxNumberInput(Show1wat);
+ $('#sw_bicarbonate').jqxNumberInput(Show1wat);
+ $('#sw_total_alkalinity').jqxNumberInput(Show1wat);
+ $('#sw_chloride').jqxNumberInput(Show1wat);
+ $('#sw_sulfate').jqxNumberInput(Show1wat);
+ $('#sw_ph').jqxNumberInput(Show2wat);
+ $('#sw_hardness').jqxNumberInput(Show1wat);
+ $('#sw_ra').jqxNumberInput(Show1wat);
 
  // Water agents
  $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.' });
+ $('#wa_cacl2').jqxNumberInput(Show2wat);
+ $('#ss_cacl2').jqxNumberInput(Show2wat);
+
  $('#wa_caso4').jqxTooltip({
   content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.'
  });
+ $('#wa_caso4').jqxNumberInput(Show2wat);
+ $('#ss_caso4').jqxNumberInput(Show2wat);
+
  $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!' });
+ $('#wa_mgso4').jqxNumberInput(Show2wat);
+ $('#ss_mgso4').jqxNumberInput(Show2wat);
+
  $('#wa_nacl').jqxTooltip({
   content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' +
   'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.'
  });
+ $('#wa_nacl').jqxNumberInput(Show2wat);
+ $('#ss_nacl').jqxNumberInput(Show2wat);
+
  $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'});
+ $('#wa_mgcl2').jqxNumberInput(Show2wat);
+ $('#ss_mgcl2').jqxNumberInput(Show2wat);
+
  $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'});
  $('#wa_caco3').jqxTooltip({ content: 'Kalk'});
- $('#wa_cacl2,#wa_caso4,#wa_mgso4,#wa_nacl,#wa_mgcl2,#wa_nahco3,#wa_caco3').jqxNumberInput(Spin1dec);
+ $('#wa_nahco3,#wa_caco3').jqxNumberInput(Show2wat);
+
  $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'});
- $('#mash_ph').jqxNumberInput(SpinpH);
- $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23 });
- $('#wa_acid').jqxNumberInput(Spin2dec);
- $('#wa_acid_name').jqxDropDownList({
-  theme: theme,
-  source: AcidTypeAdapter,
-  valueMember: 'id',
-  displayMember: 'nl',
-  width: 130,
-  height: 23,
-  autoDropDownHeight: true
- });
+ $('#mash_ph').jqxNumberInput(Show2dec);
+
+ $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23, disabled: true });
+
+ $('#wa_acid_name').jqxInput({ theme: theme, width: 130, height: 23 });
+ $('#wa_acid').jqxNumberInput(Show2dec);
  $('#wa_acid').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' });
- $('#wa_acid_perc,#sparge_acid_perc').jqxNumberInput(Perc0);
- $('#wa_acid_perc').jqxNumberInput({ width: 70, symbol: '%', symbolPosition: 'right' });
+ $('#wa_acid_perc').jqxNumberInput(Show0dec);
+ $('#wa_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' });
+
  // Sparge water
- $('#sparge_temp,#sparge_volume').jqxNumberInput(Spin1dec);
- $('#sparge_ph').jqxNumberInput(SpinpH);
- $('#sparge_source').jqxDropDownList({
-  theme: theme,
-  source: SpargeSourceAdapter,
-  valueMember: 'id',
-  displayMember: 'nl',
-  width: 110,
-  height: 23,
-  autoDropDownHeight: true
- });
- $('#sparge_acid_amount').jqxNumberInput(Spin2dec);
- $('#sparge_acid_amount').jqxNumberInput({ spinButtons: false, readOnly: true, symbol: ' ml', symbolPosition: 'right' });
- $('#sparge_acid_type').jqxDropDownList({
-  theme: theme,
-  source: AcidTypeAdapter,
-  valueMember: 'id',
-  displayMember: 'nl',
-  width: 110,
-  height: 23,
-  autoDropDownHeight: true
- });
+ $('#sparge_ph').jqxNumberInput(Show2dec);
+ $('#sparge_acid_amount').jqxNumberInput(Show2dec);
+ $('#sparge_acid_amount').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' });
+ $('#sparge_acid_type').jqxInput({ theme: theme, width: 130, height: 23 });
+ $('#sparge_acid_perc').jqxNumberInput(Show0dec);
  $('#sparge_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' });
 
  // Tab 9, Brewday
@@ -4385,12 +3544,6 @@
   calcEfficiencyBeforeBoil();
  });
  $('#brew_mash_sg,#brew_preboil_sg,#brew_aboil_sg').jqxNumberInput(SGopts);
- $('#brew_aboil_sg').on('valueChanged', function(event) {
-  dataRecord.brew_aboil_sg = event.args.value;
-  calcEfficiencyAfterBoil();
-  calcFermentables();
-  calcIBUs();
- });
  $('#est_mash_sg,#est_pre_sg,#est_og3').jqxNumberInput(Show3wat);
  $('#brew_mash_efficiency').jqxNumberInput(Show1dec);
  $('#brew_preboil_volume').on('valueChanged', function(event) {
@@ -4398,19 +3551,8 @@
   calcEfficiencyBeforeBoil();
  });
  $('#brew_preboil_volume,#brew_aboil_volume').jqxNumberInput(Spin1dec);
- $('#brew_aboil_volume').on('valueChanged', function(event) {
-  dataRecord.brew_aboil_volume = event.args.value;
-  calcEfficiencyAfterBoil();
-  calcFermentables();
-  calcIBUs();
- });
  $('#ketel_volume').jqxNumberInput(Show1dec);
  $('#ketel_cm').jqxNumberInput(Spin1dec);
- $('#ketel_cm').on('change', function(event) {
-  k_cm = parseFloat(event.args.value);
-  k_vol = kettle_vol(k_cm, dataRecord.eq_kettle_volume, dataRecord.eq_kettle_height);
-  $('#ketel_volume').val(k_vol);
- });
  $('#volumeReady').jqxButton({ template: 'success', width: '90px', theme: theme });
  $('#volumeReady').click(function() {
   /* Is it pre or after boil */
@@ -4500,14 +3642,6 @@
 
  $('#primary_end_sg,#secondary_end_sg').jqxNumberInput(SGopts);
  $('#primary_end_date,#secondary_end_date').jqxDateTimeInput(Dateopts);
- $('#primary_end_date').on('close', function(event) {
-  dataRecord.primary_end_date = $('#primary_end_date').val();
-  calcStage();
- });
- $('#secondary_end_date').on('close', function(event) {
-  dataRecord.secondary_end_date = $('#secondary_end_date').val();
-  calcStage();
- });
  $('#primary_start_temp,#primary_max_temp,#primary_end_temp,#secondary_temp,#tertiary_temp').jqxNumberInput(YeastT);
  $('#fg').jqxNumberInput(Spin3dec);
  $('#brew_fermenter_sg2,#est_fg3').jqxNumberInput(Show3dec);
@@ -4543,10 +3677,6 @@
  $('#bottle_priming_water,#keg_priming_water').jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' });
  $('#bottle_pressure').jqxTooltip({ content: 'De maximaal te verwachten druk tijdens het hergisten.' });
  $('#package_date').jqxDateTimeInput(Dateopts);
- $('#package_date').on('close', function(event) {
-  dataRecord.package_date = $('#package_date').val();
-  calcStage();
- });
  $('#package_infuse_amount').jqxNumberInput(Spin3dec);
  $('#package_infuse_notes').jqxInput({ theme: theme, width: 640, height: 23 });
  $('#package_abv').jqxNumberInput(Show2dec);
@@ -4605,7 +3735,7 @@
    } else {
     $('#fermentableGrid').jqxGrid('addrow', null, row);
    }
-   calcCarbonation();
+//   calcCarbonation();
   }
  });
  $('#keg_priming_sugar').jqxDropDownList({
@@ -4658,7 +3788,7 @@
    } else {
     $('#fermentableGrid').jqxGrid('addrow', null, row);
    }
-   calcCarbonation();
+//   calcCarbonation();
   }
  });
  $('#bottle_priming_water,#keg_priming_water').jqxNumberInput(Spin3dec);
--- a/www/js/rec_view.js	Fri Aug 05 20:11:11 2022 +0200
+++ b/www/js/rec_view.js	Sat Aug 06 18:44:22 2022 +0200
@@ -1413,7 +1413,7 @@
    }
    //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa);
    bicarbonate = wg_bicarbonate - protonDeficit * frac / liters;
-   total_alkalinity = RA * 50 / 61;
+   total_alkalinity = bicarbonate * 50 / 61;
    ph = pHa;
    $('#wb_ph').val(Round(ph, 2));
    $('#est_mash_ph').val(Round(ph, 2));
--- a/www/prod_edit.php	Fri Aug 05 20:11:11 2022 +0200
+++ b/www/prod_edit.php	Sat Aug 06 18:44:22 2022 +0200
@@ -356,9 +356,7 @@
       <table style="width: 100%;">
        <tr>
         <td style="vertical-align: top; float: right; padding: 3px;">Maischchema:</td>
-	<td align="left" style="vertical-align: top; padding: 3px;"><input id="mash_name" /></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Kies ander schema:</td>
-        <td style="padding: 3px;"><div id="mash_select"></div></td>
+	<td colspan="3" align="left" style="vertical-align: top; padding: 3px;"><input id="mash_name" readonly /></td>
        </tr>
        <tr>
         <td style="vertical-align: top; float: right; padding: 3px;">Volume van de maisch L:</td>
@@ -376,26 +374,13 @@
      <div style="overflow: hidden;">
       <table style="width: 100%;">
        <tr>
-        <td colspan="6">
-         <table style="width: 100%;">
-          <tr>
-           <td style="vertical-align: top; float: right; padding: 3px;">Bitterheidsindex:</td>
-           <td style="padding: 3px;"><div style="float: left;" id="tgt_bu"></div><div style="float: left; margin-left: 10px;" id="wr_bu"></div></td>
-           <td style="vertical-align: top; float: right; padding: 3px;">Richtgetal SO4:Cl:</td>
-           <td style="padding: 3px;"><div style="float: left;" id="tgt_so4_cl"></div><div style="float: left; margin-left: 10px;" id="wrt_so4_cl"></div></td>
-           <td style="vertical-align: top; float: right; padding: 3px;">Huidig SO4:Cl:</td>
-           <td style="padding: 3px;"><div style="float: left;" id="got_so4_cl"></div><div style="float: left; margin-left: 10px;" id="wr_so4_cl"></div></td>
-          </tr>
-         </table>
-        </td>
-       </tr>
-       <tr>
-        <td align="center" colspan="6">
+        <td align="center" colspan="9">
          <div id='water_totals'>
           <table style="width: 100%;">
            <caption>Water overzicht</caption>
            <tr>
-            <td align="left" style="vertical-align: top; padding: 3px;">Water profiel</td>
+	    <td align="left" style="vertical-align: top; padding: 3px;">Water profiel</td>
+            <td style="width: 50px; padding: 3px;">Spoel</td>
             <td style="width: 97px; padding: 3px;">Volume</td>
             <td style="width: 77px; padding: 3px;">Ca</td>
 	    <td style="width: 77px; padding: 3px;">Mg</td>
@@ -404,10 +389,13 @@
             <td style="width: 77px; padding: 3px;">Na</td>
             <td style="width: 77px; padding: 3px;">Cl</td>
             <td style="width: 77px; padding: 3px;">SO4</td>
-            <td style="width: 77px; padding: 3px;">pH</td>
+	    <td style="width: 77px; padding: 3px;">pH</td>
+            <td style="width: 77px; padding: 3px;">Hardheid</td>
+            <td style="width: 77px; padding: 3px;">RA</td>
            </tr>
            <tr>
-            <td><div id="w1_name"></div></td>
+	    <td><input readonly="1" id="w1_name" /></td>
+            <td><div style='margin-left: 10px;' id='w1_button'></div></td>
             <td><div id="w1_amount"></div></td>
             <td><div id="w1_calcium"></div></td>
 	    <td><div id="w1_magnesium"></div></td>
@@ -416,10 +404,13 @@
             <td><div id="w1_sodium"></div></td>
             <td><div id="w1_chloride"></div></td>
             <td><div id="w1_sulfate"></div></td>
-            <td><div id="w1_ph"></div></td>
+	    <td><div id="w1_ph"></div></td>
+            <td><div id="w1_hardness"></div></td>
+            <td><div id="w1_ra"></div></td>
            </tr>
            <tr>
-            <td><div id="w2_name"></div></td>
+	    <td><input readonly="1" id="w2_name" /></td>
+            <td><div style='margin-left: 10px;' id='w2_button'></div></td>
             <td><div id="w2_amount"></div></td>
             <td><div id="w2_calcium"></div></td>
 	    <td><div id="w2_magnesium"></div></td>
@@ -428,10 +419,13 @@
             <td><div id="w2_sodium"></div></td>
             <td><div id="w2_chloride"></div></td>
             <td><div id="w2_sulfate"></div></td>
-            <td><div id="w2_ph"></div></td>
+	    <td><div id="w2_ph"></div></td>
+            <td><div id="w2_hardness"></div></td>
+            <td><div id="w2_ra"></div></td>
            </tr>
            <tr>
-            <td style="vertical-align: top; padding: 3px; float: left;">Gemengd water:</td>
+	    <td style="vertical-align: top; padding: 3px; float: left;">Gemengd water:</td>
+            <td><div style='margin-left: 10px;' id='wg_button'></div></td>
             <td><div id="wg_amount"></div></td>
             <td><div id="wg_calcium"></div></td>
 	    <td><div id="wg_magnesium"></div></td>
@@ -440,10 +434,13 @@
             <td><div id="wg_sodium"></div></td>
             <td><div id="wg_chloride"></div></td>
             <td><div id="wg_sulfate"></div></td>
-            <td><div id="wg_ph"></div></td>
+	    <td><div id="wg_ph"></div></td>
+            <td><div id="wg_hardness"></div></td>
+            <td><div id="wg_ra"></div></td>
            </tr>
            <tr>
-            <td style="vertical-align: top; padding: 3px; float: left;">Behandeld water:</td>
+	    <td style="vertical-align: top; padding: 3px; float: left;">Behandeld maisch water:</td>
+            <td></td>
             <td><div></div></td>
             <td><div id="wb_calcium"></div></td>
 	    <td><div id="wb_magnesium"></div></td>
@@ -452,10 +449,13 @@
             <td><div id="wb_sodium"></div></td>
             <td><div id="wb_chloride"></div></td>
             <td><div id="wb_sulfate"></div></td>
-            <td><div id="wb_ph"></div></td>
+	    <td><div id="wb_ph"></div></td>
+            <td><div id="wb_hardness"></div></td>
+            <td><div id="wb_ra"></div></td>
            </tr>
            <tr>
-            <td style="vertical-align: top; padding: 3px; float: left;">Resultaat:</td>
+	    <td style="vertical-align: top; padding: 3px; float: left;">Resultaat:</td>
+            <td></td>
             <td><div></div></td>
             <td><div id="wr_calcium"></div></td>
             <td><div id="wr_magnesium"></div></td>
@@ -464,80 +464,102 @@
             <td><div id="wr_sodium"></div></td>
             <td><div id="wr_chloride"></div></td>
             <td><div id="wr_sulfate"></div></td>
-            <td><div id="wr_ph"></div></td>
-           </tr>
+	    <td><div id="wr_ph"></div></td>
+            <td></td>
+            <td></td>
+	   </tr>
            <tr>
-            <td><div id="pr_name"></div></td>
-            <td><div></div></td>
-            <td><div id="pr_calcium"></div></td>
-            <td><div id="pr_magnesium"></div></td>
-            <td><div id="pr_bicarbonate"></div></td>
-	    <td><div id="pr_total_alkalinity"></div></td>
-            <td><div id="pr_sodium"></div></td>
-            <td><div id="pr_chloride"></div></td>
-            <td><div id="pr_sulfate"></div></td>
+            <td style="vertical-align: top; padding: 3px; float: left;">Behandeld spoelwater:</td>
             <td></td>
+            <td><div id="sw_amount"></div></td>
+            <td><div id="sw_calcium"></div></td>
+            <td><div id="sw_magnesium"></div></td>
+            <td><div id="sw_bicarbonate"></div></td>
+            <td><div id="sw_total_alkalinity"></div></td>
+            <td><div id="sw_sodium"></div></td>
+            <td><div id="sw_chloride"></div></td>
+            <td><div id="sw_sulfate"></div></td>
+            <td><div id="sw_ph"></div></td>
+            <td><div id="sw_hardness"></div></td>
+            <td><div id="sw_ra"></div></td>
            </tr>
           </table>
          </div>
         </td>
        </tr>
        <tr>
-	<th style="text-align: center;" colspan="2">Brouwzouten</th>
-	<th style="text-align: center;" colspan="2">Maischwater pH</th>
-        <th style="text-align: center;" colspan="2">Spoelwater</th>
+	<th style="text-align: center;" colspan="3">Brouwzouten</th>
+	<th colspan="3"></th>
+        <th style="text-align: center;" colspan="3">Spoelwater</th>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Calciumchloride (CaCl2) gr:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">CaCl2 gr:</td>
 	<td style="padding: 3px;"><div id="wa_cacl2"></div></td>
-        <td style="vertical-align: top; float: right; padding: 3px;"><div class='c_mashph'>Maish pH:</div></td>
-        <td style="padding: 3px;"><div id="mash_ph" class='c_mashph'></div></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Spoelwater voorraad L:</td>
-        <td style="padding: 3px;"><div id="sparge_volume"></div></td>
+        <td style="padding: 3px;"><div id="ss_cacl2"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Bitterheidsindex:</td>
+        <td style="padding: 3px;"><div style="float: left;" id="tgt_bu"></div></td>
+        <td style="padding: 3px;"><div style="float: left;" id="wr_bu"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Auto bereken:</td>
+        <td style="padding: 3px;"><div id="calc_acid"></div></td>
+        <td></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Gips (CaSO4) gr:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">CaSO4 gr:</td>
 	<td style="padding: 3px;"><div id="wa_caso4"></div></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">pH Automatisch:</td>
-        <td style="padding: 3px;"><div id="calc_acid"></div></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Spoelwater &deg;C:</td>
-        <td style="padding: 3px;"><div id="sparge_temp"></div></td>
+        <td style="padding: 3px;"><div id="ss_caso4"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Richtgetal SO4:Cl:</td>
+        <td style="padding: 3px;"><div style="float: left;" id="tgt_so4_cl"></div></td>
+        <td style="padding: 3px;"><div style="float: left;" id="wrt_so4_cl"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;"><div class='c_mashph'>Gewenst maish pH:</div></td>
+        <td style="padding: 3px;"><div id="mash_ph" class='c_mashph'></div></td>
+        <td></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Epsom zout (MgSO4) gr:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">MgSO4 gr:</td>
 	<td style="padding: 3px;"><div id="wa_mgso4"></div></td>
+        <td style="padding: 3px;"><div id="ss_mgso4"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Huidig SO4:Cl:</td>
+        <td style="padding: 3px;"><div style="float: left;" id="got_so4_cl"></div></td>
+        <td style="padding: 3px;"><div style="float: left;" id="wr_so4_cl"></div></td>
         <td style="vertical-align: top; float: right; padding: 3px;">Aanzuren met:</td>
-        <td style="padding: 3px;"><div style="float: left;" id="wa_acid_name"></div><div style="float: left; margin-left: 15px;" id="wa_acid"></div><div style="float: left; margin-left: 15px;" id="wa_acid_perc"></div></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Spoelwater bron:</td>
-        <td style="padding: 3px;"><div id="sparge_source"></div></td>
+        <td style="padding: 3px;"><input readonly="1" id="wa_acid_name" /></td>
+        <td style="padding: 3px;"><div style="float: left;" id="wa_acid_perc"></div></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Keukenzout (NaCl) gr:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">NaCl gr:</td>
 	<td style="padding: 3px;"><div id="wa_nacl"></div></td>
-        <td colspan="2"></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Spoelwater pH:</td>
-        <td style="padding: 3px;"><div id="sparge_ph"></div></td>
+        <td style="padding: 3px;"><div id="ss_nacl"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Voor koken pH:</td>
+        <td style="padding: 3px;"><div id="preboil_ph"></div></td>
+        <td></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Zuur hoeveelheid:</td>
+        <td style="padding: 3px;"><div style="float: left;" id="wa_acid"></div></td>
+        <td></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Magnesiumchloride (MgCl2) gr:</td>
-        <td style="padding: 3px;"><div id="wa_mgcl2"></div></td>
-        <td colspan="2"></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Aanzuren met:</td>
-        <td style="padding: 3px;"><div id="sparge_acid_type"></div></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">MgCl2 gr:</td>
+	<td style="padding: 3px;"><div id="wa_mgcl2"></div></td>
+        <td style="padding: 3px;"><div id="ss_mgcl2"></div></td>
+        <td colspan="3"></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Gewenst spoel pH:</td>
+        <td style="padding: 3px;"><div id="sparge_ph"></div></td>
+        <td></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Baksoda (NaHCO3) gr:</td>
-        <td style="padding: 3px;"><div id="wa_nahco3"></div></td>
-        <td colspan="2"></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Sterkte %:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">NaHCO3 gr:</td>
+	<td style="padding: 3px;"><div id="wa_nahco3"></div></td>
+        <td colspan="4"></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Aanzuren met:</td>
+        <td style="padding: 3px;"><input readonly="1" id="sparge_acid_type" /></td>
         <td style="padding: 3px;"><div id="sparge_acid_perc"></div></td>
        </tr>
        <tr>
-        <td style="vertical-align: top; float: right; padding: 3px;">Kalk (CaCO3) gr:</td>
-        <td style="padding: 3px;"><div id="wa_caco3"></div></td>
-        <td colspan="2"></td>
-        <td style="vertical-align: top; float: right; padding: 3px;">Benodigd:</td>
+        <td style="vertical-align: top; float: right; padding: 3px;">CaCO3 gr:</td>
+	<td style="padding: 3px;"><div id="wa_caco3"></div></td>
+        <td colspan="4"></td>
+        <td style="vertical-align: top; float: right; padding: 3px;">Zuur hoeveelheid:</td>
         <td style="padding: 3px;"><div id="sparge_acid_amount"></div></td>
+        <td></td>
        </tr>
       </table>
      </div>
@@ -913,61 +935,6 @@
 
    </div> <!-- Tabs -->
 
-   <div id="popupMash">
-    <div>Wijzig maisch stap detail.</div>
-    <div style="overflow: hidden;">
-     <table style="width: 100%;">
-      <tr>
-       <td align="right" style="vertical-align: top;">Stap naam:</td>
-       <td style="padding: 3px;" colspan="3"><input id="wstep_name" /></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Stap type:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_type" /></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Start temperatuur &deg;C:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_temp" /></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Eind temperatuur &deg;C:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wend_temp"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Stap tijd minuten:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_time"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Opwarm tijd minuten:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wramp_time"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;"><div id="wstep_pmpt_amount">Infusie liters:</div></td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_infuse_amount"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;"><div id="wstep_pmpt_temp">Infusie temperatuur:</div></td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_infuse_temp"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Gemeten pH:</td>
-       <td style="padding: 3px;" colspan="3"><div id="wstep_ph"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Gemeten SG:</td>
-       <td style="padding: 3px;"><div id="wstep_sg"></div></td>
-       <td style="vertical-align: top; float: right; padding: 3px;">Afgelezen &deg;Brix RI:</td>
-       <td align="left" style="vertical-align: top;"><div id="wstep_brix"></div></td>
-      </tr>
-      <tr>
-       <td style="padding-top: 30px;" colspan="4" align="center">
-        <input id="MashReady" type="button" value="Sla op" />
-       </td>
-      </tr>
-     </table>
-    </div>
-   </div>
-
    <div id="volumeWindow">
     <div>Bereken volume in de ketel</div>
     <div style="overflow: hidden;">

mercurial