function argstr(args) { return "?" + Object.keys(args).map(function(key) { return encodeURIComponent(key)+"="+encodeURIComponent(args[key]); }).join("&"); } function api(method, args, cb) { fetch("/admin/api/"+method+argstr(args), { method: "POST" }) .then(response => response.json()) .then(res => cb(res.err, res.obj)); } function elem(tag, props, children) { var e; if (tag instanceof HTMLElement) e = tag; else e = document.createElement(tag); if (props) { for (var i in props) { e[i] = props[i]; } } if (children) { for (var i in children) { e.appendChild(children[i]); } } e.appendTo = function(p) { p.appendChild(e); return e; } e.on = function(name, fn) { e.addEventListener(name, function(evt) { fn.call(e, evt); }, false); return e; } e.addClass = function(name) { if (e.className.indexOf(name) !== -1) return e; e.className += " "+name; return e; } e.removeClass = function(name) { e.className = e.className .replace(name, "") .trim() .replace(/ +/, ""); return e; } e.clear = function() { var fc; while (fc = e.firstChild) e.removeChild(fc); return e; } return e; } var uploadElId = 0; function uploadEl(args, cb) { var id = uploadElId++; var frame; var form; var fileEl; return form = elem("form", { className: "uploader", action: "/admin/api/slide_file_upload"+argstr(args), method: "post", enctype: "multipart/form-data", target: "upload-form-"+id }, [ frame = elem("iframe", { style: "display: none", name: "upload-form-"+id }).on("load", cb), fileEl = elem("input", { type: "file", style: "display: none", name: "file" }).on("change", () => { form.submit(); }), elem("button", { innerHTML: "Upload", type: "button" }).on("click", () => { fileEl.click(); }) ]); } function async(n, cb) { var args = []; return function(arg) { args.push(arg); n -= 1; if (n === 0) cb(args); } } function debounce(fn, ms) { if (ms === undefined) ms = 300; var timeout; return function() { if (timeout) clearTimeout(timeout); timeout = setTimeout(function() { fn(); timeout = null; }, ms); } } function error(msg) { alert(msg); } var $$ = function() { return elem(document.querySelector.apply(document, arguments)); }