1 // Set up namespace and some state.
3 // Settings to pass to pz2.js
4 useSessions: Drupal.settings.mkdru.use_sessions === '1',
10 pazpar2Path: Drupal.settings.mkdru.pz2_path,
15 max: Drupal.settings.mkdru.source_max
19 max: Drupal.settings.mkdru.subject_max,
25 max: Drupal.settings.mkdru.author_max,
48 // So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
49 if (!$.isArray) $.isArray = function(obj) {
50 return Object.prototype.toString.call(obj) === "[object Array]";
53 // BBQ has no handy way to remove params without changing the hash.
54 // This takes an object to add and an array of keys to delete.
55 mkdru.hashAddDelMany = function (add, del) {
56 var newHash = $.deparam.fragment();
57 if (typeof(add) === 'object')
58 $.extend(newHash, add);
60 for (var i=0; i < del.length; i++)
61 if (newHash[del[i]] !== 'undefined')
62 delete newHash[del[i]];
63 return $.param.fragment("#", newHash);
66 // It's sometimes cumbersome that object literals can't take variable keys.
67 mkdru.hashAddDelOne = function (key, value, del) {
78 return mkdru.hashAddDelMany(toAdd, toDel);
83 // pz2.js event handlers:
84 mkdru.pz2Init = function () {
85 if (mkdru.state.query) {
89 //mkdru.pz2.bytarget();
92 mkdru.pz2Show = function (data) {
93 mkdru.totalRec = data.merged;
94 $('.mkdru-pager').html(mkdru.generatePager());
95 $('.mkdru-counts').html(Drupal.theme('mkdruCounts', data.start + 1,
96 data.num, data.merged, data.total));
98 for (var i = 0; i < data.hits.length; i++) {
99 html += Drupal.theme('mkdruResult', data.hits[i],
100 i + 1 + mkdru.state.perpage * (mkdru.state.page - 1),
101 "#" + $.param.fragment($.param.fragment(
102 window.location.href, {recid: data.hits[i].recid})) + "\n"
105 $('.mkdru-result-list').html(html);
106 if (mkdru.state.recid) {
107 mkdru.pz2.record(mkdru.state.recid);
110 $('.mkdru-results').show();
114 mkdru.pz2Status = function (data) {
115 $('.mkdru-status').html(Drupal.theme('mkdruStatus', data.activeclients, data.clients));
118 mkdru.pz2Term = function (data) {
119 for (var facet in mkdru.facets) {
121 if (mkdru.state['limit_' + facet]) {
122 $('.mkdru-facet-' + facet).html(Drupal.theme('mkdruFacetLimit',
123 data[mkdru.facets[facet].pz2Name][0],
124 mkdru.hashAddDelOne(null, null, 'limit_' + facet)));
126 $('.mkdru-facet-' + facet).html(Drupal.theme('mkdruFacet',
127 data[mkdru.facets[facet].pz2Name],
128 facet, mkdru.facets[facet].max));
133 mkdru.pz2ByTarget = function (data) {
137 mkdru.pz2Record = function (data) {
138 clearTimeout(mkdru.pz2.showTimer);
139 $('.mkdru-results').hide();
140 $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data,
141 mkdru.hashAddDelOne(null, null, 'recid')));
142 $('.mkdru-detail').show();
143 clearTimeout(mkdru.pz2.recordTimer);
148 // State and URL handling
150 // populate state from an object and fill in the blanks with defaults
151 mkdru.stateFromObject = function (obj) {
152 mkdru.state = $.extend({}, mkdru.defaultState);
153 for (var key in mkdru.defaultState)
154 if (typeof(obj[key]) != "undefined")
155 mkdru.state[key] = obj[key];
158 // populate state from current window's hash string
159 mkdru.stateFromHash = function () {
160 mkdru.stateFromObject($.deparam.fragment());
163 // set current window's hash string from state
164 mkdru.hashFromState = function () {
165 // only include non-default settings in the URL
166 var alteredState = {};
167 for (var key in mkdru.defaultState) {
168 if (mkdru.state[key] != mkdru.defaultState[key]) {
169 alteredState[key] = mkdru.state[key];
172 $.bbq.pushState(alteredState, 2);
175 // update mkdru_form theme's ui to match state
176 mkdru.uiFromState = function () {
177 for (var key in mkdru.state) {
180 $('.mkdru-search input:text').attr('value', mkdru.state[key]);
183 $('.mkdru-perpage').attr('value', mkdru.state[key]);
186 $('.mkdru-sort').attr('value', mkdru.state[key]);
192 mkdru.hashChange = function () {
193 mkdru.stateFromHash();
194 // Request for details
195 if (mkdru.state.recid) {
196 mkdru.pz2.record(mkdru.state.recid);
198 // Other internal link
200 // may need to run search again to limit targets
201 for (key in mkdru.state) {
202 if (key.substring(0,5) === 'limit' && mkdru.state[key]) {
207 mkdru.pz2.showPage(mkdru.state.page-1);
208 $('.mkdru-detail').hide();
209 $('.mkdru-results').show();
213 // return link to limit facet
214 mkdru.addLimit = function (facet, limit) {
215 var newHash = $.deparam.fragment();
216 delete newHash['page'];
217 if ((typeof(newHash['limit_' + facet]) === 'undefined')
218 || !mkdru.facets[facet].multiLimit) {
219 newHash['limit_' + facet] = limit;
222 newHash['limit_' + facet] += ';' + limit;
224 return $.param.fragment("#", newHash);
227 // return link to remove limit from facet
228 mkdru.removeLimit = function (facet, limit) {
229 var newHash = $.deparam.fragment();
230 delete newHash['page'];
231 if (!newHash['limit_' + facet].indexOf(';') || !mkdru.facets[facet].multiLimit) {
232 delete newHash['limit_' + facet];
235 var limits = newHash['limit_' + facet].split(';');
236 for (var i = 0; i < limits.length; i++) {
237 if (limits[i] == limit) {
239 newHash['limit_' + facet] = limits.join(';');
244 return $.param.fragment("#", newHash);
249 // form submit handler
250 mkdru.submitQuery = function () {
251 // new query, back to defaults (shallow copy)
252 mkdru.state = $.extend({}, mkdru.defaultState);
253 mkdru.state.query = $('.mkdru-search input:text').attr('value');
254 mkdru.pollDropDowns();
255 mkdru.hashFromState();
261 // criteria drop-down (perpage, sort) handler
262 mkdru.submitCriteria = function () {
263 mkdru.pollDropDowns();
264 //search is not ON, do nothing
265 if (!mkdru.active) return false;
266 // pages mean different things now
267 mkdru.state.page = 1;
268 mkdru.hashFromState();
269 mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
273 mkdru.search = function () {
275 var query = mkdru.state.query;
277 // facet limit implementation
278 for (var facet in mkdru.facets) {
280 if (mkdru.state['limit_' + facet]) {
281 if (facet == "source") {
282 filter = 'pz:id=' + mkdru.state.limit_source;
285 var limits = mkdru.state['limit_' + facet].split(';');
286 for (var i = 0; i < limits.length; i++) {
287 // ex. query + and au="{limit_author}"
288 query += ' and ' + mkdru.facets[facet]['limiter'] + '="'
289 + mkdru.state['limit_' + facet] + '"';
295 mkdru.pz2.search(query, mkdru.state.perpage, mkdru.state.sort, filter);
299 mkdru.pollDropDowns = function () {
300 mkdru.state.perpage = $('.mkdru-perpage').attr('value');
301 mkdru.state.sort = $('.mkdru-sort').attr('value');
304 mkdru.generatePager = function () {
305 // cast page parameter to numeric so we can add to it
306 if (typeof mkdru.state.page == "string") {
307 mkdru.state.page = Number(mkdru.state.page);
309 var total = Math.ceil(mkdru.totalRec / mkdru.state.perpage);
310 var first = (mkdru.state.page - mkdru.pagerRange > 0)
311 ? mkdru.state.page - mkdru.pagerRange : 1;
312 var last = first + 2 * mkdru.pagerRange < total
313 ? first + 2 * mkdru.pagerRange : total;
318 if ((mkdru.state.page - 1) >= first) {
319 prev = "#" + $.param.fragment($.param.fragment(
320 window.location.href, {page: mkdru.state.page - 1}))
322 if ((mkdru.state.page + 1) <= total) {
323 next = "#" + $.param.fragment($.param.fragment(
324 window.location.href, {page: mkdru.state.page + 1}))
327 for (var i = first; i <= last; i++) {
328 pages.push("#" + $.param.fragment($.param.fragment(
329 window.location.href, {page: i})));
332 return Drupal.theme('mkdruPager', pages, first, mkdru.state.page,
338 // wait until the DOM is ready, bind events
339 // and instantiate pz2 library
340 $(document).ready(function () {
341 $(window).bind( 'hashchange', mkdru.hashChange);
342 $('.mkdru-search').bind('submit', mkdru.submitQuery);
343 $('.mkdru-search input:text').attr('value', '');
344 $('.mkdru-perpage').bind('change', mkdru.submitCriteria);
345 $('.mkdru-sort').bind('change', mkdru.submitCriteria);
347 // generate termlist for pz2.js and populate facet limit state
349 for (var key in mkdru.facets) {
350 termlist.push(mkdru.facets[key].pz2Name);
351 mkdru.defaultState['limit_' + key] = null;
354 mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
355 "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
356 "pazpar2path": mkdru.pazpar2Path,
357 "oninit": mkdru.pz2Init,
358 "onstat": mkdru.pz2Status,
359 "onterm": mkdru.pz2Term,
360 "termlist": termlist.join(','),
361 "onbytarget": mkdru.pz2ByTarget,
362 "usesessions" : mkdru.useSessions,
363 "showResponseType": mkdru.showResponseType,
364 "onrecord": mkdru.pz2Record,
365 "autoInit": false } );
367 // initialise state to hash string or defaults
368 mkdru.stateFromHash();
369 // and update UI to match
373 if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
374 mkdru.state.query = Drupal.settings.mkdru.query
377 //not running against SP? init, otherwise authenticate
378 if (mkdru.useSessions) {
382 var user = Drupal.settings.mkdru.sp_user;
383 var pass = Drupal.settings.mkdru.sp_pass;
385 params['command'] = 'auth';
387 params['action'] = 'login';
388 params['username'] = user;
389 params['password'] = pass;
391 params['action'] = 'ipauth';
393 var authReq = new pzHttpRequest(mkdru.pazpar2Path,
395 alert("Authentication against metasearch gateway failed: " +err);
400 var s = data.getElementsByTagName('status');
401 if (s.length && Element_getTextContent(s[0]) == "OK") {
402 mkdru.realm = data.getElementsByTagName('realm');
405 alert("Malformed response when authenticating against the metasearch"