438 $("#w2_amount").val(dataRecord.w2_amount); |
436 $("#w2_amount").val(dataRecord.w2_amount); |
439 } |
437 } |
440 $('#wg_amount').val(mash_infuse); |
438 $('#wg_amount').val(mash_infuse); |
441 }; |
439 }; |
442 |
440 |
443 /* function GetBUGUMin() { |
|
444 |
|
445 var Result = 0; |
|
446 |
|
447 if (((dataRecord.st_og_max + dataRecord.st_og_min) > 0) && ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) > 0)) { |
|
448 var G = (dataRecord.st_og_max - dataRecord.st_og_min) / ((dataRecord.st_og_max + dataRecord.st_og_min) / 2); |
|
449 var B = (dataRecord.st_ibu_max - dataRecord.st_ibu_min) / ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2); |
|
450 if (G > B) |
|
451 Result = ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2) / (1000 * (dataRecord.st_og_max - 1)); |
|
452 else |
|
453 Result = dataRecord.st_ibu_min / (1000 * (((dataRecord.st_og_max + dataRecord.st_og_min) / 2) - 1)); |
|
454 } |
|
455 console.log("GetBUGUMin(): "+Result); |
|
456 return Result; |
|
457 } |
|
458 |
|
459 function GetBUGUMax() { |
|
460 |
|
461 var Result = 0; |
|
462 |
|
463 if (((dataRecord.st_og_max + dataRecord.st_og_min) > 0) && ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) > 0) && (dataRecord.st_og_min > 0)) { |
|
464 var G = (dataRecord.st_og_max - dataRecord.st_og_min) / ((dataRecord.st_og_max + dataRecord.st_og_min) / 2); |
|
465 var B = (dataRecord.st_ibu_max - dataRecord.st_ibu_min) / ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2); |
|
466 if (G > B) |
|
467 Result = ((dataRecord.st_ibu_min + dataRecord.st_ibu_max) / 2) / (1000 * (dataRecord.st_og_min - 1)); |
|
468 else |
|
469 Result = dataRecord.st_ibu_max / (1000 * (((dataRecord.st_og_max + dataRecord.st_og_min) / 2) - 1)); |
|
470 |
|
471 } |
|
472 console.log("GetBUGUMax(): "+Result); |
|
473 return Result; |
|
474 } */ |
|
475 |
|
476 function GetBUGU() { |
441 function GetBUGU() { |
477 var gu = (dataRecord.est_og - 1) * 1000; |
442 var gu = (dataRecord.est_og - 1) * 1000; |
478 if (gu > 0) |
443 if (gu > 0) |
479 return dataRecord.est_ibu / gu; |
444 return dataRecord.est_ibu / gu; |
480 else |
445 else |
485 var BUGU = GetBUGU(); |
450 var BUGU = GetBUGU(); |
486 return (-1.2 * BUGU + 1.4); |
451 return (-1.2 * BUGU + 1.4); |
487 } |
452 } |
488 |
453 |
489 function setWaterAgent(name, amount) { |
454 function setWaterAgent(name, amount) { |
490 console.log("setWaterAgent(" + name + ", " + amount + ")"); |
455 //console.log("setWaterAgent(" + name + ", " + amount + ")"); |
491 var rows = $('#miscGrid').jqxGrid('getrows'); |
456 var rows = $('#miscGrid').jqxGrid('getrows'); |
492 if (amount == 0) { |
457 if (amount == 0) { |
493 for (var i = 0; i < rows.length; i++) { |
458 for (var i = 0; i < rows.length; i++) { |
494 var row = rows[i]; |
459 var row = rows[i]; |
495 if (row.m_name == name) { |
460 if (row.m_name == name) { |
534 } |
499 } |
535 } |
500 } |
536 } |
501 } |
537 |
502 |
538 function setRangeIndicator(ion, rangeCode) { |
503 function setRangeIndicator(ion, rangeCode) { |
539 if (rangeCode == "laag") |
504 if ((rangeCode == "laag") || (rangeCode == "hoog")) |
540 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode + "</span>"); |
505 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode + "</span>"); |
541 else if (rangeCode == "hoog") |
|
542 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode+"</span>"); |
|
543 else |
506 else |
544 $("#wr_"+ion).html("<img src='images/dialog-ok-apply.png'>"); |
507 $("#wr_"+ion).html("<img src='images/dialog-ok-apply.png'>"); |
545 } |
508 } |
546 |
509 |
547 function mix(v1, v2, c1, c2) { |
510 function mix(v1, v2, c1, c2) { |
789 dataRecord.wa_base_name = 0; |
750 dataRecord.wa_base_name = 0; |
790 } |
751 } |
791 if (last_base == '') |
752 if (last_base == '') |
792 last_base = BaseTypeData[$("#wa_base_name").val()].nl; |
753 last_base = BaseTypeData[$("#wa_base_name").val()].nl; |
793 |
754 |
794 var AT = dataRecord.wa_acid_name; // parseFloat($("#wa_acid_name").jqxNumberInput('decimal')); |
755 var AT = dataRecord.wa_acid_name; |
795 var BT = dataRecord.wa_base_name; //parseFloat($("#wa_base_name").jqxNumberInput('decimal')); |
756 var BT = dataRecord.wa_base_name; |
796 |
757 |
797 var result = GetAcidSpecs(AT); |
758 var result = GetAcidSpecs(AT); |
798 var pK1 = result.pK1; |
759 var pK1 = result.pK1; |
799 var pK2 = result.pK2; |
760 var pK2 = result.pK2; |
800 var pK3 = result.pK3; |
761 var pK3 = result.pK3; |
1120 dataRecord.sparge_source = 0; |
1079 dataRecord.sparge_source = 0; |
1121 $("#sparge_source").val(0); |
1080 $("#sparge_source").val(0); |
1122 } |
1081 } |
1123 } |
1082 } |
1124 |
1083 |
1125 console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity); |
1084 //console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity); |
1126 |
1085 |
1127 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
1086 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH |
1128 var r1 = Math.pow(10, Source_pH - 6.38); |
1087 var r1 = Math.pow(10, Source_pH - 6.38); |
1129 var r2 = Math.pow(10, Source_pH - 10.33); |
1088 var r2 = Math.pow(10, Source_pH - 10.373); |
1130 var d = 1 + r1 + r1*r2; |
1089 var d = 1 + r1 + r1*r2; |
1131 var f1 = 1/d; |
1090 var f1 = 1/d; |
1132 var f2 = r1/d; |
1091 var f2 = r1/d; |
1133 var f3 = r1 * r2 / d; |
1092 var f3 = r1 * r2 / d; |
1134 |
1093 |
1135 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
1094 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) |
1136 var r143 = Math.pow(10, 4.3 - 6.38); |
1095 var r143 = Math.pow(10, 4.3 - 6.38); |
1137 var r243 = Math.pow(10, 4.3 - 10.33); |
1096 var r243 = Math.pow(10, 4.3 - 10.373); |
1138 var d43 = 1 + r143 + r143*r243; |
1097 var d43 = 1 + r143 + r143*r243; |
1139 var f143 = 1/d43; |
1098 var f143 = 1/d43; |
1140 var f243 = r143 / d43; |
1099 var f243 = r143 / d43; |
1141 var f343 = r143 * r243 / d43; |
1100 var f343 = r143 * r243 / d43; |
1142 |
1101 |
1143 //Step 3. Convert the sample alkalinity to milliequivalents/L |
1102 //Step 3. Convert the sample alkalinity to milliequivalents/L |
1144 var alkalinity = Source_alkalinity / 50; |
1103 var alkalinity = Source_alkalinity / 50; |
1145 //Step 4. Solve |
1104 //Step 4. Solve |
1146 alkalinity = alkalinity / ((f143-f1)+(f3-f343)); |
1105 var Ct = (alkalinity - 1000 * (Math.pow(10, -4.3) - Math.pow(10, -Source_pH))) / ((f143-f1)+(f3-f343)); |
1147 |
1106 |
1148 //Step 5. Compute mole fractions at desired pH |
1107 //Step 5. Compute mole fractions at desired pH |
1149 var r1g = Math.pow(10, TargetpH - 6.38); |
1108 var r1g = Math.pow(10, TargetpH - 6.38); |
1150 var r2g = Math.pow(10, TargetpH - 10.33); |
1109 var r2g = Math.pow(10, TargetpH - 10.373); |
1151 var dg = 1 + r1g + r1g*r2g; |
1110 var dg = 1 + r1g + r1g*r2g; |
1152 var f1g = 1/dg; |
1111 var f1g = 1/dg; |
1153 var f2g = r1g / dg; |
1112 var f2g = r1g / dg; |
1154 var f3g = r1g * r2g / dg; |
1113 var f3g = r1g * r2g / dg; |
1155 |
1114 |
1156 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
1115 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) |
1157 var Acid = alkalinity * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
1116 var Acid = Ct * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l |
|
1117 Acid += 0.01; // Add acid that would be required for distilled water. |
1158 if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) { |
1118 if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) { |
1159 dataRecord.sparge_acid_type = 0; |
1119 dataRecord.sparge_acid_type = 0; |
1160 $("#sparge_acid_type").val(0); |
1120 $("#sparge_acid_type").val(0); |
1161 } |
1121 } |
|
1122 |
|
1123 //Step 8. Get the acid data. |
1162 var AT = dataRecord.sparge_acid_type; |
1124 var AT = dataRecord.sparge_acid_type; |
1163 var result = GetAcidSpecs(AT); |
1125 var result = GetAcidSpecs(AT); |
1164 var pK1 = result.pK1; |
1126 var pK1 = result.pK1; |
1165 var pK2 = result.pK2; |
1127 var pK2 = result.pK2; |
1166 var pK3 = result.pK3; |
1128 var pK3 = result.pK3; |
2579 { name: 'step_name', type: 'string' }, |
2542 { name: 'step_name', type: 'string' }, |
2580 { name: 'step_type', type: 'int' }, |
2543 { name: 'step_type', type: 'int' }, |
2581 { name: 'step_infuse_amount', type: 'float' }, |
2544 { name: 'step_infuse_amount', type: 'float' }, |
2582 { name: 'step_temp', type: 'float' }, |
2545 { name: 'step_temp', type: 'float' }, |
2583 { name: 'step_time', type: 'float' }, |
2546 { name: 'step_time', type: 'float' }, |
|
2547 { name: 'step_thickness', type: 'float' }, |
2584 { name: 'ramp_time', type: 'float' }, |
2548 { name: 'ramp_time', type: 'float' }, |
2585 { name: 'end_temp', type: 'float' } |
2549 { name: 'end_temp', type: 'float' } |
2586 ], |
2550 ], |
2587 addrow: function (rowid, rowdata, position, commit) { |
2551 addrow: function (rowid, rowdata, position, commit) { |
2588 commit(true); |
2552 commit(true); |
2634 ready: function() { |
2598 ready: function() { |
2635 calcFermentables(); |
2599 calcFermentables(); |
2636 calcInit(); |
2600 calcInit(); |
2637 $('#jqxLoader').jqxLoader('close'); |
2601 $('#jqxLoader').jqxLoader('close'); |
2638 $('#jqxTabs').jqxTabs('first'); |
2602 $('#jqxTabs').jqxTabs('first'); |
2639 // setReadonly(dataRecord.locked); |
|
2640 }, |
2603 }, |
2641 columns: [ |
2604 columns: [ |
2642 { text: 'Stap naam', datafield: 'step_name' }, |
2605 { text: 'Stap naam', datafield: 'step_name' }, |
2643 { text: 'Stap type', datafield: 'step_type', width: 175, |
2606 { text: 'Stap type', datafield: 'step_type', width: 175, |
2644 cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { |
2607 cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { |
2648 { text: 'Start °C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
2611 { text: 'Start °C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
2649 { text: 'Eind °C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
2612 { text: 'Eind °C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
2650 { text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' }, |
2613 { text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' }, |
2651 { text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' }, |
2614 { text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' }, |
2652 { text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
2615 { text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, |
|
2616 { text: 'L/Kg.', datafield: 'step_thickness', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f2' }, |
2653 { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { |
2617 { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { |
2654 return "Wijzig"; |
2618 return "Wijzig"; |
2655 }, buttonclick: function (row) { |
2619 }, buttonclick: function (row) { |
2656 mashRow = row; |
2620 mashRow = row; |
2657 mashData = $("#mashGrid").jqxGrid('getrowdata', mashRow); |
2621 mashData = $("#mashGrid").jqxGrid('getrowdata', mashRow); |
3419 if (i == 0) |
3383 if (i == 0) |
3420 row["step_infuse_amount"] = mash_infuse; |
3384 row["step_infuse_amount"] = mash_infuse; |
3421 else |
3385 else |
3422 row["step_infuse_amount"] = 0; |
3386 row["step_infuse_amount"] = 0; |
3423 row["step_temp"] = data.step_temp; |
3387 row["step_temp"] = data.step_temp; |
|
3388 if (mashkg > 0) |
|
3389 row["step_thickness"] = parseFloat(mash_infuse / mashkg); |
|
3390 else |
|
3391 row["step_thickness"] = 0; |
3424 row["end_temp"] = data.end_temp; |
3392 row["end_temp"] = data.end_temp; |
3425 row["step_time"] = data.step_time; |
3393 row["step_time"] = data.step_time; |
3426 row["ramp_time"] = data.ramp_time; |
3394 row["ramp_time"] = data.ramp_time; |
3427 var commit = $("#mashGrid").jqxGrid('addrow', null, row); |
3395 var commit = $("#mashGrid").jqxGrid('addrow', null, row); |
3428 } |
3396 } |
3440 modalOpacity: 0.40 |
3408 modalOpacity: 0.40 |
3441 }); |
3409 }); |
3442 $("#MashReady").jqxButton({ template: "success", width: '90px', theme: theme }); |
3410 $("#MashReady").jqxButton({ template: "success", width: '90px', theme: theme }); |
3443 $("#MashReady").click(function () { |
3411 $("#MashReady").click(function () { |
3444 $("#mashGrid").jqxGrid('sortby', 'step_temp', 'asc'); |
3412 $("#mashGrid").jqxGrid('sortby', 'step_temp', 'asc'); |
|
3413 mash_infuse = 0; |
|
3414 var rows = $('#mashGrid').jqxGrid('getrows'); |
|
3415 for (var i = 0; i < rows.length; i++) { |
|
3416 var row = rows[i]; |
|
3417 if (row.step_type == 0) // Infusion |
|
3418 mash_infuse += parseFloat(row.step_infuse_amount); |
|
3419 var rowdata = $("#mashGrid").jqxGrid('getrowdata', i); |
|
3420 if (mashkg > 0) |
|
3421 rowdata.step_thickness = parseFloat(mash_infuse / mashkg); |
|
3422 else |
|
3423 rowdata.step_thickness = 0; |
|
3424 } |
3445 }); |
3425 }); |
3446 $("#wstep_name").jqxInput({ theme: theme, width: 320, height: 23 }); |
3426 $("#wstep_name").jqxInput({ theme: theme, width: 320, height: 23 }); |
3447 $("#wstep_name").on('change', function (event) { |
3427 $("#wstep_name").on('change', function (event) { |
3448 var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); |
3428 var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); |
3449 rowdata.step_name = event.args.value; |
3429 rowdata.step_name = event.args.value; |