2 var recordsHandled = 0;
6 /* set up the event handlers */
7 G.evt.result.hitCountReceived.push(resultSetHitInfo);
8 G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
9 G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
10 G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, resultDrawAuthors, resultDrawSeries);
12 attachEvt('result','lowHits',resultLowHits);
13 attachEvt('result','zeroHits',resultZeroHits);
15 attachEvt( "common", "locationUpdated", resultSBSubmit );
16 function resultSBSubmit(){searchBarSubmit();}
18 /* do this after we have ID's so the rank for mr pages will be correct */
19 attachEvt("result", "preCollectRecords", resultPaginate);
21 /* returns the last 'index' postion ocurring in this page */
22 function resultFinalPageIndex() {
23 if(getHitCount() < (getOffset() + getDisplayCount()))
24 return getHitCount() - 1;
25 return getOffset() + getDisplayCount() - 1;
28 /* set the search result info, number of hits, which results we're
29 displaying, links to the next/prev pages, etc. */
30 function resultSetHitInfo() {
31 if(getHitCount() <= lowHitCount)
32 runEvt('result', 'lowHits');
33 if(getHitCount() == 0) {
34 runEvt('result', 'zeroHits');
39 if( getDisplayCount() > (getHitCount() - getOffset())) c = getHitCount();
40 else c = getDisplayCount() + getOffset();
42 var pages = getHitCount() / getDisplayCount();
43 if(pages % 1) pages = parseInt(pages) + 1;
45 G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
46 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
48 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
49 G.ui.result.offset_end.appendChild(text(c));
50 G.ui.result.result_count.appendChild(text(getHitCount()));
51 unHideMe(G.ui.result.info);
54 function resultLowHits() {
55 try{searchTimer.stop()}catch(e){}
57 unHideMe($('result_low_hits'));
59 unHideMe($('result_low_hits_msg'));
61 var sreq = new Request(CHECK_SPELL, getTerm());
62 sreq.callback(resultSuggestSpelling);
65 var words = getTerm().split(' ');
67 while( word = words.shift() ) {
68 var areq = new Request(FETCH_CROSSREF, getStype(), getTerm() );
69 areq.callback(resultLowHitXRef);
73 if( !(getForm() == null || getForm() == 'all' || getForm == "") ) {
75 a[PARAM_FORM] = "all";
76 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
77 unHideMe($('low_hits_remove_format'));
82 var lowHitsXRefLinkParent;
83 function resultLowHitXRef(r) {
85 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
86 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
88 var res = r.getResultObject();
91 if(arr && arr.length > 0) {
92 unHideMe($('low_hits_cross_ref'));
95 while( word = arr.shift() ) {
99 var template = lowHitsXRefLink.cloneNode(true);
100 template.setAttribute('href',buildOPACLink(a));
101 template.appendChild(text(word));
102 lowHitsXRefLinkParent.appendChild(template);
103 lowHitsXRefLinkParent.appendChild(text(' '));
108 function resultZeroHits() {
109 unHideMe($('result_zero_hits_msg'));
110 resultExpandSearch();
111 resultSuggestSearchClass();
114 function resultExpandSearch() {
115 var top = findOrgDepth(globalOrgTree);
116 if(getDepth() == top) return;
117 unHideMe($('low_hits_expand_range'));
118 var par = $('low_hits_expand_link').parentNode;
119 var template = par.removeChild($('low_hits_expand_link'));
121 var bottom = getDepth();
122 while( top < bottom ) {
124 a[PARAM_DEPTH] = top;
125 var temp = template.cloneNode(true);
126 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
127 temp.setAttribute('href',buildOPACLink(a));
128 par.appendChild(temp);
133 function resultSuggestSearchClass() {
134 var stype = getStype();
135 if(stype == STYPE_KEYWORD) return;
137 unHideMe($('low_hits_search_type'));
138 if(stype != STYPE_TITLE) {
139 ref = $('low_hits_title_search');
141 a[PARAM_STYPE] = STYPE_TITLE;
142 ref.setAttribute('href',buildOPACLink(a));
144 if(stype != STYPE_AUTHOR) {
145 ref = $('low_hits_author_search');
147 a[PARAM_STYPE] = STYPE_AUTHOR;
148 ref.setAttribute('href',buildOPACLink(a));
150 if(stype != STYPE_SUBJECT) {
151 ref = $('low_hits_subject_search');
153 a[PARAM_STYPE] = STYPE_SUBJECT;
154 ref.setAttribute('href',buildOPACLink(a));
156 if(stype != STYPE_KEYWORD) {
157 ref = $('low_hits_keyword_search');
159 a[PARAM_STYPE] = STYPE_KEYWORD;
160 ref.setAttribute('href',buildOPACLink(a));
162 if(stype != STYPE_SERIES) {
163 ref = $('low_hits_series_search');
165 a[PARAM_STYPE] = STYPE_SERIES;
166 ref.setAttribute('href',buildOPACLink(a));
170 function resultSuggestSpelling(r) {
171 var res = r.getResultObject();
173 unHideMe($('did_you_mean'));
175 arg[PARAM_TERM] = res;
176 $('spell_check_link').setAttribute(
177 'href', buildOPACLink(arg) );
178 $('spell_check_link').appendChild(text(res));
183 function resultPaginate() {
186 if( !((o + getDisplayCount()) >= getHitCount()) ) {
189 args[PARAM_OFFSET] = o + getDisplayCount();
190 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
191 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
193 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
194 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
195 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
201 args[PARAM_OFFSET] = o - getDisplayCount();
202 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
203 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
205 args[PARAM_OFFSET] = 0;
206 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
207 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
209 if(getDisplayCount() < getHitCount())
210 unHideMe($('start_end_links_span'));
213 try{searchTimer.stop()}catch(e){}
217 /* display the record info in the record display table 'pos' is the
218 zero based position the record should have in the display table */
219 function resultDisplayRecord(rec, pos, is_mr) {
221 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
223 recordsCache.push(rec);
225 var r = table.rows[pos + 1];
228 var rank = parseFloat(ranks[pos + getOffset()]);
229 rank = ( rank / getTopRank() ) * 100;
230 rank = parseInt(rank) + "%";
231 var relspan = $n(r, "relevancy_span");
232 relspan.appendChild(text(rank));
233 unHideMe(relspan.parentNode);
236 var pic = $n(r, config.names.result.item_jacket);
237 pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
239 var title_link = $n(r, config.names.result.item_title);
240 var author_link = $n(r, config.names.result.item_author);
243 var onlyrec = onlyrecord[ getOffset() + pos ];
247 args[PARAM_OFFSET] = 0;
248 args[PARAM_RID] = onlyrec;
249 args[PARAM_MRID] = rec.doc_id();
250 pic.parentNode.setAttribute("href", buildOPACLink(args));
251 title_link.setAttribute("href", buildOPACLink(args));
252 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
255 buildTitleLink(rec, title_link);
258 args[PARAM_OFFSET] = 0;
259 args[PARAM_MRID] = rec.doc_id();
260 pic.parentNode.setAttribute("href", buildOPACLink(args));
264 buildTitleDetailLink(rec, title_link);
267 args[PARAM_OFFSET] = 0;
268 args[PARAM_RID] = rec.doc_id();
269 pic.parentNode.setAttribute("href", buildOPACLink(args));
271 unHideMe($n(r,'place_hold_span'));
272 $n(r,'place_hold_link').setAttribute(
273 'href','javascript:holdsDrawWindow("'+rec.doc_id()+'");');
276 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
280 if(!isNull(rec.edition())) {
281 unHideMe( $n(r, "result_table_extra_span"));
282 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
284 if(!isNull(rec.pubdate())) {
285 unHideMe( $n(r, "result_table_extra_span"));
286 unHideMe($n(r, "result_table_pub_span"));
287 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
289 if(!isNull(rec.publisher()) ) {
290 unHideMe( $n(r, "result_table_extra_span"));
291 unHideMe($n(r, "result_table_pub_span"));
292 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
296 resultBuildFormatIcons( r, rec );
300 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
302 if(resultPageIsDone()) {
304 /* hide the 'now loading...' message */
306 hideMe(G.ui.common.loading);
308 runEvt('result', 'allRecordsReceived', recordsCache);
312 function _resultFindRec(id) {
313 for( var i = 0; i != recordsCache.length; i++ ) {
314 var rec = recordsCache[i];
315 if( rec && rec.doc_id() == id )
322 var currentHoldRecord;
323 var holdsOrgSelectorBuilt = false;
324 function resultDrawHoldsWindow(recid) {
327 recid = currentHoldRecord;
328 if(recid == null) return;
330 currentHoldRecord = recid;
332 detachEvt('common','locationUpdated', resultSBSubmit );
333 attachEvt( "common", "locationUpdated", resultSBSubmit );
335 if(!(G.user && G.user.session)) {
337 detachEvt('common','locationUpdated', resultSBSubmit );
338 attachEvt('common','loggedIn', resultDrawHoldsWindow)
339 //alert(G.evt['common']['locationUpdated']);
341 //attachEvt( "common", "locationUpdated", resultSBSubmit );
344 swapCanvas($('holds_box'));
346 var rec = _resultFindRec(recid);
348 if(!holdsOrgSelectorBuilt) {
349 resultBuildHoldsSelector(null, 0);
350 holdsOrgSelectorBuilt = true;
353 removeChildren($('holds_title'));
354 removeChildren($('holds_author'));
355 removeChildren($('holds_format'));
356 removeChildren($('holds_email'));
357 removeChildren($('holds_email'));
359 $('holds_title').appendChild(text(rec.title()));
360 $('holds_author').appendChild(text(rec.author()));
362 for( var i in rec.types_of_resource() ) {
363 var res = rec.types_of_resource()[i];
364 var img = elem("img");
365 setResourcePic(img, res);
366 $('holds_format').appendChild(text(' '+res+' '));
367 $('holds_format').appendChild(img);
368 $('holds_format').appendChild(text(' '));
371 $('holds_phone').appendChild(text(G.user.day_phone()));
372 $('holds_email').appendChild(text(G.user.email()));
373 $('holds_cancel').onclick = showCanvas;
374 $('holds_submit').onclick = resultPlaceHold;
378 function resultBuildHoldsSelector(node, depth) {
381 node = globalOrgTree;
385 var selector = $('holds_org_selector');
386 var index = selector.options.length;
389 var pre = elem("pre");
390 for(var x=2; x <= findOrgType(node.ou_type()).depth(); x++) {
391 pre.appendChild(text(" "));
393 pre.appendChild(text(node.name()));
394 var select = new Option("", node.id());
395 selector.options[index] = select;
396 select.appendChild(pre);
399 var pad = (findOrgType(node.ou_type()).depth() - 1) * 12;
401 var select = new Option(node.name(), node.id());
402 select.setAttribute("style", "padding-left: "+pad+'px;');
403 selector.options[index] = select;
406 if( node.id() == getLocation() ) {
407 selector.selectedIndex = index;
408 selector.options[index].selected = true;
411 for( var i in node.children() ) {
412 var child = node.children()[i];
414 resultBuildHoldsSelector(child, depth+1);
419 function resultPlaceHold() {
420 var hold = new ahr();
421 hold.pickup_lib( 1 );
422 hold.requestor(G.user.id());
423 hold.usr(G.user.id());
425 hold.email_notify(G.user.email());
426 hold.phone_notify(G.user.day_phone());
427 hold.target(currentHoldRecord);
429 var req = new Request( CREATE_HOLD, G.user.session, hold );
431 var res = req.result();
436 alert('hold failed');
443 function resultBuildFormatIcons( row, rec ) {
445 var ress = rec.types_of_resource();
447 for( var i in ress ) {
450 var link = $n(row, res + "_link");
452 var img = link.getElementsByTagName("img")[0];
453 removeCSSClass( img, config.css.dim );
457 if( f == modsFormatToMARC(res) )
458 addCSSClass( img, "dim2_border");
463 args[PARAM_OFFSET] = 0;
464 args[PARAM_MRID] = rec.doc_id();
465 args[PARAM_FORM] = modsFormatToMARC(res);
467 link.setAttribute("href", buildOPACLink(args));
473 function resultPageIsDone(pos) {
474 return (recordsHandled == getDisplayCount()
475 || recordsHandled + getOffset() == getHitCount());
478 var resultCCHeaderApplied = false;
480 /* -------------------------------------------------------------------- */
481 /* dynamically add the copy count rows based on the org type 'countsrow'
482 is the row into which we will add TD's to hold the copy counts
483 This code generates copy count cells with an id of
484 'copy_count_cell_<depth>_<pagePosition>' */
485 function resultAddCopyCounts(rec, pagePosition) {
487 var r = table.rows[pagePosition + 1];
488 var countsrow = $n(r, config.names.result.counts_row );
489 var ccell = $n(countsrow, config.names.result.count_cell);
491 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
493 var type = findOrgType(node.ou_type());
494 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
495 ccell.title = type.opac_label();
496 //addCSSClass(ccell, config.css.result.cc_cell_even);
498 var lastcell = ccell;
499 var lastheadcell = null;
502 var ccheadcell = null;
503 if(!resultCCHeaderApplied) {
504 ccrow = $('result_thead_row');
505 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
506 var t = ccheadcell.cloneNode(true);
508 t.appendChild(text(type.opac_label()));
509 ccrow.appendChild(t);
510 resultCCHeaderApplied = true;
516 var d = findOrgDepth(nodes[1]);
517 var d2 = findOrgDepth(nodes[nodes.length -1]);
519 for( var i = d; i <= d2 ; i++ ) {
521 ccell = ccell.cloneNode(true);
523 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
524 //else addCSSClass(ccell, "copy_count_cell_even");
526 var node = nodes[x++];
527 var type = findOrgType(node.ou_type());
529 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
530 ccell.title = type.opac_label();
531 countsrow.insertBefore(ccell, lastcell);
535 var t = ccheadcell.cloneNode(true);
536 t.appendChild(text(type.opac_label()));
537 ccrow.insertBefore(t, lastheadcell);
543 unHideMe($("search_info_table"));
546 /* collect copy counts for a record using method 'methodName' */
547 function resultCollectCopyCounts(rec, pagePosition, methodName) {
548 if(rec == null || rec.doc_id() == null) return;
549 var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
550 req.request.userdata = [ rec, pagePosition ];
551 req.callback(resultHandleCopyCounts);
555 function resultHandleCopyCounts(r) {
556 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
560 /* display the collected copy counts */
561 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
562 if(copy_counts == null || rec == null) return;
564 while(copy_counts[i] != null) {
565 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
567 var span = cell.getElementsByTagName("div")[0];
569 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
576 /* captures extraneous info from each record */
578 var subjectCache = {};
579 var authorCache = {};
580 var seriesCache = {};
582 function resultBuildCaches(records) {
583 for( var r in records ) {
584 var rec = records[r];
585 for( var s in rec.subject() )
586 subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
587 authorCache[rec.author()] = 1;
588 for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
592 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
593 function resultDrawSubjects() {
596 for( var s in subjectCache )
597 subjs.push( { sub : s, count : subjectCache[s] } );
598 subjs.sort(resultSortSubjects);
601 for( var s in subjs ) ss.push(subjs[s].sub);
603 resultDrawSidebarTrees(
605 "subjectSidebarTree", ss,
606 $("subject_tree_sidebar"),
607 $("subject_sidebar_tree_div") );
610 function resultDrawAuthors() {
611 var auths = new Array();
612 for( var s in authorCache ) auths.push(s);
614 resultDrawSidebarTrees(
616 "authorSidebarTree", auths.sort(),
617 $("author_tree_sidebar"),
618 $("author_sidebar_tree_div") );
621 function resultDrawSeries() {
622 var sers = new Array();
623 for( var s in seriesCache ) sers.push(s);
624 resultDrawSidebarTrees(
626 "seriesSidebarTree", sers.sort(),
627 $("series_tree_sidebar"),
628 $("series_sidebar_tree_div") );
631 function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) {
633 eval("tree = " + treeName);
637 for( var i in items ) {
639 if(isNull(items[i])) continue;
643 var item = normalize(truncate(items[i], 65));
646 var href = resultQuickLink( items[i], stype );
647 tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );
651 setTimeout('resultFireXRefReq("'+treeName+'","'+stype+'","'+item+'");',200);
653 if(!IE) resultFireXRefReq(treeName, stype, items[i]);
657 unHideMe(wrapperNode);
658 //tree.close(tree.rootid);
662 function resultFireXRefReq( treeName, stype, item ) {
664 eval('tree=' + treeName);
665 var req = new Request(FETCH_CROSSREF, stype, item);
666 req.request._tree = tree;
667 req.request._item = item;
668 req.request._stype = stype;
669 req.callback(resultAppendCrossRef);
674 function resultQuickLink( term, type ) {
677 args[PARAM_OFFSET] = 0;
678 args[PARAM_TERM] = term;
679 args[PARAM_STYPE] = type;
680 return buildOPACLink(args);
684 function resultAppendCrossRef(r) {
687 var stype = r._stype;
688 var result = r.getResultObject();
690 var froms = result['from'];
691 var alsos = result['also'];
695 for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
696 var string = normalize(truncate(froms[i], 45));
697 if($(stype + '_' + froms[i])) continue;
698 tree.addNode(stype + '_' + froms[i],
699 stype + '_' + item, string, resultQuickLink(froms[i],stype));
701 for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
702 var string = normalize(truncate(alsos[i], 45));
703 if($(stype + '_' + alsos[i])) continue;
704 tree.addNode(stype + '_' + alsos[i],
705 stype + '_' + item, string, resultQuickLink(alsos[i],stype));