1d42024f8eec391a77ac608035d543920548ada6
[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                 found = true;
372
373                 var item = normalize(truncate(items[i], 65));
374                 var trunc = 65;
375                 var args = {};
376                 var href = resultQuickLink( items[i], stype );
377                 tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );
378
379                 /*
380                 if(!IE)
381                         setTimeout('resultFireXRefReq("'+treeName+'","'+stype+'","'+item+'");',200);
382                         */
383                 if(!IE) resultFireXRefReq(treeName, stype, items[i]);
384         }
385
386         if(found) {
387                 unHideMe(wrapperNode);
388                 //tree.close(tree.rootid);
389         }
390 }
391
392 function resultFireXRefReq( treeName, stype, item ) {
393         var tree;
394         eval('tree=' + treeName);
395         var req = new Request(FETCH_CROSSREF, stype, item);
396         req.request._tree = tree;
397         req.request._item = item;
398         req.request._stype = stype;
399         req.callback(resultAppendCrossRef);
400         req.send();
401 }
402
403
404 function resultQuickLink( term, type ) {
405         var args = {};
406         args.page = MRESULT;
407         args[PARAM_OFFSET] = 0;
408         args[PARAM_TERM] = term;
409         args[PARAM_STYPE] = type;
410         return buildOPACLink(args);
411 }
412
413
414 function resultAppendCrossRef(r) {
415         var tree                = r._tree
416         var item                = r._item
417         var stype       = r._stype;
418         var result      = r.getResultObject();
419         var froms       = result['from'];
420         var alsos       = result['also'];
421
422         var total = 0;
423
424         for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
425                 var string = normalize(truncate(froms[i], 45));
426                 if(getId(stype + '_' + froms[i])) continue;
427                 tree.addNode(stype + '_' + froms[i], 
428                         stype + '_' + item, string, resultQuickLink(froms[i],stype));
429         }
430         for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
431                 var string = normalize(truncate(alsos[i], 45));
432                 if(getId(stype + '_' + alsos[i])) continue;
433                 tree.addNode(stype + '_' + alsos[i], 
434                         stype + '_' + item, string, resultQuickLink(alsos[i],stype));
435         }
436 }
437
438
439
440
441