2 ** $Id: client.js,v 1.7 2007-03-30 16:22:41 jakub 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;
18 var currentQuery = null;
19 var currentQueryArr = new Array();
21 var currentFilter = undefined;
23 var currentDetailedId = null;
24 var currentDetailedData = null;
26 var termStartup = true;
27 var advancedOn = false;
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() {
56 if(!loadQueryFromForm())
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(){ refine(this.name, this.firstChild.nodeValue) }).appendTo(recBody);
106 if( currentDetailedId == id ) {
107 var detailBox = $('<div class="detail"></div>').appendTo(recBody);
108 drawDetailedRec(detailBox);
112 recBody.append('<span> ('+count+')</span>');
115 recsBody.append('<div class="resultNum">'+(currentPage*currentResultsPerPage+i+1)+'.</a>');
116 recsBody.append(recBody);
118 drawPager(data.merged, data.total);
122 ** data.activeclients, data.hits, data.records, data.clients, data.searching
124 function my_onstat(data){}
127 ** data[listname]: name, freq, [id]
129 function my_onterm(data)
131 var termLists = $("#termlists");
135 for(var key in data){
136 if (key == "activeclients")
139 var listClass = "unselected";
141 if (key == "xtargets"){
142 listName = "resource";
143 listClass = "selected";
146 var termList = $('<div class="termlist" id="term_'+key+'"/>').appendTo(termLists);
147 var termTitle = $('<div class="termTitle"><a class="'+listClass+'">'+listName+'</a></div>').appendTo(termList);
148 termTitle.click(function(){
149 if( this.firstChild.className == "selected" ){
150 this.firstChild.className = "unselected";
151 $(this.nextSibling).hide();
153 this.firstChild.className = "selected";
154 $(this.nextSibling).show();
158 listEntries = $('<div class="termEntries"></div>');
159 if (key != "xtargets") listEntries.hide();
160 listEntries.appendTo(termList);
162 for(var i = 0; i < data[key].length; i++)
164 if (key == "xtargets"){
165 var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name
166 /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>');
167 listItem.click(function(){
168 refine(this.name, this.attributes[0].nodeValue) });
169 listItem.appendTo(listEntries);
171 var listItem = $('<a class="sub" name="'+key+'">'+data[key][i].name
172 /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>');
173 listItem.click(function(){ refine(this.name, this.firstChild.nodeValue) });
174 listItem.appendTo(listEntries);
177 $('<hr/>').appendTo(termLists);
183 for(var key in data){
184 if (key == "activeclients")
186 var listEntries = $('#term_'+key).children('.termEntries');
189 for(var i = 0; i < data[key].length; i++){
190 if (key == "xtargets"){
191 var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name
192 /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>').click(function(){
193 refine(this.name, this.attributes[0].nodeValue) });
194 listItem.appendTo(listEntries);
196 var listItem = $('<a class="sub" name="'+key+'">'+data[key][i].name
197 /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>').click(function(){
198 refine(this.name, this.firstChild.nodeValue) });
199 listItem.appendTo(listEntries);
207 ** data["md-title"], data["md-date"], data["md-author"], data["md-subject"], data["location"][0].name
209 function my_onrecord(data)
211 currentDetailedData = data;
216 ** data[i].id, data[i].hits, data[i].diagnostic, data[i].records, data[i].state
218 function my_onbytarget(data){}
221 *********************************************************************************
222 ** HELPER FUNCTIONS *************************************************************
223 *********************************************************************************
225 function fireSearch()
227 my_paz.search(currentQuery, currentResultsPerPage, currentSort, currentFilter);
228 $('div.records').empty();
229 // hack for the time being
230 currentFilter = undefined;
233 function toggleAdvanced()
236 $("div.advanced").hide();
237 $("div.search").height(73);
239 $("#advanced").text("Advanced search");
241 $("div.search").height(173);
242 $("div.advanced").show();
244 $("#advanced").text("Simple search");
248 function drawDetailedRec(detailBox)
250 if( detailBox == undefined )
251 detailBox = $('<div class="detail"></div>').appendTo($('#rec_'+currentDetailedId));
253 detailBox.append('Details:<hr/>');
254 var detailTable = $('<table></table>');
255 var recDate = currentDetailedData["md-date"];
256 var recSubject = currentDetailedData["md-subject"];
257 var recLocation = currentDetailedData["location"];
260 detailTable.append('<tr><td class="item">Published:</td><td>'+recDate+'</td></tr>');
262 detailTable.append('<tr><td class="item">Subject:</td><td>'+recSubject+'</td></tr>');
264 detailTable.append('<tr><td class="item">Available at:</td><td> </td></tr>');
266 for(var i=0; i < recLocation.length; i++)
268 detailTable.append('<tr><td class="item"> </td><td>'+recLocation[i].name+'</td></tr>');
271 detailTable.appendTo(detailBox);
274 function refine(field, value)
276 // for the time being
281 case "author": currentQueryArr.push('au="'+value+'"');
282 if(document.search.author.value != '') document.search.author.value+='; ';
283 document.search.author.value += value; break;
285 case "title": currentQueryArr.push('ti="'+value+'"');
286 //if(document.search.tile.value != '') document.search.title.value+='; ';
287 //document.search.title.value += value; break;
289 case "date": currentQueryArr.push('date="'+value+'"');
290 if(document.search.date.value != '') document.search.date.value+='; ';
291 document.search.date.value += value; break;
293 case "subject": currentQueryArr.push('su="'+value+'"');
294 if(document.search.subject.value != '') document.search.subject.value+='; ';
295 document.search.subject.value += value; break;
297 case "xtarget": currentFilter = 'id='+value; break;
301 currentQuery = currentQueryArr.join(' and ');
306 function loadQueryFromForm()
309 if( document.search.query.value !== '' ) query.push(document.search.query.value);
314 if( (input = parseField(document.search.author.value, 'au')).length ) query = query.concat(input);
315 if( (input = parseField(document.search.title.value, 'ti')).length ) query = query.concat(input);
316 if( (input = parseField(document.search.date.value, 'date')).length ) query = query.concat(input);
317 if( (input = parseField(document.search.subject.value, 'su')).length ) query = query.concat(input);
321 currentQueryArr = query;
322 currentQuery = query.join(" and ");
329 function parseField(inputString, field)
331 var inputArr = inputString.split(';');
332 var outputArr = new Array();
333 for(var i=0; i < inputArr.length; i++){
334 if(inputArr[i].length < 3){
337 outputArr.push(field+'="'+inputArr[i]+'"');
339 //if( outputArr.length ){
340 return outputArr;//.join(" and ");
346 function drawPager(max, hits)
348 var firstOnPage = currentPage * currentResultsPerPage + 1;
349 var lastOnPage = (firstOnPage + currentResultsPerPage - 1) < max ? (firstOnPage + currentResultsPerPage - 1) : max;
351 var results = $('div.showing');
353 results.append('Displaying: <b>'+firstOnPage+'</b> to <b>'+lastOnPage+
354 '</b> of <b>'+max+'</b> (total hits: '+hits+')');
355 var pager = $('div.pages');
358 if ( currentPage > 0 ){
359 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(0));
360 $('<a class="previous_active">Previous</a>').click(function() { my_paz.showPrev(1); currentPage--; }).appendTo(pager.eq(1));
363 pager.append('<a class="previous_inactive">Previous</a>');
365 var numPages = Math.ceil(max / currentResultsPerPage);
367 for(var i = 1; i <= numPages; i++)
369 if( i == (currentPage + 1) ){
370 $('<a class="select">'+i+'</a>').appendTo(pager);
373 var pageLink = $('<a class="page">'+i+'</a>');
374 var plClone = pageLink.clone();
376 pageLink.click(function() {
377 my_paz.showPage(this.firstChild.nodeValue - 1);
378 currentPage = (this.firstChild.nodeValue - 1);
381 plClone.click(function() {
382 my_paz.showPage(this.firstChild.nodeValue - 1);
383 currentPage = (this.firstChild.nodeValue - 1);
387 pager.eq(0).append(pageLink);
388 pager.eq(1).append(plClone);
391 if ( currentPage < (numPages-1) ){
392 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(0));
393 $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(1));
396 pager.append('<a class="next_inactive">Next</a>');
399 function drawBreadcrumb()
401 var bc = $("#breadcrumb");
403 bc.append('<span>'+currentQueryArr[0]+'</span>');
405 for(var i = 1; i < currentQueryArr.length; i++){
406 bc.append('<strong>/</strong>');
407 var bcLink = $('<a id="pos_'+i+'">'+
408 currentQueryArr[i].substring(currentQueryArr[i].indexOf('"') + 1, currentQueryArr[i].lastIndexOf('"'))
409 +'</a>').click(function() { currentQueryArr.splice(this.id.split('_')[1], 1);refine(); });