No details, but bookmarkable with history.
[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   submitted: false,
8   pz2: null,
9   totalRec: 0,
10   sourceMax: Drupal.settings.mkdru.source_max,
11   subjectMax: Drupal.settings.mkdru.subject_max,
12   authorMax: Drupal.settings.mkdru.author_max,
13   pazpar2Path: Drupal.settings.mkdru.pz2_path,
14   // State
15   defaultState: {
16     page: 1,
17     perpage: 20,
18     sort: 'relevance',
19     filter: null,
20     query:null,
21   },
22   state: {},
23 };
24
25
26
27 // So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
28 if (!$.isArray) $.isArray = function( obj ) {
29   return toString.call(obj) === "[object Array]";
30 },
31
32
33
34 // pz2.js event handlers:
35 mkdru.pz2Init = function () {
36   if (mkdru.state.query) mkdru.triggerSearch();
37   //mkdru.pz2.stat();
38   //mkdru.pz2.bytarget();
39 };
40
41 mkdru.pz2Show = function (data) {
42   mkdru.totalRec = data.merged;
43
44   var pagerHtml = Drupal.theme('mkdruPager', data, mkdru.state.page,
45                                       Math.ceil(mkdru.totalRec / mkdru.state.perpage));
46   $('.mkdru-pager').html(pagerHtml);
47   $('.mkdru-next').bind('click', mkdru.nextPage);
48   $('.mkdru-prev').bind('click', mkdru.prevPage);
49
50   var countsHtml = 'Displaying: ' + (data.start + 1) + ' to '
51     + (data.start + data.num) + ' of ' + data.merged + ' (found: ' + data.total + ')';
52   $('.mkdru-counts').html(countsHtml);
53
54   var html = "";
55   for (var i = 0; i < data.hits.length; i++) {
56     html += Drupal.theme('mkdruResult', data.hits[i], 
57                          i + 1 + mkdru.state.perpage * 
58                          (mkdru.state.page - 1));
59   }
60   $('.mkdru-result-list').html(html);
61   $('.mkdru-result-title').bind('click', mkdru.requestDetail);
62   $('.mkdru-results').show();
63 };
64
65 mkdru.pz2Status = function (data) {
66 };
67
68 mkdru.pz2Term = function (data) {
69   var html = "";
70   for (var i = 0; i < data.xtargets.length && i < mkdru.sourceMax; i++ ) {
71     html += Drupal.theme('mkdruTerm', data.xtargets[i].name, data.xtargets[i].freq, 
72                           'mkdru-facet-source', data.xtargets[i].id);
73   }
74   $('.mkdru-facet-sources').html(html);
75
76   html = "";
77   for (var i = 0; i < data.subject.length && i < mkdru.subjectMax; i++ ) {
78     html += Drupal.theme('mkdruTerm', data.subject[i].name, data.subject[i].freq, 
79                           'mkdru-facet-subject', data.subject[i].id);
80   }
81   $('.mkdru-facet-subjects').html(html);
82
83   html = "";
84   for (var i = 0; i < data.author.length && i < mkdru.authorMax; i++ ) {
85     html += Drupal.theme('mkdruTerm', data.author[i].name, data.author[i].freq, 
86                           'mkdru-facet-author', data.author[i].id);
87   }
88   $('.mkdru-facet-authors').html(html);
89
90   $('.mkdru-facet-source').bind('click', function (e) {
91     mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
92     return false;
93   });
94
95   $('.mkdru-facet-subject').bind('click', function (e) {
96     mkdru.limitQuery('su', this.firstChild.nodeValue);
97     return false;
98   });
99
100   $('.mkdru-facet-author').bind('click', function (e) {
101     mkdru.limitQuery('au', this.firstChild.nodeValue);
102     return false;
103   });
104 };
105
106 mkdru.pz2ByTarget = function (data) {
107   
108 };
109
110 mkdru.pz2Record = function (data) {
111   clearTimeout(mkdru.pz2.showTimer);
112   $('.mkdru-results').hide();
113   $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data));
114   $('.mkdru-detail').bind('click', function () {$('.mkdru-detail').hide()});
115   $('.mkdru-detail').show();
116   clearTimeout(mkdru.pz2.recordTimer);
117 };
118
119
120
121 // State and URL handling 
122
123 // populate state from an object and fill in the blanks with defaults
124 mkdru.stateFromObject = function (obj) {
125   for (var key in mkdru.defaultState) {
126     if (typeof(obj[key]) != "undefined") {
127       dump (key + " :: " + obj[key] + "\n");
128       mkdru.state[key] = obj[key];
129     }
130     else {
131       mkdru.state[key] = mkdru.defaultState[key];
132     }
133   }
134 };
135
136 // populate state from current window's hash string
137 mkdru.stateFromHash = function () {
138   mkdru.stateFromObject($.deparam.fragment());
139 };
140
141 // set current window's hash string from state
142 mkdru.hashFromState = function () {
143   var alteredState = {};
144   for (var key in mkdru.defaultState) {
145     if (mkdru.state[key] != mkdru.defaultState[key]) {
146       alteredState[key] = mkdru.state[key];
147     }
148   }
149   $.bbq.pushState(alteredState);
150 };
151
152 // update mkdru_form theme's ui to match state
153 mkdru.uiFromState = function () {
154   for (var key in mkdru.state) {
155     switch(key) {
156     case 'query':
157       $('.mkdru-search input:text').attr('value', mkdru.state[key]);
158       break;
159     case 'perpage':
160       $('.mkdru-perpage').attr('value', mkdru.state[key]);
161       break;
162     case 'sort':
163       $('.mkdru-sort').attr('value', mkdru.state[key]);
164       break;
165     }
166   }
167 };
168
169 mkdru.hashChange = function () {
170   dump("Submidded? " + mkdru.submitted + "\n");
171 };
172
173
174
175 // UI functions:
176 mkdru.submitQuery = function () {
177   mkdru.state.query = $('.mkdru-search input:text').attr('value');
178   mkdru.resetPage();
179   mkdru.pollDropDowns();
180   mkdru.hashFromState();
181   mkdru.search();
182   mkdru.submitted = true;
183   return false;
184 };
185
186 mkdru.triggerSearch = function () {
187   mkdru.search();
188   mkdru.submitted = true;
189 };
190
191 mkdru.search = function () {
192   $('.mkdru-detail').hide();
193   mkdru.pz2.search(mkdru.state.query, mkdru.state.perpage, mkdru.state.sort,
194       mkdru.state.filter);
195 };
196
197 mkdru.pollDropDowns = function () {
198   mkdru.state.perpage = $('.mkdru-perpage').attr('value');
199   mkdru.state.sort = $('.mkdru-sort').attr('value');
200   if (!mkdru.submitted) return false;
201   mkdru.resetPage();
202   mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
203   return false;
204 };
205
206 mkdru.limitQuery = function (field, value) {
207   $('.mkdru-search input:text').attr('value', function () {
208     return this.value += ' and ' + field + '="' + value + '"';
209   });
210   mkdru.submitQuery();
211 };
212
213 mkdru.limitTarget = function (id, name) {
214   var navi = document.getElementById('mkdru-navi');
215   navi.innerHTML = 
216         'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
217         + name + '</a>';
218   navi.innerHTML += '<hr/>';
219   mkdru.state.filter = 'pz:id=' + id;
220   mkdru.resetPage();
221   mkdru.pollDropDowns();
222   mkdru.search();
223   return false;
224 };
225
226 mkdru.resetPage = function () {
227   mkdru.state.page = 1;
228   mkdru.totalRec = 0;
229 };
230
231 mkdru.showPage = function (pageNum) {
232   mkdru.state.page = pageNum;
233   mkdru.pz2.showPage(pageNum-1);
234 };
235
236 mkdru.requestDetail = function (e) {
237   mkdru.pz2.record(e.target.parentNode.id.replace('rec_', ''));
238 };
239
240 mkdru.nextPage = function () {
241   if (mkdru.totalRec - mkdru.state.perpage * mkdru.state.page > 0) {
242     mkdru.pz2.showNext();
243     mkdru.state.page++;
244   }
245 };
246
247 mkdru.prevPage = function () {
248   if (mkdru.pz2.showPrev() != false) {
249     mkdru.state.page--;
250   }
251 };
252
253
254
255 // wait until the DOM is ready, bind events
256 // and instantiate pz2 library
257 $(document).ready(function () {
258   $(window).bind( 'hashchange', mkdru.hashChange);
259   $('.mkdru-search').bind('submit', mkdru.submitQuery);
260   $('.mkdru-search input:text').attr('value', '');
261   $('.mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
262   $('.mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
263
264   dump("NEW PZ2!\n");
265   mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
266               "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
267               "pazpar2path": mkdru.pazpar2path,
268               "oninit": mkdru.pz2Init,
269               "onstat": mkdru.pz2Status,
270               "onterm": mkdru.pz2Term,
271               "termlist": "xtargets,subject,author",
272               "onbytarget": mkdru.pz2ByTarget,
273               "usesessions" : mkdru.usesessions,
274               "showResponseType": mkdru.showResponseType,
275               "onrecord": mkdru.pz2Record,
276               "autoInit": false } );
277
278   // initialise state to hash string or defaults
279   mkdru.stateFromHash();
280   // and update UI to match
281   mkdru.uiFromState();
282   dump("QUERY:" + mkdru.state.query + "\n");
283   
284   // ting thing
285   if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
286     mkdru.state.query = Drupal.settings.mkdru.query
287   }
288
289   if (mkdru.usesessions) {
290     mkdru.pz2.init();
291   } else if (mkdru.state.query) {
292     mkdru.triggerSearch(); 
293   }
294 });