/philo/contrib/sobol/static/sobol/ajax_search.js

https://github.com/gpennington/philo · JavaScript · 81 lines · 77 code · 1 blank · 3 comment · 16 complexity · 7870b984432bce4d953d4feefaaf07ce MD5 · raw file

  1. (function($){
  2. var sobol = window.sobol = {};
  3. sobol.favoredResults = []
  4. sobol.favoredResultSearch = null;
  5. sobol.search = function(){
  6. var searches = sobol.searches = $('article.search');
  7. if(sobol.favoredResults.length) sobol.favoredResultSearch = searches.eq(0);
  8. for (var i=sobol.favoredResults.length ? 1 : 0;i<searches.length;i++) {
  9. (function(){
  10. var s = searches[i];
  11. $.ajax({
  12. url: s.getAttribute('data-url'),
  13. dataType: 'json',
  14. success: function(data){
  15. sobol.onSuccess($(s), data);
  16. },
  17. error: function(data, textStatus, errorThrown){
  18. sobol.onError($(s), textStatus, errorThrown);
  19. }
  20. });
  21. }());
  22. };
  23. }
  24. sobol.renderResult = function(result){
  25. // Returns the result rendered as a string. Override this to provide custom rendering.
  26. var url = result['url'],
  27. title = result['title'],
  28. content = result['content'],
  29. rendered = '';
  30. if(url){
  31. rendered += "<dt><a href='" + url + "'>" + title + "</a></dt>";
  32. } else {
  33. rendered += "<dt>" + title + "</dt>";
  34. }
  35. if(content && content != ''){
  36. rendered += "<dd>" + content + "</dd>"
  37. }
  38. return rendered
  39. }
  40. sobol.addFavoredResult = function(result) {
  41. var dl = sobol.favoredResultSearch.find('dl');
  42. if(!dl.length){
  43. dl = $('<dl>');
  44. dl.appendTo(sobol.favoredResultSearch);
  45. sobol.favoredResultSearch.removeClass('loading');
  46. }
  47. dl[0].innerHTML += sobol.renderResult(result)
  48. }
  49. sobol.onSuccess = function(ele, data){
  50. // hook for success!
  51. ele.removeClass('loading');
  52. if (data['results'].length) {
  53. ele[0].innerHTML += "<dl>";
  54. $.each(data['results'], function(i, v){
  55. ele[0].innerHTML += sobol.renderResult(v);
  56. })
  57. ele[0].innerHTML += "</dl>";
  58. if(data['hasMoreResults'] && data['moreResultsURL']) ele[0].innerHTML += "<footer><p><a href='" + data['moreResultsURL'] + "'>See more results</a></p></footer>";
  59. } else {
  60. ele.addClass('empty');
  61. ele[0].innerHTML += "<p>No results found.</p>";
  62. ele.slideUp();
  63. }
  64. if (sobol.favoredResultSearch){
  65. for (var i=0;i<data['results'].length;i++){
  66. var r = data['results'][i];
  67. if ($.inArray(r['actual_url'], sobol.favoredResults) != -1){
  68. sobol.addFavoredResult(r);
  69. }
  70. }
  71. }
  72. };
  73. sobol.onError = function(ele, textStatus, errorThrown){
  74. // Hook for error...
  75. ele.removeClass('loading');
  76. text = errorThrown ? errorThrown : textStatus ? textStatus : "Error occurred.";
  77. ele[0].innerHTML += "<p>" + text + "</p>";
  78. };
  79. $(sobol.search);
  80. }(jQuery));