let display = document.querySelector(".display"); const buttons = document.querySelectorAll(".btn"); const ops = { firstNum: String(), secondNum: String(), operator: undefined, lastOperator: undefined, numFlag: false, onSecondNumber: false, stringLength: 8, periodClicked: false, result: String(), toggleNumFlag: function () { this.numFlag = !this.numFlag; }, clear: function () { this.firstNum = String(); this.secondNum = String(); this.operator = undefined; this.numFlag = false; this.onSecondNumber = false; this.result = String(); display.textContent = "0"; }, appendNumber: function (num) { if (num === "0" && display.textContent.trim() === "0") return; if (!ops.numFlag && ops.checkLength(ops.firstNum)) { ops.firstNum += num; updateDisplay(ops.firstNum); } else if (this.numFlag) { if (this.checkLength(ops.secondNum)) { ops.secondNum += num; updateDisplay(ops.secondNum); } } }, checkLength: function (string) { return string.length < this.stringLength; }, }; function add(x, y) { return x + y; } function subtract(x, y) { return x - y; } function multiply(x, y) { return x * y; } function divede(x, y) { if (x === 0) { return 0; } else if (y === 0) { alert("Cannot divide by 0!"); return "Error"; } return x / y; } function operate(firstNum, secondNum, operator) { switch (operator) { case "+": return add(firstNum, secondNum); case "-": return subtract(firstNum, secondNum); case "*": return multiply(firstNum, secondNum); case "/": return divede(firstNum, secondNum); } } function handleOperation() { const first = Number(ops.firstNum); const second = Number(ops.secondNum); console.log(`last operator: ${ops.operator}`); let result = operate(first, second, ops.operator); if (result === "Error") { ops.clear(); return; } result = roundThreeDecimals(result); updateDisplay(result); // store result ops.result = result; if (ops.operator === "=") { ops.firstNum = String(); ops.secondNum = String(); ops.numFlag = false; ops.onSecondNumber = false; } else { ops.firstNum = ops.result; ops.secondNum = ""; ops.operator = ""; ops.onSecondNumber = true; } ops.operator = undefined; ops.lastOperator = undefined; } function updateDisplay(displayValue) { display.textContent = displayValue; } function roundThreeDecimals(number) { if (!Number.isInteger(number) && Number.isFinite(number)) { return parseFloat(number.toPrecision(3)); } else { return number; } } function handleOperatorClick(operatorClicked) { ops.operator = operatorClicked; // TODO handle ops for = or clear if (operatorClicked === "cls") { ops.clear(); return; } else if (operatorClicked === "=") { if (ops.lastOperator) { ops.operator = ops.lastOperator; } handleOperation(); return; } else if (operatorClicked === "+/-") { negateNumber(); return; } else if (operatorClicked === "%") { percentageNumber(); return; } else { if (ops.secondNum && ops.numFlag) { ops.lastOperator = operatorClicked; handleOperation(); return; } } //TODO fix this conditional should be if numFlag and a check if = or additional ops if (!ops.onSecondNumber) { ops.numFlag = true; if (ops.result !== "") { console.log("this is running the ops.result"); ops.firstNum = ops.result; ops.onSecondNumber = true; return; } } // ops.onSecondNumber = !ops.onSecondNumber; } function calculator(event) { if (event.target.dataset.ops === "") { handleOperatorClick(event.target.value); } else if (event.target.value === ".") { if (display.textContent.includes(".")) { return; } else { ops.appendNumber(event.target.value); } } else if (event.target.dataset.num === "") { ops.appendNumber(event.target.value); } } function negateNumber() { // returns a negated number let negated; if (!ops.numFlag || ops.secondNum === "") { negated = Number(ops.firstNum) * -1; ops.firstNum = String(negated); } else { negated = Number(ops.secondNum) * -1; ops.secondNum = String(negated); } updateDisplay(negated); } function percentageNumber() { let percent; if (!ops.numFlag || !ops.secondNum === "") { percent = Number(ops.firstNum) / 100; ops.firstNum = String(percent); } else if (ops.result !== "") { percent = Number(ops.result) / 100; } else { percent = Number(ops.secondNum) / 100; ops.secondNum = String(percent); } updateDisplay(percent); } buttons.forEach((btn) => { btn.addEventListener("click", calculator); });