"use strict"; function $(name) { return document.getElementById(name); } function Tag(name, attrs, body, children, eventName, eventHandler) { let elem = document.createElement(name); if (body) { // elem.innerHTML = body; // innerHTML is ugly (slow, overwrite childNodes) let textNode = document.createTextNode(body); elem.appendChild(textNode); } for (let k in attrs) { elem.setAttribute(k, attrs[k]); } for (let i in children) { elem.appendChild(children[i]); } if (eventName && eventHandler) { elem.addEventListener(eventName, eventHandler); } return elem; } function Text(text) { return document.createTextNode(text); } function debounce(func, cancelFunc = ()=>{}, timeout = 500) { let timer; return (...args) => { cancelFunc(); clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, timeout); } } function sendRequest(method, path, query, body, funcDone, funcError) { let req = new XMLHttpRequest(); if (query) { let params = new URLSearchParams(query); path = path + "?" + params.toString(); } req.open(method, path, true); req.onreadystatechange = function () { if (req.readyState == XMLHttpRequest.DONE) { let status = req.status; if (status === 0 || (status >= 200 && status < 400)) { if (funcDone) funcDone(req.responseText, status); } else { if (funcError) funcError(req.responseText, status); } } } if (body) { req.setRequestHeader("Content-Type", "application/json"); console.log("SENDING", body) req.send(JSON.stringify(body)); } else { req.send(); } return req; }