let display = document.querySelector('.display'); const buttons = document.querySelectorAll('.btn'); const ops = { firstNum: String(), secondNum: String(), operator: undefined, numFlag: false, onSecondNumber: false, stringLength: 8, periodClicked: false, updateNum: (num) => { if (!this.updateSecondNum){ this.firstNum = num; } else { this.secondNum = num; } }, toggleNumFlag: function() { this.numFlag = !this.numFlag }, clear: function(){ this.firstNum = String(); this.secondNum = String(); this.operator = undefined; this.numFlag = false; this.onSecondNumber = false; 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() { let first = Number(ops.firstNum); let second = Number(ops.secondNum); let result = operate(first, second, ops.operator); // result = Math.round(result * (10^3)/(10^3)); if (result === "error") { ops.clear(); return; } result = result.toPrecision(3); updateDisplay(result); ops.firstNum = result; ops.secondNum = String(); if (ops.operator === '=') { ops.numFlag = false; ops.onSecondNumber = false; } else { ops.onSecondNumber = true; } ops.operator = undefined; } function updateDisplay(displayValue) { display.textContent = displayValue; } function handleOperatorClick(operatorClicked) { // TODO handle ops for = or clear if (operatorClicked === 'cls') { ops.clear(); return; } else if (operatorClicked === '=') { handleOperation(); } else if (operatorClicked === '+/-') { negateNumber(); return } else if (operatorClicked === '%') { percentageNumber(); return } else { if(ops.secondNum && ops.numFlag){ handleOperation(); } } ops.operator = operatorClicked; //TODO fix this conditional should be if numFlag and a check if = or additional ops if(!ops.onSecondNumber){ ops.numFlag = true; } 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.onSecondNumber) { 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.onSecondNumber) { percent = Number(ops.firstNum) / 100; ops.firstNum = String(percent); } else { percent = Number(ops.secondNum) / 100; ops.secondNum = String(percent); } updateDisplay(percent); } buttons.forEach(btn => { btn.addEventListener('click', calculator); });