/*jshint multistr: true */ /* This is the calculate activity file, providing methods related to events*/ function getWindowHeight() { var windowHeight = 0; if (typeof(window.innerHeight) == 'number') { windowHeight = window.innerHeight; } else { if (document.documentElement && document.documentElement.clientHeight) { windowHeight = document.documentElement.clientHeight; } else { if (document.body && document.body.clientHeight) { windowHeight = document.body.clientHeight; } } } return windowHeight; } function getWindowWidth() { var windowWidth = 0; if (typeof(window.innerWidth) == 'number') { windowWidth = window.innerWidth; } else { if (document.documentElement && document.documentElement.clientWidth) { windowWidth = document.documentElement.clientWidth; } else { if (document.body && document.body.clientWidth) { windowWidth = document.body.clientWidth; } } } return windowWidth; } //This function allows us to get the location of the caret inside the calc input function doGetCaretPosition(oField) { var iCaretPos = 0; if (document.selection) { oField.focus(); var oSel = document.selection.createRange(); oSel.moveStart('character', -oField.value.length); iCaretPos = oSel.text.length; } else if (oField.selectionStart || oField.selectionStart == '0') iCaretPos = oField.selectionStart; return (iCaretPos); } //We will remove one character from the calc input //If on desktop, we remove a character from the carret position function removeCharacter() { if (CalculateApp.data.isMobile) { CalculateApp.elements.calcInput.value = CalculateApp.elements.calcInput.value.substring(0, CalculateApp.elements.calcInput.value.length - 1); } else { var caretPosition = doGetCaretPosition(CalculateApp.elements.calcInput); if (caretPosition === CalculateApp.elements.calcInput.value.length) { caretPosition = caretPosition - 1; } if (caretPosition < 0) { caretPosition = 0; } var currentValue = CalculateApp.elements.calcInput.value; CalculateApp.elements.calcInput.value = currentValue.slice(0, caretPosition) + currentValue.slice(caretPosition + 1); CalculateApp.elements.calcInput.setSelectionRange(caretPosition, caretPosition); } CalculateApp.focus(); } //We will add test inside the calc input //If on desktop, we will add the text from the carret position function addTextInsideInput(value) { if (CalculateApp.data.isMobile) { CalculateApp.elements.calcInput.value = CalculateApp.elements.calcInput.value + value; } else { var caretPosition = doGetCaretPosition(CalculateApp.elements.calcInput); var currentValue = CalculateApp.elements.calcInput.value; CalculateApp.elements.calcInput.value = currentValue.slice(0, caretPosition) + value + currentValue.slice(caretPosition); CalculateApp.elements.calcInput.setSelectionRange(caretPosition + value.length, caretPosition + value.length); } CalculateApp.focus(); } /* Callback from the calc buttons */ function calcButtonClick(button) { if (CalculateApp.data.calculationDone && !isNaN(button.target.value)) { CalculateApp.elements.calcInput.value = ""; } CalculateApp.data.calculationDone = false; addTextInsideInput(button.target.value); } /* Trigger calculation when the key is enter inside the calc input */ function calcInputKeyUp(event) { if (event.which == 13) { calcEqualClick(); } } /* Generation of the error box */ function getErrorTemplate() { return "
"; } /* Generation of the result box */ function getResultTemplate() { return " "; } /* Generation of the result box */ function getGraphTemplate() { return " "; } /* We handle a graph request */ function launchGraph(calcInputValue, labelValue) { var calculation = { calculation: calcInputValue, graph: true, }; if (labelValue) { calculation.label = labelValue; } calcInputValue = CalculateApp.tryPatchGraphEquation(calcInputValue); try { var result = CalculateApp.evalFunctionAtZero(calcInputValue); if (result.value) { result = result.value; } calculation.result = result; } catch (e) { calculation.error = e.message; } CalculateApp.storeCalculation(calculation); CalculateApp.persistCalculations(); CalculateApp.displayCalculation(calculation); if (!calculation.error) { CalculateApp.graph(calculation.calculation); } } /* We handle a calculation request */ function launchCalculation(calcInputValue, labelValue) { var calculation = { calculation: calcInputValue, graph: false }; if (labelValue) { calculation.label = labelValue; } calcInputValue = CalculateApp.tryPatchEquation(calcInputValue); try { var result = CalculateApp.eval(calcInputValue); calculation.result = result.result; CalculateApp.elements.calcInput.value = result.resultBase10; } catch (e) { calculation.error = e.message; } CalculateApp.storeCalculation(calculation); CalculateApp.persistCalculations(); CalculateApp.displayCalculation(calculation); } /* Handling of calc equal button click */ function calcEqualClick() { if (CalculateApp.elements.calcInput.value === undefined || CalculateApp.elements.calcInput.value.length === 0) { return; } var labelValue = CalculateApp.elements.labelInput.value; var calcInputValue = CalculateApp.elements.calcInput.value; calcInputValue = calcInputValue.replace(/ /g, ''); CalculateApp.elements.labelInput.value = ""; CalculateApp.elements.calcInput.value = ""; if (CalculateApp.isGraph(calcInputValue, labelValue)) { launchGraph(calcInputValue, labelValue); } else { launchCalculation(calcInputValue, labelValue); } CalculateApp.data.calculationDone = true CalculateApp.focus(); } /* Handling of the calc remove one char button click */ function calcDelClick() { removeCharacter(); CalculateApp.focus(); } /* Handling of the calc clear all button click */ function calcClearClick() { CalculateApp.elements.calcInput.value = ""; CalculateApp.focus(); } /* Handling of the base palette button click */ function onbaseClick() { switch (CalculateApp.data.outputBase) { case 10: CalculateApp.data.outputBase = 2; CalculateApp.elements.basePaletteDiv.style.backgroundImage = "url(icons/base-2.svg)"; break; case 2: CalculateApp.data.outputBase = 8; CalculateApp.elements.basePaletteDiv.style.backgroundImage = "url(icons/base-8.svg)"; break; case 8: CalculateApp.data.outputBase = 16; CalculateApp.elements.basePaletteDiv.style.backgroundImage = "url(icons/base-16.svg)"; break; case 16: CalculateApp.data.outputBase = 10; CalculateApp.elements.basePaletteDiv.style.backgroundImage = "url(icons/base-10.svg)"; break; } } /* Handling of the digits palette button click */ function onOutputDigitsClick() { switch (CalculateApp.data.outputDigits) { case 6: CalculateApp.data.outputDigits = 9; CalculateApp.elements.outputDigitsPalette.style.backgroundImage = "url(icons/digits-9.svg)"; break; case 9: CalculateApp.data.outputDigits = 12; CalculateApp.elements.outputDigitsPalette.style.backgroundImage = "url(icons/digits-12.svg)"; break; case 12: CalculateApp.data.outputDigits = 15; CalculateApp.elements.outputDigitsPalette.style.backgroundImage = "url(icons/digits-15.svg)"; break; case 15: CalculateApp.data.outputDigits = 6; CalculateApp.elements.outputDigitsPalette.style.backgroundImage = "url(icons/digits-6.svg)"; break; } } /* Handling of the radian degree palette button click */ function onradianDegreeClick(input) { if (CalculateApp.data.isRadian) { CalculateApp.data.isRadian = false; CalculateApp.elements.radianDegreePalette.style.backgroundImage = "url(icons/format-deg.svg)"; } else { CalculateApp.data.isRadian = true; CalculateApp.elements.radianDegreePalette.style.backgroundImage = "url(icons/format-rad.svg)"; } } /* Handling of a choosen trigo function inside trigo palette */ function ontrigoClick(input) { if (CalculateApp.data.calculationDone && isNaN(input.detail.value)) { CalculateApp.elements.calcInput.value = ""; } CalculateApp.data.calculationDone = false; addTextInsideInput(input.detail.value); } /* Handling of a choosen button inside algebra palette */ function onalgebraClick(input) { if (CalculateApp.data.calculationDone && isNaN(input.detail.value)) { CalculateApp.elements.calcInput.value = ""; } CalculateApp.data.calculationDone = false; addTextInsideInput(input.detail.value); } /* Gui init */ function initGui() { CalculateApp.elements.modalDiv = document.getElementById("modal"); CalculateApp.elements.resultsZoneDiv = document.getElementById("results-zone"); CalculateApp.elements.calcInputDiv = document.getElementById("calc-input-div"); CalculateApp.elements.calcInput = document.getElementById("calc-input"); CalculateApp.elements.labelInput = document.getElementById("label-input"); CalculateApp.elements.trigoPaletteDiv = document.getElementById("trigo-palette"); CalculateApp.elements.algebraPaletteDiv = document.getElementById("algebra-palette"); CalculateApp.elements.basePaletteDiv = document.getElementById("base-palette"); CalculateApp.elements.radianDegreePalette = document.getElementById("radian-degree-palette"); CalculateApp.elements.outputDigitsPalette = document.getElementById("output-digits-palette"); CalculateApp.elements.calcInput.addEventListener("keyup", calcInputKeyUp, false); var buttonInputs = document.getElementsByClassName("calcbuttoninput"); for (var i = 0; i < buttonInputs.length; i++) { buttonInputs[i].addEventListener("click", calcButtonClick, false); } var buttonClear = document.getElementsByClassName("calcbuttonclear"); for (i = 0; i < buttonClear.length; i++) { CalculateApp.elements.calcButtonClear = buttonClear[i]; buttonClear[i].addEventListener("click", calcClearClick, false); } var buttonDel = document.getElementsByClassName("calcbuttondel"); for (i = 0; i < buttonDel.length; i++) { buttonDel[i].addEventListener("click", calcDelClick, false); } var buttonCalc = document.getElementsByClassName("calcbuttoncalc"); for (i = 0; i < buttonCalc.length; i++) { buttonCalc[i].addEventListener("click", calcEqualClick, false); } window.onresize = CalculateApp.onResize; //Binding of the palettes CalculateApp.elements.trigoPalette = new CalculateApp.libs.trigopalette.trigoPalette(CalculateApp.elements.trigoPaletteDiv, undefined); CalculateApp.elements.trigoPalette.addEventListener('trigoClick', ontrigoClick); CalculateApp.elements.algebraPalette = new CalculateApp.libs.algebrapalette.algebraPalette(CalculateApp.elements.algebraPaletteDiv, undefined); CalculateApp.elements.algebraPalette.addEventListener('algebraClick', onalgebraClick); var isIos = (navigator.userAgent.match(/iPad|iPhone|iPod/g) ? true : false) if (isIos) { CalculateApp.elements.basePaletteDiv.addEventListener('touchstart', onbaseClick); CalculateApp.elements.radianDegreePalette.addEventListener('touchstart', onradianDegreeClick); CalculateApp.elements.outputDigitsPalette.addEventListener('touchstart', onOutputDigitsClick); } else { CalculateApp.elements.basePaletteDiv.addEventListener('click', onbaseClick); CalculateApp.elements.radianDegreePalette.addEventListener('click', onradianDegreeClick); CalculateApp.elements.outputDigitsPalette.addEventListener('click', onOutputDigitsClick); } }