2 var recordsHandled = 0;
6 var googleBooks = true;
8 var resultFetchAllRecords = false;
9 var resultCompiledSearch = null;
11 /* set up the event handlers */
12 if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {
13 G.evt.result.hitCountReceived.push(resultSetHitInfo);
14 G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
15 G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
16 G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects,
17 resultDrawAuthors, resultDrawSeries, function(){unHideMe($('result_info_2'))},
20 attachEvt('result','lowHits',resultLowHits);
21 attachEvt('result','zeroHits',resultZeroHits);
22 attachEvt( "common", "locationUpdated", resultSBSubmit );
23 /* do this after we have ID's so the rank for mr pages will be correct */
24 attachEvt("result", "preCollectRecords", resultPaginate);
27 function resultSBSubmit(){searchBarSubmit();}
29 /* returns the last 'index' postion ocurring in this page */
30 function resultFinalPageIndex() {
31 if(getHitCount() < (getOffset() + getDisplayCount()))
32 return getHitCount() - 1;
33 return getOffset() + getDisplayCount() - 1;
39 /* generic search method */
40 function resultCollectSearchIds( type, method, handler ) {
42 var sort = (getSort() == SORT_TYPE_REL) ? null : getSort();
43 var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null;
50 var form = parseForm(getForm());
51 item_type = form.item_type;
52 item_form = form.item_form;
55 item_type = (getItemType()) ? getItemType().split(/,/) : null;
56 item_form = (getItemForm()) ? getItemForm().split(/,/) : null;
59 var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount();
61 if( getOffset() > 0 ) {
62 if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() )
63 limit = getHitCount() - getOffset();
66 var lasso = getLasso();
68 if (lasso) args.org_unit = -lasso;
69 else args.org_unit = getLocation();
71 args.depth = getDepth();
73 args.offset = getOffset();
74 args.visibility_limit = 3000;
75 args.default_class = getStype();
77 if(sort) args.sort = sort;
78 if(sortdir) args.sort_dir = sortdir;
79 if(item_type) args.item_type = item_type;
80 if(item_form) args.item_form = item_form;
81 if(getAvail()) args.available = 1;
84 if(getAudience()) args.audience = getAudience().split(/,/);
85 if(getLitForm()) args.lit_form = getLitForm().split(/,/);
86 if(getLanguage()) args.language = getLanguage().split(/,/);
87 if(getBibLevel()) args.bib_level = getBibLevel().split(/,/);
89 _debug('Search args: ' + js2JSON(args));
90 _debug('Raw query: ' + getTerm());
92 var req = new Request(method, args, getTerm(), 1);
93 req.callback(handler);
101 /* set the search result info, number of hits, which results we're
102 displaying, links to the next/prev pages, etc. */
103 function resultSetHitInfo() {
105 var lasso = getLasso();
107 /* tell the user where the results are coming from */
108 var baseorg = findOrgUnit(getLocation());
109 var depth = getDepth();
110 var mydepth = findOrgDepth(baseorg);
111 if( findOrgDepth(baseorg) != depth ) {
112 var tmporg = baseorg;
113 while( mydepth > depth ) {
115 tmporg = findOrgUnit(tmporg.parent_ou());
117 unHideMe($('including_results_for'));
118 $('including_results_location').appendChild(text(tmporg.name()));
123 try{searchTimer.stop()}catch(e){}
125 //if( findCurrentPage() == MRESULT ) {
126 if( findCurrentPage() == MRESULT ||
128 (findCurrentPage() == RRESULT &&
130 getRtype() == RTYPE_TITLE ||
131 getRtype() == RTYPE_AUTHOR ||
132 getRtype() == RTYPE_SUBJECT ||
133 getRtype() == RTYPE_SERIES ||
134 getRtype() == RTYPE_KEYWORD
139 if(getHitCount() <= lowHitCount && getTerm())
140 runEvt('result', 'lowHits');
143 if(getHitCount() == 0) {
144 runEvt('result', 'zeroHits');
149 var pages = getHitCount() / getDisplayCount();
150 if(pages % 1) pages = parseInt(pages) + 1;
154 var cpage = (getOffset()/getDisplayCount()) + 1;
156 G.ui.result.current_page.appendChild(text(cpage));
157 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
159 $('current_page2').appendChild(text(cpage));
160 $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */
162 /* set the offsets */
163 var offsetEnd = getDisplayCount() + getOffset();
164 if( getDisplayCount() > (getHitCount() - getOffset()))
165 offsetEnd = getHitCount();
167 G.ui.result.offset_end.appendChild(text(offsetEnd));
168 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
170 $('offset_end2').appendChild(text(offsetEnd));
171 $('offset_start2').appendChild(text(getOffset() + 1));
173 G.ui.result.result_count.appendChild(text(getHitCount()));
174 unHideMe(G.ui.result.info);
176 $('result_count2').appendChild(text(getHitCount()));
177 unHideMe($('result_info_div2'));
180 function resultLowHits() {
182 unHideMe($('result_low_hits'));
183 if(getHitCount() > 0)
184 unHideMe($('result_low_hits_msg'));
187 for(var key in resultCompiledSearch.searches)
188 words.push(resultCompiledSearch.searches[key].term);
190 var sreq = new Request(CHECK_SPELL, words.join(' '));
191 sreq.callback(resultSuggestSpelling);
194 for(var key in resultCompiledSearch.searches) {
195 var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);
196 areq.callback(resultLowHitXRef);
200 if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {
202 a[PARAM_FORM] = "all";
203 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
204 unHideMe($('low_hits_remove_format'));
207 resultSuggestSearchClass();
209 if(getTerm()) resultExpandSearch(); /* advanced search */
213 var lowHitsXRefLinkParent;
214 function resultLowHitXRef(r) {
215 if(!lowHitsXRefLink){
216 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
217 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
219 var res = r.getResultObject();
221 arr.concat(res.also);
222 if(arr && arr.length > 0) {
223 unHideMe($('low_hits_cross_ref'));
226 while( word = arr.shift() ) {
229 a[PARAM_TERM] = word;
230 var template = lowHitsXRefLink.cloneNode(true);
231 template.setAttribute('href',buildOPACLink(a));
232 template.appendChild(text(word));
233 lowHitsXRefLinkParent.appendChild(template);
234 lowHitsXRefLinkParent.appendChild(text(' '));
239 function resultZeroHits() {
241 unHideMe($('result_low_hits'));
242 unHideMe($('result_zero_hits_msg'));
243 //if(getTerm()) resultExpandSearch(); /* advanced search */
246 function resultExpandSearch() {
247 var top = findOrgDepth(globalOrgTree);
248 if(getDepth() == top) return;
249 unHideMe($('low_hits_expand_range'));
250 var par = $('low_hits_expand_link').parentNode;
251 var template = par.removeChild($('low_hits_expand_link'));
253 var bottom = getDepth();
254 while( top < bottom ) {
256 a[PARAM_DEPTH] = top;
257 var temp = template.cloneNode(true);
258 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
259 temp.setAttribute('href',buildOPACLink(a));
260 par.appendChild(temp);
265 function resultSuggestSearchClass() {
266 var stype = getStype();
267 if(stype == STYPE_KEYWORD) return;
269 unHideMe($('low_hits_search_type'));
270 if(stype != STYPE_TITLE) {
271 ref = $('low_hits_title_search');
273 a[PARAM_STYPE] = STYPE_TITLE;
274 ref.setAttribute('href',buildOPACLink(a));
276 if(stype != STYPE_AUTHOR) {
277 ref = $('low_hits_author_search');
279 a[PARAM_STYPE] = STYPE_AUTHOR;
280 ref.setAttribute('href',buildOPACLink(a));
282 if(stype != STYPE_SUBJECT) {
283 ref = $('low_hits_subject_search');
285 a[PARAM_STYPE] = STYPE_SUBJECT;
286 ref.setAttribute('href',buildOPACLink(a));
288 if(stype != STYPE_KEYWORD) {
289 ref = $('low_hits_keyword_search');
291 a[PARAM_STYPE] = STYPE_KEYWORD;
292 ref.setAttribute('href',buildOPACLink(a));
294 if(stype != STYPE_SERIES) {
295 ref = $('low_hits_series_search');
297 a[PARAM_STYPE] = STYPE_SERIES;
298 ref.setAttribute('href',buildOPACLink(a));
302 function resultSuggestSpelling(r) {
303 var res = r.getResultObject();
304 var phrase = getTerm();
305 var words = phrase.split(/ /);
309 for( var w = 0; w < words.length; w++ ) {
311 var blob = grep(res, function(i){return (i.word == word);});
312 if( blob ) blob = blob[0];
314 if( blob.word == word ) {
315 if( blob.suggestions && blob.suggestions[0] ) {
316 newterm += " " + blob.suggestions[0];
317 unHideMe($('did_you_mean'));
319 newterm += " " + word;
325 arg[PARAM_TERM] = newterm;
326 $('spell_check_link').setAttribute('href', buildOPACLink(arg));
327 $('spell_check_link').appendChild(text(newterm));
331 function resultPaginate() {
334 if( !( ((o) + getDisplayCount()) >= getHitCount()) ) {
337 args[PARAM_OFFSET] = o + getDisplayCount();
338 args[PARAM_SORT] = SORT;
339 args[PARAM_SORT_DIR] = SORT_DIR;
340 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
342 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
343 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
345 $('next_link2').setAttribute("href", buildOPACLink(args));
346 addCSSClass($('next_link2'), config.css.result.nav_active);
348 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
350 /* when hit count is divisible by display count, we have to adjust */
351 if( getHitCount() % getDisplayCount() == 0 )
352 args[PARAM_OFFSET] -= getDisplayCount();
355 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
356 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
358 $('end_link2').setAttribute("href", buildOPACLink(args));
359 addCSSClass($('end_link2'), config.css.result.nav_active);
366 args[PARAM_SORT] = SORT;
367 args[PARAM_SORT_DIR] = SORT_DIR;
368 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
370 args[PARAM_OFFSET] = o - getDisplayCount();
371 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
372 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
374 $('prev_link2').setAttribute( "href", buildOPACLink(args));
375 addCSSClass($('prev_link2'), config.css.result.nav_active);
377 args[PARAM_OFFSET] = 0;
378 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
379 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
381 $('search_home_link2').setAttribute( "href", buildOPACLink(args));
382 addCSSClass($('search_home_link2'), config.css.result.nav_active);
385 if(getDisplayCount() < getHitCount()) {
386 unHideMe($('start_end_links_span'));
387 unHideMe($('start_end_links_span2'));
391 try{searchTimer.stop()}catch(e){}
394 function buildunAPISpan (span, type, id) {
398 addCSSClass(span,'unapi-id');
402 'tag:' + cgi.server_name + ',' +
404 ':' + type + '/' + id
408 function unhideGoogleBooks (data) {
409 for ( var i in data ) {
410 //if (data[i].preview == 'noview') continue;
412 var gbspan = $n(document.documentElement, 'googleBooks-' + i);
413 var gba = $n(gbspan, "googleBooks-link");
419 removeCSSClass( gbspan, 'hide_me' );
423 /* display the record info in the record display table 'pos' is the
424 zero based position the record should have in the display table */
425 function resultDisplayRecord(rec, pos, is_mr) {
427 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
429 recordsCache.push(rec);
431 var r = table.rows[pos + 1];
432 var currentISBN = cleanISBN(rec.isbn());
435 var gbspan = $n(r, "googleBooks");
439 gbspan.getAttribute('name') + '-' + currentISBN
442 if (isbnList) isbnList += ', ';
443 isbnList += currentISBN;
449 var rank = parseFloat(ranks[pos + getOffset()]);
450 rank = parseInt( rank * 100 );
451 var relspan = $n(r, "relevancy_span");
452 relspan.appendChild(text(rank));
453 unHideMe(relspan.parentNode);
457 var pic = $n(r, config.names.result.item_jacket);
458 pic.setAttribute("src", buildISBNSrc(currentISBN));
460 var title_link = $n(r, config.names.result.item_title);
461 var author_link = $n(r, config.names.result.item_author);
464 var onlyrec = onlyrecord[ getOffset() + pos ];
466 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);
470 args[PARAM_OFFSET] = 0;
471 args[PARAM_RID] = onlyrec;
472 args[PARAM_MRID] = rec.doc_id();
473 pic.parentNode.setAttribute("href", buildOPACLink(args));
474 title_link.setAttribute("href", buildOPACLink(args));
475 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
478 buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());
480 buildTitleLink(rec, title_link);
483 args[PARAM_OFFSET] = 0;
484 args[PARAM_MRID] = rec.doc_id();
485 pic.parentNode.setAttribute("href", buildOPACLink(args));
489 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
491 buildTitleDetailLink(rec, title_link);
494 args[PARAM_OFFSET] = 0;
495 args[PARAM_RID] = rec.doc_id();
496 pic.parentNode.setAttribute("href", buildOPACLink(args));
498 unHideMe($n(r,'place_hold_span'));
499 $n(r,'place_hold_link').setAttribute(
500 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');
503 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
507 if(!isNull(rec.edition())) {
508 unHideMe( $n(r, "result_table_extra_span"));
509 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
511 if(!isNull(rec.pubdate())) {
512 unHideMe( $n(r, "result_table_extra_span"));
513 unHideMe($n(r, "result_table_pub_span"));
514 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
516 if(!isNull(rec.publisher()) ) {
517 unHideMe( $n(r, "result_table_extra_span"));
518 unHideMe($n(r, "result_table_pub_span"));
519 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
522 if(!isNull(rec.physical_description()) ) {
523 unHideMe( $n(r, "result_table_extra_span"));
524 var t = " " + rec.physical_description();
525 //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));
526 $n(r, "result_table_phys_span").appendChild( text(t));
531 resultBuildFormatIcons( r, rec, is_mr );
535 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
538 if(resultPageIsDone()) {
539 runEvt('result', 'allRecordsReceived', recordsCache);
544 function _resultFindRec(id) {
545 for( var i = 0; i != recordsCache.length; i++ ) {
546 var rec = recordsCache[i];
547 if( rec && rec.doc_id() == id )
554 function resultBuildFormatIcons( row, rec, is_mr ) {
556 var ress = rec.types_of_resource();
558 for( var i in ress ) {
563 var link = $n(row, res + "_link");
565 var img = link.getElementsByTagName("img")[0];
566 removeCSSClass( img, config.css.dim );
570 if( f == modsFormatToMARC(res) )
571 addCSSClass( img, "dim2_border");
575 args[PARAM_OFFSET] = 0;
579 args[PARAM_TFORM] = modsFormatToMARC(res);
580 args[PARAM_MRID] = rec.doc_id();
584 args[PARAM_RID] = rec.doc_id();
587 link.setAttribute("href", buildOPACLink(args));
592 function fetchGoogleBooks () {
593 if (isbnList && googleBooks) {
594 var scriptElement = document.createElement("script");
595 scriptElement.setAttribute("id", "jsonScript");
596 scriptElement.setAttribute("src",
597 "http://books.google.com/books?bibkeys=" +
598 escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooks");
599 scriptElement.setAttribute("type", "text/javascript");
600 // make the request to Google Book Search
601 document.documentElement.firstChild.appendChild(scriptElement);
605 function resultPageIsDone(pos) {
607 return (recordsHandled == getDisplayCount()
608 || recordsHandled + getOffset() == getHitCount());
611 var resultCCHeaderApplied = false;
613 /* -------------------------------------------------------------------- */
614 /* dynamically add the copy count rows based on the org type 'countsrow'
615 is the row into which we will add TD's to hold the copy counts
616 This code generates copy count cells with an id of
617 'copy_count_cell_<depth>_<pagePosition>' */
618 function resultAddCopyCounts(rec, pagePosition) {
620 var r = table.rows[pagePosition + 1];
621 var countsrow = $n(r, config.names.result.counts_row );
622 var ccell = $n(countsrow, config.names.result.count_cell);
624 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
626 var type = findOrgType(node.ou_type());
627 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
628 ccell.title = type.opac_label();
629 //addCSSClass(ccell, config.css.result.cc_cell_even);
631 var lastcell = ccell;
632 var lastheadcell = null;
635 var ccheadcell = null;
636 if(!resultCCHeaderApplied) {
637 ccrow = $('result_thead_row');
638 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
639 var t = ccheadcell.cloneNode(true);
641 t.appendChild(text(type.opac_label()));
642 ccrow.appendChild(t);
643 resultCCHeaderApplied = true;
649 var d = findOrgDepth(nodes[1]);
650 var d2 = findOrgDepth(nodes[nodes.length -1]);
652 for( var i = d; i <= d2 ; i++ ) {
654 ccell = ccell.cloneNode(true);
656 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
657 //else addCSSClass(ccell, "copy_count_cell_even");
659 var node = nodes[x++];
660 var type = findOrgType(node.ou_type());
662 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
663 ccell.title = type.opac_label();
664 countsrow.insertBefore(ccell, lastcell);
668 var t = ccheadcell.cloneNode(true);
669 t.appendChild(text(type.opac_label()));
670 ccrow.insertBefore(t, lastheadcell);
676 unHideMe($("search_info_table"));
679 /* collect copy counts for a record using method 'methodName' */
680 function resultCollectCopyCounts(rec, pagePosition, methodName) {
681 if(rec == null || rec.doc_id() == null) return;
683 var loc = getLasso();
685 else loc= getLocation();
687 var req = new Request(methodName, loc, rec.doc_id(), getForm() );
688 req.request.userdata = [ rec, pagePosition ];
689 req.callback(resultHandleCopyCounts);
693 function resultHandleCopyCounts(r) {
694 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
698 /* XXX Needs to understand Lasso copy counts... */
699 /* display the collected copy counts */
700 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
701 if(copy_counts == null || rec == null) return;
703 while(copy_counts[i] != null) {
704 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
705 var cts = copy_counts[i];
706 cell.appendChild(text(cts.available + " / " + cts.count));
709 /* here we style opac-invisible records for xul */
711 if( cts.depth == 0 ) {
712 if(!cts.transcendant && !cts.unshadow) {
713 _debug("found an opac-shadowed record: " + rec.doc_id());
714 var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode;
716 addCSSClass( row, 'no_copies' );
718 addCSSClass( row, 'shadowed' );