(function() { // Load interact.js dynamically if it is not already loaded if (!window.interact) { var script = document.createElement("script"); script.src = "https://cdn.jsdelivr.net/npm/interactjs/dist/interact.min.js"; document.head.appendChild(script); } var s; if (!document.querySelector('style.EVALDOTJSSTYLETHING')) { s = document.createElement("style"); s.className = "EVALDOTJSSTYLETHING"; s.innerHTML = ` evalcontainer { display: block; position: fixed; width: 500px; height: 350px; background: rgba(0,0,0,0.8); top: 0; left: 0; right: 0; margin: 50px auto; font-size: 0; z-index: 100000; } evalcontainer > textarea.EVALTEXTAREA { width: 500px; border: none; box-sizing: border-box; font-family: monospace; font-size: 12px; height: 200px; padding: 5px; resize: none; position: absolute; bottom: 0; background: rgba(0,0,0,0.8); color: white; } evalcontainer > evaloutput { display: block; width: 500px; max-height: 150px; font-size: 12px; font-family: monospace; overflow-y: auto; color: white; box-sizing: border-box; padding: 5px; position: absolute; bottom: 200px; } evalcontainer > evaloutput > evaloutputentry { display: block; white-space: pre; } evalcontainer > evaloutput > evaloutputentry::before { content: ">\\00a0"; color: rgba(255,255,255,0.5); } evalcontainer > evaloutput > evaloutputentry.EVALRESULT { border-bottom: 1px solid rgba(255,255,255,0.1); } evalcontainer > evaloutput > evaloutputentry.EVALRESULT::before { content: "<\\00a0"; font-style: normal; } evalcontainer > evaloutput > evaloutputentry.EVALWARN { background: #FFEB3B; color: black; } evalcontainer > evaloutput > evaloutputentry.EVALSTRING { color: #FFEB3B; } evalcontainer > evaloutput > evaloutputentry.EVALNUMBER { color: #2196F3; } evalcontainer > evaloutput > evaloutputentry.EVALFUNCTION { font-style: italic; } evalcontainer > evaloutput > evaloutputentry.EVALUNDEFINED { color: #9E9E9E; } evalcontainer > evaloutput > evaloutputentry.EVALERROR { background: #f44336; } evalcontainer > evaloutput > evaloutputentry.EVALWARN.EVALSTRING { color: black; } evalcontainer > evaloutput > evaloutputentry.EVALLOG::before { content: ""; } .eval-close-button { position: absolute; top: 5px; right: 10px; font-size: 18px; color: #fff; cursor: pointer; font-weight: bold; } `; document.head.appendChild(s); } if (!document.querySelector('evalcontainer')) { s = document.createElement("evalcontainer"); var output = document.createElement("evaloutput"); // Create close button var closeButton = document.createElement("span"); closeButton.innerHTML = "×"; closeButton.className = "eval-close-button"; closeButton.onclick = function() { evaljs.close(); }; s.appendChild(closeButton); function createOutputEntry(words) { var t = document.createElement("evaloutputentry"); t.innerHTML = words; t.className = 'EVALLOG'; output.appendChild(t); } createOutputEntry('To close this window, do evaljs.close();'); createOutputEntry('To clear, do evaljs.clear();'); s.appendChild(output); var textarea = document.createElement("textarea"); textarea.className = 'EVALTEXTAREA'; textarea.focus(); textarea.onkeypress = e => { if (e.keyCode === 13 && !e.shiftKey) { var t = document.createElement("evaloutputentry"), evaloutput; t.textContent = textarea.value; output.appendChild(t); t = document.createElement("evaloutputentry"); t.classList.add('EVALRESULT'); try { evaloutput = eval(textarea.value); switch (typeof evaloutput) { case 'object': evaloutput = JSON.stringify(evaloutput); t.classList.add('EVALFUNCTION'); break; case 'string': evaloutput = `"${evaloutput}"`; t.classList.add('EVALSTRING'); break; case 'number': case 'boolean': t.classList.add('EVALNUMBER'); break; case 'function': evaloutput = evaloutput.toString(); t.classList.add('EVALFUNCTION'); break; case 'undefined': t.classList.add('EVALUNDEFINED'); break; case 'symbol': evaloutput = evaloutput.toString(); t.classList.add('EVALSTRING'); break; } } catch(e) { evaloutput = e; t.classList.add('EVALERROR'); } t.textContent = evaloutput + ''; output.appendChild(t); output.scrollTop = output.scrollHeight; textarea.value = ''; e.preventDefault(); return false; } }; s.appendChild(textarea); document.body.appendChild(s); evaljs = { window: s, clear() { while (output.hasChildNodes()) output.removeChild(output.lastChild); }, close() { document.body.removeChild(this.window); } }; function merp(u, t) { switch (typeof u) { case 'object': u = JSON.stringify(u); t.classList.add('EVALFUNCTION'); break; case 'string': u = `"${u}"`; t.classList.add('EVALSTRING'); break; case 'number': case 'boolean': t.classList.add('EVALNUMBER'); break; case 'function': u = u.toString(); t.classList.add('EVALFUNCTION'); break; case 'undefined': t.classList.add('EVALUNDEFINED'); break; case 'symbol': u = u.toString(); t.classList.add('EVALSTRING'); break; } return u; } console.log = function() { for (var i = 0; i < arguments.length; i++) { var t = document.createElement("evaloutputentry"), u = arguments[i]; t.classList.add('EVALLOG'); u = merp(u, t); t.textContent = (u + '').replace(/\s/g, '\\u00a0'); output.appendChild(t); } }; console.warn = function() { for (var i = 0; i < arguments.length; i++) { var t = document.createElement("evaloutputentry"), u = arguments[i]; t.classList.add('EVALLOG'); t.classList.add('EVALWARN'); u = merp(u, t); t.textContent = (u + '').replace(/\s/g, '\\u00a0'); output.appendChild(t); } }; console.error = function() { for (var i = 0; i < arguments.length; i++) { var t = document.createElement("evaloutputentry"), u = arguments[i]; t.classList.add('EVALLOG'); t.classList.add('EVALERROR'); u = merp(u, t); t.textContent = (u + '').replace(/\s/g, '\\u00a0'); output.appendChild(t); } }; // Initialize drag-and-drop using interact.js script.onload = function() { interact('evalcontainer').draggable({ modifiers: [ interact.modifiers.restrictRect({ restriction: 'parent', endOnly: true }) ], listeners: { move(event) { var target = event.target; var x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx; var y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; target.style.transform = `translate(${x}px, ${y}px)`; target.setAttribute('data-x', x); target.setAttribute('data-y', y); } } }); }; } }());