1 // Set up namespace and some state.
3 // Settings to pass to pz2.js
4 usesessions: Drupal.settings.mkdru.use_sessions === '1',
5 // showResponseType: 'json',
11 sourceMax: Drupal.settings.mkdru.source_max,
12 subjectMax: Drupal.settings.mkdru.subject_max,
13 authorMax: Drupal.settings.mkdru.author_max,
14 pazpar2Path: Drupal.settings.mkdru.pz2_path,
29 // So we can use jQuery BBQ with Drupal 6 and its 1.2.6 jQuery
30 if (!$.isArray) $.isArray = function(obj) {
31 return Object.prototype.toString.call(obj) === "[object Array]";
36 // pz2.js event handlers:
37 mkdru.pz2Init = function () {
38 if (mkdru.state.recid) {
39 mkdru.pz2.record(mkdru.state.recid);
40 } else if (mkdru.state.query) {
41 mkdru.triggerSearch();
44 //mkdru.pz2.bytarget();
47 mkdru.pz2Show = function (data) {
48 mkdru.totalRec = data.merged;
49 $('.mkdru-pager').html(mkdru.generatePager());
50 var countsHtml = Drupal.t('Displaying: ') + (data.start + 1) +
51 Drupal.t(' to ') + (data.start + data.num) + Drupal.t(' of ')
52 + data.merged + Drupal.t(' (found: ') + data.total + ')';
53 $('.mkdru-counts').html(countsHtml);
56 for (var i = 0; i < data.hits.length; i++) {
57 html += Drupal.theme('mkdruResult', data.hits[i],
58 i + 1 + mkdru.state.perpage * (mkdru.state.page - 1),
59 "#" + $.param.fragment($.param.fragment(
60 window.location.href, {recid: data.hits[i].recid})) + "\n"
63 $('.mkdru-result-list').html(html);
64 $('.mkdru-results').show();
67 mkdru.pz2Status = function (data) {
70 mkdru.pz2Term = function (data) {
72 for (var i = 0; i < data.xtargets.length && i < mkdru.sourceMax; i++ ) {
73 html += Drupal.theme('mkdruTerm', data.xtargets[i].name, data.xtargets[i].freq,
74 'mkdru-facet-source', data.xtargets[i].id);
76 $('.mkdru-facet-sources').html(html);
79 for (var i = 0; i < data.subject.length && i < mkdru.subjectMax; i++ ) {
80 html += Drupal.theme('mkdruTerm', data.subject[i].name, data.subject[i].freq,
81 'mkdru-facet-subject', data.subject[i].id);
83 $('.mkdru-facet-subjects').html(html);
86 for (var i = 0; i < data.author.length && i < mkdru.authorMax; i++ ) {
87 html += Drupal.theme('mkdruTerm', data.author[i].name, data.author[i].freq,
88 'mkdru-facet-author', data.author[i].id);
90 $('.mkdru-facet-authors').html(html);
92 $('.mkdru-facet-source').bind('click', function (e) {
93 mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
97 $('.mkdru-facet-subject').bind('click', function (e) {
98 mkdru.limitQuery('su', this.firstChild.nodeValue);
102 $('.mkdru-facet-author').bind('click', function (e) {
103 mkdru.limitQuery('au', this.firstChild.nodeValue);
108 mkdru.pz2ByTarget = function (data) {
112 mkdru.pz2Record = function (data) {
113 clearTimeout(mkdru.pz2.showTimer);
114 $('.mkdru-results').hide();
115 $('.mkdru-detail').html(Drupal.theme('mkdruDetail', data));
116 $('.mkdru-detail-back').bind('click', function () {$.bbq.removeState('recid');});
117 $('.mkdru-detail').show();
118 clearTimeout(mkdru.pz2.recordTimer);
123 // State and URL handling
125 // populate state from an object and fill in the blanks with defaults
126 mkdru.stateFromObject = function (obj) {
127 for (var key in mkdru.defaultState) {
128 if (typeof(obj[key]) != "undefined") {
129 mkdru.state[key] = obj[key];
132 mkdru.state[key] = mkdru.defaultState[key];
137 // populate state from current window's hash string
138 mkdru.stateFromHash = function () {
139 mkdru.stateFromObject($.deparam.fragment());
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];
151 $.bbq.pushState(alteredState);
154 // update mkdru_form theme's ui to match state
155 mkdru.uiFromState = function () {
156 for (var key in mkdru.state) {
159 $('.mkdru-search input:text').attr('value', mkdru.state[key]);
162 $('.mkdru-perpage').attr('value', mkdru.state[key]);
165 $('.mkdru-sort').attr('value', mkdru.state[key]);
171 mkdru.hashChange = function () {
172 mkdru.stateFromHash();
173 // Request for details
174 if (mkdru.state.recid) {
175 mkdru.pz2.record(mkdru.state.recid);
177 // Other internal link
179 mkdru.pz2.showPage(mkdru.state.page-1);
180 $('.mkdru-detail').hide();
181 $('.mkdru-results').show();
188 mkdru.submitQuery = function () {
189 mkdru.state.query = $('.mkdru-search input:text').attr('value');
191 mkdru.pollDropDowns();
192 mkdru.hashFromState();
194 mkdru.submitted = true;
198 mkdru.triggerSearch = function () {
200 mkdru.submitted = true;
203 mkdru.search = function () {
204 mkdru.pz2.search(mkdru.state.query, mkdru.state.perpage, mkdru.state.sort,
208 mkdru.pollDropDowns = function () {
209 mkdru.state.perpage = $('.mkdru-perpage').attr('value');
210 mkdru.state.sort = $('.mkdru-sort').attr('value');
211 if (!mkdru.submitted) return false;
213 mkdru.hashFromState();
214 mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
218 mkdru.limitQuery = function (field, value) {
219 $('.mkdru-search input:text').attr('value', function () {
220 return this.value += ' and ' + field + '="' + value + '"';
225 mkdru.limitTarget = function (id, name) {
226 var navi = document.getElementById('mkdru-navi');
228 'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
230 navi.innerHTML += '<hr/>';
231 mkdru.state.filter = 'pz:id=' + id;
233 mkdru.pollDropDowns();
238 mkdru.generatePager = function () {
239 var total = Math.ceil(mkdru.totalRec / mkdru.state.perpage);
240 var first = (mkdru.state.page - mkdru.pagerRange > 0)
241 ? mkdru.state.page - mkdru.pagerRange : 1;
242 var last = first + 2 * mkdru.pagerRange < total
243 ? first + 2 * mkdru.pagerRange : total;
248 if ((mkdru.state.page - 1) >= first) {
249 prev = "#" + $.param.fragment($.param.fragment(
250 window.location.href, {page: mkdru.state.page - 1}))
252 if ((mkdru.state.page + 1) <= total) {
253 next = "#" + $.param.fragment($.param.fragment(
254 window.location.href, {page: mkdru.state.page + 1}))
257 for (var i = first; i <= last; i++) {
258 pages.push("#" + $.param.fragment($.param.fragment(
259 window.location.href, {page: i})));
262 return Drupal.theme('mkdruPager', pages, first, mkdru.state.page,
266 mkdru.resetPage = function () {
267 mkdru.state.page = 1;
273 // wait until the DOM is ready, bind events
274 // and instantiate pz2 library
275 $(document).ready(function () {
276 $(window).bind( 'hashchange', mkdru.hashChange);
277 $('.mkdru-search').bind('submit', mkdru.submitQuery);
278 $('.mkdru-search input:text').attr('value', '');
279 $('.mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
280 $('.mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
282 mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
283 "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
284 "pazpar2path": mkdru.pazpar2path,
285 "oninit": mkdru.pz2Init,
286 "onstat": mkdru.pz2Status,
287 "onterm": mkdru.pz2Term,
288 "termlist": "xtargets,subject,author",
289 "onbytarget": mkdru.pz2ByTarget,
290 "usesessions" : mkdru.usesessions,
291 "showResponseType": mkdru.showResponseType,
292 "onrecord": mkdru.pz2Record,
293 "autoInit": false } );
295 // initialise state to hash string or defaults
296 mkdru.stateFromHash();
297 // and update UI to match
301 if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
302 mkdru.state.query = Drupal.settings.mkdru.query
305 if (mkdru.usesessions) {
307 } else if (mkdru.state.recid) {
308 mkdru.pz2.record(mkdru.state.recid);
309 } else if (mkdru.state.query) {
310 mkdru.triggerSearch();