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;
441 var rank = parseFloat(ranks[pos + getOffset()]);
442 rank = parseInt( rank * 100 );
443 var relspan = $n(r, "relevancy_span");
444 relspan.appendChild(text(rank));
445 unHideMe(relspan.parentNode);
448 var pic = $n(r, config.names.result.item_jacket);
449 pic.setAttribute("src", buildISBNSrc(currentISBN));
451 var title_link = $n(r, config.names.result.item_title);
452 var author_link = $n(r, config.names.result.item_author);
455 var onlyrec = onlyrecord[ getOffset() + pos ];
457 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);
461 args[PARAM_OFFSET] = 0;
462 args[PARAM_RID] = onlyrec;
463 args[PARAM_MRID] = rec.doc_id();
464 pic.parentNode.setAttribute("href", buildOPACLink(args));
465 title_link.setAttribute("href", buildOPACLink(args));
466 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
469 buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());
471 buildTitleLink(rec, title_link);
474 args[PARAM_OFFSET] = 0;
475 args[PARAM_MRID] = rec.doc_id();
476 pic.parentNode.setAttribute("href", buildOPACLink(args));
480 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
482 buildTitleDetailLink(rec, title_link);
485 args[PARAM_OFFSET] = 0;
486 args[PARAM_RID] = rec.doc_id();
487 pic.parentNode.setAttribute("href", buildOPACLink(args));
489 unHideMe($n(r,'place_hold_span'));
490 $n(r,'place_hold_link').setAttribute(
491 'href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');
494 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
498 if(!isNull(rec.edition())) {
499 unHideMe( $n(r, "result_table_extra_span"));
500 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
502 if(!isNull(rec.pubdate())) {
503 unHideMe( $n(r, "result_table_extra_span"));
504 unHideMe($n(r, "result_table_pub_span"));
505 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
507 if(!isNull(rec.publisher()) ) {
508 unHideMe( $n(r, "result_table_extra_span"));
509 unHideMe($n(r, "result_table_pub_span"));
510 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
513 if(!isNull(rec.physical_description()) ) {
514 unHideMe( $n(r, "result_table_extra_span"));
515 var t = " " + rec.physical_description();
516 //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));
517 $n(r, "result_table_phys_span").appendChild( text(t));
522 resultBuildFormatIcons( r, rec, is_mr );
526 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
529 if(resultPageIsDone()) {
530 runEvt('result', 'allRecordsReceived', recordsCache);
535 function _resultFindRec(id) {
536 for( var i = 0; i != recordsCache.length; i++ ) {
537 var rec = recordsCache[i];
538 if( rec && rec.doc_id() == id )
545 function resultBuildFormatIcons( row, rec, is_mr ) {
547 var ress = rec.types_of_resource();
549 for( var i in ress ) {
554 var link = $n(row, res + "_link");
556 var img = link.getElementsByTagName("img")[0];
557 removeCSSClass( img, config.css.dim );
561 if( f == modsFormatToMARC(res) )
562 addCSSClass( img, "dim2_border");
566 args[PARAM_OFFSET] = 0;
570 args[PARAM_TFORM] = modsFormatToMARC(res);
571 args[PARAM_MRID] = rec.doc_id();
575 args[PARAM_RID] = rec.doc_id();
578 link.setAttribute("href", buildOPACLink(args));
583 function fetchGoogleBooks () {
584 if (isbnList && googleBooks) {
585 var scriptElement = document.createElement("script");
586 scriptElement.setAttribute("id", "jsonScript");
587 scriptElement.setAttribute("src",
588 "http://books.google.com/books?bibkeys=" +
589 escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooks");
590 scriptElement.setAttribute("type", "text/javascript");
591 // make the request to Google Book Search
592 document.documentElement.firstChild.appendChild(scriptElement);
596 function resultPageIsDone(pos) {
598 return (recordsHandled == getDisplayCount()
599 || recordsHandled + getOffset() == getHitCount());
602 var resultCCHeaderApplied = false;
604 /* -------------------------------------------------------------------- */
605 /* dynamically add the copy count rows based on the org type 'countsrow'
606 is the row into which we will add TD's to hold the copy counts
607 This code generates copy count cells with an id of
608 'copy_count_cell_<depth>_<pagePosition>' */
609 function resultAddCopyCounts(rec, pagePosition) {
611 var r = table.rows[pagePosition + 1];
612 var countsrow = $n(r, config.names.result.counts_row );
613 var ccell = $n(countsrow, config.names.result.count_cell);
615 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
617 var type = findOrgType(node.ou_type());
618 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
619 ccell.title = type.opac_label();
620 //addCSSClass(ccell, config.css.result.cc_cell_even);
622 var lastcell = ccell;
623 var lastheadcell = null;
626 var ccheadcell = null;
627 if(!resultCCHeaderApplied) {
628 ccrow = $('result_thead_row');
629 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
630 var t = ccheadcell.cloneNode(true);
632 t.appendChild(text(type.opac_label()));
633 ccrow.appendChild(t);
634 resultCCHeaderApplied = true;
640 var d = findOrgDepth(nodes[1]);
641 var d2 = findOrgDepth(nodes[nodes.length -1]);
643 for( var i = d; i <= d2 ; i++ ) {
645 ccell = ccell.cloneNode(true);
647 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
648 //else addCSSClass(ccell, "copy_count_cell_even");
650 var node = nodes[x++];
651 var type = findOrgType(node.ou_type());
653 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
654 ccell.title = type.opac_label();
655 countsrow.insertBefore(ccell, lastcell);
659 var t = ccheadcell.cloneNode(true);
660 t.appendChild(text(type.opac_label()));
661 ccrow.insertBefore(t, lastheadcell);
667 unHideMe($("search_info_table"));
670 /* collect copy counts for a record using method 'methodName' */
671 function resultCollectCopyCounts(rec, pagePosition, methodName) {
672 if(rec == null || rec.doc_id() == null) return;
673 var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
674 req.request.userdata = [ rec, pagePosition ];
675 req.callback(resultHandleCopyCounts);
679 function resultHandleCopyCounts(r) {
680 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
684 /* display the collected copy counts */
685 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
686 if(copy_counts == null || rec == null) return;
688 while(copy_counts[i] != null) {
689 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
690 var cts = copy_counts[i];
691 cell.appendChild(text(cts.available + " / " + cts.count));
694 /* here we style opac-invisible records for xul */
696 if( cts.depth == 0 ) {
697 if(!cts.transcendant && !cts.unshadow) {
698 _debug("found an opac-shadowed record: " + rec.doc_id());
699 var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode;
701 addCSSClass( row, 'no_copies' );
703 addCSSClass( row, 'shadowed' );