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