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'));
84 var lowHitsXRefLinkParent;
85 function resultLowHitXRef(r) {
87 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
88 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
90 var res = r.getResultObject();
93 if(arr && arr.length > 0) {
94 unHideMe($('low_hits_cross_ref'));
97 while( word = arr.shift() ) {
100 a[PARAM_TERM] = word;
101 var template = lowHitsXRefLink.cloneNode(true);
102 template.setAttribute('href',buildOPACLink(a));
103 template.appendChild(text(word));
104 lowHitsXRefLinkParent.appendChild(template);
105 lowHitsXRefLinkParent.appendChild(text(' '));
110 function resultZeroHits() {
111 unHideMe($('result_zero_hits_msg'));
112 resultExpandSearch();
113 resultSuggestSearchClass();
116 function resultExpandSearch() {
117 var top = findOrgDepth(globalOrgTree);
118 if(getDepth() == top) return;
119 unHideMe($('low_hits_expand_range'));
120 var par = $('low_hits_expand_link').parentNode;
121 var template = par.removeChild($('low_hits_expand_link'));
123 var bottom = getDepth();
124 while( top < bottom ) {
126 a[PARAM_DEPTH] = top;
127 var temp = template.cloneNode(true);
128 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
129 temp.setAttribute('href',buildOPACLink(a));
130 par.appendChild(temp);
135 function resultSuggestSearchClass() {
136 var stype = getStype();
137 if(stype == STYPE_KEYWORD) return;
139 unHideMe($('low_hits_search_type'));
140 if(stype != STYPE_TITLE) {
141 ref = $('low_hits_title_search');
143 a[PARAM_STYPE] = STYPE_TITLE;
144 ref.setAttribute('href',buildOPACLink(a));
146 if(stype != STYPE_AUTHOR) {
147 ref = $('low_hits_author_search');
149 a[PARAM_STYPE] = STYPE_AUTHOR;
150 ref.setAttribute('href',buildOPACLink(a));
152 if(stype != STYPE_SUBJECT) {
153 ref = $('low_hits_subject_search');
155 a[PARAM_STYPE] = STYPE_SUBJECT;
156 ref.setAttribute('href',buildOPACLink(a));
158 if(stype != STYPE_KEYWORD) {
159 ref = $('low_hits_keyword_search');
161 a[PARAM_STYPE] = STYPE_KEYWORD;
162 ref.setAttribute('href',buildOPACLink(a));
164 if(stype != STYPE_SERIES) {
165 ref = $('low_hits_series_search');
167 a[PARAM_STYPE] = STYPE_SERIES;
168 ref.setAttribute('href',buildOPACLink(a));
172 function resultSuggestSpelling(r) {
173 var res = r.getResultObject();
175 unHideMe($('did_you_mean'));
177 arg[PARAM_TERM] = res;
178 $('spell_check_link').setAttribute(
179 'href', buildOPACLink(arg) );
180 $('spell_check_link').appendChild(text(res));
185 function resultPaginate() {
188 if( !((o + getDisplayCount()) >= getHitCount()) ) {
191 args[PARAM_OFFSET] = o + getDisplayCount();
192 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
193 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
195 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
196 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
197 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
203 args[PARAM_OFFSET] = o - getDisplayCount();
204 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
205 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
207 args[PARAM_OFFSET] = 0;
208 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
209 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
211 if(getDisplayCount() < getHitCount())
212 unHideMe($('start_end_links_span'));
215 try{searchTimer.stop()}catch(e){}
219 /* display the record info in the record display table 'pos' is the
220 zero based position the record should have in the display table */
221 function resultDisplayRecord(rec, pos, is_mr) {
223 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
225 recordsCache.push(rec);
227 var r = table.rows[pos + 1];
230 var rank = parseFloat(ranks[pos + getOffset()]);
231 rank = ( rank / getTopRank() ) * 100;
232 rank = parseInt(rank) + "%";
233 var relspan = $n(r, "relevancy_span");
234 relspan.appendChild(text(rank));
235 unHideMe(relspan.parentNode);
238 var pic = $n(r, config.names.result.item_jacket);
239 pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
241 var title_link = $n(r, config.names.result.item_title);
242 var author_link = $n(r, config.names.result.item_author);
245 var onlyrec = onlyrecord[ getOffset() + pos ];
249 args[PARAM_OFFSET] = 0;
250 args[PARAM_RID] = onlyrec;
251 args[PARAM_MRID] = rec.doc_id();
252 pic.parentNode.setAttribute("href", buildOPACLink(args));
253 title_link.setAttribute("href", buildOPACLink(args));
254 title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
257 buildTitleLink(rec, title_link);
260 args[PARAM_OFFSET] = 0;
261 args[PARAM_MRID] = rec.doc_id();
262 pic.parentNode.setAttribute("href", buildOPACLink(args));
266 buildTitleDetailLink(rec, title_link);
269 args[PARAM_OFFSET] = 0;
270 args[PARAM_RID] = rec.doc_id();
271 pic.parentNode.setAttribute("href", buildOPACLink(args));
273 unHideMe($n(r,'place_hold_span'));
274 $n(r,'place_hold_link').setAttribute(
275 'href','javascript:holdsDrawWindow("'+rec.doc_id()+'");');
278 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
282 if(!isNull(rec.edition())) {
283 unHideMe( $n(r, "result_table_extra_span"));
284 $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
286 if(!isNull(rec.pubdate())) {
287 unHideMe( $n(r, "result_table_extra_span"));
288 unHideMe($n(r, "result_table_pub_span"));
289 $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
291 if(!isNull(rec.publisher()) ) {
292 unHideMe( $n(r, "result_table_extra_span"));
293 unHideMe($n(r, "result_table_pub_span"));
294 $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
298 resultBuildFormatIcons( r, rec );
302 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
304 if(resultPageIsDone()) {
306 /* hide the 'now loading...' message */
308 hideMe(G.ui.common.loading);
310 runEvt('result', 'allRecordsReceived', recordsCache);
314 function _resultFindRec(id) {
315 for( var i = 0; i != recordsCache.length; i++ ) {
316 var rec = recordsCache[i];
317 if( rec && rec.doc_id() == id )
324 var currentHoldRecord;
325 var holdsOrgSelectorBuilt = false;
326 function resultDrawHoldsWindow(recid) {
329 recid = currentHoldRecord;
330 if(recid == null) return;
332 currentHoldRecord = recid;
334 detachEvt('common','locationUpdated', resultSBSubmit );
335 attachEvt( "common", "locationUpdated", resultSBSubmit );
337 if(!(G.user && G.user.session)) {
339 detachEvt('common','locationUpdated', resultSBSubmit );
340 attachEvt('common','loggedIn', resultDrawHoldsWindow)
341 //alert(G.evt['common']['locationUpdated']);
343 //attachEvt( "common", "locationUpdated", resultSBSubmit );
346 swapCanvas($('holds_box'));
348 var rec = _resultFindRec(recid);
350 if(!holdsOrgSelectorBuilt) {
351 resultBuildHoldsSelector(null, 0);
352 holdsOrgSelectorBuilt = true;
355 removeChildren($('holds_title'));
356 removeChildren($('holds_author'));
357 removeChildren($('holds_format'));
358 removeChildren($('holds_email'));
359 removeChildren($('holds_email'));
361 $('holds_title').appendChild(text(rec.title()));
362 $('holds_author').appendChild(text(rec.author()));
364 for( var i in rec.types_of_resource() ) {
365 var res = rec.types_of_resource()[i];
366 var img = elem("img");
367 setResourcePic(img, res);
368 $('holds_format').appendChild(text(' '+res+' '));
369 $('holds_format').appendChild(img);
370 $('holds_format').appendChild(text(' '));
373 $('holds_phone').appendChild(text(G.user.day_phone()));
374 $('holds_email').appendChild(text(G.user.email()));
375 $('holds_cancel').onclick = showCanvas;
376 $('holds_submit').onclick = resultPlaceHold;
380 function resultBuildHoldsSelector(node, depth) {
383 node = globalOrgTree;
387 var selector = $('holds_org_selector');
388 var index = selector.options.length;
391 var pre = elem("pre");
392 for(var x=2; x <= findOrgType(node.ou_type()).depth(); x++) {
393 pre.appendChild(text(" "));
395 pre.appendChild(text(node.name()));
396 var select = new Option("", node.id());
397 selector.options[index] = select;
398 select.appendChild(pre);
401 var pad = (findOrgType(node.ou_type()).depth() - 1) * 12;
403 var select = new Option(node.name(), node.id());
404 select.setAttribute("style", "padding-left: "+pad+'px;');
405 selector.options[index] = select;
408 if( node.id() == getLocation() ) {
409 selector.selectedIndex = index;
410 selector.options[index].selected = true;
413 for( var i in node.children() ) {
414 var child = node.children()[i];
416 resultBuildHoldsSelector(child, depth+1);
421 function resultPlaceHold() {
422 var hold = new ahr();
423 hold.pickup_lib( 1 );
424 hold.requestor(G.user.id());
425 hold.usr(G.user.id());
427 hold.email_notify(G.user.email());
428 hold.phone_notify(G.user.day_phone());
429 hold.target(currentHoldRecord);
431 var req = new Request( CREATE_HOLD, G.user.session, hold );
433 var res = req.result();
438 alert('hold failed');
445 function resultBuildFormatIcons( row, rec ) {
447 var ress = rec.types_of_resource();
449 for( var i in ress ) {
452 var link = $n(row, res + "_link");
454 var img = link.getElementsByTagName("img")[0];
455 removeCSSClass( img, config.css.dim );
459 if( f == modsFormatToMARC(res) )
460 addCSSClass( img, "dim2_border");
465 args[PARAM_OFFSET] = 0;
466 args[PARAM_MRID] = rec.doc_id();
467 args[PARAM_FORM] = modsFormatToMARC(res);
469 link.setAttribute("href", buildOPACLink(args));
475 function resultPageIsDone(pos) {
476 return (recordsHandled == getDisplayCount()
477 || recordsHandled + getOffset() == getHitCount());
480 var resultCCHeaderApplied = false;
482 /* -------------------------------------------------------------------- */
483 /* dynamically add the copy count rows based on the org type 'countsrow'
484 is the row into which we will add TD's to hold the copy counts
485 This code generates copy count cells with an id of
486 'copy_count_cell_<depth>_<pagePosition>' */
487 function resultAddCopyCounts(rec, pagePosition) {
489 var r = table.rows[pagePosition + 1];
490 var countsrow = $n(r, config.names.result.counts_row );
491 var ccell = $n(countsrow, config.names.result.count_cell);
493 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
495 var type = findOrgType(node.ou_type());
496 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
497 ccell.title = type.opac_label();
498 //addCSSClass(ccell, config.css.result.cc_cell_even);
500 var lastcell = ccell;
501 var lastheadcell = null;
504 var ccheadcell = null;
505 if(!resultCCHeaderApplied) {
506 ccrow = $('result_thead_row');
507 ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell"));
508 var t = ccheadcell.cloneNode(true);
510 t.appendChild(text(type.opac_label()));
511 ccrow.appendChild(t);
512 resultCCHeaderApplied = true;
518 var d = findOrgDepth(nodes[1]);
519 var d2 = findOrgDepth(nodes[nodes.length -1]);
521 for( var i = d; i <= d2 ; i++ ) {
523 ccell = ccell.cloneNode(true);
525 //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
526 //else addCSSClass(ccell, "copy_count_cell_even");
528 var node = nodes[x++];
529 var type = findOrgType(node.ou_type());
531 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
532 ccell.title = type.opac_label();
533 countsrow.insertBefore(ccell, lastcell);
537 var t = ccheadcell.cloneNode(true);
538 t.appendChild(text(type.opac_label()));
539 ccrow.insertBefore(t, lastheadcell);
545 unHideMe($("search_info_table"));
548 /* collect copy counts for a record using method 'methodName' */
549 function resultCollectCopyCounts(rec, pagePosition, methodName) {
550 if(rec == null || rec.doc_id() == null) return;
551 var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
552 req.request.userdata = [ rec, pagePosition ];
553 req.callback(resultHandleCopyCounts);
557 function resultHandleCopyCounts(r) {
558 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
562 /* display the collected copy counts */
563 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
564 if(copy_counts == null || rec == null) return;
566 while(copy_counts[i] != null) {
567 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
569 var span = cell.getElementsByTagName("div")[0];
571 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
578 /* captures extraneous info from each record */
580 var subjectCache = {};
581 var authorCache = {};
582 var seriesCache = {};
584 function resultBuildCaches(records) {
585 for( var r in records ) {
586 var rec = records[r];
587 for( var s in rec.subject() )
588 subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
589 authorCache[rec.author()] = 1;
590 for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
594 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
595 function resultDrawSubjects() {
598 for( var s in subjectCache )
599 subjs.push( { sub : s, count : subjectCache[s] } );
600 subjs.sort(resultSortSubjects);
603 for( var s in subjs ) ss.push(subjs[s].sub);
605 resultDrawSidebarTrees(
607 "subjectSidebarTree", ss,
608 $("subject_tree_sidebar"),
609 $("subject_sidebar_tree_div") );
612 function resultDrawAuthors() {
613 var auths = new Array();
614 for( var s in authorCache ) auths.push(s);
616 resultDrawSidebarTrees(
618 "authorSidebarTree", auths.sort(),
619 $("author_tree_sidebar"),
620 $("author_sidebar_tree_div") );
623 function resultDrawSeries() {
624 var sers = new Array();
625 for( var s in seriesCache ) sers.push(s);
626 resultDrawSidebarTrees(
628 "seriesSidebarTree", sers.sort(),
629 $("series_tree_sidebar"),
630 $("series_sidebar_tree_div") );
633 function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) {
635 eval("tree = " + treeName);
639 for( var i in items ) {
641 if(isNull(items[i])) continue;
645 var item = normalize(truncate(items[i], 65));
648 var href = resultQuickLink( items[i], stype );
649 tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );
653 setTimeout('resultFireXRefReq("'+treeName+'","'+stype+'","'+item+'");',200);
655 if(!IE) resultFireXRefReq(treeName, stype, items[i]);
659 unHideMe(wrapperNode);
660 //tree.close(tree.rootid);
664 function resultFireXRefReq( treeName, stype, item ) {
666 eval('tree=' + treeName);
667 var req = new Request(FETCH_CROSSREF, stype, item);
668 req.request._tree = tree;
669 req.request._item = item;
670 req.request._stype = stype;
671 req.callback(resultAppendCrossRef);
676 function resultQuickLink( term, type ) {
679 args[PARAM_OFFSET] = 0;
680 args[PARAM_TERM] = term;
681 args[PARAM_STYPE] = type;
682 return buildOPACLink(args);
686 function resultAppendCrossRef(r) {
689 var stype = r._stype;
690 var result = r.getResultObject();
692 var froms = result['from'];
693 var alsos = result['also'];
697 for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
698 var string = normalize(truncate(froms[i], 45));
699 if($(stype + '_' + froms[i])) continue;
700 tree.addNode(stype + '_' + froms[i],
701 stype + '_' + item, string, resultQuickLink(froms[i],stype));
703 for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
704 var string = normalize(truncate(alsos[i], 45));
705 if($(stype + '_' + alsos[i])) continue;
706 tree.addNode(stype + '_' + alsos[i],
707 stype + '_' + item, string, resultQuickLink(alsos[i],stype));