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( findCurrentPage() == MRESULT ) {
32 if(getHitCount() <= lowHitCount)
33 runEvt('result', 'lowHits');
34 if(getHitCount() == 0) {
35 runEvt('result', 'zeroHits');
41 if( getDisplayCount() > (getHitCount() - getOffset())) c = getHitCount();
42 else c = getDisplayCount() + getOffset();
44 var pages = getHitCount() / getDisplayCount();
45 if(pages % 1) pages = parseInt(pages) + 1;
47 G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
48 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
50 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
51 G.ui.result.offset_end.appendChild(text(c));
52 G.ui.result.result_count.appendChild(text(getHitCount()));
53 unHideMe(G.ui.result.info);
56 function resultLowHits() {
57 try{searchTimer.stop()}catch(e){}
59 unHideMe($('result_low_hits'));
61 unHideMe($('result_low_hits_msg'));
63 var sreq = new Request(CHECK_SPELL, getTerm());
64 sreq.callback(resultSuggestSpelling);
67 var words = getTerm().split(' ');
69 while( word = words.shift() ) {
70 var areq = new Request(FETCH_CROSSREF, getStype(), getTerm() );
71 areq.callback(resultLowHitXRef);
75 if( !(getForm() == null || getForm() == 'all' || getForm == "") ) {
77 a[PARAM_FORM] = "all";
78 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
79 unHideMe($('low_hits_remove_format'));
82 resultSuggestSearchClass();
86 var lowHitsXRefLinkParent;
87 function resultLowHitXRef(r) {
89 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
90 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
92 var res = r.getResultObject();
95 if(arr && arr.length > 0) {
96 unHideMe($('low_hits_cross_ref'));
99 while( word = arr.shift() ) {
102 a[PARAM_TERM] = word;
103 var template = lowHitsXRefLink.cloneNode(true);
104 template.setAttribute('href',buildOPACLink(a));
105 template.appendChild(text(word));
106 lowHitsXRefLinkParent.appendChild(template);
107 lowHitsXRefLinkParent.appendChild(text(' '));
112 function resultZeroHits() {
113 unHideMe($('result_zero_hits_msg'));
114 resultExpandSearch();
117 function resultExpandSearch() {
118 var top = findOrgDepth(globalOrgTree);
119 if(getDepth() == top) return;
120 unHideMe($('low_hits_expand_range'));
121 var par = $('low_hits_expand_link').parentNode;
122 var template = par.removeChild($('low_hits_expand_link'));
124 var bottom = getDepth();
125 while( top < bottom ) {
127 a[PARAM_DEPTH] = top;
128 var temp = template.cloneNode(true);
129 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
130 temp.setAttribute('href',buildOPACLink(a));
131 par.appendChild(temp);
136 function resultSuggestSearchClass() {
137 var stype = getStype();
138 if(stype == STYPE_KEYWORD) return;
140 unHideMe($('low_hits_search_type'));
141 if(stype != STYPE_TITLE) {
142 ref = $('low_hits_title_search');
144 a[PARAM_STYPE] = STYPE_TITLE;
145 ref.setAttribute('href',buildOPACLink(a));
147 if(stype != STYPE_AUTHOR) {
148 ref = $('low_hits_author_search');
150 a[PARAM_STYPE] = STYPE_AUTHOR;
151 ref.setAttribute('href',buildOPACLink(a));
153 if(stype != STYPE_SUBJECT) {
154 ref = $('low_hits_subject_search');
156 a[PARAM_STYPE] = STYPE_SUBJECT;
157 ref.setAttribute('href',buildOPACLink(a));
159 if(stype != STYPE_KEYWORD) {
160 ref = $('low_hits_keyword_search');
162 a[PARAM_STYPE] = STYPE_KEYWORD;
163 ref.setAttribute('href',buildOPACLink(a));
165 if(stype != STYPE_SERIES) {
166 ref = $('low_hits_series_search');
168 a[PARAM_STYPE] = STYPE_SERIES;
169 ref.setAttribute('href',buildOPACLink(a));
173 function resultSuggestSpelling(r) {
174 var res = r.getResultObject();
176 unHideMe($('did_you_mean'));
178 arg[PARAM_TERM] = res;
179 $('spell_check_link').setAttribute(
180 'href', buildOPACLink(arg) );
181 $('spell_check_link').appendChild(text(res));
186 function resultPaginate() {
189 if( !((o + getDisplayCount()) >= getHitCount()) ) {
192 args[PARAM_OFFSET] = o + getDisplayCount();
193 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
194 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
196 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
197 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
198 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
204 args[PARAM_OFFSET] = o - getDisplayCount();
205 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
206 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
208 args[PARAM_OFFSET] = 0;
209 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
210 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
212 if(getDisplayCount() < getHitCount())
213 unHideMe($('start_end_links_span'));
216 try{searchTimer.stop()}catch(e){}
220 /* display the record info in the record display table 'pos' is the
221 zero based position the record should have in the display table */
222 function resultDisplayRecord(rec, pos, is_mr) {
224 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
226 recordsCache.push(rec);
228 var r = table.rows[pos + 1];
231 var rank = parseFloat(ranks[pos + getOffset()]);
232 rank = ( rank / getTopRank() ) * 100;
233 rank = parseInt(rank) + "%";
234 var relspan = $n(r, "relevancy_span");
235 relspan.appendChild(text(rank));
236 unHideMe(relspan.parentNode);
239 var pic = $n(r, config.names.result.item_jacket);
240 pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
242 var title_link = $n(r, config.names.result.item_title);
243 var author_link = $n(r, config.names.result.item_author);
246 var onlyrec = onlyrecord[ getOffset() + pos ];
250 args[PARAM_OFFSET] = 0;
251 args[PARAM_RID] = onlyrec;
252 args[PARAM_MRID] = rec.doc_id();
253 pic.parentNode.setAttribute("href", buildOPACLink(args));
254 title_link.setAttribute("href", buildOPACLink(args));
255 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
258 buildTitleLink(rec, title_link);
261 args[PARAM_OFFSET] = 0;
262 args[PARAM_MRID] = rec.doc_id();
263 pic.parentNode.setAttribute("href", buildOPACLink(args));
267 buildTitleDetailLink(rec, title_link);
270 args[PARAM_OFFSET] = 0;
271 args[PARAM_RID] = rec.doc_id();
272 pic.parentNode.setAttribute("href", buildOPACLink(args));
274 unHideMe($n(r,'place_hold_span'));
275 $n(r,'place_hold_link').setAttribute(
276 'href','javascript:holdsDrawWindow("'+rec.doc_id()+'");');
279 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
283 if(!isNull(rec.edition())) {
284 unHideMe( $n(r, "result_table_extra_span"));
285 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
287 if(!isNull(rec.pubdate())) {
288 unHideMe( $n(r, "result_table_extra_span"));
289 unHideMe($n(r, "result_table_pub_span"));
290 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
292 if(!isNull(rec.publisher()) ) {
293 unHideMe( $n(r, "result_table_extra_span"));
294 unHideMe($n(r, "result_table_pub_span"));
295 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
299 resultBuildFormatIcons( r, rec );
303 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
305 if(resultPageIsDone()) {
307 /* hide the 'now loading...' message */
309 hideMe(G.ui.common.loading);
311 runEvt('result', 'allRecordsReceived', recordsCache);
315 function _resultFindRec(id) {
316 for( var i = 0; i != recordsCache.length; i++ ) {
317 var rec = recordsCache[i];
318 if( rec && rec.doc_id() == id )
325 var currentHoldRecord;
326 var holdsOrgSelectorBuilt = false;
327 function resultDrawHoldsWindow(recid) {
330 recid = currentHoldRecord;
331 if(recid == null) return;
333 currentHoldRecord = recid;
335 detachEvt('common','locationUpdated', resultSBSubmit );
336 attachEvt( "common", "locationUpdated", resultSBSubmit );
338 if(!(G.user && G.user.session)) {
340 detachEvt('common','locationUpdated', resultSBSubmit );
341 attachEvt('common','loggedIn', resultDrawHoldsWindow)
342 //alert(G.evt['common']['locationUpdated']);
344 //attachEvt( "common", "locationUpdated", resultSBSubmit );
347 swapCanvas($('holds_box'));
349 var rec = _resultFindRec(recid);
351 if(!holdsOrgSelectorBuilt) {
352 resultBuildHoldsSelector(null, 0);
353 holdsOrgSelectorBuilt = true;
356 removeChildren($('holds_title'));
357 removeChildren($('holds_author'));
358 removeChildren($('holds_format'));
359 removeChildren($('holds_email'));
360 removeChildren($('holds_email'));
362 $('holds_title').appendChild(text(rec.title()));
363 $('holds_author').appendChild(text(rec.author()));
365 for( var i in rec.types_of_resource() ) {
366 var res = rec.types_of_resource()[i];
367 var img = elem("img");
368 setResourcePic(img, res);
369 $('holds_format').appendChild(text(' '+res+' '));
370 $('holds_format').appendChild(img);
371 $('holds_format').appendChild(text(' '));
374 $('holds_phone').appendChild(text(G.user.day_phone()));
375 $('holds_email').appendChild(text(G.user.email()));
376 $('holds_cancel').onclick = showCanvas;
377 $('holds_submit').onclick = resultPlaceHold;
381 function resultBuildHoldsSelector(node, depth) {
384 node = globalOrgTree;
388 var selector = $('holds_org_selector');
389 var index = selector.options.length;
392 var pre = elem("pre");
393 for(var x=2; x <= findOrgType(node.ou_type()).depth(); x++) {
394 pre.appendChild(text(" "));
396 pre.appendChild(text(node.name()));
397 var select = new Option("", node.id());
398 selector.options[index] = select;
399 select.appendChild(pre);
402 var pad = (findOrgType(node.ou_type()).depth() - 1) * 12;
404 var select = new Option(node.name(), node.id());
405 select.setAttribute("style", "padding-left: "+pad+'px;');
406 selector.options[index] = select;
409 if( node.id() == getLocation() ) {
410 selector.selectedIndex = index;
411 selector.options[index].selected = true;
414 for( var i in node.children() ) {
415 var child = node.children()[i];
417 resultBuildHoldsSelector(child, depth+1);
422 function resultPlaceHold() {
423 var hold = new ahr();
424 hold.pickup_lib( 1 );
425 hold.requestor(G.user.id());
426 hold.usr(G.user.id());
428 hold.email_notify(G.user.email());
429 hold.phone_notify(G.user.day_phone());
430 hold.target(currentHoldRecord);
432 var req = new Request( CREATE_HOLD, G.user.session, hold );
434 var res = req.result();
439 alert('hold failed');
446 function resultBuildFormatIcons( row, rec ) {
448 var ress = rec.types_of_resource();
450 for( var i in ress ) {
453 var link = $n(row, res + "_link");
455 var img = link.getElementsByTagName("img")[0];
456 removeCSSClass( img, config.css.dim );
460 if( f == modsFormatToMARC(res) )
461 addCSSClass( img, "dim2_border");
466 args[PARAM_OFFSET] = 0;
467 args[PARAM_MRID] = rec.doc_id();
468 args[PARAM_FORM] = modsFormatToMARC(res);
470 link.setAttribute("href", buildOPACLink(args));
476 function resultPageIsDone(pos) {
477 return (recordsHandled == getDisplayCount()
478 || recordsHandled + getOffset() == getHitCount());
481 var resultCCHeaderApplied = false;
483 /* -------------------------------------------------------------------- */
484 /* dynamically add the copy count rows based on the org type 'countsrow'
485 is the row into which we will add TD's to hold the copy counts
486 This code generates copy count cells with an id of
487 'copy_count_cell_<depth>_<pagePosition>' */
488 function resultAddCopyCounts(rec, pagePosition) {
490 var r = table.rows[pagePosition + 1];
491 var countsrow = $n(r, config.names.result.counts_row );
492 var ccell = $n(countsrow, config.names.result.count_cell);
494 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
496 var type = findOrgType(node.ou_type());
497 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
498 ccell.title = type.opac_label();
499 //addCSSClass(ccell, config.css.result.cc_cell_even);
501 var lastcell = ccell;
502 var lastheadcell = null;
505 var ccheadcell = null;
506 if(!resultCCHeaderApplied) {
507 ccrow = $('result_thead_row');
508 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
509 var t = ccheadcell.cloneNode(true);
511 t.appendChild(text(type.opac_label()));
512 ccrow.appendChild(t);
513 resultCCHeaderApplied = true;
519 var d = findOrgDepth(nodes[1]);
520 var d2 = findOrgDepth(nodes[nodes.length -1]);
522 for( var i = d; i <= d2 ; i++ ) {
524 ccell = ccell.cloneNode(true);
526 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
527 //else addCSSClass(ccell, "copy_count_cell_even");
529 var node = nodes[x++];
530 var type = findOrgType(node.ou_type());
532 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
533 ccell.title = type.opac_label();
534 countsrow.insertBefore(ccell, lastcell);
538 var t = ccheadcell.cloneNode(true);
539 t.appendChild(text(type.opac_label()));
540 ccrow.insertBefore(t, lastheadcell);
546 unHideMe($("search_info_table"));
549 /* collect copy counts for a record using method 'methodName' */
550 function resultCollectCopyCounts(rec, pagePosition, methodName) {
551 if(rec == null || rec.doc_id() == null) return;
552 var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
553 req.request.userdata = [ rec, pagePosition ];
554 req.callback(resultHandleCopyCounts);
558 function resultHandleCopyCounts(r) {
559 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
563 /* display the collected copy counts */
564 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
565 if(copy_counts == null || rec == null) return;
567 while(copy_counts[i] != null) {
568 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
570 var span = cell.getElementsByTagName("div")[0];
572 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
579 /* captures extraneous info from each record */
581 var subjectCache = {};
582 var authorCache = {};
583 var seriesCache = {};
585 function resultBuildCaches(records) {
586 for( var r in records ) {
587 var rec = records[r];
588 for( var s in rec.subject() )
589 subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
590 authorCache[rec.author()] = 1;
591 for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
595 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
596 function resultDrawSubjects() {
599 for( var s in subjectCache )
600 subjs.push( { sub : s, count : subjectCache[s] } );
601 subjs.sort(resultSortSubjects);
604 for( var s in subjs ) ss.push(subjs[s].sub);
606 resultDrawSidebarTrees(
608 "subjectSidebarTree", ss,
609 $("subject_tree_sidebar"),
610 $("subject_sidebar_tree_div") );
613 function resultDrawAuthors() {
614 var auths = new Array();
615 for( var s in authorCache ) auths.push(s);
617 resultDrawSidebarTrees(
619 "authorSidebarTree", auths.sort(),
620 $("author_tree_sidebar"),
621 $("author_sidebar_tree_div") );
624 function resultDrawSeries() {
625 var sers = new Array();
626 for( var s in seriesCache ) sers.push(s);
627 resultDrawSidebarTrees(
629 "seriesSidebarTree", sers.sort(),
630 $("series_tree_sidebar"),
631 $("series_sidebar_tree_div") );
634 function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) {
636 eval("tree = " + treeName);
640 for( var i in items ) {
642 if(isNull(items[i])) continue;
646 var item = normalize(truncate(items[i], 65));
649 var href = resultQuickLink( items[i], stype );
650 tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );
654 setTimeout('resultFireXRefReq("'+treeName+'","'+stype+'","'+item+'");',200);
656 if(!IE) resultFireXRefReq(treeName, stype, items[i]);
660 unHideMe(wrapperNode);
661 //tree.close(tree.rootid);
665 function resultFireXRefReq( treeName, stype, item ) {
667 eval('tree=' + treeName);
668 var req = new Request(FETCH_CROSSREF, stype, item);
669 req.request._tree = tree;
670 req.request._item = item;
671 req.request._stype = stype;
672 req.callback(resultAppendCrossRef);
677 function resultQuickLink( term, type ) {
680 args[PARAM_OFFSET] = 0;
681 args[PARAM_TERM] = term;
682 args[PARAM_STYPE] = type;
683 return buildOPACLink(args);
687 function resultAppendCrossRef(r) {
690 var stype = r._stype;
691 var result = r.getResultObject();
693 var froms = result['from'];
694 var alsos = result['also'];
698 for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
699 var string = normalize(truncate(froms[i], 45));
700 if($(stype + '_' + froms[i])) continue;
701 tree.addNode(stype + '_' + froms[i],
702 stype + '_' + item, string, resultQuickLink(froms[i],stype));
704 for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
705 var string = normalize(truncate(alsos[i], 45));
706 if($(stype + '_' + alsos[i])) continue;
707 tree.addNode(stype + '_' + alsos[i],
708 stype + '_' + item, string, resultQuickLink(alsos[i],stype));