script.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. window.onload = function () {
  2. category = document.getElementById('id_category').value;
  3. param = document.getElementById('id_param').value;
  4. requestStationList(category, param);
  5. requestStationList('', '', true);
  6. }
  7. function initSearchStation() {
  8. var stationsearch = document.getElementById('stationsearch');
  9. stationsearch.value = '';
  10. stationsearch.onkeyup = function (event) {
  11. if(event.code == 'Backspace')
  12. stationsearch.value = '';
  13. var filter = stationsearch.value.toUpperCase();
  14. document.getElementById('stationcount').textContent = refreshFilteredList(
  15. document.getElementById('stationList'), filter, false );
  16. }
  17. }
  18. function initSearchBookmark() {
  19. bookmarksearch = document.getElementById('idCategory');
  20. bookmarksearch.value = '';
  21. bookmarksearch.onkeyup = function (event) {
  22. if(event.code == 'Backspace')
  23. document.getElementById('idCategory').value = '';
  24. refreshFilteredList(document.getElementById("bookmarkList"), document.getElementById('idCategory').value, true);
  25. }
  26. }
  27. function createItem(name, icon, description) {
  28. var itemElem = document.createElement("div");
  29. itemElem.className = "item";
  30. var itemicon = document.createElement("div");
  31. itemicon.className = "itemicon";
  32. if (icon.length > 0){
  33. var itemiconimg = document.createElement("img");
  34. itemiconimg.src = icon;
  35. itemiconimg.className = "itemicon";
  36. itemicon.appendChild(itemiconimg);
  37. }
  38. var itemtext = document.createElement("div");
  39. itemtext.className = "itemtext";
  40. var h4text = document.createElement("h4");
  41. h4text.textContent = name;
  42. var desc = document.createElement("p");
  43. desc.textContent = description;
  44. itemtext.appendChild(h4text);
  45. itemtext.appendChild(desc);
  46. itemElem.appendChild(itemicon);
  47. itemElem.appendChild(itemtext);
  48. return itemElem;
  49. }
  50. function requestStationList(category, param, isbookmarklist = false) {
  51. var url = 'api/stations?category=' + category;
  52. var id_listnode = "stationList";
  53. var countall = 0;
  54. if (isbookmarklist) {
  55. var url = 'api/bookmarks?category=' + category;
  56. var id_listnode = "bookmarkList";
  57. }
  58. if (param.length > 0) {
  59. if (category.indexOf('language') > -1) {
  60. url = url + '&language=' + param.toLowerCase();
  61. }
  62. if (category.indexOf('country') > -1) {
  63. url = url + '&country=' + param;
  64. }
  65. }
  66. var myRequest = new Request(url);
  67. var myOldList = document.getElementById(id_listnode);
  68. var myList = myOldList.cloneNode(false);
  69. // First Elemet is empty (workaround <ul> needs a <li> element)
  70. let listItemEmpty = document.createElement('li');
  71. listItemEmpty.appendChild(createItem('','', ''));
  72. listItemEmpty.dataset.isemptyelement = true;
  73. listItemEmpty.hidden = false;
  74. myList.appendChild(listItemEmpty);
  75. myOldList.parentNode.replaceChild(myList, myOldList);
  76. fetch(myRequest)
  77. .then(response => response.json())
  78. .then(data => {
  79. for (const station of data) {
  80. countall = countall + 1;
  81. let listItem = document.createElement('li');
  82. listItem.appendChild(
  83. createItem(station.name, station.icon, station.description)
  84. );
  85. listItem.dataset.json = JSON.stringify(station);
  86. if(isbookmarklist){
  87. listItem.dataset.search = (station.description);
  88. listItem.onclick = function (event) {deleteElement(event,listItem)};
  89. } else {
  90. listItem.dataset.search = (station.name + '#' + station.description).toUpperCase();
  91. listItem.onclick = function (event) {copyElementToBookmark(event,listItem)};
  92. }
  93. listItem.dataset.category = station.description;
  94. listItem.dataset.emptyelement = false;
  95. myList.appendChild(listItem);
  96. if (listItemEmpty) listItemEmpty.hidden = true;
  97. }
  98. if(isbookmarklist) {
  99. setBookmarkCategoryList();
  100. } else {
  101. document.getElementById('stationcount').textContent = countall + '/' + countall;
  102. }
  103. })
  104. .catch(console.error);
  105. initSearchStation();
  106. initSearchBookmark();
  107. }
  108. function deleteElement(event, objElem){
  109. if(objElem) {
  110. objElem.remove();
  111. refreshFilteredList(document.getElementById("bookmarkList"), document.getElementById('idCategory').value, true);
  112. setBookmarkCategoryList();
  113. saveBookmarks();
  114. }
  115. }
  116. function copyElementToBookmark(event, objElem){
  117. if(objElem) {
  118. let myList = document.getElementById("bookmarkList")
  119. let listItem = document.createElement('li');
  120. let station = JSON.parse(objElem.dataset.json);
  121. let bookmarksearch = document.getElementById('idCategory');
  122. if(bookmarksearch.value.length == 0) bookmarksearch.value = 'Others'
  123. station.description = bookmarksearch.value;
  124. listItem.appendChild(
  125. createItem(station.name , station.icon, station.description)
  126. );
  127. listItem.dataset.json = JSON.stringify(station);
  128. listItem.dataset.search = station.description;
  129. listItem.dataset.category = station.description;
  130. listItem.dataset.emptyelement = false;
  131. listItem.onclick = function (event) {deleteElement(event,listItem)};
  132. myList.appendChild(listItem);
  133. refreshFilteredList(document.getElementById("bookmarkList"), document.getElementById('idCategory').value, true);
  134. setBookmarkCategoryList();
  135. saveBookmarks();
  136. }
  137. }
  138. function refreshFilteredList(myListNode, filtertxt, chkEqual = false){
  139. var isEmpty = true;
  140. var myListAr = Array.from(myListNode.childNodes);
  141. var emptyElement = null;
  142. var countall = 0;
  143. var countfiltered = 0;
  144. myListAr.forEach(function (listItem) {
  145. try {
  146. if (listItem.dataset.isemptyelement){
  147. emptyElement = listItem;
  148. } else {
  149. countall = countall+1;
  150. let bfound = true;
  151. if (filtertxt.length > 0) {
  152. var searchval = listItem.dataset.search;
  153. if(chkEqual) {
  154. bfound = (searchval === filtertxt);
  155. } else {
  156. bfound = (searchval.indexOf(filtertxt) > -1);
  157. }
  158. }
  159. if(bfound) {
  160. countfiltered = countfiltered + 1;
  161. listItem.hidden = false;
  162. isEmpty = false;
  163. } else {
  164. listItem.hidden = true;
  165. }
  166. }
  167. } catch (e) {
  168. console.error(listItem, e)
  169. }
  170. });
  171. if (emptyElement) emptyElement.hidden = !isEmpty;
  172. return countfiltered + '/' +countall;
  173. }
  174. function onInputSelect(e, objElem) {
  175. switch(objElem.id){
  176. case 'id_category':
  177. paramElem = document.getElementById('id_param')
  178. param = paramElem.value
  179. category = objElem.value
  180. switch (category) {
  181. case 'language':
  182. setParamlist();
  183. try {
  184. paramElem.fokus();
  185. } catch (e) {};
  186. return;
  187. case 'country':
  188. setParamlist();
  189. try {
  190. paramElem.fokus();
  191. } catch (e) {};
  192. return;
  193. default:
  194. paramElem.disabled = true;
  195. break;
  196. }
  197. document.getElementById('stationcount').textContent = requestStationList(category, param);
  198. break;
  199. case 'id_param':
  200. document.getElementById('stationcount').textContent = requestStationList(
  201. document.getElementById('id_category').value,
  202. document.getElementById('id_param').value);
  203. break;
  204. case 'idCategory':
  205. refreshFilteredList(document.getElementById("bookmarkList"), document.getElementById('idCategory').value, true);
  206. break;
  207. case 'stationsearch':
  208. document.getElementById('stationcount').textContent =
  209. refreshFilteredList(document.getElementById('stationList'),
  210. document.getElementById('stationsearch').value.toUpperCase(), false );
  211. break;
  212. }
  213. }
  214. function setBookmarkCategoryList() {
  215. var categoryList = [];
  216. var bookmarkList = Array.from(document.getElementById("bookmarkList").childNodes);
  217. bookmarkList.forEach(function (listItem) {
  218. try {
  219. if(!listItem.dataset.isemptyelement) {
  220. var category = listItem.dataset.category;
  221. if (!categoryList.find(function(arElem) { return (category == arElem);})) {
  222. categoryList.push(category);
  223. }
  224. }
  225. } catch (e) {
  226. console.error(listItem, e)
  227. }
  228. })
  229. if (categoryList.length >0) {
  230. var myOldList = document.getElementById('categorylist');
  231. var myList = myOldList.cloneNode(false);
  232. myOldList.parentNode.replaceChild(myList, myOldList);
  233. for (const categ of categoryList) {
  234. var option = document.createElement('option');
  235. option.value = categ;
  236. myList.appendChild(option);
  237. }
  238. }
  239. }
  240. function setParamlist() {
  241. var category = document.getElementById('id_category').value
  242. var url = 'api/paramlist?category=' + category;
  243. document.getElementById('id_param').value = '';
  244. var myRequest = new Request(url);
  245. var myOldList = document.getElementById('paramlist');
  246. var myList = myOldList.cloneNode(false);
  247. myOldList.parentNode.replaceChild(myList, myOldList);
  248. fetch(myRequest)
  249. .then(response => response.json())
  250. .then(data => {
  251. for (const param of data) {
  252. var option = document.createElement('option');
  253. option.value = param.name;
  254. myList.appendChild(option);
  255. }
  256. })
  257. .catch(console.error);
  258. document.getElementById('id_param').disabled = false;
  259. }
  260. function keyUpEvent(e, objElem) {
  261. switch (objElem.id) {
  262. case 'id_param':
  263. param = objElem.value;
  264. category = document.getElementById('id_category').value;
  265. if (e instanceof KeyboardEvent) {
  266. // it is a keyboard event!
  267. if (e.code == 'Enter') {
  268. document.getElementById('stationcount').textContent = requestStationList(category, param);
  269. } else if (e.code == 'Backspace')
  270. this.value = '';
  271. } else if (e instanceof Event) {
  272. // one Element from selection is selected
  273. document.getElementById('stationcount').textContent = requestStationList(category, param);
  274. }
  275. break;
  276. default:
  277. break;
  278. }
  279. }
  280. function saveBookmarks(){
  281. var bookmarkJsonlist=[]
  282. var bookmarkList = Array.from(document.getElementById("bookmarkList").childNodes);
  283. bookmarkList.forEach(function (listItem) {
  284. if(!listItem.dataset.isemptyelement) {
  285. station = JSON.parse(listItem.dataset.json)
  286. bookmarkJsonlist.push( station )
  287. }
  288. })
  289. var data = JSON.stringify(bookmarkJsonlist)
  290. var xhr = new XMLHttpRequest();
  291. xhr.open("POST", 'api/bookmarks', true);
  292. xhr.setRequestHeader("Content-Type", "application/json");
  293. xhr.onreadystatechange = function () {
  294. if (xhr.readyState === 4 && xhr.status === 200) {
  295. var json = JSON.parse(xhr.responseText);
  296. console.log(json);
  297. }
  298. };
  299. xhr.send(data);
  300. }