2 var recordsHandled = 0;
5 /* set up the event handlers */
6 G.evt.result.hitCountReceived.push(resultSetHitInfo, resultPaginate);
7 G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
8 G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
9 G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, resultDrawAuthors, resultDrawSeries);
12 /* returns the last 'index' postion ocurring in this page */
13 function resultFinalPageIndex() {
14 if(getHitCount() < (getOffset() + getDisplayCount()))
15 return getHitCount() - 1;
16 return getOffset() + getDisplayCount() - 1;
19 /* set the search result info, number of hits, which results we're
20 displaying, links to the next/prev pages, etc. */
21 function resultSetHitInfo() {
23 if( getDisplayCount() > (getHitCount() - getOffset())) c = getHitCount();
24 else c = getDisplayCount() + getOffset();
26 var pages = getHitCount() / getDisplayCount();
27 if(pages % 1) pages = parseInt(pages) + 1;
29 G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
30 G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
32 G.ui.result.offset_start.appendChild(text(getOffset() + 1));
33 G.ui.result.offset_end.appendChild(text(c));
34 G.ui.result.result_count.appendChild(text(getHitCount()));
35 unHideMe(G.ui.result.info);
39 function resultPaginate() {
42 if( !((o + getDisplayCount()) >= getHitCount()) ) {
45 args[PARAM_OFFSET] = o + getDisplayCount();
46 G.ui.result.next_link.setAttribute("href", buildOPACLink(args));
47 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
49 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
50 G.ui.result.end_link.setAttribute("href", buildOPACLink(args));
51 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
57 args[PARAM_OFFSET] = o - getDisplayCount();
58 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args));
59 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
61 args[PARAM_OFFSET] = 0;
62 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args));
63 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
68 /* display the record info in the record display table 'pos' is the
69 zero based position the record should have in the display table */
70 function resultDisplayRecord(rec, pos, is_mr) {
72 if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
74 recordsCache.push(rec);
76 /* hide the 'now loading...' message */
77 hideMe(G.ui.common.loading);
79 var r = table.rows[pos];
81 var pic = findNodeByName(r, config.names.result.item_jacket);
82 pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
84 var title_link = findNodeByName(r, config.names.result.item_title);
85 var author_link = findNodeByName(r, config.names.result.item_author);
87 if( is_mr ) buildTitleLink(rec, title_link);
88 else buildTitleDetailLink(rec, title_link);
89 buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
91 findNodeByName(r, "result_table_title_cell").width =
92 100 - (orgNodeTrail(findOrgUnit(getLocation())).length * 8) + "%";
96 runEvt("result", "recordDrawn", rec.doc_id(), title_link);
98 if(resultPageIsDone())
99 runEvt('result', 'allRecordsReceived', recordsCache);
102 function resultPageIsDone(pos) {
103 return (recordsHandled == getDisplayCount()
104 || recordsHandled + getOffset() == getHitCount());
107 /* -------------------------------------------------------------------- */
108 /* dynamically add the copy count rows based on the org type 'countsrow'
109 is the row into which we will add TD's to hold the copy counts
110 This code generates copy count cells with an id of
111 'copy_count_cell_<depth>_<pagePosition>' */
112 function resultAddCopyCounts(rec, pagePosition) {
114 var r = table.rows[pagePosition];
115 var countsrow = findNodeByName(r, config.names.result.counts_row );
116 var ccell = findNodeByName(countsrow, config.names.result.count_cell);
118 var nodes = orgNodeTrail(findOrgUnit(getLocation()));
120 var type = findOrgType(node.ou_type());
121 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
122 ccell.title = type.opac_label();
123 addCSSClass(ccell, config.css.result.cc_cell_even);
125 var lastcell = ccell;
130 var d = findOrgDepth(nodes[1]);
131 var d2 = findOrgDepth(nodes[nodes.length -1]);
133 for( var i = d; i <= d2 ; i++ ) {
135 ccell = ccell.cloneNode(true);
138 removeCSSClass(ccell, "copy_count_cell_even");
140 addCSSClass(ccell, "copy_count_cell_even");
142 var node = nodes[x++];
143 var type = findOrgType(node.ou_type());
145 ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
146 ccell.title = type.opac_label();
147 countsrow.insertBefore(ccell, lastcell);
153 /* collect copy counts for a record using method 'methodName' */
154 function resultCollectCopyCounts(rec, pagePosition, methodName) {
155 if(rec == null || rec.doc_id() == null) return;
156 var req = new Request(methodName, getLocation(), rec.doc_id() );
157 req.request.userdata = [ rec, pagePosition ];
158 req.callback(resultHandleCopyCounts);
162 function resultHandleCopyCounts(r) {
163 runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject());
167 /* display the collected copy counts */
168 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
169 if(copy_counts == null || rec == null) return;
171 while(copy_counts[i] != null) {
172 var cell = getId("copy_count_cell_" + i +"_" + pagePosition);
173 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
179 /* captures extraneous info from each record */
181 var subjectCache = {};
182 var authorCache = {};
183 var seriesCache = {};
185 function resultBuildCaches(records) {
186 for( var r in records ) {
187 var rec = records[r];
188 for( var s in rec.subject() )
189 subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
190 authorCache[rec.author()] = 1;
191 for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
195 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
196 function resultDrawSubjects() {
199 for( var s in subjectCache )
200 subjs.push( { sub : s, count : subjectCache[s] } );
201 subjs.sort(resultSortSubjects);
204 for( var s in subjs ) ss.push(subjs[s].sub);
205 resultDrawSidebarStuff(STYPE_SUBJECT, G.ui.sidebar.subject_item,
206 config.names.sidebar.subject_item, ss, G.ui.sidebar.subject);
209 function resultDrawAuthors() {
210 var auths = new Array();
211 for( var s in authorCache ) auths.push(s);
212 resultDrawSidebarStuff(STYPE_AUTHOR, G.ui.sidebar.author_item,
213 config.names.sidebar.author_item, auths.sort(), G.ui.sidebar.author);
216 function resultDrawSeries() {
217 var sers = new Array();
218 for( var s in seriesCache ) sers.push(s);
219 resultDrawSidebarStuff(STYPE_SERIES, G.ui.sidebar.series_item,
220 config.names.sidebar.series_item, sers.sort(), G.ui.sidebar.series);
223 /* search type, template node, href link name, array of text, node to unhide */
224 function resultDrawSidebarStuff(stype, node, linkname, items, wrapperNode) {
225 var parent = node.parentNode;
226 var template = parent.removeChild(node);
228 var newnode = template.cloneNode(true);
230 for( var i in items ) {
231 if(isNull(items[i])) continue;
233 buildSearchLink(stype, items[i], findNodeByName(newnode, linkname), 100);
234 parent.appendChild(newnode);
235 newnode = template.cloneNode(true);
238 if(found) unHideMe(wrapperNode);