new front 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);
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 /* do this after we have ID's so the rank for mr pages will be correct */
12 attachEvt("result", "preCollectRecords", resultPaginate);
13
14 /* returns the last 'index' postion ocurring in this page */
15 function resultFinalPageIndex() {
16         if(getHitCount() < (getOffset() + getDisplayCount())) 
17                 return getHitCount() - 1;
18         return getOffset() + getDisplayCount() - 1;
19 }
20
21 /* set the search result info, number of hits, which results we're 
22         displaying, links to the next/prev pages, etc. */
23 function resultSetHitInfo() { 
24         var c;  
25         if( getDisplayCount() > (getHitCount() - getOffset()))  c = getHitCount();
26         else c = getDisplayCount() + getOffset();
27
28         var pages = getHitCount() / getDisplayCount();
29         if(pages % 1) pages = parseInt(pages) + 1;
30
31         G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
32         G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
33
34         G.ui.result.offset_start.appendChild(text(getOffset() + 1));
35         G.ui.result.offset_end.appendChild(text(c));
36         G.ui.result.result_count.appendChild(text(getHitCount()));
37         unHideMe(G.ui.result.info);
38 }
39
40
41 function resultPaginate() {
42         var o = getOffset();
43
44         if( !((o + getDisplayCount()) >= getHitCount()) ) {
45
46                 var args = {};
47                 args[PARAM_OFFSET] = o + getDisplayCount();
48                 G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); 
49                 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
50
51                 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
52                 G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
53                 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
54         }
55
56         if( o > 0 ) {
57
58                 var args = {};
59                 args[PARAM_OFFSET] = o - getDisplayCount();
60                 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); 
61                 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
62
63                 args[PARAM_OFFSET] = 0;
64                 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); 
65                 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
66         }
67 }
68
69
70 /* display the record info in the record display table 'pos' is the 
71                 zero based position the record should have in the display table */
72 function resultDisplayRecord(rec, pos, is_mr) {
73
74         if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
75         recordsHandled++;
76         recordsCache.push(rec);
77
78         var r = table.rows[pos + 1];
79         
80         try {
81                 var rank = parseFloat(ranks[pos + getOffset()]);
82                 rank = ( rank / getTopRank() ) * 100;
83                 rank = parseInt(rank) + "%";
84                 var relspan = findNodeByName(r, "relevancy_span");
85                 relspan.appendChild(text(rank));
86                 unHideMe(relspan.parentNode);
87         } catch(e){ }
88
89         var pic = findNodeByName(r, config.names.result.item_jacket);
90         pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
91
92         var title_link = findNodeByName(r, config.names.result.item_title);
93         var author_link = findNodeByName(r, config.names.result.item_author);
94
95         if( is_mr )  {
96                 var onlyrec = onlyrecord[ getOffset() + pos ];
97                 if(onlyrec) {
98                         /*
99                         var id = rec.doc_id();
100                         rec.doc_id(onlyrec);
101                         buildTitleDetailLink(rec, title_link); 
102                         rec.doc_id(id);
103                         */
104
105                         var args = {};
106                         args.page = RDETAIL;
107                         args[PARAM_OFFSET] = 0;
108                         args[PARAM_RID] = onlyrec;
109                         args[PARAM_MRID] = rec.doc_id();
110                         pic.parentNode.setAttribute("href", buildOPACLink(args));
111                         title_link.setAttribute("href", buildOPACLink(args));
112                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
113                         
114                 } else {
115                         buildTitleLink(rec, title_link); 
116                         var args = {};
117                         args.page = RRESULT;
118                         args[PARAM_OFFSET] = 0;
119                         args[PARAM_MRID] = rec.doc_id();
120                         pic.parentNode.setAttribute("href", buildOPACLink(args));
121                 }
122
123         } else {
124                 buildTitleDetailLink(rec, title_link); 
125                 var args = {};
126                 args.page = RDETAIL;
127                 args[PARAM_OFFSET] = 0;
128                 args[PARAM_RID] = rec.doc_id();
129                 pic.parentNode.setAttribute("href", buildOPACLink(args));
130         }
131
132         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
133
134         if(! is_mr ) {
135         
136                 if(!isNull(rec.edition()))      {
137                         unHideMe( findNodeByName(r, "result_table_extra_span"));
138                         findNodeByName(r, "result_table_edition_span").appendChild( text( rec.edition()) );
139                 }
140                 if(!isNull(rec.pubdate())) {
141                         unHideMe( findNodeByName(r, "result_table_extra_span"));
142                         unHideMe(findNodeByName(r, "result_table_pub_span"));
143                         findNodeByName(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
144                 }
145                 if(!isNull(rec.publisher()) ) {
146                         unHideMe( findNodeByName(r, "result_table_extra_span"));
147                         unHideMe(findNodeByName(r, "result_table_pub_span"));
148                         findNodeByName(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
149                 }
150         }
151
152         resultBuildFormatIcons( r, rec );
153
154         unHideMe(r);
155         
156         runEvt("result", "recordDrawn", rec.doc_id(), title_link);
157
158         if(resultPageIsDone())  {
159                 /* hide the 'now loading...' message */
160                 hideMe(G.ui.common.loading);
161                 runEvt('result', 'allRecordsReceived', recordsCache);
162         }
163 }
164
165 function resultBuildFormatIcons( row, rec ) {
166
167         var ress = rec.types_of_resource();
168
169         for( var i in ress ) {
170
171                 var res = ress[i];
172                 var link = findNodeByName(row, res + "_link");
173                 link.title = res;
174                 var img = link.getElementsByTagName("img")[0];
175                 removeCSSClass( img, config.css.dim );
176
177                 var f = getForm();
178                 if( f != "all" ) {
179                         /*
180                         if( f != modsFormatToMARC(res) ) 
181                                 addCSSClass( img, config.css.dim2);
182                         else
183                                 addCSSClass( img, "dim2_border");
184                                 */
185                         if( f == modsFormatToMARC(res) ) 
186                                 addCSSClass( img, "dim2_border");
187                 }
188
189
190                 var args = {};
191                 args.page = RRESULT;
192                 args[PARAM_OFFSET] = 0;
193                 args[PARAM_MRID] = rec.doc_id();
194                 args[PARAM_FORM] = modsFormatToMARC(res);
195
196                 link.setAttribute("href", buildOPACLink(args));
197
198         }
199
200 }
201
202
203 function resultPageIsDone(pos) {
204         return (recordsHandled == getDisplayCount() 
205                 || recordsHandled + getOffset() == getHitCount());
206 }
207
208 var resultCCHeaderApplied = false;
209
210 /* -------------------------------------------------------------------- */
211 /* dynamically add the copy count rows based on the org type 'countsrow' 
212         is the row into which we will add TD's to hold the copy counts 
213         This code generates copy count cells with an id of
214         'copy_count_cell_<depth>_<pagePosition>'  */
215 function resultAddCopyCounts(rec, pagePosition) {
216
217         var r = table.rows[pagePosition + 1];
218         var countsrow = findNodeByName(r, config.names.result.counts_row );
219         var ccell = findNodeByName(countsrow, config.names.result.count_cell);
220
221         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
222         var node = nodes[0];
223         var type = findOrgType(node.ou_type());
224         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
225         ccell.title = type.opac_label();
226         //addCSSClass(ccell, config.css.result.cc_cell_even);
227
228         var lastcell = ccell;
229         var lastheadcell = null;
230
231         var cchead = null;
232         var ccheadcell = null;
233         if(!resultCCHeaderApplied) {
234                 ccrow = getId('result_thead_row');
235                 ccheadcell =  ccrow.removeChild(findNodeByName(ccrow, "result_thead_ccell"));
236                 var t = ccheadcell.cloneNode(true);
237                 lastheadcell = t;
238                 t.appendChild(text(type.opac_label()));
239                 ccrow.appendChild(t);
240                 resultCCHeaderApplied = true;
241         }
242
243         if(nodes[1]) {
244
245                 var x = 1;
246                 var d = findOrgDepth(nodes[1]);
247                 var d2 = findOrgDepth(nodes[nodes.length -1]);
248
249                 for( var i = d; i <= d2 ; i++ ) {
250         
251                         ccell = ccell.cloneNode(true);
252
253                         //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
254                         //else addCSSClass(ccell, "copy_count_cell_even");
255
256                         var node = nodes[x++];
257                         var type = findOrgType(node.ou_type());
258         
259                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
260                         ccell.title = type.opac_label();
261                         countsrow.insertBefore(ccell, lastcell);
262                         lastcell = ccell;
263
264                         if(ccheadcell) {
265                                 var t = ccheadcell.cloneNode(true);
266                                 t.appendChild(text(type.opac_label()));
267                                 ccrow.insertBefore(t, lastheadcell);
268                                 lastheadcell = t;
269                         }
270                 }
271         }
272
273         unHideMe(getId("search_info_table"));
274 }
275
276 /* collect copy counts for a record using method 'methodName' */
277 function resultCollectCopyCounts(rec, pagePosition, methodName) {
278         if(rec == null || rec.doc_id() == null) return;
279         var req = new Request(methodName, getLocation(), rec.doc_id() );
280         req.request.userdata = [ rec, pagePosition ];
281         req.callback(resultHandleCopyCounts);
282         req.send();
283 }
284
285 function resultHandleCopyCounts(r) {
286         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
287 }
288
289
290 /* display the collected copy counts */
291 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
292         if(copy_counts == null || rec == null) return;
293         var i = 0;
294         while(copy_counts[i] != null) {
295                 var cell = getId("copy_count_cell_" + i +"_" + pagePosition);
296                 /*
297                 var span = cell.getElementsByTagName("div")[0];
298                 */
299                 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
300
301                 i++;
302         }
303 }
304
305
306 /* captures extraneous info from each record */
307
308 var subjectCache = {};
309 var authorCache = {};
310 var seriesCache = {};
311
312 function resultBuildCaches(records) {
313         for( var r in records ) {
314                 var rec = records[r];
315                 for( var s in rec.subject() ) 
316                         subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
317                 authorCache[rec.author()] = 1;
318                 for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
319         }
320 }
321
322 function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
323 function resultDrawSubjects() {
324
325         var subjs = [];
326         for( var s in subjectCache )
327                 subjs.push( { sub : s, count : subjectCache[s] } );
328         subjs.sort(resultSortSubjects);
329
330         var ss = [];
331         for( var s in subjs ) ss.push(subjs[s].sub);
332         resultDrawSidebarStuff(STYPE_SUBJECT, G.ui.sidebar.subject_item,  
333                 config.names.sidebar.subject_item, ss, G.ui.sidebar.subject);
334 }
335
336 function resultDrawAuthors() {
337         var auths = new Array();
338         for( var s in authorCache ) auths.push(s);
339         resultDrawSidebarStuff(STYPE_AUTHOR, G.ui.sidebar.author_item,  
340                 config.names.sidebar.author_item, auths.sort(), G.ui.sidebar.author);
341 }
342
343 function resultDrawSeries() {
344         var sers = new Array();
345         for( var s in seriesCache ) sers.push(s);
346         resultDrawSidebarStuff(STYPE_SERIES, G.ui.sidebar.series_item,  
347                 config.names.sidebar.series_item, sers.sort(), G.ui.sidebar.series);
348 }
349
350 /* search type, template node, href link name, array of text, node to unhide */
351 function resultDrawSidebarStuff(stype, node, linkname, items, wrapperNode) {
352         var parent = node.parentNode;
353         var template = parent.removeChild(node);
354         var x = 0;
355         var newnode = template.cloneNode(true);
356         var found = false;
357         for( var i in items ) {
358                 if(isNull(items[i])) continue;
359                 if(x++ > 7) break;
360                 buildSearchLink(stype, items[i], findNodeByName(newnode, linkname), 100);
361                 parent.appendChild(newnode);
362                 newnode = template.cloneNode(true);
363                 found = true;
364         }
365         if(found) unHideMe(wrapperNode);
366 }
367
368
369
370
371