Added clickable facets to the jsdemo.
[pazpar2-moved-to-github.git] / www / jsdemo / example_client.js
1 /* A very simple client that shows a basic usage of the pz2.js
2 ** $Id: example_client.js,v 1.5 2007-07-24 08:15:12 jakub Exp $
3 */
4
5 // create a parameters array and pass it to the pz2's constructor
6 // then register the form submit event with the pz2.search function
7 // autoInit is set to true on default
8
9 my_paz = new pz2( { "onshow": my_onshow,
10                     "showtime": 500,            //each timer (show, stat, term, bytarget) can be specified this way
11                     "pazpar2path": "/pazpar2/search.pz2",
12                     "onstat": my_onstat,
13                     "onterm": my_onterm,
14                     "termlist": "subject,author",
15                     "onbytarget": my_onbytarget,
16                     "usesessions" : true,
17                     "onrecord": my_onrecord } );
18 // some state vars
19 var curPage = 1;
20 var recPerPage = 20;
21 var totalRec = 0;
22 var curDetRecId = '';
23 var curDetRecData = null;
24
25 // wait until the DOM is ready
26 function domReady () 
27
28     document.search.onsubmit = onFormSubmitEventHandler;
29     my_paz.stat();
30     my_paz.bytarget();
31 }
32
33 // when search button pressed
34 function onFormSubmitEventHandler() 
35 {
36     curPage = 1;
37     curDetRecId = '';
38     totalRec = 0;
39     my_paz.search(document.search.query.value, recPerPage, 'relevance');
40     return false;
41 }
42
43 //
44 // pz2.js event handlers:
45 //
46
47 function my_onshow(data) {
48     totalRec = data.merged;
49     
50     var body = document.getElementById("body");
51     body.innerHTML = "";
52
53     body.innerHTML +='<hr/><div style="float: right">Displaying: ' 
54                     + data.start + ' to ' + (data.start + data.num) +
55                      ' of ' + data.merged + ' (total not merged hits: ' 
56                      + data.total + ')</div>';
57
58     body.innerHTML += '<div style="float: clear"><span class="jslink" id="prev" onclick="pagerPrev();">'
59                     +'&#60;&#60; Prev</span> <b>|</b> ' 
60                     +'<span class="jslink" id="next" onclick="pagerNext()">'
61                     +'Next &#62;&#62;</span></div><hr/>';
62     
63     for (var i = 0; i < data.hits.length; i++) {
64         var hit = data.hits[i];
65         var html = '<div class="record" id="rec_' + hit.recid + '" onclick="showDetails(this.id)">'
66                     +'<span>' + (i + 1 + recPerPage * ( curPage - 1)) + '. </span>'
67                     +'<span class="jslink"><b>' + hit["md-title"] +
68                     ' </b></span>'; 
69         if (hit["md-title-remainder"] !== undefined) {
70             html += '<span>' + hit["md-title-remainder"] + '</span>';
71         }
72         if (hit["md-title-responsibility"] !== undefined) {
73             html += '<span><i>' + hit["md-title-responsibility"] + '</i></span>';
74         }
75         html += '</div>';
76         body.innerHTML += html;
77         if ( hit.recid == curDetRecId ) {
78             drawCurDetails();
79         }
80     }
81     
82 }
83
84 function my_onstat(data) {
85     var stat = document.getElementById("stat");
86     stat.innerHTML = '<span>Active clients: '+ data.activeclients
87                         + '/' + data.clients + ' | </span>'
88                         + '<span>Retrieved records: ' + data.records
89                         + '/' + data.hits + '</span>';
90 }
91
92 function my_onterm(data) {
93     var termlist = document.getElementById("termlist");
94     termlist.innerHTML = "<hr/><b>TERMLISTS:</b><hr/>";
95     termlist.innerHTML += '<div class="termtitle">.::Subjects</div>';
96     for (var i = 0; i < data.subject.length; i++ ) {
97         termlist.innerHTML += '<span class="jslink" onclick="limitQuery(\'su\', this.firstChild.nodeValue)">' 
98                             + data.subject[i].name 
99                             + '</span><span>  (' 
100                             + data.subject[i].freq 
101                             + ')</span><br/>';
102     }
103     termlist.innerHTML += "<hr/>";
104     termlist.innerHTML += '<div class="termtitle">.::Authors</div>';
105     for (var i = 0; i < data.author.length; i++ ) {
106         termlist.innerHTML += '<span class="jslink" onclick="limitQuery(\'au\', this.firstChild.nodeValue)">' 
107                             + data.author[i].name 
108                             + ' </span><span> (' 
109                             + data.author[i].freq 
110                             + ')</span><br/>';
111     }
112
113 }
114
115 function my_onrecord(data) {
116     // in case on_show was faster to redraw element
117     var detRecordDiv = document.getElementById('det_'+data.recid);
118     if ( detRecordDiv )
119         return;
120
121     curDetRecData = data;
122     drawCurDetails();
123 }
124
125 function my_onbytarget(data) {
126     var targetDiv = document.getElementById("bytarget");
127     var table = '<thead><tr><td>Target ID</td><td>Hits</td><td>Diags</td>'
128                          +'<td>Records</td><td>State</td></tr></thead><tbody>';
129     
130     for (var i = 0; i < data.length; i++ ) {
131         table += "<tr><td>" + data[i].id +
132                     "</td><td>" + data[i].hits +
133                     "</td><td>" + data[i].diagnostic +
134                     "</td><td>" + data[i].records +
135                     "</td><td>" + data[i].state + "</td></tr>";
136     }
137
138     table += '</tbody>';
139     targetDiv.innerHTML = table;
140
141 }
142
143 // detailed record drawing
144 function showDetails ( prefixRecId ) {
145     var recId = prefixRecId.replace('rec_', '');
146     
147     // remove current detailed view if any
148     var detRecordDiv = document.getElementById('det_'+curDetRecId);
149     // lovin DOM!
150     if ( detRecordDiv )
151             detRecordDiv.parentNode.removeChild(detRecordDiv);
152
153     // if the same clicked do not redraw
154     if ( recId == curDetRecId ) {
155         curDetRecId = '';
156         return;
157     }
158
159     curDetRecId = recId;
160
161     // request the record
162     my_paz.record(recId);
163 }
164
165 function drawCurDetails ()
166 {
167     var data = curDetRecData;
168     var recordDiv = document.getElementById('rec_'+data.recid);
169     recordDiv.innerHTML += '<div class="details" id="det_'+data.recid+
170                             '"><table><tr><td><b>Ttle</b></td><td><b>:</b> '+data["md-title"] +
171                             "</td></tr><tr><td><b>Date</b></td><td><b>:</b> " + data["md-date"] +
172                             "</td></tr><tr><td><b>Author</b></td><td><b>:</b> " + data["md-author"] +
173                             '</td></tr><tr><td><b>URL</b></td><td><b>:</b> <a href="' + data["md-electronic-url"] + '">' + data["md-electronic-url"] + '</a>' +
174                             "</td></tr><tr><td><b>Subject</b></td><td><b>:</b> " + data["md-subject"] + 
175                             "</td></tr><tr><td><b>Location</b></td><td><b>:</b> " + data["location"][0].name + 
176                             "</td></tr></table></div>";
177 }
178
179 // limit the query after clicking the facet
180 function limitQuery (field, value)
181 {
182     document.search.query.value += ' and ' + field + '="' + value + '"';
183     onFormSubmitEventHandler();
184 }
185
186 // simple paging functions
187
188 function pagerNext() {
189     if ( totalRec - recPerPage*curPage > 0) {
190         my_paz.showNext();
191         curPage++;
192     }
193 }
194
195 function pagerPrev() {
196     if ( my_paz.showPrev() != false )
197         curPage--;
198 }
199
200 // swithing view between targets and records
201
202 function switchView(view) {
203     
204     var targets = document.getElementById('targetview');
205     var records = document.getElementById('recordview');
206     
207     switch(view) {
208         case 'targetview':
209             targets.style.display = "block";            
210             records.style.display = "none";
211             break;
212         case 'recordview':
213             targets.style.display = "none";            
214             records.style.display = "block";
215             break;
216         default:
217             alert('Unknown view.');
218     }
219 }