'use strict';
var _ = require('lodash');
var times = require('../times');
var Storages = require('js-storage');
function init (client, $) {
var boluscalc = {};
var translate = client.translate;
var storage = Storages.localStorage;
var iob = client.plugins('iob');
var cob = client.plugins('cob');
var eventTime = $('#bc_eventTimeValue');
var eventDate = $('#bc_eventDateValue');
var quickpicks = [];
var foods = [];
var icon_remove = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACrElEQVQ4T42Ty2sTQRzHv5tmk2yyjRNtpfZhL8V6s2KoUNC2XqwgaCsVQcGiFqpHi0c9iRdR/ANE9KR40FIQX4cueKoPaKFoLdSYNtE0abKT1+5s9iW7aUMiHtzTzO7v85md+c6PA4DrHbsPCKIgOWO1pA7dT6YXnXH949SE/F63pqwZtRrO+SCKgjQ5NUV+azpmHj2krMwaJC4c8Erj+/eRyloMMwWFKgbn1nC3ervlK1evkXBLGBZT8SOewotnTylTNLdgeg/pDgZDC2cPHSR8bB22DVC9hFe0SG/H0xFXcHlykjRHRDBWgJcZSCY38Xx2lhqMnRYE34Px/sN9vlQWeoHBAx2yXsRruVAVuFsIBaSJ8+eJGPaBqQV4NROJjTzez89jLBoFn6FgybQL54wS3uTyVDFQ3cL2IYpBv3RhdJSIIQ80tQyv7gEqJvS8AmUlBs7UXPhtjtZgh3UFNYngk86NHCfNAg9dMwHVBPu+CpsVkTXKeJeVG+AGgTOZ3tt6MSKKjy+NjEBjFrR4ElZmA4pdxstMFsyyJu6tZZ7Ux9vwB6EAL50ZGiRECEPPUOixVTRxHlicgSVWxEdZpuZWfNuS2hk48NjwMIkIYZglBnV5Cbqtws/5IaAJmsfCglrEl2y2QeKmEBJ80tixKmxrFpSVr0gV0viQoxho2YUuPohmeFD22PiklLC4ma5JuBvdrfLJI0dJd0s7bM0ES8aR/BXDXGaTskqlL+D3Lwy0tZEePoAd4EA5YF4tYymdonfjmQh3s6dTPjU4SHYGwjAKecSXFyGlM1TdytntE56T+ts7SC/vhw3gm6njc2Kd3vm5Ub1IwQAvnYhGiZpYw1wiWYPrIw7wnBTt7CLOOwdmut14kQQvqt24tfK/utGR6LaF+iRqMf4N/O/8D28HiiCRYqzAAAAAAElFTkSuQmCC';
function roundTo (x, step) {
if (x) {
return Math.round(x / step) * step;
}
return 0;
}
function maybePrevent (event) {
if (event) {
event.preventDefault();
}
}
function isProfileEnabled (profiles) {
return client.settings.enable.indexOf('profile') > -1 &&
client.settings.extendedSettings.profile &&
client.settings.extendedSettings.profile.multiple &&
profiles.length > 1;
}
function isTouch () {
try { document.createEvent('TouchEvent'); return true; } catch (e) { return false; }
}
function setDateAndTime (time) {
time = time || new Date();
eventTime.val(time.getHours() + ":" + time.getMinutes());
eventDate.val(time.toISOString().split('T')[0]);
}
function mergeDateAndTime () {
return client.utils.mergeInputTime(eventTime.val(), eventDate.val());
}
function updateTime (ele, time) {
ele.attr('oldminutes', time.minutes());
ele.attr('oldhours', time.hours());
}
function setBG (sgv, selectedTime) {
var sensorbg = 0;
boluscalc.oldbg = false;
if (sgv) {
sensorbg = sgv.mgdl;
if (sensorbg < 39) {
sensorbg = 0;
} else {
sensorbg = client.utils.scaleMgdl(sensorbg);
}
if (selectedTime.getTime() - sgv.mills > 10 * 60 * 1000) {
boluscalc.oldbg = true; // Do not use if record is older than 10 min
sensorbg = 0;
}
}
// Set BG
if ($('#bc_bgfromsensor').is(':checked')) {
$('#bc_bg').val(sensorbg ? sensorbg : '');
}
}
boluscalc.updateVisualisations = function updateVisualisations (sbx) {
// update BG in GUI
setBG(sbx.lastSGVEntry(), mergeDateAndTime().toDate());
if (client.browserUtils.getLastOpenedDrawer !== '#boluscalcDrawer') {
return;
}
if ($('#bc_nowtime').is(':checked')) {
// Update time
setDateAndTime();
boluscalc.calculateInsulin();
}
};
boluscalc.dateTimeFocus = function dateTimeFocus (event) {
$('#bc_othertime').prop('checked', true);
updateTime($(this), mergeDateAndTime());
maybePrevent(event);
};
boluscalc.dateTimeChange = function dateTimeChange (event) {
$('#bc_othertime').prop('checked', true);
// client.utils.setYAxisOffset(50); //50% of extend
var ele = $(this);
var merged = mergeDateAndTime();
if (ele.attr('oldminutes') === '59' && merged.minutes() === 0) {
merged.add(1, 'hours');
}
if (ele.attr('oldminutes') === '0' && merged.minutes() === 59) {
merged.add(-1, 'hours');
}
setDateAndTime(merged);
updateTime(ele, merged);
boluscalc.eventTimeTypeChange();
// update BG from sgv to this time
setBG(findClosestSGVToPastTime(merged.toDate()), merged.toDate());
boluscalc.calculateInsulin();
maybePrevent(event);
};
boluscalc.eventTimeTypeChange = function eventTimeTypeChange (event) {
if ($('#bc_othertime').is(':checked')) {
$('#bc_eventTimeValue').focus();
$('#bc_retro').css('display', '');
if (mergeDateAndTime() < Date.now()) {
$('#bc_retro').css('background-color', 'red').text(translate('RETRO MODE'));
} else if (mergeDateAndTime() > Date.now()) {
$('#bc_retro').css('background-color', 'blue').text(translate('IN THE FUTURE'));
} else {
$('#bc_retro').css('display', 'none');
}
} else {
$('#bc_retro').css('display', 'none');
setDateAndTime();
boluscalc.updateVisualisations(client.sbx);
if (event) {
boluscalc.calculateInsulin();
}
// Nightscout.utils.setYAxisOffset(50); //50% of extend
// Nightscout.utils.updateBrushToTime(Nightscout.utils.mergeInputTime($('#bc_eventTimeValue').val(), $('#bc_eventDateValue').val()).toDate());
}
maybePrevent(event);
};
boluscalc.toggleDrawer = function toggleDrawer (event) {
boluscalc.prepare();
client.browserUtils.toggleDrawer('#boluscalcDrawer');
maybePrevent(event);
};
boluscalc.prepare = function prepare () {
foods = [];
$('#bc_profile').empty();
var profiles = client.profilefunctions.listBasalProfiles();
profiles.forEach(function(p) {
$('#bc_profile').append('');
});
$('#bc_profileLabel').toggle(isProfileEnabled(profiles));
$('#bc_usebg').prop('checked', 'checked');
$('#bc_usecarbs').prop('checked', 'checked');
$('#bc_usecob').prop('checked', '');
$('#bc_useiob').prop('checked', 'checked');
$('#bc_bgfromsensor').prop('checked', 'checked');
$('#bc_carbs').val('');
$('#bc_quickpick').val(-1);
$('#bc_preBolus').val(0);
$('#bc_notes').val('');
$('#bc_enteredBy').val(Storages.localStorage.get('enteredBy') || '');
$('#bc_nowtime').prop('checked', true);
$('#bc_othercorrection').val(0);
$('#bc_profile').val(client.profilefunctions.activeProfileToTime());
setDateAndTime();
boluscalc.eventTimeTypeChange();
boluscalc.updateVisualisations(client.sbx);
boluscalc.calculateInsulin();
};
boluscalc.calculateInsulin = function calculateInsulin (event) {
maybePrevent(event);
boluscalc.gatherBoluscalcData();
boluscalc.updateGui(boluscalc.record);
return boluscalc.record;
};
boluscalc.updateGui = function updateGui (record) {
record = record || boluscalc.record;
if (record.eventTime === undefined) {
return;
}
var targetBGLow = record.targetBGLow;
var targetBGHigh = record.targetBGHigh;
var isf = record.isf;
var ic = record.ic;
// Clear results before calculation
$('#bc_insulintotal').text('0.00');
$('#bc_carbsneeded').text('0.00');
$('#bc_inzulinbg').text('0.00');
$('#bc_inzulincarbs').text('0.00');
// Show IOB
if ($('#bc_useiob').is(':checked')) {
$('#bc_iob').text((record.iob > 0 ? '-' : '') + record.iob.toFixed(2));
} else {
$('#bc_iob').text('');
}
// Show COB
if ($('#bc_usecob').is(':checked')) {
$('#bc_cob').text(record.cob.toFixed(2));
$('#bc_cobu').text(record.insulincob.toFixed(2));
} else {
$('#bc_cob').text('');
$('#bc_cobu').text('');
}
// Show BG
if ($('#bc_usebg').is(':checked')) {
if (record.bg === 0 || (boluscalc.oldbg && $('#bc_bgfromsensor').is(':checked'))) {
$('#bc_bg').css('background-color', 'red');
} else {
$('#bc_bg').css('background-color', '');
}
$('#bc_inzulinbg').text(record.insulinbg.toFixed(2));
$('#bc_inzulinbg').attr('title'
, 'Target BG range: ' + targetBGLow + ' - ' + targetBGHigh +
'\nISF: ' + isf +
'\nBG diff: ' + record.bgdiff.toFixed(1)
);
} else {
$('#bc_inzulinbgtd').css('background-color', '');
$('#bc_bg').css('background-color', '');
$('#bc_inzulinbg').text('');
$('#bc_inzulinbg').attr('title', '');
}
// Show foods
if (record.foods.length) {
var html = '
';
var carbs = 0;
for (var fi = 0; fi < record.foods.length; fi++) {
/* eslint-disable-next-line security/detect-object-injection */ // verified false positive
var f = record.foods[fi];
carbs += f.carbs * f.portions;
html += '
';
html += '
';
if ($('#bc_quickpick').val() < 0) { // do not allow deleting while quickpick active
html += '';
}
html += '