]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/result_common.js
a2b63488c30c83e001b4fac7c19d86f9eaafbbe8
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / result_common.js
1
2 var recordsHandled = 0;
3 var recordsCache = [];
4 var lowHitCount = 4;
5
6 /* set up the event handlers */
7 G.evt.result.hitCountReceived.push(resultSetHitInfo);
8 G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);
9 G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);
10 G.evt.result.allRecordsReceived.push(resultBuildCaches, resultDrawSubjects, resultDrawAuthors, resultDrawSeries);
11 //G.evt.result.allRecordsReceived.push(resultBuildCaches );
12
13 attachEvt('result','lowHits',resultLowHits);
14 attachEvt('result','zeroHits',resultZeroHits);
15
16 attachEvt( "common", "locationUpdated", resultSBSubmit );
17 function resultSBSubmit(){searchBarSubmit();}
18
19 /* do this after we have ID's so the rank for mr pages will be correct */
20 attachEvt("result", "preCollectRecords", resultPaginate);
21
22 /* returns the last 'index' postion ocurring in this page */
23 function resultFinalPageIndex() {
24         if(getHitCount() < (getOffset() + getDisplayCount())) 
25                 return getHitCount() - 1;
26         return getOffset() + getDisplayCount() - 1;
27 }
28
29 /* set the search result info, number of hits, which results we're 
30         displaying, links to the next/prev pages, etc. */
31 function resultSetHitInfo() { 
32
33         try{searchTimer.stop()}catch(e){}
34
35         if( findCurrentPage() == MRESULT ) {
36                 if(getHitCount() <= lowHitCount && getTerm())
37                         runEvt('result', 'lowHits');
38                 if(getHitCount() == 0) {
39                         runEvt('result', 'zeroHits');
40                         return;
41                 }
42         }
43
44         var c;  
45         if( getDisplayCount() > (getHitCount() - getOffset()))  c = getHitCount();
46         else c = getDisplayCount() + getOffset();
47
48         var pages = getHitCount() / getDisplayCount();
49         if(pages % 1) pages = parseInt(pages) + 1;
50
51         G.ui.result.current_page.appendChild(text( (getOffset()/getDisplayCount()) + 1));
52         G.ui.result.num_pages.appendChild(text(pages + ")")); /* the ) is dumb */
53
54         G.ui.result.offset_start.appendChild(text(getOffset() + 1));
55         G.ui.result.offset_end.appendChild(text(c));
56         G.ui.result.result_count.appendChild(text(getHitCount()));
57         unHideMe(G.ui.result.info);
58 }
59
60 function resultLowHits() {
61         showCanvas();
62         unHideMe($('result_low_hits'));
63         if(getHitCount() > 0)
64                 unHideMe($('result_low_hits_msg'));
65
66         var sreq = new Request(CHECK_SPELL, getTerm());
67         sreq.callback(resultSuggestSpelling);
68         sreq.send();
69
70         var words = getTerm().split(' ');
71         var word;
72         while( word = words.shift() ) {
73                 var areq = new Request(FETCH_CROSSREF, getStype(), getTerm() );
74                 areq.callback(resultLowHitXRef);
75                 areq.send();
76         }
77
78         if( !(getForm() == null || getForm() == 'all' || getForm == "") ) {
79                 var a = {};
80                 a[PARAM_FORM] = "all";
81                 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));
82                 unHideMe($('low_hits_remove_format'));
83         }
84
85         resultSuggestSearchClass();
86 }
87
88 var lowHitsXRefLink;
89 var lowHitsXRefLinkParent;
90 function resultLowHitXRef(r) {
91         if(!lowHitsXRefLink){
92                 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;
93                 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));
94         }
95         var res = r.getResultObject();
96         var arr = res.from;
97         arr.concat(res.also);
98         if(arr && arr.length > 0) {
99                 unHideMe($('low_hits_cross_ref'));
100                 var word;
101                 var c = 0;
102                 while( word = arr.shift() ) {
103                         if(c++ > 20) break;
104                         var a = {};
105                         a[PARAM_TERM] = word;
106                         var template = lowHitsXRefLink.cloneNode(true);
107                         template.setAttribute('href',buildOPACLink(a));
108                         template.appendChild(text(word));
109                         lowHitsXRefLinkParent.appendChild(template);
110                         lowHitsXRefLinkParent.appendChild(text(' '));
111                 }
112         }
113 }
114
115 function resultZeroHits() {
116         showCanvas();
117         unHideMe($('result_low_hits'));
118         unHideMe($('result_zero_hits_msg'));
119         if(getTerm()) resultExpandSearch(); /* advanced search */
120 }
121
122 function resultExpandSearch() {
123         var top = findOrgDepth(globalOrgTree);
124         if(getDepth() == top) return;
125         unHideMe($('low_hits_expand_range'));
126         var par = $('low_hits_expand_link').parentNode;
127         var template = par.removeChild($('low_hits_expand_link'));
128
129         var bottom = getDepth();
130         while( top < bottom ) {
131                 var a = {};
132                 a[PARAM_DEPTH] = top;
133                 var temp = template.cloneNode(true);
134                 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))
135                 temp.setAttribute('href',buildOPACLink(a));
136                 par.appendChild(temp);
137                 top++;
138         }
139 }
140
141 function resultSuggestSearchClass() {
142         var stype = getStype();
143         if(stype == STYPE_KEYWORD) return;
144         var a = {}; var ref;
145         unHideMe($('low_hits_search_type'));
146         if(stype != STYPE_TITLE) {
147                 ref = $('low_hits_title_search');
148                 unHideMe(ref);
149                 a[PARAM_STYPE] = STYPE_TITLE;
150                 ref.setAttribute('href',buildOPACLink(a));
151         }
152         if(stype != STYPE_AUTHOR) {
153                 ref = $('low_hits_author_search');
154                 unHideMe(ref);
155                 a[PARAM_STYPE] = STYPE_AUTHOR;
156                 ref.setAttribute('href',buildOPACLink(a));
157         }
158         if(stype != STYPE_SUBJECT) {
159                 ref = $('low_hits_subject_search');
160                 unHideMe(ref);
161                 a[PARAM_STYPE] = STYPE_SUBJECT;
162                 ref.setAttribute('href',buildOPACLink(a));
163         }
164         if(stype != STYPE_KEYWORD) {
165                 ref = $('low_hits_keyword_search');
166                 unHideMe(ref);
167                 a[PARAM_STYPE] = STYPE_KEYWORD;
168                 ref.setAttribute('href',buildOPACLink(a));
169         }
170         if(stype != STYPE_SERIES) {
171                 ref = $('low_hits_series_search');
172                 unHideMe(ref);
173                 a[PARAM_STYPE] = STYPE_SERIES;
174                 ref.setAttribute('href',buildOPACLink(a));
175         }
176 }
177
178 function resultSuggestSpelling(r) {
179         var res = r.getResultObject();
180         if(res) {
181                 unHideMe($('did_you_mean'));
182                 var arg = {};
183                 arg[PARAM_TERM] = res;
184                 $('spell_check_link').setAttribute(
185                         'href', buildOPACLink(arg) );
186                 $('spell_check_link').appendChild(text(res));
187         }
188 }
189
190
191 function resultPaginate() {
192         var o = getOffset();
193
194         if( !((o + getDisplayCount()) >= getHitCount()) ) {
195
196                 var args = {};
197                 args[PARAM_OFFSET]      = o + getDisplayCount();
198                 args[PARAM_SORT]                = SORT;
199                 args[PARAM_SORT_DIR] = SORT_DIR;
200                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
201
202                 G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); 
203                 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);
204
205                 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());
206                 G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
207                 addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
208         }
209
210         if( o > 0 ) {
211
212                 var args = {};
213                 args[PARAM_SORT]                = SORT;
214                 args[PARAM_SORT_DIR] = SORT_DIR;
215                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);
216
217                 args[PARAM_OFFSET] = o - getDisplayCount();
218                 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); 
219                 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);
220
221                 args[PARAM_OFFSET] = 0;
222                 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); 
223                 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);
224         }
225         if(getDisplayCount() < getHitCount())
226                 unHideMe($('start_end_links_span'));
227
228         showCanvas();
229         try{searchTimer.stop()}catch(e){}
230 }
231
232
233 /* display the record info in the record display table 'pos' is the 
234                 zero based position the record should have in the display table */
235 function resultDisplayRecord(rec, pos, is_mr) {
236
237         if(rec == null) rec = new mvr(); /* so the page won't die if there was an error */
238         recordsHandled++;
239         recordsCache.push(rec);
240
241         var r = table.rows[pos + 1];
242         
243         try {
244                 var rank = parseFloat(ranks[pos + getOffset()]);
245                 rank            = parseInt( rank * 100 );
246                 var relspan = $n(r, "relevancy_span");
247                 relspan.appendChild(text(rank));
248                 unHideMe(relspan.parentNode);
249         } catch(e){ }
250
251         var pic = $n(r, config.names.result.item_jacket);
252         pic.setAttribute("src", buildISBNSrc(cleanISBN(rec.isbn())));
253
254         var title_link = $n(r, config.names.result.item_title);
255         var author_link = $n(r, config.names.result.item_author);
256
257         if( is_mr )  {
258                 var onlyrec = onlyrecord[ getOffset() + pos ];
259                 if(onlyrec) {
260                         var args = {};
261                         args.page = RDETAIL;
262                         args[PARAM_OFFSET] = 0;
263                         args[PARAM_RID] = onlyrec;
264                         args[PARAM_MRID] = rec.doc_id();
265                         pic.parentNode.setAttribute("href", buildOPACLink(args));
266                         title_link.setAttribute("href", buildOPACLink(args));
267                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));
268                         
269                 } else {
270                         buildTitleLink(rec, title_link); 
271                         var args = {};
272                         args.page = RRESULT;
273                         args[PARAM_OFFSET] = 0;
274                         args[PARAM_MRID] = rec.doc_id();
275                         pic.parentNode.setAttribute("href", buildOPACLink(args));
276                 }
277
278         } else {
279                 buildTitleDetailLink(rec, title_link); 
280                 var args = {};
281                 args.page = RDETAIL;
282                 args[PARAM_OFFSET] = 0;
283                 args[PARAM_RID] = rec.doc_id();
284                 pic.parentNode.setAttribute("href", buildOPACLink(args));
285
286                 unHideMe($n(r,'place_hold_span'));
287                 $n(r,'place_hold_link').setAttribute(
288                         'href','javascript:holdsDrawWindow("'+rec.doc_id()+'");');
289         }
290
291         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
292
293         if(! is_mr ) {
294         
295                 if(!isNull(rec.edition()))      {
296                         unHideMe( $n(r, "result_table_extra_span"));
297                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );
298                 }
299                 if(!isNull(rec.pubdate())) {
300                         unHideMe( $n(r, "result_table_extra_span"));
301                         unHideMe($n(r, "result_table_pub_span"));
302                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));
303                 }
304                 if(!isNull(rec.publisher()) ) {
305                         unHideMe( $n(r, "result_table_extra_span"));
306                         unHideMe($n(r, "result_table_pub_span"));
307                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));
308                 }
309         }
310
311         resultBuildFormatIcons( r, rec, is_mr );
312
313         unHideMe(r);
314         
315         runEvt("result", "recordDrawn", rec.doc_id(), title_link);
316
317         if(resultPageIsDone())  {
318                 //showCanvas();
319                 /* hide the 'now loading...' message */
320                 /*
321                 hideMe(G.ui.common.loading);
322                 */
323                 runEvt('result', 'allRecordsReceived', recordsCache);
324         }
325 }
326
327 function _resultFindRec(id) {
328         for( var i = 0; i != recordsCache.length; i++ ) {
329                 var rec = recordsCache[i];
330                 if( rec && rec.doc_id() == id )
331                         return rec;
332         }
333         return null;
334 }
335
336
337 function resultBuildFormatIcons( row, rec, is_mr ) {
338
339         var ress = rec.types_of_resource();
340
341         for( var i in ress ) {
342
343                 var res = ress[i];
344                 var link = $n(row, res + "_link");
345                 link.title = res;
346                 var img = link.getElementsByTagName("img")[0];
347                 removeCSSClass( img, config.css.dim );
348
349                 var f = getForm();
350                 if( f != "all" ) {
351                         if( f == modsFormatToMARC(res) ) 
352                                 addCSSClass( img, "dim2_border");
353                 }
354
355                 var args = {};
356                 args[PARAM_OFFSET] = 0;
357                 args[PARAM_FORM] = modsFormatToMARC(res);
358
359                 if(is_mr) {
360                         args.page = RRESULT;
361                         args[PARAM_MRID] = rec.doc_id();
362                 } else {
363                         args.page = RDETAIL
364                         args[PARAM_RID] = rec.doc_id();
365                 }
366
367                 link.setAttribute("href", buildOPACLink(args));
368
369         }
370 }
371
372
373 function resultPageIsDone(pos) {
374         return (recordsHandled == getDisplayCount() 
375                 || recordsHandled + getOffset() == getHitCount());
376 }
377
378 var resultCCHeaderApplied = false;
379
380 /* -------------------------------------------------------------------- */
381 /* dynamically add the copy count rows based on the org type 'countsrow' 
382         is the row into which we will add TD's to hold the copy counts 
383         This code generates copy count cells with an id of
384         'copy_count_cell_<depth>_<pagePosition>'  */
385 function resultAddCopyCounts(rec, pagePosition) {
386
387         var r = table.rows[pagePosition + 1];
388         var countsrow = $n(r, config.names.result.counts_row );
389         var ccell = $n(countsrow, config.names.result.count_cell);
390
391         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
392         var node = nodes[0];
393         var type = findOrgType(node.ou_type());
394         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
395         ccell.title = type.opac_label();
396         //addCSSClass(ccell, config.css.result.cc_cell_even);
397
398         var lastcell = ccell;
399         var lastheadcell = null;
400
401         var cchead = null;
402         var ccheadcell = null;
403         if(!resultCCHeaderApplied) {
404                 ccrow = $('result_thead_row');
405                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));
406                 var t = ccheadcell.cloneNode(true);
407                 lastheadcell = t;
408                 t.appendChild(text(type.opac_label()));
409                 ccrow.appendChild(t);
410                 resultCCHeaderApplied = true;
411         }
412
413         if(nodes[1]) {
414
415                 var x = 1;
416                 var d = findOrgDepth(nodes[1]);
417                 var d2 = findOrgDepth(nodes[nodes.length -1]);
418
419                 for( var i = d; i <= d2 ; i++ ) {
420         
421                         ccell = ccell.cloneNode(true);
422
423                         //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
424                         //else addCSSClass(ccell, "copy_count_cell_even");
425
426                         var node = nodes[x++];
427                         var type = findOrgType(node.ou_type());
428         
429                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
430                         ccell.title = type.opac_label();
431                         countsrow.insertBefore(ccell, lastcell);
432                         lastcell = ccell;
433
434                         if(ccheadcell) {
435                                 var t = ccheadcell.cloneNode(true);
436                                 t.appendChild(text(type.opac_label()));
437                                 ccrow.insertBefore(t, lastheadcell);
438                                 lastheadcell = t;
439                         }
440                 }
441         }
442
443         unHideMe($("search_info_table"));
444 }
445
446 /* collect copy counts for a record using method 'methodName' */
447 function resultCollectCopyCounts(rec, pagePosition, methodName) {
448         if(rec == null || rec.doc_id() == null) return;
449         var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
450         req.request.userdata = [ rec, pagePosition ];
451         req.callback(resultHandleCopyCounts);
452         req.send();
453 }
454
455 function resultHandleCopyCounts(r) {
456         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
457 }
458
459
460 /* display the collected copy counts */
461 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
462         if(copy_counts == null || rec == null) return;
463         var i = 0;
464         while(copy_counts[i] != null) {
465                 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
466                 /*
467                 var span = cell.getElementsByTagName("div")[0];
468                 */
469                 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
470
471                 i++;
472         }
473 }
474
475