Refactored BaseSearch/Result to use templates to render the title and content entries...
[philo.git] / philo / contrib / sobol / static / sobol / ajax_search.js
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                 
31                 if(url){
32                         rendered += "<dt><a href='" + url + "'>" + title + "</a></dt>";
33                 } else {
34                         rendered += "<dt>" + title + "</dt>";
35                 }
36                 if(content && content != ''){
37                         rendered += "<dd>" + content + "</dd>"
38                 }
39                 return rendered
40         }
41         sobol.addFavoredResult = function(result) {
42                 var dl = sobol.favoredResultSearch.find('dl');
43                 if(!dl.length){
44                         dl = $('<dl>');
45                         dl.appendTo(sobol.favoredResultSearch);
46                         sobol.favoredResultSearch.removeClass('loading');
47                 }
48                 dl[0].innerHTML += sobol.renderResult(result)
49         }
50         sobol.onSuccess = function(ele, data){
51                 // hook for success!
52                 ele.removeClass('loading');
53                 if (data['results'].length) {
54                         ele[0].innerHTML += "<dl>";
55                         $.each(data['results'], function(i, v){
56                                 ele[0].innerHTML += sobol.renderResult(v);
57                         })
58                         ele[0].innerHTML += "</dl>";
59                         if(data['hasMoreResults'] && data['moreResultsURL']) ele[0].innerHTML += "<footer><p><a href='" + data['moreResultsURL'] + "'>See more results</a></p></footer>";
60                 } else {
61                         ele.addClass('empty');
62                         ele[0].innerHTML += "<p>No results found.</p>";
63                         ele.slideUp();
64                 }
65                 if (sobol.favoredResultSearch){
66                         for (var i=0;i<data['results'].length;i++){
67                                 var r = data['results'][i];
68                                 if ($.inArray(r['actual_url'], sobol.favoredResults) != -1){
69                                         sobol.addFavoredResult(r);
70                                 }
71                         }
72                 }
73         };
74         sobol.onError = function(ele, textStatus, errorThrown){
75                 // Hook for error...
76                 ele.removeClass('loading');
77                 text = errorThrown ? errorThrown : textStatus ? textStatus : "Error occurred.";
78                 ele[0].innerHTML += "<p>" + text + "</p>";
79         };
80         $(sobol.search);
81 }(jQuery));