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',
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,
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]";
34 // pz2.js event handlers:
35 mkdru.pz2Init = function () {
36 if (mkdru.state.query) mkdru.triggerSearch();
38 //mkdru.pz2.bytarget();
41 mkdru.pz2Show = function (data) {
42 mkdru.totalRec = data.merged;
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);
50 var countsHtml = 'Displaying: ' + (data.start + 1) + ' to '
51 + (data.start + data.num) + ' of ' + data.merged + ' (found: ' + data.total + ')';
52 $('.mkdru-counts').html(countsHtml);
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"
62 $('.mkdru-result-list').html(html);
63 $('.mkdru-results').show();
66 mkdru.pz2Status = function (data) {
69 mkdru.pz2Term = function (data) {
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);
75 $('.mkdru-facet-sources').html(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);
82 $('.mkdru-facet-subjects').html(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);
89 $('.mkdru-facet-authors').html(html);
91 $('.mkdru-facet-source').bind('click', function (e) {
92 mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
96 $('.mkdru-facet-subject').bind('click', function (e) {
97 mkdru.limitQuery('su', this.firstChild.nodeValue);
101 $('.mkdru-facet-author').bind('click', function (e) {
102 mkdru.limitQuery('au', this.firstChild.nodeValue);
107 mkdru.pz2ByTarget = function (data) {
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);
122 // State and URL handling
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];
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 dump("Submidded? " + mkdru.submitted + "\n");
173 var hash = $.deparam.fragment();
174 if (typeof(hash.recid) !== "undefined") {
175 mkdru.pz2.record(hash.recid);
178 $('.mkdru-detail').hide();
179 $('.mkdru-results').show();
186 mkdru.submitQuery = function () {
187 mkdru.state.query = $('.mkdru-search input:text').attr('value');
189 mkdru.pollDropDowns();
190 mkdru.hashFromState();
192 mkdru.submitted = true;
196 mkdru.triggerSearch = function () {
198 mkdru.submitted = true;
201 mkdru.search = function () {
202 mkdru.pz2.search(mkdru.state.query, mkdru.state.perpage, mkdru.state.sort,
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;
211 mkdru.pz2.show(0, mkdru.state.perpage, mkdru.state.sort);
215 mkdru.limitQuery = function (field, value) {
216 $('.mkdru-search input:text').attr('value', function () {
217 return this.value += ' and ' + field + '="' + value + '"';
222 mkdru.limitTarget = function (id, name) {
223 var navi = document.getElementById('mkdru-navi');
225 'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
227 navi.innerHTML += '<hr/>';
228 mkdru.state.filter = 'pz:id=' + id;
230 mkdru.pollDropDowns();
235 mkdru.resetPage = function () {
236 mkdru.state.page = 1;
240 mkdru.showPage = function (pageNum) {
241 mkdru.state.page = pageNum;
242 mkdru.pz2.showPage(pageNum-1);
245 mkdru.nextPage = function () {
246 if (mkdru.totalRec - mkdru.state.perpage * mkdru.state.page > 0) {
247 mkdru.pz2.showNext();
249 mkdru.hashFromState();
253 mkdru.prevPage = function () {
254 if (mkdru.pz2.showPrev() != false) {
256 mkdru.hashFromState();
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() });
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 } );
285 // initialise state to hash string or defaults
286 mkdru.stateFromHash();
287 // and update UI to match
289 dump("QUERY:" + mkdru.state.query + "\n");
292 if (typeof(Drupal.settings.mkdru.query) !== "undefined") {
293 mkdru.state.query = Drupal.settings.mkdru.query
296 if (mkdru.usesessions) {
298 } else if (mkdru.state.query) {
299 mkdru.triggerSearch();