Simple detail view.
[mkdru-moved-to-drupal.org.git] / mkdru.client.js
1 // Set up namespace and some state.
2 var mkdru = {
3   // Settings to pass to pz2.js
4   usesessions: Drupal.settings.mkdru.use_sessions === '1',
5   showResponseType: 'json',
6   // Variables
7   curPage: 1,
8   recPerPage: 20,
9   totalRec: 0,
10   curSort: 'relevance',
11   curFilter: null,
12   submitted: false,
13   sourceMax: Drupal.settings.mkdru.source_max,
14   subjectMax: Drupal.settings.mkdru.subject_max,
15   authorMax: Drupal.settings.mkdru.author_max,
16   pz2: null,
17   pazpar2Path: Drupal.settings.mkdru.pz2_path
18 };
19
20
21
22 // pz2.js event handlers:
23 mkdru.pz2Init = function () {
24   if (mkdru.query) mkdru.triggerSearch();
25   //mkdru.pz2.stat();
26   //mkdru.pz2.bytarget();
27 };
28
29 mkdru.pz2Show = function (data) {
30   mkdru.totalRec = data.merged;
31
32   var pagerHtml = Drupal.theme('mkdruPager', data, mkdru.curPage,
33                                       Math.ceil(mkdru.totalRec / mkdru.recPerPage));
34   $('.mkdru-pager').html(pagerHtml);
35   $('.mkdru-next').bind('click', mkdru.nextPage);
36   $('.mkdru-prev').bind('click', mkdru.prevPage);
37
38   var countsHtml = 'Displaying: ' + (data.start + 1) + ' to '
39     + (data.start + data.num) + ' of ' + data.merged + ' (found: ' + data.total + ')';
40   $('.mkdru-counts').html(countsHtml);
41
42   var html = "";
43   for (var i = 0; i < data.hits.length; i++) {
44     html += Drupal.theme('mkdruResult', data.hits[i], 
45                          i + 1 + mkdru.recPerPage * 
46                          (mkdru.curPage - 1));
47   }
48   $('.mkdru-result-list').html(html);
49   $('.mkdru-result-title').bind('click', mkdru.requestDetail);
50   $('.mkdru-results').show();
51 };
52
53 mkdru.pz2Status = function (data) {
54 };
55
56 mkdru.pz2Term = function (data) {
57   var html = "";
58   for (var i = 0; i < data.xtargets.length && i < mkdru.sourceMax; i++ ) {
59     html += Drupal.theme('mkdruTerm', data.xtargets[i].name, data.xtargets[i].freq, 
60                           'mkdru-facet-source', data.xtargets[i].id);
61   }
62   $('.mkdru-facet-sources').html(html);
63
64   html = "";
65   for (var i = 0; i < data.subject.length && i < mkdru.subjectMax; i++ ) {
66     html += Drupal.theme('mkdruTerm', data.subject[i].name, data.subject[i].freq, 
67                           'mkdru-facet-subject', data.subject[i].id);
68   }
69   $('.mkdru-facet-subjects').html(html);
70
71   html = "";
72   for (var i = 0; i < data.author.length && i < mkdru.authorMax; i++ ) {
73     html += Drupal.theme('mkdruTerm', data.author[i].name, data.author[i].freq, 
74                           'mkdru-facet-author', data.author[i].id);
75   }
76   $('.mkdru-facet-authors').html(html);
77
78   $('.mkdru-facet-source').bind('click', function (e) {
79     mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
80     return false;
81   });
82
83   $('.mkdru-facet-subject').bind('click', function (e) {
84     mkdru.limitQuery('su', this.firstChild.nodeValue);
85     return false;
86   });
87
88   $('.mkdru-facet-author').bind('click', function (e) {
89     mkdru.limitQuery('au', this.firstChild.nodeValue);
90     return false;
91   });
92 };
93
94 mkdru.pz2ByTarget = function (data) {
95   
96 };
97
98 mkdru.pz2Record = function (data) {
99   clearTimeout(mkdru.pz2.recordTimer);
100 //   $('.mkdru-results').hide();
101 //   mkdru.pz2.stop();
102 //   clearTimeout(mkdru.pz2.showTimer);  
103   $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data));
104   $('.mkdru-detail').bind('click', function () {$('.mkdru-detail').hide()});
105   $('.mkdru-detail').show();
106
107 };
108
109 // UI functions:
110 mkdru.submitQuery = function () {
111   mkdru.query = $('.mkdru-search input:text').attr('value');
112   mkdru.resetPage();
113   mkdru.pollDropDowns();
114   mkdru.search();
115   mkdru.submitted = true;
116   return false;
117 };
118
119 mkdru.triggerSearch = function () {
120   mkdru.search();
121   mkdru.submitted = true;
122 };
123
124 mkdru.search = function () {
125   mkdru.pz2.search(mkdru.query, mkdru.recPerPage, mkdru.curSort,
126       mkdru.curFilter);
127 };
128
129 mkdru.pollDropDowns = function () {
130   mkdru.recPerPage = $('.mkdru-perpage').attr('value');
131   mkdru.curSort = $('.mkdru-sort').attr('value');
132   if (!mkdru.submitted) return false;
133   mkdru.resetPage();
134   mkdru.pz2.show(0, mkdru.recPerPage, mkdru.curSort);
135   return false;
136 };
137
138 mkdru.limitQuery = function (field, value) {
139   $('.mkdru-search input:text').attr('value', function () {
140     return this.value += ' and ' + field + '="' + value + '"';
141   });
142   mkdru.submitQuery();
143 };
144
145 mkdru.limitTarget = function (id, name) {
146   var navi = document.getElementById('mkdru-navi');
147   navi.innerHTML = 
148         'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
149         + name + '</a>';
150   navi.innerHTML += '<hr/>';
151   mkdru.curFilter = 'pz:id=' + id;
152   mkdru.resetPage();
153   mkdru.pollDropDowns();
154   mkdru.search();
155   return false;
156 };
157
158 mkdru.resetPage = function () {
159   mkdru.curPage = 1;
160   mkdru.totalRec = 0;
161 };
162
163 mkdru.showPage = function (pageNum) {
164   mkdru.curPage = pageNum;
165   mkdru.pz2.showPage(pageNum-1);
166 };
167
168 mkdru.requestDetail = function (e) {
169   mkdru.pz2.record(e.target.parentNode.id.replace('rec_', ''));
170 };
171
172 mkdru.nextPage = function () {
173   if (mkdru.totalRec - mkdru.recPerPage * mkdru.curPage > 0) {
174     mkdru.pz2.showNext();
175     mkdru.curPage++;
176   }
177 };
178
179 mkdru.prevPage = function () {
180   if (mkdru.pz2.showPrev() != false) {
181     mkdru.curPage--;
182   }
183 };
184
185
186 // wait until the DOM is ready, bind events
187 // and instantiate pz2 library
188 $(document).ready(function () {
189   $('.mkdru-search').bind('submit', mkdru.submitQuery);
190   $('.mkdru-search input:text').attr('value', '');
191   $('.mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
192   $('.mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
193   mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
194               "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
195               "pazpar2path": mkdru.pazpar2path,
196               "oninit": mkdru.pz2Init,
197               "onstat": mkdru.pz2Status,
198               "onterm": mkdru.pz2Term,
199               "termlist": "xtargets,subject,author",
200               "onbytarget": mkdru.pz2ByTarget,
201               "usesessions" : mkdru.usesessions,
202               "showResponseType": mkdru.showResponseType,
203               "onrecord": mkdru.pz2Record,
204               "autoInit": false } );
205   mkdru.query = Drupal.settings.mkdru.query;
206   if (mkdru.usesessions) {
207     mkdru.pz2.init();
208   } else if (mkdru.query) {
209     mkdru.triggerSearch(); 
210   }
211 });