if(document.getElementById("constants_clo_density")) {
    window.addEventListener('DOMContentLoaded', (event) => {

        /** ------------------------------------------------------------------------------
        Referencing total calculation values
        ------------------------------------------------------------------------------- **/
        var total_calculation_value_oil = null;
        var total_calculation_value_cylinders = null;
        var total_calculation_combined = null;

        /** ------------------------------------------------------------------------------
        Referencing rendered graphs
        ------------------------------------------------------------------------------- **/
        var canvas_rendered_oil = null;
        var canvas_rendered_cylinder = null;

        /** ------------------------------------------------------------------------------
        Referencing elements - Constants
        ------------------------------------------------------------------------------- **/

        var constants_clo_density = document.getElementById("constants_clo_density").value;
        var constants_estimated_feed_rate_using_hjl = document.getElementById("constants_estimated_feed_rate_using_hjl").value;
        var constants_maximum_allowable_wear = document.getElementById("constants_maximum_allowable_wear").value;
        var constants_expected_wear_rate_after_upgrade = document.getElementById("constants_expected_wear_rate_after_upgrade").value;

        /** ------------------------------------------------------------------------------
        Referencing elements - Navigation
        ------------------------------------------------------------------------------- **/

        var navigation_oilSavingsSVG = document.getElementById("navigation_oilSavingsSVG");
        var navigation_cilinderWearSavingsSVG = document.getElementById("navigation_cilinderWearSavingsSVG");
        var navigation_totalSVG = document.getElementById("navigation_totalSVG");

        /** ------------------------------------------------------------------------------
        Referencing elements - Oil Savings Form
        ------------------------------------------------------------------------------- **/

        var oilSavings_dailyConsumptionAtAverageEngineLoad = document.getElementById("oilSavings_dailyConsumptionAtAverageEngineLoad");
        var oilSavings_averageLoad = document.getElementById("oilSavings_averageLoad");
        var oilSavings_engineMCR = document.getElementById("oilSavings_engineMCR");
        var oilSavings_operatingHours = document.getElementById("oilSavings_operatingHours");
        var oilSavings_lubricationOilPrice = document.getElementById("oilSavings_lubricationOilPrice");
        var oilSavings_remainingVesselLifetime = document.getElementById("oilSavings_remainingVesselLifetime");
        var oilSavings_calculateSavingsButton = document.getElementById("oilSavings_calculateSavingsButton");
        var oilSavings_feedRateReduction = document.getElementById("oilSavings_feedRateReduction");
        var oilSavings_yearlySavings = document.getElementById("oilSavings_yearlySavings");
        var oilSavings_noData = document.getElementById("oilSavings_noData");
        var oilSavings_canvas_holder = document.getElementById("oilSavings_canvas_holder");
        var oilSavings_canvas = document.getElementById("oilSavings_canvas");

        /** ------------------------------------------------------------------------------
        Referencing elements - Oil Savings Form Errors
        ------------------------------------------------------------------------------- **/
        var oilSavings_errors_dailyConsumptionAtAverageEngineLoad = document.getElementById("oilSavings_errors_dailyConsumptionAtAverageEngineLoad");
        var oilSavings_errors_averageLoad = document.getElementById("oilSavings_errors_averageLoad");
        var oilSavings_errors_engineMCR = document.getElementById("oilSavings_errors_engineMCR");
        var oilSavings_errors_operatingHours = document.getElementById("oilSavings_errors_operatingHours");
        var oilSavings_errors_lubricationOilPrice = document.getElementById("oilSavings_errors_lubricationOilPrice");

        /** ------------------------------------------------------------------------------
        Referencing elements - Cylinder Wear Form
        ------------------------------------------------------------------------------- **/

        var cilinderWearSavings_numberOfCilinders = document.getElementById("cilinderWearSavings_numberOfCilinders");
        var cilinderWearSavings_boreSize = document.getElementById("cilinderWearSavings_boreSize");
        var cilinderWearSavings_currentWearRate = document.getElementById("cilinderWearSavings_currentWearRate");
        var cilinderWearSavings_costOfNewLiner = document.getElementById("cilinderWearSavings_costOfNewLiner");
        var cilinderWearSavings_remainingVesselLifetime = document.getElementById("cilinderWearSavings_remainingVesselLifetime");
        var cilinderWearSavings_operatingHours = document.getElementById("cilinderWearSavings_operatingHours");
        var cilinderWearSavings_calculateSavingsButton = document.getElementById("cilinderWearSavings_calculateSavingsButton");
        var cilinderWearSavings_linerLifetime = document.getElementById("cilinderWearSavings_linerLifetime");
        var cilinderWearSavings_currentLinerWear = document.getElementById("cilinderWearSavings_currentLinerWear");
        var cilinderWearSavings_yearlySavings = document.getElementById("cilinderWearSavings_yearlySavings");
        var cilinderWearSavings_noData = document.getElementById("cilinderWearSavings_noData");
        var cilinderWearSavings_canvas_holder = document.getElementById("cilinderWearSavings_canvas_holder");
        var cilinderWearSavings_canvas = document.getElementById("cilinderWearSavings_canvas");

        /** ------------------------------------------------------------------------------
        Referencing elements - Cylinder Wear Form Errors
        ------------------------------------------------------------------------------- **/

        var cilinderWearSavings_errors_numberOfCilinders = document.getElementById("cilinderWearSavings_errors_numberOfCilinders");
        var cilinderWearSavings_errors_boreSize = document.getElementById("cilinderWearSavings_errors_boreSize");
        var cilinderWearSavings_errors_currentWearRate = document.getElementById("cilinderWearSavings_errors_currentWearRate");
        var cilinderWearSavings_errors_costOfNewLiner = document.getElementById("cilinderWearSavings_errors_costOfNewLiner");
        var cilinderWearSavings_errors_remainingVesselLifetime = document.getElementById("cilinderWearSavings_errors_remainingVesselLifetime");
        var cilinderWearSavings_errors_operatingHours = document.getElementById("cilinderWearSavings_errors_operatingHours");
        var cilinderWearSavings_errors_currentLinerWear = document.getElementById("cilinderWearSavings_errors_currentLinerWear");

        /** ------------------------------------------------------------------------------
        Referencing elements - Total savings
        ------------------------------------------------------------------------------- **/

        var total_oilSavingsValue = document.getElementById("total_oilSavingsValue");
        var total_oilSavingsButton = document.getElementById("total_oilSavingsButton");
        var total_cilinderWearSavingsValue = document.getElementById("total_cilinderWearSavingsValue");
        var total_cilinderWearSavingsButton = document.getElementById("total_cilinderWearSavingsButton");
        var total_totalSavings = document.getElementById("total_totalSavings");

        /** ------------------------------------------------------------------------------
        Switching tabs
        ------------------------------------------------------------------------------- **/

        var tabLinks = document.querySelectorAll(".calculator-container li");
        tabLinks.forEach(function(tabLink){
            tabLink.addEventListener("click", function(){

                /** Update navigation */
                document.querySelector(".calculator-container .active").classList.remove("active");
                this.classList.add("active");
                
                /** Show correct tab */
                document.querySelectorAll(".calculator-tab").forEach(function(singleTab) {
                    singleTab.style.display = "none";
                });
                var requestedTab = this.getAttribute("tab");
                document.getElementsByClassName(requestedTab)[0].style.display = requestedTab == "total-savings-tab" ? "block" : "flex";

            });
        });

        /** ------------------------------------------------------------------------------
        Submitting Oil Savings Form 
        ------------------------------------------------------------------------------- **/

        oilSavings_calculateSavingsButton.addEventListener("click", function(event){

            /** Prevent form submission */
            event.preventDefault();

            /** If form data is valid */
            if(validateOilSavingsForm()) {

                /** Calculate Oil Savings */
                var results = calculateOilSavings(
                    constants_clo_density,
                    constants_estimated_feed_rate_using_hjl,
                    oilSavings_dailyConsumptionAtAverageEngineLoad.value,
                    oilSavings_averageLoad.value,
                    oilSavings_engineMCR.value,
                    oilSavings_operatingHours.value,
                    oilSavings_lubricationOilPrice.value
                );

                /** Extract needed values */
                var results_estimated_feed_rate_reduction = results.estimated_feed_rate_reduction;
                var results_estimated_yearly_savings = results.estimated_yearly_savings;
                var results_estimated_total_savings = results.difference;

                /** Update results table */
                oilSavings_feedRateReduction.innerHTML = Math.round(results_estimated_feed_rate_reduction) + "%";
                oilSavings_yearlySavings.innerHTML = "USD " + numberWithCommas(Math.round(results_estimated_yearly_savings));

                /** Generate graph  */
                canvas_rendered_oil = generateGraph(
                    canvas_rendered_oil, 
                    oilSavings_canvas, 
                    results.current_fr, 
                    results.estimated_feed_rate_using_hjl
                );

                /** Hide no data */
                oilSavings_noData.style.display = "none";

                /** Show chart */
                oilSavings_canvas_holder.style.display = "block";

                /** Show checkmark in navigation */
                navigation_oilSavingsSVG.style.display = "inline-block";

                /** Hide calulate button in total savings */
                total_oilSavingsButton.style.display = "none";

                /** Update total value */
                total_oilSavingsValue.innerHTML = " USD " + numberWithCommas(parseFloat(results_estimated_total_savings * oilSavings_remainingVesselLifetime.value).toFixed(2));

                /** Update total calculation value */
                total_calculation_value_oil = results_estimated_total_savings * oilSavings_remainingVesselLifetime.value;

                /** Update total calculation for both fields */
                var obtained_total_calculation = updateTotalCalculationForBothFields(total_calculation_value_oil, total_calculation_value_cylinders);
                if(obtained_total_calculation == "-") {
                    total_totalSavings.innerHTML = obtained_total_calculation;  
                } else {
                    total_totalSavings.innerHTML = " USD " + numberWithCommas(parseFloat(obtained_total_calculation).toFixed(2));  
                    navigation_totalSVG.style.display = "inline-block";
                }

            }
        
        });

        /** ------------------------------------------------------------------------------
        Submitting Cilinder Wear Form 
        ------------------------------------------------------------------------------- **/

        cilinderWearSavings_calculateSavingsButton.addEventListener("click", function(event){

            /** Prevent form submission */
            event.preventDefault();

            /** If form data is valid */
            if(validateCilinderWearSavingsForm()){

                /** Calculate Cilinder Wear Savings */
                var results = calculateCilinderWearSavings(
                    constants_maximum_allowable_wear,
                    constants_expected_wear_rate_after_upgrade,
                    cilinderWearSavings_numberOfCilinders.value,
                    cilinderWearSavings_boreSize.value,
                    cilinderWearSavings_currentWearRate.value,
                    cilinderWearSavings_costOfNewLiner.value,
                    cilinderWearSavings_remainingVesselLifetime.value,
                    cilinderWearSavings_currentLinerWear.value,
                    cilinderWearSavings_operatingHours.value
                );

                /** Extract needed values */
                var results_projected_savings_on_liner_after_upgrade = results.finalResult_projectedSavingsOnLinerAfterUpgrade;

                /** Update results table */
                cilinderWearSavings_linerLifetime.innerHTML = numberWithCommas(Math.round(results.finalResult_expectedLinerLifetimeAfterUpgrade)) + " hours";
                cilinderWearSavings_yearlySavings.innerHTML = "USD " + numberWithCommas(Math.round(results.finalResult_projectedSavingsOnLinerAfterUpgrade));

                /** Generate graph  */
                canvas_rendered_cylinder = generateGraph(
                    canvas_rendered_cylinder, 
                    cilinderWearSavings_canvas, 
                    results.partial_newLiners_remainingLife_beforeUpgrade_years,
                    results.partial_newLiners_remainingLife_afterUpgrade_years
                );
        
                /** Hide no data */
                cilinderWearSavings_noData.style.display = "none";

                /** Show chart */
                cilinderWearSavings_canvas_holder.style.display = "block";

                /** Show checkmark in navigation */
                navigation_cilinderWearSavingsSVG.style.display = "inline-block";

                /** Hide calculate button in total savings */
                total_cilinderWearSavingsButton.style.display = "none";

                /** Update total value */
                total_cilinderWearSavingsValue.innerHTML = "USD " + numberWithCommas(parseFloat(results_projected_savings_on_liner_after_upgrade * cilinderWearSavings_remainingVesselLifetime.value).toFixed(2));

                /** Update total calculation value */
                total_calculation_value_cylinders = results_projected_savings_on_liner_after_upgrade * cilinderWearSavings_remainingVesselLifetime.value;

                /** Update total calculation for both fields */
                var obtained_total_calculation = updateTotalCalculationForBothFields(total_calculation_value_oil, total_calculation_value_cylinders);
                if(obtained_total_calculation == "-") {
                    total_totalSavings.innerHTML = obtained_total_calculation;  
                } else {
                    total_totalSavings.innerHTML = "USD " + numberWithCommas(parseFloat(obtained_total_calculation).toFixed(2));  
                    navigation_totalSVG.style.display = "inline-block";
                }

            }

        });

        /** ------------------------------------------------------------------------------
        Syncing vessel life time
        ------------------------------------------------------------------------------- **/

        oilSavings_remainingVesselLifetime.addEventListener("keyup", function(event){
            cilinderWearSavings_remainingVesselLifetime.value = event.target.value;
        });
        cilinderWearSavings_remainingVesselLifetime.addEventListener("keyup", function(event){
            oilSavings_remainingVesselLifetime.value = event.target.value;
        });

        /** ------------------------------------------------------------------------------
        Syncing sailing hours per year
        ------------------------------------------------------------------------------- **/

        oilSavings_operatingHours.addEventListener("keyup", function(event){
            cilinderWearSavings_operatingHours.value = event.target.value;
        });
        cilinderWearSavings_operatingHours.addEventListener("keyup", function(event){
            oilSavings_operatingHours.value = event.target.value;
        });

    });

    /** ------------------------------------------------------------------------------
    Calculation of Oil Savings
    ------------------------------------------------------------------------------- **/

    function calculateOilSavings(
        constants_clo_density,
        constants_estimated_feed_rate_using_hjl,
        oilSavings_dailyConsumptionAtAverageEngineLoad,
        oilSavings_averageLoad,
        oilSavings_engineMCR,
        oilSavings_operatingHours,
        oilSavings_lubricationOilPrice
    ) {

        /** Do the calculations */
        var current_fr = ((oilSavings_dailyConsumptionAtAverageEngineLoad*constants_clo_density)/(24*((oilSavings_engineMCR*(oilSavings_averageLoad/100))/1000)));
        var estimated_fr_using_hjl = constants_estimated_feed_rate_using_hjl;
        var estimated_feed_rate_reduction = ((current_fr-estimated_fr_using_hjl)/current_fr)*100;
        var estimated_yearly_savings = (((oilSavings_dailyConsumptionAtAverageEngineLoad*(oilSavings_operatingHours/24))*oilSavings_lubricationOilPrice))-((((estimated_fr_using_hjl*(oilSavings_engineMCR*(oilSavings_averageLoad/100)))/1000)/constants_clo_density)*24)*(oilSavings_operatingHours/24)*oilSavings_lubricationOilPrice;
        var current_yearly_expense = (((oilSavings_dailyConsumptionAtAverageEngineLoad*(oilSavings_operatingHours/24))*oilSavings_lubricationOilPrice));
        var future_consumption = ((((constants_estimated_feed_rate_using_hjl*(oilSavings_engineMCR*(oilSavings_averageLoad)/100)))/1000/constants_clo_density)*24)*(oilSavings_operatingHours/24)*oilSavings_lubricationOilPrice;
        var difference = current_yearly_expense-future_consumption;

        /** Prepare object to be returned */
        var data = {
            "clo_density": constants_clo_density,
            "estimated_feed_rate_using_hjl": constants_estimated_feed_rate_using_hjl,
            "daily_consumption_at_avg_load": oilSavings_dailyConsumptionAtAverageEngineLoad,
            "typical_operating_load": oilSavings_averageLoad,
            "engine_mcr": oilSavings_engineMCR,
            "sailing_days_per_year": oilSavings_operatingHours,
            "clo_price": oilSavings_lubricationOilPrice,
            "current_fr": current_fr,
            "estimated_fr_using_hjl": estimated_fr_using_hjl,
            "estimated_feed_rate_reduction": estimated_feed_rate_reduction,
            "estimated_yearly_savings": estimated_yearly_savings,
            "current_yearly_expense": current_yearly_expense,
            "future_consumption": future_consumption,
            "difference": difference
        };

        /** Return data */
        return data;

    }

    /** ------------------------------------------------------------------------------
    Calculation of Cylinder Wear Savings
    ------------------------------------------------------------------------------- **/

    function calculateCilinderWearSavings(
        constants_maximum_allowable_wear,
        constants_expected_wear_rate_after_upgrade,
        cilinderWearSavings_numberOfCilinders,
        cilinderWearSavings_boreSize,
        cilinderWearSavings_currentWearRate,
        cilinderWearSavings_costOfNewLiner,
        cilinderWearSavings_remainingVesselLifetime,
        cilinderWearSavings_currentLinerWear,
        cilinderWearSavings_operatingHours
    ) {

        /** Do the calculations */
        var partial_currentLiners_remainingLife_beforeUpgrade = (((cilinderWearSavings_boreSize*constants_maximum_allowable_wear)-cilinderWearSavings_currentLinerWear)/(cilinderWearSavings_currentWearRate))*1000;
        var partial_currentLiners_remainingLife_afterUpgrade = (((cilinderWearSavings_boreSize*constants_maximum_allowable_wear)-cilinderWearSavings_currentLinerWear)/(constants_expected_wear_rate_after_upgrade))*1000;
        var partial_newLiners_remainingLife_beforeUpgrade = (((cilinderWearSavings_boreSize*constants_maximum_allowable_wear))/(cilinderWearSavings_currentWearRate))*1000;
        var partial_newLiners_remainingLife_afterUpgrade = (((cilinderWearSavings_boreSize*constants_maximum_allowable_wear))/(constants_expected_wear_rate_after_upgrade))*1000;
        var partial_currentLiners_remainingLife_beforeUpgrade_years = partial_currentLiners_remainingLife_beforeUpgrade/(cilinderWearSavings_operatingHours);
        var partial_currentLiners_remainingLife_afterUpgrade_years = partial_currentLiners_remainingLife_afterUpgrade/(cilinderWearSavings_operatingHours);
        var partial_newLiners_remainingLife_beforeUpgrade_years = partial_newLiners_remainingLife_beforeUpgrade / cilinderWearSavings_operatingHours;
        var partial_newLiners_remainingLife_afterUpgrade_years = partial_newLiners_remainingLife_afterUpgrade / cilinderWearSavings_operatingHours;
        if((cilinderWearSavings_remainingVesselLifetime-partial_currentLiners_remainingLife_beforeUpgrade_years) < 0) {
            var partial_numberOfLinesReplacementsBeforeUpgrade = 0;
        } else {
            var partial_numberOfLinesReplacementsBeforeUpgrade = Math.ceil((cilinderWearSavings_remainingVesselLifetime-partial_currentLiners_remainingLife_beforeUpgrade_years) / partial_newLiners_remainingLife_beforeUpgrade_years);
        }
        if((cilinderWearSavings_remainingVesselLifetime-partial_currentLiners_remainingLife_afterUpgrade_years) < 0) {
            var partial_numberOfLinesReplacementsAfterUpgrade = 0;
        } else {
            var partial_numberOfLinesReplacementsAfterUpgrade = Math.ceil((cilinderWearSavings_remainingVesselLifetime-partial_currentLiners_remainingLife_afterUpgrade_years) / partial_newLiners_remainingLife_afterUpgrade_years);
        }
        var partial_lifetimeCostsWithOldWearRateWholeEngine = cilinderWearSavings_numberOfCilinders*cilinderWearSavings_costOfNewLiner*partial_numberOfLinesReplacementsBeforeUpgrade;
        var partial_lifetimeCostsWithNewWearRateWholeEngine = cilinderWearSavings_numberOfCilinders*cilinderWearSavings_costOfNewLiner*partial_numberOfLinesReplacementsAfterUpgrade;
        var partial_projectedSavingsFromWearAfterUpgrade = partial_lifetimeCostsWithOldWearRateWholeEngine-partial_lifetimeCostsWithNewWearRateWholeEngine;
        var partial_averageSavingsPerYearDuringEngineLifetime = partial_projectedSavingsFromWearAfterUpgrade/cilinderWearSavings_remainingVesselLifetime;

        /** Prepare object to be returned */
        var data = {

            /** Constants */
            "constants_maximum_allowable_wear": constants_maximum_allowable_wear,
            "constants_expected_wear_rate_after_upgrade": constants_expected_wear_rate_after_upgrade,

            /** Inputs */
            "cilinderWearSavings_numberOfCilinders": cilinderWearSavings_numberOfCilinders,
            "cilinderWearSavings_boreSize": cilinderWearSavings_boreSize,
            "cilinderWearSavings_currentWearRate": cilinderWearSavings_currentWearRate,
            "cilinderWearSavings_costOfNewLiner": cilinderWearSavings_costOfNewLiner,
            "cilinderWearSavings_remainingVesselLifetime": cilinderWearSavings_remainingVesselLifetime,
            "cilinderWearSavings_currentLinerWear": cilinderWearSavings_currentLinerWear,
            "cilinkedWearSavings_salingsHoursPerYear": cilinderWearSavings_operatingHours,

            /** Partial calculations */
            "partial_currentLiners_remainingLife_beforeUpgrade": partial_currentLiners_remainingLife_beforeUpgrade,
            "partial_currentLiners_remainingLife_afterUpgrade": partial_currentLiners_remainingLife_afterUpgrade,
            "partial_newLiners_remainingLife_beforeUpgrade": partial_newLiners_remainingLife_beforeUpgrade,
            "partial_newLiners_remainingLife_afterUpgrade": partial_newLiners_remainingLife_afterUpgrade,
            "partial_currentLiners_remainingLife_beforeUpgrade_years": partial_currentLiners_remainingLife_beforeUpgrade_years,
            "partial_currentLiners_remainingLife_afterUpgrade_years": partial_currentLiners_remainingLife_afterUpgrade_years,
            "partial_newLiners_remainingLife_beforeUpgrade_years": partial_newLiners_remainingLife_beforeUpgrade_years,
            "partial_newLiners_remainingLife_afterUpgrade_years": partial_newLiners_remainingLife_afterUpgrade_years,
            "partial_numberOfLinesReplacementsBeforeUpgrade": partial_numberOfLinesReplacementsBeforeUpgrade,
            "partial_numberOfLinesReplacementsAfterUpgrade": partial_numberOfLinesReplacementsAfterUpgrade,
            "partial_lifetimeCostsWithOldWearRateWholeEngine": partial_lifetimeCostsWithOldWearRateWholeEngine,
            "partial_lifetimeCostsWithNewWearRateWholeEngine": partial_lifetimeCostsWithNewWearRateWholeEngine,
            "partial_projectedSavingsFromWearAfterUpgrade": partial_projectedSavingsFromWearAfterUpgrade,
            "partial_averageSavingsPerYearDuringEngineLifetime": partial_averageSavingsPerYearDuringEngineLifetime,

            /** Final results */
            "finalResult_projectedSavingsOnLinerAfterUpgrade": partial_averageSavingsPerYearDuringEngineLifetime,
            "finalResult_expectedLinerLifetimeOnCurrentSystem": partial_newLiners_remainingLife_beforeUpgrade,
            "finalResult_expectedLinerLifetimeAfterUpgrade": partial_newLiners_remainingLife_afterUpgrade,

        };

        /** Return data */
        return data;

    }

    /** ------------------------------------------------------------------------------
    Graph generation
    ------------------------------------------------------------------------------- **/

    function generateGraph(
        canvas_rendered,
        canvas, 
        value_current, 
        value_hjl
    ){

        /** Get unit */
        let unit = canvas.getAttribute("id") == "oilSavings_canvas" ? "g/kWh" :  "years";

        /** Destroy previous canvas */
        if(canvas_rendered) {
            canvas_rendered.destroy();
        }

        /** Generate chart */
        var create_canvas_reference = new Chart(canvas, {
            type: 'bar',
            data: {
                labels: [
                    'Current feed rate', 
                    'Estimated feed rate using HJL'
                ],
                datasets: [
                    {
                        label: '',
                        data: [
                            value_current, 
                            value_hjl
                        ],
                        borderWidth: 1,
                        backgroundColor: [
                            "#5C94C0",
                            "#02827B"
                        ] 
                    }
                ]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                scales: {
                    y: {
                        beginAtZero: true,
                        ticks: {
                            callback: function(value, index, ticks) {
                                return value + ' ' + unit;
                            }
                        },
                    },
                    x: {
                        ticks: {
                            display: false
                    }
                    }
                },
                animation: {
                    duration: 0
                },
                plugins: {
                    legend: {
                        display: false
                    },
                    tooltip: {
                        enabled: false
                    }
                }
            }
        });

        /** Return reference */
        return create_canvas_reference;

    }

    /** ------------------------------------------------------------------------------
    Validation of Oil Savings Form
    ------------------------------------------------------------------------------- **/

    function validateOilSavingsForm() {

        /** Keep tract of errors */
        var no_errors = true;

        /** Hide all error messages */
        Array.from(document.getElementsByClassName("error-message-oil")).forEach(function(error){
            error.style.display = "none";
        });

        /** Daily consumption at avg. engine load */
        if(
            !oilSavings_dailyConsumptionAtAverageEngineLoad.value
            || !isNumeric(oilSavings_dailyConsumptionAtAverageEngineLoad.value)
        )  {
            oilSavings_errors_dailyConsumptionAtAverageEngineLoad.style.display = "block";
            no_errors = false;
        }

        /** Average load */
        if(
            !oilSavings_averageLoad.value
            || !isNumeric(oilSavings_averageLoad.value)
        )  {
            oilSavings_errors_averageLoad.style.display = "block";
            no_errors = false;
        }

        /** Engine MCR (100% load) */
        if(
            !oilSavings_engineMCR.value
            || !isNumeric(oilSavings_engineMCR.value)
        )  {
            oilSavings_errors_engineMCR.style.display = "block";
            no_errors = false;
        }

        /** Operating hours */
        if(
            !oilSavings_operatingHours.value
            || !isNumeric(oilSavings_operatingHours.value)
        )  {
            oilSavings_errors_operatingHours.style.display = "block";
            no_errors = false;
        }

        /** Lubrication oil price */
        if(
            !oilSavings_lubricationOilPrice.value
            || !isNumeric(oilSavings_lubricationOilPrice.value)
        )  {
            oilSavings_errors_lubricationOilPrice.style.display = "block";
            no_errors = false;
        }

        /** Remaining vessel lifetime */
        if(
            !oilSavings_remainingVesselLifetime.value
            || !isNumeric(oilSavings_remainingVesselLifetime.value)
        )  {
            oilSavings_errors_remainingVesselLifetime.style.display = "block";
            no_errors = false;
        }

        /** Return result */
        return no_errors;

    }

    /** ------------------------------------------------------------------------------
    Validation of Cylinder Wear Savings
    ------------------------------------------------------------------------------- **/

    function validateCilinderWearSavingsForm() {

        /** Keep tract of errors */
        var no_errors = true;

        /** Hide all error messages */
        Array.from(document.getElementsByClassName("error-message-cylinder-wear")).forEach(function(error){
            error.style.display = "none";
        });

        /** Number of cilinders */
        if(
            !cilinderWearSavings_numberOfCilinders.value
            || !isNumeric(cilinderWearSavings_numberOfCilinders.value)
        )  {
            cilinderWearSavings_errors_numberOfCilinders.style.display = "block";
            no_errors = false;
        }

        /** Bore size */
        if(
            !cilinderWearSavings_boreSize.value
            || !isNumeric(cilinderWearSavings_boreSize.value)
        )  {
            cilinderWearSavings_errors_boreSize.style.display = "block";
            no_errors = false;
        }

        /** Current wear rate */
        if(
            !cilinderWearSavings_currentWearRate.value
            || !isNumeric(cilinderWearSavings_currentWearRate.value)
        )  {
            cilinderWearSavings_errors_currentWearRate.style.display = "block";
            no_errors = false;
        }

        /** Cost of new liner incl. freight and spares */
        if(
            !cilinderWearSavings_costOfNewLiner.value
            || !isNumeric(cilinderWearSavings_costOfNewLiner.value)
        )  {
            cilinderWearSavings_errors_costOfNewLiner.style.display = "block";
            no_errors = false;
        }

        /** Operating hours */
        if(
            !cilinderWearSavings_operatingHours.value
            || !isNumeric(cilinderWearSavings_operatingHours.value)
        )  {
            cilinderWearSavings_errors_operatingHours.style.display = "block";
            no_errors = false;
        }

        /** Remaining vessel lifetime */
        if(
            !cilinderWearSavings_remainingVesselLifetime.value
            || !isNumeric(cilinderWearSavings_remainingVesselLifetime.value)
        )  {
            cilinderWearSavings_errors_remainingVesselLifetime.style.display = "block";
            no_errors = false;
        }

        /** Current linear wear */
        if(
            !cilinderWearSavings_currentLinerWear.value
            || !isNumeric(cilinderWearSavings_currentLinerWear.value)
        )  {
            cilinderWearSavings_errors_currentLinerWear.style.display = "block";
            no_errors = false;
        }

        /** Return result */
        return no_errors;

    }

    /** ------------------------------------------------------------------------------
    Function checking numeric values
    ------------------------------------------------------------------------------- **/

    function isNumeric(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    }


    /** ------------------------------------------------------------------------------
    Function formating numbers
    ------------------------------------------------------------------------------- **/

    function numberWithCommas(x) {
        return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }

    /** ------------------------------------------------------------------------------
    Function updating total calculation values
    ------------------------------------------------------------------------------- **/

    function updateTotalCalculationForBothFields(
        total_calculation_value_oil, 
        total_calculation_value_cylinders
    ) {
        if(total_calculation_value_oil && total_calculation_value_cylinders) {
            return total_calculation_value_oil + total_calculation_value_cylinders;
        } else {
            return "-";
        }
    }
}