724 lines
		
	
	
		
			No EOL
		
	
	
		
			29 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			724 lines
		
	
	
		
			No EOL
		
	
	
		
			29 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| let currentPumpData;
 | |
| let selectedFuelType;
 | |
| let fuelTypeWarnSent;
 | |
| 
 | |
| // Fuel Consumption Chart Dialog
 | |
| let fuelChart, speedChart, consumptionChart;
 | |
| let toggleChartFocusShortcut;
 | |
| let chartTimestampsIndex = 1;
 | |
| let chartTimestamps = [ 15, 30, 60, 90, 120, 150, 180 ];
 | |
| let isRecording;
 | |
| 
 | |
| window.addEventListener("message", async function(event) {
 | |
|     const item = event.data;
 | |
|     if (item.data) {
 | |
|         currentPumpData = item.data;
 | |
|     }
 | |
|     if (item.resourceName) {
 | |
|         Utils.setResourceName(item.resourceName);
 | |
|     }
 | |
|     if (item.utils) {
 | |
|         await Utils.loadLanguageModules(item.utils);
 | |
|         Utils.post("setNuiVariablesLoaded", null, "setNuiVariablesLoaded");
 | |
|     }
 | |
|     if (item.type === "copyToClipboard") {
 | |
|         const el = document.createElement("textarea");
 | |
|         el.value = item.text;
 | |
|         document.body.appendChild(el);
 | |
|         el.select();
 | |
|         document.execCommand("copy");
 | |
|         document.body.removeChild(el);
 | |
|     }
 | |
|     if (item.openMainUI) {
 | |
|         if (currentPumpData.isElectric) {
 | |
|             $("#electric-time-to-recharge").html(`${Utils.translate("electricInterface.chargerAmount.timeToRechargeText")} <span id="electric-time-to-recharge-value"></span>`);
 | |
| 
 | |
|             $("#electric-charger-type-title").text(Utils.translate("electricInterface.chargerType.title"));
 | |
|             $("#electric-charger-type-fast").text(Utils.translate("electricInterface.chargerType.fast.title"));
 | |
|             $("#electric-charger-type-normal").text(Utils.translate("electricInterface.chargerType.normal.title"));
 | |
|             $("#electric-charger-type-label-item-fast-price").text(Utils.translate("electricInterface.chargerType.pricePerKWh").format(Utils.currencyFormat(currentPumpData.pricePerLiter.electricfast)));
 | |
|             $("#electric-charger-type-label-item-normal-price").text(Utils.translate("electricInterface.chargerType.pricePerKWh").format(Utils.currencyFormat(currentPumpData.pricePerLiter.electricnormal)));
 | |
|             $("#electric-charger-type-label-item-fast-power").text(Utils.translate("electricInterface.chargerType.fast.power"));
 | |
|             $("#electric-charger-type-label-item-normal-power").text(Utils.translate("electricInterface.chargerType.normal.power"));
 | |
|             $("#electric-charger-continue-type-button").text(Utils.translate("electricInterface.continueButton"));
 | |
| 
 | |
|             $("#electric-charger-amount-title").text(Utils.translate("electricInterface.chargerAmount.title"));
 | |
|             $("#electric-charger-amount-input").attr("placeholder", Utils.translate("electricInterface.chargerAmount.placeholder"));
 | |
|             $("#electric-charger-continue-amount-button").text(Utils.translate("electricInterface.continueButton"));
 | |
| 
 | |
|             $("#electric-charger-payment-title").text(Utils.translate("electricInterface.chargerPayment.title"));
 | |
|             $("#electric-charger-payment-bank").text(Utils.translate("electricInterface.chargerPayment.bank"));
 | |
|             $("#electric-charger-payment-money").text(Utils.translate("electricInterface.chargerPayment.money"));
 | |
| 
 | |
|             if (currentPumpData.stationStock.electricfast == 0) {
 | |
|                 $("#electric-charger-fast-label-wrapper")
 | |
|                     .attr("data-tooltip", Utils.translate("electricInterface.outOfStock"))
 | |
|                     .attr("data-tooltip-location", "top");
 | |
|                 $("#charger-type-fast").prop("disabled", true);
 | |
|             } else {
 | |
|                 $("#electric-charger-fast-label-wrapper")
 | |
|                     .removeAttr("data-tooltip")
 | |
|                     .removeAttr("data-tooltip-location");
 | |
|                 $("#charger-type-fast").prop("disabled", false);
 | |
|             }
 | |
| 
 | |
|             if (currentPumpData.stationStock.electricnormal == 0) {
 | |
|                 $("#electric-charger-normal-label-wrapper")
 | |
|                     .attr("data-tooltip", Utils.translate("electricInterface.outOfStock"))
 | |
|                     .attr("data-tooltip-location", "top");
 | |
|                 $("#charger-type-normal").prop("disabled", true);
 | |
|             } else {
 | |
|                 $("#electric-charger-normal-label-wrapper")
 | |
|                     .removeAttr("data-tooltip")
 | |
|                     .removeAttr("data-tooltip-location");
 | |
|                 $("#charger-type-normal").prop("disabled", false);
 | |
|             }
 | |
| 
 | |
|             $(".electric-charger-type-container").css("display", "");
 | |
|             $(".electric-charger-amount-container").css("display", "none");
 | |
|             $(".electric-charger-payment-container").css("display", "none");
 | |
|             $("#electric-charger-container").fadeIn(200);
 | |
|         } else {
 | |
|             if (currentPumpData.pumpModel == "prop_gas_pump_1a" || currentPumpData.pumpModel == "prop_gas_pump_1b" || currentPumpData.pumpModel == "prop_gas_pump_1c" || currentPumpData.pumpModel == "prop_gas_pump_1d") {
 | |
|                 $("#gas-pump-container-image").attr("src", `images/${currentPumpData.pumpModel}.png`);
 | |
|             } else {
 | |
|                 $("#gas-pump-container-image").attr("src", `images/prop_gas_pump_1b.png`);
 | |
|             }
 | |
|             fuelTypeWarnSent = false;
 | |
|             changeSelectedFuelType(currentPumpData.currentFuelType);
 | |
|             $(".vehicle-fuel").text(Utils.translate("pumpInterface.vehicleFuel").format(`${Utils.numberFormat(currentPumpData.vehicleFuel, 1)} / ${Utils.numberFormat(currentPumpData.vehicleTankSize, 0)}`));
 | |
|             $(".vehicle-fuel").attr("data-tooltip", Utils.translate("pumpInterface.vehicleFuelTooltip"));
 | |
|             $(".bank-balance").text(Utils.currencyFormat(currentPumpData.bankBalance, 2));
 | |
|             $(".cash-balance").text(Utils.currencyFormat(currentPumpData.cashBalance, 2));
 | |
| 
 | |
|             $(".fuel-type-button.regular").text(Utils.translate("pumpInterface.fuelTypes.regular"));
 | |
|             $(".fuel-type-button.plus").text(Utils.translate("pumpInterface.fuelTypes.plus"));
 | |
|             $(".fuel-type-button.premium").text(Utils.translate("pumpInterface.fuelTypes.premium"));
 | |
|             $(".fuel-type-button.diesel").text(Utils.translate("pumpInterface.fuelTypes.diesel"));
 | |
|             $(".confirm-button").text(Utils.translate("pumpInterface.confirm"));
 | |
| 
 | |
|             $("#confirm-refuel-payment-modal-title").text(Utils.translate("confirmRefuelModal.title"));
 | |
|             $("#confirm-refuel-payment-modal-pay-bank").text(Utils.translate("confirmRefuelModal.paymentBank"));
 | |
|             $("#confirm-refuel-payment-modal-pay-cash").text(Utils.translate("confirmRefuelModal.paymentCash"));
 | |
| 
 | |
|             $("#confirm-jerry-can-payment-modal-title").text(Utils.translate("confirmBuyJerryCanModal.title"));
 | |
|             $("#confirm-jerry-can-payment-modal-desc").text(Utils.currencyFormat(currentPumpData.jerryCan.price, 2));
 | |
|             $("#confirm-jerry-can-payment-modal-pay-bank").text(Utils.translate("confirmBuyJerryCanModal.paymentBank"));
 | |
|             $("#confirm-jerry-can-payment-modal-pay-cash").text(Utils.translate("confirmBuyJerryCanModal.paymentCash"));
 | |
| 
 | |
|             $("#confirm-fuel-type-modal-title").text(Utils.translate("confirmFuelChangeModal.title"));
 | |
|             $("#confirm-fuel-type-modal-desc").text(Utils.translate("confirmFuelChangeModal.description"));
 | |
|             $("#confirm-fuel-type-modal-confirm").text(Utils.translate("confirmation_modal_confirm_button"));
 | |
|             $("#confirm-fuel-type-modal-cancel").text(Utils.translate("confirmation_modal_cancel_button"));
 | |
| 
 | |
|             if (!currentPumpData.jerryCan.enabled) {
 | |
|                 $(".gas-pump-interactive-button").css("display", "none");
 | |
|             }
 | |
| 
 | |
|             updateFuelAmountDisplay(true);
 | |
| 
 | |
|             $("#gas-pump-container").fadeIn(200);
 | |
|         }
 | |
|     }
 | |
|     if (item.hideMainUI) {
 | |
|         $("#gas-pump-container").fadeOut(200);
 | |
|         $("#electric-charger-container").fadeOut(200);
 | |
|     }
 | |
|     if (item.showRefuelDisplay) {
 | |
|         if (item.isElectric) {
 | |
|             let percentageOfTankFilled = (item.currentDisplayFuelAmount / item.currentVehicleTankSize) * 100;
 | |
|             $("#recharge-display-title").text(Utils.translate("rechargerDisplay.title"));
 | |
|             $("#recharge-display-battery-level-span").text(`${Utils.numberFormat(percentageOfTankFilled, 0)}%`);
 | |
|             $("#recharge-display-battery-liquid").css("width", `${percentageOfTankFilled}%`);
 | |
|             $("#recharge-display-remaining-time-title").text(Utils.translate("rechargerDisplay.remainingTimeText"));
 | |
|             updateRechargeDisplay((item.currentVehicleTankSize - item.currentDisplayFuelAmount), item.fuelTypePurchased);
 | |
|             $("#recharge-display").fadeIn(200);
 | |
|         } else {
 | |
|             $("#refuel-display-pump-value").text(Utils.numberFormat(item.remainingFuelAmount, 2));
 | |
|             $("#refuel-display-car-value").text(`${Utils.numberFormat(item.currentDisplayFuelAmount, 2)}/${Utils.numberFormat(item.currentVehicleTankSize, 2)}`);
 | |
|             $(".refuel-display-liters").text(Utils.translate("pumpRefuelDisplay.liters"));
 | |
|             $("#refuel-display-car-label").text(Utils.translate("pumpRefuelDisplay.carTank"));
 | |
|             $("#refuel-display-pump-label").text(Utils.translate("pumpRefuelDisplay.remaining"));
 | |
|             $("#refuel-display").fadeIn(200);
 | |
|         }
 | |
|     }
 | |
|     if (item.hideRefuelDisplay) {
 | |
|         $("#refuel-display").fadeOut(200);
 | |
|         $("#recharge-display").fadeOut(200);
 | |
|     }
 | |
|     if (item.showFuelConsumptionChart) {
 | |
|         toggleChartFocusShortcut = item.focusShortcut;
 | |
|         isRecording = item.isRecording;
 | |
| 
 | |
|         createFuelConsumptionChartObject();
 | |
|         openFuelConsumptionChart();
 | |
|         setFuelConsumptionChartPosition(item.position);
 | |
|         updateFuelConsumptionChart({ fuel: null, speed: null, consumption: null });
 | |
|     }
 | |
|     if (item.updateFuelConsumptionChart) {
 | |
|         updateFuelConsumptionChart(item.fuelConsumptionData);
 | |
|     }
 | |
|     if (item.hideFuelConsumptionChart) {
 | |
|         updateFuelConsumptionChart({ fuel: null, speed: null, consumption: null });
 | |
|         $("#chart-dialog").fadeOut();
 | |
|         // fuelChart.destroy();
 | |
|         // speedChart.destroy();
 | |
|         // consumptionChart.destroy();
 | |
|     }
 | |
| });
 | |
| 
 | |
| function updateRechargeDisplay(remainingFuelAmount, chargerType) {
 | |
|     if (chargerType == "electricfast") chargerType = "fast";
 | |
|     if (chargerType == "electricnormal") chargerType = "normal";
 | |
|     if (chargerType && (chargerType === "fast" || chargerType === "normal")) {
 | |
|         // Calculate the time to recharge based on remaining fuel amount and charger type's time per unit
 | |
|         let timeToRecharge = remainingFuelAmount * currentPumpData.electric.chargeTypes[chargerType].time;
 | |
| 
 | |
|         // Convert time to minutes and seconds
 | |
|         let timeToRechargeMinutes = Math.floor(timeToRecharge / 60);
 | |
|         let timeToRechargeSeconds = timeToRecharge % 60;
 | |
| 
 | |
|         // Update the display with calculated time
 | |
|         $("#recharge-display-remaining-time-value").text(Utils.translate("rechargerDisplay.remainingTimeValue").format(Utils.numberFormat(timeToRechargeMinutes, 0), Utils.numberFormat(timeToRechargeSeconds, 0)));
 | |
|     } else {
 | |
|         console.log("Invalid charger type or no charger type selected");
 | |
|     }
 | |
| }
 | |
| 
 | |
| /*=================
 | |
| 	FUNCTIONS
 | |
| =================*/
 | |
| 
 | |
| function changeSelectedFuelType(fuelType) {
 | |
|     if (fuelType == "regular" || fuelType == "plus" || fuelType == "premium" || fuelType == "diesel") {
 | |
|         $(".fuel-type-button").removeClass("selected");
 | |
|         $(`.fuel-type-button.${fuelType}`).addClass("selected");
 | |
| 
 | |
|         $(".price-per-liter").text(Utils.currencyFormat(currentPumpData.pricePerLiter[fuelType], 2));
 | |
|         $(".station-stock").text(Utils.translate("pumpInterface.stationStock").format(Utils.numberFormat(currentPumpData.stationStock[fuelType])));
 | |
|         selectedFuelType = fuelType;
 | |
|     } else {
 | |
|         console.log("Invalid fuel type chosen: " + fuelType);
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Show the modal when confirmRefuel is called
 | |
| function confirmRefuel() {
 | |
|     if (fuelTypeWarnSent == false && currentPumpData.currentFuelType != selectedFuelType && currentPumpData.vehicleFuel > 0) {
 | |
|         fuelTypeWarnSent = true;
 | |
|         $("#confirm-fuel-type-modal").fadeIn();
 | |
|     } else {
 | |
|         let $input = $("#input-fuel-amount");
 | |
|         let fuelAmount = parseInt($input.val());
 | |
|         $("#confirm-refuel-payment-modal-desc").text(Utils.translate("confirmRefuelModal.description").format(fuelAmount, Utils.translate("pumpInterface.fuelTypes."+selectedFuelType), Utils.currencyFormat(fuelAmount * currentPumpData.pricePerLiter[selectedFuelType])));
 | |
|         $("#confirm-refuel-payment-modal").fadeIn();
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Empty vehicle's tank after user confirm fuel type change
 | |
| function changeVehicleFuelType() {
 | |
|     closeModal();
 | |
|     Utils.post("changeVehicleFuelType", { selectedFuelType });
 | |
|     currentPumpData.vehicleFuel = 0;
 | |
|     $(".vehicle-fuel").text(Utils.translate("pumpInterface.vehicleFuel").format(Utils.numberFormat(currentPumpData.vehicleFuel, 2)));
 | |
| }
 | |
| 
 | |
| // Confirm the buy jerry can action
 | |
| function openBuyJerryCanModal() {
 | |
|     closeModal();
 | |
|     $("#confirm-jerry-can-payment-modal").fadeIn();
 | |
| }
 | |
| 
 | |
| // Hide the modal
 | |
| function closeModal() {
 | |
|     $(".modal").fadeOut();
 | |
| }
 | |
| 
 | |
| function confirmRefuelPayment(paymentMethod) {
 | |
|     let $input = $("#input-fuel-amount");
 | |
|     let fuelAmount = parseInt($input.val());
 | |
|     Utils.post("confirmRefuel", { selectedFuelType, fuelAmount, paymentMethod });
 | |
|     closeModal();
 | |
| }
 | |
| 
 | |
| function confirmJerryCanPayment(paymentMethod) {
 | |
|     Utils.post("confirmJerryCanPurchase", { paymentMethod });
 | |
|     closeModal();
 | |
| }
 | |
| 
 | |
| function increaseZoom() {
 | |
|     // Get the current zoom level
 | |
|     let currentZoom = parseFloat($("#gas-pump-container").css("zoom")) || 1;
 | |
| 
 | |
|     // Increase zoom by 5%
 | |
|     let newZoom = currentZoom + 0.05;
 | |
| 
 | |
|     // Limit the zoom to a maximum of 1.4 (140%)
 | |
|     if (newZoom > 1.4) {
 | |
|         newZoom = 1.4;
 | |
|     }
 | |
| 
 | |
|     // Apply the new zoom level
 | |
|     $("#gas-pump-container").css("zoom", newZoom);
 | |
| }
 | |
| 
 | |
| function decreaseZoom() {
 | |
|     // Get the current zoom level
 | |
|     let currentZoom = parseFloat($("#gas-pump-container").css("zoom")) || 1;
 | |
| 
 | |
|     // Decrease zoom by 5%
 | |
|     let newZoom = currentZoom - 0.05;
 | |
| 
 | |
|     // Limit the zoom to a minimum of 0.8 (80%)
 | |
|     if (newZoom < 0.8) {
 | |
|         newZoom = 0.8;
 | |
|     }
 | |
| 
 | |
|     // Apply the new zoom level
 | |
|     $("#gas-pump-container").css("zoom", newZoom);
 | |
| }
 | |
| 
 | |
| // Function to update the display with the 'L' suffix
 | |
| function updateFuelAmountDisplay(setToMax = false) {
 | |
|     let $input = $("#input-fuel-amount");
 | |
|     let value = parseInt($input.val());
 | |
| 
 | |
|     // Set value to 1 if it's not a positive number
 | |
|     if (isNaN(value) || value <= 0) {
 | |
|         value = 1;
 | |
|     }
 | |
| 
 | |
|     // Don't let it purchase more L than the vehicle can hold in the tank
 | |
|     if (setToMax || (!isNaN(value) && value > currentPumpData.vehicleTankSize - currentPumpData.vehicleFuel)) {
 | |
|         value = Math.floor(currentPumpData.vehicleTankSize - currentPumpData.vehicleFuel);
 | |
|     }
 | |
| 
 | |
|     $input.val(value + " L");
 | |
| }
 | |
| 
 | |
| // Pagination for electric chargers
 | |
| function chargerTypeContinue() {
 | |
|     let chargerType = getSelectedChargerType();
 | |
|     if (chargerType && (chargerType == "fast" || chargerType == "normal")) {
 | |
|         $("#electric-charger-amount-input").val(Math.floor(currentPumpData.vehicleTankSize - currentPumpData.vehicleFuel));
 | |
|         calculateTimeToRecharge();
 | |
|         $("#electric-charger-amount-type-selected").text(Utils.translate("electricInterface.chargerAmount.typeSelected").format(Utils.translate(`electricInterface.chargerType.${chargerType}.title`)));
 | |
|         $(".electric-charger-type-container").css("display", "none");
 | |
|         $(".electric-charger-amount-container").css("display", "");
 | |
|     }
 | |
| }
 | |
| 
 | |
| function chargerAmountContinue() {
 | |
|     let $input = $("#electric-charger-amount-input");
 | |
|     let currentValue = parseInt($input.val()) || 0;
 | |
|     let newWidthPercentage = ((currentPumpData.vehicleFuel / currentPumpData.vehicleTankSize) * 100) + ((currentValue / currentPumpData.vehicleTankSize) * 100);
 | |
| 
 | |
|     if (currentValue <= 0 || newWidthPercentage > 100) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     let chargerType = getSelectedChargerType();
 | |
|     $("#electric-charger-pay-button").text(Utils.translate("electricInterface.chargerPayment.payButton").format(Utils.currencyFormat(currentValue * currentPumpData.pricePerLiter["electric"+chargerType], 2)));
 | |
|     $(".electric-charger-amount-container").css("display", "none");
 | |
|     $(".electric-charger-payment-container").css("display", "");
 | |
| }
 | |
| 
 | |
| function chargerAmountReturn() {
 | |
|     $(".electric-charger-type-container").css("display", "");
 | |
|     $(".electric-charger-amount-container").css("display", "none");
 | |
|     $(".electric-charger-payment-container").css("display", "none");
 | |
| }
 | |
| 
 | |
| function confirmRecharge() {
 | |
|     let $input = $("#electric-charger-amount-input");
 | |
|     let fuelAmount = parseInt($input.val()) || 0;
 | |
|     Utils.post("confirmRefuel", { selectedFuelType: "electric" + getSelectedChargerType(), fuelAmount, paymentMethod: getSelectedElectricPaymentMethod() });
 | |
| }
 | |
| 
 | |
| function chargerPaymentReturn() {
 | |
|     $(".electric-charger-type-container").css("display", "none");
 | |
|     $(".electric-charger-amount-container").css("display", "");
 | |
|     $(".electric-charger-payment-container").css("display", "none");
 | |
| }
 | |
| 
 | |
| function getSelectedChargerType() {
 | |
|     const selectedInput = $("input[name='charger-type']:checked");
 | |
|     return selectedInput.length && !selectedInput.prop("disabled") ? selectedInput.val() : null;
 | |
| }
 | |
| 
 | |
| function getSelectedElectricPaymentMethod() {
 | |
|     const selectedInput = $("input[name='charger-payment']:checked");
 | |
|     return selectedInput.length ? selectedInput.val() : null;
 | |
| }
 | |
| 
 | |
| function calculateTimeToRecharge() {
 | |
|     let $input = $("#electric-charger-amount-input");
 | |
|     let currentValue = parseInt($input.val());
 | |
| 
 | |
|     // Allow empty input temporarily; validate only non-empty values
 | |
|     if ($input.val().trim() === "" || isNaN(currentValue) || currentValue <= 0) {
 | |
|         currentValue = 0;
 | |
|     }
 | |
| 
 | |
|     if (currentValue > 1000) {
 | |
|         currentValue = 1000;
 | |
|         $input.val(currentValue);
 | |
|     }
 | |
| 
 | |
|     let chargerType = getSelectedChargerType();
 | |
|     if (chargerType && (chargerType == "fast" || chargerType == "normal")) {
 | |
|         let timeToRecharge = currentValue * currentPumpData.electric.chargeTypes[chargerType].time;
 | |
| 
 | |
|         // Calculate minutes and seconds
 | |
|         let timeToRechargeMinutes = Math.floor(timeToRecharge / 60);
 | |
|         let timeToRechargeSeconds = timeToRecharge % 60;
 | |
| 
 | |
|         $("#electric-time-to-recharge-value").text(Utils.translate("electricInterface.chargerAmount.timeToRechargeValue").format(Utils.numberFormat(timeToRechargeMinutes, 0), Utils.numberFormat(timeToRechargeSeconds, 0)));
 | |
| 
 | |
|         let newWidthPercentage = ((currentPumpData.vehicleFuel / currentPumpData.vehicleTankSize) * 100) + ((currentValue / currentPumpData.vehicleTankSize) * 100);
 | |
|         $("#electric-amount-progress-bar").css("width", newWidthPercentage + "%");
 | |
| 
 | |
|         if (newWidthPercentage > 100) {
 | |
|             $("#electric-amount-progress-bar").css("background", "red");
 | |
|         } else {
 | |
|             $("#electric-amount-progress-bar").css("background", "");
 | |
|         }
 | |
|     } else {
 | |
|         console.log("No charger type selected");
 | |
|     }
 | |
| }
 | |
| 
 | |
| /*===================
 | |
| 	CHART DIALOG
 | |
| ===================*/
 | |
| 
 | |
| function openFuelConsumptionChart() {
 | |
|     const $dialog = $("#chart-dialog");
 | |
| 
 | |
|     $("#chart-dialog-title").text(Utils.translate("fuelConsumptionChart.title"));
 | |
|     $("#chart-dialog-footer-text").text(Utils.translate("fuelConsumptionChart.footer.focus"));
 | |
|     $("#stepper-chart-recording-input").text(Utils.translate("fuelConsumptionChart.footer.recordsLength").format(chartTimestamps[chartTimestampsIndex]));
 | |
|     $("#start-stop-recording-label").text(Utils.translate("fuelConsumptionChart.footer.toggleRecording"));
 | |
|     $("#start-stop-recording").prop("checked", isRecording);
 | |
| 
 | |
|     $dialog.css({
 | |
|         right: "",
 | |
|         bottom: "",
 | |
|         display: "flex",
 | |
|     }).fadeIn();
 | |
| 
 | |
|     $dialog.draggable({
 | |
|         handle: ".dialog-header",
 | |
|     }).resizable({
 | |
|         minHeight: 450,
 | |
|         minWidth: 300,
 | |
|         maxHeight: $(window).height()*0.8,
 | |
|         maxWidth: $(window).width()*0.8,
 | |
|     });
 | |
|     speedChart.resize();
 | |
|     consumptionChart.resize();
 | |
|     fuelChart.resize();
 | |
| }
 | |
| 
 | |
| function setFuelConsumptionChartPosition(position) {
 | |
|     const $dialog = $("#chart-dialog");
 | |
|     const windowWidth = $(window).width();
 | |
|     const dialogWidth = $dialog.outerWidth();
 | |
| 
 | |
|     let top = 10;
 | |
|     let left;
 | |
| 
 | |
|     // Horizontal position
 | |
|     if (position === "left") {
 | |
|         left = 10;
 | |
|     } else {
 | |
|         left = windowWidth - dialogWidth - 10;
 | |
|     }
 | |
| 
 | |
|     $dialog.css({
 | |
|         top: `${top}px`,
 | |
|         left: `${left}px`,
 | |
|     });
 | |
| }
 | |
| 
 | |
| 
 | |
| function updateFuelConsumptionChart(latestData) {
 | |
|     const now = Date.now();
 | |
| 
 | |
|     if (fuelChart && speedChart && consumptionChart) {
 | |
|         fuelChart.data.datasets[0].data.push({ x: now, y: latestData.fuel });
 | |
|         speedChart.data.datasets[0].data.push({ x: now, y: latestData.speed });
 | |
|         consumptionChart.data.datasets[0].data.push({ x: now, y: latestData.consumption });
 | |
|     }
 | |
|     fuelChart.update("quiet");
 | |
|     speedChart.update("quiet");
 | |
|     consumptionChart.update("quiet");
 | |
| }
 | |
| 
 | |
| function createFuelConsumptionChartObject() {
 | |
|     if (fuelChart || speedChart || consumptionChart) { return; }
 | |
| 
 | |
|     Chart.defaults.color = "rgba(218, 218, 218, 0.73)";
 | |
|     Chart.overrides.line.spanGaps = false;
 | |
| 
 | |
|     const baseOptions = {
 | |
|         responsive: true,
 | |
|         maintainAspectRatio: false,
 | |
|         elements: { point: { radius: 0 } },
 | |
|         animation: false,
 | |
|         interaction: { mode: "index", intersect: false },
 | |
|         plugins: {
 | |
|             legend: {
 | |
|                 position: "bottom",
 | |
|                 labels: { boxWidth: 3, boxHeight: 3 },
 | |
|             },
 | |
|             streaming: {
 | |
|                 frameRate: 10,
 | |
|             },
 | |
|         },
 | |
|         scales: {
 | |
|             x: {
 | |
|                 type: "realtime",
 | |
|                 realtime: {
 | |
|                     duration: 30000,
 | |
|                     refresh: 1000,
 | |
|                     delay: 1000,
 | |
|                 },
 | |
|             },
 | |
|             y: {
 | |
|                 beginAtZero: true,
 | |
|             },
 | |
|         },
 | |
|     };
 | |
| 
 | |
|     // Fuel Chart
 | |
| 
 | |
|     fuelChart = new Chart(document.getElementById("fuel-chart"), {
 | |
|         type: "line",
 | |
|         data: {
 | |
|             datasets: [{
 | |
|                 label: Utils.translate("fuelConsumptionChart.chartLabels.fuel"),
 | |
|                 data: [],
 | |
|                 borderColor: "#FFD800",
 | |
|                 cubicInterpolationMode: "monotone",
 | |
|             }],
 | |
|         },
 | |
|         options: {
 | |
|             ...baseOptions,
 | |
|             scales: {
 | |
|                 ...baseOptions.scales,
 | |
|                 y: {
 | |
|                     ...baseOptions.scales.y,
 | |
|                     suggestedMax: 100,
 | |
|                     title: { display: true, text: Utils.translate("fuelConsumptionChart.chartLabels.fuel") },
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     });
 | |
| 
 | |
|     // Speed Chart
 | |
| 
 | |
|     speedChart = new Chart(document.getElementById("speed-chart"), {
 | |
|         type: "line",
 | |
|         data: {
 | |
|             datasets: [{
 | |
|                 label: Utils.translate("fuelConsumptionChart.chartLabels.speed"),
 | |
|                 data: [],
 | |
|                 borderColor: "#0026FF",
 | |
|                 cubicInterpolationMode: "monotone",
 | |
|             }],
 | |
|         },
 | |
|         options: {
 | |
|             ...baseOptions,
 | |
|             scales: {
 | |
|                 ...baseOptions.scales,
 | |
|                 y: {
 | |
|                     ...baseOptions.scales.y,
 | |
|                     suggestedMax: 140,
 | |
|                     title: { display: true, text: Utils.translate("fuelConsumptionChart.chartLabels.speed") },
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     });
 | |
| 
 | |
|     // Consumption Chart
 | |
| 
 | |
|     consumptionChart = new Chart(document.getElementById("consumption-chart"), {
 | |
|         type: "line",
 | |
|         data: {
 | |
|             datasets: [{
 | |
|                 label: Utils.translate("fuelConsumptionChart.chartLabels.consumption"),
 | |
|                 data: [],
 | |
|                 borderColor: "#7F0000",
 | |
|                 cubicInterpolationMode: "monotone",
 | |
|             }],
 | |
|         },
 | |
|         options: {
 | |
|             ...baseOptions,
 | |
|             scales: {
 | |
|                 ...baseOptions.scales,
 | |
|                 y: {
 | |
|                     ...baseOptions.scales.y,
 | |
|                     suggestedMax: 0.3,
 | |
|                     title: { display: true, text: Utils.translate("fuelConsumptionChart.chartLabels.consumption") },
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     });
 | |
| }
 | |
| 
 | |
| 
 | |
| /*=================
 | |
| 	LISTENERS
 | |
| =================*/
 | |
| 
 | |
| $(window).click(function(event) {
 | |
|     // Close the modal when clicking outside of it
 | |
|     if ($(event.target).is(".modal")) {
 | |
|         closeModal();
 | |
|     }
 | |
| });
 | |
| 
 | |
| $(document).on("keydown", function(event) {
 | |
|     // Handle press of Esc key
 | |
|     if (event.key === "Escape" || event.keyCode === 27) {
 | |
|         // Check if the modal is open by checking if it's visible
 | |
|         if ($("#chart-dialog").is(":visible")) {
 | |
|             closeFuelConsumptionChartUI();
 | |
|         } else if ($(".modal").is(":visible")) {
 | |
|             closeModal();
 | |
|         } else {
 | |
|             closeUI();
 | |
|         }
 | |
|     }
 | |
|     if (event.key === toggleChartFocusShortcut
 | |
|         || event.key === "w" || event.key === "W"
 | |
|         || event.key === "a" || event.key === "A"
 | |
|         || event.key === "d" || event.key === "D"
 | |
|         || event.key === "s" || event.key === "S") {
 | |
|         // Check if the modal is open by checking if it's visible
 | |
|         if ($("#chart-dialog").is(":visible")) {
 | |
|             removeFocusFuelConsumptionChartUI();
 | |
|         }
 | |
|     }
 | |
| });
 | |
| 
 | |
| $(document).ready(function() {
 | |
|     // Handle the add button
 | |
|     $(".refuel-add").click(function() {
 | |
|         let $input = $("#input-fuel-amount");
 | |
|         let currentValue = parseInt($input.val()) || 0;
 | |
|         if (currentValue < Math.floor(currentPumpData.vehicleTankSize - currentPumpData.vehicleFuel)) {
 | |
|             $input.val((currentValue + 1) + " L");
 | |
|         }
 | |
|     });
 | |
|     $(".recharge-add").click(function() {
 | |
|         let $input = $("#electric-charger-amount-input");
 | |
|         let currentValue = parseInt($input.val()) || 0;
 | |
|         if (currentValue < Math.floor(currentPumpData.vehicleTankSize - currentPumpData.vehicleFuel)) {
 | |
|             $input.val((currentValue + 1));
 | |
|             calculateTimeToRecharge();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     // Handle the sub button
 | |
|     $(".refuel-sub").click(function() {
 | |
|         let $input = $("#input-fuel-amount");
 | |
|         let currentValue = parseInt($input.val()) || 0;
 | |
|         if (currentValue > 1) {
 | |
|             $input.val((currentValue - 1) + " L");
 | |
|         }
 | |
|     });
 | |
|     $(".recharge-sub").click(function() {
 | |
|         let $input = $("#electric-charger-amount-input");
 | |
|         let currentValue = parseInt($input.val()) || 0;
 | |
|         if (currentValue > 1) {
 | |
|             $input.val((currentValue - 1));
 | |
|             calculateTimeToRecharge();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     // Remove 'L' suffix on focus to allow numeric input, and add it back on blur
 | |
|     $("#input-fuel-amount").on("focus", function() {
 | |
|         $(this).val(parseInt($(this).val()) || 1);
 | |
|     }).on("blur", function() {
 | |
|         updateFuelAmountDisplay();
 | |
|     });
 | |
| 
 | |
|     // Recalculate time when change input
 | |
|     $("#electric-charger-amount-input").on("input", function() {
 | |
|         calculateTimeToRecharge();
 | |
|     });
 | |
|     $("#electric-charger-amount-input").on("blur", function() {
 | |
|         let $input = $(this);
 | |
|         let currentValue = parseInt($input.val());
 | |
| 
 | |
|         // If invalid, reset to 0
 | |
|         if (isNaN(currentValue) || currentValue <= 0) {
 | |
|             $input.val(0);
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     // Handle chart buttons
 | |
|     $("#start-stop-recording").change(function() {
 | |
|         if ($(this).is(":checked")) {
 | |
|             startRecordingGraph();
 | |
|         } else {
 | |
|             stopRecordingGraph();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     $("#increase-chart-recording").click(function() {
 | |
|         if (chartTimestampsIndex < chartTimestamps.length - 1) {
 | |
|             chartTimestampsIndex++;
 | |
|             $("#stepper-chart-recording-input").text(Utils.translate("fuelConsumptionChart.footer.recordsLength").format(chartTimestamps[chartTimestampsIndex]));
 | |
|             changeRecordingIndexGraph();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     $("#decrease-chart-recording").click(function() {
 | |
|         if (chartTimestampsIndex > 0) {
 | |
|             chartTimestampsIndex--;
 | |
|             $("#stepper-chart-recording-input").text(Utils.translate("fuelConsumptionChart.footer.recordsLength").format(chartTimestamps[chartTimestampsIndex]));
 | |
|             changeRecordingIndexGraph();
 | |
|         }
 | |
|     });
 | |
| });
 | |
| 
 | |
| 
 | |
| /*=================
 | |
| 	CALLBACKS
 | |
| =================*/
 | |
| 
 | |
| function closeUI(){
 | |
|     Utils.post("close","");
 | |
| }
 | |
| 
 | |
| function stopRecordingGraph(){
 | |
|     fuelChart.options.scales.x.realtime.pause = true;
 | |
|     speedChart.options.scales.x.realtime.pause = true;
 | |
|     consumptionChart.options.scales.x.realtime.pause = true;
 | |
|     Utils.post("stopRecordingGraph","");
 | |
| }
 | |
| 
 | |
| function startRecordingGraph(){
 | |
|     fuelChart.options.scales.x.realtime.pause = false;
 | |
|     speedChart.options.scales.x.realtime.pause = false;
 | |
|     consumptionChart.options.scales.x.realtime.pause = false;
 | |
|     Utils.post("startRecordingGraph","");
 | |
| }
 | |
| 
 | |
| function changeRecordingIndexGraph(){
 | |
|     fuelChart.options.scales.x.realtime.duration = chartTimestamps[chartTimestampsIndex] * 1000;
 | |
|     speedChart.options.scales.x.realtime.duration = chartTimestamps[chartTimestampsIndex] * 1000;
 | |
|     consumptionChart.options.scales.x.realtime.duration = chartTimestamps[chartTimestampsIndex] * 1000;
 | |
|     Utils.post("changeRecordingIndexGraph",chartTimestampsIndex);
 | |
| }
 | |
| 
 | |
| function closeFuelConsumptionChartUI(){
 | |
|     Utils.post("closeFuelConsumptionChartUI","");
 | |
| }
 | |
| 
 | |
| function removeFocusFuelConsumptionChartUI(){
 | |
|     Utils.post("removeFocusFuelConsumptionChartUI","");
 | |
| } | 
