307 $("#brew_mash_efficiency").val(100 * m / c); |
303 $("#brew_mash_efficiency").val(100 * m / c); |
308 else |
304 else |
309 $("#brew_mash_efficiency").val(0); |
305 $("#brew_mash_efficiency").val(0); |
310 }; |
306 }; |
311 |
307 |
|
308 function setWaterAgent(name, amount) { |
|
309 console.log("setWaterAgent(" + name + ", " + amount + ")"); |
|
310 var rows = $('#miscGrid').jqxGrid('getrows'); |
|
311 if (amount == 0) { |
|
312 for (var i = 0; i < rows.length; i++) { |
|
313 var row = rows[i]; |
|
314 if (row.m_name == name) { |
|
315 var id = $("#miscGrid").jqxGrid('getrowid', i); |
|
316 // console.log("name found, erase "+ id); |
|
317 var commit = $("#miscGrid").jqxGrid('deleterow', id); |
|
318 // console.log("result: "+commit); |
|
319 } |
|
320 } |
|
321 } else { |
|
322 var found = false; |
|
323 for (var i = 0; i < rows.length; i++) { |
|
324 var row = rows[i]; |
|
325 if (row.m_name == name) { |
|
326 found = true; |
|
327 $("#miscGrid").jqxGrid('setcellvalue', i, 'm_weight', amount); |
|
328 $("#miscGrid").jqxGrid('setcellvalue', i, 'm_amount', amount / 1000); |
|
329 break; |
|
330 } |
|
331 } |
|
332 console.log("set something, found: "+found); |
|
333 if (! found) { |
|
334 var miscs = new $.jqx.dataAdapter(miscInvSource, { |
|
335 loadComplete: function () { |
|
336 var records = miscs.records; |
|
337 for (var i = 0; i < records.length; i++) { |
|
338 var record = records[i]; |
|
339 if (record.name == name) { |
|
340 var row = {}; |
|
341 row["m_name"] = record.name; |
|
342 row["m_amount"] = amount / 1000; |
|
343 row["m_cost"] = record.cost; |
|
344 row["m_type"] = record.type; |
|
345 row["m_use_use"] = record.use_use; |
|
346 row["m_time"] = 0; |
|
347 row["m_weight"] = amount; |
|
348 row["m_amount_is_weight"] = record.amount_is_weight; |
|
349 var commit = $("#miscGrid").jqxGrid('addrow', null, row); |
|
350 } |
|
351 } |
|
352 } |
|
353 }); |
|
354 miscs.dataBind(); |
|
355 return; |
|
356 } |
|
357 } |
|
358 } |
|
359 |
|
360 function setRangeIndicator(ion, rangeCode) { |
|
361 $("#wr_" + ion).html("<img src='images/checkmark_range_" + rangeCode + ".gif'><span style='font-size: 10px; font-style: italic;'>" + rangeCode + "</span>"); |
|
362 } |
|
363 |
|
364 function mix(v1, v2, c1, c2) { |
|
365 if ((v1 + v2) > 0) { |
|
366 return ((v1 * c1) + (v2 * c2)) / (v1 + v2); |
|
367 } |
|
368 return 0; |
|
369 } |
|
370 |
|
371 // pH calculations |
|
372 |
|
373 function calcWater() { |
|
374 |
|
375 console.log("calcWater()"); |
|
376 var liters = 0; |
|
377 var calcium = 0; |
|
378 var magnesium = 0; |
|
379 var sodium = 0; |
|
380 var total_alkalinity = 0; |
|
381 var chloride = 0; |
|
382 var sulfate = 0; |
|
383 var ph = 0; |
|
384 var RA = 0; |
|
385 var acid = 0; |
|
386 var frac = 0; |
|
387 var MolWt = 0; |
|
388 var pK1 = 0; |
|
389 var pK2 = 0; |
|
390 var pK3 = 0; |
|
391 var TpH = 0; |
|
392 var AcidSG = 0; |
|
393 var AcidPrc = 0; |
|
394 var protonDeficit = 0; |
|
395 |
|
396 if (dataRecord.w1_name != "") { |
|
397 if (dataRecord.w2_name != "") { |
|
398 liters = dataRecord.w1_amount + dataRecord.w2_amount; |
|
399 calcium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_calcium, dataRecord.w2_calcium); |
|
400 magnesium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_magnesium, dataRecord.w2_magnesium); |
|
401 sodium = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sodium, dataRecord.w2_sodium); |
|
402 chloride = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_chloride, dataRecord.w2_chloride); |
|
403 sulfate = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_sulfate, dataRecord.w2_sulfate); |
|
404 total_alkalinity = mix(dataRecord.w1_amount, dataRecord.w2_amount, dataRecord.w1_total_alkalinity, dataRecord.w2_total_alkalinity); |
|
405 ph = -Math.log10(((Math.pow(10, -dataRecord.w1_ph) * dataRecord.w1_amount) + (Math.pow(10, -dataRecord.w2_ph) * dataRecord.w2_amount)) / liters); |
|
406 } else { |
|
407 liters = dataRecord.w1_amount; |
|
408 calcium = dataRecord.w1_calcium; |
|
409 magnesium = dataRecord.w1_magnesium; |
|
410 sodium = dataRecord.w1_sodium; |
|
411 chloride = dataRecord.w1_chloride; |
|
412 sulfate = dataRecord.w1_sulfate; |
|
413 total_alkalinity = dataRecord.w1_total_alkalinity; |
|
414 ph = dataRecord.w1_ph; |
|
415 } |
|
416 } |
|
417 $('#wg_amount').val(liters); |
|
418 $('#wg_calcium').val(Math.round(calcium * 10) / 10); |
|
419 $('#wg_magnesium').val(Math.round(magnesium * 10) / 10); |
|
420 $('#wg_sodium').val(Math.round(sodium * 10) / 10); |
|
421 $('#wg_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10); |
|
422 $('#wg_chloride').val(Math.round(chloride * 10) / 10); |
|
423 $('#wg_sulfate').val(Math.round(sulfate * 10) / 10); |
|
424 // Note: brouwhulp has the malts included here in the result. |
|
425 $('#wg_ph').val(Math.round(ph * 10) / 10); |
|
426 |
|
427 // Noot: de volgende berekeningen geven bijna gelijke resultaten in Brun'water. |
|
428 // Calculate Ca |
|
429 RA = parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCa / MMCaCl2 + |
|
430 parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMCa / MMCaSO4; |
|
431 calcium += 1000 * RA / parseFloat($("#wg_amount").jqxNumberInput('decimal')); |
|
432 |
|
433 // Calculate Mg |
|
434 RA = parseFloat($("#wa_mgso4").jqxNumberInput('decimal')) * MMMg / MMMgSO4; |
|
435 magnesium += 1000 * RA / parseFloat($("#wg_amount").jqxNumberInput('decimal')); |
|
436 |
|
437 // Calculate Na |
|
438 RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + |
|
439 parseFloat($("#wa_base").jqxNumberInput('decimal')) * MMNa / MMNaHCO3; |
|
440 sodium += 1000 * RA / parseFloat($("#wg_amount").jqxNumberInput('decimal')); |
|
441 |
|
442 // Calculate SO4 |
|
443 RA = parseFloat($("#wa_caso4").jqxNumberInput('decimal')) * MMSO4 / MMCaSO4 + |
|
444 parseFloat($("#wa_mgso4").jqxNumberInput('decimal')) * MMSO4 / MMMgSO4; |
|
445 sulfate += 1000 * RA / parseFloat($("#wg_amount").jqxNumberInput('decimal')); |
|
446 |
|
447 // Calculate Cl |
|
448 RA = 2 * parseFloat($("#wa_cacl2").jqxNumberInput('decimal')) * MMCl / MMCaCl2 + |
|
449 parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMCl / MMNaCl; |
|
450 chloride += 1000 * RA / parseFloat($("#wg_amount").jqxNumberInput('decimal')); |
|
451 // Einde noot. |
|
452 |
|
453 TpH = parseFloat(dataRecord.mash_ph); |
|
454 if (TpH < 5.0 || TpH > 6.0) { |
|
455 TpH = 5.4; |
|
456 dataRecord.mash_ph = 5.4; |
|
457 $("#mash_ph").val(5.4); |
|
458 $("#tgt_mash_ph").val(5.4); |
|
459 } |
|
460 var acid_amount = parseFloat($("#wa_acid").jqxNumberInput('decimal')); |
|
461 var acid_perc = parseFloat($("#wa_acid_perc").jqxNumberInput('decimal')); |
|
462 |
|
463 switch ($("#wa_acid_name").val()) { |
|
464 case 'Melkzuur': pK1 = 3.08; |
|
465 pK2 = 20; |
|
466 pK3 = 20; |
|
467 MolWt = 90.08; |
|
468 AcidSG = 1214; //@88% |
|
469 AcidPrc = 0.88; |
|
470 //frac = CalcFrac(TpH, pK1, pK2, pK3); |
|
471 acid += acid_amount * acid_perc / 100 * AcidSG / MolWt * frac / liters; //mEq/l |
|
472 break; |
|
473 |
|
474 case 'Zoutzuur': pK1 = -10; |
|
475 pK2 = 20; |
|
476 pK3 = 20; |
|
477 MolWt = 36.46; |
|
478 AcidSG = 1142; //@28% |
|
479 AcidPrc = 0.28; |
|
480 //frac = CalcFrac(TpH, pK1, pK2, pK3); |
|
481 Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; |
|
482 acid += Acidmg / MolWt * frac; //mEq/l |
|
483 chloride += Acidmg / 1000 * MMCl / (MMCl + 1); |
|
484 break; |
|
485 |
|
486 case 'Fosforzuur': pK1 = 2.12; |
|
487 pK2 = 7.20; |
|
488 pK3 = 12.44; |
|
489 MolWt = 98.00; |
|
490 AcidSG = 1170; //@25% |
|
491 AcidPrc = 0.25; |
|
492 //frac = CalcFrac(TpH, pK1, pK2, pK3); |
|
493 Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; |
|
494 acid += Acidmg / MolWt * frac; //mEq/l |
|
495 break; |
|
496 |
|
497 case 'Zwavelzuur': pK1 = -10; |
|
498 pK2 = 1.92; |
|
499 pK3 = 20; |
|
500 MolWt = 98.07; |
|
501 AcidSG = 1700; //@93% |
|
502 AcidPrc = 0.93; |
|
503 //frac = CalcFrac(TpH, pK1, pK2, pK3); |
|
504 Acidmg = acid_amount * acid_perc / 100 * AcidSG / liters; |
|
505 acid += Acidmg / MolWt * frac; //mEq/l |
|
506 sulfate += Acidmg / 1000 * MMSO4 / (MMSO4 + 2); |
|
507 break; |
|
508 } |
|
509 //protonDeficit = ProtonDeficit(TpH); |
|
510 //console.log("frac: "+frac+" acid: "+acid+" protonDeficit: "+protonDeficit); |
|
511 //total_alkalinity -= 50 / 61 * protonDeficit * frac / liters; |
|
512 |
|
513 $('#wb_calcium').val(Math.round(calcium * 10) / 10); |
|
514 $('#wb_magnesium').val(Math.round(magnesium * 10) / 10); |
|
515 $('#wb_sodium').val(Math.round(sodium * 10) / 10); |
|
516 $('#wb_sulfate').val(Math.round(sulfate * 10) / 10); |
|
517 $('#wb_chloride').val(Math.round(chloride * 10) / 10); |
|
518 $('#wb_total_alkalinity').val(Math.round(total_alkalinity * 10) / 10); |
|
519 |
|
520 if (calcium < 40) { |
|
521 setRangeIndicator("calcium", "low"); |
|
522 } else if (calcium > 150) { |
|
523 setRangeIndicator("calcium", "high"); |
|
524 } else { |
|
525 setRangeIndicator("calcium", "normal"); |
|
526 } |
|
527 if (magnesium >= 0 && magnesium <= 30) { |
|
528 setRangeIndicator("magnesium", "normal"); |
|
529 } else { |
|
530 setRangeIndicator("magnesium", "high"); |
|
531 } |
|
532 if (sodium <= 150) { |
|
533 setRangeIndicator("sodium", "normal"); |
|
534 } else { |
|
535 setRangeIndicator("sodium", "high"); |
|
536 } |
|
537 if (chloride <= 100) { |
|
538 setRangeIndicator("chloride", "normal"); |
|
539 } else { |
|
540 setRangeIndicator("chloride", "high"); |
|
541 } |
|
542 if (sulfate <= 350) { |
|
543 setRangeIndicator("sulfate", "normal"); |
|
544 } else { |
|
545 setRangeIndicator("sulfate", "high"); |
|
546 } |
|
547 } |
|
548 |
312 function calcInit () { |
549 function calcInit () { |
313 console.log("calc.init()"); |
550 console.log("calc.init()"); |
314 |
551 |
315 calcSGendMash(); |
552 calcSGendMash(); |
316 calcMashEfficiency(); |
553 calcMashEfficiency(); |
|
554 |
|
555 $("#w1_name").jqxDropDownList('selectItem', dataRecord.w1_name); |
|
556 $("#w2_name").jqxDropDownList('selectItem', dataRecord.w2_name); |
|
557 // Fix tap water if zero using mash infuse amount. |
|
558 if (parseFloat($("#wg_amount").jqxNumberInput('decimal')) == 0 && mash_infuse > 0) { |
|
559 $("#w1_amount").val(mash_infuse); |
|
560 dataRecord.w1_amount = mash_infuse; |
|
561 $("#wg_amount").val(mash_infuse); |
|
562 $("#w2_amount").val(0); |
|
563 dataRecord.w2_amount = 0; |
|
564 } |
|
565 calcWater(); |
|
566 $("#w2_amount").on('change', function (event) { |
|
567 var newval = parseFloat(event.args.value); |
|
568 |
|
569 if (newval > mash_infuse) { |
|
570 $("#w2_amount").val(dataRecord.w2_amount); |
|
571 return; |
|
572 } |
|
573 dataRecord.w1_amount = parseFloat($("#wg_amount").jqxNumberInput('decimal')) - newval; |
|
574 $("#w1_amount").val(dataRecord.w1_amount); |
|
575 dataRecord.w2_amount = newval; |
|
576 console.log("new: "+event.args.value+" w1: "+dataRecord.w1_amount+" w2: "+dataRecord.w2_amount); |
|
577 calcWater(); |
|
578 }); |
|
579 $('#wa_cacl2').on('change', function (event) { |
|
580 setWaterAgent('CaCl2', event.args.value); |
|
581 calcWater(); |
|
582 }); |
|
583 $('#wa_caso4').on('change', function (event) { |
|
584 setWaterAgent('CaSO4', event.args.value); |
|
585 calcWater(); |
|
586 }); |
|
587 $('#wa_mgso4').on('change', function (event) { |
|
588 setWaterAgent('MgSO4', event.args.value); |
|
589 calcWater(); |
|
590 }); |
|
591 $('#wa_nacl').on('change', function (event) { |
|
592 setWaterAgent('NaCl', event.args.value); |
|
593 calcWater(); |
|
594 }); |
|
595 $('#wa_base_name').on('change', function (event) { |
|
596 setWaterAgent(last_base, 0); |
|
597 last_base = event.args.item.value; |
|
598 setWaterAgent(last_base, parseFloat($("#wa_base").jqxNumberInput('decimal'))); |
|
599 calcWater(); |
|
600 }); |
|
601 $('#wa_base').on('change', function (event) { |
|
602 setWaterAgent($("#wa_base_name").val(), parseFloat(event.args.value)); |
|
603 calcWater(); |
|
604 }); |
|
605 $('#wa_acid_name').on('change', function (event) { |
|
606 setWaterAgent(last_acid, 0); |
|
607 last_acid = event.args.item.value; |
|
608 setWaterAgent(last_acid, parseFloat($("#wa_acid").jqxNumberInput('decimal'))); |
|
609 calcWater(); |
|
610 }); |
|
611 $('#wa_acid').on('change', function (event) { |
|
612 setWaterAgent($("#wa_acid_name").val(), parseFloat(event.args.value)); |
|
613 calcWater(); |
|
614 }); |
|
615 $('#wa_acid_perc').on('change', function (event) { calcWater(); }); |
|
616 |
|
617 $('#color_method').on('change', function (event) { calcFermentables(); }); |
|
618 $('#ibu_method').on('change', function (event) { |
|
619 calcFermentables(); |
|
620 calcIBUs(); |
|
621 }); |
317 |
622 |
318 $('#batch_size').on('change', function (event) { |
623 $('#batch_size').on('change', function (event) { |
319 console.log("batch_size change:"+event.args.value+" old:"+dataRecord.batch_size); |
624 console.log("batch_size change:"+event.args.value+" old:"+dataRecord.batch_size); |
320 var new_boil = parseFloat(event.args.value) + dataRecord.boil_size - dataRecord.batch_size; |
625 var new_boil = parseFloat(event.args.value) + dataRecord.boil_size - dataRecord.batch_size; |
321 dataRecord.boil_size = new_boil; |
626 dataRecord.boil_size = new_boil; |