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() {
106 /* tell the user where the results are coming from */
107 var baseorg = findOrgUnit(getLocation());
108 var depth = getDepth();
109 var mydepth = findOrgDepth(baseorg);
110 if( findOrgDepth(baseorg) != depth ) {
111 var tmporg = baseorg;
112 while( mydepth > depth ) {
114 tmporg = findOrgUnit(tmporg.parent_ou());
116 unHideMe($('including_results_for'));
117 $('including_results_location').appendChild(text(tmporg.name()));
121 try{searchTimer.stop()}catch(e){}
123 //if( findCurrentPage() == MRESULT ) {
124 if( findCurrentPage() == MRESULT ||
126 (findCurrentPage() == RRESULT &&
128 getRtype() == RTYPE_TITLE ||
129 getRtype() == RTYPE_AUTHOR ||
130 getRtype() == RTYPE_SUBJECT ||
131 getRtype() == RTYPE_SERIES ||
132 getRtype() == RTYPE_KEYWORD
137 if(getHitCount() <= lowHitCount && getTerm())
138 runEvt('result', 'lowHits');
141 if(getHitCount() == 0) {
142 runEvt('result', 'zeroHits');
147 var pages = getHitCount() / getDisplayCount();
148 if(pages % 1) pages = parseInt(pages) + 1;
152 var cpage = (getOffset()/getDisplayCount()) + 1;
154 G.ui.result.current_page.appendChild(text(cpage));
155 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
157 $('current_page2').appendChild(text(cpage));
158 $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */
160 /* set the offsets */
161 var offsetEnd = getDisplayCount() + getOffset();
162 if( getDisplayCount() > (getHitCount() - getOffset()))
163 offsetEnd = getHitCount();
165 G.ui.result.offset_end.appendChild(text(offsetEnd));
166 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
168 $('offset_end2').appendChild(text(offsetEnd));
169 $('offset_start2').appendChild(text(getOffset() + 1));
171 G.ui.result.result_count.appendChild(text(getHitCount()));
172 unHideMe(G.ui.result.info);
174 $('result_count2').appendChild(text(getHitCount()));
175 unHideMe($('result_info_div2'));
178 function resultLowHits() {
180 unHideMe($('result_low_hits'));
181 if(getHitCount() > 0)
182 unHideMe($('result_low_hits_msg'));
185 for(var key in resultCompiledSearch.searches)
186 words.push(resultCompiledSearch.searches[key].term);
188 var sreq = new Request(CHECK_SPELL, words.join(' '));
189 sreq.callback(resultSuggestSpelling);
192 for(var key in resultCompiledSearch.searches) {
193 var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);
194 areq.callback(resultLowHitXRef);
198 if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {
200 a[PARAM_FORM] = "all";
201 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
202 unHideMe($('low_hits_remove_format'));
205 resultSuggestSearchClass();
207 if(getTerm()) resultExpandSearch(); /* advanced search */
211 var lowHitsXRefLinkParent;
212 function resultLowHitXRef(r) {
213 if(!lowHitsXRefLink){
214 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
215 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
217 var res = r.getResultObject();
219 arr.concat(res.also);
220 if(arr && arr.length > 0) {
221 unHideMe($('low_hits_cross_ref'));
224 while( word = arr.shift() ) {
227 a[PARAM_TERM] = word;
228 var template = lowHitsXRefLink.cloneNode(true);
229 template.setAttribute('href',buildOPACLink(a));
230 template.appendChild(text(word));
231 lowHitsXRefLinkParent.appendChild(template);
232 lowHitsXRefLinkParent.appendChild(text(' '));
237 function resultZeroHits() {
239 unHideMe($('result_low_hits'));
240 unHideMe($('result_zero_hits_msg'));
241 //if(getTerm()) resultExpandSearch(); /* advanced search */
244 function resultExpandSearch() {
245 var top = findOrgDepth(globalOrgTree);
246 if(getDepth() == top) return;
247 unHideMe($('low_hits_expand_range'));
248 var par = $('low_hits_expand_link').parentNode;
249 var template = par.removeChild($('low_hits_expand_link'));
251 var bottom = getDepth();
252 while( top < bottom ) {
254 a[PARAM_DEPTH] = top;
255 var temp = template.cloneNode(true);
256 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
257 temp.setAttribute('href',buildOPACLink(a));
258 par.appendChild(temp);
263 function resultSuggestSearchClass() {
264 var stype = getStype();
265 if(stype == STYPE_KEYWORD) return;
267 unHideMe($('low_hits_search_type'));
268 if(stype != STYPE_TITLE) {
269 ref = $('low_hits_title_search');
271 a[PARAM_STYPE] = STYPE_TITLE;
272 ref.setAttribute('href',buildOPACLink(a));
274 if(stype != STYPE_AUTHOR) {
275 ref = $('low_hits_author_search');
277 a[PARAM_STYPE] = STYPE_AUTHOR;
278 ref.setAttribute('href',buildOPACLink(a));
280 if(stype != STYPE_SUBJECT) {
281 ref = $('low_hits_subject_search');
283 a[PARAM_STYPE] = STYPE_SUBJECT;
284 ref.setAttribute('href',buildOPACLink(a));
286 if(stype != STYPE_KEYWORD) {
287 ref = $('low_hits_keyword_search');
289 a[PARAM_STYPE] = STYPE_KEYWORD;
290 ref.setAttribute('href',buildOPACLink(a));
292 if(stype != STYPE_SERIES) {
293 ref = $('low_hits_series_search');
295 a[PARAM_STYPE] = STYPE_SERIES;
296 ref.setAttribute('href',buildOPACLink(a));
300 function resultSuggestSpelling(r) {
301 var res = r.getResultObject();
302 var phrase = getTerm();
303 var words = phrase.split(/ /);
307 for( var w = 0; w < words.length; w++ ) {
309 var blob = grep(res, function(i){return (i.word == word);});
310 if( blob ) blob = blob[0];
312 if( blob.word == word ) {
313 if( blob.suggestions && blob.suggestions[0] ) {
314 newterm += " " + blob.suggestions[0];
315 unHideMe($('did_you_mean'));
317 newterm += " " + word;
323 arg[PARAM_TERM] = newterm;
324 $('spell_check_link').setAttribute('href', buildOPACLink(arg));
325 $('spell_check_link').appendChild(text(newterm));
329 function resultPaginate() {
332 if( !( ((o) + getDisplayCount()) >= getHitCount()) ) {
335 args[PARAM_OFFSET] = o + getDisplayCount();
336 args[PARAM_SORT] = SORT;
337 args[PARAM_SORT_DIR] = SORT_DIR;
338 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
340 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
341 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
343 $('next_link2').setAttribute("href", buildOPACLink(args));
344 addCSSClass($('next_link2'), config.css.result.nav_active);
346 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
348 /* when hit count is divisible by display count, we have to adjust */
349 if( getHitCount() % getDisplayCount() == 0 )
350 args[PARAM_OFFSET] -= getDisplayCount();
353 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
354 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
356 $('end_link2').setAttribute("href", buildOPACLink(args));
357 addCSSClass($('end_link2'), config.css.result.nav_active);
364 args[PARAM_SORT] = SORT;
365 args[PARAM_SORT_DIR] = SORT_DIR;
366 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
368 args[PARAM_OFFSET] = o - getDisplayCount();
369 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
370 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
372 $('prev_link2').setAttribute( "href", buildOPACLink(args));
373 addCSSClass($('prev_link2'), config.css.result.nav_active);
375 args[PARAM_OFFSET] = 0;
376 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
377 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
379 $('search_home_link2').setAttribute( "href", buildOPACLink(args));
380 addCSSClass($('search_home_link2'), config.css.result.nav_active);
383 if(getDisplayCount() < getHitCount()) {
384 unHideMe($('start_end_links_span'));
385 unHideMe($('start_end_links_span2'));
389 try{searchTimer.stop()}catch(e){}
392 function buildunAPISpan (span, type, id) {
396 addCSSClass(span,'unapi-id');
400 'tag:' + cgi.server_name + ',' +
402 ':' + type + '/' + id
406 function unhideGoogleBooks (data) {
407 for ( var i in data ) {
408 //if (data[i].preview == 'noview') continue;
410 var gbspan = $n(document.documentElement, 'googleBooks-' + i);
411 var gba = $n(gbspan, "googleBooks-link");
417 removeCSSClass( gbspan, 'hide_me' );
421 /* display the record info in the record display table 'pos' is the
422 zero based position the record should have in the display table */
423 function resultDisplayRecord(rec, pos, is_mr) {
425 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
427 recordsCache.push(rec);
429 var r = table.rows[pos + 1];
430 var currentISBN = cleanISBN(rec.isbn());
433 var gbspan = $n(r, "googleBooks");
437 gbspan.getAttribute('name') + '-' + currentISBN
440 if (isbnList) isbnList += ', ';
441 isbnList += currentISBN;
447 var rank = parseFloat(ranks[pos + getOffset()]);
448 rank = parseInt( rank * 100 );
449 var relspan = $n(r, "relevancy_span");
450 relspan.appendChild(text(rank));
451 unHideMe(relspan.parentNode);
455 var pic = $n(r, config.names.result.item_jacket);
456 pic.setAttribute("src", buildISBNSrc(currentISBN));
458 var title_link = $n(r, config.names.result.item_title);
459 var author_link = $n(r, config.names.result.item_author);
462 var onlyrec = onlyrecord[ getOffset() + pos ];
464 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);
468 args[PARAM_OFFSET] = 0;
469 args[PARAM_RID] = onlyrec;
470 args[PARAM_MRID] = rec.doc_id();
471 pic.parentNode.setAttribute("href", buildOPACLink(args));
472 title_link.setAttribute("href", buildOPACLink(args));
473 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
476 buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());
478 buildTitleLink(rec, title_link);
481 args[PARAM_OFFSET] = 0;
482 args[PARAM_MRID] = rec.doc_id();
483 pic.parentNode.setAttribute("href", buildOPACLink(args));
487 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
489 buildTitleDetailLink(rec, title_link);
492 args[PARAM_OFFSET] = 0;
493 args[PARAM_RID] = rec.doc_id();
494 pic.parentNode.setAttribute("href", buildOPACLink(args));
496 unHideMe($n(r,'place_hold_span'));
497 $n(r,'place_hold_link').setAttribute(
498 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');
501 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
505 if(!isNull(rec.edition())) {
506 unHideMe( $n(r, "result_table_extra_span"));
507 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
509 if(!isNull(rec.pubdate())) {
510 unHideMe( $n(r, "result_table_extra_span"));
511 unHideMe($n(r, "result_table_pub_span"));
512 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
514 if(!isNull(rec.publisher()) ) {
515 unHideMe( $n(r, "result_table_extra_span"));
516 unHideMe($n(r, "result_table_pub_span"));
517 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
520 if(!isNull(rec.physical_description()) ) {
521 unHideMe( $n(r, "result_table_extra_span"));
522 var t = " " + rec.physical_description();
523 //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));
524 $n(r, "result_table_phys_span").appendChild( text(t));
529 resultBuildFormatIcons( r, rec, is_mr );
533 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
536 if(resultPageIsDone()) {
537 runEvt('result', 'allRecordsReceived', recordsCache);
542 function _resultFindRec(id) {
543 for( var i = 0; i != recordsCache.length; i++ ) {
544 var rec = recordsCache[i];
545 if( rec && rec.doc_id() == id )
552 function resultBuildFormatIcons( row, rec, is_mr ) {
554 var ress = rec.types_of_resource();
556 for( var i in ress ) {
561 var link = $n(row, res + "_link");
563 var img = link.getElementsByTagName("img")[0];
564 removeCSSClass( img, config.css.dim );
568 if( f == modsFormatToMARC(res) )
569 addCSSClass( img, "dim2_border");
573 args[PARAM_OFFSET] = 0;
577 args[PARAM_TFORM] = modsFormatToMARC(res);
578 args[PARAM_MRID] = rec.doc_id();
582 args[PARAM_RID] = rec.doc_id();
585 link.setAttribute("href", buildOPACLink(args));
590 function fetchGoogleBooks () {
591 if (isbnList && googleBooks) {
592 var scriptElement = document.createElement("script");
593 scriptElement.setAttribute("id", "jsonScript");
594 scriptElement.setAttribute("src",
595 "http://books.google.com/books?bibkeys=" +
596 escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooks");
597 scriptElement.setAttribute("type", "text/javascript");
598 // make the request to Google Book Search
599 document.documentElement.firstChild.appendChild(scriptElement);
603 function resultPageIsDone(pos) {
605 return (recordsHandled == getDisplayCount()
606 || recordsHandled + getOffset() == getHitCount());
609 var resultCCHeaderApplied = false;
611 /* -------------------------------------------------------------------- */
612 /* dynamically add the copy count rows based on the org type 'countsrow'
613 is the row into which we will add TD's to hold the copy counts
614 This code generates copy count cells with an id of
615 'copy_count_cell_<depth>_<pagePosition>' */
616 function resultAddCopyCounts(rec, pagePosition) {
618 var r = table.rows[pagePosition + 1];
619 var countsrow = $n(r, config.names.result.counts_row );
620 var ccell = $n(countsrow, config.names.result.count_cell);
622 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
624 var type = findOrgType(node.ou_type());
625 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
626 ccell.title = type.opac_label();
627 //addCSSClass(ccell, config.css.result.cc_cell_even);
629 var lastcell = ccell;
630 var lastheadcell = null;
633 var ccheadcell = null;
634 if(!resultCCHeaderApplied) {
635 ccrow = $('result_thead_row');
636 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
637 var t = ccheadcell.cloneNode(true);
639 t.appendChild(text(type.opac_label()));
640 ccrow.appendChild(t);
641 resultCCHeaderApplied = true;
647 var d = findOrgDepth(nodes[1]);
648 var d2 = findOrgDepth(nodes[nodes.length -1]);
650 for( var i = d; i <= d2 ; i++ ) {
652 ccell = ccell.cloneNode(true);
654 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
655 //else addCSSClass(ccell, "copy_count_cell_even");
657 var node = nodes[x++];
658 var type = findOrgType(node.ou_type());
660 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
661 ccell.title = type.opac_label();
662 countsrow.insertBefore(ccell, lastcell);
666 var t = ccheadcell.cloneNode(true);
667 t.appendChild(text(type.opac_label()));
668 ccrow.insertBefore(t, lastheadcell);
674 unHideMe($("search_info_table"));
677 /* collect copy counts for a record using method 'methodName' */
678 function resultCollectCopyCounts(rec, pagePosition, methodName) {
679 if(rec == null || rec.doc_id() == null) return;
681 var loc = getLasso();
683 else loc= getLocation();
685 var req = new Request(methodName, loc, rec.doc_id(), getForm() );
686 req.request.userdata = [ rec, pagePosition ];
687 req.callback(resultHandleCopyCounts);
691 function resultHandleCopyCounts(r) {
692 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
696 /* display the collected copy counts */
697 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
698 if(copy_counts == null || rec == null) return;
700 while(copy_counts[i] != null) {
701 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
702 var cts = copy_counts[i];
703 cell.appendChild(text(cts.available + " / " + cts.count));
706 /* here we style opac-invisible records for xul */
708 if( cts.depth == 0 ) {
709 if(!cts.transcendant && !cts.unshadow) {
710 _debug("found an opac-shadowed record: " + rec.doc_id());
711 var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode;
713 addCSSClass( row, 'no_copies' );
715 addCSSClass( row, 'shadowed' );