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,
37 // State; Keys limit_{facet key} will also be initialised
54 // So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
55 if (!$.isArray) $.isArray = function(obj) {
56 return Object.prototype.toString.call(obj) === "[object Array]";
59 // BBQ has no handy way to remove params without changing the hash.
60 // This takes an object to add and an array of keys to delete.
61 mkdru.hashAddDelMany = function (add, del) {
62 var newHash = $.deparam.fragment();
63 if (typeof(add) === 'object')
64 $.extend(newHash, add);
66 for (var i=0; i < del.length; i++)
67 if (newHash[del[i]] !== 'undefined')
68 delete newHash[del[i]];
69 return $.param.fragment("#", newHash);
72 // It's sometimes cumbersome that object literals can't take variable keys.
73 mkdru.hashAddDelOne = function (key, value, del) {
84 return mkdru.hashAddDelMany(toAdd, toDel);
89 // pz2.js event handlers:
90 mkdru.pz2Init = function () {
91 if (mkdru.state.query) {
97 mkdru.pz2Show = function (data) {
98 mkdru.totalRec = data.merged;
99 $('.mkdru-pager').html(mkdru.generatePager());
100 $('.mkdru-counts').html(Drupal.theme('mkdruCounts', data.start + 1,
101 data.num, data.merged, data.total));
103 for (var i = 0; i < data.hits.length; i++) {
104 html += Drupal.theme('mkdruResult', data.hits[i],
105 i + 1 + mkdru.state.perpage * (mkdru.state.page - 1),
106 "#" + $.param.fragment($.param.fragment(
107 window.location.href, {recid: data.hits[i].recid})) + "\n"
110 $('.mkdru-result-list').html(html);
111 if (mkdru.state.recid) {
112 mkdru.pz2.record(mkdru.state.recid);
115 $('.mkdru-results').show();
119 mkdru.pz2Status = function (data) {
120 $('.mkdru-status').html(Drupal.theme('mkdruStatus', data.activeclients, data.clients));
123 mkdru.contains = function (hash, key, value) {
125 if (hash[key].length) {
126 for (var i=0; i<hash[key].length; i++) {
127 if (hash[key][i] === value) {
132 return hash[key] === value;
138 mkdru.pz2Term = function (data) {
139 // map all facets against selected, for simple rendering
140 var hash = $.deparam.fragment();
141 for (var key in hash) {
142 if (key.indexOf('limit') == 0 && hash[key])
143 //always wrap in array
144 hash[key.substr(6)] = hash[key].split(/;+/);
147 for (var facet in mkdru.facets) {
148 var terms = data[mkdru.facets[facet].pz2Name];
149 for (var i=0; i<terms.length; i++) {
151 var value = facet == "source" ? term.id : term.name;
152 if (mkdru.contains(hash, facet, value)) { //enabled
153 term.toggleLink = mkdru.removeLimit(facet, value);
154 term.selected = true;
156 term.toggleLink = mkdru.addLimit(facet, value);
157 term.selected = false;
160 $('.mkdru-facet-' + facet).html(
161 Drupal.theme('mkdruFacet', terms, facet, mkdru.facets[facet].max,
166 mkdru.pz2Record = function (data) {
167 clearTimeout(mkdru.pz2.showTimer);
168 $('.mkdru-results').hide();
169 $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data,
170 mkdru.hashAddDelOne(null, null, 'recid')));
171 $('.mkdru-detail').show();
172 clearTimeout(mkdru.pz2.recordTimer);
177 // State and URL handling
179 // populate state from an object and fill in the blanks with defaults
180 mkdru.stateFromObject = function (obj) {
181 mkdru.state = $.extend({}, mkdru.defaultState);
182 for (var key in mkdru.defaultState)
183 if (typeof(obj[key]) != "undefined")
184 mkdru.state[key] = obj[key];
187 // populate state from current window's hash string
188 mkdru.stateFromHash = function () {
189 mkdru.stateFromObject($.deparam.fragment());
192 // set current window's hash string from state
193 mkdru.hashFromState = function () {
194 // only include non-default settings in the URL
195 var alteredState = {};
196 for (var key in mkdru.defaultState) {
197 if (mkdru.state[key] != mkdru.defaultState[key]) {
198 alteredState[key] = mkdru.state[key];
201 $.bbq.pushState(alteredState, 2);
204 // update mkdru_form theme's ui to match state
205 mkdru.uiFromState = function () {
206 for (var key in mkdru.state) {
209 $('.mkdru-search input:text').attr('value', mkdru.state[key]);
212 $('.mkdru-perpage').attr('value', mkdru.state[key]);
215 $('.mkdru-sort').attr('value', mkdru.state[key]);
221 mkdru.hashChange = function () {
222 // TING hack, switching tabs resets the hash but does not re-load the page
223 // simply ignore new hash and set it to the old state
224 var hash = $.param.fragment();
225 if (hash.indexOf('addon-result') == 0 || hash.indexOf('content-result') == 0
226 || hash.indexOf('ting-result') == 0) {
227 mkdru.hashFromState();
230 // do we need to restart the search?
231 var searchTrigger = false;
232 // shallow copy of state so we can see what changed.
233 var oldState = $.extend({}, mkdru.state);
234 mkdru.stateFromHash();
235 // only have to compare values since all keys are initialised
236 for (key in mkdru.state) {
237 var changed = (mkdru.state[key] != oldState[key]);
238 if (key.substring(0,5) === 'limit' && changed)
239 searchTrigger = true;
240 if (key === 'page' && changed)
241 mkdru.pz2.showPage(mkdru.state.page-1);
242 if (key === 'query' && changed)
243 searchTrigger = true;
247 // request for record detail
248 if (mkdru.state.recid && (mkdru.state.recid != oldState.recid)) {
249 mkdru.pz2.record(mkdru.state.recid);
252 $('.mkdru-detail').hide();
253 $('.mkdru-results').show();
257 // return link to limit facet
258 mkdru.addLimit = function (facet, limit) {
259 var newHash = $.deparam.fragment();
260 delete newHash['page'];
261 if ((typeof(newHash['limit_' + facet]) === 'undefined')
262 || !mkdru.facets[facet].multiLimit) {
263 newHash['limit_' + facet] = limit;
266 newHash['limit_' + facet] += ';' + limit;
268 return $.param.fragment("#", newHash);
271 // return link to remove limit from facet
272 mkdru.removeLimit = function (facet, limit) {
273 var newHash = $.deparam.fragment();
274 delete newHash['page'];
275 if (!newHash['limit_' + facet].indexOf(';')
276 || !mkdru.facets[facet].multiLimit) {
277 delete newHash['limit_' + facet];
280 var limits = newHash['limit_' + facet].split(';');
281 for (var i = 0; i < limits.length; i++) {
282 if (limits[i] == limit) {
284 if (limits.length < 1)
285 delete newHash['limit_' + facet];
287 newHash['limit_' + facet] = limits.join(';');
292 return $.param.fragment("#", newHash);
297 // form submit handler
298 mkdru.submitQuery = function () {
299 // new query, back to defaults (shallow copy)
300 mkdru.state = $.extend({}, mkdru.defaultState);
301 mkdru.state.query = $('.mkdru-search input:text').attr('value');
302 mkdru.pollDropDowns();
303 mkdru.hashFromState();
309 // criteria drop-down (perpage, sort) handler
310 mkdru.submitCriteria = function () {
311 mkdru.pollDropDowns();
312 //search is not ON, do nothing
313 if (!mkdru.active) return false;
314 // pages mean different things now
315 mkdru.state.page = 1;
316 mkdru.hashFromState();
317 mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
321 mkdru.search = function () {
323 var query = mkdru.state.query;
325 // facet limit implementation
326 for (var facet in mkdru.facets) {
328 if (mkdru.state['limit_' + facet]) {
329 if (facet == "source") {
330 filter = 'pz:id=' + mkdru.state.limit_source;
333 var limits = mkdru.state['limit_' + facet].split(/;+/);
334 for (var i = 0; i < limits.length; i++) {
335 // ex. query + and au="{limit_author}"
337 query += ' and ' + mkdru.facets[facet]['limiter'] + '="'
344 mkdru.pz2.search(query, mkdru.state.perpage, mkdru.state.sort, filter);
348 mkdru.pollDropDowns = function () {
349 mkdru.state.perpage = $('.mkdru-perpage').attr('value');
350 mkdru.state.sort = $('.mkdru-sort').attr('value');
353 mkdru.generatePager = function () {
354 // cast page parameter to numeric so we can add to it
355 if (typeof mkdru.state.page == "string") {
356 mkdru.state.page = Number(mkdru.state.page);
358 var total = Math.ceil(mkdru.totalRec / mkdru.state.perpage);
359 var first = (mkdru.state.page - mkdru.pagerRange > 0)
360 ? mkdru.state.page - mkdru.pagerRange : 1;
361 var last = first + 2 * mkdru.pagerRange < total
362 ? first + 2 * mkdru.pagerRange : total;
367 if ((mkdru.state.page - 1) >= first) {
368 prev = "#" + $.param.fragment($.param.fragment(
369 window.location.href, {page: mkdru.state.page - 1}))
371 if ((mkdru.state.page + 1) <= total) {
372 next = "#" + $.param.fragment($.param.fragment(
373 window.location.href, {page: mkdru.state.page + 1}))
376 for (var i = first; i <= last; i++) {
377 pages.push("#" + $.param.fragment($.param.fragment(
378 window.location.href, {page: i})));
381 return Drupal.theme('mkdruPager', pages, first, mkdru.state.page,
387 // wait until the DOM is ready, bind events
388 // and instantiate pz2 library
389 $(document).ready(function () {
390 $(window).bind( 'hashchange', mkdru.hashChange);
391 $('.mkdru-search').bind('submit', mkdru.submitQuery);
392 $('.mkdru-search input:text').attr('value', '');
393 $('.mkdru-perpage').bind('change', mkdru.submitCriteria);
394 $('.mkdru-sort').bind('change', mkdru.submitCriteria);
396 // generate termlist for pz2.js and populate facet limit state
398 for (var key in mkdru.facets) {
399 termlist.push(mkdru.facets[key].pz2Name);
400 mkdru.defaultState['limit_' + key] = null;
403 // if signaled, prepare facet container client-side
404 if (mkdru.facetContainerSelector) {
405 $(mkdru.facetContainerSelector).html(Drupal.theme('mkdruFacetContainer',
409 mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
410 "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
411 "pazpar2path": mkdru.pazpar2Path,
412 "oninit": mkdru.pz2Init,
413 "onstat": mkdru.pz2Status,
414 "onterm": mkdru.pz2Term,
415 "termlist": termlist.join(','),
416 "usesessions" : mkdru.useSessions,
417 "showResponseType": mkdru.showResponseType,
418 "onrecord": mkdru.pz2Record,
419 "autoInit": false } );
420 mkdru.pz2.showFastCount = 1;
422 // initialise state to hash string or defaults
423 mkdru.stateFromHash();
424 // and update UI to match
428 if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
429 mkdru.state.query = Drupal.settings.mkdru.query
430 //force the hash to contain query
431 mkdru.hashFromState();
434 //not running against SP? init, otherwise authenticate
435 if (mkdru.useSessions) {
439 var user = Drupal.settings.mkdru.sp_user;
440 var pass = Drupal.settings.mkdru.sp_pass;
442 params['command'] = 'auth';
444 params['action'] = 'login';
445 params['username'] = user;
446 params['password'] = pass;
448 params['action'] = 'ipauth';
450 var authReq = new pzHttpRequest(mkdru.pazpar2Path,
452 alert("Authentication against metasearch gateway failed: " +err);
457 var s = data.getElementsByTagName('status');
458 if (s.length && Element_getTextContent(s[0]) == "OK") {
459 mkdru.realm = data.getElementsByTagName('realm');
462 alert("Malformed response when authenticating against the metasearch"