1 // very simple client that shows a basic usage of the pz2.js
3 // create a parameters array and pass it to the pz2's constructor
4 // then register the form submit event with the pz2.search function
6 var my_paz = new pz2( { "onshow": my_onshow,
10 "termlist": "subject,author,xtargets,date",
11 //"onbytarget": my_onbytarget,
12 "onrecord": my_onrecord } );
14 var currentSort = 'relevance';
15 var currentResultsPerPage = 20;
16 var currentQuery = null;
19 var currentDetailedId = null;
20 var currentDetailedData = null;
22 var termStartup = true; //some things should be done only once
24 // wait until the DOM is ready (could have been defined in the HTML)
25 $(document).ready( function() {
26 document.search.onsubmit = onFormSubmitEventHandler;
29 function onFormSubmitEventHandler() {
30 currentQuery = document.search.query.value;
31 $('#sort').change(function(){
32 currentSort = this.value;
34 my_paz.show(0, currentResultsPerPage, currentSort);
36 $('#perpage').change(function(){
37 currentResultsPerPage = this.value;
39 my_paz.show(0, currentResultsPerPage, currentSort);
41 my_paz.search(document.search.query.value, 20, 'relevance');
42 $('div.content').show();
43 $("div.leftbar").show();
47 // pz2.js event handlers:
49 function my_onshow(data)
52 var recsBody = $('div.records');
55 for (var i = 0; i < data.hits.length; i++) {
56 var title = data.hits[i]["md-title"] || 'N/A';
57 var author = data.hits[i]["md-author"] || '';
58 var id = data.hits[i].recid;
59 var count = data.hits[i].count || 1;
61 var recBody = $('<div class="record" id="rec_'+id+'></div>');
62 var aTitle = $('<a class="recTitle">'+title+'</a>').appendTo(recBody);
63 aTitle.click(function(){
64 var clickedId = this.parentNode.id.split('_')[1];
65 if(currentDetailedId == clickedId){
66 $(this.parentNode.lastChild).remove();
67 currentDetailedId = null;
69 } else if (currentDetailedId != null) {
70 $('#rec_'+currentDetailedId).children('.detail').remove();
72 currentDetailedId = clickedId;
73 my_paz.record(currentDetailedId);
77 recBody.append('<i> by </i>');
78 $('<a name="author" class="recAuthor">'+author+'</a>\n').click(function(){ refine(this.name, this.firstChild.nodeValue) }).appendTo(recBody);
80 if( currentDetailedId == id ){
81 var detailBox = $('<div class="detail"></div>').appendTo(recBody);
82 drawDetailedRec(detailBox);
85 recsBody.append('<div class="resultNum">'+(currentPage*currentResultsPerPage+i+1)+'.</a>');
86 recsBody.append(recBody);
90 drawPager(data.merged, data.total);
96 for ( i = 0; i < data.hits.length; i++) {
97 var hit = data.hits[i];
98 body.innerHTML += '<div id="' + hit.recid + '" onclick="my_paz.record(this.id)"><span>' + i +
99 '. </span><span><b>' + hit["md-title"] +
100 ' </b></span> by <span><i>' + hit["md-author"] + '</i></span></div>';
102 body.innerHTML += "<hr/>";
103 body.innerHTML += '<div>active clients: ' + data.activeclients + '</div>' +
104 '<div>merged: ' + data.merged + '</div>' +
105 '<div>total: ' + data.total + '</div>' +
106 '<div>start: ' + data.start + '</div>' +
107 '<div>num: ' + data.num + '</div>';
111 function my_onstat(data)
114 var stat = document.getElementById("stat");
115 stat.innerHTML = '<div>active clients: ' + data.activeclients + '</div>' +
116 '<div>hits: ' + data.hits + '</div>' +
117 '<div>records: ' + data.records + '</div>' +
118 '<div>clients: ' + data.clients + '</div>' +
119 '<div>searching: ' + data.searching + '</div>';
123 function my_onterm(data)
125 var termLists = $("#termlists");
129 for(var key in data){
130 if (key == "activeclients")
133 if (key == "xtargets")
134 listName = "institution";
136 var termList = $('<div class="termlist" id="term_'+key+'"/>').appendTo(termLists);
137 var termTitle = $('<div class="termTitle"><a class="unselected">'+listName+'</a></div>').appendTo(termList);
138 termTitle.click(function(){
139 if( this.firstChild.className == "selected" ){
140 this.firstChild.className = "unselected";
141 $(this.nextSibling).hide();
143 this.firstChild.className = "selected";
144 $(this.nextSibling).show();
148 listEntries = $('<div class="termEntries"></div>');
150 listEntries.appendTo(termList);
152 for(var i = 0; i < data[key].length; i++)
154 if (key == "xtargets"){
155 var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name+
156 '<span> ('+data[key][i].freq+')</span></a>').appendTo(listEntries);
157 listItem.click(function(){
158 refine(this.name, this.attributes[0].nodeValue) });
160 var listItem = $('<a class="sub" name="'+key+'">'+data[key][i].name+
161 '<span> ('+data[key][i].freq+')</span></a>').appendTo(listEntries);
162 listItem.click(function(){ refine(this.name, this.firstChild.nodeValue) });
165 $('<hr/>').appendTo(termLists);
171 for(var key in data){
172 if (key == "activeclients")
174 var listEntries = $('#term_'+key).children('.termEntries');
177 for(var i = 0; i < data[key].length; i++){
178 if (key == "xtargets"){
179 var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name+
180 '<span> ('+data[key][i].freq+')</span></a>').click(function(){
181 refine(this.name, this.attributes[0].nodeValue) });
182 listItem.appendTo(listEntries);
184 var listItem = $('<a class="sub" name="'+key+'">'+data[key][i].name+
185 '<span> ('+data[key][i].freq+')</span></a>').click(function(){
186 refine(this.name, this.firstChild.nodeValue) });
187 listItem.appendTo(listEntries);
194 function my_onrecord(data)
196 currentDetailedData = data;
200 recordDiv = document.getElementById(data.recid);
201 recordDiv.innerHTML = "<table><tr><td><b>Ttle</b> : </td><td>" + data["md-title"] +
202 "</td></tr><tr><td><b>Date</b> : </td><td>" + data["md-date"] +
203 "</td></tr><tr><td><b>Author</b> : </td><td>" + data["md-author"] +
204 "</td></tr><tr><td><b>Subject</b> : </td><td>" + data["md-subject"] +
205 "</td></tr><tr><td><b>Location</b> : </td><td>" + data["location"][0].name + "</td></tr></table>";
210 function drawDetailedRec(detailBox)
212 if( detailBox == undefined )
213 detailBox = $('<div class="detail"></div>').appendTo($('#rec_'+currentDetailedId));
215 detailBox.append('Details:<hr/>');
216 var detailTable = $('<table></table>');
217 var recDate = currentDetailedData["md-date"];
218 var recSubject = currentDetailedData["md-subject"];
219 var recLocation = currentDetailedData["location"];
222 detailTable.append('<tr><td class="item">Published:</td><td>'+recDate+'</td></tr>');
224 detailTable.append('<tr><td class="item">Subject:</td><td>'+recSubject+'</td></tr>');
226 detailTable.append('<tr><td class="item">Available at:</td><td> </td></tr>');
228 for(var i=0; i < recLocation.length; i++)
230 detailTable.append('<tr><td class="item"> </td><td>'+recLocation[i].name+'</td></tr>');
233 detailTable.appendTo(detailBox);
236 function my_onbytarget(data)
239 targetDiv = document.getElementById("bytarget");
240 targetDiv.innerHTML = "<tr><td>ID</td><td>Hits</td><td>Diag</td><td>Rec</td><td>State</td></tr>";
242 for ( i = 0; i < data.length; i++ ) {
243 targetDiv.innerHTML += "<tr><td><b>" + data[i].id +
244 "</b></td><td>" + data[i].hits +
245 "</td><td>" + data[i].diagnostic +
246 "</td><td>" + data[i].records +
247 "</td><td>" + data[i].state + "</td></tr>";
252 function refine(field, value)
255 var filter = undefined;
258 case "author": query = ' and au="'+value+'"'; break;
259 case "title": query = ' and ti="'+value+'"'; break;
260 case "date": query = ' and date="'+value+'"'; break;
261 case "subject": query = ' and su="'+value+'"'; break;
262 case "xtarget": filter = 'id='+value; break;
266 my_paz.search(currentQuery + query, currentResultsPerPage, currentSort, filter);
269 function drawPager(max, hits)
271 var firstOnPage = currentPage * currentResultsPerPage + 1;
272 var lastOnPage = (firstOnPage + currentResultsPerPage - 1) < max ? (firstOnPage + currentResultsPerPage - 1) : max;
274 var results = $('div.showing');
276 results.append('Displaying: <b>'+firstOnPage+'</b> to <b>'+lastOnPage+
277 '</b> of <b>'+max+'</b>'); //(total hits: '+hits+')');
278 var pager = $('div.pages');
281 if ( currentPage > 0 ){
282 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(0));
283 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(1));
286 pager.append('<a class="previous_inactive">Previous</a>');
288 var numPages = Math.ceil(max / currentResultsPerPage);
290 for(var i = 1; i <= numPages; i++)
292 if( i == (currentPage + 1) ){
293 $('<a class="select">'+i+'</a>').appendTo(pager);
296 var pageLink = $('<a class="page">'+i+'</a>');
297 var plClone = pageLink.clone();
299 pageLink.click(function() {
300 my_paz.showPage(this.firstChild.nodeValue - 1);
301 currentPage = (this.firstChild.nodeValue - 1);
304 plClone.click(function() {
305 my_paz.showPage(this.firstChild.nodeValue - 1);
306 currentPage = (this.firstChild.nodeValue - 1);
310 pager.eq(0).append(pageLink);
311 pager.eq(1).append(plClone);
314 if ( currentPage < (numPages-1) ){
315 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(0));
316 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(1));
319 pager.append('<a class="next_inactive">Next</a>');