In product editor calculate fermentables before the first IBU calculation. In recipe editor changed to the new water calculations like in the product editor.

Wed, 14 Jul 2021 20:51:45 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Wed, 14 Jul 2021 20:51:45 +0200
changeset 772
f9d266eb0ec6
parent 771
9856238e9217
child 773
f4161330ed01

In product editor calculate fermentables before the first IBU calculation. In recipe editor changed to the new water calculations like in the product editor.

www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/js/rec_edit.js file | annotate | diff | comparison | revisions
www/rec_edit.php file | annotate | diff | comparison | revisions
--- a/www/js/prod_edit.js	Sun Jul 11 15:55:44 2021 +0200
+++ b/www/js/prod_edit.js	Wed Jul 14 20:51:45 2021 +0200
@@ -725,7 +725,6 @@
    $('#wb_ph').val(dataRecord.wb_ph);
    $('#wa_acid_name').val(dataRecord.wa_acid_name);
    $('#wa_acid_perc').val(dataRecord.wa_acid_perc);
-//   $('#wa_base_name').val(dataRecord.wa_base_name);
    $('#starter_type').val(dataRecord.starter_type);
    $('#starter_sg').val(dataRecord.starter_sg);
    $('#starter_viability').val(dataRecord.starter_viability);
@@ -919,7 +918,7 @@
      calcIBUs();
     });
    },
-   ready: function() { $('#jqxTabs').jqxTabs('next'); },
+   ready: function() { calcFermentables(); $('#jqxTabs').jqxTabs('next'); },
    columns: [
     { text: 'Vergistbaar ingredi&euml;nt', datafield: 'f_name',
      cellsrenderer: function(index, datafield, value, defaultvalue, column, rowdata) {
@@ -1144,7 +1143,7 @@
     },
     { text: 'IBU', datafield: 'ibu', width: 80, align: 'right',
      cellsrenderer: function(index, datafield, value, defaultvalue, column, rowdata) {
-      var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat($('#batch_size').jqxNumberInput('decimal')),
+      var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat(dataRecord.batch_size),
                 parseFloat(rowdata.h_amount), parseFloat(rowdata.h_time), parseFloat(rowdata.h_alpha), $('#ibu_method').val(),
                 dataRecord.brew_whirlpool9, dataRecord.brew_whirlpool7, dataRecord.brew_whirlpool6);
       return '<span style="margin: 4px; margin-top: 6px; float: right;">' + dataAdapter.formatNumber(ibu, 'f1') + '</span>';
--- a/www/js/rec_edit.js	Sun Jul 11 15:55:44 2021 +0200
+++ b/www/js/rec_edit.js	Wed Jul 14 20:51:45 2021 +0200
@@ -44,6 +44,7 @@
  MMCaSO4 = 172.171,
  MMCaCl2 = 147.015,
  MMCaCO3 = 100.087,
+ MMMgCl2 = 95.211,      /* Since 27-06-2021 */
  MMMgSO4 = 246.475,
  MMNaHCO3 = 84.007,
  MMNa2CO3 = 105.996,
@@ -162,8 +163,6 @@
  $('#wa_nacl').jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 });
  $('#mash_ph').jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 });
  $('#calc_acid').jqxCheckBox({ disabled: ro });
- $('#wa_base_name').jqxDropDownList({ disabled: ro });
- $('#wa_base').jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 });
  $('#wa_acid_name').jqxDropDownList({ disabled: ro });
  $('#wa_acid').jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 });
  $('#wa_acid_perc').jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w80 });
@@ -502,14 +501,13 @@
    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;
-   case 'NaHCO3':
-   case 'Na2CO3':
-   case 'CaCO3':
-   case 'Ca(OH)2': $('#wa_base').val(row.m_amount * 1000); break;
   }
  }
 }
@@ -914,7 +912,6 @@
    $('#wb_ph').val(dataRecord.wb_ph);
    $('#wa_acid_name').val(dataRecord.wa_acid_name);
    $('#wa_acid_perc').val(dataRecord.wa_acid_perc);
-   $('#wa_base_name').val(dataRecord.wa_base_name);
    editFermentable(dataRecord);
    editHop(dataRecord);
    editMisc(dataRecord);
@@ -1174,7 +1171,6 @@
    selectionmode: 'singlerow',
    showtoolbar: true,
    rendertoolbar: function(toolbar) {
-    //var me = this;
     var container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
     toolbar.append(container);
     container.append('<div style="float: left; margin-left: 165px;" id="haddrowbutton"></div>');
@@ -1194,7 +1190,7 @@
      dropDownHeight: 500,
      renderer: function(index, label, value) {
       var datarecord = hoplist.records[index];
-      return datarecord.origin + ' / ' + datarecord.name + ' (' + datarecord.alpha + '% &alpha;)';
+      return datarecord.origin + ' - ' + datarecord.name + ' / ' + HopFormData[datarecord.form].nl + ' (' + datarecord.alpha + '% &alpha;)';
      }
     });
     $('#haddrowbutton').on('select', function(event) {
@@ -1241,10 +1237,7 @@
      calcIBUs();
     });
    },
-   ready: function() {
-    calcIBUs();
-    $('#jqxTabs').jqxTabs('next');
-   },
+   ready: function() { $('#jqxTabs').jqxTabs('next'); },
    columns: [
     { text: 'Hop', datafield: 'h_name',
      cellsrenderer: function(index, datafield, value, defaultvalue, column, rowdata) {
@@ -1279,7 +1272,7 @@
     },
     { text: 'IBU', datafield: 'ibu', width: 80, align: 'right',
      cellsrenderer: function(index, datafield, value, defaultvalue, column, rowdata) {
-      var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat($('#batch_size').jqxNumberInput('decimal')),
+      var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat(dataRecord.batch_size) /*parseFloat($('#batch_size').jqxNumberInput('decimal'))*/,
                       parseFloat(rowdata.h_amount), parseFloat(rowdata.h_time),
                       parseFloat(rowdata.h_alpha), $('#ibu_method').val(), 0, parseFloat(rowdata.h_time), 0);
       return '<span style="margin: 4px; margin-top: 6px; float: right;">' + dataAdapter.formatNumber(ibu, 'f1') + '</span>';
@@ -1371,50 +1364,39 @@
       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':
        $('#wa_acid_name').val(0);
        $('#wa_acid').val(row.m_amount * 1000);
-       $('#wa_acid_perc').val(80);
+       $('#wa_acid_perc').val(AcidTypeData[0].AcidPrc); // TODO: this ignores changed percentages.
        last_acid = 'Melkzuur';
        break;
       case 'Zoutzuur':
        $('#wa_acid_name').val(1);
        $('#wa_acid').val(row.m_amount * 1000);
-       $('#wa_acid_perc').val(80);
+       $('#wa_acid_perc').val(AcidTypeData[1].AcidPrc);
        last_acid = 'Zoutzuur';
        break;
       case 'Fosforzuur':
        $('#wa_acid_name').val(2);
        $('#wa_acid').val(row.m_amount * 1000);
-       $('#wa_acid_perc').val(80);
+       $('#wa_acid_perc').val(AcidTypeData[2].AcidPrc);
        last_acid = 'Fosforzuur';
        break;
       case 'Zwavelzuur':
        $('#wa_acid_name').val(3);
        $('#wa_acid').val(row.m_amount * 1000);
-       $('#wa_acid_perc').val(80);
+       $('#wa_acid_perc').val(AcidTypeData[3].AcidPrc);
        last_acid = 'Zwavelzuur';
        break;
-      case 'NaHCO3':
-       $('#wa_base_name').val(0);
-       $('#wa_base').val(row.m_amount * 1000);
-       last_base = 'NaHCO3';
-       break;
-      case 'Na2CO3':
-       $('#wa_base_name').val(1);
-       $('#wa_base').val(row.m_amount * 1000);
-       last_base = 'Na2CO3';
-       break;
-      case 'CaCO3':
-       $('#wa_base_name').val(2);
-       $('#wa_base').val(row.m_amount * 1000);
-       last_base = 'CaCO3';
-       break;
-      case 'Ca(OH)2':
-       $('#wa_base_name').val(3);
-       $('#wa_base').val(row.m_amount * 1000);
-       last_base = 'Ca(OH)2';
-       break;
      }
     }
     return data;
@@ -2064,13 +2046,14 @@
   var wg_bicarbonate = bicarbonate;
 
   $('#wg_amount').val(liters);
-  $('#wg_calcium').val(Math.round(calcium * 10) / 10);
-  $('#wg_magnesium').val(Math.round(magnesium * 10) / 10);
-  $('#wg_sodium').val(Math.round(sodium * 10) / 10);
-  $('#wg_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10);
-  $('#wg_chloride').val(Math.round(chloride * 10) / 10);
-  $('#wg_sulfate').val(Math.round(sulfate * 10) / 10);
-  $('#wg_ph').val(Round(ph, 1));
+  $('#wg_calcium').val(Round(calcium, 1));
+  $('#wg_magnesium').val(Round(magnesium, 1));
+  $('#wg_sodium').val(Round(sodium, 1));
+  $('#wg_bicarbonate').val(Round(bicarbonate, 1));
+  $('#wg_total_alkalinity').val(Round(total_alkalinity, 1));
+  $('#wg_chloride').val(Round(chloride, 1));
+  $('#wg_sulfate').val(Round(sulfate, 1));
+  $('#wg_ph').val(Round(ph, 2));
 
   var mash_ph = Round(MashpH(), 3);
   console.log('Distilled water mash pH: ' + mash_ph);
@@ -2078,14 +2061,19 @@
   /* Calculate Salt additions */
   if (liters > 0) {
    calcium += (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 +
-    parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / liters;
-   magnesium += (parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000) / liters;
+    parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000 +
+    parseFloat($('#wa_caco3').jqxNumberInput('decimal')) * MMCa / MMCaCO3 * 1000) / liters;
+   magnesium += (parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000 +
+    parseFloat($('#wa_mgcl2').jqxNumberInput('decimal')) * MMMg / MMMgCl2 * 1000) / liters;
    sodium += (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 +
-    parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters;
+    parseFloat($('#wa_nahco3').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters;
    sulfate += (parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 +
     parseFloat($('#wa_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / liters;
    chloride += (2 * parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 +
-    parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000) / liters;
+    parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000 +
+    parseFloat($('#wa_mgcl2').jqxNumberInput('decimal')) * MMCl / MMMgCl2 * 1000) / liters;
+   bicarbonate += (parseFloat($('#wa_nahco3').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3 * 1000 +
+    parseFloat($('#wa_caco3').jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3 * 1000) / liters;
   }
 
   if (dataRecord.wa_acid_name < 0 || dataRecord,wa_acid_name >= AcidTypeData.length) {
@@ -2102,15 +2090,7 @@
    $('#wa_acid_perc').val(AcidTypeData[AT].AcidPrc);
   }
 
-  if (dataRecord.wa_base_name < 0 || dataRecord.wa_base_name > 3) {
-   $('#wa_base_name').val(0);
-   dataRecord.wa_base_name = 0;
-  }
-  if (last_base == '')
-   last_base = BaseTypeData[dataRecord.wa_base_name].nl;
-
   AT = dataRecord.wa_acid_name;
-  BT = dataRecord.wa_base_name;
 
   /* Note that the next calculations do not correct the pH change by the added salts.
      This pH change is at most 0.1 pH and is a minor difference in Acid amount. */
@@ -2122,8 +2102,6 @@
    protonDeficit = ProtonDeficit(TpH);
    console.log('calc_acid tgt: ' + TpH + ' protonDeficit: ' + protonDeficit);
    if (protonDeficit > 0) { // Add acid
-    $('#wa_base').val(0);
-    setWaterAgent(last_base, 0);
     frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
     Acid = protonDeficit / frac;
     Acid *= AcidTypeData[AT].MolWt; // mg
@@ -2136,86 +2114,6 @@
 
     bicarbonate = bicarbonate - protonDeficit * frac / liters;
     total_alkalinity = bicarbonate * 50 / 61;
-   } else if (protonDeficit < 0) { //Add base
-    $('#wa_acid').val(0);
-    setWaterAgent(last_acid, 0);
-    r1d = Math.pow(10, (TpH - 6.35));
-    r2d = Math.pow(10, (TpH - 10.33));
-    f1d = 1 / (1 + r1d + r1d * r2d);
-    f2d = f1d * r1d;
-    f3d = f2d * r2d;
-    switch (BT) {
-     case 0:
-      RA = -protonDeficit / (f1d - f3d); //Sodiumbicarbonate, mmol totaal
-      RA = RA * MMNaHCO3 / 1000; //gram
-      $('#wa_base').val(Round(RA, 2));
-      setWaterAgent('NaHCO3', Round(RA, 2));
-      if (liters > 0) {
-       // Na
-       RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 +
-             parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters;
-       sodium = wg_sodium + RA;
-       // HCO3
-       RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3 * 1000) / liters;
-       bicarbonate = wg_bicarbonate + RA;
-       total_alkalinity = bicarbonate * 50 / 61;
-       RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      }
-      break;
-     case 1:
-      RA = -protonDeficit / (2 * f1d + f2d); // Sodiumcarbonate, mmol totaal
-      RA = RA * MMNa2CO3 / 1000; //gram
-      $('#wa_base').val(Round(RA, 2));
-      setWaterAgent('Na2CO3', Round(RA, 2));
-      if (liters > 0) {
-       RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 +
-             parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3 * 1000) / liters;
-       sodium = wg_sodium + RA;
-       // HCO3
-       RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3 * 1000) / liters;
-       bicarbonate = wg_bicarbonate + RA;
-       total_alkalinity = bicarbonate * 50 / 61;
-       RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      }
-      break;
-     case 2:
-      RA = -protonDeficit * (f1d - f3d); // Calciumcarbonate, mmol totaal
-      RA = RA * MMCaCO3 / 1000; //gram
-      //but only 1/3 is effective, so add 3 times as much
-      RA = 3 * RA;
-      $('#wa_base').val(Round(RA, 2));
-      setWaterAgent('CaCO3', Round(RA, 2));
-      if (liters > 0) {
-       //Bicarbonate
-       RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3 * 1000) / liters;
-       bicarbonate = wg_bicarbonate + RA;
-       total_alkalinity = bicarbonate * 50 / 61;
-       //Ca precipitates out as Ca10(PO4)6(OH)2
-       RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 +
-             parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000 +
-             parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaCO3 * 1000) / liters;
-       calcium = wg_calcium + RA;
-       RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      }
-      break;
-     case 3:
-      RA = -protonDeficit / 19.3; // Calciumhydroxide
-      $('#wa_base').val(Round(RA, 2));
-      setWaterAgent('Ca(OH)2', Round(RA, 2));
-      if (liters > 0) {
-       // Bicarbonate
-       RA = -protonDeficit / liters;
-       total_alkalinity = wg_total_alkalinity + RA;
-       bicarbonate = total_alkalinity * 61 / 50;
-       // Calcium
-       RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 +
-             parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000 +
-             parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa / MMCaOH2 * 1000) / liters;
-       calcium = wg_calcium + RA;
-       RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      }
-      break;
-    }
    }
    ph = TpH;
    $('#wb_ph').val(Round(ph, 2));
@@ -2224,43 +2122,6 @@
    /* Manual calculate pH */
    $('.c_mashph').hide();
    console.log('calc_acid no');
-   if (parseFloat($('#wa_base').jqxNumberInput('decimal')) > 0 && liters > 0) {
-    /* First add the base salts */
-    switch (BT) {
-     case 0: // Sodiumbicarbonate, Na
-      RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 +
-            parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMNa / MMNaHCO3 * 1000) / liters;
-      sodium = wg_sodium + RA;
-      // HCO3
-      RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3 * 1000) / liters;
-      bicarbonate = wg_bicarbonate + RA;
-      total_alkalinity = bicarbonate * 50 / 61;
-      RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      break;
-     case 1: // Sodiumcarbonate
-      RA = (parseFloat($('#wa_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000 +
-            parseFloat($('#wa_base').jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3 * 1000) / liters;
-      sodium = wg_sodium + RA;
-      // HCO3
-      RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3 * 1000) / liters;
-      bicarbonate = wg_bicarbonate + RA;
-      total_alkalinity = bicarbonate * 50 / 61;
-      RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      break;
-     case 2: // Calciumcarbonate: Bicarbonate
-      RA = (parseFloat($('#wa_base').jqxNumberInput('decimal')) / 3 * MMHCO3 * 1000 / MMCaCO3) / liters;
-      bicarbonate = wg_bicarbonate + RA;
-      total_alkalinity = bicarbonate * 50 / 61;
-      RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium);
-      // Ca
-      RA = (parseFloat($('#wa_cacl2').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaCl2 +
-            parseFloat($('#wa_caso4').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaSO4 +
-            parseFloat($('#wa_base').jqxNumberInput('decimal')) * MMCa * 1000 / MMCaCO3) / liters;
-      calcium = wg_calcium + RA;
-      break;
-    }
-   }
-
    pHa = Round(ph, 3); // Adjusted water pH
    // Then calculate the new pH with added acids and malts
    console.log('Mash pH: ' + pHa);
@@ -2361,6 +2222,7 @@
   $('#wb_sodium').val(Round(sodium, 1));
   $('#wb_sulfate').val(Round(sulfate, 1));
   $('#wb_chloride').val(Round(chloride, 1));
+  $('#wb_bicarbonate').val(Round(bicarbonate, 1));
   $('#wb_total_alkalinity').val(Round(total_alkalinity, 1));
 
   if (calcium < 40) {
@@ -2370,10 +2232,12 @@
   } else {
    setRangeIndicator('calcium', 'normaal');
   }
-  if (magnesium >= 0 && magnesium <= 30) {
+  if (magnesium < 5) {
+   setRangeIndicator('magnesium', 'laag');
+  } else if (magnesium > 40) {
+   setRangeIndicator('magnesium', 'hoog');
+  } else {
    setRangeIndicator('magnesium', 'normaal');
-  } else {
-   setRangeIndicator('magnesium', 'hoog');
   }
   if (sodium <= 150) {
    setRangeIndicator('sodium', 'normaal');
@@ -2384,18 +2248,23 @@
   // John Palmer. So the Cl/SO4 ratio calculation will work.
   if (chloride <= 50) {
    setRangeIndicator('chloride', 'laag');
-  } else if (chloride <= 100) {
+  } else if (chloride <= 150) {
    setRangeIndicator('chloride', 'normaal');
   } else {
    setRangeIndicator('chloride', 'hoog');
   }
   if (sulfate <= 50) {
    setRangeIndicator('sulfate', 'laag');
-  } else if (sulfate <= 350) {
+  } else if (sulfate <= 400) {
    setRangeIndicator('sulfate', 'normaal');
   } else {
    setRangeIndicator('sulfate', 'hoog');
   }
+  // (cloride + sulfate) > 500 is too high
+  if ((chloride + sulfate) > 500) {
+   setRangeIndicator('chloride', 'hoog');
+   setRangeIndicator('sulfate', 'hoog');
+  }
   if (ph < 5.2) {
    setRangeIndicator('ph', 'laag');
   } else if (ph > 5.6) {
@@ -2403,6 +2272,11 @@
   } else {
    setRangeIndicator('ph', 'normaal');
   }
+  if (bicarbonate > 250) {
+   setRangeIndicator('bicarbonate', 'hoog');
+  } else {
+   setRangeIndicator('bicarbonate', 'normaal');
+  }
   calcSparge();
  }
 
@@ -2582,29 +2456,37 @@
     calcWater();
    }
   });
-  $('#wa_base_name').on('select', function(event) {
+  $('#wa_mgcl2').on('change', function(event) {
    if (event.args) {
-    var index = event.args.index;
-    setWaterAgent(last_base, 0);
-    last_base = BaseTypeData[index].nl;
-    setWaterAgent(last_base, parseFloat($('#wa_base').jqxNumberInput('decimal')));
-    dataRecord.wa_base_name = index;
+    setWaterAgent('MgCl2', 0);
+    setWaterAgent('MgCl2', event.args.value);
     calcWater();
    }
   });
-  $('#wa_base').on('change', function(event) {
-   var name = BaseTypeData[$('#wa_base_name').val()].nl;
-   setWaterAgent(name, parseFloat(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;
     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')));
-    dataRecord.wa_acid_name = index;
-    calcWater();
    }
   });
   $('#wa_acid').on('change', function(event) {
@@ -2612,7 +2494,10 @@
    setWaterAgent(name, parseFloat(event.args.value));
    calcWater();
   });
-  $('#wa_acid_perc').on('change', function(event) { calcWater(); });
+  $('#wa_acid_perc').on('change', function(event) {
+   dataRecord.wa_acid_perc = parseFloat(event.args.value);
+   calcWater();
+  });
 
   $('#color_method').on('select', function(event) {
    dataRecord.color_method = event.args.index;
@@ -2833,9 +2718,9 @@
    wb_magnesium: parseFloat($('#wb_magnesium').jqxNumberInput('decimal')),
    wb_total_alkalinity: parseFloat($('#wb_total_alkalinity').jqxNumberInput('decimal')),
    wb_ph: parseFloat($('#wb_ph').jqxNumberInput('decimal')),
-   wa_acid_name: $('#wa_acid_name').val(),
+   wa_acid_name: parseInt($('#wa_acid_name').val()),
    wa_acid_perc: parseFloat($('#wa_acid_perc').jqxNumberInput('decimal')),
-   wa_base_name: $('#wa_base_name').val(),
+   wa_base_name: 0,
    fermentables: $('#fermentableGrid').jqxGrid('getrows'),
    hops: $('#hopGrid').jqxGrid('getrows'),
    miscs: $('#miscGrid').jqxGrid('getrows'),
@@ -3360,7 +3245,7 @@
   dropDownHeight: 500,
   renderer: function(index, label, value) {
    var datarecord = hoplist.records[index];
-   return datarecord.origin + ' / ' + datarecord.name + ' (' + datarecord.alpha + ' % &alpha;)';
+   return datarecord.origin + ' - ' + datarecord.name + ' / ' + HopFormData[datarecord.form].nl + ' (' + datarecord.alpha + ' % &alpha;)';
   }
  });
  $('#wh_select').on('select', function(event) {
@@ -3915,7 +3800,7 @@
   theme: theme,
   source: waterlist,
   displayMember: 'name',
-  width: 250,
+  width: 200,
   height: 27,
   dropDownWidth: 400,
   dropDownHeight: 400
@@ -3936,6 +3821,7 @@
    $('#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;
@@ -3948,6 +3834,7 @@
  $('#w1_calcium').jqxNumberInput(Show1wat);
  $('#w1_magnesium').jqxNumberInput(Show1wat);
  $('#w1_sodium').jqxNumberInput(Show1wat);
+ $('#w1_bicarbonate').jqxNumberInput(Show1wat);
  $('#w1_total_alkalinity').jqxNumberInput(Show1wat);
  $('#w1_chloride').jqxNumberInput(Show1wat);
  $('#w1_sulfate').jqxNumberInput(Show1wat);
@@ -3958,7 +3845,7 @@
   theme: theme,
   source: waterlist,
   displayMember: 'name',
-  width: 250,
+  width: 200,
   height: 27,
   dropDownWidth: 400,
   dropDownHeight: 400
@@ -3979,6 +3866,7 @@
    $('#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;
@@ -3993,6 +3881,7 @@
  $('#w2_calcium').jqxNumberInput(Show1wat);
  $('#w2_magnesium').jqxNumberInput(Show1wat);
  $('#w2_sodium').jqxNumberInput(Show1wat);
+ $('#w2_bicarbonate').jqxNumberInput(Show1wat);
  $('#w2_total_alkalinity').jqxNumberInput(Show1wat);
  $('#w2_chloride').jqxNumberInput(Show1wat);
  $('#w2_sulfate').jqxNumberInput(Show1wat);
@@ -4002,6 +3891,7 @@
  $('#wg_calcium').jqxNumberInput(Show1wat);
  $('#wg_magnesium').jqxNumberInput(Show1wat);
  $('#wg_sodium').jqxNumberInput(Show1wat);
+ $('#wg_bicarbonate').jqxNumberInput(Show1wat);
  $('#wg_total_alkalinity').jqxNumberInput(Show1wat);
  $('#wg_chloride').jqxNumberInput(Show1wat);
  $('#wg_sulfate').jqxNumberInput(Show1wat);
@@ -4009,14 +3899,16 @@
  // 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 lager dan 30.'});
+ $('#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 100.'});
+ $('#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 350.'});
+ $('#wb_sulfate').jqxTooltip({ content: 'De ideale hoeveelheid Sulfaat is tussen 50 en 400. Samen met Sulfaat 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_bicarbonate').jqxNumberInput(Show1wat);
  $('#wb_total_alkalinity').jqxNumberInput(Show1wat);
  $('#wb_ph').jqxNumberInput(Show2wat);
  // Water target profile
@@ -4025,7 +3917,7 @@
   theme: theme,
   source: waterprofiles,
   displayMember: 'name',
-  width: 250,
+  width: 200,
   height: 27,
   dropDownWidth: 400,
   dropDownHeight: 300
@@ -4040,12 +3932,14 @@
    $('#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').jqxNumberInput(Show1wat);
  $('#pr_magnesium').jqxNumberInput(Show1wat);
  $('#pr_sodium').jqxNumberInput(Show1wat);
+ $('#pr_bicarbonate').jqxNumberInput(Show1wat);
  $('#pr_total_alkalinity').jqxNumberInput(Show1wat);
  $('#pr_chloride').jqxNumberInput(Show1wat);
  $('#pr_sulfate').jqxNumberInput(Show1wat);
@@ -4066,24 +3960,17 @@
  $('#wa_nacl').jqxNumberInput(Spin1dec);
  $('#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);
+ $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'});
+ $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'});
+ $('#wa_caco3').jqxTooltip({ content: 'Kalk'});
+ $('#wa_mgcl2,#wa_nahco3,#wa_caco3').jqxNumberInput(Spin1dec);
  $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23 });
- $('#wa_base_name').jqxDropDownList({
-  theme: theme,
-  source: BaseTypeAdapter,
-  valueMember: 'id',
-  displayMember: 'nl',
-  width: 170,
-  height: 23,
-  autoDropDownHeight: true
- });
- $('#wa_base').jqxNumberInput(Spin2dec);
- $('#wa_base').jqxNumberInput({ symbol: ' gr', symbolPosition: 'right' });
  $('#wa_acid_name').jqxDropDownList({
   theme: theme,
   source: AcidTypeAdapter,
   valueMember: 'id',
   displayMember: 'nl',
-  width: 170,
+  width: 130,
   height: 23,
   autoDropDownHeight: true
  });
--- a/www/rec_edit.php	Sun Jul 11 15:55:44 2021 +0200
+++ b/www/rec_edit.php	Wed Jul 14 20:51:45 2021 +0200
@@ -207,8 +207,7 @@
          </table>
         </td>
         <tr>
-         <td></td>
-         <td align="left" colspan="5">
+         <td align="center" colspan="6">
           <div id='water_totals'>
  	   <table style="width: 100%;">
             <caption>Water overzicht</caption>
@@ -216,9 +215,10 @@
              <td align="left" style="vertical-align: top; padding: 3px;">Water profiel</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>
+	     <td style="width: 77px; padding: 3px;">Mg</td>
+             <td style="width: 77px; padding: 3px;">HCO3</td>
+             <td style="width: 77px; padding: 3px;">CaCO3</td>
              <td style="width: 77px; padding: 3px;">Na</td>
-             <td style="width: 77px; padding: 3px;">CaCO3</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>
@@ -228,8 +228,9 @@
              <td><div id="w1_amount"></div></td>
              <td><div id="w1_calcium"></div></td>
              <td><div id="w1_magnesium"></div></td>
+             <td><div id="w1_bicarbonate"></div></td>
+	     <td><div id="w1_total_alkalinity"></div></td>
              <td><div id="w1_sodium"></div></td>
-             <td><div id="w1_total_alkalinity"></div></td>
              <td><div id="w1_chloride"></div></td>
              <td><div id="w1_sulfate"></div></td>
              <td><div id="w1_ph"></div></td>
@@ -239,8 +240,9 @@
              <td><div id="w2_amount"></div></td>
              <td><div id="w2_calcium"></div></td>
              <td><div id="w2_magnesium"></div></td>
+             <td><div id="w2_bicarbonate"></div></td>
+	     <td><div id="w2_total_alkalinity"></div></td>
              <td><div id="w2_sodium"></div></td>
-             <td><div id="w2_total_alkalinity"></div></td>
              <td><div id="w2_chloride"></div></td>
              <td><div id="w2_sulfate"></div></td>
              <td><div id="w2_ph"></div></td>
@@ -250,8 +252,9 @@
              <td><div id="wg_amount"></div></td>
              <td><div id="wg_calcium"></div></td>
              <td><div id="wg_magnesium"></div></td>
+             <td><div id="wg_bicarbonate"></div></td>
+	     <td><div id="wg_total_alkalinity"></div></td>
              <td><div id="wg_sodium"></div></td>
-             <td><div id="wg_total_alkalinity"></div></td>
              <td><div id="wg_chloride"></div></td>
 	     <td><div id="wg_sulfate"></div></td>
              <td><div id="wg_ph"></div></td>
@@ -261,9 +264,10 @@
              <td><div></div></td>
              <td><div id="wb_calcium"></div></td>
              <td><div id="wb_magnesium"></div></td>
-             <td><div id="wb_sodium"></div></td>
+             <td><div id="wb_bicarbonate"></div></td>
              <td><div id="wb_total_alkalinity"></div></td>
-             <td><div id="wb_chloride"></div></td>
+             <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>
 	    </tr>
@@ -272,9 +276,10 @@
              <td><div></div></td>
              <td><div id="wr_calcium"></div></td>
              <td><div id="wr_magnesium"></div></td>
-             <td><div id="wr_sodium"></div></td>
+             <td><div id="wr_bicarbonate"></div></td>
              <td><div id="wr_total_alkalinity"></div></td>
-             <td><div id="wr_chloride"></div></td>
+             <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>
@@ -283,8 +288,9 @@
              <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_total_alkalinity"></div></td>
              <td><div id="pr_chloride"></div></td>
              <td><div id="pr_sulfate"></div></td>
              <td></td>
@@ -293,6 +299,11 @@
 	  </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>
+       </tr>
         <tr>
          <td style="vertical-align: top; float: right; padding: 3px;">Calciumchloride (CaCl2) gr:</td>
 	 <td style="padding: 3px;"><div id="wa_cacl2"></div></td>
@@ -312,31 +323,36 @@
         <tr>
          <td style="vertical-align: top; float: right; padding: 3px;">Epsom zout (MgSO4) gr:</td>
 	 <td style="padding: 3px;"><div id="wa_mgso4"></div></td>
-         <td style="vertical-align: top; float: right; padding: 3px;">Ontzuren met:</td>
-         <td style="padding: 3px;"><div style="float: left;" id="wa_base_name"></div><div style="float: left; margin-left: 15px;" id="wa_base"></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>
 	</tr>
         <tr>
          <td style="vertical-align: top; float: right; padding: 3px;">Keukenzout (NaCl) gr:</td>
 	 <td style="padding: 3px;"><div id="wa_nacl"></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 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>
 	</tr>
-        <tr>
-         <td colspan="4"></td>
+	<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>
         </tr>
-        <tr>
-         <td colspan="4"></td>
+	<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="padding: 3px;"><div id="sparge_acid_perc"></div></td>
         </tr>
-        <tr>
-         <td colspan="4"></td>
+	<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="padding: 3px;"><div id="sparge_acid_amount"></div></td>
         </tr>

mercurial