diff --git a/src/index.js b/src/index.js index da2fd1a..1f5448c 100644 --- a/src/index.js +++ b/src/index.js @@ -55,7 +55,7 @@ function bindLocaleSwitcher(initialValue) { i18next .changeLanguage(e.target.value) .then(translatePageElements) - .then(update); + .then(updateCageCheck); }; } @@ -63,7 +63,7 @@ function bindLocaleSwitcher(initialValue) { await initI18next(); translatePageElements(); bindLocaleSwitcher(i18next.resolvedLanguage); - update(); + updateCageCheck(); })(); ////////// @@ -148,7 +148,20 @@ class Validator { if (numOfRats < 3 || numOfRats > 15) { throw new Error("This formula works only from 3 to 15 rats"); } - return MINIMUM_AREA_THREE_RATS + (numOfRats - 3) * AREA_PER_ADDITIONAL_RAT; + return MINIMUM_AREA_THREE_RATS + (numOfRats - 3.0) * AREA_PER_ADDITIONAL_RAT; + } + + allowedNumberOfRats(overallArea) { + /* + Calculates the number of rats that are allowed for a certain overall area. + */ + let result = 3.0 + (overallArea-MINIMUM_AREA_THREE_RATS) / AREA_PER_ADDITIONAL_RAT; + console.log(`Area left: ${overallArea-MINIMUM_AREA_THREE_RATS}`); + console.log(`Result: ${result}`); + if (result < 3) { + throw new Error("Cages must be for three rats or more"); + } + return result; } failCageNumberIndependent(dimensions, numFullFloors) { @@ -181,6 +194,11 @@ class Validator { return failedCriteria; } + getOverallArea(dimensions, numFullFloors) { + const baseArea = dimensions.depth * dimensions.width; + return baseArea * numFullFloors + } + cageCheck(dimensions, numRats, numFullFloors) { /* Function that checks a cage based on overall criteria and the number of rats. @@ -191,9 +209,9 @@ class Validator { failedCriteria[FAILED_NUM_RATS] = this.FAIL_CRITERIA[FAILED_NUM_RATS]; } - const areaNeeded = this.overallAreaNeeded(numRats); - const baseArea = dimensions.depth * dimensions.width; - if (baseArea * numFullFloors < areaNeeded) { + const overallArea = this.getOverallArea(dimensions, numFullFloors); + const overallAreaNeeded = this.overallAreaNeeded(numRats); + if (overallArea < overallAreaNeeded) { failedCriteria[FAILED_OVERALL_AREA] = this.FAIL_CRITERIA[FAILED_OVERALL_AREA]; } @@ -225,13 +243,30 @@ class Dimensions { // DOCUMENT INTERACTION // ////////////////////////// -const inputWidth = document.getElementById("width"); -inputWidth.onchange = updateViaManualMeasurements; -const inputDepth = document.getElementById("depth"); -inputDepth.onchange = updateViaManualMeasurements; -const inputHeight = document.getElementById("height"); -inputHeight.onchange = updateViaManualMeasurements; +const numRatsCalculatorInputWidth = document.getElementById("num-rats-width"); +numRatsCalculatorInputWidth.onchange = updateNumRatsCalculator; +const numRatsCalculatorInputDepth = document.getElementById("num-rats-depth"); +numRatsCalculatorInputDepth.onchange = updateNumRatsCalculator; +const numRatsCalculatorInputHeight = document.getElementById("num-rats-height"); +numRatsCalculatorInputHeight.onchange = updateNumRatsCalculator; +let numRatsNumFullFloors = document.getElementById("num-rats-numFullFloors"); +numRatsNumFullFloors.oninput = function () { + updateNumRatsCalculator(); +} + + +const inputWidth = document.getElementById("width"); +inputWidth.onchange = updateCageCheck; +const inputDepth = document.getElementById("depth"); +inputDepth.onchange = updateCageCheck; +const inputHeight = document.getElementById("height"); +inputHeight.onchange = updateCageCheck; + +let fullFloorNum = document.getElementById("numFullFloors"); +fullFloorNum.oninput = function () { + updateCageCheck(); +} let labelNumRats = document.getElementById("labelNumRats"); @@ -239,14 +274,9 @@ let labelNumRats = document.getElementById("labelNumRats"); let ratSlider = document.getElementById("numRats"); ratSlider.oninput = function () { - update(); + updateCageCheck(); } -// Full floor functions -let fullFloorNum = document.getElementById("numFullFloors"); -fullFloorNum.oninput = function () { - update(); -} function getResultFromChecks(checks) { if (Object.keys(checks).length > 0) { @@ -265,11 +295,7 @@ function getResultFromChecks(checks) { } -function updateViaManualMeasurements() { - update(); -} - -function update() { +function updateCageCheck() { labelNumRats.innerHTML = i18next.t("cage-for-x-rats", {"num_rats": ratSlider.value}); const width = inputWidth.value @@ -285,3 +311,38 @@ function update() { resultsDiv.innerHTML = ""; resultsDiv.appendChild(result); } + +function updateNumRatsCalculator() { + + const width = numRatsCalculatorInputWidth.value + const depth = numRatsCalculatorInputDepth.value + const height = numRatsCalculatorInputHeight.value + const dimensions = new Dimensions(width / 100, depth / 100, height / 100); + const validator = new Validator(); + const failed_checks = validator.failCageNumberIndependent(dimensions, fullFloorNum.value); + + let overallArea = validator.getOverallArea(dimensions, numRatsNumFullFloors.value); + let allowedNumRats; + try { + allowedNumRats = validator.allowedNumberOfRats(overallArea); + } catch (e) { + console.log(e); + failed_checks[FAILED_BASE_AREA] = validator.FAIL_CRITERIA[FAILED_OVERALL_AREA]; + allowedNumRats = 0; + } + + + console.log(`Allowed number: ${allowedNumRats}`); + + let resultsDiv = document.getElementById("num-rats-resultsDiv"); + + const result = getResultFromChecks(failed_checks); + + resultsDiv.innerHTML = ""; + const p = document.createElement('p'); + p.textContent = i18next.t("cage-for-x-rats", {"num_rats": allowedNumRats}); + resultsDiv.appendChild(p); + resultsDiv.appendChild(result); +} + +const validator = new Validator(); \ No newline at end of file