b8e7f4c8d09de779125d1fcc143d35cdfb797482
[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 * (mkdru.state.page - 1),
58       "#" + $.param.fragment($.param.fragment(
59         window.location.href, {recid: data.hits[i].recid})) + "\n"
60     );
61   }
62   $('.mkdru-result-list').html(html);
63   $('.mkdru-results').show();
64 };
65
66 mkdru.pz2Status = function (data) {
67 };
68
69 mkdru.pz2Term = function (data) {
70   var html = "";
71   for (var i = 0; i < data.xtargets.length && i < mkdru.sourceMax; i++ ) {
72     html += Drupal.theme('mkdruTerm', data.xtargets[i].name, data.xtargets[i].freq, 
73                           'mkdru-facet-source', data.xtargets[i].id);
74   }
75   $('.mkdru-facet-sources').html(html);
76
77   html = "";
78   for (var i = 0; i < data.subject.length && i < mkdru.subjectMax; i++ ) {
79     html += Drupal.theme('mkdruTerm', data.subject[i].name, data.subject[i].freq, 
80                           'mkdru-facet-subject', data.subject[i].id);
81   }
82   $('.mkdru-facet-subjects').html(html);
83
84   html = "";
85   for (var i = 0; i < data.author.length && i < mkdru.authorMax; i++ ) {
86     html += Drupal.theme('mkdruTerm', data.author[i].name, data.author[i].freq, 
87                           'mkdru-facet-author', data.author[i].id);
88   }
89   $('.mkdru-facet-authors').html(html);
90
91   $('.mkdru-facet-source').bind('click', function (e) {
92     mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
93     return false;
94   });
95
96   $('.mkdru-facet-subject').bind('click', function (e) {
97     mkdru.limitQuery('su', this.firstChild.nodeValue);
98     return false;
99   });
100
101   $('.mkdru-facet-author').bind('click', function (e) {
102     mkdru.limitQuery('au', this.firstChild.nodeValue);
103     return false;
104   });
105 };
106
107 mkdru.pz2ByTarget = function (data) {
108   
109 };
110
111 mkdru.pz2Record = function (data) {
112   clearTimeout(mkdru.pz2.showTimer);
113   $('.mkdru-results').hide();
114   $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data));
115   $('.mkdru-detail-back').bind('click', function () {$.bbq.removeState('recid');});
116   $('.mkdru-detail').show();
117   clearTimeout(mkdru.pz2.recordTimer);
118 };
119
120
121
122 // State and URL handling 
123
124 // populate state from an object and fill in the blanks with defaults
125 mkdru.stateFromObject = function (obj) {
126   for (var key in mkdru.defaultState) {
127     if (typeof(obj[key]) != "undefined") {
128       dump (key + " :: " + obj[key] + "\n");
129       mkdru.state[key] = obj[key];
130     }
131     else {
132       mkdru.state[key] = mkdru.defaultState[key];
133     }
134   }
135 };
136
137 // populate state from current window's hash string
138 mkdru.stateFromHash = function () {
139   mkdru.stateFromObject($.deparam.fragment());
140 };
141
142 // set current window's hash string from state
143 mkdru.hashFromState = function () {
144   // only include non-default settings in the URL
145   var alteredState = {};
146   for (var key in mkdru.defaultState) {
147     if (mkdru.state[key] != mkdru.defaultState[key]) {
148       alteredState[key] = mkdru.state[key];
149     }
150   }
151   $.bbq.pushState(alteredState);
152 };
153
154 // update mkdru_form theme's ui to match state
155 mkdru.uiFromState = function () {
156   for (var key in mkdru.state) {
157     switch(key) {
158     case 'query':
159       $('.mkdru-search input:text').attr('value', mkdru.state[key]);
160       break;
161     case 'perpage':
162       $('.mkdru-perpage').attr('value', mkdru.state[key]);
163       break;
164     case 'sort':
165       $('.mkdru-sort').attr('value', mkdru.state[key]);
166       break;
167     }
168   }
169 };
170
171 mkdru.hashChange = function () {
172   dump("Submidded? " + mkdru.submitted + "\n");
173   var hash = $.deparam.fragment();
174   if (typeof(hash.recid) !== "undefined") {
175     mkdru.pz2.record(hash.recid);
176   }
177   else {
178     $('.mkdru-detail').hide();
179     $('.mkdru-results').show();
180   }
181 };
182
183
184
185 // UI functions:
186 mkdru.submitQuery = function () {
187   mkdru.state.query = $('.mkdru-search input:text').attr('value');
188   mkdru.resetPage();
189   mkdru.pollDropDowns();
190   mkdru.hashFromState();
191   mkdru.search();
192   mkdru.submitted = true;
193   return false;
194 };
195
196 mkdru.triggerSearch = function () {
197   mkdru.search();
198   mkdru.submitted = true;
199 };
200
201 mkdru.search = function () {
202   mkdru.pz2.search(mkdru.state.query, mkdru.state.perpage, mkdru.state.sort,
203       mkdru.state.filter);
204 };
205
206 mkdru.pollDropDowns = function () {
207   mkdru.state.perpage = $('.mkdru-perpage').attr('value');
208   mkdru.state.sort = $('.mkdru-sort').attr('value');
209   if (!mkdru.submitted) return false;
210   mkdru.resetPage();
211   mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
212   return false;
213 };
214
215 mkdru.limitQuery = function (field, value) {
216   $('.mkdru-search input:text').attr('value', function () {
217     return this.value += ' and ' + field + '="' + value + '"';
218   });
219   mkdru.submitQuery();
220 };
221
222 mkdru.limitTarget = function (id, name) {
223   var navi = document.getElementById('mkdru-navi');
224   navi.innerHTML = 
225         'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
226         + name + '</a>';
227   navi.innerHTML += '<hr/>';
228   mkdru.state.filter = 'pz:id=' + id;
229   mkdru.resetPage();
230   mkdru.pollDropDowns();
231   mkdru.search();
232   return false;
233 };
234
235 mkdru.resetPage = function () {
236   mkdru.state.page = 1;
237   mkdru.totalRec = 0;
238 };
239
240 mkdru.showPage = function (pageNum) {
241   mkdru.state.page = pageNum;
242   mkdru.pz2.showPage(pageNum-1);
243 };
244
245 mkdru.nextPage = function () {
246   if (mkdru.totalRec - mkdru.state.perpage * mkdru.state.page > 0) {
247     mkdru.pz2.showNext();
248     mkdru.state.page++;
249     mkdru.hashFromState();
250   }
251 };
252
253 mkdru.prevPage = function () {
254   if (mkdru.pz2.showPrev() != false) {
255     mkdru.state.page--;
256     mkdru.hashFromState();
257   }
258 };
259
260
261
262 // wait until the DOM is ready, bind events
263 // and instantiate pz2 library
264 $(document).ready(function () {
265   $(window).bind( 'hashchange', mkdru.hashChange);
266   $('.mkdru-search').bind('submit', mkdru.submitQuery);
267   $('.mkdru-search input:text').attr('value', '');
268   $('.mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
269   $('.mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
270
271   dump("NEW PZ2!\n");
272   mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
273               "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
274               "pazpar2path": mkdru.pazpar2path,
275               "oninit": mkdru.pz2Init,
276               "onstat": mkdru.pz2Status,
277               "onterm": mkdru.pz2Term,
278               "termlist": "xtargets,subject,author",
279               "onbytarget": mkdru.pz2ByTarget,
280               "usesessions" : mkdru.usesessions,
281               "showResponseType": mkdru.showResponseType,
282               "onrecord": mkdru.pz2Record,
283               "autoInit": false } );
284
285   // initialise state to hash string or defaults
286   mkdru.stateFromHash();
287   // and update UI to match
288   mkdru.uiFromState();
289   dump("QUERY:" + mkdru.state.query + "\n");
290   
291   // ting thing
292   if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
293     mkdru.state.query = Drupal.settings.mkdru.query
294   }
295
296   if (mkdru.usesessions) {
297     mkdru.pz2.init();
298   } else if (mkdru.state.query) {
299     mkdru.triggerSearch(); 
300   }
301 });