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.

script.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. var elemAdd = document.querySelector("#add");
  2. var elemName = elemAdd.querySelector(".name");
  3. var elemSuggestions = elemAdd.querySelector(".suggestions");
  4. var elemList = document.querySelector("#list");
  5. elemSuggestions.show = function() {
  6. elemSuggestions.className = "suggestions";
  7. elemSuggestions.style.display = "block";
  8. }
  9. elemSuggestions.hide = function() {
  10. elemSuggestions.className = "suggestions hidden";
  11. setTimeout(function() {
  12. elemSuggestions.style.display = "none";
  13. }, 100);
  14. }
  15. elemSuggestions.hide();
  16. var events = WebEvents();
  17. var words = [];
  18. function capitalize(word) {
  19. var first = word[0].toUpperCase();
  20. return first + word.substring(1);
  21. }
  22. function remove(index) {
  23. var elem;
  24. for (var i in elemList.childNodes) {
  25. var e = elemList.childNodes[i];
  26. var eindex = parseInt(e.querySelector(".index").value);
  27. if (eindex == index) {
  28. elem = e;
  29. break;
  30. }
  31. }
  32. if (!elem)
  33. return;
  34. elem.className += " hidden";
  35. setTimeout(function() {
  36. elem.parentNode.removeChild(elem);
  37. }, 1000);
  38. }
  39. function add(word, index, animate) {
  40. if (!word)
  41. return;
  42. var elem = document.createElement("div");
  43. if (animate)
  44. elem.className = "elem hidden";
  45. else
  46. elem.className = "elem";
  47. var elemName = document.createElement("span");
  48. elemName.className = "name";
  49. elemName.textContent = capitalize(word);
  50. var elemIndex = document.createElement("input");
  51. elemIndex.className = "index";
  52. elemIndex.value = index;
  53. elemIndex.type = "hidden";
  54. var elemOk = document.createElement("span");
  55. elemOk.className = "ok";
  56. elemOk.addEventListener("click", function() {
  57. post("/remove/"+index);
  58. });
  59. elem.appendChild(elemIndex);
  60. elem.appendChild(elemName);
  61. elem.appendChild(elemOk);
  62. list.insertBefore(elem, list.firstChild);
  63. if (animate) {
  64. setTimeout(function() {
  65. elem.className = "elem";
  66. }, 100);
  67. }
  68. }
  69. function request(method, url, cb) {
  70. var xhr = new XMLHttpRequest();
  71. xhr.addEventListener("load", function() {
  72. var obj;
  73. try {
  74. obj = JSON.parse(xhr.responseText);
  75. if (cb)
  76. cb(null, JSON.parse(xhr.responseText));
  77. } catch (err) {
  78. console.log(xhr.responseText);
  79. if (cb)
  80. cb(err);
  81. }
  82. });
  83. xhr.addEventListener("error", function(err) {
  84. if (cb)
  85. cb(err);
  86. });
  87. xhr.open(method, url);
  88. xhr.send();
  89. }
  90. function get(url, cb) {
  91. request("GET", url, cb);
  92. }
  93. function post(url, cb) {
  94. request("POST", url, cb);
  95. }
  96. function clearChildren(elem) {
  97. while (elem.firstChild) {
  98. elem.removeChild(elem.firstChild);
  99. }
  100. }
  101. elemAdd.addEventListener("submit", function(evt) {
  102. evt.preventDefault();
  103. if (elemName.value == "")
  104. return;
  105. post("/add/"+encodeURIComponent(elemName.value));
  106. elemName.value = "";
  107. });
  108. function displaySuggestions() {
  109. setTimeout(function() {
  110. var name = elemName.value;
  111. var suggestions = words
  112. .filter(function(w) {
  113. return w.name.indexOf(name.toLowerCase()) !== -1;
  114. })
  115. .sort(function(a, b) {
  116. return a.count - b.count;
  117. });
  118. clearChildren(elemSuggestions);
  119. suggestions.forEach(function(w) {
  120. var elem = document.createElement("div");
  121. elem.className = "suggestion";
  122. elem.textContent = capitalize(w.name);
  123. elemSuggestions.insertBefore(elem, elemSuggestions.firstChild);
  124. elem.addEventListener("click", function() {
  125. console.log(w);
  126. post("/add/"+encodeURIComponent(w.name));
  127. elemSuggestions.hide();
  128. elemName.value = "";
  129. elemName.blur();
  130. });
  131. });
  132. if (suggestions.length > 0)
  133. elemSuggestions.show();
  134. else
  135. elemSuggestions.hide();
  136. }, 10);
  137. }
  138. elemName.addEventListener("keydown", displaySuggestions);
  139. elemName.addEventListener("focus", displaySuggestions);
  140. elemName.addEventListener("blur", function(evt) {
  141. elemSuggestions.hide();
  142. });
  143. events.on("add", function(evt) {
  144. add(evt.name, evt.index, true);
  145. var word = words.filter(function(w) {
  146. return w.name === evt.name;
  147. })[0];
  148. if (word)
  149. word.count += 1;
  150. else
  151. words.push({ name: evt.name, count: 1 });
  152. });
  153. events.on("remove", function(evt) {
  154. remove(evt.index);
  155. });
  156. events.on("connection", function() {
  157. clearChildren(elemList);
  158. get("/list", function(err, list) {
  159. list.forEach(function(word, index) { add(word, index); });
  160. });
  161. });
  162. get("/words", function(err, w) {
  163. if (err)
  164. return console.error(err);
  165. words = w;
  166. });