testing commit, please ignore
[kcls-web.git] / opac / skin / lfw / js / result_common.js
1 \r
2 var recordsHandled = 0;\r
3 var recordsCache = [];\r
4 var lowHitCount = 4;\r
5 var isbnList = '';\r
6 var googleBooksLink = true;\r
7 buildOrgSel($('holdsCacheSel'), globalOrgTree, 0);\r
8 \r
9 var resultFetchAllRecords = false;\r
10 var resultCompiledSearch = null;\r
11 \r
12 /* set up the event handlers */\r
13 if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {\r
14         G.evt.result.hitCountReceived.push(resultSetHitInfo);\r
15         G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);\r
16         G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);\r
17         G.evt.result.allRecordsReceived.push(function(){unHideMe($('tehSideBar'));},function(){unHideMe($('results_view_span'));},resultBuildCaches,\r
18                 function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews, postResultsCollect);\r
19 \r
20         attachEvt('result','lowHits',resultLowHits);\r
21         attachEvt('result','zeroHits',resultZeroHits);\r
22         attachEvt( "common", "locationUpdated", resultSBSubmit );\r
23         /* do this after we have ID's so the rank for mr pages will be correct */\r
24         attachEvt("result", "preCollectRecords", resultPaginate);\r
25 }\r
26 \r
27 function resultSBSubmit(){searchBarSubmit();}\r
28 \r
29 /* returns the last 'index' postion ocurring in this page */\r
30 function resultFinalPageIndex() {\r
31         if(getHitCount() < (getOffset() + getDisplayCount())) \r
32                 return getHitCount() - 1;\r
33         return getOffset() + getDisplayCount() - 1;\r
34 }\r
35 \r
36 \r
37 function plausible_ident(s) {\r
38         s = s.replace(/^\s*(.+)\s*$/, '$1');\r
39         s = s.replace(/^(\S+)\s.*$/, '$1');\r
40         return s;\r
41 }\r
42 \r
43 /* generic search method */\r
44 function resultCollectSearchIds( type, method, handler ) {\r
45 \r
46         var sort                = (getSort() == SORT_TYPE_REL) ? null : getSort(); \r
47         var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null;\r
48 \r
49         var item_type;\r
50         var item_form;\r
51         var args = {};\r
52 \r
53         if( type ) {\r
54                 var form = parseForm(getForm());\r
55                 item_type = form.item_type;\r
56                 item_form = form.item_form;\r
57 \r
58         } else {\r
59                 item_type = (getItemType()) ? getItemType().split(/,/) : null;\r
60                 item_form = (getItemForm()) ? getItemForm().split(/,/) : null;\r
61         }\r
62         \r
63         item_type=null;\r
64 \r
65         var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount();\r
66 \r
67         if( getOffset() > 0 ) {\r
68                 if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() ) \r
69                         limit = getHitCount() - getOffset();\r
70         }\r
71 \r
72         var lasso = getLasso();\r
73 \r
74         if (lasso) args.org_unit = -lasso;\r
75         else args.org_unit = getLocation();\r
76 \r
77         args.depth    = getDepth();\r
78         args.limit    = limit;\r
79         args.offset   = getOffset();\r
80         args.visibility_limit = 3000;\r
81     args.default_class = getStype();\r
82 \r
83         if(sort) args.sort = sort;\r
84         if(sortdir) args.sort_dir = sortdir;\r
85         if(item_type) args.item_type    = item_type;\r
86         if(item_form) args.item_form    = item_form;\r
87     if(getAvail()) args.available = 1;\r
88         //args.format="marcxml";\r
89 \r
90         if(getFacet()) args.facets = getFacet();\r
91 \r
92         if(getAudience()) args.audience  = getAudience().split(/,/);\r
93         if(getLitForm()) args.lit_form  = getLitForm().split(/,/);\r
94         if(getLanguage()) args.language = getLanguage().split(/,/);\r
95         if(getBibLevel()) args.bib_level        = getBibLevel().split(/,/);\r
96         if(getCopyLocs()) args.locations        = getCopyLocs().split(/,/);\r
97     if(getPubdBefore()) args.before = getPubdBefore();\r
98     else if(getPubdAfter()) args.after = getPubdAfter();\r
99     else if(getPubdBetween()) args.between = getPubdBetween().split(/,/);\r
100 \r
101         _debug('Search args: ' + js2JSON(args));\r
102         _debug('Raw query: ' + getTerm());\r
103 \r
104         var req = new Request(method, args, getTerm(), 1);\r
105         req.callback(handler);\r
106         req.send();\r
107 }\r
108 \r
109 \r
110 \r
111 \r
112 \r
113 /* set the search result info, number of hits, which results we're \r
114         displaying, links to the next/prev pages, etc. */\r
115 function resultSetHitInfo() { \r
116 \r
117         var lasso = getLasso();\r
118         if (!lasso) {\r
119                 /* tell the user where the results are coming from */\r
120                 var baseorg = findOrgUnit(getLocation());\r
121                 var depth = getDepth();\r
122                 var mydepth = findOrgDepth(baseorg);\r
123                 if( findOrgDepth(baseorg) != depth ) {\r
124                         var tmporg = baseorg;\r
125                         while( mydepth > depth ) {\r
126                                 mydepth--;\r
127                                 tmporg = findOrgUnit(tmporg.parent_ou());\r
128                         }\r
129                         unHideMe($('including_results_for'));\r
130                         try{$('including_results_location').appendChild(text(tmporg.name()));} catch(e){}\r
131                 }\r
132         }\r
133 \r
134 \r
135         try{searchTimer.stop()}catch(e){}\r
136 \r
137         //if( findCurrentPage() == MRESULT ) {\r
138         if( findCurrentPage() == MRESULT || \r
139 \r
140                 (findCurrentPage() == RRESULT &&\r
141                         (\r
142                                 getRtype() == RTYPE_TITLE ||\r
143                                 getRtype() == RTYPE_AUTHOR ||\r
144                                 getRtype() == RTYPE_SUBJECT ||\r
145                                 getRtype() == RTYPE_SERIES ||\r
146                                 getRtype() == RTYPE_KEYWORD \r
147                         )\r
148 \r
149                 ) ) {\r
150 \r
151                 if(getHitCount() <= lowHitCount && getTerm())\r
152                         runEvt('result', 'lowHits');\r
153         }\r
154 \r
155         if(getHitCount() == 0) {\r
156                 runEvt('result', 'zeroHits');\r
157                 return;\r
158         }\r
159 \r
160 \r
161         var pages = getHitCount() / getDisplayCount();\r
162         if(pages % 1) pages = parseInt(pages) + 1;\r
163 \r
164         \r
165 \r
166         var cpage = (getOffset()/getDisplayCount()) + 1;\r
167 \r
168         G.ui.result.current_page.appendChild(text(cpage));\r
169         G.ui.result.num_pages.appendChild(text(pages)); /* the ) is dumb */\r
170 \r
171         $('current_page2').appendChild(text(cpage));\r
172         $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */\r
173 \r
174         /* set the offsets */\r
175         var offsetEnd = getDisplayCount() + getOffset();  \r
176         if( getDisplayCount() > (getHitCount() - getOffset()))  \r
177                 offsetEnd = getHitCount();\r
178 \r
179         G.ui.result.offset_end.appendChild(text(offsetEnd));\r
180         G.ui.result.offset_start.appendChild(text(getOffset() + 1));\r
181 \r
182         $('offset_end2').appendChild(text(offsetEnd));\r
183         $('offset_start2').appendChild(text(getOffset() + 1));\r
184 \r
185         G.ui.result.result_count.appendChild(text(getHitCount()));\r
186         unHideMe(G.ui.result.info);\r
187         unHideMe($('result_numbers1'));\r
188 \r
189         $('result_count2').appendChild(text(getHitCount()));\r
190         unHideMe($('result_info_div2'));\r
191 }\r
192 \r
193 function resultLowHits() {\r
194         showCanvas();\r
195         unHideMe($('result_low_hits'));\r
196         if(getHitCount() > 0)\r
197                 unHideMe($('result_low_hits_msg'));\r
198 \r
199     var words = [];\r
200     for(var key in resultCompiledSearch.searches) \r
201         words.push(resultCompiledSearch.searches[key].term);\r
202 \r
203         var sreq = new Request(CHECK_SPELL, words.join(' '));\r
204         sreq.callback(resultSuggestSpelling);\r
205         sreq.send();\r
206 \r
207     for(var key in resultCompiledSearch.searches) {\r
208                 var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);\r
209                 areq.callback(resultLowHitXRef);\r
210                 areq.send();\r
211         }\r
212 \r
213         if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {\r
214                 var a = {};\r
215                 a[PARAM_FORM] = "all";\r
216                 $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));\r
217                 unHideMe($('low_hits_remove_format'));\r
218         }\r
219 \r
220         resultSuggestSearchClass();\r
221 \r
222         if(getTerm()) resultExpandSearch(); /* advanced search */\r
223 }\r
224 \r
225 var lowHitsXRefSet = {};\r
226 var lowHitsXRefLink;\r
227 var lowHitsXRefLinkParent;\r
228 function resultLowHitXRef(r) {\r
229         if(!lowHitsXRefLink){\r
230                 lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;\r
231                 lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));\r
232         }\r
233         var res = r.getResultObject();\r
234         var arr = res.from;\r
235         arr.concat(res.also);\r
236         if(arr && arr.length > 0) {\r
237                 unHideMe($('low_hits_cross_ref'));\r
238                 var word;\r
239                 var c = 0;\r
240                 while( word = arr.shift() ) {\r
241 \r
242             if (lowHitsXRefSet[word] == 1) continue;\r
243             lowHitsXRefSet[word] = 1;\r
244 \r
245                         if(c++ > 20) break;\r
246                         var a = {};\r
247                         a[PARAM_TERM] = word;\r
248                         var template = lowHitsXRefLink.cloneNode(true);\r
249                         template.setAttribute('href',buildOPACLink(a));\r
250                         template.appendChild(text(word));\r
251                         lowHitsXRefLinkParent.appendChild(template);\r
252                         lowHitsXRefLinkParent.appendChild(text(' '));\r
253                 }\r
254         }\r
255 }\r
256 \r
257 function resultZeroHits() {\r
258         hideMe($('result_header'));\r
259         hideMe($('result_table_div'));\r
260         hideMe($('statusbar'));\r
261         $('rresults_page').style.width="690px";\r
262         unHideMe($('zero_search_hits'));\r
263         $('zero_hits_term').innerHTML = getTerm();\r
264         //showCanvas();\r
265         unHideMe($('result_low_hits'));\r
266         unHideMe($('result_zero_hits_msg'));\r
267         if(getTerm()) resultExpandSearch(); /* advanced search */\r
268 }\r
269 \r
270 function resultExpandSearch() {\r
271         var top = findOrgDepth(globalOrgTree);\r
272         if(getDepth() == top) return;\r
273         unHideMe($('low_hits_expand_range'));\r
274         var par = $('low_hits_expand_link').parentNode;\r
275         var template = par.removeChild($('low_hits_expand_link'));\r
276 \r
277         var bottom = getDepth();\r
278         while( top < bottom ) {\r
279                 var a = {};\r
280                 a[PARAM_DEPTH] = top;\r
281                 var temp = template.cloneNode(true);\r
282                 temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))\r
283                 temp.setAttribute('href',buildOPACLink(a));\r
284                 par.appendChild(temp);\r
285                 top++;\r
286         }\r
287 }\r
288 \r
289 function resultSuggestSearchClass() {\r
290         var stype = getStype();\r
291         if(stype == STYPE_KEYWORD) return;\r
292         var a = {}; var ref;\r
293         unHideMe($('low_hits_search_type'));\r
294         if(stype != STYPE_TITLE) {\r
295                 ref = $('low_hits_title_search');\r
296                 unHideMe(ref);\r
297                 a[PARAM_STYPE] = STYPE_TITLE;\r
298                 ref.setAttribute('href',buildOPACLink(a));\r
299         }\r
300         if(stype != STYPE_AUTHOR) {\r
301                 ref = $('low_hits_author_search');\r
302                 unHideMe(ref);\r
303                 a[PARAM_STYPE] = STYPE_AUTHOR;\r
304                 ref.setAttribute('href',buildOPACLink(a));\r
305         }\r
306         if(stype != STYPE_SUBJECT) {\r
307                 ref = $('low_hits_subject_search');\r
308                 unHideMe(ref);\r
309                 a[PARAM_STYPE] = STYPE_SUBJECT;\r
310                 ref.setAttribute('href',buildOPACLink(a));\r
311         }\r
312         if(stype != STYPE_KEYWORD) {\r
313                 ref = $('low_hits_keyword_search');\r
314                 unHideMe(ref);\r
315                 a[PARAM_STYPE] = STYPE_KEYWORD;\r
316                 ref.setAttribute('href',buildOPACLink(a));\r
317         }\r
318         if(stype != STYPE_SERIES) {\r
319                 ref = $('low_hits_series_search');\r
320                 unHideMe(ref);\r
321                 a[PARAM_STYPE] = STYPE_SERIES;\r
322                 ref.setAttribute('href',buildOPACLink(a));\r
323         }\r
324 }\r
325 \r
326 function resultSuggestSpelling(r) {\r
327         var res = r.getResultObject();\r
328         var phrase = getTerm();\r
329         var words = phrase.split(/ /);\r
330 \r
331         var newterm = "";\r
332 \r
333         for( var w = 0; w < words.length; w++ ) {\r
334                 var word = words[w];\r
335                 var blob = grep(res, function(i){return (i.word == word);});\r
336                 if( blob ) blob = blob[0];\r
337                 else continue;\r
338                 if( blob.word == word ) {\r
339                         if( blob.suggestions && blob.suggestions[0] ) {\r
340                                 newterm += " " + blob.suggestions[0];\r
341                                 unHideMe($('did_you_mean'));\r
342                         } else {\r
343                                 newterm += " " + word;\r
344                         }\r
345                 }\r
346         }\r
347         var cell = $('zero_hits_suggestions');\r
348         var s = res[0].suggestions;\r
349         for(var i in s) {\r
350                 if(i==0) continue;\r
351                 if(i==10) break; //limit suggestions\r
352                 cell.appendChild(elem('a',{href:buildOPACLink({t:s[i]})},s[i]));\r
353                 cell.appendChild(elem('br'));\r
354         }\r
355         if(newterm.toLowerCase().trim()!=getTerm().toLowerCase().trim()) unHideMe($('zero_hits_label1'));\r
356         if(res[0].suggestions && res[0].suggestions.length>0) unHideMe($('zero_hits_label2'));\r
357 \r
358         var arg = {};\r
359         arg[PARAM_TERM] = newterm;\r
360         $('spell_check_link').setAttribute('href', buildOPACLink(arg));\r
361         $('spell_check_link').appendChild(text(newterm));\r
362 }\r
363 \r
364 \r
365 function resultPaginate() {\r
366         var o = getOffset();\r
367         var args = {};\r
368 \r
369         if( !(  ((o) + getDisplayCount()) >= getHitCount()) ) {\r
370 \r
371                 args[PARAM_OFFSET]      = o + getDisplayCount();\r
372                 args[PARAM_SORT]                = SORT;\r
373                 args[PARAM_SORT_DIR] = SORT_DIR;\r
374                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);\r
375 \r
376                 G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); \r
377                 addCSSClass(G.ui.result.next_link, config.css.result.nav_active);\r
378 \r
379                 $('next_link2').setAttribute("href", buildOPACLink(args)); \r
380                 addCSSClass($('next_link2'), config.css.result.nav_active);\r
381 \r
382                 args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());\r
383 \r
384                 /* when hit count is divisible by display count, we have to adjust */\r
385                 if( getHitCount() % getDisplayCount() == 0 ) \r
386                         args[PARAM_OFFSET] -= getDisplayCount();\r
387         }\r
388 \r
389         if( o > 0 ) {\r
390 \r
391                 var args = {};\r
392                 args[PARAM_SORT]                = SORT;\r
393                 args[PARAM_SORT_DIR] = SORT_DIR;\r
394                 args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);\r
395 \r
396                 args[PARAM_OFFSET] = o - getDisplayCount();\r
397                 G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); \r
398                 addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);\r
399 \r
400                 $('prev_link2').setAttribute( "href", buildOPACLink(args)); \r
401                 addCSSClass($('prev_link2'), config.css.result.nav_active);\r
402 \r
403                 args[PARAM_OFFSET] = 0;\r
404                 G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); \r
405                 addCSSClass(G.ui.result.home_link, config.css.result.nav_active);\r
406         }\r
407         \r
408         // pagination - google style\r
409         var pages = getHitCount() / getDisplayCount();\r
410         var cpage = (getOffset()/getDisplayCount()) + 1;\r
411         var start = 0;\r
412         pages = Math.floor(pages);\r
413         cpage = Math.floor(cpage);\r
414         var end = pages>9?8:pages;\r
415         \r
416         // narrow our window of visible page numbers to 9 - sets start and end pages for the loop\r
417         if(cpage>4) {\r
418                 start = cpage-5;\r
419                 end = cpage+3>pages?pages:cpage+3;\r
420                 if(cpage+3>pages) { start = (cpage-5)-(cpage-pages+3); }\r
421                 if(start<0) start=0;\r
422         }\r
423         \r
424         if(pages>0) {\r
425                 var span = $('nav_pages');\r
426                 var span2 = $('nav_pages2');\r
427                 for(var i=start; i<=end; i++) {\r
428                         var temp = elem('span',{style:'padding:0px 3px;'});\r
429                         temp.style.padding='0px 3px';\r
430                         args[PARAM_OFFSET] = getDisplayCount()*i;\r
431                         if(i==cpage-1) { var link = text(i+1); temp.style.color="red" }\r
432                                 else var link = elem('a',{href:buildOPACLink(args)},i+1);\r
433                         temp.appendChild(link);\r
434                         span.appendChild(temp);\r
435                         span2.appendChild(temp.cloneNode(true));\r
436                 }\r
437         }\r
438         //////\r
439 \r
440         if(getDisplayCount() < getHitCount()) {\r
441                 unHideMe($('start_end_links_span'));\r
442                 unHideMe($('start_end_links_span2'));\r
443    }\r
444 \r
445         showCanvas();\r
446         try{searchTimer.stop()}catch(e){}\r
447 }\r
448 \r
449 function buildunAPISpan (span, type, id) {\r
450         if(!span || !type || !id) return;\r
451         var cgi = new CGI();\r
452         var d = new Date();\r
453 \r
454         addCSSClass(span,'unapi-id');\r
455 \r
456         span.setAttribute(\r
457                 'title',\r
458                 'tag:' + cgi.server_name + ',' +\r
459                         d.getFullYear() +\r
460                         ':' + type + '/' + id\r
461         );\r
462 }\r
463 \r
464 function unhideGoogleBooksLink (data) {\r
465     for ( var i in data ) {\r
466         //if (data[i].preview == 'noview') continue;\r
467 \r
468         var gbspan = $n(document.documentElement, 'googleBooksLink-' + i);\r
469         var gba = $n(gbspan, "googleBooks-link");\r
470 \r
471         gba.setAttribute(\r
472             'href',\r
473             data[i].info_url\r
474         );\r
475         removeCSSClass( gbspan, 'hide_me' );\r
476     }\r
477 }\r
478 \r
479 /* display the record info in the record display table 'pos' is the \r
480                 zero based position the record should have in the display table */\r
481 function resultDisplayRecord(rec, pos, is_mr) {\r
482         //fieldmapper.IDL.load(['mvr']);\r
483         if(rec == null || rec.__c) rec = new mvr(); /* so the page won't die if there was an error */\r
484         recordsHandled++;\r
485         recordsCache.push(rec);\r
486 \r
487         var r = table.rows[pos + 1];\r
488         r.id += "_" + rec.doc_id();\r
489     var currentISBN = cleanISBN(rec.isbn());\r
490 \r
491     if (googleBooksLink) {\r
492             var gbspan = $n(r, "googleBooksLink");\r
493         if (currentISBN && gbspan) {\r
494             gbspan.setAttribute('name', gbspan.getAttribute('name') + '-' + currentISBN );\r
495             if (isbnList) isbnList += ', ';\r
496             isbnList += currentISBN;\r
497         }\r
498     }\r
499 \r
500     if (currentISBN && chilifresh && chilifresh != '(none)') {\r
501         var cfrow = $n(r, "chilifreshReview");\r
502         if (cfrow) {\r
503             removeCSSClass( cfrow, 'hide_me' );\r
504         }\r
505         var cflink = $n(r, "chilifreshReviewLink");\r
506         if (cflink) {\r
507             cflink.setAttribute(\r
508                 'id',\r
509                 'isbn_' + currentISBN\r
510             );\r
511         }\r
512         var cfdiv = $n(r, "chilifreshReviewResult");\r
513         if (cfdiv) {\r
514             cfdiv.setAttribute(\r
515                 'id',\r
516                 'chili_review_' + currentISBN\r
517             )\r
518         }\r
519     }\r
520 \r
521         var pic = $n(r, config.names.result.item_jacket);\r
522         if (!pic) pic = elem("img");\r
523         //pic.setAttribute("src", buildISBNSrc(currentISBN));\r
524         pic.setAttribute("width",55);\r
525 \r
526         var title_link = $n(r, config.names.result.item_title);\r
527         var author_link = $n(r, config.names.result.item_author);\r
528         var row_count = $n(r,"results_row_count");\r
529         var myListLink = $n(r,"result_my_list_link");\r
530         var reviewsLink = $n(r, 'reviews_and_more');\r
531         if(currentISBN) {\r
532                 reviewsLink.href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+currentISBN+"&Options=Y";\r
533         }\r
534 \r
535         if( is_mr )  {\r
536                 var onlyrec = onlyrecord[ getOffset() + pos ];\r
537                 if(onlyrec) {\r
538                         buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);\r
539 \r
540                         var args = {};\r
541                         args.page = RDETAIL;\r
542                         args[PARAM_OFFSET] = 0;\r
543                         args[PARAM_RID] = onlyrec;\r
544                         args[PARAM_MRID] = rec.doc_id();\r
545                         pic.parentNode.setAttribute("href", buildOPACLink(args));\r
546                         title_link.setAttribute("href", buildOPACLink(args));\r
547                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));\r
548                         \r
549                 } else {\r
550                         buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());\r
551 \r
552                         buildTitleLink(rec, title_link); \r
553                         var args = {};\r
554                         args.page = RRESULT;\r
555                         args[PARAM_OFFSET] = 0;\r
556                         args[PARAM_MRID] = rec.doc_id();\r
557                         pic.parentNode.setAttribute("href", buildOPACLink(args));\r
558                 }\r
559 \r
560         } else {\r
561                 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());\r
562 \r
563                 if(title_link) buildTitleDetailLink(rec, title_link); \r
564                 var args = {};\r
565                 args.page = RDETAIL;\r
566                 args[PARAM_OFFSET] = 0;\r
567                 args[PARAM_RID] = rec.doc_id();\r
568                 pic.parentNode.setAttribute("href", buildOPACLink(args));\r
569 \r
570                 unHideMe($n(r,'place_hold_span'));\r
571                 $n(r,'place_hold_link').setAttribute('href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');\r
572 \r
573                 /** BILL */\r
574                 //dojo.require('openils.BibTemplate');  // -- this causes redundant requests per record - put in js_common.xml instead\r
575                 setTimeout(\r
576                     function () { \r
577                         new openils.BibTemplate({root : r, record : rec.doc_id()}).render();\r
578                     },\r
579                     0\r
580                 );\r
581                 /** BILL */\r
582         }\r
583         \r
584         if(row_count) row_count.innerHTML = (pos+1)+getOffset();\r
585         if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");")\r
586         title_link.setAttribute("title",rec.title());\r
587         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);\r
588 \r
589         if(! is_mr ) {\r
590                 $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate();\r
591                 $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher();\r
592                 $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN;\r
593                 $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition();\r
594                 $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description();\r
595                 if(isInAnonList(parseInt(rec.doc_id()))) { \r
596                         $n(r, 'result_my_list_link').innerHTML = '';\r
597                         $n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
598                 }\r
599                 \r
600                 if(!isNull(rec.edition()))      {\r
601                         unHideMe( $n(r, "result_table_extra_span"));\r
602                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );\r
603                 }\r
604                 if(!isNull(rec.pubdate())) {\r
605                         unHideMe( $n(r, "result_table_extra_span"));\r
606                         unHideMe($n(r, "result_table_pub_span"));\r
607                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));\r
608                 }\r
609                 if(!isNull(rec.publisher()) ) {\r
610                         unHideMe( $n(r, "result_table_extra_span"));\r
611                         unHideMe($n(r, "result_table_pub_span"));\r
612                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));\r
613                 }\r
614 \r
615                 if(!isNull(rec.physical_description()) ) {\r
616                         unHideMe( $n(r, "result_table_extra_span"));\r
617                         var t = " " + rec.physical_description();\r
618                         //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));\r
619                         $n(r, "result_table_phys_span").appendChild( text(t));\r
620                 }\r
621         }\r
622 \r
623         resultBuildFormatIcons( r, rec, is_mr );\r
624         unHideMe(r);\r
625         runEvt("result", "recordDrawn", rec.doc_id(), title_link);\r
626 \r
627         \r
628         if(resultPageIsDone())  {\r
629                 runEvt('result', 'allRecordsReceived', recordsCache);\r
630         }\r
631 }\r
632 \r
633 function _resultFindRec(id) {\r
634         for( var i = 0; i != recordsCache.length; i++ ) {\r
635                 var rec = recordsCache[i];\r
636                 if( rec && rec.doc_id() == id )\r
637                         return rec;\r
638         }\r
639         return null;\r
640 }\r
641 \r
642 \r
643 function resultBuildFormatIcons( row, rec, is_mr ) {\r
644         var ress = "";\r
645         var imgEl = $n(row, "result_mat_type");\r
646         if(!imgEl) return;\r
647         \r
648         ress = getMarcData(rec.doc_id(),"998","d");\r
649         if(setFormatIcon(imgEl, ress)) unHideMe(imgEl);\r
650 \r
651 }\r
652 \r
653 function fetchGoogleBooksLink () {\r
654         return;\r
655     if (isbnList && googleBooksLink) {\r
656         var scriptElement = document.createElement("script");\r
657         scriptElement.setAttribute("id", "jsonScript");\r
658         scriptElement.setAttribute("src",\r
659             "https://books.google.com/books?bibkeys=" + \r
660             escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink");\r
661         scriptElement.setAttribute("type", "text/javascript");\r
662         // make the request to Google Book Search\r
663         document.documentElement.firstChild.appendChild(scriptElement);\r
664     }\r
665 }\r
666 \r
667 function resultPageIsDone(pos) {\r
668 \r
669         return (recordsHandled == getDisplayCount() \r
670                 || recordsHandled + getOffset() == getHitCount());\r
671 }\r
672 \r
673 var resultCCHeaderApplied = false;\r
674 \r
675 /* -------------------------------------------------------------------- */\r
676 /* dynamically add the copy count rows based on the org type 'countsrow' \r
677         is the row into which we will add TD's to hold the copy counts \r
678         This code generates copy count cells with an id of\r
679         'copy_count_cell_<depth>_<pagePosition>'  */\r
680 function resultAddCopyCounts(rec, pagePosition) {\r
681 \r
682         var r = table.rows[pagePosition + 1];\r
683         var countsrow = $n(r, config.names.result.counts_row );\r
684         var ccell = $n(countsrow, config.names.result.count_cell);\r
685 \r
686         var nodes = orgNodeTrail(findOrgUnit(getLocation()));\r
687         var node = nodes[0];\r
688         var type = findOrgType(node.ou_type());\r
689         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;\r
690         ccell.title = type.opac_label();\r
691         //addCSSClass(ccell, config.css.result.cc_cell_even);\r
692 \r
693         var lastcell = ccell;\r
694         var lastheadcell = null;\r
695 \r
696         var cchead = null;\r
697         var ccheadcell = null;\r
698         if(!resultCCHeaderApplied && !getLasso()) {\r
699                 ccrow = $('result_thead_row');\r
700                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));\r
701                 var t = ccheadcell.cloneNode(true);\r
702                 lastheadcell = t;\r
703                 t.appendChild(text(type.opac_label()));\r
704                 ccrow.appendChild(t);\r
705                 resultCCHeaderApplied = true;\r
706         }\r
707 }\r
708 \r
709 /* collect copy counts for a record using method 'methodName' */\r
710 function resultCollectCopyCounts(rec, pagePosition, methodName) {\r
711         if(rec == null || rec.doc_id() == null) return;\r
712 \r
713         var loc = getLasso();\r
714         if (loc) loc = -loc;\r
715         else loc= getLocation();\r
716 \r
717         var req = new Request(methodName, loc, rec.doc_id(), getForm() );\r
718         req.request.userdata = [ rec, pagePosition ];\r
719         req.callback(resultHandleCopyCounts);\r
720         req.send();\r
721 }\r
722 \r
723 function resultHandleCopyCounts(r) {\r
724         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); \r
725 }\r
726 \r
727 \r
728 /* XXX Needs to understand Lasso copy counts... */\r
729 /* display the collected copy counts */\r
730 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {\r
731         if(copy_counts == null || rec == null) return;\r
732         var r = table.rows[pagePosition + 1];\r
733         var cnt_avail = $n(r, "copy_count_avail");\r
734         if(cnt_avail && copy_counts[0]) {\r
735                 /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available';\r
736                 //else {\r
737                         fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount});\r
738                         $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies');\r
739                 //}\r
740         }\r
741 }\r
742 \r
743 function drawHoldsCount(r) {\r
744         if(!r.params[1]) return;\r
745         var row = $(r.params[1]);\r
746         if(!row) return;\r
747         var span = $n(row, 'copy_holds');\r
748         var resp = r.recv().content();\r
749         span.innerHTML = resp+' hold'+(resp==1?'':'s')+' ';\r
750 }\r
751 \r
752 function showDetailedInfo(bool) {\r
753         var simple_lbl  = $('results_simple_lbl');\r
754         var simple_link = $('results_simple_link');\r
755         var detail_lbl  = $('results_detail_lbl');\r
756         var detail_link = $('results_detail_link');\r
757         if(!simple_lbl || !simple_link || !detail_lbl || !detail_link) return;\r
758         \r
759         var tbls = dojo.query('.results_info_table',$('result_table'));\r
760         if(bool) {\r
761           tbls.forEach(function(node, index, arr){\r
762                 unHideMe($n(node,'results_pub_tr'));\r
763                 unHideMe($n(node,'results_isbn_tr'));\r
764                 unHideMe($n(node,'results_edition_tr'));\r
765                 unHideMe($n(node,'results_phys_desc_tr'));\r
766           });\r
767           hideMe(simple_lbl);\r
768           hideMe(detail_link);\r
769           unHideMe(simple_link);\r
770           unHideMe(detail_lbl);\r
771         } else {\r
772           tbls.forEach(function(node, index, arr){\r
773                 hideMe($n(node,'results_pub_tr'));\r
774                 hideMe($n(node,'results_isbn_tr'));\r
775                 hideMe($n(node,'results_edition_tr'));\r
776                 hideMe($n(node,'results_phys_desc_tr'));\r
777           });\r
778           unHideMe(simple_lbl);\r
779           unHideMe(detail_link);\r
780           hideMe(simple_link);\r
781           hideMe(detail_lbl);\r
782         }\r
783 }\r
784 \r
785 function fetchChiliFreshReviews() {\r
786     if (chilifresh && chilifresh != '(none)') {\r
787         try { chili_init(); } catch(E) { dump(E + '\n'); }\r
788     }\r
789 }\r
790 \r
791 function postResultsCollect() {\r
792         var it = getCacheValue('showHoldEditor');\r
793         if(it) {\r
794                 setCacheValue('showHoldEditor', null);\r
795                 holdsDrawEditor({record:it.record, type:it.type});\r
796         }\r
797 }\r