]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/result_common.js
6788a1d1dd2ed4a761fad11d5183e70785e20e62
[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(), getForm() );
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
333         resultDrawSidebarTrees( 
334                 STYPE_SUBJECT, 
335                 "subjectSidebarTree", ss, 
336                 getId("subject_tree_sidebar"), 
337                 getId("subject_sidebar_tree_div") );
338 }
339
340 function resultDrawAuthors() {
341         var auths = new Array();
342         for( var s in authorCache ) auths.push(s);
343
344         resultDrawSidebarTrees( 
345                 STYPE_AUTHOR, 
346                 "authorSidebarTree", auths.sort(), 
347                 getId("author_tree_sidebar"), 
348                 getId("author_sidebar_tree_div") );
349 }
350
351 function resultDrawSeries() {
352         var sers = new Array();
353         for( var s in seriesCache ) sers.push(s);
354         resultDrawSidebarTrees( 
355                 STYPE_SERIES, 
356                 "seriesSidebarTree", sers.sort(), 
357                 getId("series_tree_sidebar"), 
358                 getId("series_sidebar_tree_div") );
359 }
360
361 function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) {
362         var tree;
363         eval("tree = " + treeName);
364
365         var found = false;
366         var x = 0;
367         for( var i in items ) {
368
369                 if(isNull(items[i])) continue;
370                 if(x++ > 7) break;
371
372                 var item = normalize(truncate(items[i], 65));
373                 var trunc = 65;
374                 var args = {};
375                 var href = resultQuickLink( items[i], stype );
376                 tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );
377
378                 var req = new Request(FETCH_CROSSREF, stype, items[i]);
379                 req.request._tree = tree;
380                 req.request._item = items[i];
381                 req.request._stype = stype;
382                 req.callback(resultAppendCrossRef);
383                 req.send();     
384
385                 found = true;
386         }
387         if(found) unHideMe(wrapperNode);
388 }
389
390 function resultQuickLink( term, type ) {
391         var args = {};
392         args.page = MRESULT;
393         args[PARAM_OFFSET] = 0;
394         args[PARAM_TERM] = term;
395         args[PARAM_STYPE] = type;
396         return buildOPACLink(args);
397 }
398
399
400 function resultAppendCrossRef(r) {
401         var tree                = r._tree
402         var item                = r._item
403         var stype       = r._stype;
404         var result      = r.getResultObject();
405         var froms       = result['from'];
406         var alsos       = result['also'];
407
408         var total = 0;
409
410         for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
411                 var string = normalize(truncate(froms[i], 45));
412                 if(getId(stype + '_' + froms[i])) continue;
413                 tree.addNode(stype + '_' + froms[i], 
414                         stype + '_' + item, string, resultQuickLink(froms[i],stype));
415         }
416         for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
417                 var string = normalize(truncate(alsos[i], 45));
418                 if(getId(stype + '_' + alsos[i])) continue;
419                 tree.addNode(stype + '_' + alsos[i], 
420                         stype + '_' + item, string, resultQuickLink(alsos[i],stype));
421         }
422 }
423
424
425
426
427