Pictures!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. (function() {
  2. window.apiLogin = apiLogin;
  3. window.api = api;
  4. window.elem = elem;
  5. window.uploadEl = uploadEl;
  6. window.async = async;
  7. window.debounce = debounce;
  8. window.error = error;
  9. window.$$ = $$;
  10. var sessToken = "";
  11. function apiLogin(pass, cb) {
  12. var extraHeads = [ [ "Session-Pass", pass ] ];
  13. api("login", {}, (err, token) => {
  14. if (token) {
  15. sessToken = token;
  16. cb(true);
  17. } else {
  18. cb(false);
  19. }
  20. }, extraHeads);
  21. }
  22. function argstr(args) {
  23. return "?" + Object.keys(args).map(function(key) {
  24. return encodeURIComponent(key)+"="+encodeURIComponent(args[key]);
  25. }).join("&");
  26. }
  27. function api(method, args, cb, extraHeads) {
  28. var heads = new Headers();
  29. heads.append("Session-Token", sessToken);
  30. if (extraHeads)
  31. extraHeads.forEach(h => heads.append(h[0], h[1]));
  32. var opts = {
  33. method: "POST",
  34. headers: heads
  35. };
  36. fetch("/admin/api/"+method+argstr(args), opts)
  37. .then(response => response.json())
  38. .then(res => {
  39. if (res.err && res.err === "EINVALTOKEN")
  40. setView("login");
  41. else
  42. cb(res.err, res.obj)
  43. });
  44. }
  45. function elem(tag, props, children) {
  46. var e;
  47. if (tag instanceof HTMLElement)
  48. e = tag;
  49. else
  50. e = document.createElement(tag);
  51. if (props) {
  52. for (var i in props) {
  53. e[i] = props[i];
  54. }
  55. }
  56. if (children) {
  57. for (var i in children) {
  58. e.appendChild(children[i]);
  59. }
  60. }
  61. e.appendTo = function(p) {
  62. p.appendChild(e);
  63. return e;
  64. }
  65. e.on = function(name, fn) {
  66. e.addEventListener(name, function(evt) {
  67. fn.call(e, evt);
  68. }, false);
  69. return e;
  70. }
  71. e.addClass = function(name) {
  72. if (e.className.indexOf(name) !== -1)
  73. return e;
  74. e.className += " "+name;
  75. return e;
  76. }
  77. e.removeClass = function(name) {
  78. e.className = e.className
  79. .replace(name, "")
  80. .trim()
  81. .replace(/ +/, "");
  82. return e;
  83. }
  84. e.clear = function() {
  85. var fc;
  86. while (fc = e.firstChild)
  87. e.removeChild(fc);
  88. return e;
  89. }
  90. return e;
  91. }
  92. var uploadElId = 0;
  93. function uploadEl(args, cb) {
  94. var id = uploadElId++;
  95. var frame;
  96. var form;
  97. var fileEl;
  98. return form = elem("form", {
  99. className: "uploader",
  100. action: "/admin/api/slide_file_upload"+argstr(args),
  101. method: "post",
  102. enctype: "multipart/form-data",
  103. target: "upload-form-"+id
  104. }, [
  105. frame = elem("iframe", {
  106. style: "display: none",
  107. name: "upload-form-"+id
  108. }).on("load", cb),
  109. fileEl = elem("input", {
  110. type: "file",
  111. style: "display: none",
  112. name: "file"
  113. }).on("change", () => {
  114. form.submit();
  115. }),
  116. elem("button", {
  117. innerHTML: "Upload",
  118. type: "button"
  119. }).on("click", () => {
  120. fileEl.click();
  121. })
  122. ]);
  123. }
  124. function async(n, cb) {
  125. var args = [];
  126. return function(arg) {
  127. args.push(arg);
  128. n -= 1;
  129. if (n === 0)
  130. cb(args);
  131. }
  132. }
  133. function debounce(fn, ms) {
  134. if (ms === undefined)
  135. ms = 300;
  136. var timeout;
  137. return function() {
  138. if (timeout)
  139. clearTimeout(timeout);
  140. timeout = setTimeout(function() {
  141. fn();
  142. timeout = null;
  143. }, ms);
  144. }
  145. }
  146. function error(msg) {
  147. alert(msg);
  148. }
  149. function $$() {
  150. return elem(document.querySelector.apply(document, arguments));
  151. }
  152. })();