www/js/prod_edit.js

changeset 825
8b87ad5bd3c3
parent 824
26ffc2fb0eaf
child 826
4e681bc073bd
equal deleted inserted replaced
824:26ffc2fb0eaf 825:8b87ad5bd3c3
33 modalOpacity: 0.4, 33 modalOpacity: 0.4,
34 autoOpen: false, 34 autoOpen: false,
35 cancelButton: $('#volumeReady') 35 cancelButton: $('#volumeReady')
36 }); 36 });
37 37
38 $('#popupMash').jqxWindow({
39 width: 800,
40 height: 400,
41 position: { x: 230, y: 100 },
42 resizable: false,
43 theme: theme,
44 isModal: true,
45 autoOpen: false,
46 cancelButton: $('#MashReady'),
47 modalOpacity: 0.40
48 });
49 } 38 }
50 39
51 40
52 41
53 function drop_endis(flag, item, index) { 42 function drop_endis(flag, item, index) {
602 $('#mash_ph').val(dataRecord.mash_ph); 591 $('#mash_ph').val(dataRecord.mash_ph);
603 $('#sparge_temp').val(dataRecord.sparge_temp); 592 $('#sparge_temp').val(dataRecord.sparge_temp);
604 $('#sparge_ph').val(dataRecord.sparge_ph); 593 $('#sparge_ph').val(dataRecord.sparge_ph);
605 $('#sparge_volume').val(dataRecord.sparge_volume); 594 $('#sparge_volume').val(dataRecord.sparge_volume);
606 $('#sparge_source').val(dataRecord.sparge_source); 595 $('#sparge_source').val(dataRecord.sparge_source);
607 $('#sparge_acid_type').val(dataRecord.sparge_acid_type); 596 $('#sparge_acid_type').val(AcidTypeData[dataRecord.sparge_acid_type].nl);
608 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); 597 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
609 $('#sparge_acid_amount').val(dataRecord.sparge_acid_amount * 1000); 598 $('#sparge_acid_amount').val(dataRecord.sparge_acid_amount * 1000);
610 $('#calc_acid').val(dataRecord.calc_acid); 599 $('#calc_acid').val(dataRecord.calc_acid);
611 $('#w1_name').val(dataRecord.w1_name); 600 $('#w1_name').val(dataRecord.w1_name);
612 $('#w1_amount').val(dataRecord.w1_amount); 601 $('#w1_amount').val(dataRecord.w1_amount);
944 } 933 }
945 } 934 }
946 if (row.m_use_use == 6) { // Sparge 935 if (row.m_use_use == 6) { // Sparge
947 switch (row.m_name) { 936 switch (row.m_name) {
948 case 'CaCl2': 937 case 'CaCl2':
949 // $('#ss_cacl2').val(row.m_amount * 1000); 938 $('#ss_cacl2').val(row.m_amount * 1000);
950 break; 939 break;
951 case 'CaSO4': 940 case 'CaSO4':
952 // $('#ss_caso4').val(row.m_amount * 1000); 941 $('#ss_caso4').val(row.m_amount * 1000);
953 break; 942 break;
954 case 'MgSO4': 943 case 'MgSO4':
955 // $('#ss_mgso4').val(row.m_amount * 1000); 944 $('#ss_mgso4').val(row.m_amount * 1000);
956 break; 945 break;
957 case 'NaCl': 946 case 'NaCl':
958 // $('#ss_nacl').val(row.m_amount * 1000); 947 $('#ss_nacl').val(row.m_amount * 1000);
959 break; 948 break;
960 case 'MgCl2': 949 case 'MgCl2':
961 // $('#ss_mgcl2').val(row.m_amount * 1000); 950 $('#ss_mgcl2').val(row.m_amount * 1000);
962 break; 951 break;
963 } 952 }
964 } 953 }
965 } 954 }
966 return data; 955 return data;
1135 { name: 'ramp_time', type: 'float' }, 1124 { name: 'ramp_time', type: 'float' },
1136 { name: 'end_temp', type: 'float' }, 1125 { name: 'end_temp', type: 'float' },
1137 { name: 'step_ph', type: 'float' }, 1126 { name: 'step_ph', type: 'float' },
1138 { name: 'step_sg', type: 'float' } 1127 { name: 'step_sg', type: 'float' }
1139 ], 1128 ],
1140 addrow: function(rowid, rowdata, position, commit) { commit(true); },
1141 deleterow: function(rowid, commit) { commit(true); }
1142 }, 1129 },
1143 mashAdapter = new $.jqx.dataAdapter(mashSource); 1130 mashAdapter = new $.jqx.dataAdapter(mashSource);
1144 1131
1145 $('#mashGrid').jqxGrid({ 1132 $('#mashGrid').jqxGrid({
1146 width: 1240, 1133 width: 1240,
1147 height: 400, 1134 height: 400,
1148 source: mashAdapter, 1135 source: mashAdapter,
1149 theme: theme, 1136 theme: theme,
1150 selectionmode: 'singlerow', 1137 selectionmode: 'singlerow',
1151 showtoolbar: true, 1138 editable: false,
1152 rendertoolbar: function(toolbar) {
1153 var container = $('<div style="overflow: hidden; position: relative; margin: 5px;"></div>');
1154 toolbar.append(container);
1155 container.append('<input style="float: left; margin-left: 165px;" id="saddrowbutton" type="button" value="Nieuwe stap" />');
1156 container.append('<input style="float: left; margin-left: 565px;" id="sdeleterowbutton" type="button" value="Verwijder stap" />');
1157 $('#saddrowbutton').jqxButton({ template: 'primary', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) });
1158 $('#saddrowbutton').on('click', function() {
1159 var row = {}, rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
1160 row['step_name'] = 'Stap ' + (rowscount + 1);
1161 if (rowscount > 0) {
1162 row['step_type'] = 1;
1163 row['step_infuse_amount'] = 0.0;
1164 row['step_volume'] = mash_infuse;
1165 } else {
1166 row['step_type'] = 0;
1167 row['step_infuse_amount'] = 15.0;
1168 row['step_volume'] = 15;
1169 }
1170 row['step_infuse_temp'] = 0;
1171 row['step_temp'] = 62.0;
1172 row['step_time'] = 20.0;
1173 row['step_wg_ratio'] = 0.0;
1174 row['ramp_time'] = 1.0;
1175 row['end_temp'] = 62.0;
1176 row['step_ph'] = 0.0;
1177 row['step_sg'] = 0.0;
1178 $('#mashGrid').jqxGrid('addrow', null, row);
1179 calcMash();
1180 });
1181 // delete selected step.
1182 $('#sdeleterowbutton').jqxButton({ template: 'danger', theme: theme, height: 27, width: 150, disabled: (dataRecord.stage > 3) });
1183 $('#sdeleterowbutton').on('click', function() {
1184 var rowscount, id, selectedrowindex = $('#mashGrid').jqxGrid('getselectedrowindex');
1185 rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
1186 if (selectedrowindex >= 0 && selectedrowindex < rowscount) {
1187 id = $('#mashGrid').jqxGrid('getrowid', selectedrowindex);
1188 $('#mashGrid').jqxGrid('deleterow', id);
1189 calcMash();
1190 }
1191 });
1192 },
1193 ready: function() { 1139 ready: function() {
1194 /* Calculate the whole recipe */ 1140 /* Calculate the whole recipe */
1195 console.log('ready mashs, start calculations'); 1141 console.log('ready mashs, start calculations');
1196 calcFermentables(); 1142 /* calcFermentables() must be first and is done by the grid load. Here it is too late. */
1197 whirlpoolHops();
1198 calcIBUs();
1199 calcMiscs();
1200 calcViability();
1201 showStarter();
1202 calcYeast();
1203 calcInit();
1204 calcMash(); 1143 calcMash();
1205 calcWater(); 1144 calcWater();
1206 kookTijd(); 1145 calcIBUs();
1146 whirlpoolHops();
1147 calcMiscs();
1148 // calcViability();
1149 // showStarter();
1150 // calcYeast();
1151 // calcInit();
1152 // kookTijd();
1207 console.log('calculations ready'); 1153 console.log('calculations ready');
1208 $('#jqxLoader').jqxLoader('close'); 1154 $('#jqxLoader').jqxLoader('close');
1209 $('#jqxTabs').jqxTabs('first'); 1155 $('#jqxTabs').jqxTabs('first');
1210 }, 1156 },
1211 columns: [ 1157 columns: [
1244 color = '#ff4040'; 1190 color = '#ff4040';
1245 return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + dataAdapter.formatNumber(value, 'f2') + '</span>'; 1191 return '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + dataAdapter.formatNumber(value, 'f2') + '</span>';
1246 } 1192 }
1247 }, 1193 },
1248 { text: 'pH', datafield: 'step_ph', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f2' }, 1194 { text: 'pH', datafield: 'step_ph', width: 70, align: 'right', cellsalign: 'right', cellsformat: 'f2' },
1249 { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' }, 1195 { text: 'SG', datafield: 'step_sg', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'f3' }
1250 { text: '', columntype: 'button', width: 15, align: 'center',
1251 cellsrenderer: function(row) {
1252 if (row < 2)
1253 return ' ';
1254 return '▴';
1255 }, buttonclick: function(row) {
1256 if (row >= 2) {
1257 swapMash(row, row-1);
1258 }
1259 }
1260 },
1261 { text: '', columntype: 'button', width: 15, align: 'center',
1262 cellsrenderer: function(row) {
1263 rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
1264 if (row < 1 || row > (rowscount -2))
1265 return ' ';
1266 return '▾';
1267 }, buttonclick: function(row) {
1268 rowscount = $('#mashGrid').jqxGrid('getdatainformation').rowscount;
1269 if (row >= 1 && row <= (rowscount -2)) {
1270 swapMash(row, row+1);
1271 }
1272 }
1273 },
1274 { text: '', datafield: 'Edit', columntype: 'button', width: 80, align: 'center',
1275 cellsrenderer: function() {
1276 return 'Wijzig';
1277 }, buttonclick: function(row) {
1278 if (dataRecord.stage > 3) {
1279 alert('Het maischen is al gedaan.');
1280 } else {
1281 mashRow = row;
1282 mashData = $('#mashGrid').jqxGrid('getrowdata', mashRow);
1283 if (mashRow == 0)
1284 $("#wstep_type").jqxDropDownList('disableAt', 2);
1285 else
1286 $("#wstep_type").jqxDropDownList('enableAt', 2);
1287 $('#wstep_name').val(mashData.step_name);
1288 $('#wstep_type').val(mashData.step_type);
1289 $('#wstep_infuse_amount').val(mashData.step_infuse_amount);
1290 $('#wstep_infuse_temp').val(mashData.step_infuse_temp);
1291 $('#wstep_temp').val(mashData.step_temp);
1292 $('#wend_temp').val(mashData.end_temp);
1293 $('#wstep_time').val(mashData.step_time);
1294 $('#wramp_time').val(mashData.ramp_time);
1295 $('#wstep_infuse_amount').hide(); // Hide all untile we need it.
1296 $('#wstep_infuse_temp').hide();
1297 $('#wstep_pmpt_amount').hide();
1298 $('#wstep_pmpt_temp').hide();
1299 if (mashData.step_type == 0) {
1300 if (mashRow == 0) {
1301 $('#wstep_infuse_amount').show();
1302 $('#wstep_pmpt_amount').show();
1303 } else {
1304 $('#wstep_infuse_temp').show();
1305 $('#wstep_pmpt_temp').show();
1306 }
1307 }
1308 $('#wstep_ph').val(mashData.step_ph);
1309 $('#wstep_sg').val(mashData.step_sg);
1310 // show the popup window.
1311 $('#popupMash').jqxWindow('open');
1312 }
1313 }
1314 }
1315 ] 1196 ]
1316 }); 1197 });
1317 }; 1198 };
1318 1199
1319 /* 1200 /*
1320 * Remove the top menu so that we MUST use the buttons to leave the editor. 1201 * Remove the top menu so that we MUST use the button to leave the editor.
1321 */ 1202 */
1322 $('#jqxMenu').jqxMenu('destroy'); 1203 $('#jqxMenu').jqxMenu('destroy');
1323 console.log('record:' + my_record + ' return:' + my_return + ' theme:' + theme); 1204 console.log('record:' + my_record + ' return:' + my_return + ' theme:' + theme);
1324 $('#jqxLoader').jqxLoader({ width: 250, height: 150, isModal: true, text: 'Laden product ...', theme: theme }); 1205 $('#jqxLoader').jqxLoader({ width: 250, height: 150, isModal: true, text: 'Laden product ...', theme: theme });
1325 $('#jqxLoader').jqxLoader('open'); 1206 $('#jqxLoader').jqxLoader('open');
1334 if (dataRecord.boil_time) { 1215 if (dataRecord.boil_time) {
1335 $('#brew_pmpt_koken').html('Koken ' + dataRecord.boil_time + ' minuten'); 1216 $('#brew_pmpt_koken').html('Koken ' + dataRecord.boil_time + ' minuten');
1336 } else { 1217 } else {
1337 $('#brew_pmpt_koken').html('Koken "no-boil"'); 1218 $('#brew_pmpt_koken').html('Koken "no-boil"');
1338 } 1219 }
1339 }
1340
1341 function swapMash(r1, r2) {
1342
1343 console.log('swap mash rows ' + r1 + ' ' + r2);
1344 var row1 = $('#mashGrid').jqxGrid('getrowdata', r1);
1345 var row2 = $('#mashGrid').jqxGrid('getrowdata', r2);
1346 var obj1 = { step_name: row1.step_name, step_type: row1.step_type, step_volume: row1.step_volume, step_infuse_amount: row1.step_infuse_amount,
1347 step_infuse_temp: row1.step_infuse_temp, step_temp: row1.step_temp, step_time: row1.step_time,
1348 ramp_time: row1.ramp_time, end_temp: row1.end_temp, step_wg_ratio: row1.step_wg_ratio, step_ph: row1.step_ph, step_sg: row1.step_sg };
1349 var obj2 = { step_name: row2.step_name, step_type: row2.step_type, step_volume: row2.step_volume, step_infuse_amount: row2.step_infuse_amount,
1350 step_infuse_temp: row2.step_infuse_temp, step_temp: row2.step_temp, step_time: row2.step_time,
1351 ramp_time: row2.ramp_time, end_temp: row2.end_temp, step_wg_ratio: row2.step_wg_ratio, step_ph: row2.step_ph, step_sg: row2.step_sg };
1352 $("#mashGrid").jqxGrid('updaterow', r1, obj2);
1353 $("#mashGrid").jqxGrid('updaterow', r2, obj1);
1354 } 1220 }
1355 1221
1356 function infusionVol(step_infused, step_mashkg, infuse_temp, step_temp, last_temp) { 1222 function infusionVol(step_infused, step_mashkg, infuse_temp, step_temp, last_temp) {
1357 var a = last_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt); 1223 var a = last_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt);
1358 var b = step_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt); 1224 var b = step_temp * (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + step_infused * SpecificHeatWater + step_mashkg * SpecificHeatMalt);
1794 // Estimated needed sparge water corrected for the temperature. 1660 // Estimated needed sparge water corrected for the temperature.
1795 spoelw = Round((dataRecord.boil_size - infused + (mashkg * my_grain_absorbtion) + dataRecord.eq_lauter_deadspace) * 1.03, 6); 1661 spoelw = Round((dataRecord.boil_size - infused + (mashkg * my_grain_absorbtion) + dataRecord.eq_lauter_deadspace) * 1.03, 6);
1796 $('#brew_sparge_est').val(spoelw); 1662 $('#brew_sparge_est').val(spoelw);
1797 } 1663 }
1798 1664
1799 /*
1800 * Change OG of recipe but keep the water volumes.
1801 */
1802 function calcFermentablesFromOG(OG) {
1803
1804 console.log('calcFermentablesFromOG(' + OG + ')');
1805 var amount, row, d, i, sug, tot = 0, totmass = 0, rowscount, efficiency = parseFloat($('#efficiency').jqxNumberInput('decimal'));
1806 sug = sg_to_plato(OG) * parseFloat($('#batch_size').jqxNumberInput('decimal')) * OG / 100; //total amount of sugars in kg
1807 rowscount = dataRecord.fermentables.length;
1808
1809 for (i = 0; i < rowscount; i++) {
1810 row = dataRecord.fermentables[i];
1811 if (row.f_added < 4) {
1812 d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100);
1813 if (row.f_added == 0) // Mash
1814 d = efficiency / 100 * d;
1815 tot += d;
1816 }
1817 }
1818 if (tot)
1819 totmass = Round(sug / tot, 3);
1820
1821 if (totmass) {
1822 for (i = 0; i < rowscount; i++) {
1823 row = dataRecord.fermentables[i];
1824 if (row.f_added < 4) {
1825 amount = Math.round(row.f_percentage * 10 * totmass) / 1000;
1826 dataRecord.fermentables[i].f_amount = amount;
1827 $('#fermentableGrid').jqxGrid('setcellvalue', i, 'f_amount', amount);
1828 }
1829 }
1830 }
1831 };
1832
1833 function getNeededYeastCells() { 1665 function getNeededYeastCells() {
1834 1666
1835 var plato, volume, sg = dataRecord.brew_fermenter_sg; 1667 var plato, volume, sg = dataRecord.brew_fermenter_sg;
1836 if (sg <= 1.0001 && dataRecord.fg > 1.000) 1668 if (sg <= 1.0001 && dataRecord.fg > 1.000)
1837 sg = dataRecord.fg; 1669 sg = dataRecord.fg;
2308 } 2140 }
2309 } 2141 }
2310 $('#plato_cells').val(parseFloat(use_cells / (volume * plato))); 2142 $('#plato_cells').val(parseFloat(use_cells / (volume * plato)));
2311 }; 2143 };
2312 2144
2313 function adjustHops(factor) {
2314
2315 //console.log('adjustHops(' + factor + ')');
2316 var row, i, amount, rowscount = dataRecord.hops.length;
2317 if (rowscount == 0)
2318 return;
2319 for (i = 0; i < rowscount; i++) {
2320 row = dataRecord.hops[i];
2321 amount = row.h_amount * factor;
2322 dataRecord.hops[i].h_amount = amount;
2323 $('#hopGrid').jqxGrid('setcellvalue', i, 'h_amount', amount);
2324 }
2325 };
2326
2327 function whirlpoolHops() { 2145 function whirlpoolHops() {
2328 var row, i, time, rowscount = dataRecord.hops.length; 2146 var row, i, time, rowscount = dataRecord.hops.length;
2329 if (rowscount == 0) 2147 if (rowscount == 0)
2330 return; 2148 return;
2331 for (i = 0; i < rowscount; i++) { 2149 for (i = 0; i < rowscount; i++) {
2355 } 2173 }
2356 } 2174 }
2357 calcSupplies(); 2175 calcSupplies();
2358 }; 2176 };
2359 2177
2360 function adjustMiscs(factor) {
2361
2362 //console.log('adjustMiscs(' + factor + ')');
2363 var row, i, amount, rowscount = dataRecord.miscs.length;
2364 if (rowscount == 0)
2365 return;
2366 for (i = 0; i < rowscount; i++) {
2367 row = dataRecord.miscs[i];
2368 amount = row.m_amount * factor;
2369 dataRecord.miscs[i].m_amount = amount;
2370 $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount);
2371 switch (row.m_name) {
2372 case 'CaCl2':
2373 $('#wa_cacl2').val(row.m_amount * 1000);
2374 break;
2375 case 'CaSO4':
2376 $('#wa_caso4').val(row.m_amount * 1000);
2377 break;
2378 case 'MgSO4':
2379 $('#wa_mgso4').val(row.m_amount * 1000);
2380 break;
2381 case 'NaCl':
2382 $('#wa_nacl').val(row.m_amount * 1000);
2383 break;
2384 case 'MgCl2':
2385 $('#wa_mgcl2').val(row.m_amount * 1000);
2386 break;
2387 case 'NaHCO3':
2388 $('#wa_nahco3').val(row.m_amount * 1000);
2389 break;
2390 case 'CaCO3':
2391 $('#wa_caco3').val(row.m_amount * 1000);
2392 break;
2393 case 'Melkzuur':
2394 case 'Zoutzuur':
2395 case 'Fosforzuur':
2396 case 'Zwavelzuur':
2397 $('#wa_acid').val(row.m_amount * 1000);
2398 break;
2399 }
2400 }
2401 };
2402
2403 function adjustYeasts(factor) {
2404
2405 //console.log('adjustYeasts(' + factor + ')');
2406 var row, i, amount, rowscount = dataRecord.yeasts.length;
2407 if (rowscount == 0)
2408 return;
2409 for (i = 0; i < rowscount; i++) {
2410 row = dataRecord.yeasts[i];
2411 if (! dataRecord.starter_enable) { // Only adjust without a starter
2412 amount = row.y_amount * factor;
2413 dataRecord.yeasts[i].y_amount = amount;
2414 $('#yeastGrid').jqxGrid('setcellvalue', i, 'y_amount', amount);
2415 }
2416 }
2417 calcYeast();
2418 };
2419
2420 function adjustWaters(factor) {
2421
2422 console.log('adjustWaters(' + factor + ')');
2423 var amount, row, i, rowscount = dataRecord.mashs.length;
2424 if (rowscount == 0)
2425 return;
2426 mash_infuse = 0;
2427 for (i = 0; i < rowscount; i++) {
2428 row = dataRecord.mashs[i];
2429 if (row.step_type == 0) { // Infusion
2430 amount = Round(parseFloat(row.step_infuse_amount) * factor, 1);
2431 dataRecord.mashs[i].step_infuse_amount = amount;
2432 $('#mashGrid').jqxGrid('setcellvalue', i, 'step_infuse_amount', amount);
2433 mash_infuse += amount;
2434 }
2435 }
2436 if (dataRecord.w2_amount == 0) {
2437 dataRecord.w1_amount = mash_infuse;
2438 $('#w1_amount').val(mash_infuse);
2439 } else {
2440 var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
2441 var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
2442 dataRecord.w1_amount = Round(w1_amount, 3);
2443 dataRecord.w2_amount = Round(w2_amount, 3);
2444 $('#w1_amount').val(dataRecord.w1_amount);
2445 $('#w2_amount').val(dataRecord.w2_amount);
2446 }
2447 $('#wg_amount').val(mash_infuse);
2448 };
2449
2450 function calcMashEfficiency() { 2178 function calcMashEfficiency() {
2451 var c, m; 2179 var c, m;
2452 if (parseFloat($('#brew_mash_sg').jqxNumberInput('decimal')) < 1.002) 2180 if (parseFloat($('#brew_mash_sg').jqxNumberInput('decimal')) < 1.002)
2453 return; 2181 return;
2454 c = sg_to_plato(est_mash_sg); 2182 c = sg_to_plato(est_mash_sg);
2511 else 2239 else
2512 return 0.5; 2240 return 0.5;
2513 } 2241 }
2514 2242
2515 function GetOptSO4Clratio() { 2243 function GetOptSO4Clratio() {
2516 if (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) > 0 && parseFloat($('#pr_chloride').jqxNumberInput('decimal'))) {
2517 return (parseFloat($('#pr_sulfate').jqxNumberInput('decimal')) / parseFloat($('#pr_chloride').jqxNumberInput('decimal')));
2518 } else {
2519 var BUGU = GetBUGU(); 2244 var BUGU = GetBUGU();
2520 return (1.0 / (-1.2 * BUGU + 1.4)); 2245 return (1.0 / (-1.2 * BUGU + 1.4));
2521 } 2246 }
2522 } 2247
2523 2248 function setWaterAgent(name, amount, use) {
2524 function setWaterAgent(name, amount) {
2525 var row, i, id, found = false, miscs, rows = $('#miscGrid').jqxGrid('getrows'); 2249 var row, i, id, found = false, miscs, rows = $('#miscGrid').jqxGrid('getrows');
2526 if (amount == 0) { 2250 if (amount == 0) {
2527 for (i = 0; i < rows.length; i++) { 2251 for (i = 0; i < rows.length; i++) {
2528 row = rows[i]; 2252 row = rows[i];
2529 if (row.m_name == name) { 2253 if (row.m_name == name && row.m_use_use == use) {
2530 id = $('#miscGrid').jqxGrid('getrowid', i); 2254 id = $('#miscGrid').jqxGrid('getrowid', i);
2531 $('#miscGrid').jqxGrid('deleterow', id); 2255 $('#miscGrid').jqxGrid('deleterow', id);
2532 } 2256 }
2533 } 2257 }
2534 } else { 2258 } else {
2535 for (i = 0; i < rows.length; i++) { 2259 for (i = 0; i < rows.length; i++) {
2536 row = rows[i]; 2260 row = rows[i];
2537 if (row.m_name == name) { 2261 if (row.m_name == name && row.m_use_use == use) {
2538 found = true; 2262 found = true;
2539 $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount / 1000); 2263 $('#miscGrid').jqxGrid('setcellvalue', i, 'm_amount', amount / 1000);
2540 break; 2264 break;
2541 } 2265 }
2542 } 2266 }
2549 if (record.name == name) { 2273 if (record.name == name) {
2550 row['m_name'] = record.name; 2274 row['m_name'] = record.name;
2551 row['m_amount'] = amount / 1000; 2275 row['m_amount'] = amount / 1000;
2552 row['m_cost'] = record.cost; 2276 row['m_cost'] = record.cost;
2553 row['m_type'] = record.type; 2277 row['m_type'] = record.type;
2554 row['m_use_use'] = record.use_use; 2278 row['m_use_use'] = use;
2555 row['m_time'] = 0; 2279 row['m_time'] = 0;
2556 row['m_amount_is_weight'] = record.amount_is_weight; 2280 row['m_amount_is_weight'] = record.amount_is_weight;
2557 row['m_inventory'] = record.inventory; 2281 row['m_inventory'] = record.inventory;
2558 row['m_avail'] = 1; 2282 row['m_avail'] = 1;
2559 $('#miscGrid').jqxGrid('addrow', null, row); 2283 $('#miscGrid').jqxGrid('addrow', null, row);
2701 2425
2702 if (dataRecord.w1_name == '') { 2426 if (dataRecord.w1_name == '') {
2703 return; 2427 return;
2704 } 2428 }
2705 2429
2430 $('#w1_hardness').val(Hardness(dataRecord.w1_calcium, dataRecord.w1_magnesium));
2431 $('#w1_ra').val(ResidualAlkalinity(dataRecord.w1_total_alkalinity, dataRecord.w1_calcium, dataRecord.w1_magnesium));
2432
2706 // If there is a dillute water source, mix the waters. 2433 // If there is a dillute water source, mix the waters.
2707 if ((dataRecord.w2_name != '') && (dataRecord.w2_name != 'Geen mengwater')) { 2434 if ((dataRecord.w2_name != '') && (dataRecord.w2_name != 'Geen mengwater')) {
2708 console.log("calcWater() mixed " + dataRecord.w2_name);
2709 liters = dataRecord.w1_amount + dataRecord.w2_amount; 2435 liters = dataRecord.w1_amount + dataRecord.w2_amount;
2710 calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium); 2436 calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium);
2711 magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium); 2437 magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium);
2712 sodium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sodium, dataRecord.w2_sodium); 2438 sodium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sodium, dataRecord.w2_sodium);
2713 chloride = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_chloride, dataRecord.w2_chloride); 2439 chloride = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_chloride, dataRecord.w2_chloride);
2714 sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate); 2440 sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate);
2715 total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity); 2441 total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity);
2716 ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters); 2442 ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters);
2443 $('#w2_hardness').val(Hardness(dataRecord.w2_calcium, dataRecord.w2_magnesium));
2444 $('#w2_ra').val(ResidualAlkalinity(dataRecord.w2_total_alkalinity, dataRecord.w2_calcium, dataRecord.w2_magnesium));
2717 } else { 2445 } else {
2718 console.log("calcWater() single");
2719 liters = dataRecord.w1_amount; 2446 liters = dataRecord.w1_amount;
2720 calcium = dataRecord.w1_calcium; 2447 calcium = dataRecord.w1_calcium;
2721 magnesium = dataRecord.w1_magnesium; 2448 magnesium = dataRecord.w1_magnesium;
2722 sodium = dataRecord.w1_sodium; 2449 sodium = dataRecord.w1_sodium;
2723 chloride = dataRecord.w1_chloride; 2450 chloride = dataRecord.w1_chloride;
2724 sulfate = dataRecord.w1_sulfate; 2451 sulfate = dataRecord.w1_sulfate;
2725 total_alkalinity = dataRecord.w1_total_alkalinity; 2452 total_alkalinity = dataRecord.w1_total_alkalinity;
2726 ph = dataRecord.w1_ph; 2453 ph = dataRecord.w1_ph;
2727 } 2454 }
2728 var bicarbonate = total_alkalinity * 1.22; 2455 var bicarbonate = Bicarbonate(total_alkalinity, ph);
2729 2456
2730 /* Save mixed water ions for later */ 2457 /* Save mixed water ions for later */
2731 var wg_calcium = calcium; 2458 var wg_calcium = calcium;
2732 var wg_sodium = sodium; 2459 var wg_sodium = sodium;
2733 var wg_total_alkalinity = total_alkalinity; 2460 var wg_total_alkalinity = total_alkalinity;
2734 var wg_chloride = chloride; 2461 var wg_chloride = chloride;
2735 var wg_sulfate = sulfate; 2462 var wg_sulfate = sulfate;
2736 var wg_bicarbonate = bicarbonate; 2463 var wg_bicarbonate = bicarbonate;
2464
2465 dataRecord.wg_amount = liters;
2466 dataRecord.wg_ph = ph;
2737 2467
2738 $('#wg_amount').val(liters); 2468 $('#wg_amount').val(liters);
2739 $('#wg_calcium').val(Round(calcium, 1)); 2469 $('#wg_calcium').val(Round(calcium, 1));
2740 $('#wg_magnesium').val(Round(magnesium, 1)); 2470 $('#wg_magnesium').val(Round(magnesium, 1));
2741 $('#wg_sodium').val(Round(sodium, 1)); 2471 $('#wg_sodium').val(Round(sodium, 1));
2742 $('#wg_bicarbonate').val(Round(bicarbonate, 1)); 2472 $('#wg_bicarbonate').val(Round(bicarbonate, 1));
2743 $('#wg_total_alkalinity').val(Round(total_alkalinity, 1)); 2473 $('#wg_total_alkalinity').val(Round(total_alkalinity, 1));
2744 $('#wg_chloride').val(Round(chloride, 1)); 2474 $('#wg_chloride').val(Round(chloride, 1));
2745 $('#wg_sulfate').val(Round(sulfate, 1)); 2475 $('#wg_sulfate').val(Round(sulfate, 1));
2746 $('#wg_ph').val(Round(ph, 2)); 2476 $('#wg_ph').val(Round(ph, 2));
2477 $('#wg_hardness').val(Round(Hardness(calcium, magnesium), 1));
2478 $('#wg_ra').val(Round(ResidualAlkalinity(total_alkalinity, calcium, magnesium), 1));
2747 2479
2748 var mash_ph = Round(MashpH(), 3); 2480 var mash_ph = Round(MashpH(), 3);
2749 console.log('Distilled water mash pH: ' + mash_ph); 2481 console.log('Distilled water mash pH: ' + mash_ph);
2750 2482
2751 /* Calculate Salt additions */ 2483 /* Calculate Salt additions */
2794 if (protonDeficit > 0) { // Add acid 2526 if (protonDeficit > 0) { // Add acid
2795 frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); 2527 frac = CalcFrac(TpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
2796 Acid = protonDeficit / frac; 2528 Acid = protonDeficit / frac;
2797 Acid *= AcidTypeData[AT].MolWt; // mg 2529 Acid *= AcidTypeData[AT].MolWt; // mg
2798 Acidmg = Acid; 2530 Acidmg = Acid;
2799 Acid = Acid / AcidTypeData[AT].AcidSG; // ml 2531 var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (parseFloat(dataRecord.wa_acid_perc) / 100)) + 1000, 2);
2800 Acid = Round(Acid / (parseFloat(dataRecord.wa_acid_perc) / 100), 2); // ml 2532 Acid /= RealSG;
2533 Acid /= AcidTypeData[AT].AcidPrc / 100;
2534 Acid = Round(Acid, 2);
2801 console.log('Mash auto Acid final ml: ' + Acid); 2535 console.log('Mash auto Acid final ml: ' + Acid);
2802 $('#wa_acid').val(Acid); 2536 $('#wa_acid').val(Acid);
2803 setWaterAgent(AcidTypeData[AT].nl, Acid); 2537 setWaterAgent(AcidTypeData[AT].nl, Acid, 1);
2804 2538
2805 bicarbonate = bicarbonate - protonDeficit * frac / liters; 2539 bicarbonate = bicarbonate - protonDeficit * frac / liters;
2806 total_alkalinity = bicarbonate * 50 / 61; 2540 total_alkalinity = bicarbonate * 50 / 61;
2807 } 2541 }
2808 ph = TpH; 2542 ph = TpH;
2543 dataRecord.wb_ph = ph;
2809 $('#wb_ph').val(Round(ph, 2)); 2544 $('#wb_ph').val(Round(ph, 2));
2810 $('#est_mash_ph').val(Round(ph, 2)); 2545 $('#est_mash_ph').val(Round(ph, 2));
2811 } else { 2546 } else {
2812 /* Manual calculate pH */ 2547 /* Manual calculate pH */
2813 $('.c_mashph').hide(); 2548 $('.c_mashph').hide();
2838 frac = CalcFrac(pHa, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); 2573 frac = CalcFrac(pHa, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
2839 protonDeficit = Acid * frac; 2574 protonDeficit = Acid * frac;
2840 pd = ProtonDeficit(pHa); 2575 pd = ProtonDeficit(pHa);
2841 } 2576 }
2842 //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa); 2577 //console.log('n: ' + n + ' pd: ' + pd + ' protonDeficit: ' + protonDeficit + ' frac: ' + frac + ' pHa: ' + pHa);
2843 RA = wg_bicarbonate - protonDeficit * frac / liters; 2578 bicarbonate = wg_bicarbonate - protonDeficit * frac / liters;
2844 bicarbonate = RA; 2579 total_alkalinity = bicarbonate * 50 / 61;
2845 total_alkalinity = RA * 50 / 61;
2846 ph = pHa; 2580 ph = pHa;
2847 $('#wb_ph').val(Round(ph, 2)); 2581 $('#wb_ph').val(Round(ph, 2));
2848 $('#est_mash_ph').val(Round(ph, 2)); 2582 $('#est_mash_ph').val(Round(ph, 2));
2849 } 2583 }
2850 2584
2912 $('#wb_sodium').val(Round(sodium, 1)); 2646 $('#wb_sodium').val(Round(sodium, 1));
2913 $('#wb_sulfate').val(Round(sulfate, 1)); 2647 $('#wb_sulfate').val(Round(sulfate, 1));
2914 $('#wb_chloride').val(Round(chloride, 1)); 2648 $('#wb_chloride').val(Round(chloride, 1));
2915 $('#wb_bicarbonate').val(Round(bicarbonate, 1)); 2649 $('#wb_bicarbonate').val(Round(bicarbonate, 1));
2916 $('#wb_total_alkalinity').val(Round(total_alkalinity, 1)); 2650 $('#wb_total_alkalinity').val(Round(total_alkalinity, 1));
2651 $('#wb_hardness').val(Hardness(calcium, magnesium));
2652 $('#wb_ra').val(ResidualAlkalinity(total_alkalinity, calcium, magnesium));
2917 2653
2918 if (calcium < 40) { 2654 if (calcium < 40) {
2919 setRangeIndicator('calcium', 'laag'); 2655 setRangeIndicator('calcium', 'laag');
2920 } else if (calcium > 150) { 2656 } else if (calcium > 150) {
2921 setRangeIndicator('calcium', 'hoog'); 2657 setRangeIndicator('calcium', 'hoog');
2973 } 2709 }
2974 2710
2975 function calcSparge() { 2711 function calcSparge() {
2976 2712
2977 /* Based on the work of ajDeLange. */ 2713 /* Based on the work of ajDeLange. */
2714 var ws_calcium, ws_magnesium, ws_total_alkalinity, ws_sodium, ws_chloride;
2715 var ws_sulfate, ws_ph, ws_hardness, ws_ra;
2978 var TargetpH = dataRecord.sparge_ph; 2716 var TargetpH = dataRecord.sparge_ph;
2979 var Source_pH = dataRecord.w1_ph; 2717 var Source_pH = 7.0;
2980 var Source_alkalinity = dataRecord.w1_total_alkalinity; 2718
2981 // Select watersource or fallback to the first source. 2719 // Select watersource or fallback to the first source.
2982 if (dataRecord.sparge_source == 1) { // Source 2 2720 if ((dataRecord.sparge_source == 1) && (dataRecord.w2_ph > 0.0)) { // Source 2
2983 if (dataRecord.w2_ph > 0.0) { 2721 ws_calcium = dataRecord.w2_calcium;
2722 ws_magnesium = dataRecord.w2_magnesium;
2723 ws_total_alkalinity = dataRecord.w2_total_alkalinity;
2724 ws_sodium = dataRecord.w2_sodium;
2725 ws_chloride = dataRecord.w2_chloride;
2726 ws_sulfate = dataRecord.w2_sulfate;
2984 Source_pH = dataRecord.w2_ph; 2727 Source_pH = dataRecord.w2_ph;
2985 Source_alkalinity = dataRecord.w2_total_alkalinity; 2728 $('#w2_button').jqxRadioButton({ checked: true });
2986 } else { 2729 } else if ((dataRecord.sparge_source == 2) && (dataRecord.w2_ph > 0.0)) { // Mixed
2987 dataRecord.sparge_source = 0; // Source 1 2730 ws_calcium = dataRecord.wg_calcium;
2988 $('#sparge_source').val(0); 2731 ws_magnesium = dataRecord.wg_magnesium;
2989 } 2732 ws_total_alkalinity = dataRecord.wg_total_alkalinity;
2990 } else if (dataRecord.sparge_source == 2) { // Mixed 2733 ws_sodium = dataRecord.wg_sodium;
2991 if (dataRecord.w2_ph > 0.0) { 2734 ws_chloride = dataRecord.wg_chloride;
2992 Source_pH = parseFloat(dataRecord.wg_ph); 2735 ws_sulfate = dataRecord.wg_sulfate;
2993 Source_alkalinity = parseFloat(dataRecord.wg_total_alkalinity); 2736 Source_pH = dataRecord.wg_ph;
2994 } else { 2737 $('#wg_button').jqxRadioButton({ checked: true });
2995 dataRecord.sparge_source = 0; 2738 } else {
2996 $('#sparge_source').val(0); 2739 ws_calcium = dataRecord.w1_calcium;
2997 } 2740 ws_magnesium = dataRecord.w1_magnesium;
2998 } 2741 ws_total_alkalinity = dataRecord.w1_total_alkalinity;
2999 2742 ws_sodium = dataRecord.w1_sodium;
3000 // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH 2743 ws_chloride = dataRecord.w1_chloride;
3001 var r1 = Math.pow(10, Source_pH - 6.35); 2744 ws_sulfate = dataRecord.w1_sulfate;
3002 var r2 = Math.pow(10, Source_pH - 10.33); 2745 Source_pH = dataRecord.w1_ph;
3003 var d = 1 + r1 + r1 * r2; 2746 $('#w1_button').jqxRadioButton({ checked: true });
3004 var f1 = 1 / d; 2747 }
3005 var f3 = r1 * r2 / d; 2748
3006 2749 if (dataRecord.sparge_volume > 0) {
3007 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) 2750 ws_calcium += (parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCa / MMCaCl2 * 1000 +
3008 var r143 = Math.pow(10, 4.3 - 6.35); 2751 parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMCa / MMCaSO4 * 1000) / dataRecord.sparge_volume;
3009 var r243 = Math.pow(10, 4.3 - 10.33); 2752 ws_magnesium += (parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMMg / MMMgSO4 * 1000 +
3010 var d43 = 1 + r143 + r143 * r243; 2753 parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMMg / MMMgCl2 * 1000) / dataRecord.sparge_volume;
3011 var f143 = 1 / d43; 2754 ws_sodium += (parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMNa / MMNaCl * 1000) / dataRecord.sparge_volume;
3012 var f343 = r143 * r243 / d43; 2755 ws_sulfate += (parseFloat($('#ss_caso4').jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 * 1000 +
3013 2756 parseFloat($('#ss_mgso4').jqxNumberInput('decimal')) * MMSO4 / MMMgSO4 * 1000) / dataRecord.sparge_volume;
3014 //Step 4. Solve 2757 ws_chloride += (2 * parseFloat($('#ss_cacl2').jqxNumberInput('decimal')) * MMCl / MMCaCl2 * 1000 +
3015 var Ct = Source_alkalinity / 50 / ((f143 - f1) + (f3 - f343)); 2758 parseFloat($('#ss_nacl').jqxNumberInput('decimal')) * MMCl / MMNaCl * 1000 +
3016 2759 parseFloat($('#ss_mgcl2').jqxNumberInput('decimal')) * MMCl / MMMgCl2 * 1000) / dataRecord.sparge_volume;
3017 //Step 5. Compute mole fractions at desired pH 2760 }
3018 var r1g = Math.pow(10, TargetpH - 6.35); 2761
3019 var r2g = Math.pow(10, TargetpH - 10.33); 2762 /* Show the spargewate with salt additions */
3020 var dg = 1 + r1g + r1g * r2g; 2763 $('#sw_calcium').val(Round(ws_calcium, 1));
3021 var f1g = 1 / dg; 2764 $('#sw_magnesium').val(Round(ws_magnesium, 1));
3022 var f3g = r1g * r2g / dg; 2765 $('#sw_sodium').val(Round(ws_sodium, 1));
3023 2766 $('#sw_sulfate').val(Round(ws_sulfate, 1));
3024 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) 2767 $('#sw_chloride').val(Round(ws_chloride, 1));
3025 var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l 2768 $('#sw_bicarbonate').val(Round(Bicarbonate(ws_total_alkalinity, Source_pH), 1));
3026 Acid += 0.01; // Add acid that would be required for distilled water. 2769 $('#sw_total_alkalinity').val(Round(ws_total_alkalinity, 1));
3027 2770 $('#sw_ph').val(dataRecord.sparge_ph);
3028 //Step 8. Get the acid data. 2771 $('#sw_hardness').val(Hardness(ws_calcium, ws_magnesium));
3029 var AT = dataRecord.sparge_acid_type; 2772 $('#sw_ra').val(ResidualAlkalinity(ws_total_alkalinity, ws_calcium, ws_magnesium));
2773
2774 AT = dataRecord.sparge_acid_type;
3030 if (AT < 0 || AT >= AcidTypeData.length) { 2775 if (AT < 0 || AT >= AcidTypeData.length) {
3031 AT = 0; 2776 AT = 0;
3032 dataRecord.sparge_acid_type = 0; 2777 dataRecord.sparge_acid_type = 0;
3033 $('#sparge_acid_type').val(0); 2778 $('#sparge_acid_type').val(AcidTypeData[0].nl);
3034 dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc; 2779 dataRecord.sparge_acid_perc = AcidTypeData[0].AcidPrc;
3035 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc); 2780 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
3036 } 2781 }
3037 var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3); 2782
3038 2783 /*
3039 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. 2784 * Auto calculate the required acid
3040 Acid /= fract; 2785 */
3041 2786 if (dataRecord.calc_acid) {
3042 //Step 10. Multiply by molecular weight of the acid 2787 // Step 1: Compute the mole fractions of carbonic (f1) and carbonate(f3) at the source water pH
3043 Acid *= AcidTypeData[AT].MolWt; //mg 2788 var r1 = Math.pow(10, Source_pH - 6.35);
3044 2789 var r2 = Math.pow(10, Source_pH - 10.33);
3045 //Step 11. Divide by Specific Gravity and Percentage to get the final ml. 2790 var d = 1 + r1 + r1 * r2;
3046 Acid = Acid / AcidTypeData[AT].AcidSG / (dataRecord.sparge_acid_perc / 100); //ml 2791 var f1 = 1 / d;
3047 Acid *= dataRecord.sparge_volume; //ml acid total 2792 var f3 = r1 * r2 / d;
3048 Acid = Round(Acid, 2); 2793
3049 dataRecord.sparge_acid_amount = Acid / 1000; 2794 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity)
3050 $('#sparge_acid_amount').val(Acid); 2795 var r143 = Math.pow(10, 4.3 - 6.35);
2796 var r243 = Math.pow(10, 4.3 - 10.33);
2797 var d43 = 1 + r143 + r143 * r243;
2798 var f143 = 1 / d43;
2799 var f343 = r143 * r243 / d43;
2800
2801 //Step 4. Solve
2802 var Ct = ws_total_alkalinity / 50 / ((f143 - f1) + (f3 - f343));
2803
2804 //Step 5. Compute mole fractions at desired pH
2805 var r1g = Math.pow(10, TargetpH - 6.35);
2806 var r2g = Math.pow(10, TargetpH - 10.33);
2807 var dg = 1 + r1g + r1g * r2g;
2808 var f1g = 1 / dg;
2809 var f3g = r1g * r2g / dg;
2810
2811 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L)
2812 var Acid = Ct * ((f1g - f1) + (f3 - f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l
2813 Acid += 0.01; // Add acid that would be required for distilled water.
2814
2815 //Step 8. Get the acid data.
2816 var fract = CalcFrac(TargetpH, AcidTypeData[AT].pK1, AcidTypeData[AT].pK2, AcidTypeData[AT].pK3);
2817
2818 //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid.
2819 Acid /= fract;
2820
2821 //Step 10. Multiply by molecular weight of the acid
2822 Acid *= AcidTypeData[AT].MolWt; //mg
2823
2824 //Step 11. Divide by Specific Gravity and Percentage to get the final ml.
2825 var RealSG = Round(((AcidTypeData[AT].AcidSG - 1000) * (dataRecord.sparge_acid_perc / 100)) + 1000, 2);
2826 Acid = Acid / RealSG; //ml
2827 Acid *= dataRecord.sparge_volume; //ml acid total at 100%
2828 Acid /= AcidTypeData[AT].AcidPrc / 100; //ml acid at supplied strength
2829 Acid = Round(Acid, 2);
2830 dataRecord.sparge_acid_amount = Acid / 1000;
2831 $('#sparge_acid_amount').val(Acid);
2832 }
2833
2834 // Finally calculate the estimate preboil pH
2835 var ph = -Math.log10(((Math.pow(10, -dataRecord.wb_ph) * dataRecord.wg_amount) + (Math.pow(10, -dataRecord.sparge_ph) * dataRecord.sparge_volume)) /
2836 (dataRecord.wg_amount + dataRecord.sparge_volume));
2837 $('#preboil_ph').val(ph);
3051 } 2838 }
3052 2839
3053 function calcFermentation() { 2840 function calcFermentation() {
3054 var primary_svg, secondary_svg, final_svg, ABV; 2841 var primary_svg, secondary_svg, final_svg, ABV;
3055 if (dataRecord.brew_fermenter_sg < 1.020) 2842 if (dataRecord.brew_fermenter_sg < 1.020)
3105 2892
3106 function calcCarbonation() { 2893 function calcCarbonation() {
3107 2894
3108 var TSec, ABV, bvol, balc, babv, mvol, malc, tvol, talc, i, row, SFactor, pvol, pabv, Pressure, kabv; 2895 var TSec, ABV, bvol, balc, babv, mvol, malc, tvol, talc, i, row, SFactor, pvol, pabv, Pressure, kabv;
3109 2896
2897 console.log('calcCarbonation()');
2898
3110 TSec = dataRecord.secondary_temp; 2899 TSec = dataRecord.secondary_temp;
3111 if (TSec < 1) 2900 if (TSec < 1)
3112 TSec = dataRecord.primary_end_temp; 2901 TSec = dataRecord.primary_end_temp;
3113 if (TSec < 1) 2902 if (TSec < 1)
3114 TSec = 18; 2903 TSec = 18;
3195 function en_stage_brewday(state) { 2984 function en_stage_brewday(state) {
3196 $('#jqxTabs').jqxTabs((state) ? 'disableAt':'enableAt', 8); // Brewday tab 2985 $('#jqxTabs').jqxTabs((state) ? 'disableAt':'enableAt', 8); // Brewday tab
3197 } 2986 }
3198 2987
3199 function en_stage_afterbrew(state) { 2988 function en_stage_afterbrew(state) {
3200
3201 var onval = { disabled: (state) ? true:false };
3202 var spinstate = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 90:110 };
3203 var spinsmall = { spinButtons: (state) ? false:true, readOnly: (state) ? true:false, width: (state) ? 70:90 };
3204
3205 $('#jqxTabs').jqxTabs((state) ? 'enableAt':'disableAt', 9); // Fermentation tab 2989 $('#jqxTabs').jqxTabs((state) ? 'enableAt':'disableAt', 9); // Fermentation tab
3206 $('#mash_select').jqxDropDownList(onval);
3207 $('#w1_name').jqxDropDownList(onval);
3208 $('#w2_name').jqxDropDownList(onval);
3209 $('#w2_amount').jqxNumberInput(onval);
3210 $('#pr_name').jqxDropDownList(onval);
3211 $('#wa_cacl2').jqxNumberInput(spinstate);
3212 $('#wa_caso4').jqxNumberInput(spinstate);
3213 $('#wa_mgso4').jqxNumberInput(spinstate);
3214 $('#wa_nacl').jqxNumberInput(spinstate);
3215 $('#wa_mgcl2').jqxNumberInput(spinstate);
3216 $('#wa_nahco3').jqxNumberInput(spinstate);
3217 $('#wa_caco3').jqxNumberInput(spinstate);
3218 $('#mash_ph').jqxNumberInput(spinstate);
3219 $('#calc_acid').jqxCheckBox(onval);
3220 $('#wa_acid_name').jqxDropDownList(onval);
3221 $('#wa_acid').jqxNumberInput(spinstate);
3222 $('#wa_acid_perc').jqxNumberInput(spinsmall);
3223 $('#sparge_temp').jqxNumberInput(spinstate);
3224 $('#sparge_volume').jqxNumberInput(spinstate);
3225 $('#sparge_ph').jqxNumberInput(spinstate);
3226 $('#sparge_source').jqxDropDownList(onval);
3227 $('#sparge_acid_type').jqxDropDownList(onval);
3228 $('#sparge_acid_perc').jqxNumberInput(spinstate);
3229 } 2990 }
3230 2991
3231 function en_stage_afterprimary(istate) { 2992 function en_stage_afterprimary(istate) {
3232 2993
3233 var state = istate; 2994 var state = istate;
3413 } 3174 }
3414 } 3175 }
3415 3176
3416 function calcInit() { 3177 function calcInit() {
3417 3178
3179 console.log('** calcInit() start');
3418 calcMashEfficiency(); 3180 calcMashEfficiency();
3419 calcEfficiencyBeforeBoil(); 3181 calcEfficiencyBeforeBoil();
3420 calcEfficiencyAfterBoil(); 3182 calcEfficiencyAfterBoil();
3421
3422 $('#calc_acid').on('checked', function(event) {
3423 dataRecord.calc_acid = 1;
3424 calcWater();
3425 });
3426 $('#calc_acid').on('unchecked', function(event) {
3427 dataRecord.calc_acid = 0;
3428 calcWater();
3429 });
3430 $('#w1_name').jqxDropDownList('selectItem', dataRecord.w1_name);
3431 $('#w2_name').jqxDropDownList('selectItem', dataRecord.w2_name);
3432 // Fix tap water if zero using mash infuse amount.
3433 console.log("mash_infuse: " + mash_infuse + " w1: " + parseFloat($('#w1_amount').jqxNumberInput('decimal')) + " " + dataRecord.w1_amount);
3434 if (parseFloat($('#w1_amount').jqxNumberInput('decimal')) == 0 && mash_infuse > 0) {
3435 $('#w1_amount').val(mash_infuse);
3436 dataRecord.w1_amount = mash_infuse;
3437 $('#wg_amount').val(mash_infuse);
3438 $('#w2_amount').val(0);
3439 dataRecord.w2_amount = 0;
3440 }
3441 calcWater(); 3183 calcWater();
3442 $('#w2_amount').on('change', function(event) {
3443 var newval = parseFloat(event.args.value);
3444 if (newval > parseFloat($('#wg_amount').jqxNumberInput('decimal'))) {
3445 $('#w2_amount').val(dataRecord.w2_amount);
3446 return;
3447 }
3448 dataRecord.w1_amount = parseFloat($('#wg_amount').jqxNumberInput('decimal')) - newval;
3449 $('#w1_amount').val(dataRecord.w1_amount);
3450 dataRecord.w2_amount = newval;
3451 console.log('new: ' + event.args.value + ' w1: ' + dataRecord.w1_amount + ' w2: ' + dataRecord.w2_amount);
3452 calcWater();
3453 });
3454 $('#wa_cacl2').on('change', function(event) {
3455 if (event.args) {
3456 setWaterAgent('CaCl2', 0); // This prevents double entries.
3457 setWaterAgent('CaCl2', event.args.value);
3458 calcWater();
3459 }
3460 });
3461 $('#wa_caso4').on('change', function(event) {
3462 if (event.args) {
3463 setWaterAgent('CaSO4', 0);
3464 setWaterAgent('CaSO4', event.args.value);
3465 calcWater();
3466 }
3467 });
3468 $('#wa_mgso4').on('change', function(event) {
3469 if (event.args) {
3470 setWaterAgent('MgSO4', 0);
3471 setWaterAgent('MgSO4', event.args.value);
3472 calcWater();
3473 }
3474 });
3475 $('#wa_nacl').on('change', function(event) {
3476 if (event.args) {
3477 setWaterAgent('NaCl', 0);
3478 setWaterAgent('NaCl', event.args.value);
3479 calcWater();
3480 }
3481 });
3482 $('#wa_mgcl2').on('change', function(event) {
3483 if (event.args) {
3484 setWaterAgent('MgCl2', 0);
3485 setWaterAgent('MgCl2', event.args.value);
3486 calcWater();
3487 }
3488 });
3489 $('#wa_nahco3').on('change', function(event) {
3490 if (event.args) {
3491 setWaterAgent('NaHCO3', 0);
3492 setWaterAgent('NaHCO3', event.args.value);
3493 calcWater();
3494 }
3495 });
3496 $('#wa_caco3').on('change', function(event) {
3497 if (event.args) {
3498 setWaterAgent('CaCO3', 0);
3499 setWaterAgent('CaCO3', event.args.value);
3500 calcWater();
3501 }
3502 });
3503 $('#wa_acid_name').on('select', function(event) {
3504 if (event.args) {
3505 var index = event.args.index;
3506 console.log('wa_acid_name ' + index + ' last_acid: ' + last_acid);
3507 setWaterAgent(last_acid, 0);
3508 last_acid = AcidTypeData[index].nl;
3509 dataRecord.wa_acid_name = index;
3510 dataRecord.wa_acid_perc = AcidTypeData[index].AcidPrc;
3511 $('#wa_acid_perc').val(dataRecord.wa_acid_perc);
3512 calcWater();
3513 setWaterAgent(last_acid, parseFloat($('#wa_acid').jqxNumberInput('decimal')));
3514 }
3515 });
3516 $('#wa_acid').on('change', function(event) {
3517 var name = AcidTypeData[dataRecord.wa_acid_name].nl;
3518 setWaterAgent(name, parseFloat(event.args.value));
3519 calcWater();
3520 });
3521 $('#wa_acid_perc').on('change', function(event) {
3522 dataRecord.wa_acid_perc = parseFloat(event.args.value);
3523 calcWater();
3524 });
3525
3526 $('#sparge_ph').on('change', function(event) {
3527 dataRecord.sparge_ph = parseFloat(event.args.value);
3528 calcSparge();
3529 });
3530 $('#sparge_volume').on('change', function(event) {
3531 dataRecord.sparge_volume = parseFloat(event.args.value);
3532 $('#brew_sparge_volume').val(dataRecord.sparge_volume);
3533 calcSparge();
3534 });
3535 $('#sparge_temp').on('change', function(event) {
3536 dataRecord.sparge_temp = parseFloat(event.args.value);
3537 $('#brew_sparge_temperature').val(dataRecord.sparge_temp);
3538 });
3539 $('#sparge_source').on('select', function(event) {
3540 if (event.args) {
3541 dataRecord.sparge_source = event.args.index;
3542 calcSparge();
3543 }
3544 });
3545 $('#sparge_acid_type').on('select', function(event) {
3546 if (event.args) {
3547 dataRecord.sparge_acid_type = event.args.index;
3548 console.log('new sparge_acid_type: ' + dataRecord.sparge_acid_type);
3549 dataRecord.sparge_acid_perc = AcidTypeData[event.args.index].AcidPrc;
3550 $('#sparge_acid_perc').val(dataRecord.sparge_acid_perc);
3551 calcSparge();
3552 }
3553 });
3554 $('#sparge_acid_perc').on('change', function(event) {
3555 dataRecord.sparge_acid_perc = parseFloat(event.args.value);
3556 calcSparge();
3557 });
3558
3559 calcFermentation(); 3184 calcFermentation();
3560 calcCarbonation(); 3185 // calcCarbonation();
3561 $('#package_volume').on('change', function(event) { 3186 calcIBUs();
3562 var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount;
3563 dataRecord.package_volume = parseFloat(event.args.value);
3564 if (dataRecord.package_volume > dataRecord.brew_fermenter_volume) {
3565 dataRecord.package_volume = dataRecord.brew_fermenter_volume;
3566 $('#package_volume').val(dataRecord.package_volume);
3567 }
3568 tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
3569 diff = Round(tnew - told, 3);
3570 if (told > 0) {
3571 dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3);
3572 dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3);
3573 } else {
3574 dataRecord.bottle_amount = tnew;
3575 dataRecord.keg_amount = 0;
3576 }
3577 $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
3578 $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
3579 calcCarbonation();
3580 });
3581 $('#package_infuse_amount').on('change', function(event) {
3582 var diff, tnew, told = dataRecord.package_volume + dataRecord.package_infuse_amount;
3583 dataRecord.package_infuse_amount = parseFloat(event.args.value);
3584 tnew = dataRecord.package_volume + dataRecord.package_infuse_amount;
3585 diff = Round(tnew - told, 3);
3586 if (told > 0) {
3587 dataRecord.bottle_amount = Round(dataRecord.bottle_amount + ((dataRecord.bottle_amount / told) * diff), 3);
3588 dataRecord.keg_amount = Round(dataRecord.keg_amount + ((dataRecord.keg_amount / told) * diff), 3);
3589 } else {
3590 dataRecord.bottle_amount = tnew;
3591 dataRecord.keg_amount = 0;
3592 }
3593 $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
3594 $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
3595 calcCarbonation();
3596 });
3597 $('#package_infuse_abv').on('change', function(event) {
3598 dataRecord.package_infuse_abv = parseFloat(event.args.value);
3599 calcCarbonation();
3600 });
3601 $('#bottle_amount').on('change', function(event) {
3602 var vtot, vnew = parseFloat(event.args.value);
3603 vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.keg_amount, 3);
3604 if (vnew > vtot)
3605 vnew = vtot;
3606 dataRecord.bottle_amount = Round(vnew, 3);
3607 $('#bottle_amount').val(parseFloat(dataRecord.bottle_amount));
3608 console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount);
3609 calcCarbonation();
3610 });
3611 $('#bottle_priming_water').on('change', function(event) {
3612 dataRecord.bottle_priming_water = parseFloat(event.args.value);
3613 calcCarbonation();
3614 });
3615 $('#keg_amount').on('change', function(event) {
3616 var vtot, vnew = parseFloat(event.args.value);
3617 vtot = Round(dataRecord.package_volume + dataRecord.package_infuse_amount - dataRecord.bottle_amount, 3);
3618 if (vnew > vtot)
3619 vnew = vtot;
3620 dataRecord.keg_amount = Round(vnew, 3);
3621 $('#keg_amount').val(parseFloat(dataRecord.keg_amount));
3622 console.log('vtot:' + vtot + ' vnew:' + vnew + ' bottle:' + dataRecord.bottle_amount + ' keg:' + dataRecord.keg_amount);
3623 calcCarbonation();
3624 });
3625 $('#keg_priming_water').on('change', function(event) {
3626 dataRecord.keg_priming_water = parseFloat(event.args.value);
3627 calcCarbonation();
3628 });
3629 $('#bottle_carbonation').on('change', function(event) {
3630 dataRecord.bottle_carbonation = parseFloat(event.args.value);
3631 calcCarbonation();
3632 });
3633 $('#bottle_carbonation_temp').on('change', function(event) {
3634 dataRecord.bottle_carbonation_temp = parseFloat(event.args.value);
3635 calcCarbonation();
3636 });
3637 $('#keg_carbonation').on('change', function(event) {
3638 dataRecord.keg_carbonation = parseFloat(event.args.value);
3639 calcCarbonation();
3640 });
3641 $('#keg_forced_carb').on('checked', function(event) {
3642 dataRecord.keg_forced_carb = 1;
3643 calcCarbonation();
3644 });
3645 $('#keg_forced_carb').on('unchecked', function(event) {
3646 dataRecord.keg_forced_carb = 0;
3647 calcCarbonation();
3648 });
3649 $('#keg_carbonation_temp').on('change', function(event) {
3650 dataRecord.keg_carbonation_temp = parseFloat(event.args.value);
3651 calcCarbonation();
3652 });
3653
3654 $('#brew_fermenter_extrawater').on('change', function(event) {
3655 dataRecord.brew_fermenter_extrawater = parseFloat(event.args.value);
3656 calcFermentables();
3657 calcIBUs();
3658 calcYeast();
3659 });
3660 $('#brew_fermenter_tcloss').on('change', function(event) {
3661 dataRecord.brew_fermenter_tcloss = parseFloat(event.args.value);
3662 calcFermentables();
3663 calcIBUs();
3664 calcYeast();
3665 });
3666 $('#primary_end_sg').on('change', function(event) {
3667 dataRecord.primary_end_sg = parseFloat(event.args.value);
3668 calcFermentation();
3669 });
3670 $('#primary_end_brix').on('change', function(event) {
3671 var OBrix, FBrix, FG;
3672 if (dataRecord.brew_fermenter_sg >= 1.020) {
3673 OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
3674 FBrix = parseFloat(event.args.value);
3675 FG = brix_to_fg(OBrix, FBrix);
3676 if (FBrix > 0.05) {
3677 $('#primary_end_sg').val(FG);
3678 dataRecord.primary_end_sg = FG;
3679 }
3680 calcFermentation();
3681 }
3682 });
3683 $('#secondary_end_sg').on('change', function(event) {
3684 dataRecord.secondary_end_sg = parseFloat(event.args.value);
3685 calcFermentation();
3686 });
3687 $('#secondary_end_brix').on('change', function(event) {
3688 var OBrix, FBrix, FG;
3689 if (dataRecord.brew_fermenter_sg >= 1.020) {
3690 OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
3691 FBrix = parseFloat(event.args.value);
3692 FG = brix_to_fg(OBrix, FBrix);
3693 if (FBrix > 0.05) {
3694 $('#secondary_end_sg').val(FG);
3695 dataRecord.secondary_end_sg = FG;
3696 }
3697 calcFermentation();
3698 }
3699 });
3700 $('#final_brix').on('change', function(event) {
3701 var OBrix, FBrix, FG;
3702 if (dataRecord.brew_fermenter_sg >= 1.020) {
3703 OBrix = sg_to_plato(dataRecord.brew_fermenter_sg);
3704 FBrix = parseFloat(event.args.value);
3705 FG = brix_to_fg(OBrix, FBrix);
3706 if (FBrix > 0.05) {
3707 $('#fg').val(FG);
3708 dataRecord.fg = FG;
3709 }
3710 calcFermentation();
3711 }
3712 });
3713 $('#fg').on('change', function(event) {
3714 dataRecord.fg = parseFloat(event.args.value);
3715 calcFermentation();
3716 });
3717 $('#brew_whirlpool9').on('valueChanged', function(event) {
3718 dataRecord.brew_whirlpool9 = event.args.value;
3719 whirlpoolHops();
3720 calcIBUs();
3721 });
3722 $('#brew_whirlpool7').on('valueChanged', function(event) {
3723 dataRecord.brew_whirlpool7 = event.args.value;
3724 whirlpoolHops();
3725 calcIBUs();
3726 });
3727 $('#brew_whirlpool6').on('valueChanged', function(event) {
3728 dataRecord.brew_whirlpool6 = event.args.value;
3729 whirlpoolHops();
3730 calcIBUs();
3731 });
3732 $('#BLog').jqxButton({ disabled: (dataRecord.log_brew) ? false : true}); 3187 $('#BLog').jqxButton({ disabled: (dataRecord.log_brew) ? false : true});
3733 $('#FLog').jqxButton({ disabled: (dataRecord.log_fermentation) ? false : true}); 3188 $('#FLog').jqxButton({ disabled: (dataRecord.log_fermentation) ? false : true});
3734 $('#ILog').jqxButton({ disabled: (dataRecord.log_ispindel) ? false : true}); 3189 $('#ILog').jqxButton({ disabled: (dataRecord.log_ispindel) ? false : true});
3735 $('#CLog').jqxButton({ disabled: (dataRecord.log_co2pressure) ? false : true}); 3190 $('#CLog').jqxButton({ disabled: (dataRecord.log_co2pressure) ? false : true});
3191 console.log('** calcInit() ready');
3736 } 3192 }
3737 3193
3738 3194
3739 // initialize the input fields. 3195 // initialize the input fields.
3740 // Tab 1, Algemeen 3196 // Tab 1, Algemeen
3945 $('#starter_viability').jqxNumberInput(Show0dec); 3401 $('#starter_viability').jqxNumberInput(Show0dec);
3946 3402
3947 // Tab 7, Mashing 3403 // Tab 7, Mashing
3948 $('#mash_name').jqxTooltip({ content: 'De omschrijving van dit maisch profiel.' }); 3404 $('#mash_name').jqxTooltip({ content: 'De omschrijving van dit maisch profiel.' });
3949 $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 }); 3405 $('#mash_name').jqxInput({ theme: theme, width: 320, height: 23 });
3950 $('#mash_select').jqxDropDownList({
3951 placeHolder: 'Kies schema:',
3952 theme: theme,
3953 source: mashlist,
3954 displayMember: 'name',
3955 width: 250,
3956 height: 23,
3957 dropDownWidth: 500,
3958 dropDownHeight: 500,
3959 dropDownHorizontalAlignment: 'right'
3960 });
3961 $('#mash_select').on('select', function(event) {
3962 if (event.args) {
3963 var infused = 0, data, datarecord, rowIDs, rows, i, row, index = event.args.index;
3964 // First delete all current steps
3965 rowIDs = new Array();
3966 rows = $('#mashGrid').jqxGrid('getdisplayrows');
3967 for (i = 0; i < rows.length; i++) {
3968 row = rows[i];
3969 rowIDs.push(row.uid);
3970 }
3971 $('#mashGrid').jqxGrid('deleterow', rowIDs);
3972 // Then add the new steps
3973 datarecord = mashlist.records[index];
3974 $('#mash_name').val(datarecord.name);
3975 for (i = 0; i < datarecord.steps.length; i++) {
3976 data = datarecord.steps[i];
3977 row = {};
3978 row['step_name'] = data.step_name;
3979 row['step_type'] = parseInt(data.step_type);
3980 row['step_temp'] = parseFloat(data.step_temp);
3981 row['end_temp'] = parseFloat(data.end_temp);
3982 row['step_time'] = parseFloat(data.step_time);
3983 row['ramp_time'] = parseFloat(data.ramp_time);
3984 row['step_infuse_temp'] = 0.0;
3985 row['step_infuse_amount'] = 0.0;
3986 if (mash_infuse == 0 && dataRecord.wg_amount > 0)
3987 mash_infuse = dataRecord.wg_amount;
3988 if (data.step_type == 0) { // Infusion
3989 if (i == 0) {
3990 row['step_infuse_amount'] = parseFloat(mash_infuse);
3991 } else {
3992 row['step_infuse_temp'] = 99.0;
3993 }
3994 }
3995 row['step_ph'] = 0.0;
3996 row['step_sg'] = 0.0;
3997 //console.log(i + ' type: ' + row['step_type'] + ' start infusion: ' + parseFloat(row['step_infuse_amount']) + ' mash_infuse: ' + mash_infuse);
3998 infused += parseFloat(row['step_infuse_amount']);
3999 row['step_volume'] = infused;
4000 if (mashkg > 0)
4001 row['step_wg_ratio'] = Round(parseFloat(mash_infuse / mashkg), 6);
4002 else
4003 row['step_wg_ratio'] = 0.0;
4004 $('#mashGrid').jqxGrid('addrow', null, row);
4005 }
4006 calcMash();
4007 }
4008 });
4009 $('#est_mashvol').jqxTooltip({ content: 'Het totale volume van het maishwater en de mout in de maish pan.' }); 3406 $('#est_mashvol').jqxTooltip({ content: 'Het totale volume van het maishwater en de mout in de maish pan.' });
4010 $('#est_mashvol').jqxNumberInput(Show1dec); 3407 $('#est_mashvol').jqxNumberInput(Show1dec);
4011 $('#est_mashtime').jqxTooltip({ content: 'De totale tijdsduur van het maischen.' }); 3408 $('#est_mashtime').jqxTooltip({ content: 'De totale tijdsduur van het maischen.' });
4012 $('#est_mashtime').jqxInput({ theme: theme, width: 70, height: 23 }); 3409 $('#est_mashtime').jqxInput({ theme: theme, width: 70, height: 23 });
4013 $('#MashReady').jqxButton({ template: 'success', width: '90px', theme: theme });
4014 $('#MashReady').click(function() {
4015 calcFermentables();
4016 calcWater();
4017 calcSparge();
4018 calcMash();
4019 });
4020 $('#wstep_name').jqxInput({ theme: theme, width: 320, height: 23 });
4021 $('#wstep_name').on('change', function(event) {
4022 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4023 rowdata.step_name = $('#wstep_name').val();
4024 });
4025 $('#wstep_type').jqxDropDownList({
4026 theme: theme,
4027 source: MashStepTypeAdapter,
4028 valueMember: 'id',
4029 displayMember: 'nl',
4030 width: 180,
4031 height: 23,
4032 autoDropDownHeight: true
4033 });
4034 $('#wstep_type').on('select', function(event) {
4035 if (event.args) {
4036 var rowdata, i, rows, row, index = event.args.index;
4037 rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4038 if (rowdata.step_type != index) {
4039 rowdata.step_type = index;
4040 $('#wstep_infuse_amount').hide();
4041 $('#wstep_infuse_temp').hide();
4042 $('#wstep_pmpt_amount').hide();
4043 $('#wstep_pmpt_temp').hide();
4044 if (index == 0) { // Infusion
4045 if (mashRow == 0) {
4046 $('#wstep_infuse_amount').show();
4047 $('#wstep_pmpt_amount').show();
4048 } else {
4049 $('#wstep_infuse_temp').show();
4050 $('#wstep_pmpt_temp').show();
4051 }
4052 }
4053 if (index == 1) { // Temperature
4054 if (mashRow > 0)
4055 rowdata.step_infuse_amount = 0;
4056 rowdata.step_infuse_temp = 0;
4057 }
4058 if (index == 2) { // Decoction
4059 var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
4060 rowdata.step_infuse_temp = 99;
4061 rowdata.step_infuse_amount = decoctionVol(rowdata.step_volume, rowdata.step_temp, rowprev.end_temp);
4062 console.log('decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp);
4063 }
4064 $('#mashGrid').jqxGrid('updaterow', mashRow, rowdata);
4065 mash_infuse = 0;
4066 rows = $('#mashGrid').jqxGrid('getrows');
4067 for (i = 0; i < rows.length; i++) {
4068 row = rows[i];
4069 if (row.step_type == 0) // Infusion
4070 mash_infuse += parseFloat(row.step_infuse_amount);
4071 }
4072 calcMash();
4073 }
4074 }
4075 });
4076 $('#wstep_temp').on('change', function(event) {
4077 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4078 if (rowdata.step_type == 2) { // Decoction
4079 var rowprev = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
4080 var a = (dataRecord.eq_tun_weight * dataRecord.eq_tun_specific_heat + rowdata.step_volume * SpecificHeatWater) *
4081 (parseFloat(event.args.value) - rowprev.end_temp);
4082 var b = SpecificHeatWater * (99 - parseFloat(event.args.value));
4083 if (b > 0) {
4084 rowdata.step_temp = parseFloat(event.args.value);
4085 rowdata.step_infuse_amount = Round(a / b, 2);
4086 } else
4087 rowdata.step_infuse_amount = 0;
4088 console.log('change temp ' + rowdata.step_temp + ' decoction: ' + rowdata.step_infuse_amount + '/' + rowdata.step_infuse_temp);
4089 } else {
4090 rowdata.step_temp = parseFloat(event.args.value);
4091 }
4092 });
4093 $('#wstep_temp,#wend_temp,#wstep_infuse_amount,#wstep_infuse_temp').jqxNumberInput(Spin1dec);
4094 $('#wend_temp').on('change', function(event) {
4095 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4096 rowdata.end_temp = parseFloat(event.args.value);
4097 });
4098 $('#wstep_time,#wramp_time').jqxNumberInput(PosInt);
4099 $('#wstep_time').on('change', function(event) {
4100 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4101 rowdata.step_time = parseFloat(event.args.value);
4102 calcMash();
4103 });
4104 $('#wstep_ph').jqxNumberInput(Spin2pH);
4105 $('#wstep_ph').on('change', function(event) {
4106 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4107 rowdata.step_ph = parseFloat(event.args.value);
4108 });
4109 $('#wstep_sg').jqxNumberInput(SGopts);
4110 $('#wstep_sg').on('change', function(event) {
4111 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4112 rowdata.step_sg = parseFloat(event.args.value);
4113 });
4114 $('#wstep_brix').jqxNumberInput(Spin1dec);
4115 $('#wstep_brix').on('change', function(event) {
4116 /* Use plato_to_sg at this stage */
4117 var sg = Round(plato_to_sg(parseFloat(event.args.value)), 4);
4118 console.log('brix: ' + parseFloat(event.args.value) + ' sg: ' + sg);
4119 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4120 if (sg <= 1.005) {
4121 sg = 0.0;
4122 }
4123 rowdata.step_sg = sg;
4124 $('#wstep_sg').val(sg);
4125 });
4126 $('#wramp_time').on('change', function(event) {
4127 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4128 rowdata.ramp_time = parseFloat(event.args.value);
4129 calcMash();
4130 });
4131 $('#wstep_infuse_amount').on('change', function(event) {
4132 var row, i, rows, rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4133 rowdata.step_infuse_amount = parseFloat(event.args.value);
4134 if (mashRow == 0) {
4135 rowdata.step_infuse_amount = parseFloat(event.args.value);
4136 mash_infuse = 0;
4137 rows = $('#mashGrid').jqxGrid('getrows');
4138 for (i = 0; i < rows.length; i++) {
4139 row = rows[i];
4140 if (row.step_type == 0) // Infusion
4141 mash_infuse += parseFloat(row.step_infuse_amount);
4142 }
4143 if (dataRecord.w2_amount == 0) {
4144 dataRecord.w1_amount = mash_infuse;
4145 $('#w1_amount').val(mash_infuse);
4146 } else {
4147 var w1_amount = (dataRecord.w1_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
4148 var w2_amount = (dataRecord.w2_amount / (dataRecord.w1_amount + dataRecord.w2_amount)) * mash_infuse;
4149 dataRecord.w1_amount = Round(w1_amount, 3);
4150 dataRecord.w2_amount = Round(w2_amount, 3);
4151 $('#w1_amount').val(dataRecord.w1_amount);
4152 $('#w2_amount').val(dataRecord.w2_amount);
4153 }
4154 $('#wg_amount').val(mash_infuse);
4155 console.log('new infuse amount: ' + mash_infuse);
4156 calcWater();
4157 calcMash();
4158 }
4159 });
4160 $('#wstep_infuse_temp').on('change', function(event) {
4161 var prevdata = $('#mashGrid').jqxGrid('getrowdata', mashRow-1);
4162 var rowdata = $('#mashGrid').jqxGrid('getrowdata', mashRow);
4163 rowdata.step_infuse_temp = parseFloat(event.args.value);
4164 var vol = infusionVol(prevdata.step_volume, mashkg, rowdata.step_infuse_temp, rowdata.step_temp, prevdata.end_temp);
4165 console.log('new vol: ' + vol);
4166 rowdata.step_infuse_amount = vol;
4167 $('#wstep_infuse_amount').val(vol);
4168 });
4169 3410
4170 // Tab 8, Water 3411 // Tab 8, Water
4171 $('#tgt_bu').jqxNumberInput(Show2wat); 3412 $('#tgt_bu').jqxNumberInput(Show2wat);
4172 $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat); 3413 $('#tgt_so4_cl,#got_so4_cl').jqxNumberInput(Show1wat);
3414 $('#preboil_ph').jqxNumberInput(Show2wat);
4173 3415
4174 // Water source 1 3416 // Water source 1
4175 $('#w1_name').jqxDropDownList({ 3417 $('#w1_name').jqxInput({ theme: theme, width: 200, height: 23 });
4176 placeHolder: 'Kies hoofd water:', 3418 $('#w1_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
4177 theme: theme,
4178 source: waterlist,
4179 displayMember: 'name',
4180 width: 200,
4181 height: 27,
4182 dropDownWidth: 400,
4183 dropDownHeight: 400
4184 });
4185 $('#w1_name').on('select', function(event) {
4186 if (event.args) {
4187 var datarecord, index = event.args.index;
4188 datarecord = waterlist.records[index];
4189 dataRecord.w1_name = datarecord.name;
4190 $('#w1_calcium').val(datarecord.calcium);
4191 dataRecord.w1_calcium = datarecord.calcium;
4192 $('#w1_sulfate').val(datarecord.sulfate);
4193 dataRecord.w1_sulfate = datarecord.sulfate;
4194 $('#w1_chloride').val(datarecord.chloride);
4195 dataRecord.w1_chloride = datarecord.chloride;
4196 $('#w1_sodium').val(datarecord.sodium);
4197 dataRecord.w1_sodium = datarecord.sodium;
4198 $('#w1_magnesium').val(datarecord.magnesium);
4199 dataRecord.w1_magnesium = datarecord.magnesium;
4200 $('#w1_total_alkalinity').val(datarecord.total_alkalinity);
4201 $('#w1_bicarbonate').val(datarecord.total_alkalinity * 1.22);
4202 dataRecord.w1_total_alkalinity = datarecord.total_alkalinity;
4203 $('#w1_ph').val(datarecord.ph);
4204 dataRecord.w1_ph = datarecord.ph;
4205 $('#w1_cost').val(datarecord.cost);
4206 dataRecord.w1_cost = datarecord.cost;
4207 calcWater();
4208 }
4209 });
4210 $('#w1_amount,#w1_calcium,#w1_magnesium,#w1_sodium,#w1_bicarbonate,#w1_total_alkalinity,#w1_chloride,#w1_sulfate').jqxNumberInput(Show1wat); 3419 $('#w1_amount,#w1_calcium,#w1_magnesium,#w1_sodium,#w1_bicarbonate,#w1_total_alkalinity,#w1_chloride,#w1_sulfate').jqxNumberInput(Show1wat);
4211 $('#w1_ph').jqxNumberInput(Show2wat); 3420 $('#w1_ph').jqxNumberInput(Show2wat);
3421 $('#w1_hardness').jqxNumberInput(Show1wat);
3422 $('#w1_ra').jqxNumberInput(Show1wat);
4212 // Water source 2 3423 // Water source 2
4213 $('#w2_name').jqxDropDownList({ 3424 $('#w2_name').jqxInput({ theme: theme, width: 200, height: 23 });
4214 placeHolder: 'Kies meng water:', 3425 $('#w2_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
4215 theme: theme, 3426 $('#w2_amount').jqxNumberInput(Show1wat);
4216 source: water2list,
4217 displayMember: 'name',
4218 width: 200,
4219 height: 27,
4220 dropDownWidth: 400,
4221 dropDownHeight: 400
4222 });
4223 $('#w2_name').on('select', function(event) {
4224 if (event.args) {
4225 var datarecord, index = event.args.index;
4226 datarecord = water2list.records[index];
4227 if (index == 0) {
4228 dataRecord.w2_amount = 0;
4229 $('#w2_amount').val(0);
4230 dataRecord.w1_amount = mash_infuse;
4231 $('#w1_amount').val(mash_infuse);
4232 }
4233 dataRecord.w2_name = datarecord.name;
4234 $('#w2_calcium').val(datarecord.calcium);
4235 dataRecord.w2_calcium = datarecord.calcium;
4236 $('#w2_sulfate').val(datarecord.sulfate);
4237 dataRecord.w2_sulfate = datarecord.sulfate;
4238 $('#w2_chloride').val(datarecord.chloride);
4239 dataRecord.w2_chloride = datarecord.chloride;
4240 $('#w2_sodium').val(datarecord.sodium);
4241 dataRecord.w2_sodium = datarecord.sodium;
4242 $('#w2_magnesium').val(datarecord.magnesium);
4243 dataRecord.w2_magnesium = datarecord.magnesium;
4244 $('#w2_total_alkalinity').val(datarecord.total_alkalinity);
4245 $('#w2_bicarbonate').val(datarecord.total_alkalinity * 1.22);
4246 dataRecord.w2_total_alkalinity = datarecord.total_alkalinity;
4247 $('#w2_ph').val(datarecord.ph);
4248 dataRecord.w2_ph = datarecord.ph;
4249 $('#w2_cost').val(datarecord.cost);
4250 dataRecord.w2_cost = datarecord.cost;
4251 $('#w2_amount').jqxNumberInput({ max: 100000, readOnly: false }); // Set high max to enable the spinbuttons.
4252 calcWater();
4253 }
4254 });
4255 $('#w2_amount').jqxTooltip({ content: 'De verdeling van het hoofd en meng water. Het totale maisch water volume blijft gelijk.'});
4256 $('#w2_amount').jqxNumberInput({
4257 inputMode: 'simple', spinMode: 'simple', theme: theme, width: 94, height: 23, min: 0, max: 0, decimalDigits: 1,
4258 spinButtons: true, spinButtonsStep: 0.1, readOnly: true
4259 });
4260 $('#w2_calcium,#w2_magnesium,#w2_sodium,#w2_bicarbonate,#w2_total_alkalinity,#w2_chloride,#w2_sulfate').jqxNumberInput(Show1wat); 3427 $('#w2_calcium,#w2_magnesium,#w2_sodium,#w2_bicarbonate,#w2_total_alkalinity,#w2_chloride,#w2_sulfate').jqxNumberInput(Show1wat);
4261 $('#w2_ph').jqxNumberInput(Show2wat); 3428 $('#w2_ph').jqxNumberInput(Show2wat);
3429 $('#w2_hardness').jqxNumberInput(Show1wat);
3430 $('#w2_ra').jqxNumberInput(Show1wat);
4262 // Water mixed 3431 // Water mixed
3432 $('#wg_button').jqxRadioButton({ theme: theme, width: 50, height: 23, disabled: true });
4263 $('#wg_amount,#wg_calcium,#wg_magnesium,#wg_sodium,#wg_bicarbonate,#wg_total_alkalinity,#wg_chloride,#wg_sulfate').jqxNumberInput(Show1wat); 3433 $('#wg_amount,#wg_calcium,#wg_magnesium,#wg_sodium,#wg_bicarbonate,#wg_total_alkalinity,#wg_chloride,#wg_sulfate').jqxNumberInput(Show1wat);
4264 $('#wg_ph').jqxNumberInput(Show2wat); 3434 $('#wg_ph').jqxNumberInput(Show2wat);
3435 $('#wg_hardness').jqxNumberInput(Show1wat);
3436 $('#wg_ra').jqxNumberInput(Show1wat);
4265 // Water treated 3437 // Water treated
4266 $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'}); 3438 $('#wb_calcium').jqxTooltip({ content: 'De ideale hoeveelheid Calcium is tussen 40 en 150.'});
3439 $('#wb_calcium').jqxNumberInput(Show1wat);
4267 $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'}); 3440 $('#wb_magnesium').jqxTooltip({ content: 'De ideale hoeveelheid Magnesium is tussen 5 en 40.'});
3441 $('#wb_magnesium').jqxNumberInput(Show1wat);
4268 $('#wb_sodium').jqxTooltip({ content: 'De ideale hoeveelheid Natrium is lager dan 150.'}); 3442 $('#wb_sodium').jqxTooltip({ content: 'De ideale hoeveelheid Natrium is lager dan 150.'});
3443 $('#wb_sodium').jqxNumberInput(Show1wat);
4269 $('#wb_chloride').jqxTooltip({ content: 'De ideale hoeveelheid Chloride is tussen 50 en 150. Samen met Sulfaat minder dan 500.'}); 3444 $('#wb_chloride').jqxTooltip({ content: 'De ideale hoeveelheid Chloride is tussen 50 en 150. Samen met Sulfaat minder dan 500.'});
3445 $('#wb_chloride').jqxNumberInput(Show1wat);
4270 $('#wb_sulfate').jqxTooltip({ content: 'De ideale hoeveelheid Sulfaat is tussen 50 en 400. Samen met Chloride minder dan 500.'}); 3446 $('#wb_sulfate').jqxTooltip({ content: 'De ideale hoeveelheid Sulfaat is tussen 50 en 400. Samen met Chloride minder dan 500.'});
3447 $('#wb_sulfate').jqxNumberInput(Show1wat);
4271 $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'}); 3448 $('#wb_bicarbonate').jqxTooltip({ content: '0 tot 50 lichte bieren, 50 tot 150 amber bieren, 150 tot 250 donkere bieren.'});
4272 $('#wb_calcium,#wb_magnesium,#wb_sodium,#wb_bicarbonate,#wb_total_alkalinity,#wb_chloride,#wb_sulfate').jqxNumberInput(Show1wat); 3449 $('#wb_bicarbonate').jqxNumberInput(Show1wat);
4273 $('#wb_ph').jqxNumberInput(Show2wat); 3450 $('#wb_ph').jqxNumberInput(Show2wat);
4274 // Water target profile 3451 $('#wb_hardness').jqxNumberInput(Show1wat);
4275 $('#pr_name').jqxDropDownList({ 3452 $('#wb_ra').jqxNumberInput(Show1wat);
4276 placeHolder: 'Kies doel profiel:', 3453 // Sparge water
4277 theme: theme, 3454 $('#sw_amount').jqxNumberInput(Show1wat);
4278 source: waterprofiles, 3455 $('#sw_calcium').jqxNumberInput(Show1wat);
4279 displayMember: 'name', 3456 $('#sw_magnesium').jqxNumberInput(Show1wat);
4280 width: 200, 3457 $('#sw_sodium').jqxNumberInput(Show1wat);
4281 height: 27, 3458 $('#sw_bicarbonate').jqxNumberInput(Show1wat);
4282 dropDownWidth: 400, 3459 $('#sw_total_alkalinity').jqxNumberInput(Show1wat);
4283 dropDownHeight: 300 3460 $('#sw_chloride').jqxNumberInput(Show1wat);
4284 }); 3461 $('#sw_sulfate').jqxNumberInput(Show1wat);
4285 $('#pr_name').on('select', function(event) { 3462 $('#sw_ph').jqxNumberInput(Show2wat);
4286 if (event.args) { 3463 $('#sw_hardness').jqxNumberInput(Show1wat);
4287 var datarecord, index = event.args.index; 3464 $('#sw_ra').jqxNumberInput(Show1wat);
4288 datarecord = waterprofiles.records[index];
4289 $('#pr_calcium').val(datarecord.calcium);
4290 $('#pr_sulfate').val(datarecord.sulfate);
4291 $('#pr_chloride').val(datarecord.chloride);
4292 $('#pr_sodium').val(datarecord.sodium);
4293 $('#pr_magnesium').val(datarecord.magnesium);
4294 $('#pr_total_alkalinity').val(datarecord.total_alkalinity);
4295 $('#pr_bicarbonate').val(datarecord.total_alkalinity * 1.22);
4296 calcWater();
4297 }
4298 });
4299 $('#pr_calcium,#pr_magnesium,#pr_sodium,#pr_bicarbonate,#pr_total_alkalinity,#pr_chloride,#pr_sulfate').jqxNumberInput(Show1wat);
4300 3465
4301 // Water agents 3466 // Water agents
4302 $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.' }); 3467 $('#wa_cacl2').jqxTooltip({ content: 'Voor het maken van een ander waterprofiel. Voegt calcium en chloride toe. Voor het verbeteren van zoetere bieren.' });
3468 $('#wa_cacl2').jqxNumberInput(Show2wat);
3469 $('#ss_cacl2').jqxNumberInput(Show2wat);
3470
4303 $('#wa_caso4').jqxTooltip({ 3471 $('#wa_caso4').jqxTooltip({
4304 content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.' 3472 content: 'Gips. Voor het maken van een ander waterprofiel. Voegt calcium en sulfaat toe. Voor het verbeteren van bittere bieren.'
4305 }); 3473 });
3474 $('#wa_caso4').jqxNumberInput(Show2wat);
3475 $('#ss_caso4').jqxNumberInput(Show2wat);
3476
4306 $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!' }); 3477 $('#wa_mgso4').jqxTooltip({ content: 'Epsom zout. Voor het maken van een ander waterprofiel. Voegt magnesium en sulfaat toe. Gebruik spaarzaam!' });
3478 $('#wa_mgso4').jqxNumberInput(Show2wat);
3479 $('#ss_mgso4').jqxNumberInput(Show2wat);
3480
4307 $('#wa_nacl').jqxTooltip({ 3481 $('#wa_nacl').jqxTooltip({
4308 content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' + 3482 content: 'Keukenzout. Voor het maken van een ander waterprofiel. Voegt natrium en chloride toe. ' +
4309 'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.' 3483 'Voor het accentueren van zoetheid. Bij hoge dosering wordt het bier ziltig.'
4310 }); 3484 });
3485 $('#wa_nacl').jqxNumberInput(Show2wat);
3486 $('#ss_nacl').jqxNumberInput(Show2wat);
3487
4311 $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'}); 3488 $('#wa_mgcl2').jqxTooltip({ content: 'Magnesiumchloride'});
3489 $('#wa_mgcl2').jqxNumberInput(Show2wat);
3490 $('#ss_mgcl2').jqxNumberInput(Show2wat);
3491
4312 $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'}); 3492 $('#wa_nahco3').jqxTooltip({ content: 'Baksoda'});
4313 $('#wa_caco3').jqxTooltip({ content: 'Kalk'}); 3493 $('#wa_caco3').jqxTooltip({ content: 'Kalk'});
4314 $('#wa_cacl2,#wa_caso4,#wa_mgso4,#wa_nacl,#wa_mgcl2,#wa_nahco3,#wa_caco3').jqxNumberInput(Spin1dec); 3494 $('#wa_nahco3,#wa_caco3').jqxNumberInput(Show2wat);
3495
4315 $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'}); 3496 $('#mash_ph').jqxTooltip({ content: 'Maisch pH tussen 5.2 en 5.6. Gebruik 5.2 voor lichte en 5.5 voor donkere bieren.'});
4316 $('#mash_ph').jqxNumberInput(SpinpH); 3497 $('#mash_ph').jqxNumberInput(Show2dec);
4317 $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23 }); 3498
4318 $('#wa_acid').jqxNumberInput(Spin2dec); 3499 $('#calc_acid').jqxCheckBox({ theme: theme, width: 120, height: 23, disabled: true });
4319 $('#wa_acid_name').jqxDropDownList({ 3500
4320 theme: theme, 3501 $('#wa_acid_name').jqxInput({ theme: theme, width: 130, height: 23 });
4321 source: AcidTypeAdapter, 3502 $('#wa_acid').jqxNumberInput(Show2dec);
4322 valueMember: 'id',
4323 displayMember: 'nl',
4324 width: 130,
4325 height: 23,
4326 autoDropDownHeight: true
4327 });
4328 $('#wa_acid').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' }); 3503 $('#wa_acid').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' });
4329 $('#wa_acid_perc,#sparge_acid_perc').jqxNumberInput(Perc0); 3504 $('#wa_acid_perc').jqxNumberInput(Show0dec);
4330 $('#wa_acid_perc').jqxNumberInput({ width: 70, symbol: '%', symbolPosition: 'right' }); 3505 $('#wa_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' });
3506
4331 // Sparge water 3507 // Sparge water
4332 $('#sparge_temp,#sparge_volume').jqxNumberInput(Spin1dec); 3508 $('#sparge_ph').jqxNumberInput(Show2dec);
4333 $('#sparge_ph').jqxNumberInput(SpinpH); 3509 $('#sparge_acid_amount').jqxNumberInput(Show2dec);
4334 $('#sparge_source').jqxDropDownList({ 3510 $('#sparge_acid_amount').jqxNumberInput({ symbol: ' ml', symbolPosition: 'right' });
4335 theme: theme, 3511 $('#sparge_acid_type').jqxInput({ theme: theme, width: 130, height: 23 });
4336 source: SpargeSourceAdapter, 3512 $('#sparge_acid_perc').jqxNumberInput(Show0dec);
4337 valueMember: 'id',
4338 displayMember: 'nl',
4339 width: 110,
4340 height: 23,
4341 autoDropDownHeight: true
4342 });
4343 $('#sparge_acid_amount').jqxNumberInput(Spin2dec);
4344 $('#sparge_acid_amount').jqxNumberInput({ spinButtons: false, readOnly: true, symbol: ' ml', symbolPosition: 'right' });
4345 $('#sparge_acid_type').jqxDropDownList({
4346 theme: theme,
4347 source: AcidTypeAdapter,
4348 valueMember: 'id',
4349 displayMember: 'nl',
4350 width: 110,
4351 height: 23,
4352 autoDropDownHeight: true
4353 });
4354 $('#sparge_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' }); 3513 $('#sparge_acid_perc').jqxNumberInput({ symbol: '%', symbolPosition: 'right' });
4355 3514
4356 // Tab 9, Brewday 3515 // Tab 9, Brewday
4357 $('#brew_date_start').jqxTooltip({ content: 'Brouw datum en tijd. Voor planning laat de tijd op 00:00:00 staan.' }); 3516 $('#brew_date_start').jqxTooltip({ content: 'Brouw datum en tijd. Voor planning laat de tijd op 00:00:00 staan.' });
4358 $('#brew_date_end').jqxTooltip({ content: 'End datum en tijd van de brouw. Leeg laten als er nog niet gebrouwen is.' }); 3517 $('#brew_date_end').jqxTooltip({ content: 'End datum en tijd van de brouw. Leeg laten als er nog niet gebrouwen is.' });
4383 $('#brew_preboil_sg').on('valueChanged', function(event) { 3542 $('#brew_preboil_sg').on('valueChanged', function(event) {
4384 dataRecord.brew_preboil_sg = event.args.value; 3543 dataRecord.brew_preboil_sg = event.args.value;
4385 calcEfficiencyBeforeBoil(); 3544 calcEfficiencyBeforeBoil();
4386 }); 3545 });
4387 $('#brew_mash_sg,#brew_preboil_sg,#brew_aboil_sg').jqxNumberInput(SGopts); 3546 $('#brew_mash_sg,#brew_preboil_sg,#brew_aboil_sg').jqxNumberInput(SGopts);
4388 $('#brew_aboil_sg').on('valueChanged', function(event) {
4389 dataRecord.brew_aboil_sg = event.args.value;
4390 calcEfficiencyAfterBoil();
4391 calcFermentables();
4392 calcIBUs();
4393 });
4394 $('#est_mash_sg,#est_pre_sg,#est_og3').jqxNumberInput(Show3wat); 3547 $('#est_mash_sg,#est_pre_sg,#est_og3').jqxNumberInput(Show3wat);
4395 $('#brew_mash_efficiency').jqxNumberInput(Show1dec); 3548 $('#brew_mash_efficiency').jqxNumberInput(Show1dec);
4396 $('#brew_preboil_volume').on('valueChanged', function(event) { 3549 $('#brew_preboil_volume').on('valueChanged', function(event) {
4397 dataRecord.brew_preboil_volume = event.args.value; 3550 dataRecord.brew_preboil_volume = event.args.value;
4398 calcEfficiencyBeforeBoil(); 3551 calcEfficiencyBeforeBoil();
4399 }); 3552 });
4400 $('#brew_preboil_volume,#brew_aboil_volume').jqxNumberInput(Spin1dec); 3553 $('#brew_preboil_volume,#brew_aboil_volume').jqxNumberInput(Spin1dec);
4401 $('#brew_aboil_volume').on('valueChanged', function(event) {
4402 dataRecord.brew_aboil_volume = event.args.value;
4403 calcEfficiencyAfterBoil();
4404 calcFermentables();
4405 calcIBUs();
4406 });
4407 $('#ketel_volume').jqxNumberInput(Show1dec); 3554 $('#ketel_volume').jqxNumberInput(Show1dec);
4408 $('#ketel_cm').jqxNumberInput(Spin1dec); 3555 $('#ketel_cm').jqxNumberInput(Spin1dec);
4409 $('#ketel_cm').on('change', function(event) {
4410 k_cm = parseFloat(event.args.value);
4411 k_vol = kettle_vol(k_cm, dataRecord.eq_kettle_volume, dataRecord.eq_kettle_height);
4412 $('#ketel_volume').val(k_vol);
4413 });
4414 $('#volumeReady').jqxButton({ template: 'success', width: '90px', theme: theme }); 3556 $('#volumeReady').jqxButton({ template: 'success', width: '90px', theme: theme });
4415 $('#volumeReady').click(function() { 3557 $('#volumeReady').click(function() {
4416 /* Is it pre or after boil */ 3558 /* Is it pre or after boil */
4417 console.log('volumeReady ' + k_what + ' volume: ' + Round(k_vol, 1)); 3559 console.log('volumeReady ' + k_what + ' volume: ' + Round(k_vol, 1));
4418 if (k_what == 0) { 3560 if (k_what == 0) {
4498 $('#secondary_end_date').jqxTooltip({ content: 'De eind datum van de navergisting en het begin van het lageren.' }); 3640 $('#secondary_end_date').jqxTooltip({ content: 'De eind datum van de navergisting en het begin van het lageren.' });
4499 $('#est_fg3').jqxTooltip({ content: 'Het verwachte eind SG. Dit wordt automatisch berekend.' }); 3641 $('#est_fg3').jqxTooltip({ content: 'Het verwachte eind SG. Dit wordt automatisch berekend.' });
4500 3642
4501 $('#primary_end_sg,#secondary_end_sg').jqxNumberInput(SGopts); 3643 $('#primary_end_sg,#secondary_end_sg').jqxNumberInput(SGopts);
4502 $('#primary_end_date,#secondary_end_date').jqxDateTimeInput(Dateopts); 3644 $('#primary_end_date,#secondary_end_date').jqxDateTimeInput(Dateopts);
4503 $('#primary_end_date').on('close', function(event) {
4504 dataRecord.primary_end_date = $('#primary_end_date').val();
4505 calcStage();
4506 });
4507 $('#secondary_end_date').on('close', function(event) {
4508 dataRecord.secondary_end_date = $('#secondary_end_date').val();
4509 calcStage();
4510 });
4511 $('#primary_start_temp,#primary_max_temp,#primary_end_temp,#secondary_temp,#tertiary_temp').jqxNumberInput(YeastT); 3645 $('#primary_start_temp,#primary_max_temp,#primary_end_temp,#secondary_temp,#tertiary_temp').jqxNumberInput(YeastT);
4512 $('#fg').jqxNumberInput(Spin3dec); 3646 $('#fg').jqxNumberInput(Spin3dec);
4513 $('#brew_fermenter_sg2,#est_fg3').jqxNumberInput(Show3dec); 3647 $('#brew_fermenter_sg2,#est_fg3').jqxNumberInput(Show3dec);
4514 $('#primary_end_brix,#secondary_end_brix,#final_brix').jqxNumberInput(Spin1dec); 3648 $('#primary_end_brix,#secondary_end_brix,#final_brix').jqxNumberInput(Spin1dec);
4515 $('#final_abv').jqxNumberInput(Show2dec); 3649 $('#final_abv').jqxNumberInput(Show2dec);
4541 $('#bottle_carbonation').jqxTooltip({ content: 'Het gewenste CO2 volume in de flessen.' }); 3675 $('#bottle_carbonation').jqxTooltip({ content: 'Het gewenste CO2 volume in de flessen.' });
4542 $('#keg_carbonation').jqxTooltip({ content: 'Het gewenste CO2 volume door de suiker in de fusten.' }); 3676 $('#keg_carbonation').jqxTooltip({ content: 'Het gewenste CO2 volume door de suiker in de fusten.' });
4543 $('#bottle_priming_water,#keg_priming_water').jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' }); 3677 $('#bottle_priming_water,#keg_priming_water').jqxTooltip({ content: 'De hoeveelheid water om de suiker op te lossen.' });
4544 $('#bottle_pressure').jqxTooltip({ content: 'De maximaal te verwachten druk tijdens het hergisten.' }); 3678 $('#bottle_pressure').jqxTooltip({ content: 'De maximaal te verwachten druk tijdens het hergisten.' });
4545 $('#package_date').jqxDateTimeInput(Dateopts); 3679 $('#package_date').jqxDateTimeInput(Dateopts);
4546 $('#package_date').on('close', function(event) {
4547 dataRecord.package_date = $('#package_date').val();
4548 calcStage();
4549 });
4550 $('#package_infuse_amount').jqxNumberInput(Spin3dec); 3680 $('#package_infuse_amount').jqxNumberInput(Spin3dec);
4551 $('#package_infuse_notes').jqxInput({ theme: theme, width: 640, height: 23 }); 3681 $('#package_infuse_notes').jqxInput({ theme: theme, width: 640, height: 23 });
4552 $('#package_abv').jqxNumberInput(Show2dec); 3682 $('#package_abv').jqxNumberInput(Show2dec);
4553 $('#package_ph').jqxNumberInput(SpinpH); 3683 $('#package_ph').jqxNumberInput(SpinpH);
4554 $('#st_carb_min2,#st_carb_max2').jqxNumberInput(Smal1dec); 3684 $('#st_carb_min2,#st_carb_max2').jqxNumberInput(Smal1dec);
4603 rowID = $('#fermentableGrid').jqxGrid('getrowid', editrow); 3733 rowID = $('#fermentableGrid').jqxGrid('getrowid', editrow);
4604 $('#fermentableGrid').jqxGrid('updaterow', rowID, row); 3734 $('#fermentableGrid').jqxGrid('updaterow', rowID, row);
4605 } else { 3735 } else {
4606 $('#fermentableGrid').jqxGrid('addrow', null, row); 3736 $('#fermentableGrid').jqxGrid('addrow', null, row);
4607 } 3737 }
4608 calcCarbonation(); 3738 // calcCarbonation();
4609 } 3739 }
4610 }); 3740 });
4611 $('#keg_priming_sugar').jqxDropDownList({ 3741 $('#keg_priming_sugar').jqxDropDownList({
4612 placeHolder: 'Kies suiker:', 3742 placeHolder: 'Kies suiker:',
4613 theme: theme, 3743 theme: theme,
4656 rowID = $('#fermentableGrid').jqxGrid('getrowid', editrow); 3786 rowID = $('#fermentableGrid').jqxGrid('getrowid', editrow);
4657 $('#fermentableGrid').jqxGrid('updaterow', rowID, row); 3787 $('#fermentableGrid').jqxGrid('updaterow', rowID, row);
4658 } else { 3788 } else {
4659 $('#fermentableGrid').jqxGrid('addrow', null, row); 3789 $('#fermentableGrid').jqxGrid('addrow', null, row);
4660 } 3790 }
4661 calcCarbonation(); 3791 // calcCarbonation();
4662 } 3792 }
4663 }); 3793 });
4664 $('#bottle_priming_water,#keg_priming_water').jqxNumberInput(Spin3dec); 3794 $('#bottle_priming_water,#keg_priming_water').jqxNumberInput(Spin3dec);
4665 $('#keg_forced_carb').jqxCheckBox({ theme: theme, width: 120, height: 23 }); 3795 $('#keg_forced_carb').jqxCheckBox({ theme: theme, width: 120, height: 23 });
4666 $('#bottle_priming_amount,#keg_priming_amount,#bottle_priming_total,#bottle_pressure,#keg_priming_total,#keg_pressure').jqxNumberInput(Show1dec); 3796 $('#bottle_priming_amount,#keg_priming_amount,#bottle_priming_total,#bottle_pressure,#keg_priming_total,#keg_pressure').jqxNumberInput(Show1dec);

mercurial