missing comma...
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / result_common.js
1
2 var recordsHandled = 0;
3 var recordsCache = [];
4 var lowHitCount = 4;
5
6 /* set up the event handlers */
7 G.evt.result.hitCountReceived.push(resultSetHitInfo);
8 G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
9 G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
10 G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, resultDrawAuthors, resultDrawSeries);
11 //G.evt.result.allRecordsReceived.push(resultBuildCaches );
12
13 attachEvt('result','lowHits',resultLowHits);
14 attachEvt('result','zeroHits',resultZeroHits);
15
16 attachEvt( "common", "locationUpdated", resultSBSubmit );
17 function resultSBSubmit(){searchBarSubmit();}
18
19 /* do this after we have ID's so the rank for mr pages will be correct */
20 attachEvt("result", "preCollectRecords", resultPaginate);
21
22 /* returns the last 'index' postion ocurring in this page */
23 function resultFinalPageIndex() {
24         if(getHitCount() < (getOffset() + getDisplayCount())) 
25                 return getHitCount() - 1;
26         return getOffset() + getDisplayCount() - 1;
27 }
28
29 /* set the search result info, number of hits, which results we're 
30         displaying, links to the next/prev pages, etc. */
31 function resultSetHitInfo() { 
32
33         try{searchTimer.stop()}catch(e){}
34
35         if( findCurrentPage() == MRESULT ) {
36                 if(getHitCount() <= lowHitCount && getTerm())
37                         runEvt('result', 'lowHits');
38                 if(getHitCount() == 0) {
39                         runEvt('result', 'zeroHits');
40                         return;
41                 }
42         }
43
44         var c;  
45         if( getDisplayCount() > (getHitCount() - getOffset()))  c = getHitCount();
46         else c = getDisplayCount() + getOffset();
47
48         var pages = getHitCount() / getDisplayCount();
49         if(pages % 1) pages = parseInt(pages) + 1;
50
51         G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
52         G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
53
54         G.ui.result.offset_start.appendChild(text(getOffset() + 1));
55         G.ui.result.offset_end.appendChild(text(c));
56         G.ui.result.result_count.appendChild(text(getHitCount()));
57         unHideMe(G.ui.result.info);
58 }
59
60 function resultLowHits() {
61         showCanvas();
62         unHideMe($('result_low_hits'));
63         if(getHitCount() > 0)
64                 unHideMe($('result_low_hits_msg'));
65
66         var sreq = new Request(CHECK_SPELL, getTerm());
67         sreq.callback(resultSuggestSpelling);
68         sreq.send();
69
70         var words = getTerm().split(' ');
71         var word;
72         while( word = words.shift() ) {
73                 var areq = new Request(FETCH_CROSSREF, getStype(), getTerm() );
74                 areq.callback(resultLowHitXRef);
75                 areq.send();
76         }
77
78         if( !(getForm() == null || getForm() == 'all' || getForm == "") ) {
79                 var a = {};
80                 a[PARAM_FORM] = "all";
81                 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
82                 unHideMe($('low_hits_remove_format'));
83         }
84
85         resultSuggestSearchClass();
86 }
87
88 var lowHitsXRefLink;
89 var lowHitsXRefLinkParent;
90 function resultLowHitXRef(r) {
91         if(!lowHitsXRefLink){
92                 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
93                 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
94         }
95         var res = r.getResultObject();
96         var arr = res.from;
97         arr.concat(res.also);
98         if(arr && arr.length > 0) {
99                 unHideMe($('low_hits_cross_ref'));
100                 var word;
101                 var c = 0;
102                 while( word = arr.shift() ) {
103                         if(c++ > 20) break;
104                         var a = {};
105                         a[PARAM_TERM] = word;
106                         var template = lowHitsXRefLink.cloneNode(true);
107                         template.setAttribute('href',buildOPACLink(a));
108                         template.appendChild(text(word));
109                         lowHitsXRefLinkParent.appendChild(template);
110                         lowHitsXRefLinkParent.appendChild(text(' '));
111                 }
112         }
113 }
114
115 function resultZeroHits() {
116         showCanvas();
117         unHideMe($('result_low_hits'));
118         unHideMe($('result_zero_hits_msg'));
119         if(getTerm()) resultExpandSearch(); /* advanced search */
120 }
121
122 function resultExpandSearch() {
123         var top = findOrgDepth(globalOrgTree);
124         if(getDepth() == top) return;
125         unHideMe($('low_hits_expand_range'));
126         var par = $('low_hits_expand_link').parentNode;
127         var template = par.removeChild($('low_hits_expand_link'));
128
129         var bottom = getDepth();
130         while( top < bottom ) {
131                 var a = {};
132                 a[PARAM_DEPTH] = top;
133                 var temp = template.cloneNode(true);
134                 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
135                 temp.setAttribute('href',buildOPACLink(a));
136                 par.appendChild(temp);
137                 top++;
138         }
139 }
140
141 function resultSuggestSearchClass() {
142         var stype = getStype();
143         if(stype == STYPE_KEYWORD) return;
144         var a = {}; var ref;
145         unHideMe($('low_hits_search_type'));
146         if(stype != STYPE_TITLE) {
147                 ref = $('low_hits_title_search');
148                 unHideMe(ref);
149                 a[PARAM_STYPE] = STYPE_TITLE;
150                 ref.setAttribute('href',buildOPACLink(a));
151         }
152         if(stype != STYPE_AUTHOR) {
153                 ref = $('low_hits_author_search');
154                 unHideMe(ref);
155                 a[PARAM_STYPE] = STYPE_AUTHOR;
156                 ref.setAttribute('href',buildOPACLink(a));
157         }
158         if(stype != STYPE_SUBJECT) {
159                 ref = $('low_hits_subject_search');
160                 unHideMe(ref);
161                 a[PARAM_STYPE] = STYPE_SUBJECT;
162                 ref.setAttribute('href',buildOPACLink(a));
163         }
164         if(stype != STYPE_KEYWORD) {
165                 ref = $('low_hits_keyword_search');
166                 unHideMe(ref);
167                 a[PARAM_STYPE] = STYPE_KEYWORD;
168                 ref.setAttribute('href',buildOPACLink(a));
169         }
170         if(stype != STYPE_SERIES) {
171                 ref = $('low_hits_series_search');
172                 unHideMe(ref);
173                 a[PARAM_STYPE] = STYPE_SERIES;
174                 ref.setAttribute('href',buildOPACLink(a));
175         }
176 }
177
178 function resultSuggestSpelling(r) {
179         var res = r.getResultObject();
180         if(res) {
181                 unHideMe($('did_you_mean'));
182                 var arg = {};
183                 arg[PARAM_TERM] = res;
184                 $('spell_check_link').setAttribute(
185                         'href', buildOPACLink(arg) );
186                 $('spell_check_link').appendChild(text(res));
187         }
188 }
189
190
191 function resultPaginate() {
192         var o = getOffset();
193
194         if( !((o + getDisplayCount()) >= getHitCount()) ) {
195
196                 var args = {};
197                 args[PARAM_OFFSET]      = o + getDisplayCount();
198                 args[PARAM_SORT]                = SORT;
199                 args[PARAM_SORT_DIR] = SORT_DIR;
200                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
201
202                 G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); 
203                 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
204
205                 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
206                 G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
207                 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
208         }
209
210         if( o > 0 ) {
211
212                 var args = {};
213                 args[PARAM_SORT]                = SORT;
214                 args[PARAM_SORT_DIR] = SORT_DIR;
215                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
216
217                 args[PARAM_OFFSET] = o - getDisplayCount();
218                 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); 
219                 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
220
221                 args[PARAM_OFFSET] = 0;
222                 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); 
223                 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
224         }
225         if(getDisplayCount() < getHitCount())
226                 unHideMe($('start_end_links_span'));
227
228         showCanvas();
229         try{searchTimer.stop()}catch(e){}
230 }
231
232
233 /* display the record info in the record display table 'pos' is the 
234                 zero based position the record should have in the display table */
235 function resultDisplayRecord(rec, pos, is_mr) {
236
237         if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
238         recordsHandled++;
239         recordsCache.push(rec);
240
241         var r = table.rows[pos + 1];
242         
243         try {
244                 var rank = parseFloat(ranks[pos + getOffset()]);
245                 rank            = parseInt( rank * 100 );
246                 var relspan = $n(r, "relevancy_span");
247                 relspan.appendChild(text(rank));
248                 unHideMe(relspan.parentNode);
249         } catch(e){ }
250
251         var pic = $n(r, config.names.result.item_jacket);
252         pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
253
254         var title_link = $n(r, config.names.result.item_title);
255         var author_link = $n(r, config.names.result.item_author);
256
257         var d = new Date();
258
259         if( is_mr )  {
260                 var onlyrec = onlyrecord[ getOffset() + pos ];
261                 if(onlyrec) {
262                         var unapi_span = $n(r,'unapi');
263                         unapi_span.appendChild(
264                                 text(
265                                         normalize( rec.title() ) +
266                                                 ' (tag:open-ils.org,' +
267                                                 d.getFullYear() + '-' +
268                                                 (1 + d.getMonth()) + '-' + 
269                                                 d.getDate() + 
270                                                 ':biblio-record_entry/' + onlyrec + ')'
271                                 )
272                         );
273                         unapi_span.setAttribute(
274                                 'title',
275                                 'tag:open-ils.org,' +
276                                         d.getFullYear() + '-' +
277                                         (1 + d.getMonth()) + '-' + 
278                                         d.getDate() + 
279                                         ':biblio-record_entry/' + onlyrec
280                         );
281
282                         var args = {};
283                         args.page = RDETAIL;
284                         args[PARAM_OFFSET] = 0;
285                         args[PARAM_RID] = onlyrec;
286                         args[PARAM_MRID] = rec.doc_id();
287                         pic.parentNode.setAttribute("href", buildOPACLink(args));
288                         title_link.setAttribute("href", buildOPACLink(args));
289                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
290                         
291                 } else {
292                         var unapi_span = $n(r,'unapi');
293                         unapi_span.appendChild(
294                                 text(
295                                         normalize( rec.title() ) +
296                                                 ' (tag:open-ils.org,' +
297                                                 d.getFullYear() + '-' +
298                                                 (1 + d.getMonth()) + '-' + 
299                                                 d.getDate() + 
300                                                 ':metabib-metarecord/' + rec.doc_id() + ')'
301                                 )
302                         );
303                         unapi_span.setAttribute(
304                                 'title',
305                                 'tag:open-ils.org,' +
306                                         d.getFullYear() + '-' +
307                                         (1 + d.getMonth()) + '-' + 
308                                         d.getDate() + 
309                                         ':biblio-record_entry/' + rec.doc_id()
310                         );
311
312                         buildTitleLink(rec, title_link); 
313                         var args = {};
314                         args.page = RRESULT;
315                         args[PARAM_OFFSET] = 0;
316                         args[PARAM_MRID] = rec.doc_id();
317                         pic.parentNode.setAttribute("href", buildOPACLink(args));
318                 }
319
320         } else {
321                 var unapi_span = $n(r,'unapi');
322                 unapi_span.appendChild(
323                         text(
324                                 normalize( rec.title() ) +
325                                         ' (tag:open-ils.org,' +
326                                         d.getFullYear() + '-' +
327                                         (1 + d.getMonth()) + '-' + 
328                                         d.getDate() + 
329                                         ':biblio-record_entry/' + rec.doc_id() + ')'
330                         )
331                 );
332                 unapi_span.setAttribute(
333                         'title',
334                         'tag:open-ils.org,' +
335                                 d.getFullYear() + '-' +
336                                 (1 + d.getMonth()) + '-' + 
337                                 d.getDate() + 
338                                 ':biblio-record_entry/' + rec.doc_id()
339                 );
340
341                 buildTitleDetailLink(rec, title_link); 
342                 var args = {};
343                 args.page = RDETAIL;
344                 args[PARAM_OFFSET] = 0;
345                 args[PARAM_RID] = rec.doc_id();
346                 pic.parentNode.setAttribute("href", buildOPACLink(args));
347
348                 unHideMe($n(r,'place_hold_span'));
349                 $n(r,'place_hold_link').setAttribute(
350                         'href','javascript:holdsDrawWindow("'+rec.doc_id()+'");');
351         }
352
353         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
354
355         if(! is_mr ) {
356         
357                 if(!isNull(rec.edition()))      {
358                         unHideMe( $n(r, "result_table_extra_span"));
359                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
360                 }
361                 if(!isNull(rec.pubdate())) {
362                         unHideMe( $n(r, "result_table_extra_span"));
363                         unHideMe($n(r, "result_table_pub_span"));
364                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
365                 }
366                 if(!isNull(rec.publisher()) ) {
367                         unHideMe( $n(r, "result_table_extra_span"));
368                         unHideMe($n(r, "result_table_pub_span"));
369                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
370                 }
371         }
372
373         resultBuildFormatIcons( r, rec, is_mr );
374
375         unHideMe(r);
376         
377         runEvt("result", "recordDrawn", rec.doc_id(), title_link);
378
379         /*
380         if(resultPageIsDone())  {
381                 runEvt('result', 'allRecordsReceived', recordsCache);
382         }
383         */
384 }
385
386 function _resultFindRec(id) {
387         for( var i = 0; i != recordsCache.length; i++ ) {
388                 var rec = recordsCache[i];
389                 if( rec && rec.doc_id() == id )
390                         return rec;
391         }
392         return null;
393 }
394
395
396 function resultBuildFormatIcons( row, rec, is_mr ) {
397
398         var ress = rec.types_of_resource();
399
400         for( var i in ress ) {
401
402                 var res = ress[i];
403                 var link = $n(row, res + "_link");
404                 link.title = res;
405                 var img = link.getElementsByTagName("img")[0];
406                 removeCSSClass( img, config.css.dim );
407
408                 var f = getForm();
409                 if( f != "all" ) {
410                         if( f == modsFormatToMARC(res) ) 
411                                 addCSSClass( img, "dim2_border");
412                 }
413
414                 var args = {};
415                 args[PARAM_OFFSET] = 0;
416                 args[PARAM_FORM] = modsFormatToMARC(res);
417
418                 if(is_mr) {
419                         args.page = RRESULT;
420                         args[PARAM_MRID] = rec.doc_id();
421                 } else {
422                         args.page = RDETAIL
423                         args[PARAM_RID] = rec.doc_id();
424                 }
425
426                 link.setAttribute("href", buildOPACLink(args));
427
428         }
429 }
430
431
432 function resultPageIsDone(pos) {
433         return (recordsHandled == getDisplayCount() 
434                 || recordsHandled + getOffset() == getHitCount());
435 }
436
437 var resultCCHeaderApplied = false;
438
439 /* -------------------------------------------------------------------- */
440 /* dynamically add the copy count rows based on the org type 'countsrow' 
441         is the row into which we will add TD's to hold the copy counts 
442         This code generates copy count cells with an id of
443         'copy_count_cell_<depth>_<pagePosition>'  */
444 function resultAddCopyCounts(rec, pagePosition) {
445
446         var r = table.rows[pagePosition + 1];
447         var countsrow = $n(r, config.names.result.counts_row );
448         var ccell = $n(countsrow, config.names.result.count_cell);
449
450         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
451         var node = nodes[0];
452         var type = findOrgType(node.ou_type());
453         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
454         ccell.title = type.opac_label();
455         //addCSSClass(ccell, config.css.result.cc_cell_even);
456
457         var lastcell = ccell;
458         var lastheadcell = null;
459
460         var cchead = null;
461         var ccheadcell = null;
462         if(!resultCCHeaderApplied) {
463                 ccrow = $('result_thead_row');
464                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));
465                 var t = ccheadcell.cloneNode(true);
466                 lastheadcell = t;
467                 t.appendChild(text(type.opac_label()));
468                 ccrow.appendChild(t);
469                 resultCCHeaderApplied = true;
470         }
471
472         if(nodes[1]) {
473
474                 var x = 1;
475                 var d = findOrgDepth(nodes[1]);
476                 var d2 = findOrgDepth(nodes[nodes.length -1]);
477
478                 for( var i = d; i <= d2 ; i++ ) {
479         
480                         ccell = ccell.cloneNode(true);
481
482                         //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
483                         //else addCSSClass(ccell, "copy_count_cell_even");
484
485                         var node = nodes[x++];
486                         var type = findOrgType(node.ou_type());
487         
488                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
489                         ccell.title = type.opac_label();
490                         countsrow.insertBefore(ccell, lastcell);
491                         lastcell = ccell;
492
493                         if(ccheadcell) {
494                                 var t = ccheadcell.cloneNode(true);
495                                 t.appendChild(text(type.opac_label()));
496                                 ccrow.insertBefore(t, lastheadcell);
497                                 lastheadcell = t;
498                         }
499                 }
500         }
501
502         unHideMe($("search_info_table"));
503 }
504
505 /* collect copy counts for a record using method 'methodName' */
506 function resultCollectCopyCounts(rec, pagePosition, methodName) {
507         if(rec == null || rec.doc_id() == null) return;
508         var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
509         req.request.userdata = [ rec, pagePosition ];
510         req.callback(resultHandleCopyCounts);
511         req.send();
512 }
513
514 function resultHandleCopyCounts(r) {
515         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
516 }
517
518
519 /* display the collected copy counts */
520 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
521         if(copy_counts == null || rec == null) return;
522         var i = 0;
523         while(copy_counts[i] != null) {
524                 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
525                 /*
526                 var span = cell.getElementsByTagName("div")[0];
527                 */
528                 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
529
530                 i++;
531         }
532 }
533
534