started opac details page..
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / result_common.js
1
2 var recordsHandled = 0;
3 var recordsCache = [];
4
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);
10
11
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;
17 }
18
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() { 
22         var c;  
23         if( getDisplayCount() > (getHitCount() - getOffset()))  c = getHitCount();
24         else c = getDisplayCount() + getOffset();
25
26         var pages = getHitCount() / getDisplayCount();
27         if(pages % 1) pages = parseInt(pages) + 1;
28
29         G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
30         G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
31
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);
36 }
37
38
39 function resultPaginate() {
40         var o = getOffset();
41
42         if( !((o + getDisplayCount()) >= getHitCount()) ) {
43
44                 var args = {};
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);
48
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);
52         }
53
54         if( o > 0 ) {
55
56                 var args = {};
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);
60
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);
64         }
65 }
66
67
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) {
71
72         if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
73         recordsHandled++;
74         recordsCache.push(rec);
75
76         /* hide the 'now loading...' message */
77         hideMe(G.ui.common.loading);
78
79         var r = table.rows[pos];
80
81         var pic = findNodeByName(r, config.names.result.item_jacket);
82         pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
83
84         var title_link = findNodeByName(r, config.names.result.item_title);
85         var author_link = findNodeByName(r, config.names.result.item_author);
86
87         if( is_mr )  buildTitleLink(rec, title_link); 
88         else  buildTitleDetailLink(rec, title_link); 
89         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
90
91         findNodeByName(r, "result_table_title_cell").width = 
92                 100 - (orgNodeTrail(findOrgUnit(getLocation())).length * 8) + "%";
93
94         unHideMe(r);
95         
96         runEvt("result", "recordDrawn", rec.doc_id(), title_link);
97
98         if(resultPageIsDone()) 
99                 runEvt('result', 'allRecordsReceived', recordsCache);
100 }
101
102 function resultPageIsDone(pos) {
103         return (recordsHandled == getDisplayCount() 
104                 || recordsHandled + getOffset() == getHitCount());
105 }
106
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) {
113
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);
117
118         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
119         var node = nodes[0];
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);
124
125         var lastcell = ccell;
126
127         if(nodes[1]) {
128
129                 var x = 1;
130                 var d = findOrgDepth(nodes[1]);
131                 var d2 = findOrgDepth(nodes[nodes.length -1]);
132
133                 for( var i = d; i <= d2 ; i++ ) {
134         
135                         ccell = ccell.cloneNode(true);
136
137                         if((i % 2))
138                                 removeCSSClass(ccell, "copy_count_cell_even");
139                         else
140                                 addCSSClass(ccell, "copy_count_cell_even");
141
142                         var node = nodes[x++];
143                         var type = findOrgType(node.ou_type());
144         
145                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
146                         ccell.title = type.opac_label();
147                         countsrow.insertBefore(ccell, lastcell);
148                         lastcell = ccell;
149                 }
150         }
151 }
152
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);
159         req.send();
160 }
161
162 function resultHandleCopyCounts(r) {
163         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
164 }
165
166
167 /* display the collected copy counts */
168 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
169         if(copy_counts == null || rec == null) return;
170         var i = 0;
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));
174                 i++;
175         }
176 }
177
178
179 /* captures extraneous info from each record */
180
181 var subjectCache = {};
182 var authorCache = {};
183 var seriesCache = {};
184
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;
192         }
193 }
194
195 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
196 function resultDrawSubjects() {
197
198         var subjs = [];
199         for( var s in subjectCache )
200                 subjs.push( { sub : s, count : subjectCache[s] } );
201         subjs.sort(resultSortSubjects);
202
203         var ss = [];
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);
207 }
208
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);
214 }
215
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);
221 }
222
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);
227         var x = 0;
228         var newnode = template.cloneNode(true);
229         var found = false;
230         for( var i in items ) {
231                 if(isNull(items[i])) continue;
232                 if(x++ > 7) break;
233                 buildSearchLink(stype, items[i], findNodeByName(newnode, linkname), 100);
234                 parent.appendChild(newnode);
235                 newnode = template.cloneNode(true);
236                 found = true;
237         }
238         if(found) unHideMe(wrapperNode);
239 }
240
241
242
243
244