/package-maemo/usr/lib/evopedia/static/search.js

https://github.com/johannesloetzsch/evopedia · JavaScript · 105 lines · 91 code · 13 blank · 1 comment · 23 complexity · c3a445db91c43bd358551931d0a763da MD5 · raw file

  1. function makeHTTPRequest(url, onReady) {
  2. var request;
  3. var onReadyFunc = onReady;
  4. if (window.XMLHttpRequest) {
  5. request = new XMLHttpRequest();
  6. } else if (window.ActiveXObject) {
  7. request = new ActiveXObject("Microsoft.XMLHTTP");
  8. }
  9. request.open('GET', url, true);
  10. request.onreadystatechange = function() {
  11. if (request.readyState != 4) return;
  12. onReadyFunc(request, request.status == '200');
  13. }
  14. request.send(null);
  15. return request;
  16. }
  17. function urlencode(params) {
  18. var parts = new Array();
  19. for (key in params) {
  20. parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
  21. }
  22. return parts.join("&");
  23. }
  24. function getNodeContent(node) {
  25. var value = '';
  26. var child = node.firstChild;
  27. while (child != null) {
  28. value += child.nodeValue;
  29. child = child.nextSibling;
  30. }
  31. return value;
  32. }
  33. function ArticleSearch() {
  34. var lthis = this;
  35. this.input = document.getElementById('searchInput');
  36. this.input.onkeyup = function(e) { return lthis.inputKeyUp(e || window.event); }
  37. this.input.focus();
  38. this.searchList = document.getElementById('searchList');
  39. this.searchTimeout = null;
  40. }
  41. ArticleSearch.prototype = {
  42. inputKeyUp: function(e) {
  43. if (this.searchTimeout != null) {
  44. window.clearTimeout(this.searchTimeout);
  45. this.searchTimeout = null;
  46. }
  47. //if (this.input.value.length < 3) return;
  48. var lthis = this;
  49. this.searchTimeout = window.setTimeout(function() { lthis.doSearch();}, 300);
  50. },
  51. doSearch: function() {
  52. this.searchTimeout = null;
  53. var lthis = this;
  54. makeHTTPRequest('/search?' + urlencode({q: this.input.value}),
  55. function(request, success) { lthis.showSearchResults(request, success); });
  56. this.searchList.innerHTML = '';
  57. this.searchList.appendChild(document.createTextNode('searching...'));
  58. },
  59. showSearchResults: function(request, success) {
  60. this.searchList.innerHTML = '';
  61. if (!success) {
  62. this.searchList.appendChild(document.createTextNode('Error contacting server.'));
  63. return;
  64. }
  65. var errors = request.responseXML.getElementsByTagName('error');
  66. if (errors.length > 0) {
  67. this.searchList.appendChild(document.createTextNode('Error: ' + getNodeContent(errors[0])));
  68. } else {
  69. var listobj = request.responseXML.getElementsByTagName('list')[0];
  70. if (listobj == null) {
  71. this.searchList.appendChild(document.createTextNode('Invalid server response.'));
  72. return;
  73. }
  74. var list = request.responseXML.getElementsByTagName('article');
  75. for (var i = 0; i < list.length; i ++) {
  76. var name = list[i].getAttribute('name');
  77. var url = list[i].getAttribute('url');
  78. var link = document.createElement('a');
  79. link.className = "evopedianav";
  80. link.href = url;
  81. link.appendChild(document.createTextNode(name));
  82. this.searchList.appendChild(link);
  83. this.searchList.appendChild(document.createElement('br'));
  84. }
  85. if (list.length == 0) {
  86. this.searchList.appendChild(document.createTextNode('no results'));
  87. } else if (listobj.getAttribute('complete') != '1') {
  88. this.searchList.appendChild(document.createTextNode('...'));
  89. }
  90. }
  91. }
  92. }