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 args.org_unit = getLocation();
67 args.depth = getDepth();
69 args.offset = getOffset();
70 args.visibility_limit = 3000;
71 args.default_class = getStype();
73 if(sort) args.sort = sort;
74 if(sortdir) args.sort_dir = sortdir;
75 if(item_type) args.item_type = item_type;
76 if(item_form) args.item_form = item_form;
77 if(getAvail()) args.available = 1;
80 if(getAudience()) args.audience = getAudience().split(/,/);
81 if(getLitForm()) args.lit_form = getLitForm().split(/,/);
82 if(getLanguage()) args.language = getLanguage().split(/,/);
84 _debug('Search args: ' + js2JSON(args));
85 _debug('Raw query: ' + getTerm());
87 var req = new Request(method, args, getTerm(), 1);
88 req.callback(handler);
96 /* set the search result info, number of hits, which results we're
97 displaying, links to the next/prev pages, etc. */
98 function resultSetHitInfo() {
101 /* tell the user where the results are coming from */
102 var baseorg = findOrgUnit(getLocation());
103 var depth = getDepth();
104 var mydepth = findOrgDepth(baseorg);
105 if( findOrgDepth(baseorg) != depth ) {
106 var tmporg = baseorg;
107 while( mydepth > depth ) {
109 tmporg = findOrgUnit(tmporg.parent_ou());
111 unHideMe($('including_results_for'));
112 $('including_results_location').appendChild(text(tmporg.name()));
116 try{searchTimer.stop()}catch(e){}
118 //if( findCurrentPage() == MRESULT ) {
119 if( findCurrentPage() == MRESULT ||
121 (findCurrentPage() == RRESULT &&
123 getRtype() == RTYPE_TITLE ||
124 getRtype() == RTYPE_AUTHOR ||
125 getRtype() == RTYPE_SUBJECT ||
126 getRtype() == RTYPE_SERIES ||
127 getRtype() == RTYPE_KEYWORD
132 if(getHitCount() <= lowHitCount && getTerm())
133 runEvt('result', 'lowHits');
136 if(getHitCount() == 0) {
137 runEvt('result', 'zeroHits');
142 var pages = getHitCount() / getDisplayCount();
143 if(pages % 1) pages = parseInt(pages) + 1;
147 var cpage = (getOffset()/getDisplayCount()) + 1;
149 G.ui.result.current_page.appendChild(text(cpage));
150 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
152 $('current_page2').appendChild(text(cpage));
153 $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */
155 /* set the offsets */
156 var offsetEnd = getDisplayCount() + getOffset();
157 if( getDisplayCount() > (getHitCount() - getOffset()))
158 offsetEnd = getHitCount();
160 G.ui.result.offset_end.appendChild(text(offsetEnd));
161 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
163 $('offset_end2').appendChild(text(offsetEnd));
164 $('offset_start2').appendChild(text(getOffset() + 1));
166 G.ui.result.result_count.appendChild(text(getHitCount()));
167 unHideMe(G.ui.result.info);
169 $('result_count2').appendChild(text(getHitCount()));
170 unHideMe($('result_info_div2'));
173 function resultLowHits() {
175 unHideMe($('result_low_hits'));
176 if(getHitCount() > 0)
177 unHideMe($('result_low_hits_msg'));
180 for(var key in resultCompiledSearch.searches)
181 words.push(resultCompiledSearch.searches[key].term);
183 var sreq = new Request(CHECK_SPELL, words.join(' '));
184 sreq.callback(resultSuggestSpelling);
187 for(var key in resultCompiledSearch.searches) {
188 var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);
189 areq.callback(resultLowHitXRef);
193 if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {
195 a[PARAM_FORM] = "all";
196 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
197 unHideMe($('low_hits_remove_format'));
200 resultSuggestSearchClass();
202 if(getTerm()) resultExpandSearch(); /* advanced search */
206 var lowHitsXRefLinkParent;
207 function resultLowHitXRef(r) {
208 if(!lowHitsXRefLink){
209 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
210 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
212 var res = r.getResultObject();
214 arr.concat(res.also);
215 if(arr && arr.length > 0) {
216 unHideMe($('low_hits_cross_ref'));
219 while( word = arr.shift() ) {
222 a[PARAM_TERM] = word;
223 var template = lowHitsXRefLink.cloneNode(true);
224 template.setAttribute('href',buildOPACLink(a));
225 template.appendChild(text(word));
226 lowHitsXRefLinkParent.appendChild(template);
227 lowHitsXRefLinkParent.appendChild(text(' '));
232 function resultZeroHits() {
234 unHideMe($('result_low_hits'));
235 unHideMe($('result_zero_hits_msg'));
236 //if(getTerm()) resultExpandSearch(); /* advanced search */
239 function resultExpandSearch() {
240 var top = findOrgDepth(globalOrgTree);
241 if(getDepth() == top) return;
242 unHideMe($('low_hits_expand_range'));
243 var par = $('low_hits_expand_link').parentNode;
244 var template = par.removeChild($('low_hits_expand_link'));
246 var bottom = getDepth();
247 while( top < bottom ) {
249 a[PARAM_DEPTH] = top;
250 var temp = template.cloneNode(true);
251 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
252 temp.setAttribute('href',buildOPACLink(a));
253 par.appendChild(temp);
258 function resultSuggestSearchClass() {
259 var stype = getStype();
260 if(stype == STYPE_KEYWORD) return;
262 unHideMe($('low_hits_search_type'));
263 if(stype != STYPE_TITLE) {
264 ref = $('low_hits_title_search');
266 a[PARAM_STYPE] = STYPE_TITLE;
267 ref.setAttribute('href',buildOPACLink(a));
269 if(stype != STYPE_AUTHOR) {
270 ref = $('low_hits_author_search');
272 a[PARAM_STYPE] = STYPE_AUTHOR;
273 ref.setAttribute('href',buildOPACLink(a));
275 if(stype != STYPE_SUBJECT) {
276 ref = $('low_hits_subject_search');
278 a[PARAM_STYPE] = STYPE_SUBJECT;
279 ref.setAttribute('href',buildOPACLink(a));
281 if(stype != STYPE_KEYWORD) {
282 ref = $('low_hits_keyword_search');
284 a[PARAM_STYPE] = STYPE_KEYWORD;
285 ref.setAttribute('href',buildOPACLink(a));
287 if(stype != STYPE_SERIES) {
288 ref = $('low_hits_series_search');
290 a[PARAM_STYPE] = STYPE_SERIES;
291 ref.setAttribute('href',buildOPACLink(a));
295 function resultSuggestSpelling(r) {
296 var res = r.getResultObject();
297 var phrase = getTerm();
298 var words = phrase.split(/ /);
302 for( var w = 0; w < words.length; w++ ) {
304 var blob = grep(res, function(i){return (i.word == word);});
305 if( blob ) blob = blob[0];
307 if( blob.word == word ) {
308 if( blob.suggestions && blob.suggestions[0] ) {
309 newterm += " " + blob.suggestions[0];
310 unHideMe($('did_you_mean'));
312 newterm += " " + word;
318 arg[PARAM_TERM] = newterm;
319 $('spell_check_link').setAttribute('href', buildOPACLink(arg));
320 $('spell_check_link').appendChild(text(newterm));
324 function resultPaginate() {
327 if( !( ((o) + getDisplayCount()) >= getHitCount()) ) {
330 args[PARAM_OFFSET] = o + getDisplayCount();
331 args[PARAM_SORT] = SORT;
332 args[PARAM_SORT_DIR] = SORT_DIR;
333 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
335 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
336 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
338 $('next_link2').setAttribute("href", buildOPACLink(args));
339 addCSSClass($('next_link2'), config.css.result.nav_active);
341 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
343 /* when hit count is divisible by display count, we have to adjust */
344 if( getHitCount() % getDisplayCount() == 0 )
345 args[PARAM_OFFSET] -= getDisplayCount();
348 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
349 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
351 $('end_link2').setAttribute("href", buildOPACLink(args));
352 addCSSClass($('end_link2'), config.css.result.nav_active);
359 args[PARAM_SORT] = SORT;
360 args[PARAM_SORT_DIR] = SORT_DIR;
361 args[PARAM_RLIST] = new CGI().param(PARAM_RLIST);
363 args[PARAM_OFFSET] = o - getDisplayCount();
364 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
365 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
367 $('prev_link2').setAttribute( "href", buildOPACLink(args));
368 addCSSClass($('prev_link2'), config.css.result.nav_active);
370 args[PARAM_OFFSET] = 0;
371 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
372 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
374 $('search_home_link2').setAttribute( "href", buildOPACLink(args));
375 addCSSClass($('search_home_link2'), config.css.result.nav_active);
378 if(getDisplayCount() < getHitCount()) {
379 unHideMe($('start_end_links_span'));
380 unHideMe($('start_end_links_span2'));
384 try{searchTimer.stop()}catch(e){}
387 function buildunAPISpan (span, type, id) {
391 addCSSClass(span,'unapi-id');
395 'tag:' + cgi.server_name + ',' +
397 ':' + type + '/' + id
401 function unhideGoogleBooks (data) {
402 for ( var i in data ) {
403 //if (data[i].preview == 'noview') continue;
405 var gbspan = $n(document.documentElement, 'googleBooks-' + i);
406 var gba = $n(gbspan, "googleBooks-link");
412 removeCSSClass( gbspan, 'hide_me' );
416 /* display the record info in the record display table 'pos' is the
417 zero based position the record should have in the display table */
418 function resultDisplayRecord(rec, pos, is_mr) {
420 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
422 recordsCache.push(rec);
424 var r = table.rows[pos + 1];
425 var currentISBN = cleanISBN(rec.isbn());
428 var gbspan = $n(r, "googleBooks");
432 gbspan.getAttribute('name') + '-' + currentISBN
435 if (isbnList) isbnList += ', ';
436 isbnList += currentISBN;
442 var rank = parseFloat(ranks[pos + getOffset()]);
443 rank = parseInt( rank * 100 );
444 var relspan = $n(r, "relevancy_span");
445 relspan.appendChild(text(rank));
446 unHideMe(relspan.parentNode);
450 var pic = $n(r, config.names.result.item_jacket);
451 pic.setAttribute("src", buildISBNSrc(currentISBN));
453 var title_link = $n(r, config.names.result.item_title);
454 var author_link = $n(r, config.names.result.item_author);
457 var onlyrec = onlyrecord[ getOffset() + pos ];
459 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);
463 args[PARAM_OFFSET] = 0;
464 args[PARAM_RID] = onlyrec;
465 args[PARAM_MRID] = rec.doc_id();
466 pic.parentNode.setAttribute("href", buildOPACLink(args));
467 title_link.setAttribute("href", buildOPACLink(args));
468 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
471 buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());
473 buildTitleLink(rec, title_link);
476 args[PARAM_OFFSET] = 0;
477 args[PARAM_MRID] = rec.doc_id();
478 pic.parentNode.setAttribute("href", buildOPACLink(args));
482 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
484 buildTitleDetailLink(rec, title_link);
487 args[PARAM_OFFSET] = 0;
488 args[PARAM_RID] = rec.doc_id();
489 pic.parentNode.setAttribute("href", buildOPACLink(args));
491 unHideMe($n(r,'place_hold_span'));
492 $n(r,'place_hold_link').setAttribute(
493 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');
496 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
500 if(!isNull(rec.edition())) {
501 unHideMe( $n(r, "result_table_extra_span"));
502 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
504 if(!isNull(rec.pubdate())) {
505 unHideMe( $n(r, "result_table_extra_span"));
506 unHideMe($n(r, "result_table_pub_span"));
507 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
509 if(!isNull(rec.publisher()) ) {
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.publisher() ));
515 if(!isNull(rec.physical_description()) ) {
516 unHideMe( $n(r, "result_table_extra_span"));
517 var t = " " + rec.physical_description();
518 //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));
519 $n(r, "result_table_phys_span").appendChild( text(t));
524 resultBuildFormatIcons( r, rec, is_mr );
528 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
531 if(resultPageIsDone()) {
532 runEvt('result', 'allRecordsReceived', recordsCache);
537 function _resultFindRec(id) {
538 for( var i = 0; i != recordsCache.length; i++ ) {
539 var rec = recordsCache[i];
540 if( rec && rec.doc_id() == id )
547 function resultBuildFormatIcons( row, rec, is_mr ) {
549 var ress = rec.types_of_resource();
551 for( var i in ress ) {
556 var link = $n(row, res + "_link");
558 var img = link.getElementsByTagName("img")[0];
559 removeCSSClass( img, config.css.dim );
563 if( f == modsFormatToMARC(res) )
564 addCSSClass( img, "dim2_border");
568 args[PARAM_OFFSET] = 0;
572 args[PARAM_TFORM] = modsFormatToMARC(res);
573 args[PARAM_MRID] = rec.doc_id();
577 args[PARAM_RID] = rec.doc_id();
580 link.setAttribute("href", buildOPACLink(args));
585 function fetchGoogleBooks () {
586 if (isbnList && googleBooks) {
587 var scriptElement = document.createElement("script");
588 scriptElement.setAttribute("id", "jsonScript");
589 scriptElement.setAttribute("src",
590 "http://books.google.com/books?bibkeys=" +
591 escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooks");
592 scriptElement.setAttribute("type", "text/javascript");
593 // make the request to Google Book Search
594 document.documentElement.firstChild.appendChild(scriptElement);
598 function resultPageIsDone(pos) {
600 return (recordsHandled == getDisplayCount()
601 || recordsHandled + getOffset() == getHitCount());
604 var resultCCHeaderApplied = false;
606 /* -------------------------------------------------------------------- */
607 /* dynamically add the copy count rows based on the org type 'countsrow'
608 is the row into which we will add TD's to hold the copy counts
609 This code generates copy count cells with an id of
610 'copy_count_cell_<depth>_<pagePosition>' */
611 function resultAddCopyCounts(rec, pagePosition) {
613 var r = table.rows[pagePosition + 1];
614 var countsrow = $n(r, config.names.result.counts_row );
615 var ccell = $n(countsrow, config.names.result.count_cell);
617 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
619 var type = findOrgType(node.ou_type());
620 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
621 ccell.title = type.opac_label();
622 //addCSSClass(ccell, config.css.result.cc_cell_even);
624 var lastcell = ccell;
625 var lastheadcell = null;
628 var ccheadcell = null;
629 if(!resultCCHeaderApplied) {
630 ccrow = $('result_thead_row');
631 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
632 var t = ccheadcell.cloneNode(true);
634 t.appendChild(text(type.opac_label()));
635 ccrow.appendChild(t);
636 resultCCHeaderApplied = true;
642 var d = findOrgDepth(nodes[1]);
643 var d2 = findOrgDepth(nodes[nodes.length -1]);
645 for( var i = d; i <= d2 ; i++ ) {
647 ccell = ccell.cloneNode(true);
649 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
650 //else addCSSClass(ccell, "copy_count_cell_even");
652 var node = nodes[x++];
653 var type = findOrgType(node.ou_type());
655 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
656 ccell.title = type.opac_label();
657 countsrow.insertBefore(ccell, lastcell);
661 var t = ccheadcell.cloneNode(true);
662 t.appendChild(text(type.opac_label()));
663 ccrow.insertBefore(t, lastheadcell);
669 unHideMe($("search_info_table"));
672 /* collect copy counts for a record using method 'methodName' */
673 function resultCollectCopyCounts(rec, pagePosition, methodName) {
674 if(rec == null || rec.doc_id() == null) return;
675 var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
676 req.request.userdata = [ rec, pagePosition ];
677 req.callback(resultHandleCopyCounts);
681 function resultHandleCopyCounts(r) {
682 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
686 /* display the collected copy counts */
687 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
688 if(copy_counts == null || rec == null) return;
690 while(copy_counts[i] != null) {
691 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
692 var cts = copy_counts[i];
693 cell.appendChild(text(cts.available + " / " + cts.count));
696 /* here we style opac-invisible records for xul */
698 if( cts.depth == 0 ) {
699 if(!cts.transcendant && !cts.unshadow) {
700 _debug("found an opac-shadowed record: " + rec.doc_id());
701 var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode;
703 addCSSClass( row, 'no_copies' );
705 addCSSClass( row, 'shadowed' );