4   <meta http-equiv=
"content-type" content=
"text/html; charset=UTF-8"> 
   5   <meta name=
"author" content=
"Permondes (see permondes.de)"> 
   6   <meta name=
"date" content=
"2019-12-17a"> 
   8         <title>Permondes Pocket Calculator
</title> 
  10   <!-- Taschenrechner, adopted from https://wiki.selfhtml.org/wiki/JavaScript/Tutorials/Taschenrechner  
  12     = | <enter>:  Ergebnis berechnen 
  15     ln| "l":      natürlicher Logarithmus 
  16     ANS|"a":      answer, letztes Resultat 
  17     STO|"s":      store in memory 
  18     RCL|"m":      recall memory 
  19     ENG|"n":      notation (exponential / norm) 
  20     ESC|"c":      zurücksetzen auf Null 
  23 <!-- style ------------------------------------------------------------------------------------------------------------> 
  29 /* form of calculator */  
 
  31         border: 
1px solid dimgray;
 
  33         box-shadow: inset 
0 0 1px LightGray;
 
  34         display: inline-block;
 
  40 /* input and output area fieldset */  
 
  45 #f_Eingabe, #f_Ergebnis, #f_Formel {
 
  50         padding: 
0.2em 
1em; /* top, bottom: 
0; left, right: 
1 */
 
  59 /* buttens fieldset */
 
  67   border: 
2px #
222222 outset;
 
  68   background-image: linear-gradient(to bottom right, #
222222, #
585858);
 
  81 <!-- script ------------------------------------------------------------------------------------------------------------> 
  86         v_Formel, v_Ergebnis,   v_Eingabe,
 
  88         v_FormularOverwrite = true,
 
  91 // convert a number to text taking into account the notation
 
  92 function convertNumToText(p_notation, p_number) {
 
  94                 if (p_notation == "ENG") {
 
  95                   v_text = p_number.toExponential();
 
  97                   v_text = p_number.toString();                 
 
 102 function toggleNotation() {
 
 111    v_Ergebnis.value = convertNumToText(notation, ans);  
 
 114 /* clear Formular field */
 
 115 function clear_Formular () {
 
 120 function key_clear () {
 
 121                 v_Eingabe.value = "";
 
 123                 v_Ergebnis.value = "";
 
 126 /* delete last character */
 
 127 function deletechar () {
 
 128                 v_Eingabe.value = v_Eingabe.value.substr(
0, v_Eingabe.value.length-
1);
 
 131 /* input of number, decimal point, e or () */
 
 132 function key_number (c) {
 
 133   if (c == ",") {
c="."}
 
 134   v_Eingabe.value += c;
 
 137 function getLastResult () {
 
 138   v_Eingabe.value = convertNumToText(notation, ans);
 
 142 function memory_store () {
 
 146 function memory_recall () {
 
 147   v_Eingabe.value = convertNumToText(notation, mem);
 
 151 /* Basic arithmetics */
 
 152 function operator_function (c) {
 
 153   if (v_FormularOverwrite) {
 
 155     v_FormularOverwrite = false; }
 
 156   v_Formel.value += " " + v_Eingabe.value + " " + c; // Operatoren sind durch Leerzeichen von den Zahlen getrennt
 
 157   v_Eingabe.value = "";
 
 160 /* In der Funktion extra() werden Math Berechnungen durchgeführt */
 
 161 function extra_function (type) {
 
 164       v_Eingabe.value = Math.sqrt(v_Eingabe.value); 
 
 167                         v_Eingabe.value = Math.pow(v_Eingabe.value, 
2); 
 
 170                         v_Eingabe.value = Math.log(v_Eingabe.value); 
 
 175 // Bei einem Klick auf = (oder bei passender Benutzung der Tastatur) berechnet die Funktion result() das Ergebnis. 
 
 176 // Mit einem RegEx werden nur Ziffern, der Dezimalpunkt und die vier Operatoren als gültige Zeichen für die Berechnung zugelassen (inklusive möglicher Leerzeichen). Dabei werden die üblichen Tastenbeschriftungen für Multiplikation und Division durch ihre JavaScript-Entsprechungen ersetzt. Das eigentliche Rechenergebnis wird mit der window-Methode eval berechnet.
 
 178   operator_function("");
 
 180                   input = v_Formel.value,
 
 184                 // replace × with * and ÷ with / for eval()
 
 185                 input = input.replace(/×/g, "*").replace(/÷/g, "/");
 
 187                 // remove anything else that is not allowed here
 
 188                 input = input.replace(/[^
0-
9.e() +\-*\/]/g, "");
 
 196 //    v_Ergebnis.textContent = convertNumToText(notation, r);   
 
 197     v_Formel.value = v_Formel.value + "=";      
 
 198     v_Ergebnis.value = convertNumToText(notation, r);   
 
 199     v_FormularOverwrite = true; 
 
 203   /* Der Eventhandler DOMContentLoaded wird ausgelöst, wenn das DOM vollständig aufgebaut, 
 
 204      aber noch nicht alle externen Ressourcen wie z.B. Bilder geladen sind.. */
 
 205 document.addEventListener("DOMContentLoaded", function () {
 
 207   v_Formel = document.getElementById("f_Formel");
 
 208         v_Ergebnis = document.getElementById("f_Ergebnis");
 
 209         v_Eingabe  = document.getElementById("f_Eingabe");
 
 211   var form   = document.getElementById("calc");
 
 213     /* click-handling für alle buttons in #calc erstellen */
 
 214                 document.querySelectorAll("#calc button").forEach(function (b) { 
 
 215                         var c = b.textContent;
 
 232                                         b.addEventListener("click", function () { key_number(c); });
 
 236                                   b.addEventListener("click", function () {getLastResult(); });
 
 240           b.addEventListener("click", function () { memory_store(); });
 
 243           b.addEventListener("click", function () { memory_recall(); });
 
 250                                         b.addEventListener("click", function () { operator_function(c); });
 
 256                                         b.addEventListener("click", function () { extra_function(c); });
 
 260                                         b.addEventListener("click", function () { deletechar() } );
 
 264                                         b.addEventListener("click", function () {key_clear() });
 
 268                                         b.addEventListener("click", function () {result() });
 
 272                                   b.addEventListener("click", function () {toggleNotation();});
 
 278                 /* reacting on keypress */
 
 279                 document.addEventListener("keyup", function (ev) {
 
 301           extra_function("ln");
 
 307           extra_function("x²");
 
 309                                 case "Escape":  // 
<escape> to clear display
 
 313                           case "Backspace": // 
<backspace> to remove 
1 char
 
 320           operator_function(c);
 
 340     /* Da der Taschenrechner ein einzeiliges Formularfeld enthält, 
 
 341     kann dieses Formular jederzeit mit Betätigung der Eingabetaste abgesendet werden. 
 
 342     Ein Absenden ist im Zusammenhang mit dem Taschenrechner jedoch unerwünscht. 
 
 343     Deshalb wird mit addEventListener eine Funktion an das submit-Event des 
<form>-Elements gebunden, die verhindert, 
 
 344     dass der Browser das Standardverhalten beim Absenden eines Formulars ausführt: */
 
 345                 form.addEventListener("submit", function (ev) {
 
 346                         // prevent form submission and page reload
 
 348                         ev.stopPropagation();
 
 351                 form.addEventListener("dblclick", function (ev) {
 
 353                         ev.stopPropagation();
 
 364 <!-- body --------------------------------------------------------------------------------------------------------------> 
 366         <h1>Permondes 
<br/>Pocket Calculator
</h1> 
 369                   <fieldset class=
"cl_IO"> 
 370                         <input id=
"f_Formel"   readonly
></input> 
 371                         <input id=
"f_Ergebnis" readonly
></input> 
 372                         <input id=
"f_Eingabe"  readonly
></input> 
 374                         <fieldset class=
"cl_Buttons"> 
 378                                 <button> </button> 
 379                                 <button> </button>