diff -r 0a063ac5d7f5 -r 4b8e5478d08f www/js/prod_edit.js --- a/www/js/prod_edit.js Sat Feb 02 21:35:54 2019 +0100 +++ b/www/js/prod_edit.js Sun Feb 03 17:44:14 2019 +0100 @@ -46,13 +46,13 @@ $(document).ready(function () { - var brewstage = 0; // Numeric value of stage + var to_100 = false; // Fermentables adjust to 100% var preboil_sg = 0; var est_mash_sg = 0; - var sugarsm = 0; // Sugars after mash - var sugarsf = 0; // Sugars after boil - var psugar = 0; // Percentage real sugars - var pcara = 0; // Percentage cara/crystal malts + var sugarsm = 0; // Sugars after mash + var sugarsf = 0; // Sugars after boil + var psugar = 0; // Percentage real sugars + var pcara = 0; // Percentage cara/crystal malts var svg = 77; // Default attenuation var mashkg = 0; // Malt in mash weight var hop_flavour = 0; @@ -77,6 +77,17 @@ var MMNaCl = 58.443; var MMCaOH2 = 74.06268; + var fermentableRow = 0; + var fermentableData = {}; + var hopRow = 0; + var hopData = {}; + var miscRow = 0; + var miscData = {}; + var yeastRow = 0; + var yeastData = {}; + var mashRow = 0; + var mashData = {}; + console.log("record:" + my_record + " return:" + my_return + " theme:" + theme); $("#jqxLoader").jqxLoader({ width: 250, @@ -101,12 +112,12 @@ var row = rows[i]; if (row.f_adjust_to_total_100) my_100 = true; - if (row.f_type == "Sugar") + if (row.f_type == 1) // Sugar psugar += row.f_percentage; - if (row.f_graintype == "Crystal") + if (row.f_graintype == 2) // Crystal pcara += row.f_percentage; var d = row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100); - if (row.f_added == "Mash") { + if (row.f_added == 0) { // Mash d = parseFloat(dataRecord.efficiency) / 100 * d; sugarsm += d; mashkg += row.f_amount; @@ -115,6 +126,11 @@ colorw += row.f_amount * ebc_to_srm(row.f_color) / parseFloat(dataRecord.batch_size) * 8.34436; } to_100 = my_100; + if (to_100) { + $("#wf_amount").jqxNumberInput({ width: 90, readOnly: true, spinButtons: false }); + } else { + $("#wf_amount").jqxNumberInput({ width: 110, readOnly: false, spinButtons: true }); + } var est_og = estimate_sg(sugarsf, parseFloat(dataRecord.batch_size)); $('#est_og').val(est_og); $('#est_og2').val(est_og); @@ -127,7 +143,7 @@ document.getElementById("bcolor").style.background= scolor; document.getElementById("bcolor2").style.background= scolor; pmalts = mashkg / dataRecord.eq_mash_max * 100; - console.log("mash kg: "+mashkg+" max: "+dataRecord.eq_mash_max+" perc: "+pmalts); +// console.log("mash kg: "+mashkg+" max: "+dataRecord.eq_mash_max+" perc: "+pmalts); $("#perc_malts").jqxProgressBar('val', pmalts); $("#perc_sugars").jqxProgressBar('val', psugar); $("#perc_cara").jqxProgressBar('val', pcara); @@ -147,7 +163,7 @@ var rows = $('#fermentableGrid').jqxGrid('getrows'); for (i = 0; i < rows.length; i++) { var row = rows[i]; - if ((row.f_added == "Fermentation") || (row.f_added == "Lagering") || (row.f_added == "Bottle")) { + if ((row.f_added == 2) || (row.f_added == 3) || (row.f_added == 4)) { // Fermentation, Lagering or Bottle var x = (row.f_yield / 100) * (1 - row.f_moisture / 100); vol += row.f_amount / (x * sugardensity + (1 - x) * 1); sug2 += row.f_amount * x; @@ -168,7 +184,7 @@ for (i = 0; i < rows.length; i++) { var row = rows[i]; d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100); - if (row.f_added == "Mash") + if (row.f_added == 0) // Mash d = efficiency / 100 * d; tot += d; } @@ -189,14 +205,23 @@ //CalcWaterBalance; }; + function calcFG() { + var fg = estimate_fg(psugar, pcara, 0, 0, 0, svg, parseFloat(parseFloat($("#est_og").jqxNumberInput('decimal')))); + dataRecord.est_fg = fg; + $('#est_fg').val(fg); + $('#est_fg2').val(fg); + } + function calcABV() { - $("#est_abv").val(abvol(parseFloat($("#est_og").jqxNumberInput('decimal')), parseFloat($("#est_fg").jqxNumberInput('decimal')))); + var abv = abvol(parseFloat($("#est_og").jqxNumberInput('decimal')), parseFloat($("#est_fg").jqxNumberInput('decimal'))); + $("#est_abv").val(abv); + $("#est_abv2").val(abv); }; function hopFlavourContribution(bt, vol, use, amount) { var result; - if ((use == "First Wort") || (use == "First wort")) { + if (use == 1) { // First wort result = 0.15; // assume 15% flavourcontribution for fwh } else if (bt > 50) { result = 0.10; // assume 10% flavourcontribution as a minimum @@ -217,13 +242,13 @@ result = 0; } else if (bt > 7.5) { result = 10.03 / (4 * Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * Math.pow((bt - 7.5) /4, 2)); - } else if (use == "Boil") { + } else if (use == 2) { // Boil result = 1; - } else if (use == "Aroma") { + } else if (use == 3) { // Aroma result = 1.2; - } else if (use == "Whirlpool") { + } else if (use == 4) { // Whirlpool result = 1.2; - } else if ((use == "Dry Hop") || (use == "Dry hop")) { + } else if (use == 5) { // Drt hop result = 1.33; } result = (result * amount * 1000) / vol; @@ -257,7 +282,7 @@ var rows = $('#yeastGrid').jqxGrid('getrows'); for (var i = 0; i < rows.length; i++) { var row = rows[i]; - if (row.y_use == "Primary") + if (row.y_use == 0) // Primary svg = parseFloat(row.y_attenuation); } } @@ -271,7 +296,7 @@ for (var i = 0; i < rows.length; i++) { var row = rows[i]; // console.log("step " + i + " " + row.step_name + " " + row.step_type); - if (row.step_type == 'Infusion') + if (row.step_type == 0) // Infusion mvol += parseFloat(row.step_infuse_amount); } if (mvol > 0) { @@ -279,7 +304,7 @@ var rows = $('#fermentableGrid').jqxGrid('getrows'); for (var i = 0; i < rows.length; i++) { var row = rows[i]; - if (row.f_added == "Mash") { + if (row.f_added == 0) { // Mash var d = row.f_amount * (row.f_yield / 100) * (1 - row.f_moisture / 100); mvol += row.f_amount * row.f_moisture / 100; gs += my_grain_absorbtion * row.f_amount; @@ -336,7 +361,6 @@ var row = rows[i]; if (row.m_name == name) { found = true; - $("#miscGrid").jqxGrid('setcellvalue', i, 'm_weight', amount); $("#miscGrid").jqxGrid('setcellvalue', i, 'm_amount', amount / 1000); break; } @@ -355,8 +379,9 @@ row["m_type"] = record.type; row["m_use_use"] = record.use_use; row["m_time"] = 0; - row["m_weight"] = amount; row["m_amount_is_weight"] = record.amount_is_weight; + row["m_inventory"] = record.inventory; + row["m_avail"] = 1; var commit = $("#miscGrid").jqxGrid('addrow', null, row); } } @@ -428,25 +453,25 @@ var rows = $('#fermentableGrid').jqxGrid('getrows'); for (var i = 0; i < rows.length; i++) { var row = rows[i]; - if (row.f_added == 'Mash' && row.f_graintype != 'No malt') { + if (row.f_added == 0 && row.f_graintype != 6) { // Added == Mash && graintype != No Malt // Check if acid is required var C1 = 0; if ((row.f_di_ph != 5.7) && ((row.f_acid_to_ph_57 < - 0.1) || (row.f_acid_to_ph_57 > 0.1))) { - C1 = row.f_acid_to_ph_57 / (row.f_di_ph - 5.7); + C1 = row.f_acid_to_ph_57 / (row.f_di_ph - 5.7); } else { // If the acid_to_ph_5.7 is unknown from the maltster, guess the required acid. var ebc = row.f_color; switch (row.f_graintype) { - case 'Base': - case 'Special': - case 'Kilned': C1 = 0.014 * ebc - 34.192; - break; - case 'Crystal': C1 = -0.0597 * ebc - 32.457; - break; - case 'Roast': C1 = 0.0107 * ebc - 54.768; - break; - case 'Sour': C1 = -149; - break; + case 0: // Base, Special, Kilned + case 3: + case 5: C1 = 0.014 * ebc - 34.192; + break; + case 2: C1 = -0.0597 * ebc - 32.457; // Crystal + break; + case 1: C1 = 0.0107 * ebc - 54.768; // Roast + break; + case 4: C1 = -149; // Sour malt + break; } } x = C1 * (pHZ - row.f_di_ph); // AcidRequired(ZpH) @@ -476,38 +501,38 @@ function GetAcidSpecs(AT) { switch(AT) { - case 'Melkzuur': return { - pK1: 3.08, - pK2: 20, - pK3: 20, - MolWt: 90.08, - AcidSG: 1214, - AcidPrc: 0.88 - }; - case 'Zoutzuur': return { - pK1: -10, - pK2: 20, - pK3: 20, - MolWt: 36.46, - AcidSG: 1142, - AcidPrc: 0.28 - }; - case 'Fosforzuur': return { - pK1: 2.12, - pK2: 7.20, - pK3: 12.44, - MolWt: 98.00, - AcidSG: 1170, - AcidPrc: 0.25 - }; - case 'Zwavelzuur': return { - pK1: -10, - pK2: 1.92, - pK3: 20, - MolWt: 98.07, - AcidSG: 1700, - AcidPrc: 0.93 - }; + case 0: return { // Melkzuur + pK1: 3.08, + pK2: 20, + pK3: 20, + MolWt: 90.08, + AcidSG: 1214, + AcidPrc: 0.88 + }; + case 1: return { // Zoutzuur + pK1: -10, + pK2: 20, + pK3: 20, + MolWt: 36.46, + AcidSG: 1142, + AcidPrc: 0.28 + }; + case 2: return { // Fosforzuur + pK1: 2.12, + pK2: 7.20, + pK3: 12.44, + MolWt: 98.00, + AcidSG: 1170, + AcidPrc: 0.25 + }; + case 3: return { // Zwavelzuur + pK1: -10, + pK2: 1.92, + pK3: 20, + MolWt: 98.07, + AcidSG: 1700, + AcidPrc: 0.93 + }; } } @@ -527,8 +552,6 @@ var RA = 0; var frac = 0; var TpH = 0; - var Acid = 0; - var Acidmg = 0; var protonDeficit = 0; if (dataRecord.w1_name == "") { @@ -602,17 +625,24 @@ chloride += 1000 * RA / liters; // Einde noot. - if ($("#wa_acid_name").val() == "") { - $("#wa_acid_name").val('Melkzuur'); - last_acid = 'Melkzuur'; + if ($("#wa_acid_name").val() < 0 || $("#wa_acid_name").val() > 3) { + console.log("fix wa_acid_name"); + $("#wa_acid_name").val(0); + dataRecord.wa_acid_name = 0; } - if ($("#wa_base_name").val() == "") { - $("#wa_base_name").val('NaHCO3'); - last_base = 'NaHCO3'; + if (last_acid == '') + last_acid = AcidTypeData[$("#wa_acid_name").val()].nl; + + if ($("#wa_base_name").val() < 0 || $("#wa_base_name").val() > 3) { + console.log("fix wa_base_name"); + $("#wa_base_name").val(0); + dataRecord.wa_base_name = 0; } + if (last_base == '') + last_base = BaseTypeData[$("#wa_base_name").val()].nl; - var AT = $("#wa_acid_name").val(); - var BT = $("#wa_base_name").val(); + var AT = dataRecord.wa_acid_name; + var BT = dataRecord.wa_base_name; var result = GetAcidSpecs(AT); var pK1 = result.pK1; @@ -640,7 +670,7 @@ Acid = Acid * AcidPrc / (parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')) / 100); // ml console.log("Final ml: "+Acid); $("#wa_acid").val(Math.round(Acid * 100) / 100); - setWaterAgent(AT, Math.round(Acid * 100) / 100); + setWaterAgent(AcidTypeData[AT].nl, Math.round(Acid * 100) / 100); bicarbonate = bicarbonate - protonDeficit * frac / liters; total_alkalinity = bicarbonate * 50 / 61; @@ -653,79 +683,79 @@ var f2d = f1d * r1d; var f3d = f2d * r2d; switch (BT) { - case 'NaHCO3': RA = -protonDeficit / (f1d - f3d); //mmol totaal - RA = RA * MMNaHCO3/1000; //gram - $("#wa_base").val(Math.round(RA * 100) / 100); - setWaterAgent(BT, Math.round(RA * 100) / 100); - if (liters > 0) { - // Na - RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; - RA = 1000 * RA / liters; - sodium = wg_sodium + RA; - // HCO3 - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; - RA = 1000 * RA / liters; - bicarbonate = wg_bicarbonate + RA; - total_alkalinity = bicarbonate * 50 / 61; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - } - break; - case 'Na2CO3': RA = -protonDeficit / (2 * f1d + f2d); //mmol totaal - RA = RA * MMNa2CO3/1000; //gram - $("#wa_base").val(Math.round(RA * 100) / 100); - setWaterAgent(BT, Math.round(RA * 100) / 100); - if (liters > 0) { - RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; - RA = 1000 * RA / liters; - sodium = wg_sodium + RA; - // HCO3 - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; - RA = 1000 * RA / liters; - bicarbonate = wg_bicarbonate + RA; - total_alkalinity = bicarbonate * 50 / 61; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - } - break; - case 'CaCO3': RA = -protonDeficit * (f1d - f3d); //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(Math.round(RA * 100) / 100); - setWaterAgent(BT, Math.round(RA * 100) / 100); - if (liters > 0) { - //Bicarbonate - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; - RA = 1000 * RA / 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 + - parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaCO3; - RA = 1000 * RA / liters; - calcium = wg_calcium + RA; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - } - break; - case 'Ca(OH)2': RA = -protonDeficit / 19.3; // g - $("#wa_base").val(Math.round(RA * 100) / 100); - setWaterAgent(BT, Math.round(RA * 100) / 100); - 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 + - parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaOH2; - RA = 1000 * RA / liters; - calcium = wg_calcium + RA; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - } - break; + case 0: RA = -protonDeficit / (f1d - f3d); // Sodiumbicarbonate, mmol totaal + RA = RA * MMNaHCO3/1000; //gram + $("#wa_base").val(Math.round(RA * 100) / 100); + setWaterAgent('NaHCO3', Math.round(RA * 100) / 100); + if (liters > 0) { + // Na + RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; + RA = 1000 * RA / liters; + sodium = wg_sodium + RA; + // HCO3 + RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; + RA = 1000 * RA / 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(Math.round(RA * 100) / 100); + setWaterAgent('Na2CO3', Math.round(RA * 100) / 100); + if (liters > 0) { + RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; + RA = 1000 * RA / liters; + sodium = wg_sodium + RA; + // HCO3 + RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; + RA = 1000 * RA / 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(Math.round(RA * 100) / 100); + setWaterAgent('CaCO3', Math.round(RA * 100) / 100); + if (liters > 0) { + //Bicarbonate + RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; + RA = 1000 * RA / 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 + + parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaCO3; + RA = 1000 * RA / 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(Math.round(RA * 100) / 100); + setWaterAgent('Ca(OH)2', Math.round(RA * 100) / 100); + 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 + + parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaOH2; + RA = 1000 * RA / liters; + calcium = wg_calcium + RA; + RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); + } + break; } } ph = TpH; @@ -737,42 +767,43 @@ if (parseFloat($("#wa_base").jqxNumberInput('decimal')) > 0) { if (liters > 0) { switch (BT) { - case 'NaHCO3': // Na - RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; - RA = 1000 * RA / liters; - sodium = wg_sodium + RA; - // HCO3 - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; - RA = 1000 * RA / liters; - bicarbonate = wg_bicarbonate + RA; - total_alkalinity = bicarbonate * 50 / 61; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - break; - case 'Na2CO3': RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; - RA = 1000 * RA / liters; - sodium = wg_sodium + RA; - // HCO3 - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; - RA = 1000 * RA / liters; - bicarbonate = wg_bicarbonate + RA; - total_alkalinity = bicarbonate * 50 / 61; - RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); - break; - case 'CaCO3': // Bicarbonate - RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; - RA = 1000 * RA / 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 / MMCaCl2 + - parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + - parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaCO3; - RA = 1000 * RA / liters; - calcium = wg_calcium + RA; - break; + case 0: // Sodiumbicarbonate, Na + RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; + RA = 1000 * RA / liters; + sodium = wg_sodium + RA; + // HCO3 + RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNaHCO3; + RA = 1000 * RA / 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 + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; + RA = 1000 * RA / liters; + sodium = wg_sodium + RA; + // HCO3 + RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMHCO3 / MMNa2CO3; + RA = 1000 * RA / 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 / MMCaCO3; + RA = 1000 * RA / 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 / MMCaCl2 + + parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4 + + parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMCa / MMCaCO3; + RA = 1000 * RA / liters; + calcium = wg_calcium + RA; + break; } } } @@ -818,16 +849,16 @@ } } - if ((AT == 'Zwavelzuur') && (liters > 0)) { + if ((AT == 3) && (liters > 0)) { // Sulfuctic / Zwavelzuur RA = parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + parseFloat($("#wa_mgso4").jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 + Acidmg / 1000 * MMSO4 / (MMSO4 + 2); RA = 1000 * RA / liters; sulfate = wg_sulfate + RA; // Not add to sulfate?? - } else if ((AT == 'Zoutzuur') && (liters > 0)) { + } else if ((AT == 1) && (liters > 0)) { // Hydrochloric, Zoutzuur RA = parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCl / MMCaCl2 + parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMCl / MMNaCl + - Acidmg / 1000 * MMCl / (MMCL + 1); + Acidmg / 1000 * MMCl / (MMCl + 1); RA = 1000 * RA / liters; chloride = wg_chloride + RA; } @@ -896,21 +927,21 @@ var Source_pH = dataRecord.w1_ph; var Source_alkalinity = dataRecord.w1_total_alkalinity; // Select watersource or fallback to the first source. - if (dataRecord.sparge_source == 'Bron 2') { + if (dataRecord.sparge_source == 1) { // Source 2 if (dataRecord.w2_ph > 0.0) { Source_pH = dataRecord.w2_ph; Source_alkalinity = dataRecord.w2_total_alkalinity; } else { - dataRecord.sparge_source = 'Bron 1'; - $("#sparge_source").val('Bron 1'); + dataRecord.sparge_source = 0; // Source 1 + $("#sparge_source").val(0); } - } else if (dataRecord.sparge_source == 'Gemengd') { + } else if (dataRecord.sparge_source == 2) { // Mixed if (dataRecord.w2_ph > 0.0) { Source_pH = parseFloat($("#wg_ph").jqxNumberInput('decimal')); Source_alkalinity = parseFloat($("#wg_total_alkalinity").jqxNumberInput('decimal')); } else { - dataRecord.sparge_source = 'Bron 1'; - $("#sparge_source").val('Bron 1'); + dataRecord.sparge_source = 0; + $("#sparge_source").val(0); } } @@ -947,10 +978,9 @@ //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) var Acid = alkalinity * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l - - if ($("#sparge_acid_type").val() == "") { - $("#sparge_acid_type").val('Melkzuur'); - dataRecord.sparge_acid_type = 'Melkzuur'; + if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) { + dataRecord.sparge_acid_type = 0; + $("#sparge_acid_type").val(0); } var AT = dataRecord.sparge_acid_type; var result = GetAcidSpecs(AT); @@ -1013,17 +1043,6 @@ 0.00385867329 * T * T - 0.05671206825 * T + 1.53801423376); } - function getSFactor(Sugar) { - switch (Sugar) { - case 'Kristalsuiker': return 1; - case 'Glucose/dextrose': return 1.16; - case 'Honing': return 1.28; - case 'Moutextract': return 1.74; - case 'Melasse': return 3.83; - } - return 1; - } - function calcCarbonation() { var TSec = dataRecord.secondary_temp; // End fermentation temperature. @@ -1038,7 +1057,7 @@ var ABV = abvol(dataRecord.brew_fermenter_sg, dataRecord.fg); // Bottles - var SFactor = getSFactor(dataRecord.bottle_priming_sugar); + var SFactor = PrimingSugarData[dataRecord.bottle_priming_sugar].factor; var Amount = CarbCO2toS(dataRecord.bottle_carbonation, TSec, SFactor); dataRecord.bottle_priming_amount = Amount; $("#bottle_priming_amount").val(Math.round(dataRecord.bottle_priming_amount * 10) / 10); @@ -1046,7 +1065,7 @@ $("#bottle_abv").val(Math.round((ABV + Amount * 0.47 / 7.907) * 10) / 10); // Kegs - SFactor = getSFactor(dataRecord.keg_priming_sugar); + SFactor = PrimingSugarData[dataRecord.keg_priming_sugar].factor; Amount = CarbCO2toS(dataRecord.keg_carbonation, TSec, SFactor); var Pressure = CarbCO2ToPressure(dataRecord.keg_carbonation, dataRecord.keg_carbonation_temp); if (Pressure < 0) @@ -1107,45 +1126,73 @@ calcWater(); }); $('#wa_cacl2').on('change', function (event) { - setWaterAgent('CaCl2', event.args.value); - calcWater(); + if (event.args) { + setWaterAgent('CaCl2', 0); // This can prevent double entries. + setWaterAgent('CaCl2', event.args.value); + calcWater(); + } }); $('#wa_caso4').on('change', function (event) { - setWaterAgent('CaSO4', event.args.value); - calcWater(); + if (event.args) { + setWaterAgent('CaSO4', 0); + setWaterAgent('CaSO4', event.args.value); + calcWater(); + } }); $('#wa_mgso4').on('change', function (event) { - setWaterAgent('MgSO4', event.args.value); - calcWater(); + if (event.args) { + setWaterAgent('MgSO4', 0); + setWaterAgent('MgSO4', event.args.value); + calcWater(); + } }); $('#wa_nacl').on('change', function (event) { - setWaterAgent('NaCl', event.args.value); - calcWater(); + if (event.args) { + setWaterAgent('NaCl', 0); + setWaterAgent('NaCl', event.args.value); + calcWater(); + } }); $('#wa_base_name').on('change', function (event) { - setWaterAgent(last_base, 0); - last_base = event.args.item.value; - setWaterAgent(last_base, parseFloat($("#wa_base").jqxNumberInput('decimal'))); - calcWater(); + if (event.args) { + var index = event.args.index; + console.log("wa_base_name "+index); + setWaterAgent(last_base, 0); + last_base = BaseTypeData[index].nl; + setWaterAgent(last_base, parseFloat($("#wa_base").jqxNumberInput('decimal'))); + dataRecord.wa_base_name = index; + calcWater(); + } }); $('#wa_base').on('change', function (event) { - setWaterAgent($("#wa_base_name").val(), parseFloat(event.args.value)); + var name = BaseTypeData[$("#wa_base_name").val()].nl; + setWaterAgent(name, parseFloat(event.args.value)); calcWater(); }); $('#wa_acid_name').on('change', function (event) { - setWaterAgent(last_acid, 0); - last_acid = event.args.item.value; - setWaterAgent(last_acid, parseFloat($("#wa_acid").jqxNumberInput('decimal'))); - calcWater(); + if (event.args) { + var index = event.args.index; + console.log("wa_acid_name "+index); + setWaterAgent(last_acid, 0); + last_acid = AcidTypeData[index].nl; + setWaterAgent(last_acid, parseFloat($("#wa_acid").jqxNumberInput('decimal'))); + dataRecord.wa_acid_name = index; + calcWater(); + } }); $('#wa_acid').on('change', function (event) { - setWaterAgent($("#wa_acid_name").val(), parseFloat(event.args.value)); + var name = AcidTypeData[$("#wa_acid_name").val()].nl; + setWaterAgent(name, parseFloat(event.args.value)); calcWater(); }); $('#wa_acid_perc').on('change', function (event) { calcWater(); }); - $('#color_method').on('change', function (event) { calcFermentables(); }); + $('#color_method').on('change', function (event) { + dataRecord.color_method = event.args.index; + calcFermentables(); + }); $('#ibu_method').on('change', function (event) { + dataRecord.ibu_method = event.args.index; calcFermentables(); calcIBUs(); }); @@ -1159,6 +1206,7 @@ calcFermentablesFromOG(parseFloat($("#est_og").jqxNumberInput('decimal'))); // Keep the OG calcFermentables(); calcSVG(); + calcFG(); calcABV(); // TODO: adjust the hops, miscs, yeast, water. calcIBUs(); @@ -1173,6 +1221,7 @@ $("#boil_size").val(Math.round(new_boil * 100) / 100); calcFermentables(); calcSVG(); + calcFG(); calcABV(); // TODO: adjust the hops, miscs, yeast, water. calcIBUs(); @@ -1181,6 +1230,7 @@ console.log("efficiency change:"+event.args.value); calcFermentables(); calcSVG(); + calcFG(); calcABV(); calcIBUs(); }); @@ -1191,6 +1241,7 @@ calcFermentablesFromOG(event.args.value); // Adjust fermentables amounts calcFermentables(); // Update the recipe details calcSVG(); + calcFG(); calcABV(); // and ABV calcIBUs(); // and the IBU's. }); @@ -1208,13 +1259,19 @@ calcSparge(); }); $('#sparge_source').on('change', function (event) { - dataRecord.sparge_source= event.args.item.value; - calcSparge(); + if (event.args) { + var index = event.args.index; + dataRecord.sparge_source= index; + calcSparge(); + } }); $('#sparge_acid_type').on('change', function (event) { - dataRecord.sparge_acid_type = event.args.item.value; - console.log("new sparge_acid_type: "+dataRecord.sparge_acid_type); - calcSparge(); + if (event.args) { + var index = event.args.index; + dataRecord.sparge_acid_type = index; + console.log("new sparge_acid_type: "+dataRecord.sparge_acid_type); + calcSparge(); + } }); $('#sparge_acid_perc').on('change', function (event) { dataRecord.sparge_acid_perc = parseFloat(event.args.value); @@ -1269,8 +1326,8 @@ theme: theme, source: styleslist, displayMember: "name", - width: 150, - height: 27, + width: 180, + height: 23, dropDownVerticalAlignment: 'top', dropDownWidth: 500, dropDownHeight: 380, @@ -1288,7 +1345,7 @@ $("#st_category_number").val(datarecord.category_number); $("#st_letter").val(datarecord.style_letter); $("#st_guide").val(datarecord.style_guide); - $("#st_type").val(datarecord.type); + $("#st_type").val(StyleTypeData[datarecord.type].nl); $("#st_og_min").val(datarecord.og_min); $("#st_og_max").val(datarecord.og_max); $("#st_fg_min").val(datarecord.fg_min); @@ -1312,8 +1369,8 @@ theme: theme, source: equipmentlist, displayMember: "name", - width: 150, - height: 27, + width: 170, + height: 23, dropDownWidth: 300, renderer: function (index, label, value) { var datarecord = equipmentlist.records[index]; @@ -1368,6 +1425,7 @@ var dataRecord = {}; var url = "includes/db_product.php"; + // Prepare the data var source = { datatype: "json", @@ -1379,25 +1437,25 @@ { name: 'name', type: 'string' }, { name: 'code', type: 'string' }, { name: 'birth', type: 'string' }, - { name: 'stage', type: 'string' }, + { name: 'stage', type: 'int' }, { name: 'notes', type: 'string' }, - { name: 'log_brew', type: 'bool' }, - { name: 'log_fermentation', type: 'bool' }, - { name: 'inventory_reduced', type: 'bool' }, - { name: 'locked', type: 'bool' }, + { name: 'log_brew', type: 'int' }, + { name: 'log_fermentation', type: 'int' }, + { name: 'inventory_reduced', type: 'int' }, + { name: 'locked', type: 'int' }, { name: 'eq_name', type: 'string' }, { name: 'eq_boil_size', type: 'float' }, { name: 'eq_batch_size', type: 'float' }, { name: 'eq_tun_volume', type: 'float' }, { name: 'eq_tun_weight', type: 'float' }, { name: 'eq_tun_specific_heat', type: 'float' }, - { name: 'eq_tun_material', type: 'string' }, + { name: 'eq_tun_material', type: 'int' }, { name: 'eq_tun_height', type: 'float' }, { name: 'eq_top_up_water', type: 'float' }, { name: 'eq_trub_chiller_loss', type: 'float' }, { name: 'eq_evap_rate', type: 'float' }, { name: 'eq_boil_time', type: 'float' }, - { name: 'eq_calc_boil_volume', type: 'bool' }, + { name: 'eq_calc_boil_volume', type: 'int' }, { name: 'eq_top_up_kettle', type: 'float' }, { name: 'eq_hop_utilization', type: 'float' }, { name: 'eq_notes', type: 'string' }, @@ -1422,7 +1480,7 @@ { name: 'brew_aboil_sg', type: 'float' }, { name: 'brew_aboil_ph', type: 'float' }, { name: 'brew_aboil_efficiency', type: 'float' }, - { name: 'brew_cooling_method', type: 'string' }, + { name: 'brew_cooling_method', type: 'int' }, { name: 'brew_cooling_time', type: 'float' }, { name: 'brew_cooling_to', type: 'float' }, { name: 'brew_whirlpool9', type: 'float' }, @@ -1433,11 +1491,11 @@ { name: 'brew_fermenter_extrawater', type: 'float' }, { name: 'brew_aeration_time', type: 'float' }, { name: 'brew_aeration_speed', type: 'float' }, - { name: 'brew_aeration_type', type: 'string' }, + { name: 'brew_aeration_type', type: 'int' }, { name: 'brew_fermenter_sg', type: 'float' }, { name: 'brew_fermenter_ibu', type: 'float' }, { name: 'brew_date_end', type: 'string' }, - { name: 'brew_log_available', type: 'bool' }, + { name: 'brew_log_available', type: 'int' }, { name: 'og', type: 'float' }, { name: 'fg', type: 'float' }, { name: 'primary_start_temp', type: 'float' }, @@ -1451,15 +1509,15 @@ { name: 'package_date', type: 'string' }, { name: 'bottle_amount', type: 'float' }, { name: 'bottle_carbonation', type: 'float' }, - { name: 'bottle_priming_sugar', type: 'string' }, + { name: 'bottle_priming_sugar', type: 'int' }, { name: 'bottle_priming_amount', type: 'float' }, { name: 'bottle_carbonation_temp', type: 'float' }, { name: 'keg_amount', type: 'float' }, { name: 'keg_carbonation', type: 'float' }, - { name: 'keg_priming_sugar', type: 'string' }, + { name: 'keg_priming_sugar', type: 'int' }, { name: 'keg_priming_amount', type: 'float' }, { name: 'keg_carbonation_temp', type: 'float' }, - { name: 'keg_forced_carb', type: 'bool' }, + { name: 'keg_forced_carb', type: 'int' }, { name: 'keg_pressure', type: 'float' }, { name: 'taste_notes', type: 'string' }, { name: 'taste_rate', type: 'float' }, @@ -1476,7 +1534,7 @@ { name: 'st_guide', type: 'string' }, { name: 'st_category', type: 'string' }, { name: 'st_category_number', type: 'float' }, - { name: 'st_type', type: 'string' }, + { name: 'st_type', type: 'int' }, { name: 'st_og_min', type: 'float' }, { name: 'st_og_max', type: 'float' }, { name: 'st_fg_min', type: 'float' }, @@ -1489,7 +1547,7 @@ { name: 'st_carb_max', type: 'float' }, { name: 'st_abv_min', type: 'float' }, { name: 'st_abv_max', type: 'float' }, - { name: 'type', type: 'string' }, + { name: 'type', type: 'int' }, { name: 'batch_size', type: 'float' }, { name: 'boil_size', type: 'float' }, { name: 'boil_time', type: 'float' }, @@ -1498,20 +1556,20 @@ { name: 'est_fg', type: 'float' }, { name: 'est_abv', type: 'float' }, { name: 'est_color', type: 'float' }, - { name: 'color_method', type: 'string' }, + { name: 'color_method', type: 'int' }, { name: 'est_ibu', type: 'float' }, - { name: 'ibu_method', type: 'string' }, + { name: 'ibu_method', type: 'int' }, { name: 'est_carb', type: 'float' }, { name: 'sparge_temp', type: 'float' }, { name: 'sparge_ph', type: 'float' }, { name: 'sparge_volume', type: 'float' }, - { name: 'sparge_source', type: 'string' }, - { name: 'sparge_acid_type', type: 'string' }, + { name: 'sparge_source', type: 'int' }, + { name: 'sparge_acid_type', type: 'int' }, { name: 'sparge_acid_perc', type: 'float' }, { name: 'sparge_acid_amount', type: 'float' }, { name: 'mash_ph', type: 'float' }, { name: 'mash_name', type: 'string' }, - { name: 'calc_acid', type: 'bool' }, + { name: 'calc_acid', type: 'int' }, { name: 'w1_name', type: 'string' }, { name: 'w1_amount', type: 'float' }, { name: 'w1_calcium', type: 'float' }, @@ -1532,11 +1590,14 @@ { name: 'w2_total_alkalinity', type: 'float' }, { name: 'w2_ph', type: 'float' }, { name: 'w2_cost', type: 'float' }, + { name: 'wa_acid_name', type: 'int' }, + { name: 'wa_acid_perc', type: 'int' }, + { name: 'wa_base_name', type: 'int' }, { name: 'fermentables', type: 'array' }, - { name: 'hops', type: 'string' }, - { name: 'miscs', type: 'string' }, - { name: 'yeasts', type: 'string' }, - { name: 'mashs', type: 'string' } + { name: 'hops', type: 'array' }, + { name: 'miscs', type: 'array' }, + { name: 'yeasts', type: 'array' }, + { name: 'mashs', type: 'array' } ], id: 'record', url: url + '?record=' + my_record @@ -1717,54 +1778,42 @@ $("#w2_total_alkalinity").val(dataRecord.w2_total_alkalinity); $("#w2_ph").val(dataRecord.w2_ph); $("#w2_cost").val(dataRecord.w2_cost); + $("#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); editYeast(dataRecord); editMash(dataRecord); - switch (dataRecord.stage) { - case 'Plan': brewstage = 0; break; - case 'Wait': brewstage = 1; break; - case 'Brew': brewstage = 2; break; - case 'Primary': brewstage = 3; break; - case 'Secondary': brewstage = 4; break; - case 'Tertiary': brewstage = 5; break; - case 'Package': brewstage = 6; break; - case 'Carbonation': brewstage = 7; break; - case 'Mature': brewstage = 8; break; - case 'Taste': brewstage = 9; break; - case 'Ready': brewstage = 10; - $("#locked").jqxCheckBox({ disabled:false }); - break; - case 'Closed': brewstage = 11; - $("#locked").jqxCheckBox({ disabled:false }); - break; + if (dataRecord.stage >= 10) { + $("#locked").jqxCheckBox({ disabled:false }); } // Enable or Disable settings depending on the stage. - if (brewstage > 1) + if (dataRecord.stage > 1) $("#equipmentSelect").jqxDropDownList({ disabled: true }); - if (brewstage > 0) { + if (dataRecord.stage > 0) { $("#Delete").jqxButton({ disabled: true }); } - if (brewstage < 3) { + if (dataRecord.stage < 3) { $('#jqxTabs').jqxTabs('disableAt', 9); // If recipe not complete, disable 8 too. } else { $('#jqxTabs').jqxTabs('enableAt', 9); } - if (brewstage < 4) { // At least primary + if (dataRecord.stage < 4) { // At least primary $('#jqxTabs').jqxTabs('disableAt', 10); } else { $('#jqxTabs').jqxTabs('enableAt', 10); } - if (brewstage < 6) { + if (dataRecord.stage < 6) { $("#inventory_reduced").jqxCheckBox({ disabled : true }); } else { if ($('#inventory_reduced').jqxCheckBox('checked')) $("#inventory_reduced").jqxCheckBox({ disabled : true }); } - if (brewstage < 8) { // Taste when at least Mature. + if (dataRecord.stage < 8) { // Taste when at least Mature. $('#jqxTabs').jqxTabs('disableAt', 11); } else { $('#jqxTabs').jqxTabs('enableAt', 11); @@ -1785,13 +1834,15 @@ var fermentableSource = { localdata: data.fermentables, datatype: "local", + cache: false, + async: false, datafields: [ { name: 'f_name', type: 'string' }, { name: 'f_origin', type: 'string' }, { name: 'f_supplier', type: 'string' }, { name: 'f_amount', type: 'float' }, { name: 'f_cost', type: 'float' }, - { name: 'f_type', type: 'string' }, + { name: 'f_type', type: 'int' }, { name: 'f_yield', type: 'float' }, { name: 'f_color', type: 'float' }, { name: 'f_coarse_fine_diff', type: 'float' }, @@ -1799,14 +1850,17 @@ { name: 'f_diastatic_power', type: 'float' }, { name: 'f_protein', type: 'float' }, { name: 'f_max_in_batch', type: 'float' }, - { name: 'f_graintype', type: 'string' }, - { name: 'f_added', type: 'string' }, + { name: 'f_graintype', type: 'int' }, + { name: 'f_added', type: 'int' }, { name: 'f_dissolved_protein', type: 'float' }, - { name: 'f_recommend_mash', type: 'bool' }, - { name: 'f_add_after_boil', type: 'bool' }, - { name: 'f_adjust_to_total_100', type: 'bool' }, + { name: 'f_recommend_mash', type: 'int' }, + { name: 'f_add_after_boil', type: 'int' }, + { name: 'f_adjust_to_total_100', type: 'int' }, { name: 'f_percentage', type: 'float' }, - { name: 'f_di_ph', type: 'float' } + { name: 'f_di_ph', type: 'float' }, + { name: 'f_acid_to_ph_57', type: 'float' }, + { name: 'f_inventory', type: 'float' }, + { name: 'f_avail', type: 'int' } ], addrow: function (rowid, rowdata, position, commit) { commit(true); @@ -1817,13 +1871,11 @@ }; var fermentableAdapter = new $.jqx.dataAdapter(fermentableSource); $("#fermentableGrid").jqxGrid({ - width: 1150, - height: 400, + width: 1240, + height: 450, source: fermentableAdapter, theme: theme, selectionmode: 'singlerow', - editmode: 'selectedcell', - editable: true, localization: getLocalization(), showtoolbar: true, rendertoolbar: function (toolbar) { @@ -1838,6 +1890,7 @@ $("#faddrowbutton").jqxDropDownList({ placeHolder: "Kies mout:", theme: theme, + template: "primary", source: fermentablelist, displayMember: "name", width: 150, @@ -1870,13 +1923,13 @@ row["f_max_in_batch"] = datarecord.max_in_batch; row["f_graintype"] = datarecord.graintype; if (datarecord.add_after_boil) { - row["f_added"] = "Primary"; - } else if ((datarecord.type == "Sugar") || (datarecord.type == "Adjunct")) { - row["f_added"] = "Boil"; + row["f_added"] = 2; // Fermentation + } else if ((datarecord.type == 1) || (datarecord.type == 4)) { // Sugar or Adjunct + row["f_added"] = 1; // Boil } else { - row["f_added"] = "Mash"; + row["f_added"] = 0; // Mash } - row["f_dissolved_protein"] = 0; + row["f_dissolved_protein"] = datarecord.dissolved_protein; row["f_recommend_mash"] = datarecord.recommend_mash; row["f_add_after_boil"] = datarecord.add_after_boil; if (rowscount == 0) { @@ -1888,6 +1941,8 @@ row["f_percentage"] = 0; } row["f_di_ph"] = datarecord.di_ph; + row["f_acid_to_ph_57"] = datarecord.acid_to_ph_57; + row["f_inventory"] = datarecord.inventory; var commit = $("#fermentableGrid").jqxGrid('addrow', null, row); } }); @@ -1899,7 +1954,7 @@ }); // delete selected fermentable. - $("#fdeleterowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + $("#fdeleterowbutton").jqxButton({ template: "danger", theme: theme, height: 27, width: 150 }); $("#fdeleterowbutton").on('click', function () { var selectedrowindex = $("#fermentableGrid").jqxGrid('getselectedrowindex'); var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; @@ -1936,6 +1991,7 @@ } calcFermentables(); calcSVG(); + calcFG(); calcABV(); calcIBUs(); }); @@ -1945,137 +2001,43 @@ $('#jqxTabs').jqxTabs('next'); }, columns: [ - { text: 'Vergistbaar ingrediënt', editable: false, datafield: 'f_name', + { text: 'Vergistbaar ingrediënt', datafield: 'f_name', cellsrenderer: function (row, columnfield, value, defaulthtml, columnproperties) { var rowData = $("#fermentableGrid").jqxGrid('getrowdata', row); return "" +rowData.f_supplier+" / "+rowData.f_name+" ("+rowData.f_color+" EBC)"; } }, - { text: 'Type', editable: false, align: 'center', cellsalign: 'center', width: 100, datafield: 'f_type' }, - { text: 'Moment', width: 110, align: 'center', cellsalign: 'center', datafield: 'f_added', columntype: 'dropdownlist', - createeditor: function (row, column, editor) { - var srcAdded = [ "Mash", "Boil", "Fermentation", "Lagering", "Bottle" ]; - editor.jqxDropDownList({ autoDropDownHeight: true, source: srcAdded }); - } - }, - { text: 'Opbrengst', editable: false, datafield: 'f_yield', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' }, - { text: 'Gewicht Kg', datafield: 'f_amount', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3', - columntype: 'numberinput', - validation: function (cell, value) { - // Maximum weight is the batch_size, just a simple check. - var maxmout = parseFloat($("#batch_size").jqxNumberInput('decimal')); - if (value < 0 || value > maxmout) { - return { result: false, message: "Gewicht moet 0-"+maxmout+" zijn" }; - } - return true; - }, - initeditor: function (row, cellvalue, editor) { - editor.jqxNumberInput({ inputMode: 'simple', min: 0, decimalDigits: 3, spinButtons: false }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - if (to_100) { - return oldvalue; // When using percentages, don't allow edited results. - } + { text: 'Type', width: 100, datafield: 'f_type', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + FermentableTypeData[value].nl + "
"; + } + }, + { text: 'Moment', width: 110, datafield: 'f_added', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + AddedData[value].nl + "
"; } }, - { text: 'Percentage', datafield: 'f_percentage', width: 110, align: 'right', cellsalign: 'right', cellsformat: 'p1', - columntype: 'numberinput', - validation: function (cell, value) { - if (value < 0 || value > 100) { - return { result: false, message: "Percentage moet 0-100 zijn" }; - } - return true; - }, - initeditor: function (row, cellvalue, editor) { - editor.jqxNumberInput({ decimalDigits: 1, min: 0, max: 100, spinButtons: false }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - oldvalue = Math.round(oldvalue * 10) / 10.0; - var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; - if ((oldvalue != newvalue) && (rowscount > 1)) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', row); - if (rowdata.f_adjust_to_total_100) { - return oldvalue; - } - var diff = newvalue - oldvalue; - var tw = 0; // total weight - for (i = 0; i < rowscount; i++) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - tw += rowdata.f_amount; - } - if (to_100) { - // Adjust this row and the 100% row. - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', row); - rowdata.f_amount += tw * diff / 100; - for (i = 0; i < rowscount; i++) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - if (rowdata.f_adjust_to_total_100) { - rowdata.f_percentage -= diff; - rowdata.f_amount -= tw * diff / 100; - } - } - } else { - // Adjust all the rows. - var nw = tw * diff / 100; - for (i = 0; i < rowscount; i++) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - if (i == row) { - rowdata.f_amount += nw; - } else { - rowdata.f_amount -= nw / (rowscount - 1); - rowdata.f_percentage = Math.round((rowdata.f_amount / tw) * 1000) / 10.0; - } - } - } - } - } - }, - { text: '100%', align: 'center', datafield: 'f_adjust_to_total_100', columntype: 'checkbox', width: 80, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - if (to_100) { - var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; - for (i = 0; i < rowscount; i++) { - if (i != row) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - rowdata.f_adjust_to_total_100 = false; - } - } - } - } - } + { text: 'Opbrengst', datafield: 'f_yield', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' }, + { text: 'Gewicht Kg', datafield: 'f_amount', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3' }, + { text: 'Percent', datafield: 'f_percentage', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' }, + { text: '100%', align: 'center', datafield: 'f_adjust_to_total_100', columntype: 'checkbox', width: 70 }, + { text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { + return "Wijzig"; + }, buttonclick: function (row) { + fermentableRow = row; + fermentableData = $("#fermentableGrid").jqxGrid('getrowdata', fermentableRow); + $("#wf_name").val(fermentableData.f_name); + $("#wf_amount").val(fermentableData.f_amount); + $("#wf_percentage").val(fermentableData.f_percentage); + $("#wf_adjust_to_total_100").val(fermentableData.f_adjust_to_total_100); + $("#wf_added").val(fermentableData.f_added); + // show the popup window. + $("#popupFermentable").jqxWindow('open'); + } + } ] }); - $("#fermentableGrid").on('cellendedit', function (event) { - var args = event.args; - console.log("Event Type: cellendedit, Column: " + args.datafield + ", Row: " + (args.rowindex) + ", Value: " + args.value); - // Make sure the grid itself is updated. - $("#fermentableGrid").jqxGrid('setcellvalue', args.rowindex, args.datafield, args.value); - if ((args.datafield == 'f_amount') && (! to_100)) { - // If one of the amounts is changed, recalculate the percentages. - console.log("adjust percentages"); - var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; - if (rowscount > 1) { - var tw = 0; - for (i = 0; i < rowscount; i++) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - tw += rowdata.f_amount; - }; - for (i = 0; i < rowscount; i++) { - var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); - var percentage = Math.round(rowdata.f_amount / tw * 1000) / 10.0; - $("#fermentableGrid").jqxGrid('setcellvalue', i, "f_percentage", percentage); - }; - } else { - $("#fermentableGrid").jqxGrid('setcellvalue', 0, "f_percentage", 100); - } - }; - $('#fermentableGrid').jqxGrid('sortby', 'f_amount', 'desc'); // TODO: not reliable - calcFermentables(); - calcSVG(); - calcABV(); - calcIBUs(); // Depends on gravity, so recalculate. - }); }; // Inline hops editor @@ -2084,14 +2046,15 @@ localdata: data.hops, datatype: "local", cache: false, + async: false, datafields: [ { name: 'h_name', type: 'string' }, { name: 'h_origin', type: 'string' }, { name: 'h_amount', type: 'float' }, { name: 'h_cost', type: 'float' }, - { name: 'h_type', type: 'string' }, - { name: 'h_form', type: 'string' }, - { name: 'h_useat', type: 'string' }, + { name: 'h_type', type: 'int' }, + { name: 'h_form', type: 'int' }, + { name: 'h_useat', type: 'int' }, { name: 'h_time', type: 'float' }, { name: 'h_alpha', type: 'float' }, { name: 'h_beta', type: 'float' }, @@ -2101,7 +2064,8 @@ { name: 'h_cohumulone', type: 'float' }, { name: 'h_myrcene', type: 'float' }, { name: 'h_total_oil', type: 'float' }, - { name: 'h_weight', type: 'float' } + { name: 'h_inventory', type: 'float' }, + { name: 'h_avail', type: 'int' } ], addrow: function (rowid, rowdata, position, commit) { commit(true); @@ -2110,28 +2074,13 @@ commit(true); } }; - var hopAdapter = new $.jqx.dataAdapter(hopSource, { - beforeLoadComplete: function (records) { - var data = new Array(); - for (var i = 0; i < records.length; i++) { - var row = records[i]; - row.h_weight = row.h_amount * 1000; - data.push(row); - } - return data; - }, - loadError: function(jqXHR, status, error) { - $('#err').text(status + ' ' + error); - }, - }); + var hopAdapter = new $.jqx.dataAdapter(hopSource); $("#hopGrid").jqxGrid({ - width: 1050, - height: 400, + width: 1240, + height: 510, source: hopAdapter, theme: theme, selectionmode: 'singlerow', - editmode: 'selectedcell', - editable: true, localization: getLocalization(), showtoolbar: true, rendertoolbar: function (toolbar) { @@ -2141,11 +2090,12 @@ container.append('
'); container.append('
In voorraad:
'); container.append('
'); - container.append(''); + container.append(''); // add hop from dropdownlist. $("#haddrowbutton").jqxDropDownList({ placeHolder: "Kies hop:", theme: theme, + template: "primary", source: hoplist, displayMember: "name", width: 150, @@ -2168,7 +2118,7 @@ row["h_cost"] = datarecord.cost; row["h_type"] = datarecord.type; row["h_form"] = datarecord.form; - row["h_useat"] = datarecord.useat; + row["h_useat"] = 2; // Boil row["h_time"] = 0; row["h_alpha"] = datarecord.alpha; row["h_beta"] = datarecord.beta; @@ -2178,7 +2128,7 @@ row["h_cohumulone"] = datarecord.cohumulone; row["h_myrcene"] = datarecord.myrcene; row["h_total_oil"] = datarecord.total_oil; - row["h_weight"] = 0; + row["h_inventory"] = datarecord.inventory; var commit = $("#hopGrid").jqxGrid('addrow', null, row); } }); @@ -2190,7 +2140,7 @@ }); // delete selected hop. - $("#hdeleterowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + $("#hdeleterowbutton").jqxButton({ template: "danger", theme: theme, height: 27, width: 150 }); $("#hdeleterowbutton").on('click', function () { var selectedrowindex = $("#hopGrid").jqxGrid('getselectedrowindex'); var rowscount = $("#hopGrid").jqxGrid('getdatainformation').rowscount; @@ -2198,80 +2148,48 @@ var id = $("#hopGrid").jqxGrid('getrowid', selectedrowindex); var commit = $("#hopGrid").jqxGrid('deleterow', id); } + calcIBUs(); }); }, ready: function() { + calcIBUs(); $('#jqxTabs').jqxTabs('next'); }, columns: [ - { text: 'Hop', editable: false, datafield: 'h_name', + { text: 'Hop', datafield: 'h_name', cellsrenderer: function (row, columnfield, value, defaulthtml, columnproperties) { var rowData = $("#hopGrid").jqxGrid('getrowdata', row); return "" +rowData.h_origin+" / "+rowData.h_name+""; }, }, - { text: 'Type', editable: false, width: 90, align: 'center', cellsalign: 'center', datafield: 'h_type' }, - { text: 'Vorm', editable: false, width: 90, align: 'center', cellsalign: 'center', datafield: 'h_form' }, - { text: 'Alpha', editable: false, datafield: 'h_alpha', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'p1' }, - { text: 'Amount', hidden: true, datafield: 'h_amount' }, - { text: 'Gewicht gr', datafield: 'h_weight', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f1', - columntype: 'numberinput', - cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - return "
" + dataAdapter.formatNumber(value, "f1") + " gr
"; - }, - initeditor: function (row, cellvalue, editor, celltext, pressedChar) { - editor.jqxNumberInput({ - inputMode: 'simple', decimalDigits: 1, min: 0, max: parseFloat(dataRecord.batch_size * 200), - spinButtons: false - }); - }, - validation: function (cell, value) { - var maxhops = parseFloat(dataRecord.batch_size) * 200; - if (value < 0 || value > maxhops ) { - return { result: false, message: "Gewicht moet tussen 0 en "+maxhops+" gram zijn" }; - } - return true; - } - }, - { text: 'Gebruik', width: 110, align: 'center', cellsalign: 'center', datafield: 'h_useat', columntype: 'dropdownlist', - createeditor: function (row, column, editor) { - var srcUse = [ "Boil", "Dry Hop", "Mash", "First Wort", "Aroma" ]; - editor.jqxDropDownList({ autoDropDownHeight: true, source: srcUse }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - if ((newvalue == "Mash") || (newvalue == "First Wort")) { - $("#hopGrid").jqxGrid('setcellvalue', row, "h_time", parseFloat(dataRecord.boil_time)); - } else if (newvalue == "Aroma") { - $("#hopGrid").jqxGrid('setcellvalue', row, "h_time", 0); - } - } - }, - { text: 'Tijd', datafield: 'h_time', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f0', - columntype: 'numberinput', - cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - if ((rowdata.h_useat == "Boil") || (rowdata.h_useat == "Dry Hop") || (rowdata.h_useat == "Dry hop")) - return "
"+dataAdapter.formatNumber(value, "f0")+"
"; - else - return "
"; - }, - initeditor: function (row, cellvalue, editor, celltext, pressedChar) { - editor.jqxNumberInput({ decimalDigits: 0, digits: 3, min: 0, max: parseFloat(dataRecord.boil_time) }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - var use = $("#hopGrid").jqxGrid('getcellvalue', row, "h_useat"); - if ((use == "Mash") || (use == "First Wort") || (use == "First wort") || (use == "Aroma")) - return oldvalue; - }, - validation: function (cell, value) { - var high = parseFloat(dataRecord.boil_time); - if (value < 0 || value > high ) { - return { result: false, message: "De tijd moet 0-"+high+" zijn" }; - } - return true; - } - }, - { text: 'IBU', editable: false, datafield: 'ibu', width: 80, align: 'right', + { text: 'Type', width: 90, datafield: 'h_type', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + HopTypeData[value].nl + "
"; + } + }, + { text: 'Vorm', width: 90, datafield: 'h_form', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + HopFormData[value].nl + "
"; + } + }, + { text: 'Alpha', datafield: 'h_alpha', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'p1' }, + { text: 'Gebruik', width: 110, datafield: 'h_useat', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + HopUseData[value].nl + "
"; + } + }, + { text: 'Tijdsduur', datafield: 'h_time', width: 90, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if ((rowdata.h_useat == 2) || (rowdata.h_useat == 4)) // Boil, Whirlpool + return "
"+dataAdapter.formatNumber(value, "f0")+" min.
"; + if (rowdata.h_useat == 5) // Dry hop + return "
"+dataAdapter.formatNumber(value/1440, "f0")+" dagen
"; + else + return "
"; + } + }, + { 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, @@ -2282,20 +2200,49 @@ parseFloat(rowdata.h_alpha), $("#ibu_method").val() ); - calcIBUs(); return "
" + dataAdapter.formatNumber(ibu, "f1") + "
"; } - } + }, + { text: 'Gewicht', datafield: 'h_amount', width: 110, align: 'right', cellsalign: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if (value < 1) + return "
"+dataAdapter.formatNumber(value * 1000, "f1")+" gr
"; + else + return "
"+dataAdapter.formatNumber(value, "f1")+" kg
"; + } + }, + { text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right', cellsalign: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if (value < 1) + return "
"+dataAdapter.formatNumber(value * 1000, "f1")+" gr
"; + else + return "
"+dataAdapter.formatNumber(value, "f1")+" kg
"; + } + }, + { text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { + return "Wijzig"; + }, buttonclick: function (row) { + hopRow = row; + hopData = $("#hopGrid").jqxGrid('getrowdata', hopRow); + $("#wh_name").val(hopData.h_name); + $("#wh_amount").val(hopData.h_amount * 1000); + var ibu = toIBU(hopData.h_useat, hopData.h_form, preboil_sg, + parseFloat($("#batch_size").jqxNumberInput('decimal')), + parseFloat(hopData.h_amount), parseFloat(hopData.h_time), + parseFloat(hopData.h_alpha), $("#ibu_method").val() + ); + $("#wh_ibu").val(ibu); + if (hopData.h_useat == 5) // Dry hop + $("#wh_time").val(hopData.h_time / 1440); + else + $("#wh_time").val(hopData.h_time); + $("#wh_useat").val(hopData.h_useat); + // show the popup window. + $("#popupHop").jqxWindow('open'); + } + } ] }); - $("#hopGrid").on('cellendedit', function (event) { - var args = event.args; - console.log("Event Type: cellendedit, Column: " + args.datafield + ", Row: " + (args.rowindex) + ", Value: " + args.value); - $("#hopGrid").jqxGrid('setcellvalue', args.rowindex, args.datafield, args.value); - if (args.datafield == 'h_weight') - $("#hopGrid").jqxGrid('setcellvalue', args.rowindex, 'h_amount', args.value / 1000); - //$('#hopGrid').jqxGrid('sortby', 'f_amount', 'desc'); - }); }; // Inline miscs editor @@ -2304,15 +2251,17 @@ localdata: data.miscs, datatype: "local", cache: false, + async: false, datafields: [ { name: 'm_name', type: 'string' }, { name: 'm_amount', type: 'float' }, { name: 'm_cost', type: 'float' }, - { name: 'm_type', type: 'string' }, - { name: 'm_use_use', type: 'string' }, + { name: 'm_type', type: 'int' }, + { name: 'm_use_use', type: 'int' }, { name: 'm_time', type: 'float' }, - { name: 'm_amount_is_weight', type: 'bool' }, - { name: 'm_weight', type: 'float' } + { name: 'm_amount_is_weight', type: 'int' }, + { name: 'm_inventory', type: 'float' }, + { name: 'm_avail', type: 'int' } ], addrow: function (rowid, rowdata, position, commit) { commit(true); @@ -2326,52 +2275,51 @@ var data = new Array(); for (var i = 0; i < records.length; i++) { var row = records[i]; - row.m_weight = row.m_amount * 1000; data.push(row); // Initial set water agent values. switch (row.m_name) { - case 'CaCl2': $("#wa_cacl2").val(row.m_weight); + case 'CaCl2': $("#wa_cacl2").val(row.m_amount * 1000); break; - case 'CaSO4': $("#wa_caso4").val(row.m_weight); + case 'CaSO4': $("#wa_caso4").val(row.m_amount * 1000); break; - case 'MgSO4': $("#wa_mgso4").val(row.m_weight); + case 'MgSO4': $("#wa_mgso4").val(row.m_amount * 1000); break; - case 'NaCl': $("#wa_nacl").val(row.m_weight); + case 'NaCl': $("#wa_nacl").val(row.m_amount * 1000); break; - case 'Melkzuur': $("#wa_acid_name").val('Melkzuur'); - $("#wa_acid").val(row.m_weight); + case 'Melkzuur': $("#wa_acid_name").val(0); + $("#wa_acid").val(row.m_amount * 1000); $("#wa_acid_perc").val(80); last_acid = 'Melkzuur'; break; - case 'Zoutzuur': $("#wa_acid_name").val('Zoutzuur'); - $("#wa_acid").val(row.m_weight); + case 'Zoutzuur': $("#wa_acid_name").val(1); + $("#wa_acid").val(row.m_amount * 1000); $("#wa_acid_perc").val(80); last_acid = 'Zoutzuur'; break; - case 'Fosforzuur': $("#wa_acid_name").val('Fosforzuur'); - $("#wa_acid").val(row.m_weight); + case 'Fosforzuur': $("#wa_acid_name").val(2); + $("#wa_acid").val(row.m_amount * 1000); $("#wa_acid_perc").val(80); last_acid = 'Fosforzuur'; break; - case 'Zwavelzuur': $("#wa_acid_name").val('Zwavelzuur'); - $("#wa_acid").val(row.m_weight); + case 'Zwavelzuur': $("#wa_acid_name").val(3); + $("#wa_acid").val(row.m_amount * 1000); $("#wa_acid_perc").val(80); last_acid = 'Zwavelzuur'; break; - case 'NaHCO3': $("#wa_base_name").val('NaHCO3'); - $("#wa_base").val(row.m_weight); + case 'NaHCO3': $("#wa_base_name").val(0); + $("#wa_base").val(row.m_amount * 1000); last_base = 'NaHCO3'; break; - case 'Na2CO3': $("#wa_base_name").val('Na2CO3'); - $("#wa_base").val(row.m_weight); + case 'Na2CO3': $("#wa_base_name").val(1); + $("#wa_base").val(row.m_amount * 1000); last_base = 'Na2CO3'; break; - case 'CaCO3': $("#wa_base_name").val('CaCO3'); - $("#wa_base").val(row.m_weight); + 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('Ca(OH)2'); - $("#wa_base").val(row.m_weight); + case 'Ca(OH)2': $("#wa_base_name").val(3); + $("#wa_base").val(row.m_amount * 1000); last_base = 'Ca(OH)2'; break; } @@ -2383,13 +2331,11 @@ }, }); $("#miscGrid").jqxGrid({ - width: 960, - height: 400, + width: 1240, + height: 525, source: miscAdapter, theme: theme, selectionmode: 'singlerow', - editmode: 'selectedcell', - editable: true, localization: getLocalization(), showtoolbar: true, rendertoolbar: function (toolbar) { @@ -2399,11 +2345,12 @@ container.append('
'); container.append('
In voorraad:
'); container.append('
'); - container.append(''); + container.append(''); // add misc from dropdownlist. $("#maddrowbutton").jqxDropDownList({ - placeHolder: "Kies ingredient:", + placeHolder: "Kies ingrediënt:", theme: theme, + template: "primary", source: misclist, displayMember: "name", width: 150, @@ -2422,8 +2369,8 @@ row["m_type"] = datarecord.type; row["m_use_use"] = datarecord.use_use; row["m_time"] = 0; - row["m_weight"] = 0; row["m_amount_is_weight"] = datarecord.amount_is_weight; + row["m_inventory"] = datarecord.inventory; var commit = $("#miscGrid").jqxGrid('addrow', null, row); } }); @@ -2433,12 +2380,12 @@ misclist.dataBind(); }); // delete selected misc. - $("#mdeleterowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + $("#mdeleterowbutton").jqxButton({ template: "danger", theme: theme, height: 27, width: 150 }); $("#mdeleterowbutton").on('click', function () { var selectedrowindex = $("#miscGrid").jqxGrid('getselectedrowindex'); var rowscount = $("#miscGrid").jqxGrid('getdatainformation').rowscount; var type = $("#miscGrid").jqxGrid('getcellvalue', selectedrowindex, "m_type"); - if (selectedrowindex >= 0 && selectedrowindex < rowscount && type != "Water agent") { + if (selectedrowindex >= 0 && selectedrowindex < rowscount && type != 4) { // Water agent var id = $("#miscGrid").jqxGrid('getrowid', selectedrowindex); var commit = $("#miscGrid").jqxGrid('deleterow', id); } @@ -2448,84 +2395,64 @@ $('#jqxTabs').jqxTabs('next'); }, columns: [ - { text: 'Ingredient', editable: false, datafield: 'm_name' }, - { text: 'Type', editable: false, width: 120, align: 'center', cellsalign: 'center', datafield: 'm_type' }, - { text: 'Gebruik', width: 110, align: 'center', cellsalign: 'center', datafield: 'm_use_use', columntype: 'dropdownlist', - createeditor: function (row, column, editor) { - var srcUseUse = [ "Mash", "Boil", "Primary", "Secondary", "Bottling" ]; - editor.jqxDropDownList({ autoDropDownHeight: true, source: srcUseUse }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - var type = $("#miscGrid").jqxGrid('getcellvalue', row, "m_type"); - if (type == "Water agent") - return oldvalue; - } - }, - { datafield: 'm_amount_is_weight', hidden: true }, // We need to declare this column - { datafield: 'm_amount', hidden: true }, // We need to declare this column - { text: 'Hoeveelheid', datafield: 'm_weight', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f2', - columntype: 'numberinput', - cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - var vstr = rowdata.m_amount_is_weight ? "gr":"ml"; - return "
"+dataAdapter.formatNumber(value,"f2")+" "+vstr+"
"; - }, - validation: function (cell, value) { - var high = parseFloat(dataRecord.boil_size) * 1000; - if (value < 0 || value > high) { - return { result: false, message: "Hoeveelheid moet tussen 0 en "+high+" zijn" }; - } - return true; - }, - initeditor: function (row, cellvalue, editor) { - editor.jqxNumberInput({ - inputMode: 'simple', min: 0, max: parseFloat(dataRecord.boil_size) * 1000, - decimalDigits: 2, spinButtons: false - }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - var type = $("#miscGrid").jqxGrid('getcellvalue', row, "m_type"); - if (type == "Water agent") - return oldvalue; + { text: 'Ingredient', datafield: 'm_name' }, + { text: 'Type', width: 140, datafield: 'm_type', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + MiscTypeData[value].nl + "
"; + } + }, + { text: 'Gebruik', width: 140, datafield: 'm_use_use', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + MiscUseData[value].nl + "
"; } + }, + { text: 'Tijd', datafield: 'm_time', width: 90, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if (rowdata.m_use_use == 2) { // Boil + return "
"+dataAdapter.formatNumber(value, "f0")+" min.
"; + } else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4)) { // Primary or Secondary + return "
"+dataAdapter.formatNumber(value/1440, "f0")+" dagen
"; + } else { + var tijd = 0; + return "
"; + } + }, }, - { text: 'Tijd', datafield: 'm_time', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f0', - columntype: 'numberinput', - cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - if (rowdata.m_use_use == 'Boil') { - return "
"+dataAdapter.formatNumber(value, "f0")+" m
"; - } else if (rowdata.m_use_use == 'Secondary') { - return "
"+dataAdapter.formatNumber(value, "f0")+" d
"; - } else { - var tijd = 0; - return "
"; - } - }, - initeditor: function (row, cellvalue, editor, celltext, pressedChar) { - editor.jqxNumberInput({ decimalDigits: 0, digits: 3, min: 0, max: parseFloat(dataRecord.boil_time) }); - }, - cellvaluechanging: function (row, column, columntype, oldvalue, newvalue) { - var use = $("#miscGrid").jqxGrid('getcellvalue', row, "m_use_use"); - if ((use != "Boil") && (use != "Secondary")) - return oldvalue; - }, - validation: function (cell, value) { - var high = parseFloat(dataRecord.boil_time); - if (value < 0 || value > high ) { - return { result: false, message: "De tijd moet 0-"+high+" zijn" }; - } - return true; - } - } + { text: 'Hoeveel', datafield: 'm_amount', width: 110, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + var vstr = rowdata.m_amount_is_weight ? "gr":"ml"; + return "
"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"
"; + } + }, + { text: 'Voorraad', datafield: 'm_inventory', width: 110, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + var vstr = rowdata.m_amount_is_weight ? "gr":"ml"; + return "
"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"
"; + } + }, + { text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { + return "Wijzig"; + }, buttonclick: function (row) { + miscRow = row; + miscData = $("#miscGrid").jqxGrid('getrowdata', miscRow); + if (miscData.m_amount_is_weight) + $("#wm_pmpt_amount").html("Gewicht gram:"); + else + $("#wm_pmpt_amount").html("Volume ml:"); + $("#wm_name").val(miscData.m_name); + $("#wm_amount").val(miscData.m_amount * 1000); + if ((miscData.m_use_use == 3) || (miscData.m_use_use == 4)) // Primary or Secondary + $("#wm_time").val(miscData.m_time / 1440); + else + $("#wm_time").val(miscData.m_time); + $("#wm_use_use").val(miscData.m_use_use); + // show the popup window. + if (miscData.m_type != 4) + $("#popupMisc").jqxWindow('open'); + } + } ] }); - $("#miscGrid").on('cellendedit', function (event) { - var args = event.args; - console.log("Event Type: cellendedit, Column: " + args.datafield + ", Row: " + (args.rowindex) + ", Value: " + args.value); - $("#miscGrid").jqxGrid('setcellvalue', args.rowindex, args.datafield, args.value); - if (args.datafield == 'm_weight') { - $("#miscGrid").jqxGrid('setcellvalue', args.rowindex, 'm_amount', parseFloat(args.value) / 1000); - } - }); }; // Inline yeasts editor @@ -2534,21 +2461,23 @@ localdata: data.yeasts, datatype: "local", cache: false, + async: false, datafields: [ { name: 'y_name', type: 'string' }, { name: 'y_laboratory', type: 'string' }, { name: 'y_product_id', type: 'string' }, { name: 'y_amount', type: 'float' }, { name: 'y_cost', type: 'float' }, - { name: 'y_type', type: 'string' }, - { name: 'y_form', type: 'string' }, - { name: 'y_time', type: 'float' }, + { name: 'y_type', type: 'int' }, + { name: 'y_form', type: 'int' }, + { name: 'y_flocculation', type: 'int' }, { name: 'y_min_temperature', type: 'float' }, { name: 'y_max_temperature', type: 'float' }, { name: 'y_attenuation', type: 'float' }, - { name: 'y_amount_is_weight', type: 'bool' }, - { name: 'y_use', type: 'string' }, - { name: 'y_weight', type: 'float' } + { name: 'y_use', type: 'int' }, + { name: 'y_cells', type: 'float' }, + { name: 'y_inventory', type: 'float' }, + { name: 'y_avail', type: 'int' } ], addrow: function (rowid, rowdata, position, commit) { commit(true); @@ -2557,31 +2486,13 @@ commit(true); } }; - var yeastAdapter = new $.jqx.dataAdapter(yeastSource, { - beforeLoadComplete: function (records) { - var data = new Array(); - for (var i = 0; i < records.length; i++) { - var row = records[i]; - if (row.y_form == 'Liquid') - row.y_weight = Math.round(row.y_amount * 17); - else - row.y_weight = row.y_amount * 1000; - data.push(row); - } - return data; - }, - loadError: function(jqXHR, status, error) { - $('#err').text(status + ' ' + error); - }, - }); + var yeastAdapter = new $.jqx.dataAdapter(yeastSource); $("#yeastGrid").jqxGrid({ - width: 1050, - height: 300, + width: 1240, + height: 400, source: yeastAdapter, theme: theme, selectionmode: 'singlerow', - editmode: 'selectedcell', - editable: true, localization: getLocalization(), showtoolbar: true, rendertoolbar: function (toolbar) { @@ -2591,12 +2502,13 @@ container.append('
'); container.append('
In voorraad:
'); container.append('
'); - container.append(''); + container.append(''); // add yeast from dropdownlist. $("#yaddrowbutton").jqxDropDownList({ placeHolder: "Kies gist:", theme: theme, source: yeastlist, + template: "primary", displayMember: "name", width: 150, height: 27, @@ -2619,17 +2531,13 @@ row["y_form"] = datarecord.form; row["y_amount"] = 0; row["y_cost"] = datarecord.cost; - row["y_use"] = "Primary"; - row["y_time"] = 0; - if (datarecord.form == "Dry") { - row["y_amount_is_weight"] = 1; - } else { - row["y_amount_is_weight"] = 0; - } + row["y_use"] = 0; row["y_min_temperature"] = datarecord.min_temperature; row["y_max_temperature"] = datarecord.max_temperature; row["y_attenuation"] = datarecord.attenuation; - row["y_weight"] = 0; + row["y_flocculation"] = datarecord.flocculation; + row["y_cells"] = datarecord.cells; + row["y_inventory"] = datarecord.inventory; var commit = $("#yeastGrid").jqxGrid('addrow', null, row); } }); @@ -2639,7 +2547,7 @@ yeastlist.dataBind(); }); // delete selected yeast. - $("#ydeleterowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + $("#ydeleterowbutton").jqxButton({ template: "danger", theme: theme, height: 27, width: 150 }); $("#ydeleterowbutton").on('click', function () { var selectedrowindex = $("#yeastGrid").jqxGrid('getselectedrowindex'); var rowscount = $("#yeastGrid").jqxGrid('getdatainformation').rowscount; @@ -2654,60 +2562,72 @@ $('#jqxTabs').jqxTabs('next'); }, columns: [ - { text: 'Gist', editable: false, datafield: 'y_name' }, - { text: 'Laboratorium', editable: false, width: 150, datafield: 'y_laboratory' }, - { text: 'Code', editable: false, width: 90, datafield: 'y_product_id' }, - { text: 'Soort', editable: false, width: 80, align: 'center', cellsalign: 'center', datafield: 'y_form' }, - { text: 'Min.', editable: false, width: 70, align: 'right', cellsalign: 'right', datafield: 'y_min_temperature' }, - { text: 'Max.', editable: false, width: 70, align: 'right', cellsalign: 'right', datafield: 'y_max_temperature' }, - { text: 'Attn.', editable: false, width: 70, align: 'right', cellsalign: 'right', datafield: 'y_attenuation', cellsformat: 'f1' }, - { text: 'Voor', width: 100, align: 'center', cellsalign: 'center', datafield: 'y_use', columntype: 'dropdownlist', - createeditor: function (row, column, editor) { - var srcYUse = [ "Primary", "Secondary", "Bottle" ]; - editor.jqxDropDownList({ autoDropDownHeight: true, source: srcYUse }); + { text: 'Gist', datafield: 'y_name' }, + { text: 'Laboratorium', width: 150, datafield: 'y_laboratory' }, + { text: 'Code', width: 90, datafield: 'y_product_id' }, + { text: 'Soort', width: 100, datafield: 'y_form', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + YeastFormData[value].nl + "
"; + } + }, + { text: 'Min. °C', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_min_temperature' }, + { text: 'Max. °C', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_max_temperature' }, + { text: 'Attn. %', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_attenuation', cellsformat: 'f1' }, + { text: 'Voor', width: 120, datafield: 'y_use', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + YeastUseData[value].nl + "
"; } }, - { datafield: 'y_amount', width: 90 }, - { text: 'Hoeveel', datafield: 'y_weight', width: 110, align: 'right', cellsalign: 'right', - cellsformat: 'f1', columntype: 'numberinput', - cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { - if (rowdata.y_form == 'Liquid') { - return "
"+dataAdapter.formatNumber(value, "f0")+" pk
"; - } else if (rowdata.y_form == 'Dry') { - return "
"+dataAdapter.formatNumber(value, "f1")+" gr
"; - } else { - return "
"+dataAdapter.formatNumber(value, "f0")+" ml
"; - } - }, - initeditor: function (row, cellvalue, editor, celltext, pressedChar) { - var form = $("#yeastGrid").jqxGrid('getcellvalue', args.rowindex, 'y_form'); - if (form == 'Dry') { - editor.jqxNumberInput({ decimalDigits: 1, min: 0, spinButtons: false }); - } else { - editor.jqxNumberInput({ decimalDigits: 0, min: 0, spinButtons: false }); - } - }, - validation: function (cell, value) { - if (value < 0 || value > 100000000000 ) { - return { result: false, message: "Hoeveelheid moet 0-~ zijn" }; - } - return true; - } - } + { text: 'Hoeveel', datafield: 'y_amount', width: 100, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if (rowdata.y_form == 0) { // Liquid + return "
"+dataAdapter.formatNumber(value, "f0")+" pk
"; + } else if (rowdata.y_form == 1) { // Dry + return "
"+dataAdapter.formatNumber(value*1000, "f1")+" gr
"; + } else { + return "
"+dataAdapter.formatNumber(value*1000, "f0")+" ml
"; + } + } + }, + { text: 'Voorraad', datafield: 'y_inventory', width: 100, align: 'right', + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + if (rowdata.y_form == 0) { // Liquid + return "
"+dataAdapter.formatNumber(value, "f0")+" pk
"; + } else if (rowdata.y_form == 1) { // Dry + return "
"+dataAdapter.formatNumber(value*1000, "f1")+" gr
"; + } else { + return "
"+dataAdapter.formatNumber(value*1000, "f0")+" ml
"; + } + } + }, + { text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { + return "Wijzig"; + }, buttonclick: function (row) { + yeastRow = row; + yeastData = $("#yeastGrid").jqxGrid('getrowdata', yeastRow); + if (yeastData.y_form == 0) { + $("#wy_pmpt_amount").html("Pak(ken):"); + $("#wy_amount").val(yeastData.y_amount); + $("#wy_amount").jqxNumberInput({ decimalDigits: 0, spinButtonsStep: 1 }); + } else if (yeastData.y_form == 1) { + $("#wy_pmpt_amount").html("Gewicht gram:"); + $("#wy_amount").val(yeastData.y_amount * 1000); + $("#wy_amount").jqxNumberInput({ decimalDigits: 1, spinButtonsStep: 0.5 }); + } else { + $("#wy_pmpt_amount").html("Volume ml:"); + $("#wy_amount").val(yeastData.y_amount * 1000); + $("#wy_amount").jqxNumberInput({ decimalDigits: 0, spinButtonsStep: 1 }); + } + $("#wy_name").val(yeastData.y_name); + $("#wy_laboratory").val(yeastData.y_laboratory); + $("#wy_product_id").val(yeastData.y_product_id); + $("#wy_use").val(yeastData.y_use); + // show the popup window. + $("#popupYeast").jqxWindow('open'); + } + } ] }); - $("#yeastGrid").on('cellendedit', function (event) { - var args = event.args; - console.log("Event Type: cellendedit, Column: " + args.datafield + ", Row: " + (args.rowindex) + ", Value: " + args.value); - $("#yeastGrid").jqxGrid('setcellvalue', args.rowindex, args.datafield, args.value); - if (args.datafield == 'y_weight') { - var form = $("#yeastGrid").jqxGrid('getcellvalue', args.rowindex, 'y_form'); - if (form == 'Liquid') - $("#yeastGrid").jqxGrid('setcellvalue', args.rowindex, 'y_amount', parseFloat(args.value * 0.0588)); - else - $("#yeastGrid").jqxGrid('setcellvalue', args.rowindex, 'y_amount', parseFloat(args.value / 1000)); - } - }); }; // inline mash editor @@ -2727,9 +2647,10 @@ localdata: data.mashs, datatype: "local", cache: false, + async: false, datafields: [ { name: 'step_name', type: 'string' }, - { name: 'step_type', type: 'string' }, + { name: 'step_type', type: 'int' }, { name: 'step_infuse_amount', type: 'float' }, { name: 'step_temp', type: 'float' }, { name: 'step_time', type: 'float' }, @@ -2749,19 +2670,17 @@ var data = new Array(); for (var i = 0; i < records.length; i++) { var row = records[i]; - if (row.step_type == 'Infusion') + if (row.step_type == 0) // Infusion mash_infuse += parseFloat(row.step_infuse_amount); } }, }); $("#mashGrid").jqxGrid({ - width: 960, + width: 1240, height: 400, source: mashAdapter, theme: theme, selectionmode: 'singlerow', - editmode: 'selectedcell', - editable: true, localization: getLocalization(), showtoolbar: true, rendertoolbar: function (toolbar) { @@ -2769,14 +2688,14 @@ var container = $("
"); toolbar.append(container); container.append(''); - container.append(''); - $("#saddrowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + container.append(''); + $("#saddrowbutton").jqxButton({ template: "primary", theme: theme, height: 27, width: 150 }); $("#saddrowbutton").on('click', function () { var datarow = generaterow(); var commit = $("#mashGrid").jqxGrid('addrow', null, datarow); }); - // delete selected yeast. - $("#sdeleterowbutton").jqxButton({ theme: theme, height: 27, width: 150 }); + // delete selected step. + $("#sdeleterowbutton").jqxButton({ template: "danger", theme: theme, height: 27, width: 150 }); $("#sdeleterowbutton").on('click', function () { var selectedrowindex = $("#mashGrid").jqxGrid('getselectedrowindex'); var rowscount = $("#mashGrid").jqxGrid('getdatainformation').rowscount; @@ -2787,71 +2706,52 @@ }); }, ready: function() { - var fg = estimate_fg(psugar, pcara, 0, 0, 0, svg, parseFloat(parseFloat($("#est_og").jqxNumberInput('decimal')))); - dataRecord.est_fg = fg; - $('#est_fg').val(fg); - $('#est_fg2').val(fg); + calcFG(); calcInit(); $('#jqxLoader').jqxLoader('close'); $('#jqxTabs').jqxTabs('first'); }, columns: [ { text: 'Stap naam', datafield: 'step_name' }, - { text: 'Stap type', datafield: 'step_type', width: 110, columntype: 'dropdownlist', - createeditor: function (row, cellvalue, editor, celltext, cellwidth, cellheight) { - var dataSource = [ "Infusion", "Temperature", "Decoction" ]; - editor.jqxDropDownList({ source: dataSource, dropDownHeight: 105 }); - } - }, - { text: 'Temperatuur', datafield: 'step_temp', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f1', - validation: function (cell, value) { - if (value < 35 || value > 80) { - return { result: false, message: "De temperatuur moet tussen 35 en 80 zijn." }; - } - return true; - } - }, - { text: 'Eind', datafield: 'end_temp', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f1', - validation: function (cell, value) { - if (value < 35 || value > 80) { - return { result: false, message: "De temperatuur moet tussen 35 en 80 zijn." }; - } - return true; + { text: 'Stap type', datafield: 'step_type', width: 175, + cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { + return "
" + MashStepTypeData[value].nl + "
"; } }, - { text: 'Tijd', datafield: 'step_time', width: 70, align: 'right', cellsalign: 'right', - validation: function (cell, value) { - if (value < 1 || value > 360) { - return { result: false, message: "De tijd moet tussen 1 en 360 zijn." }; - } - return true; - } - }, - { text: 'Stap', datafield: 'ramp_time', width: 70, align: 'right', cellsalign: 'right', - validation: function (cell, value) { - if (value < 1 || value > 60) { - return { result: false, message: "De tijd moet tussen 1 en 60 zijn." }; - } - return true; - } - }, - { text: 'Infuse', datafield: 'step_infuse_amount', width: 70, align: 'right', cellsalign: 'right', - validation: function (cell, value) { - if (value < 0 || value > 60) { - return { result: false, message: "De waarde moet tussen 0 en 60 zijn." }; - } - return true; - } - } + { text: 'Start °C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, + { text: 'Eind °C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, + { text: 'Tijd', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' }, + { text: 'Stap', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' }, + { text: 'Infuse', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right' }, + { text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { + return "Wijzig"; + }, buttonclick: function (row) { + mashRow = row; + mashData = $("#mashGrid").jqxGrid('getrowdata', mashRow); + $("#wstep_name").val(mashData.step_name); + $("#wstep_type").val(mashData.step_type); + $("#wstep_infuse_amount").val(mashData.step_infuse_amount); + $("#wstep_temp").val(mashData.step_temp); + $("#wend_temp").val(mashData.end_temp); + $("#wstep_time").val(mashData.step_time); + $("#wramp_time").val(mashData.ramp_time); + if (mashData.step_type == 0) { + $("#wstep_infuse_amount").show(); + $("#wstep_pmpt").show(); + } else { + $("#wstep_infuse_amount").hide(); + $("#wstep_pmpt").hide(); + } + // show the popup window. + $("#popupMash").jqxWindow('open'); + } + } ] }); - $("#mashGrid").on('cellendedit', function (event) { - $('#mashGrid').jqxGrid('sortby', 'step_temp', 'asc'); - }); }; // initialize the input fields. - var srcType = [ "All Grain", "Partial Mash", "Extract" ]; +// var srcType = [ "All Grain", "Partial Mash", "Extract" ]; var srcColor = [ "Morey", "Mosher", "Daniels" ]; var srcIBU = [ "Tinseth", "Rager", "Daniels" ]; // Only these are supported at this time. var srcBase = [ "NaHCO3", "Na2CO3", "CaCO3", "Ca(OH)2" ]; @@ -2894,16 +2794,26 @@ $("#notes").jqxTooltip({ content: 'De uitgebreide opmerkingen over dit product.' }); $("#notes").jqxInput({ theme: theme, width: 960, height: 100 }); $("#type").jqxTooltip({ content: 'Het brouw type van dit recept.' }); - $("#type").jqxDropDownList({ theme: theme, source: srcType, width: 125, height: 23, dropDownHeight: 95 }); + $("#type").jqxDropDownList({ + theme: theme, + source: RecipeTypeAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true + }); $("#efficiency").jqxTooltip({ content: 'Het rendement van maischen en koken.' }); - $("#efficiency").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 40, max: 100, decimalDigits: 0, spinButtons: true, symbol: '%', symbolPosition: 'right' }); - + $("#efficiency").jqxNumberInput( Perc1dec5 ); $("#batch_size").jqxTooltip({ content: 'Het volume van het gekoelde wort na het koken.' }); - $("#batch_size").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 4, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1, symbol: 'L', symbolPosition: 'right' }); + $("#batch_size").jqxNumberInput( Spin1dec5 ); + $("#batch_size").jqxNumberInput({ min: 4 }); $("#boil_time").jqxTooltip({ content: 'De kooktijd in minuten.' }); - $("#boil_time").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 4, max: 360, decimalDigits: 0, spinButtons: true }); + $("#boil_time").jqxNumberInput( PosInt ); + $("#boil_time").jqxNumberInput({ min: 4, max: 360 }); $("#boil_size").jqxTooltip({ content: 'Het volume van het wort voor het koken.' }); - $("#boil_size").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 100, height: 23, decimalDigits: 2, readOnly: true, symbol: 'L', symbolPosition: 'right' }); + $("#boil_size").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 2, readOnly: true }); + $("#st_guide").jqxTooltip({ content: 'De bierstijl gids voor dit recept.'}); $("#st_guide").jqxInput({ theme: theme, width: 250, height: 23 }); $("#st_name").jqxTooltip({ content: 'De bierstijl naam voor dit recept.'}); @@ -2918,38 +2828,59 @@ $("#st_category_number").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); $("#est_og").jqxTooltip({ content: 'Het begin SG wat je wilt bereiken. De moutstort wordt automatisch herberekend.' }); - $("#est_og").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 1.000, max: 1.200, decimalDigits: 3, spinButtons: true, spinButtonsStep: 0.001 }); + $("#est_og").jqxNumberInput( SGopts ); $("#st_og_min").jqxTooltip({ content: 'Het minimum begin SG voor deze bierstijl.'}); $("#st_og_min").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 3, readOnly: true }); $("#st_og_max").jqxTooltip({ content: 'Het maximum begin SG voor deze bierstijl.'}); $("#st_og_max").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 3, readOnly: true }); + $("#est_fg").jqxTooltip({ content: 'Het eind SG. Dit wordt automatisch berekend.' }); - $("#est_fg").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 100, height: 23, decimalDigits: 3, readOnly: true }); - $("#est_fg2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 70, height: 23, decimalDigits: 3, readOnly: true }); + $("#est_fg").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 3, readOnly: true }); $("#st_fg_min").jqxTooltip({ content: 'Het minimum eind SG voor deze bierstijl.'}); $("#st_fg_min").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 3, readOnly: true }); $("#st_fg_max").jqxTooltip({ content: 'Het maximum eind SG voor deze bierstijl.'}); $("#st_fg_max").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 3, readOnly: true }); + $("#est_abv").jqxTooltip({ content: 'Alcohol volume %. Dit wordt automatisch berekend.' }); $("#est_abv").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true }); $("#st_abv_min").jqxTooltip({ content: 'Het minimum alcohol volume % voor deze bierstijl.'}); $("#st_abv_min").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true }); $("#st_abv_max").jqxTooltip({ content: 'Het maximum alcohol volume % voor deze bierstijl.'}); $("#st_abv_max").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true }); + $("#est_color").jqxTooltip({ content: 'De kleur in EBC. Dit wordt automatisch berekend.' }); - $("#est_color").jqxNumberInput({ inputMode: 'simple', theme: theme, symbol: ' EBC', symbolPosition: 'right', width: 100, height: 23, decimalDigits: 0, readOnly: true }); + $("#est_color").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 0, readOnly: true }); $("#st_color_min").jqxTooltip({ content: 'De minimum kleur voor deze bierstijl.'}); $("#st_color_min").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); $("#st_color_max").jqxTooltip({ content: 'De maximum kleur voor deze bierstijl.'}); $("#st_color_max").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); - $("#color_method").jqxDropDownList({ theme: theme, source: srcColor, width: 125, height: 23, dropDownHeight: 95 }); + $("#color_method").jqxDropDownList({ + theme: theme, + source: ColorMethodAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true + }); + $("#est_ibu").jqxTooltip({ content: 'De bitterheid in IBU. Dit wordt automatisch berekend.' }); - $("#est_ibu").jqxNumberInput({ inputMode: 'simple', theme: theme, symbol: ' IBU', symbolPosition: 'right', width: 100, height: 23, decimalDigits: 0, readOnly: true }); + $("#est_ibu").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 0, readOnly: true }); $("#st_ibu_min").jqxTooltip({ content: 'De minimum bitterheid voor deze bierstijl.'}); $("#st_ibu_min").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); $("#st_ibu_max").jqxTooltip({ content: 'De maximum bitterheid voor deze bierstijl.'}); $("#st_ibu_max").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); - $("#ibu_method").jqxDropDownList({ theme: theme, source: srcIBU, width: 125, height: 23, dropDownHeight: 95, dropDownVerticalAlignment: 'top' }); + $("#ibu_method").jqxDropDownList({ + theme: theme, + source: IBUmethodAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true, + dropDownVerticalAlignment: 'top' + }); + $("#est_carb").jqxTooltip({ content: 'Koolzuur volume. Dit wordt automatisch berekend.' }); $("#est_carb").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true }); $("#st_carb_min").jqxTooltip({ content: 'Het minimum koolzuur volume voor deze bierstijl.'}); @@ -2995,30 +2926,678 @@ // Tab 3, Fermentables $("#est_color2").jqxTooltip({ content: 'De kleur in EBC. Dit wordt automatisch berekend.' }); - $("#est_color2").jqxNumberInput({ inputMode: 'simple', theme: theme, symbol: ' EBC', symbolPosition: 'right', width: 100, height: 23, decimalDigits: 0, readOnly: true }); + $("#est_color2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 0, readOnly: true }); + $("#est_og2").jqxTooltip({ content: 'Het geschatte begin SG van dit product.' }); + $("#est_og2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 3, readOnly: true }); $("#perc_malts").jqxProgressBar({ width: 300, height: 23, theme: theme, showText: true }); - $("#est_og2").jqxTooltip({ content: 'Het geschatte begin SG van dit product.' }); - $("#est_og2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 100, height: 23, decimalDigits: 3, readOnly: true }); $("#perc_sugars").jqxProgressBar({ width: 300, height: 23, theme: theme, showText: true }); $("#perc_cara").jqxProgressBar({ width: 300, height: 23, theme: theme, showText: true }); + $("#popupFermentable").jqxWindow({ + width: 800, + height: 300, + position: { x: 230, y: 100 }, + resizable: false, + theme: theme, + isModal: true, + autoOpen: false, + cancelButton: $("#FermentableReady"), + modalOpacity: 0.40 + }); + $("#FermentableReady").jqxButton({ template: "success", width: '90px', theme: theme }); + $("#FermentableReady").click(function () { + $("#fermentableGrid").jqxGrid('sortby', 'f_amount', 'desc'); + // Recalc percentages + calcFermentables(); + calcSVG(); + calcFG(); + calcABV(); + calcIBUs(); + // Waters: yes there is impact. + }); + $("#wf_name").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wf_instock").jqxCheckBox({ theme: theme, height: 23 }); + $("#wf_instock").on('change', function (event) { + fermentableinstock = event.args.checked; + fermentablelist.dataBind(); + }); + $("#wf_select").jqxDropDownList({ + placeHolder: "Kies mout:", + theme: theme, + source: fermentablelist, + displayMember: "name", + width: 150, + height: 23, + dropDownWidth: 500, + dropDownHeight: 500, + renderer: function (index, label, value) { + var datarecord = fermentablelist.records[index]; + return datarecord.supplier+ " / " + datarecord.name + " (" + datarecord.color + " EBC)"; + } + }); + $("#wf_select").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var datarecord = fermentablelist.records[index]; + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', fermentableRow); + $("#wf_name").val(datarecord.name); + rowdata.f_name = datarecord.name; + rowdata.f_origin = datarecord.origin; + rowdata.f_supplier = datarecord.supplier; + rowdata.f_type = datarecord.type; + rowdata.f_cost = datarecord.cost; + rowdata.f_yield = datarecord.yield; + rowdata.f_color = datarecord.color; + rowdata.f_coarse_fine_diff = datarecord.coarse_fine_diff; + rowdata.f_moisture = datarecord.moisture; + rowdata.f_diastatic_power = datarecord.diastatic_power; + rowdata.f_protein = datarecord.protein; + rowdata.f_max_in_batch = datarecord.max_in_batch; + rowdata.f_graintype = datarecord.graintype; + rowdata.f_dissolved_protein = datarecord.dissolved_protein; + rowdata.f_recommend_mash = datarecord.recommend_mash; + rowdata.f_add_after_boil = datarecord.add_after_boil; + rowdata.f_di_ph = datarecord.di_ph; + rowdata.f_acid_to_ph_57 = datarecord.acid_to_ph_57; + rowdata.f_inventory = datarecord.inventory; + } + }); + $("#wf_amount").jqxNumberInput( Spin3dec5 ); + $('#wf_amount').on('change', function (event) { + console.log("amount changed: "+event.args.value); + $("#fermentableGrid").jqxGrid('setcellvalue', fermentableRow, 'f_amount', event.args.value); + if (! to_100) { + // Recalculate percentages + console.log("adjust percentages"); + var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; + if (rowscount > 1) { + var tw = 0; + for (i = 0; i < rowscount; i++) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); + tw += rowdata.f_amount; + }; + for (i = 0; i < rowscount; i++) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); + var percentage = Math.round(rowdata.f_amount / tw * 1000) / 10.0; + $("#fermentableGrid").jqxGrid('setcellvalue', i, "f_percentage", percentage); + // if (i == fermentableRow) // Will crash the script. + // $("#wf_percentage").val(percentage); + }; + } else { + $("#fermentableGrid").jqxGrid('setcellvalue', 0, "f_percentage", 100); + } + calcFermentables(); + }; + }); + $("#wf_percentage").jqxNumberInput( Perc1dec1 ); + $("#wf_percentage").on('change', function (event) { + var oldvalue = Math.round(fermentableData.f_percentage * 10) / 10.0; + var newvalue = event.args.value; + console.log("percentage changed: "+newvalue+" old: "+oldvalue); + var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; + if ((oldvalue != newvalue) && (rowscount > 1)) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', fermentableRow); + if (rowdata.f_adjust_to_total_100) { + $("#wf_percentage").val(oldvalue); + } else { + var diff = newvalue - oldvalue; + var tw = 0; // total weight + for (i = 0; i < rowscount; i++) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); + tw += rowdata.f_amount; + } + if (to_100) { + // Adjust this row and the 100% row. + var damount = tw * diff / 100; + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', fermentableRow); + var namount = rowdata.f_amount + damount; + $("#fermentableGrid").jqxGrid('setcellvalue', fermentableRow, 'f_amount', namount); + $("#wf_amount").val(namount); + $("#fermentableGrid").jqxGrid('setcellvalue', fermentableRow, 'f_percentage', rowdata.f_percentage + diff); + for (i = 0; i < rowscount; i++) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); + if (rowdata.f_adjust_to_total_100) { + namount = rowdata.f_amount - damount; + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_percentage', rowdata.f_percentage - diff); + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_amount', namount); + } + } + calcFermentables(); + } else { + // Adjust all the rows. + var nw = tw * diff / 100; + for (i = 0; i < rowscount; i++) { + var rowdata = $("#fermentableGrid").jqxGrid('getrowdata', i); + if (i == fermentableRow) { + var namount = rowdata.f_amount + nw; + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_amount', namount); + // $("#wf_amount").val(namount); // Will crash the script. + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_percentage', newvalue); + } else { + var namount = rowdata.f_amount - (nw / (rowscount - 1)); + var newperc = Math.round((namount / tw) * 1000) / 10.0; + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_amount', namount); + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_percentage', newperc); + } + } + calcFermentables(); + } + } + } + }); + $("#wf_adjust_to_total_100").jqxCheckBox({ theme: theme, width: 120, height: 23 }); + $("#wf_adjust_to_total_100").on('checked', function (event) { + if (fermentableData.f_adjust_to_total_100 == 0) { + if (to_100) { + // Reset other flag first. + var rowscount = $("#fermentableGrid").jqxGrid('getdatainformation').rowscount; + for (var i = 0; i < rowscount; i++) { + if (i != fermentableRow) { + $("#fermentableGrid").jqxGrid('setcellvalue', i, 'f_adjust_to_total_100', 0); + } + } + } + $("#fermentableGrid").jqxGrid('setcellvalue', fermentableRow, 'f_adjust_to_total_100', 1); + calcFermentables(); + } + }); + $("#wf_adjust_to_total_100").on('unchecked', function (event) { + if (fermentableData.f_adjust_to_total_100 != 0) { + $("#fermentableGrid").jqxGrid('setcellvalue', fermentableRow, 'f_adjust_to_total_100', 0); + calcFermentables(); + } + }); + $("#wf_added").jqxDropDownList({ + theme: theme, + source: AddedAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true, + dropDownVerticalAlignment: 'top' + }); // Tab 4, Hops $("#est_ibu2").jqxTooltip({ content: 'De bitterheid in IBU. Dit wordt automatisch berekend.' }); $("#est_ibu2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 0, readOnly: true }); $("#hop_flavour").jqxProgressBar({ width: 300, height: 23, theme: theme, showText: true }); $("#hop_aroma").jqxProgressBar({ width: 300, height: 23, theme: theme, showText: true }); + $("#popupHop").jqxWindow({ + width: 800, + height: 300, + position: { x: 230, y: 100 }, + resizable: false, + theme: theme, + isModal: true, + autoOpen: false, + cancelButton: $("#HopReady"), + modalOpacity: 0.40 + }); + $("#HopReady").jqxButton({ template: "success", width: '90px', theme: theme }); + $("#HopReady").click(function () { + $("#hopGrid").jqxGrid('sortby', 'h_amount', 'asc'); + calcIBUs(); + }); + $("#wh_name").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wh_instock").jqxCheckBox({ theme: theme, height: 23 }); + $("#wh_instock").on('change', function (event) { + hopinstock = event.args.checked; + hoplist.dataBind(); + }); + $("#wh_select").jqxDropDownList({ + placeHolder: "Kies hop:", + theme: theme, + source: hoplist, + displayMember: "name", + width: 150, + height: 23, + dropDownWidth: 500, + dropDownHeight: 500, + renderer: function (index, label, value) { + var datarecord = hoplist.records[index]; + return datarecord.origin+ " / " + datarecord.name + " (" + datarecord.alpha + " % α)"; + } + }); + $("#wh_select").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var datarecord = hoplist.records[index]; + var rowdata = $("#hopGrid").jqxGrid('getrowdata', hopRow); + $("#wh_name").val(datarecord.name); + rowdata.h_name = datarecord.name; + rowdata.h_origin = datarecord.origin; + rowdata.h_cost = datarecord.cost; + rowdata.h_type = datarecord.type; + rowdata.h_form = datarecord.form; + rowdata.h_alpha = datarecord.alpha; + rowdata.h_beta = datarecord.beta; + rowdata.h_hsi = datarecord.hsi; + rowdata.h_humulene = datarecord.humulene; + rowdata.h_caryophyllene = datarecord.caryophyllene; + rowdata.h_cohumulone = datarecord.cohumulone; + rowdata.h_myrcene = datarecord.myrcene; + rowdata.h_total_oil = datarecord.total_oil; + rowdata.h_inventory = datarecord.inventory; + } + }); + $("#wh_amount").jqxNumberInput( Spin1dec1 ); + $('#wh_amount').on('change', function (event) { + console.log("amount changed: "+event.args.value); + var amount = parseFloat(event.args.value) / 1000; + var rowdata = $("#hopGrid").jqxGrid('getrowdata', hopRow); + var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, + parseFloat($("#batch_size").jqxNumberInput('decimal')), + amount, parseFloat(rowdata.h_time), + parseFloat(rowdata.h_alpha), $("#ibu_method").val() + ); + rowdata.h_amount = amount; + calcIBUs(); + }); + $("#wh_ibu").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 1, readOnly: true }); + $("#wh_time").jqxNumberInput( PosInt ); + $("#wh_time").on('change', function (event) { + console.log("time changed: "+event.args.value); + var rowdata = $("#hopGrid").jqxGrid('getrowdata', hopRow); + var newtime = parseFloat(event.args.value); + // Check limits and correct + if (rowdata.h_useat == 2) { // Boil + if (newtime > parseFloat($("#boil_time").jqxNumberInput('decimal'))) { + newtime = parseFloat($("#boil_time").jqxNumberInput('decimal')); + $("#wh_time").val(newtime); + } + rowdata.h_time = newtime; + } else if (rowdata.h_useat == 4) { // Whirlpool + if (newtime > 120) { + newtime = 120; + $("#wh_time").val(newtime); + } + rowdata.h_time = newtime; + } else if (rowdata.h_useat == 5) { // Dry hop + if (newtime > 21) { + newtime = 21; + $("#wh_time").val(newtime); + } + rowdata.h_time = newtime * 1440; + } + var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat($("#batch_size").jqxNumberInput('decimal')), + parseFloat(rowdata.h_amount), parseFloat(rowdata.h_time), parseFloat(rowdata.h_alpha), $("#ibu_method").val()); + $("#wh_ibu").val(ibu); + calcIBUs(); + }); + $("#wh_useat").jqxDropDownList({ + theme: theme, + source: HopUseAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true, + dropDownVerticalAlignment: 'top' + }); + $("#wh_useat").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var rowdata = $("#hopGrid").jqxGrid('getrowdata', hopRow); + rowdata.h_useat = index; + if ((index == 0) || (index == 1)) { // Mashhop or First wort hop + rowdata.h_time = parseFloat(dataRecord.boil_time); + $("#wh_time").jqxNumberInput({ spinButtons: false, readOnly: true, width: 90 }); + $("#wh_time").val(rowdata.h_time); + } else if (index == 3) { // Aroma + rowdata.h_time = 0; + $("#wh_time").jqxNumberInput({ spinButtons: false, readOnly: true, width: 90 }); + $("#wh_time").val(0); + } else { // Boil, Whirlpool or Dry hop + $("#wh_time").jqxNumberInput({ spinButtons: true, readOnly: false, width: 110 }); + } + if (index == 5) // Dry hop + $("#wh_pmpt_time").html("Tijd in dagen"); + else + $("#wh_pmpt_time").html("Tijd in minuten"); + } + }); // Tab 5, Miscs + $("#popupMisc").jqxWindow({ + width: 800, + height: 275, + position: { x: 230, y: 100 }, + resizable: false, + theme: theme, + isModal: true, + autoOpen: false, + cancelButton: $("#MiscReady"), + modalOpacity: 0.40 + }); + $("#MiscReady").jqxButton({ template: "success", width: '90px', theme: theme }); + $("#MiscReady").click(function () { + $("#miscGrid").jqxGrid('sortby', 'm_use_use', 'asc'); + }); + $("#wm_name").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wm_instock").jqxCheckBox({ theme: theme, height: 23 }); + $("#wm_instock").on('change', function (event) { + miscinstock = event.args.checked; + misclist.dataBind(); + }); + $("#wm_select").jqxDropDownList({ + placeHolder: "Kies ingrediënt:", + theme: theme, + source: misclist, + displayMember: "name", + width: 150, + height: 23, + dropDownWidth: 500, + dropDownHeight: 500 + }); + $("#wm_select").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var datarecord = misclist.records[index]; + var rowdata = $("#miscGrid").jqxGrid('getrowdata', miscRow); + $("#wm_name").val(datarecord.name); + rowdata.m_name = datarecord.name; + rowdata.m_cost = datarecord.cost; + rowdata.m_type = datarecord.type; + rowdata.m_use_use = datarecord.use_use; + rowdata.m_amount_is_weight = datarecord.amount_is_weight; + rowdata.m_inventory = datarecord.inventory; + } + }); + $("#wm_amount").jqxNumberInput( Spin1dec1 ); + $('#wm_amount').on('change', function (event) { + console.log("amount changed: "+event.args.value); + var amount = parseFloat(event.args.value) / 1000; + var rowdata = $("#miscGrid").jqxGrid('getrowdata', miscRow); + rowdata.m_amount = amount; + }); + $("#wm_time").jqxNumberInput( PosInt ); + $("#wm_time").on('change', function (event) { + console.log("time changed: "+event.args.value); + var rowdata = $("#miscGrid").jqxGrid('getrowdata', miscRow); + var newtime = parseFloat(event.args.value); + + if (rowdata.m_use_use == 2) { // Boil + if (newtime > parseFloat($("#boil_time").jqxNumberInput('decimal'))) { + newtime = parseFloat($("#boil_time").jqxNumberInput('decimal')); + $("#wm_time").val(newtime); + } + rowdata.m_time = newtime; + } else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4)) { // Primary or Secondary + if (newtime > 21) { + newtime = 21; + $("#wm_time").val(newtime); + } + rowdata.m_time = newtime * 1440; + } + }); + $("#wm_use_use").jqxDropDownList({ + theme: theme, + source: MiscUseAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true, + dropDownVerticalAlignment: 'top' + }); + $("#wm_use_use").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var rowdata = $("#miscGrid").jqxGrid('getrowdata', miscRow); + rowdata.m_use_use = index; + if ((index == 2) || (index == 3) || (index == 4)) { // Boil, Primary or Secondary + $("#wm_time").jqxNumberInput({ spinButtons: true, readOnly: false, width: 110 }); + } else { + rowdata.m_time = 0; + $("#wm_time").jqxNumberInput({ spinButtons: false, readOnly: true, width: 90 }); + $("#wm_time").val(0); + } + } + }); // Tab 6, Yeasts + $("#est_fg2").jqxTooltip({ content: 'Het eind SG. Dit wordt automatisch berekend.' }); + $("#est_fg2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 90, height: 23, decimalDigits: 3, readOnly: true }); + $("#est_abv2").jqxTooltip({ content: 'Alcohol volume %. Dit wordt automatisch berekend.' }); + $("#est_abv2").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 50, height: 23, decimalDigits: 1, readOnly: true }); + $("#popupYeast").jqxWindow({ + width: 800, + height: 300, + position: { x: 230, y: 100 }, + resizable: false, + theme: theme, + isModal: true, + autoOpen: false, + cancelButton: $("#YeastReady"), + modalOpacity: 0.40 + }); + $("#YeastReady").jqxButton({ template: "success", width: '90px', theme: theme }); + $("#YeastReady").click(function () { + calcSVG(); + calcFG(); + calcABV(); + $("#yeastGrid").jqxGrid('sortby', 'y_use', 'asc'); + }); + $("#wy_name").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wy_laboratory").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wy_product_id").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#wy_instock").jqxCheckBox({ theme: theme, height: 23 }); + $("#wy_instock").on('change', function (event) { + yeastinstock = event.args.checked; + yeastlist.dataBind(); + }); + $("#wy_select").jqxDropDownList({ + placeHolder: "Kies gist:", + theme: theme, + source: yeastlist, + displayMember: "name", + width: 150, + height: 23, + dropDownWidth: 500, + dropDownHeight: 500, + renderer: function (index, label, value) { + var datarecord = yeastlist.records[index]; + return datarecord.laboratory+" "+datarecord.product_id+" "+datarecord.name; + } + }); + $("#wy_select").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var datarecord = yeastlist.records[index]; + var rowdata = $("#yeastGrid").jqxGrid('getrowdata', yeastRow); + $("#wy_name").val(datarecord.name); + $("#wy_laboratory").val(datarecord.laboratory); + $("#wy_product_id").val(datarecord.product_id); + rowdata.y_name = datarecord.name; + rowdata.y_cost = datarecord.cost; + rowdata.y_type = datarecord.type; + rowdata.y_form = datarecord.form; + rowdata.y_laboratory = datarecord.laboratory; + rowdata.y_product_id = datarecord.product_id; + rowdata.y_min_temperature = datarecord.min_temperature; + rowdata.y_max_temperature = datarecord.max_temperature; + rowdata.y_flocculation = datarecord.flocculation; + rowdata.y_attenuation = datarecord.attenuation; + rowdata.y_cells = datarecord.cells; + rowdata.y_inventory = datarecord.inventory; + if (rowdata.y_form == 0) { + $("#wy_pmpt_amount").html("Pak(ken):"); + } else if (rowdata.y_form == 1) { + $("#wy_pmpt_amount").html("Gewicht gram:"); + } else { + $("#wy_pmpt_amount").html("Volume ml:"); + } + calcSVG(); + calcFG(); + calcABV(); + } + }); + $("#wy_amount").jqxNumberInput( Spin1dec5 ); + $('#wy_amount').on('change', function (event) { + console.log("amount changed: "+event.args.value); + var rowdata = $("#yeastGrid").jqxGrid('getrowdata', yeastRow); + if (rowdata.y_form == 0) // Liquid + var amount = parseFloat(event.args.value); + else + var amount = parseFloat(event.args.value) / 1000; + rowdata.y_amount = amount; + calcSVG(); + calcFG(); + calcABV(); + }); + $("#wy_use").jqxDropDownList({ + theme: theme, + source: YeastUseAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true, + dropDownVerticalAlignment: 'top' + }); + $("#wy_use").on('select', function (event) { + if (event.args) { + var index = event.args.index; + var rowdata = $("#yeastGrid").jqxGrid('getrowdata', yeastRow); + rowdata.y_use = index; + calcSVG(); + calcFG(); + calcABV(); + } + }); // 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 index = event.args.index; + // First delete all current steps + var rowIDs = new Array(); + var rows = $("#mashGrid").jqxGrid('getdisplayrows'); + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + rowIDs.push(row.uid); + } + $("#mashGrid").jqxGrid('deleterow', rowIDs); + // Then add the new steps + $("#mash_name").val(datarecord.name); + for (var i = 0; i < datarecord.steps.length; i++) { + var data = datarecord.steps[i]; + var row = {}; + row["step_name"] = data.step_name; + row["step_type"] = data.step_type; + // For now, but this must be smarter. + if (mash_infuse == 0 && dataRecord.w1_amount > 0) + mash_infuse = dataRecord.w1_amount; + if (i == 0) + row["step_infuse_amount"] = mash_infuse; + else + row["step_infuse_amount"] = 0; + row["step_temp"] = data.step_temp; + row["end_temp"] = data.end_temp; + row["step_time"] = data.step_time; + row["ramp_time"] = data.ramp_time; + var commit = $("#mashGrid").jqxGrid('addrow', null, row); + } + } + }); + $("#popupMash").jqxWindow({ + width: 800, + height: 350, + position: { x: 230, y: 100 }, + resizable: false, + theme: theme, + isModal: true, + autoOpen: false, + cancelButton: $("#MashReady"), + modalOpacity: 0.40 + }); + $("#MashReady").jqxButton({ template: "success", width: '90px', theme: theme }); + $("#MashReady").click(function () { + $("#mashGrid").jqxGrid('sortby', 'step_temp', 'asc'); + }); + $("#wstep_name").jqxInput({ theme: theme, width: 320, height: 23 }); + $("#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 index = event.args.index; + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.step_type = index; + if (index == 0) { + $("#wstep_infuse_amount").show(); + $("#wstep_pmpt").show(); + } else { + rowdata.step_infuse_amount = 0; + $("#wstep_infuse_amount").hide(); + $("#wstep_pmpt").hide(); + } + mash_infuse = 0; + var rows = $('#mashGrid').jqxGrid('getrows'); + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + if (row.step_type == 0) // Infusion + mash_infuse += parseFloat(row.step_infuse_amount); + } + } + }); + $("#wstep_temp").jqxNumberInput( Spin1dec5 ); + $('#wstep_temp').on('change', function (event) { + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.step_temp = parseFloat(event.args.value); + }); + $("#wend_temp").jqxNumberInput( Spin1dec5 ); + $('#wend_temp').on('change', function (event) { + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.end_temp = parseFloat(event.args.value); + }); + $("#wstep_time").jqxNumberInput( PosInt ); + $('#wstep_time').on('change', function (event) { + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.step_time = parseFloat(event.args.value); + }); + $("#wramp_time").jqxNumberInput( PosInt ); + $('#wramp_time').on('change', function (event) { + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.ramp_time = parseFloat(event.args.value); + }); + $("#wstep_infuse_amount").jqxNumberInput( Spin1dec5 ); + $('#wstep_infuse_amount').on('change', function (event) { + var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); + rowdata.step_infuse_amount = parseFloat(event.args.value); + mash_infuse = 0; + var rows = $('#mashGrid').jqxGrid('getrows'); + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + if (row.step_type == 0) // Infusion + mash_infuse += parseFloat(row.step_infuse_amount); + } + }); // Tab 8, Water $("#tgt_bu").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 2, readOnly: true }); $("#tgt_cl_so4").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); + + // Water source 1 $("#w1_name").jqxDropDownList({ placeHolder: "Kies hoofd water:", theme: theme, @@ -3061,6 +3640,7 @@ $("#w1_chloride").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#w1_sulfate").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#w1_ph").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); + // Water source 2 $("#w2_name").jqxDropDownList({ placeHolder: "Kies meng water:", theme: theme, @@ -3105,7 +3685,7 @@ $("#w2_chloride").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#w2_sulfate").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#w2_ph").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); - + // Water mixed $("#wg_amount").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wg_calcium").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wg_magnesium").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); @@ -3114,7 +3694,7 @@ $("#wg_chloride").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wg_sulfate").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wg_ph").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); - + // Water treated $("#wb_calcium").jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'}); $("#wb_calcium").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wb_magnesium").jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is lager dan 30.'}); @@ -3129,7 +3709,7 @@ $("#wb_sulfate").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#wb_ph").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); - + // Water target profile $("#pr_name").jqxDropDownList({ placeHolder: "Kies doel profiel:", theme: theme, @@ -3159,70 +3739,132 @@ $("#pr_chloride").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); $("#pr_sulfate").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 74, height: 23, decimalDigits: 1, readOnly: true }); + // 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({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, max: 1000, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1, symbol: ' gr', symbolPosition: 'right' }); - $("#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({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 4, max: 8, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#sparge_volume").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); + $("#wa_cacl2").jqxNumberInput( Spin1dec1 ); $("#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({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, max: 1000, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1, symbol: ' gr', symbolPosition: 'right' }); - $("#calc_acid").jqxCheckBox({ theme: theme, width: 120, height: 23 }); - $("#sparge_temp").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 70, max: 98, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.5 }); + $("#wa_caso4").jqxNumberInput( Spin1dec1 ); $("#wa_mgso4").jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!' }); - $("#wa_mgso4").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, max: 1000, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1, symbol: ' gr', symbolPosition: 'right' }); - $("#wa_base_name").jqxDropDownList({ theme: theme, source: srcBase, width: 100, height: 23, dropDownHeight: 128 }); - $("#wa_base").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, decimalDigits: 2, spinButtons: true, spinButtonsStep: 0.05, symbol: ' gr', symbolPosition: 'right' }); - $("#sparge_source").jqxDropDownList({ theme: theme, source: srcSource, width: 100, height: 23, dropDownHeight: 95 }); + $("#wa_mgso4").jqxNumberInput( Spin1dec1 ); $("#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({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, max: 1000, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1, symbol: ' gr', symbolPosition: 'right' }); - $("#wa_acid_name").jqxDropDownList({ theme: theme, source: srcAcid, width: 100, height: 23, dropDownHeight: 128 }) - $("#wa_acid").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 0, decimalDigits: 2, spinButtons: true, spinButtonsStep: 0.05, symbol: ' ml', symbolPosition: 'right' }); - $("#wa_acid_perc").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 80, height: 23, min: 0, max: 100, decimalDigits: 0, spinButtons: true, symbol: '%', symbolPosition: 'right' }); - $("#sparge_ph").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, min: 4.5, max: 6.5, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#sparge_acid_type").jqxDropDownList({ theme: theme, source: srcAcid, width: 100, height: 23, dropDownHeight: 128 }); - $("#sparge_acid_perc").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 100, height: 23, spinButtons: true, decimalDigits: 0, symbol: '%', symbolPosition: 'right' }); - $("#sparge_acid_amount").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 100, height: 23, decimalDigits: 2, readOnly: true, symbol: ' ml', symbolPosition: 'right' }); + $("#wa_nacl").jqxNumberInput( Spin1dec1 ); + $("#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_base_name").jqxDropDownList({ + theme: theme, + source: BaseTypeAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 170, + height: 23, + autoDropDownHeight: true + }); + $("#wa_base").jqxNumberInput( Spin2dec5 ); + $("#wa_base").jqxNumberInput({ symbol: ' gr', symbolPosition: 'right' }); + $("#wa_acid_name").jqxDropDownList({ + theme: theme, + source: AcidTypeAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 170, + height: 23, + autoDropDownHeight: true + }) + $("#wa_acid").jqxNumberInput( Spin2dec5 ); + $("#wa_acid").jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' }); + $("#wa_acid_perc").jqxNumberInput( Perc0 ); + $("#wa_acid_perc").jqxNumberInput({ width: 70, symbol: '%', symbolPosition: 'right' }); + // Sparge water + $("#sparge_temp").jqxNumberInput( Spin1dec5 ); + $("#sparge_volume").jqxNumberInput( Spin1dec5 ); + $("#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( Spin2dec1 ); + $("#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_acid_perc").jqxNumberInput( Perc0 ); + $("#sparge_acid_perc").jqxNumberInput({ symbol: '%', symbolPosition: 'right' }); // Tab 9, Brewday $("#brew_date_start").jqxDateTimeInput({ theme: theme, width: 230, height: 23, formatString: 'yyyy-MM-dd HH:mm:ss', showTimeButton: true }); $("#brew_date_end").jqxDateTimeInput({ theme: theme, width: 230, height: 23, formatString: 'yyyy-MM-dd HH:mm:ss', showTimeButton: true }); - $("#brew_mash_ph").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); + $("#brew_mash_ph").jqxNumberInput( SpinpH ); $("#est_mash_ph").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 }); - $("#brew_preboil_ph").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); + $("#brew_preboil_ph").jqxNumberInput( SpinpH ); // est_preboil_ph - $("#brew_aboil_ph").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); + $("#brew_aboil_ph").jqxNumberInput( SpinpH ); // est_aboil_ph - $("#brew_mash_sg").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 1.000, max: 1.200, decimalDigits: 3, spinButtons: true, spinButtonsStep: 0.001 }); + $("#brew_mash_sg").jqxNumberInput( SGopts ); $("#brew_mash_sg").on('valueChanged', function () { calcMashEfficiency(); }); $("#est_mash_sg").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 3 }); - $("#brew_preboil_sg").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 3, spinButtons: true, spinButtonsStep: 0.001 }); - $("#brew_aboil_sg").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 3, spinButtons: true, spinButtonsStep: 0.001 }); + $("#brew_preboil_sg").jqxNumberInput( SGopts ); + $("#brew_aboil_sg").jqxNumberInput( SGopts ); $("#est_og3").jqxTooltip({ content: 'Het geschatte begin SG van dit product.' }); $("#est_og3").jqxNumberInput({ inputMode: 'simple', theme: theme, width: 70, height: 23, decimalDigits: 3, readOnly: true }); - $("#brew_mash_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 }); - $("#brew_preboil_volume").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_aboil_volume").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_preboil_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 }); - $("#brew_aboil_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 1 }); - $("#brew_sparge_temperature").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_sparge_volume").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_whirlpool9").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 120, decimalDigits: 0, spinButtons: true }); - $("#brew_cooling_to").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_sparge_ph").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 14, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_whirlpool7").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 120, decimalDigits: 0, spinButtons: true }); - $("#brew_cooling_method").jqxDropDownList({ theme: theme, source: srcCooling, width: 170, height: 23, dropDownHeight: 153 }); - $("#brew_whirlpool6").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 120, decimalDigits: 0, spinButtons: true }); - $("#brew_cooling_time").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 1440, decimalDigits: 0, spinButtons: true }); - $("#brew_whirlpool2").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 120, decimalDigits: 0, spinButtons: true }); - $("#brew_aeration_type").jqxDropDownList({ theme: theme, source: srcAeration, width: 100, height: 23, dropDownHeight: 95 }); - $("#brew_aeration_time").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 1440, decimalDigits: 0, spinButtons: true }); - $("#brew_aeration_speed").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, max: 1440, decimalDigits: 0, spinButtons: true }); - $("#brew_fermenter_volume").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_fermenter_extrawater").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_fermenter_sg").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 3 }); - $("#brew_fermenter_extrasugar").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 90, height: 23, min: 0, decimalDigits: 1, spinButtons: true, spinButtonsStep: 0.1 }); - $("#brew_fermenter_ibu").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 0 }); - $("#brew_fermenter_color").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 70, height: 23, decimalDigits: 0 }); + $("#brew_mash_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 1 }); + $("#brew_preboil_volume").jqxNumberInput( Spin1dec5 ); + $("#brew_aboil_volume").jqxNumberInput( Spin1dec5 ); + $("#brew_preboil_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 1 }); + $("#brew_aboil_efficiency").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 1 }); + $("#brew_sparge_temperature").jqxNumberInput( Spin1dec5 ); + $("#brew_sparge_volume").jqxNumberInput( Spin1dec5 ); + $("#brew_whirlpool9").jqxNumberInput( PosInt ); + $("#brew_whirlpool9").jqxNumberInput({ max: 120 }); + $("#brew_cooling_to").jqxNumberInput( Spin1dec5 ); + $("#brew_sparge_ph").jqxNumberInput( SpinpH ); + $("#brew_whirlpool7").jqxNumberInput( PosInt ); + $("#brew_whirlpool7").jqxNumberInput({ max: 120 }); + $("#brew_cooling_method").jqxDropDownList({ + theme: theme, + source: CoolingTypeAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true + }); + $("#brew_whirlpool6").jqxNumberInput( PosInt ); + $("#brew_whirlpool6").jqxNumberInput({ max: 120 }); + $("#brew_cooling_time").jqxNumberInput( PosInt ); + $("#brew_cooling_time").jqxNumberInput({ max: 1440 }); + $("#brew_whirlpool2").jqxNumberInput( PosInt ); + $("#brew_whirlpool2").jqxNumberInput({ max: 120 }); + $("#brew_aeration_type").jqxDropDownList({ + theme: theme, + source: AerationTypeAdapter, + valueMember: 'id', + displayMember: 'nl', + width: 180, + height: 23, + autoDropDownHeight: true + }); + $("#brew_aeration_time").jqxNumberInput( PosInt ); + $("#brew_aeration_time").jqxNumberInput({ max: 1440 }); + $("#brew_aeration_speed").jqxNumberInput( PosInt ); + $("#brew_aeration_speed").jqxNumberInput({ max: 1440 }); + $("#brew_fermenter_volume").jqxNumberInput( Spin1dec5 ); + $("#brew_fermenter_extrawater").jqxNumberInput( Spin1dec1 ); + $("#brew_fermenter_sg").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 3 }); + $("#brew_fermenter_extrasugar").jqxNumberInput( Spin1dec1 ); + $("#brew_fermenter_ibu").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 0 }); + $("#brew_fermenter_color").jqxNumberInput({ inputMode: 'simple', readOnly: true, theme: theme, width: 90, height: 23, decimalDigits: 0 }); $("#BLog").jqxButton({ template: "info", width: '150px', theme: theme }); $("#BLog").click(function () { // Open log in a new tab. @@ -3273,6 +3915,7 @@ }); // Tab 11, Packaging + // TODO: high gravity packaging, extra water and recalc abv, color and ibu. $("#package_date").jqxTooltip({ content: 'De verpakkings datum van dit bier.' }); $("#package_date").jqxDateTimeInput({ theme: theme, @@ -3404,7 +4047,7 @@ name: $("#name").val(), code: $("#code").val(), birth: $("#birth").val(), - stage: $("#stage").val(), + stage: dataRecord.stage, notes: $("#notes").val(), log_brew: dataRecord.log_brew, log_fermentation: dataRecord.log_fermentation, @@ -3499,7 +4142,7 @@ st_name: $('#st_name').val(), st_letter: $('#st_letter').val(), st_guide: $('#st_guide').val(), - st_type: $('#st_type').val(), + st_type: dataRecord.st_type, st_category: $('#st_category').val(), st_category_number: parseFloat($("#st_category_number").jqxNumberInput('decimal')), st_og_min: parseFloat($("#st_og_min").jqxNumberInput('decimal')), @@ -3557,6 +4200,9 @@ w2_total_alkalinity: parseFloat($("#w2_total_alkalinity").jqxNumberInput('decimal')), w2_ph: parseFloat($("#w2_ph").jqxNumberInput('decimal')), w2_cost: dataRecord.w2_cost, + wa_acid_name: $("#wa_acid_name").val(), + wa_acid_perc: parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')), + wa_base_name: $("#wa_base_name").val(), fermentables: fermentablerow, hops: hoprow, miscs: miscrow,