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 3.9KB

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