]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/result_common.js
added 'dbg' url param to turn on debugging, in particular this enables request debugging
[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         /*
318         if(resultPageIsDone())  {
319                 runEvt('result', 'allRecordsReceived', recordsCache);
320         }
321         */
322 }
323
324 function _resultFindRec(id) {
325         for( var i = 0; i != recordsCache.length; i++ ) {
326                 var rec = recordsCache[i];
327                 if( rec && rec.doc_id() == id )
328                         return rec;
329         }
330         return null;
331 }
332
333
334 function resultBuildFormatIcons( row, rec, is_mr ) {
335
336         var ress = rec.types_of_resource();
337
338         for( var i in ress ) {
339
340                 var res = ress[i];
341                 var link = $n(row, res + "_link");
342                 link.title = res;
343                 var img = link.getElementsByTagName("img")[0];
344                 removeCSSClass( img, config.css.dim );
345
346                 var f = getForm();
347                 if( f != "all" ) {
348                         if( f == modsFormatToMARC(res) ) 
349                                 addCSSClass( img, "dim2_border");
350                 }
351
352                 var args = {};
353                 args[PARAM_OFFSET] = 0;
354                 args[PARAM_FORM] = modsFormatToMARC(res);
355
356                 if(is_mr) {
357                         args.page = RRESULT;
358                         args[PARAM_MRID] = rec.doc_id();
359                 } else {
360                         args.page = RDETAIL
361                         args[PARAM_RID] = rec.doc_id();
362                 }
363
364                 link.setAttribute("href", buildOPACLink(args));
365
366         }
367 }
368
369
370 function resultPageIsDone(pos) {
371         return (recordsHandled == getDisplayCount() 
372                 || recordsHandled + getOffset() == getHitCount());
373 }
374
375 var resultCCHeaderApplied = false;
376
377 /* -------------------------------------------------------------------- */
378 /* dynamically add the copy count rows based on the org type 'countsrow' 
379         is the row into which we will add TD's to hold the copy counts 
380         This code generates copy count cells with an id of
381         'copy_count_cell_<depth>_<pagePosition>'  */
382 function resultAddCopyCounts(rec, pagePosition) {
383
384         var r = table.rows[pagePosition + 1];
385         var countsrow = $n(r, config.names.result.counts_row );
386         var ccell = $n(countsrow, config.names.result.count_cell);
387
388         var nodes = orgNodeTrail(findOrgUnit(getLocation()));
389         var node = nodes[0];
390         var type = findOrgType(node.ou_type());
391         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
392         ccell.title = type.opac_label();
393         //addCSSClass(ccell, config.css.result.cc_cell_even);
394
395         var lastcell = ccell;
396         var lastheadcell = null;
397
398         var cchead = null;
399         var ccheadcell = null;
400         if(!resultCCHeaderApplied) {
401                 ccrow = $('result_thead_row');
402                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));
403                 var t = ccheadcell.cloneNode(true);
404                 lastheadcell = t;
405                 t.appendChild(text(type.opac_label()));
406                 ccrow.appendChild(t);
407                 resultCCHeaderApplied = true;
408         }
409
410         if(nodes[1]) {
411
412                 var x = 1;
413                 var d = findOrgDepth(nodes[1]);
414                 var d2 = findOrgDepth(nodes[nodes.length -1]);
415
416                 for( var i = d; i <= d2 ; i++ ) {
417         
418                         ccell = ccell.cloneNode(true);
419
420                         //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
421                         //else addCSSClass(ccell, "copy_count_cell_even");
422
423                         var node = nodes[x++];
424                         var type = findOrgType(node.ou_type());
425         
426                         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
427                         ccell.title = type.opac_label();
428                         countsrow.insertBefore(ccell, lastcell);
429                         lastcell = ccell;
430
431                         if(ccheadcell) {
432                                 var t = ccheadcell.cloneNode(true);
433                                 t.appendChild(text(type.opac_label()));
434                                 ccrow.insertBefore(t, lastheadcell);
435                                 lastheadcell = t;
436                         }
437                 }
438         }
439
440         unHideMe($("search_info_table"));
441 }
442
443 /* collect copy counts for a record using method 'methodName' */
444 function resultCollectCopyCounts(rec, pagePosition, methodName) {
445         if(rec == null || rec.doc_id() == null) return;
446         var req = new Request(methodName, getLocation(), rec.doc_id(), getForm() );
447         req.request.userdata = [ rec, pagePosition ];
448         req.callback(resultHandleCopyCounts);
449         req.send();
450 }
451
452 function resultHandleCopyCounts(r) {
453         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); 
454 }
455
456
457 /* display the collected copy counts */
458 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {
459         if(copy_counts == null || rec == null) return;
460         var i = 0;
461         while(copy_counts[i] != null) {
462                 var cell = $("copy_count_cell_" + i +"_" + pagePosition);
463                 /*
464                 var span = cell.getElementsByTagName("div")[0];
465                 */
466                 cell.appendChild(text(copy_counts[i].available + " / " + copy_counts[i].count));
467
468                 i++;
469         }
470 }
471
472