]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/result_common.js
dump() is a mozilla thing; use console.log instead
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / result_common.js
1 dojo.require('openils.BibTemplate');
2
3 var recordsHandled = 0;
4 var recordsCache = [];
5 var lowHitCount = 4;
6 var isbnList = '';
7 var googleBooksLink = true;
8
9 var resultFetchAllRecords = false;
10 var resultCompiledSearch = null;
11
12 /* set up the event handlers */
13 if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {
14         G.evt.result.hitCountReceived.push(resultSetHitInfo);
15         G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
16         G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
17         G.evt.result.allRecordsReceived.push( function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews);
18
19         attachEvt('result','lowHits',resultLowHits);
20         attachEvt('result','zeroHits',resultZeroHits);
21         attachEvt( "common", "locationUpdated", resultSBSubmit );
22         /* do this after we have ID's so the rank for mr pages will be correct */
23         attachEvt("result", "preCollectRecords", resultPaginate);
24 }
25
26 function resultSBSubmit(){searchBarSubmit();}
27
28 /* returns the last 'index' postion ocurring in this page */
29 function resultFinalPageIndex() {
30         if(getHitCount() < (getOffset() + getDisplayCount())) 
31                 return getHitCount() - 1;
32         return getOffset() + getDisplayCount() - 1;
33 }
34
35
36
37
38 /* generic search method */
39 function resultCollectSearchIds( type, method, handler ) {
40
41         var sort                = (getSort() == SORT_TYPE_REL) ? null : getSort(); 
42         var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null;
43
44         var item_type;
45         var item_form;
46         var args = {};
47
48         if( type ) {
49                 var form = parseForm(getForm());
50                 item_type = form.item_type;
51                 item_form = form.item_form;
52
53         } else {
54                 item_type = (getItemType()) ? getItemType().split(/,/) : null;
55                 item_form = (getItemForm()) ? getItemForm().split(/,/) : null;
56         }
57
58         var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount();
59
60         if( getOffset() > 0 ) {
61                 if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() ) 
62                         limit = getHitCount() - getOffset();
63         }
64
65         var lasso = getLasso();
66
67         if (lasso) args.org_unit = -lasso;
68         else args.org_unit = getLocation();
69
70         args.depth    = getDepth();
71         args.limit    = limit;
72         args.offset   = getOffset();
73         args.visibility_limit = 3000;
74     args.default_class = getStype();
75
76         if(sort) args.sort = sort;
77         if(sortdir) args.sort_dir = sortdir;
78         if(item_type) args.item_type    = item_type;
79         if(item_form) args.item_form    = item_form;
80     if(getAvail()) args.available = 1;
81
82
83         if(getFacet()) args.facets  = getFacet();
84
85         if(getAudience()) args.audience  = getAudience().split(/,/);
86         if(getLitForm()) args.lit_form  = getLitForm().split(/,/);
87         if(getLanguage()) args.language = getLanguage().split(/,/);
88         if(getBibLevel()) args.bib_level        = getBibLevel().split(/,/);
89         if(getCopyLocs()) args.locations        = getCopyLocs().split(/,/);
90     if(getPubdBefore()) args.before = getPubdBefore();
91     else if(getPubdAfter()) args.after = getPubdAfter();
92     else if(getPubdBetween()) args.between = getPubdBetween().split(/,/);
93
94         _debug('Search args: ' + js2JSON(args));
95         _debug('Raw query: ' + getTerm());
96
97         var atomfeed = "/opac/extras/opensearch/1.1/" + findOrgUnit(args.org_unit).shortname() + "/atom-full/" + getStype() + '?searchTerms=' + getTerm();
98         if (args.facets) { atomfeed += ' ' + args.facets; }
99         if (sort) { atomfeed += '&searchSort=' + sort; }
100         if (sortdir) { atomfeed += '&searchSortDir=' + sortdir; }
101         dojo.create('link', {"rel":"alternate", "href":atomfeed, "type":"application/atom+xml"}, dojo.query('head')[0]);
102
103         var req = new Request(method, args, getTerm(), 1);
104         req.callback(handler);
105         req.send();
106 }
107
108
109
110
111
112 /* set the search result info, number of hits, which results we're 
113         displaying, links to the next/prev pages, etc. */
114 function resultSetHitInfo() { 
115
116         var lasso = getLasso();
117         if (!lasso) {
118                 /* tell the user where the results are coming from */
119                 var baseorg = findOrgUnit(getLocation());
120                 var depth = getDepth();
121                 var mydepth = findOrgDepth(baseorg);
122                 if( findOrgDepth(baseorg) != depth ) {
123                         var tmporg = baseorg;
124                         while( mydepth > depth ) {
125                                 mydepth--;
126                                 tmporg = findOrgUnit(tmporg.parent_ou());
127                         }
128                         unHideMe($('including_results_for'));
129                         $('including_results_location').appendChild(text(tmporg.name()));
130                 }
131         }
132
133
134         try{searchTimer.stop()}catch(e){}
135
136         //if( findCurrentPage() == MRESULT ) {
137         if( findCurrentPage() == MRESULT || 
138
139                 (findCurrentPage() == RRESULT &&
140                         (
141                                 getRtype() == RTYPE_TITLE ||
142                                 getRtype() == RTYPE_AUTHOR ||
143                                 getRtype() == RTYPE_SUBJECT ||
144                                 getRtype() == RTYPE_SERIES ||
145                                 getRtype() == RTYPE_KEYWORD 
146                         )
147
148                 ) ) {
149
150                 if(getHitCount() <= lowHitCount && getTerm())
151                         runEvt('result', 'lowHits');
152         }
153
154         if(getHitCount() == 0) {
155                 runEvt('result', 'zeroHits');
156                 return;
157         }
158
159
160         var pages = getHitCount() / getDisplayCount();
161         if(pages % 1) pages = parseInt(pages) + 1;
162
163         
164
165         var cpage = (getOffset()/getDisplayCount()) + 1;
166
167         G.ui.result.current_page.appendChild(text(cpage));
168         G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
169
170         $('current_page2').appendChild(text(cpage));
171         $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */
172
173         /* set the offsets */
174         var offsetEnd = getDisplayCount() + getOffset();  
175         if( getDisplayCount() > (getHitCount() - getOffset()))  
176                 offsetEnd = getHitCount();
177
178         G.ui.result.offset_end.appendChild(text(offsetEnd));
179         G.ui.result.offset_start.appendChild(text(getOffset() + 1));
180
181         $('offset_end2').appendChild(text(offsetEnd));
182         $('offset_start2').appendChild(text(getOffset() + 1));
183
184         G.ui.result.result_count.appendChild(text(getHitCount()));
185         unHideMe(G.ui.result.info);
186
187         $('result_count2').appendChild(text(getHitCount()));
188         unHideMe($('result_info_div2'));
189 }
190
191 function resultLowHits() {
192         showCanvas();
193         unHideMe($('result_low_hits'));
194         if(getHitCount() > 0)
195                 unHideMe($('result_low_hits_msg'));
196
197     var words = [];
198     for(var key in resultCompiledSearch.searches) 
199         words.push(resultCompiledSearch.searches[key].term);
200
201         var sreq = new Request(CHECK_SPELL, words.join(' '));
202         sreq.callback(resultSuggestSpelling);
203         sreq.send();
204
205     for(var key in resultCompiledSearch.searches) {
206                 var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);
207                 areq.callback(resultLowHitXRef);
208                 areq.send();
209         }
210
211         if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {
212                 var a = {};
213                 a[PARAM_FORM] = "all";
214                 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
215                 unHideMe($('low_hits_remove_format'));
216         }
217
218         resultSuggestSearchClass();
219
220         if(getTerm()) resultExpandSearch(); /* advanced search */
221 }
222
223 var lowHitsXRefSet = {};
224 var lowHitsXRefLink;
225 var lowHitsXRefLinkParent;
226 function resultLowHitXRef(r) {
227         if(!lowHitsXRefLink){
228                 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
229                 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
230         }
231         var res = r.getResultObject();
232         var arr = res.from;
233         arr.concat(res.also);
234         if(arr && arr.length > 0) {
235                 unHideMe($('low_hits_cross_ref'));
236                 var word;
237                 var c = 0;
238                 while( word = arr.shift() ) {
239
240             if (lowHitsXRefSet[word] == 1) continue;
241             lowHitsXRefSet[word] = 1;
242
243                         if(c++ > 20) break;
244                         var a = {};
245                         a[PARAM_TERM] = word;
246                         var template = lowHitsXRefLink.cloneNode(true);
247                         template.setAttribute('href',buildOPACLink(a));
248                         template.appendChild(text(word));
249                         lowHitsXRefLinkParent.appendChild(template);
250                         lowHitsXRefLinkParent.appendChild(text(' '));
251                 }
252         }
253 }
254
255 function resultZeroHits() {
256         showCanvas();
257         unHideMe($('result_low_hits'));
258         unHideMe($('result_zero_hits_msg'));
259         //if(getTerm()) resultExpandSearch(); /* advanced search */
260 }
261
262 function resultExpandSearch() {
263         var top = findOrgDepth(globalOrgTree);
264         if(getDepth() == top) return;
265         unHideMe($('low_hits_expand_range'));
266         var par = $('low_hits_expand_link').parentNode;
267         var template = par.removeChild($('low_hits_expand_link'));
268
269         var bottom = getDepth();
270         while( top < bottom ) {
271                 var a = {};
272                 a[PARAM_DEPTH] = top;
273                 var temp = template.cloneNode(true);
274                 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
275                 temp.setAttribute('href',buildOPACLink(a));
276                 par.appendChild(temp);
277                 top++;
278         }
279 }
280
281 function resultSuggestSearchClass() {
282         var stype = getStype();
283         if(stype == STYPE_KEYWORD) return;
284         var a = {}; var ref;
285         unHideMe($('low_hits_search_type'));
286         if(stype != STYPE_TITLE) {
287                 ref = $('low_hits_title_search');
288                 unHideMe(ref);
289                 a[PARAM_STYPE] = STYPE_TITLE;
290                 ref.setAttribute('href',buildOPACLink(a));
291         }
292         if(stype != STYPE_AUTHOR) {
293                 ref = $('low_hits_author_search');
294                 unHideMe(ref);
295                 a[PARAM_STYPE] = STYPE_AUTHOR;
296                 ref.setAttribute('href',buildOPACLink(a));
297         }
298         if(stype != STYPE_SUBJECT) {
299                 ref = $('low_hits_subject_search');
300                 unHideMe(ref);
301                 a[PARAM_STYPE] = STYPE_SUBJECT;
302                 ref.setAttribute('href',buildOPACLink(a));
303         }
304         if(stype != STYPE_KEYWORD) {
305                 ref = $('low_hits_keyword_search');
306                 unHideMe(ref);
307                 a[PARAM_STYPE] = STYPE_KEYWORD;
308                 ref.setAttribute('href',buildOPACLink(a));
309         }
310         if(stype != STYPE_SERIES) {
311                 ref = $('low_hits_series_search');
312                 unHideMe(ref);
313                 a[PARAM_STYPE] = STYPE_SERIES;
314                 ref.setAttribute('href',buildOPACLink(a));
315         }
316 }
317
318 function resultSuggestSpelling(r) {
319         var res = r.getResultObject();
320         var phrase = getTerm();
321         var words = phrase.split(/ /);
322
323         var newterm = "";
324
325         for( var w = 0; w < words.length; w++ ) {
326                 var word = words[w];
327                 var blob = grep(res, function(i){return (i.word == word);});
328                 if( blob ) blob = blob[0];
329                 else continue;
330                 if( blob.word == word ) {
331                         if( blob.suggestions && blob.suggestions[0] ) {
332                                 newterm += " " + blob.suggestions[0];
333                                 unHideMe($('did_you_mean'));
334                         } else {
335                                 newterm += " " + word;
336                         }
337                 }
338         }
339
340         var arg = {};
341         arg[PARAM_TERM] = newterm;
342         $('spell_check_link').setAttribute('href', buildOPACLink(arg));
343         $('spell_check_link').appendChild(text(newterm));
344 }
345
346
347 function resultPaginate() {
348         var o = getOffset();
349
350         if( !(  ((o) + getDisplayCount()) >= getHitCount()) ) {
351
352                 var args = {};
353                 args[PARAM_OFFSET]      = o + getDisplayCount();
354                 args[PARAM_SORT]                = SORT;
355                 args[PARAM_SORT_DIR] = SORT_DIR;
356                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
357
358                 G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); 
359                 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
360
361                 $('next_link2').setAttribute("href", buildOPACLink(args)); 
362                 addCSSClass($('next_link2'), config.css.result.nav_active);
363
364                 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
365
366                 /* when hit count is divisible by display count, we have to adjust */
367                 if( getHitCount() % getDisplayCount() == 0 ) 
368                         args[PARAM_OFFSET] -= getDisplayCount();
369
370         /*
371                 G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
372                 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
373
374                 $('end_link2').setAttribute("href", buildOPACLink(args)); 
375                 addCSSClass($('end_link2'), config.css.result.nav_active);
376         */
377         }
378
379         if( o > 0 ) {
380
381                 var args = {};
382                 args[PARAM_SORT]                = SORT;
383                 args[PARAM_SORT_DIR] = SORT_DIR;
384                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
385
386                 args[PARAM_OFFSET] = o - getDisplayCount();
387                 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); 
388                 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
389
390                 $('prev_link2').setAttribute( "href", buildOPACLink(args)); 
391                 addCSSClass($('prev_link2'), config.css.result.nav_active);
392
393                 args[PARAM_OFFSET] = 0;
394                 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); 
395                 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
396
397                 $('search_home_link2').setAttribute( "href", buildOPACLink(args)); 
398                 addCSSClass($('search_home_link2'), config.css.result.nav_active);
399         }
400
401         if(getDisplayCount() < getHitCount()) {
402                 unHideMe($('start_end_links_span'));
403                 unHideMe($('start_end_links_span2'));
404    }
405
406         showCanvas();
407         try{searchTimer.stop()}catch(e){}
408 }
409
410 function buildunAPISpan (span, type, id) {
411         var cgi = new CGI();
412         var d = new Date();
413
414         addCSSClass(span,'unapi-id');
415
416         span.setAttribute(
417                 'title',
418                 'tag:' + cgi.server_name + ',' +
419                         d.getFullYear() +
420                         ':' + type + '/' + id
421         );
422 }
423
424 function unhideGoogleBooksLink (data) {
425     for ( var i in data ) {
426         //if (data[i].preview == 'noview') continue;
427
428         var gbspan = $n(document.documentElement, 'googleBooksLink-' + i);
429         var gba = $n(gbspan, "googleBooks-link");
430
431         gba.setAttribute(
432             'href',
433             data[i].info_url
434         );
435         removeCSSClass( gbspan, 'hide_me' );
436     }
437 }
438
439 /* display the record info in the record display table 'pos' is the 
440                 zero based position the record should have in the display table */
441 function resultDisplayRecord(rec, pos, is_mr) {
442
443     fieldmapper.IDL.load(['mvr']);
444         if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
445         recordsHandled++;
446         recordsCache.push(rec);
447
448         var r = table.rows[pos + 1];
449     var currentISBN = cleanISBN(rec.isbn());
450
451     if (googleBooksLink) {
452             var gbspan = $n(r, "googleBooksLink");
453         if (currentISBN) {
454             gbspan.setAttribute(
455                 'name',
456                 gbspan.getAttribute('name') + '-' + currentISBN
457             );
458
459             if (isbnList) isbnList += ', ';
460             isbnList += currentISBN;
461         }
462     }
463
464     if (currentISBN && chilifresh && chilifresh != '(none)') {
465         var cfrow = $n(r, "chilifreshReview");
466         if (cfrow) {
467             removeCSSClass( cfrow, 'hide_me' );
468         }
469         var cflink = $n(r, "chilifreshReviewLink");
470         if (cflink) {
471             cflink.setAttribute(
472                 'id',
473                 'isbn_' + currentISBN
474             );
475         }
476         var cfdiv = $n(r, "chilifreshReviewResult");
477         if (cfdiv) {
478             cfdiv.setAttribute(
479                 'id',
480                 'chili_review_' + currentISBN
481             )
482         }
483     }
484
485 /*
486         try {
487                 var rank = parseFloat(ranks[pos + getOffset()]);
488                 rank            = parseInt( rank * 100 );
489                 var relspan = $n(r, "relevancy_span");
490                 relspan.appendChild(text(rank));
491                 unHideMe(relspan.parentNode);
492         } catch(e){ }
493 */
494
495         var pic = $n(r, config.names.result.item_jacket);
496         pic.setAttribute("src", buildISBNSrc(currentISBN));
497
498         var title_link = $n(r, config.names.result.item_title);
499         var author_link = $n(r, config.names.result.item_author);
500
501         var onlyrec;
502         if( is_mr )  {
503                 onlyrec = onlyrecord[ getOffset() + pos ];
504                 if(onlyrec) {
505                         buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);
506
507                         var args = {};
508                         args.page = RDETAIL;
509                         args[PARAM_OFFSET] = 0;
510                         args[PARAM_RID] = onlyrec;
511                         args[PARAM_MRID] = rec.doc_id();
512                         pic.parentNode.setAttribute("href", buildOPACLink(args));
513                         title_link.setAttribute("href", buildOPACLink(args));
514                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
515
516                 } else {
517                         buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());
518
519                         buildTitleLink(rec, title_link); 
520                         var args = {};
521                         args.page = RRESULT;
522                         args[PARAM_OFFSET] = 0;
523                         args[PARAM_MRID] = rec.doc_id();
524                         pic.parentNode.setAttribute("href", buildOPACLink(args));
525                 }
526
527                 unHideMe($n(r,'place_hold_span'));
528                 $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'M'); }
529             
530
531         } else {
532                 onlyrec = rec.doc_id();
533                 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
534
535                 buildTitleDetailLink(rec, title_link); 
536                 var args = {};
537                 args.page = RDETAIL;
538                 args[PARAM_OFFSET] = 0;
539                 args[PARAM_RID] = rec.doc_id();
540                 pic.parentNode.setAttribute("href", buildOPACLink(args));
541
542                 unHideMe($n(r,'place_hold_span'));
543                 $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); }
544         }
545
546         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
547
548         if(! is_mr ) {
549         
550                 if(!isNull(rec.edition()))      {
551                         unHideMe( $n(r, "result_table_extra_span"));
552                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
553                 }
554                 if(!isNull(rec.pubdate())) {
555                         unHideMe( $n(r, "result_table_extra_span"));
556                         unHideMe($n(r, "result_table_pub_span"));
557                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
558                 }
559                 if(!isNull(rec.publisher()) ) {
560                         unHideMe( $n(r, "result_table_extra_span"));
561                         unHideMe($n(r, "result_table_pub_span"));
562                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
563                 }
564
565                 if(!isNull(rec.physical_description()) ) {
566                         unHideMe( $n(r, "result_table_extra_span"));
567                         var t = " " + rec.physical_description();
568                         //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));
569                         $n(r, "result_table_phys_span").appendChild( text(t));
570                 }
571
572         }
573
574         resultBuildFormatIcons( r, rec, is_mr );
575
576         var bt_params = {
577                 sync                    : false,
578                 root                    : r,
579                 subObjectLimit  : 10,
580                 org_unit                : findOrgUnit(getLocation()).shortname(),
581                 depth                   : getDepth()
582         };
583
584         if (!is_mr) {
585                 bt_params = dojo.mixin( bt_params, { record : onlyrec } );
586         } else {
587                 bt_params = dojo.mixin( bt_params, { metarecord : onlyrec } );
588         }
589
590         if (findOrgType(findOrgUnit(getLocation()).ou_type()).can_have_vols())
591                 unHideMe($n(r,'local_callnumber_list'));
592
593         new openils.BibTemplate( bt_params ).render();
594
595         unHideMe(r);
596         
597         runEvt("result", "recordDrawn", rec.doc_id(), title_link);
598
599         /*
600         if(resultPageIsDone())  {
601                 runEvt('result', 'allRecordsReceived', recordsCache);
602         }
603         */
604 }
605
606 function resultDrawHoldsWindow(hold_target, hold_type) {
607     var src = location.href;
608
609     if(forceLoginSSL && src.match(/^http:/)) {
610
611         src = src.replace(/^http:/, 'https:');
612
613         if(src.match(/&hold_target=/)) {
614             src.replace(/&hold_target=(\d+)/, hold_target);
615
616         } else {
617             src += '&hold_target=' + hold_target;
618         }
619
620         location.href = src;
621
622     } else {
623         holdsDrawEditor({record:hold_target, type:hold_type});
624     }
625 }
626
627
628
629 function _resultFindRec(id) {
630         for( var i = 0; i != recordsCache.length; i++ ) {
631                 var rec = recordsCache[i];
632                 if( rec && rec.doc_id() == id )
633                         return rec;
634         }
635         return null;
636 }
637
638
639 function resultBuildFormatIcons( row, rec, is_mr ) {
640
641         var ress = rec.types_of_resource();
642
643         for( var i in ress ) {
644
645                 var res = ress[i];
646                 if(!res) continue;
647
648                 var link = $n(row, res + "_link");
649                 link.title = res;
650                 var img = link.getElementsByTagName("img")[0];
651                 removeCSSClass( img, config.css.dim );
652
653                 var f = getForm();
654                 if( f != "all" ) {
655                         if( f == modsFormatToMARC(res) ) 
656                                 addCSSClass( img, "dim2_border");
657                 }
658
659                 var args = {};
660                 args[PARAM_OFFSET] = 0;
661
662                 if(is_mr) {
663                         args.page = RRESULT;
664                         args[PARAM_TFORM] = modsFormatToMARC(res);
665                         args[PARAM_MRID] = rec.doc_id();
666
667                 } else {
668                         args.page = RDETAIL
669                         args[PARAM_RID] = rec.doc_id();
670                 }
671
672                 link.setAttribute("href", buildOPACLink(args));
673
674         }
675 }
676
677 function fetchGoogleBooksLink () {
678     if (isbnList && googleBooksLink) {
679         var scriptElement = document.createElement("script");
680         scriptElement.setAttribute("id", "jsonScript");
681         scriptElement.setAttribute("src",
682             "http://books.google.com/books?bibkeys=" + 
683             escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink");
684         scriptElement.setAttribute("type", "text/javascript");
685         // make the request to Google Book Search
686         document.documentElement.firstChild.appendChild(scriptElement);
687     }
688 }
689
690 function fetchChiliFreshReviews() {
691     if (chilifresh && chilifresh != '(none)') {
692         try { chili_init(); } catch(E) { console.log(E + '\n'); }
693     }
694 }
695
696 function resultPageIsDone(pos) {
697
698         return (recordsHandled == getDisplayCount() 
699                 || recordsHandled + getOffset() == getHitCount());
700 }
701
702 var resultCCHeaderApplied = false;
703
704 /* -------------------------------------------------------------------- */
705 /* dynamically add the copy count rows based on the org type 'countsrow' 
706         is the row into which we will add TD's to hold the copy counts 
707         This code generates copy count cells with an id of
708         'copy_count_cell_<depth>_<pagePosition>'  */
709 function resultAddCopyCounts(rec, pagePosition) {
710
711         var r = table.rows[pagePosition + 1];
712         var countsrow = $n(r, config.names.result.counts_row );
713         var ccell = $n(countsrow, config.names.result.count_cell);
714
715         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
716         var start_here = 0;
717         var orgHiding = checkOrgHiding();
718         if (orgHiding) {
719                 for (var i = 0; i < nodes.length; i++) {
720                         if (orgHiding.depth == findOrgDepth(nodes[i])) {
721                                 start_here = i;
722                         }
723                 }
724         }
725
726         var node = nodes[start_here];
727         var type = findOrgType(node.ou_type());
728         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
729         ccell.title = type.opac_label();
730         //addCSSClass(ccell, config.css.result.cc_cell_even);
731
732         var lastcell = ccell;
733         var lastheadcell = null;
734
735         var cchead = null;
736         var ccheadcell = null;
737         if(!resultCCHeaderApplied && !getLasso()) {
738                 ccrow = $('result_thead_row');
739                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));
740                 var t = ccheadcell.cloneNode(true);
741                 lastheadcell = t;
742                 t.appendChild(text(type.opac_label()));
743                 ccrow.appendChild(t);
744                 resultCCHeaderApplied = true;
745         }
746
747         if(nodes[start_here+1]) {
748
749                 var x = start_here+1;
750                 var d = findOrgDepth(nodes[start_here+1]);
751                 var d2 = findOrgDepth(nodes[nodes.length -1]);
752
753                 for( var i = d; i <= d2 ; i++ ) {
754         
755                         ccell = ccell.cloneNode(true);
756
757                         //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
758                         //else addCSSClass(ccell, "copy_count_cell_even");
759
760                         var node = nodes[x++];
761                         var type = findOrgType(node.ou_type());
762         
763                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
764                         ccell.title = type.opac_label();
765                         countsrow.insertBefore(ccell, lastcell);
766                         lastcell = ccell;
767
768                         if(ccheadcell) {
769                                 var t = ccheadcell.cloneNode(true);
770                                 t.appendChild(text(type.opac_label()));
771                                 ccrow.insertBefore(t, lastheadcell);
772                                 lastheadcell = t;
773                         }
774                 }
775         }
776
777         unHideMe($("search_info_table"));
778 }
779
780 /* collect copy counts for a record using method 'methodName' */
781 function resultCollectCopyCounts(rec, pagePosition, methodName) {
782         if(rec == null || rec.doc_id() == null) return;
783
784         var loc = getLasso();
785         if (loc) loc = -loc;
786         else loc= getLocation();
787
788         var req = new Request(methodName, loc, rec.doc_id(), getForm() );
789         req.request.userdata = [ rec, pagePosition ];
790         req.callback(resultHandleCopyCounts);
791         req.send();
792 }
793
794 function resultHandleCopyCounts(r) {
795         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
796 }
797
798
799 /* XXX Needs to understand Lasso copy counts... */
800 /* display the collected copy counts */
801 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
802         if(copy_counts == null || rec == null) return;
803
804         if (getLasso()) {
805                 var copy_counts_lasso = {
806                         transcendant : null,
807                         count : 0,
808                         unshadow : 0,
809                         available : 0,
810                         depth : -1,
811                         org_unit : getLasso()
812                 };
813
814                 for (var i in copy_counts) {
815                         copy_counts_lasso.transcendant = copy_counts[i].transcendant;
816                         copy_counts_lasso.count += parseInt(copy_counts[i].count);
817                         copy_counts_lasso.unshadow += parseInt(copy_counts[i].unshadow);
818                         copy_counts_lasso.available += parseInt(copy_counts[i].available);
819                 }
820
821                 copy_counts = [ copy_counts_lasso ];
822         }
823
824         var i = 0;
825         while(copy_counts[i] != null) {
826                 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
827                 if (cell) {
828                         var cts = copy_counts[i];
829                         cell.appendChild(text(cts.available + " / " + cts.count));
830
831                         if(isXUL()) {
832                                 /* here we style opac-invisible records for xul */
833
834                                 if( cts.depth == 0 ) {
835                                         if(cts.transcendant == null && cts.unshadow == 0) {
836                                                 _debug("found an opac-shadowed record: " + rec.doc_id());
837                                                 var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode; 
838                                                 if( cts.count == 0 ) 
839                                                         addCSSClass( row, 'no_copies' );
840                                                 else 
841                                                         addCSSClass( row, 'shadowed' );
842                                         }
843                                 }
844                         }
845                 }
846                 i++;
847         }
848 }
849
850