Fix dropdowns, start improving markup.
[mkdru-moved-to-drupal.org.git] / mkdru.client.js
1 // Set up namespace and some state.
2 var mkdru = {
3   // Settings to pass to pz2.js
4   usesessions: Drupal.settings.mkdru.use_sessions === '1',
5   showResponseType: 'json',
6   // Variables
7   curPage: 1,
8   recPerPage: 20,
9   totalRec: 0,
10   curSort: 'relevance',
11   curFilter: null,
12   submitted: false,
13   sourceMax: Drupal.settings.mkdru.source_max,
14   subjectMax: Drupal.settings.mkdru.subject_max,
15   authorMax: Drupal.settings.mkdru.author_max,
16   pz2: null,
17   pazpar2Path: Drupal.settings.mkdru.pz2_path
18 };
19
20
21
22 // pz2.js event handlers:
23 mkdru.pz2Init = function () {
24   mkdru.pz2.stat();
25   mkdru.pz2.bytarget();
26 };
27
28 mkdru.pz2Show = function (data) {
29   mkdru.totalRec = data.merged;
30
31   var pagerHtml = Drupal.theme('mkdruPager', data, mkdru.curPage,
32                                       Math.ceil(mkdru.totalRec / mkdru.recPerPage));
33   $('.mkdru-pager').html(pagerHtml);
34   $('.mkdru-next').bind('click', mkdru.nextPage);
35   $('.mkdru-prev').bind('click', mkdru.prevPage);
36
37   var countsHtml = 'Displaying: ' + (data.start + 1) + ' to '
38     + (data.start + data.num) + ' of ' + data.merged + ' (found: ' + data.total + ')';
39   $('.mkdru-counts').html(countsHtml);
40
41   var html = "";
42   for (var i = 0; i < data.hits.length; i++) {
43     html += Drupal.theme('mkdruResult', data.hits[i], 
44                          i + 1 + mkdru.recPerPage * 
45                          (mkdru.curPage - 1));
46   }
47   $('#mkdru-results').html(html);
48 };
49
50 mkdru.pz2Status = function (data) {
51 };
52
53 mkdru.pz2Term = function (data) {
54     var html = "";
55     for (var i = 0; i < data.xtargets.length && i < mkdru.sourceMax; i++ ) {
56       html += Drupal.theme('mkdruTerm', data.xtargets[i].name, data.xtargets[i].freq, 
57                            'mkdru-facet-link-source', data.xtargets[i].id);
58     }
59     $('#mkdru-sources').html(html);
60
61     html = "";
62     for (var i = 0; i < data.subject.length && i < mkdru.subjectMax; i++ ) {
63       html += Drupal.theme('mkdruTerm', data.subject[i].name, data.subject[i].freq, 
64                            'mkdru-facet-link-subject', data.subject[i].id);
65     }
66     $('#mkdru-subjects').html(html);
67
68     html = "";
69     for (var i = 0; i < data.author.length && i < mkdru.authorMax; i++ ) {
70       html += Drupal.theme('mkdruTerm', data.author[i].name, data.author[i].freq, 
71                            'mkdru-facet-link-author', data.author[i].id);
72     }
73     $('#mkdru-authors').html(html);
74
75     $('.mkdru-facet-link-source').bind('click', function (e) {
76       mkdru.limitTarget(this.getAttribute('target_id'), this.firstChild.nodeValue);
77       return false;
78     });
79
80     $('.mkdru-facet-link-subject').bind('click', function (e) {
81       mkdru.limitQuery('su', this.firstChild.nodeValue);
82       return false;
83     });
84
85     $('.mkdru-facet-link-author').bind('click', function (e) {
86       mkdru.limitQuery('au', this.firstChild.nodeValue);
87       return false;
88     });
89 };
90
91 mkdru.pz2ByTarget = function (data) {
92   
93 };
94
95
96
97 // UI functions:
98 mkdru.submitQuery = function () {
99   mkdru.resetPage();
100   mkdru.pollDropDowns();
101   mkdru.search();
102   mkdru.submitted = true;
103   $('.mkdru-post-search').show();
104   return false;
105 };
106
107 mkdru.search = function () {
108   mkdru.pz2.search($('.mkdru-search input:text').attr('value'),
109                    mkdru.recPerPage, mkdru.curSort, mkdru.curFilter);
110 };
111
112 mkdru.pollDropDowns = function () {
113   mkdru.recPerPage = $('#mkdru-perpage').attr('value');
114   mkdru.curSort = $('#mkdru-sort').attr('value');
115   if (!mkdru.submitted) return false;
116   mkdru.resetPage();
117   mkdru.pz2.show(0, mkdru.recPerPage, mkdru.curSort);
118   return false;
119 };
120
121 mkdru.limitQuery = function (field, value) {
122   $('.mkdru-search input:text').attr('value', function () {
123     return this.value += ' and ' + field + '="' + value + '"';
124   });
125   mkdru.submitQuery();
126 };
127
128 mkdru.limitTarget = function (id, name) {    
129   var navi = document.getElementById('mkdru-navi');
130   navi.innerHTML = 
131         'Source: <a class="crossout" href="#" onclick="delimitTarget();return false;">'
132         + name + '</a>';
133   navi.innerHTML += '<hr/>';
134   mkdru.curFilter = 'pz:id=' + id;
135   mkdru.resetPage();
136   mkdru.pollDropDowns();
137   mkdru.search();
138   return false;
139 };
140
141 mkdru.resetPage = function () {
142   mkdru.curPage = 1;
143   mkdru.totalRec = 0;
144 };
145
146 mkdru.showPage = function (pageNum) {
147   mkdru.curPage = pageNum;
148   mkdru.pz2.showPage(pageNum-1);
149 };
150
151 mkdru.nextPage = function () {
152   if (mkdru.totalRec - mkdru.recPerPage * mkdru.curPage > 0) {
153     mkdru.pz2.showNext();
154     mkdru.curPage++;
155   }
156 };
157
158 mkdru.prevPage = function () {
159   if (mkdru.pz2.showPrev() != false) {
160     mkdru.curPage--;
161   }
162 };
163
164
165 // wait until the DOM is ready, bind events
166 // and instantiate pz2 library
167 $(document).ready(function () {
168   $('.mkdru-search').bind('submit', mkdru.submitQuery);
169   $('.mkdru-search input:text').attr('value', '');
170   $('#mkdru-perpage').bind('change', function () { mkdru.pollDropDowns() });
171   $('#mkdru-sort').bind('change', function () { mkdru.pollDropDowns() });
172   mkdru.pz2 = new pz2( { "onshow": mkdru.pz2Show,
173               "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
174               "pazpar2path": mkdru.pazpar2path,
175               "oninit": mkdru.pz2Init,
176               "onstat": mkdru.pz2Status,
177               "onterm": mkdru.pz2Term,
178               "termlist": "xtargets,subject,author",
179               "onbytarget": mkdru.pz2ByTarget,
180               "usesessions" : mkdru.usesessions,
181               "showResponseType": mkdru.showResponseType,
182               "onrecord": mkdru.pz2Record } );
183 });