2 ** $Id: client.js,v 1.17 2007-04-15 03:24:18 quinn Exp $
3 ** MasterKey - pazpar2's javascript client .
6 /* start with creating pz2 object and passing it event handlers*/
7 var my_paz = new pz2( { "onshow": my_onshow,
11 "termlist": "xtargets,subject,author,date",
12 //"onbytarget": my_onbytarget,
13 "onrecord": my_onrecord } );
15 /* some state variable */
16 var currentSort = 'relevance';
17 var currentResultsPerPage = 20;
19 var curQuery = new pzQuery();
21 var currentDetailedId = null;
22 var currentDetailedData = null;
24 var termStartup = true;
25 var advancedOn = false;
27 var showBriefLocations = true;
29 /* wait until the DOM is ready and register basic handlers */
30 $(document).ready( function() {
31 document.search.onsubmit = onFormSubmitEventHandler;
33 document.search.query.value = '';
34 document.search.title.value = '';
35 document.search.author.value = '';
36 document.search.subject.value = '';
37 document.search.date.value = '';
39 $('#advanced').click(toggleAdvanced);
41 $('#sort').change(function(){
42 currentSort = this.value;
44 my_paz.show(0, currentResultsPerPage, currentSort);
47 $('#perpage').change(function(){
48 currentResultsPerPage = this.value;
50 my_paz.show(0, currentResultsPerPage, currentSort);
54 /* search button event handler */
55 function onFormSubmitEventHandler() {
57 curQuery.clearFilter();
60 $('div.content').show();
61 $("div.leftbar").show();
66 *********************************************************************************
67 ** pz2 Event Handlers ***********************************************************
68 *********************************************************************************
72 ** data.hits["md-title"], data.hits["md-author"], data.hits.recid, data.hits.count
73 ** data.activeclients, data.merged, data.total, data.start, data.num
75 function my_onshow(data)
77 var recsBody = $('div.records');
80 for (var i = 0; i < data.hits.length; i++) {
81 var title = data.hits[i]["md-title"] || 'N/A';
82 var author = data.hits[i]["md-author"] || '';
83 var id = data.hits[i].recid;
84 var count = data.hits[i].count || 1;
86 var recBody = $('<div class="record" id="rec_'+id+'"></div>');
87 var aTitle = $('<a class="recTitle">'+title+'</a>').appendTo(recBody);
88 aTitle.click(function(){
89 var clickedId = this.parentNode.id.split('_')[1];
90 if(currentDetailedId == clickedId){
91 $(this.parentNode.lastChild).remove();
92 currentDetailedId = null;
94 } else if (currentDetailedId != null) {
95 $('#rec_'+currentDetailedId).children('.detail').remove();
97 currentDetailedId = clickedId;
98 my_paz.record(currentDetailedId);
102 recBody.append('<i> by </i>');
103 $('<a name="author" class="recAuthor">'+author+'</a>\n').click(function(){
104 refine(this.name, this.firstChild.nodeValue) }).appendTo(recBody);
107 if( currentDetailedId == id ) {
108 var detailBox = $('<div class="detail"></div>').appendTo(recBody);
109 drawDetailedRec(detailBox);
112 if (showBriefLocations) {
113 var location = data.hits[i]['location'];
116 for (l in location) {
119 list += location[l].name;
121 recBody.append('<span> ('+list+')</span>');
125 recBody.append('<span> ('+count+')</span>');
129 recsBody.append('<div class="resultNum">'+(currentPage*currentResultsPerPage+i+1)+'.</a>');
130 recsBody.append(recBody);
132 drawPager(data.merged, data.total);
136 ** data.activeclients, data.hits, data.records, data.clients, data.searching
138 function my_onstat(data){}
141 ** data[listname]: name, freq, [id]
143 function my_onterm(data)
147 var termLists = $("#termlists");
149 for(var key in data){
150 if (key == "activeclients")
153 var listClass = "unselected";
155 if (key == "xtargets"){
156 listName = "resource";
157 listClass = "selected";
160 var termList = $('<div class="termlist" id="term_'+key+'"/>').appendTo(termLists);
161 var termTitle = $('<div class="termTitle"><a class="'+listClass+'">'+listName+'</a></div>').appendTo(termList);
162 termTitle.click(function(){
163 if( this.firstChild.className == "selected" ){
164 this.firstChild.className = "unselected";
165 $(this.nextSibling).hide();
167 this.firstChild.className = "selected";
168 $(this.nextSibling).show();
172 listEntries = $('<div class="termEntries"></div>');
173 if (key != "xtargets") listEntries.hide();
174 listEntries.appendTo(termList);
176 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 +'<span> ('+data[key][i].freq+')</span>'+'</a>');
180 listItem.click(function(){
181 refine(this.name, this.attributes[0].nodeValue, this.firstChild.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>');
186 listItem.click(function(){ refine(this.name, this.firstChild.nodeValue) });
187 listItem.appendTo(listEntries);
190 $('<hr/>').appendTo(termLists);
196 for(var key in data){
197 if (key == "activeclients")
199 var listEntries = $('#term_'+key).children('.termEntries');
200 if( data[key].length ) listEntries.empty();
202 for(var i = 0; i < data[key].length; i++){
203 if (key == "xtargets"){
204 var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name+'<span> ('+data[key][i].freq+')</span>'+'</a>').click(function(){
205 refine(this.name, this.attributes[0].nodeValue, this.firstChild.nodeValue) });
206 listItem.appendTo(listEntries);
208 var listItem = $('<a class="sub" name="'+key+'">'+data[key][i].name
209 /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>').click(function(){
210 refine(this.name, this.firstChild.nodeValue) });
211 listItem.appendTo(listEntries);
219 ** data["md-title"], data["md-date"], data["md-author"], data["md-subject"], data["location"][0].name
221 function my_onrecord(data)
223 currentDetailedData = data;
228 ** data[i].id, data[i].hits, data[i].diagnostic, data[i].records, data[i].state
230 function my_onbytarget(data){}
233 *********************************************************************************
234 ** HELPER FUNCTIONS *************************************************************
235 *********************************************************************************
237 function fireSearch()
239 $('div.showing').empty().text('No records to show.');
240 $('div.pages').empty().html(' ');
241 $('div.records').empty();
242 currentDetailedId = null;
243 if( !curQuery.totalLength() )
245 my_paz.search(curQuery.toCCL(), currentResultsPerPage, currentSort, curQuery.getFilterString() );
248 function toggleAdvanced()
251 $("div.advanced").hide();
252 $("div.search").height(73);
254 $("#advanced").text("Advanced search");
256 $("div.search").height(173);
257 $("div.advanced").show();
259 $("#advanced").text("Simple search");
260 loadFormFieldsFromQuery();
264 function drawDetailedRec(detailBox)
266 if( detailBox == undefined )
267 detailBox = $('<div class="detail"></div>').appendTo($('#rec_'+currentDetailedId));
269 var detailTable = $('<table></table>');
270 var recLocation = currentDetailedData["location"];
274 hdtarget = $('<tr><td class="item">Available at:</td></tr>');
275 detailTable.append(hdtarget);
277 for(var i=0; i < recLocation.length; i++)
280 hdtarget = $('<tr><td class="item"> </td></tr>').appendTo(detailTable);
281 var url = recLocation[i]["md-url"];
282 var description = recLocation[i]["md-description"];
283 hdtarget.append('<td><b>'+recLocation[i].name+'</b></td>');
285 var tline = $('<tr><td> </td></tr>');
286 var td = $('<td></td>').appendTo(tline);
287 var tlink = $('<a>Go to resource</a>');
288 tlink.attr('href', url);;
289 tlink.attr('target', '_blank');
291 detailTable.append(tline);
294 detailTable.append($('<tr><td> </td><td>'+description+'</td></tr>'));
295 hdtarget = undefined;
299 detailTable.appendTo(detailBox);
302 function refine(field, value, opt)
305 case "author": curQuery.addTerm('au', value); break;
306 case "title": curQuery.addTerm('ti', value); break;
307 case "date": curQuery.addTerm('date', value); break;
308 case "subject": curQuery.addTerm('su', value); break;
309 case "xtarget": curQuery.setFilter(opt, value); break;
313 loadFormFieldsFromQuery();
320 function loadQueryFromForm()
323 curQuery.simpleQuery = document.search.query.value;
327 curQuery.addTermsFromList(document.search.author.value, 'au');
328 curQuery.addTermsFromList(document.search.title.value, 'ti');
329 curQuery.addTermsFromList(document.search.date.value, 'date');
330 curQuery.addTermsFromList(document.search.subject.value, 'su');
334 function loadFormFieldsFromQuery()
336 document.search.author.value = '';
337 document.search.title.value = '';
338 document.search.date.value = '';
339 document.search.subject.value = '';
341 for(var i = 0; i < curQuery.numTerms; i++)
343 switch( curQuery.getTermFieldByIdx(i) )
345 case "au": document.search.author.value += curQuery.getTermValueByIdx(i) + '; '; break;
346 case "ti": document.search.title.value += curQuery.getTermValueByIdx(i) + '; '; break;
347 case "date": document.search.date.value += curQuery.getTermValueByIdx(i) + '; '; break;
348 case "su": document.search.subject.value += curQuery.getTermValueByIdx(i) + '; '; break;
353 function drawPager(max, hits)
355 var firstOnPage = currentPage * currentResultsPerPage + 1;
356 var lastOnPage = (firstOnPage + currentResultsPerPage - 1) < max ? (firstOnPage + currentResultsPerPage - 1) : max;
358 var results = $('div.showing');
360 results.append('Displaying: <b>'+firstOnPage+'</b> to <b>'+lastOnPage+
361 '</b> of <b>'+max+'</b> (total hits: '+hits+')');
362 var pager = $('div.pages');
365 if ( currentPage > 0 ){
366 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(0));
367 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(1));
370 pager.append('<a class="previous_inactive">Previous</a>');
372 var numPages = Math.ceil(max / currentResultsPerPage);
374 var start = ( currentPage - 5 > 0 ? currentPage - 5 : 1 );
375 var stop = ( start + 12 < numPages ? start + 12 : numPages );
377 if (start > 1) $('<span>... </span>').appendTo(pager);
379 for(var i = start; i <= stop; i++)
381 if( i == (currentPage + 1) ){
382 $('<a class="select">'+i+'</a>').appendTo(pager);
385 var pageLink = $('<a class="page">'+i+'</a>');
386 var plClone = pageLink.clone();
388 pageLink.click(function() {
389 my_paz.showPage(this.firstChild.nodeValue - 1);
390 currentPage = (this.firstChild.nodeValue - 1);
393 plClone.click(function() {
394 my_paz.showPage(this.firstChild.nodeValue - 1);
395 currentPage = (this.firstChild.nodeValue - 1);
399 pager.eq(0).append(pageLink);
400 pager.eq(1).append(plClone);
403 if (stop < numPages) $('<span> ...</span>').appendTo(pager);
405 if ( currentPage < (numPages-1) ){
406 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(0));
407 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(1));
410 pager.append('<a class="next_inactive">Next</a>');
413 function drawBreadcrumb()
415 var bc = $("#breadcrumb");
418 if(curQuery.filterNums) $('<strong id="filter"><a>'+curQuery.getFilterName(0)+'</a>: </strong>').click(function() {
419 curQuery.removeFilter(0);
423 bc.append('<span>'+curQuery.simpleQuery+'</span>');
425 for(var i = 0; i < curQuery.numTerms; i++){
426 bc.append('<strong> + </strong>');
427 var bcLink = $('<a id="pos_'+i+'">'+curQuery.getTermValueByIdx(i)+'</a>').click(function() {
428 curQuery.removeTermByIdx(this.id.split('_')[1]);