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,
11 facetContainerSelector: Drupal.settings.mkdru.facetContainerSelector,
15 displayName: Drupal.settings.mkdru.source_dname || "Source",
16 orderWeight: Drupal.settings.mkdru.source_weight || 1,
18 max: Drupal.settings.mkdru.source_max || 10
21 displayName: Drupal.settings.mkdru.subject_dname || "Subject",
22 orderWeight: Drupal.settings.mkdru.source_weight || 2,
24 max: Drupal.settings.mkdru.subject_max || 10,
29 displayName: Drupal.settings.mkdru.author_dname || "Author",
30 orderWeight: Drupal.settings.mkdru.source_weight || 3,
32 max: Drupal.settings.mkdru.author_max || 10,
55 // So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
56 if (!$.isArray) $.isArray = function(obj) {
57 return Object.prototype.toString.call(obj) === "[object Array]";
60 // BBQ has no handy way to remove params without changing the hash.
61 // This takes an object to add and an array of keys to delete.
62 mkdru.hashAddDelMany = function (add, del) {
63 var newHash = $.deparam.fragment();
64 if (typeof(add) === 'object')
65 $.extend(newHash, add);
67 for (var i=0; i < del.length; i++)
68 if (newHash[del[i]] !== 'undefined')
69 delete newHash[del[i]];
70 return $.param.fragment("#", newHash);
73 // It's sometimes cumbersome that object literals can't take variable keys.
74 mkdru.hashAddDelOne = function (key, value, del) {
85 return mkdru.hashAddDelMany(toAdd, toDel);
90 // pz2.js event handlers:
91 mkdru.pz2Init = function () {
92 if (mkdru.state.query) {
96 //mkdru.pz2.bytarget();
99 mkdru.pz2Show = function (data) {
100 mkdru.totalRec = data.merged;
101 $('.mkdru-pager').html(mkdru.generatePager());
102 $('.mkdru-counts').html(Drupal.theme('mkdruCounts', data.start + 1,
103 data.num, data.merged, data.total));
105 for (var i = 0; i < data.hits.length; i++) {
106 html += Drupal.theme('mkdruResult', data.hits[i],
107 i + 1 + mkdru.state.perpage * (mkdru.state.page - 1),
108 "#" + $.param.fragment($.param.fragment(
109 window.location.href, {recid: data.hits[i].recid})) + "\n"
112 $('.mkdru-result-list').html(html);
113 if (mkdru.state.recid) {
114 mkdru.pz2.record(mkdru.state.recid);
117 $('.mkdru-results').show();
121 mkdru.pz2Status = function (data) {
122 $('.mkdru-status').html(Drupal.theme('mkdruStatus', data.activeclients, data.clients));
125 mkdru.contains = function (hash, key, value) {
127 if (hash[key].length) {
128 for (var i=0; i<hash[key].length; i++) {
129 if (hash[key][i] === value) {
134 return hash[key] === value;
140 mkdru.pz2Term = function (data) {
141 // if signaled, prepare container client-side
142 if (mkdru.facetContainerSelector) {
143 $(mkdru.facetContainerSelector).html(Drupal.theme('mkdruFacetContainer',
144 data, mkdru.facets));
146 // map all facets against selected, for simple rendering
147 var hash = $.deparam.fragment();
148 for (var key in hash) {
149 if (key.indexOf('limit') == 0 && hash[key].indexOf(';'))
150 hash[key.substr(6)] = hash[key].split(';');
153 for (var facet in mkdru.facets) {
154 var terms = data[mkdru.facets[facet].pz2Name];
155 for (var i=0; i<terms.length; i++) {
157 var value = facet == "source" ? term.id : term.name;
158 if (mkdru.contains(hash, facet, value)) { //enabled
159 term.hashQuery = mkdru.removeLimit(facet, value);
160 term.selected = true;
162 term.hashQuery = mkdru.addLimit(facet, value);
163 term.selected = false;
166 $('.mkdru-facet-' + facet).html(
167 Drupal.theme('mkdruFacet', terms, facet, mkdru.facets[facet].max));
171 mkdru.pz2ByTarget = function (data) {
175 mkdru.pz2Record = function (data) {
176 clearTimeout(mkdru.pz2.showTimer);
177 $('.mkdru-results').hide();
178 $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data,
179 mkdru.hashAddDelOne(null, null, 'recid')));
180 $('.mkdru-detail').show();
181 clearTimeout(mkdru.pz2.recordTimer);
186 // State and URL handling
188 // populate state from an object and fill in the blanks with defaults
189 mkdru.stateFromObject = function (obj) {
190 mkdru.state = $.extend({}, mkdru.defaultState);
191 for (var key in mkdru.defaultState)
192 if (typeof(obj[key]) != "undefined")
193 mkdru.state[key] = obj[key];
196 // populate state from current window's hash string
197 mkdru.stateFromHash = function () {
198 mkdru.stateFromObject($.deparam.fragment());
201 // set current window's hash string from state
202 mkdru.hashFromState = function () {
203 // only include non-default settings in the URL
204 var alteredState = {};
205 for (var key in mkdru.defaultState) {
206 if (mkdru.state[key] != mkdru.defaultState[key]) {
207 alteredState[key] = mkdru.state[key];
210 $.bbq.pushState(alteredState, 2);
213 // update mkdru_form theme's ui to match state
214 mkdru.uiFromState = function () {
215 for (var key in mkdru.state) {
218 $('.mkdru-search input:text').attr('value', mkdru.state[key]);
221 $('.mkdru-perpage').attr('value', mkdru.state[key]);
224 $('.mkdru-sort').attr('value', mkdru.state[key]);
230 mkdru.hashChange = function () {
231 mkdru.stateFromHash();
232 // Request for details
233 if (mkdru.state.recid) {
234 mkdru.pz2.record(mkdru.state.recid);
236 // Other internal link
238 // may need to run search again to limit targets
239 for (key in mkdru.state) {
240 if (key.substring(0,5) === 'limit' && mkdru.state[key]) {
245 mkdru.pz2.showPage(mkdru.state.page-1);
246 $('.mkdru-detail').hide();
247 $('.mkdru-results').show();
251 // return link to limit facet
252 mkdru.addLimit = function (facet, limit) {
253 var newHash = $.deparam.fragment();
254 delete newHash['page'];
255 if ((typeof(newHash['limit_' + facet]) === 'undefined')
256 || !mkdru.facets[facet].multiLimit) {
257 newHash['limit_' + facet] = limit;
260 newHash['limit_' + facet] += ';' + limit;
262 return $.param.fragment("#", newHash);
265 // return link to remove limit from facet
266 mkdru.removeLimit = function (facet, limit) {
267 var newHash = $.deparam.fragment();
268 delete newHash['page'];
269 if (!newHash['limit_' + facet].indexOf(';') || !mkdru.facets[facet].multiLimit) {
270 delete newHash['limit_' + facet];
273 var limits = newHash['limit_' + facet].split(';');
274 for (var i = 0; i < limits.length; i++) {
275 if (limits[i] == limit) {
277 newHash['limit_' + facet] = limits.join(';');
282 return $.param.fragment("#", newHash);
287 // form submit handler
288 mkdru.submitQuery = function () {
289 // new query, back to defaults (shallow copy)
290 mkdru.state = $.extend({}, mkdru.defaultState);
291 mkdru.state.query = $('.mkdru-search input:text').attr('value');
292 mkdru.pollDropDowns();
293 mkdru.hashFromState();
299 // criteria drop-down (perpage, sort) handler
300 mkdru.submitCriteria = function () {
301 mkdru.pollDropDowns();
302 //search is not ON, do nothing
303 if (!mkdru.active) return false;
304 // pages mean different things now
305 mkdru.state.page = 1;
306 mkdru.hashFromState();
307 mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
311 mkdru.search = function () {
313 var query = mkdru.state.query;
315 // facet limit implementation
316 for (var facet in mkdru.facets) {
318 if (mkdru.state['limit_' + facet]) {
319 if (facet == "source") {
320 filter = 'pz:id=' + mkdru.state.limit_source;
323 var limits = mkdru.state['limit_' + facet].split(';');
324 for (var i = 0; i < limits.length; i++) {
325 // ex. query + and au="{limit_author}"
326 query += ' and ' + mkdru.facets[facet]['limiter'] + '="'
327 + mkdru.state['limit_' + facet] + '"';
333 mkdru.pz2.search(query, mkdru.state.perpage, mkdru.state.sort, filter);
337 mkdru.pollDropDowns = function () {
338 mkdru.state.perpage = $('.mkdru-perpage').attr('value');
339 mkdru.state.sort = $('.mkdru-sort').attr('value');
342 mkdru.generatePager = function () {
343 // cast page parameter to numeric so we can add to it
344 if (typeof mkdru.state.page == "string") {
345 mkdru.state.page = Number(mkdru.state.page);
347 var total = Math.ceil(mkdru.totalRec / mkdru.state.perpage);
348 var first = (mkdru.state.page - mkdru.pagerRange > 0)
349 ? mkdru.state.page - mkdru.pagerRange : 1;
350 var last = first + 2 * mkdru.pagerRange < total
351 ? first + 2 * mkdru.pagerRange : total;
356 if ((mkdru.state.page - 1) >= first) {
357 prev = "#" + $.param.fragment($.param.fragment(
358 window.location.href, {page: mkdru.state.page - 1}))
360 if ((mkdru.state.page + 1) <= total) {
361 next = "#" + $.param.fragment($.param.fragment(
362 window.location.href, {page: mkdru.state.page + 1}))
365 for (var i = first; i <= last; i++) {
366 pages.push("#" + $.param.fragment($.param.fragment(
367 window.location.href, {page: i})));
370 return Drupal.theme('mkdruPager', pages, first, mkdru.state.page,
376 // wait until the DOM is ready, bind events
377 // and instantiate pz2 library
378 $(document).ready(function () {
379 $(window).bind( 'hashchange', mkdru.hashChange);
380 $('.mkdru-search').bind('submit', mkdru.submitQuery);
381 $('.mkdru-search input:text').attr('value', '');
382 $('.mkdru-perpage').bind('change', mkdru.submitCriteria);
383 $('.mkdru-sort').bind('change', mkdru.submitCriteria);
385 // generate termlist for pz2.js and populate facet limit state
387 for (var key in mkdru.facets) {
388 termlist.push(mkdru.facets[key].pz2Name);
389 mkdru.defaultState['limit_' + key] = null;
392 mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
393 "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
394 "pazpar2path": mkdru.pazpar2Path,
395 "oninit": mkdru.pz2Init,
396 "onstat": mkdru.pz2Status,
397 "onterm": mkdru.pz2Term,
398 "termlist": termlist.join(','),
399 "onbytarget": mkdru.pz2ByTarget,
400 "usesessions" : mkdru.useSessions,
401 "showResponseType": mkdru.showResponseType,
402 "onrecord": mkdru.pz2Record,
403 "autoInit": false } );
405 // initialise state to hash string or defaults
406 mkdru.stateFromHash();
407 // and update UI to match
411 if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
412 mkdru.state.query = Drupal.settings.mkdru.query
413 //force the hash to contain query
414 mkdru.hashFromState();
417 //not running against SP? init, otherwise authenticate
418 if (mkdru.useSessions) {
422 var user = Drupal.settings.mkdru.sp_user;
423 var pass = Drupal.settings.mkdru.sp_pass;
425 params['command'] = 'auth';
427 params['action'] = 'login';
428 params['username'] = user;
429 params['password'] = pass;
431 params['action'] = 'ipauth';
433 var authReq = new pzHttpRequest(mkdru.pazpar2Path,
435 alert("Authentication against metasearch gateway failed: " +err);
440 var s = data.getElementsByTagName('status');
441 if (s.length && Element_getTextContent(s[0]) == "OK") {
442 mkdru.realm = data.getElementsByTagName('realm');
445 alert("Malformed response when authenticating against the metasearch"