Repository navigation
Expand file tree
/
Copy pathfunctions.js
More file actions
159 lines (154 loc) · 4.58 KB
/
Copy pathfunctions.js
File metadata and controls
159 lines (154 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Use npm lib mathjs to easily calculate the expressions
const math = require('mathjs');
// Define the screen global
const screen = document.getElementById('screen');
// Constant for body
const body = document.getElementById('body');
// Add eventlistener for keypress
document.addEventListener('keydown', pressedKey);
// Add eventlistener for the buttons on the surface
var btns = document.querySelectorAll('[data-val]');
[].forEach.call(btns, (btn)=>{
var val = btn.getAttribute('data-val');
console.log(val);
if(val == "C") {
btn.addEventListener('click', function(){clearScreen(screen)},false);
} else if(val == "result") {
btn.addEventListener('click', function(){getResult(screen)},false);
} else if(val == "themeMode") {
btn.addEventListener('click', function(){toggleDarkMode(body)}, false);
}
else {
btn.addEventListener('click', function(){appendScreen(screen, val)},false);
}
});
// Bind keyinput to functions
// Digits and arithmetic operations appending directly to the screen
// Del clears the screen and Enter computes the result
function pressedKey(e) {
switch(e.key){
case '0': appendScreen(screen, '0');
break;
case '1': appendScreen(screen, '1');
break;
case '2': appendScreen(screen, '2');
break;
case '3': appendScreen(screen, '3');
break;
case '4': appendScreen(screen, '4');
break;
case '5': appendScreen(screen, '5');
break;
case '6': appendScreen(screen, '6');
break;
case '7': appendScreen(screen, '7');
break;
case '8': appendScreen(screen, '8');
break;
case '9': appendScreen(screen, '9');
break;
case '+': appendScreen(screen, '+');
break;
case '-': appendScreen(screen, '-');
break;
case '*': appendScreen(screen, '\u00D7');
break;
case '/': appendScreen(screen, '\u00F7');
break;
case '(': appendScreen(screen, '(');
break;
case ')': appendScreen(screen, ')');
break;
case ',': appendScreen(screen, ',');
break;
case 'Enter': getResult(screen);
break;
case 'Delete': clearScreen(screen);
break;
}
}
// Function to append the prameter val on the screen
function appendScreen(screen, val) {
screen.value = screen.value + val;
}
// Clear screen
function clearScreen(screen) {
screen.value = '';
}
// Compute the result
function getResult(screen) {
var input = screen.value;
input = cleanInput(input);
var result = 0.0;
result = calc(input);
if(result!='error') {
//Change dot to comma for a intelligible output
result = replaceDotComma(result.toString());
// Print result
clearScreen(screen);
appendScreen(screen, result);
} else {
// When checkInput failed show the user a error message
screen.value = 'No valid input';
}
}
// We need to clean the given input on the screen. Replace , with . to get
// a float. replace × with * to multiply and replace ÷ with / to divide
function cleanInput(input) {
input = input.split('²').join('^2');
if(input.indexOf('√')!=-1) {
let tempInput = '';
let root = false;
for(let c of input) {
console.log(c);
if(c == '√') {
root = true;
tempInput += 'sqrt(';
} else if (root) {
if(!isNaN(c) || c == ',') {
tempInput +=c;
} else {
tempInput +=')';
tempInput +=c;
root = false;
}
} else {
tempInput += c;
}
console.log(tempInput);
};
if(root) {
tempInput +=')';
}
input = tempInput;
}
input = input.split('×').join('*');
input = input.split('÷').join('/');
input = input.split(',').join('.');
console.log(input);
return input;
}
// Replace for a intelligible output
function replaceDotComma(input) {
input = input.split('.').join(',');
return input;
}
// Calculate the standard arithmetic operations
function calc(input) {
if(input != undefined) {
var result;
try {
result = math.eval(input);
} catch (err) {
//alert(err.message);
return 'error';
}
return +result.toPrecision(4);
} else {
return;
}
}
function toggleDarkMode(body) {
console.log(body);
body.classList.toggle('dark');
}