testing commit, please ignore
[kcls-web.git] / opac / skin / css_alt / 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 function plausible_ident(s) {\r
37         s = s.replace(/^\s*(.+)\s*$/, '$1');\r
38         s = s.replace(/^(\S+)\s.*$/, '$1');\r
39         return s;\r
40 }\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 : $n(r, 'bib_cn_list'), record : rec.doc_id()}).render();\r
578                         new openils.BibTemplate({root : r, record : rec.doc_id()}).render();\r
579                     },\r
580                     0\r
581                 );\r
582                 /** BILL */\r
583         }\r
584         \r
585         if(row_count) row_count.innerHTML = (pos+1)+getOffset();\r
586         if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");")\r
587         title_link.setAttribute("title",rec.title());\r
588         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);\r
589 \r
590         if(! is_mr ) {\r
591                 $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate();\r
592                 $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher();\r
593                 $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN;\r
594                 $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition();\r
595                 $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description();\r
596                 if(isInAnonList(parseInt(rec.doc_id()))) { \r
597                         $n(r, 'result_my_list_link').innerHTML = '';\r
598                         $n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
599                 }\r
600                 \r
601                 if(!isNull(rec.edition()))      {\r
602                         unHideMe( $n(r, "result_table_extra_span"));\r
603                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );\r
604                 }\r
605                 if(!isNull(rec.pubdate())) {\r
606                         unHideMe( $n(r, "result_table_extra_span"));\r
607                         unHideMe($n(r, "result_table_pub_span"));\r
608                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));\r
609                 }\r
610                 if(!isNull(rec.publisher()) ) {\r
611                         unHideMe( $n(r, "result_table_extra_span"));\r
612                         unHideMe($n(r, "result_table_pub_span"));\r
613                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));\r
614                 }\r
615 \r
616                 if(!isNull(rec.physical_description()) ) {\r
617                         unHideMe( $n(r, "result_table_extra_span"));\r
618                         var t = " " + rec.physical_description();\r
619                         //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));\r
620                         $n(r, "result_table_phys_span").appendChild( text(t));\r
621                 }\r
622         }\r
623 \r
624         resultBuildFormatIcons( r, rec, is_mr );\r
625         unHideMe(r);\r
626         runEvt("result", "recordDrawn", rec.doc_id(), title_link);\r
627 \r
628         \r
629         if(resultPageIsDone())  {\r
630                 runEvt('result', 'allRecordsReceived', recordsCache);\r
631         }\r
632 }\r
633 \r
634 function _resultFindRec(id) {\r
635         for( var i = 0; i != recordsCache.length; i++ ) {\r
636                 var rec = recordsCache[i];\r
637                 if( rec && rec.doc_id() == id )\r
638                         return rec;\r
639         }\r
640         return null;\r
641 }\r
642 \r
643 \r
644 function resultBuildFormatIcons( row, rec, is_mr ) {\r
645         var ress = "";\r
646         var imgEl = $n(row, "result_mat_type");\r
647         if(!imgEl) return;\r
648         \r
649         ress = getMarcData(rec.doc_id(),"998","d");\r
650         if(setFormatIcon(imgEl, ress)) unHideMe(imgEl);\r
651 \r
652 }\r
653 \r
654 function fetchGoogleBooksLink () {\r
655         return;\r
656     if (isbnList && googleBooksLink) {\r
657         var scriptElement = document.createElement("script");\r
658         scriptElement.setAttribute("id", "jsonScript");\r
659         scriptElement.setAttribute("src",\r
660             "https://books.google.com/books?bibkeys=" + \r
661             escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink");\r
662         scriptElement.setAttribute("type", "text/javascript");\r
663         // make the request to Google Book Search\r
664         document.documentElement.firstChild.appendChild(scriptElement);\r
665     }\r
666 }\r
667 \r
668 function resultPageIsDone(pos) {\r
669 \r
670         return (recordsHandled == getDisplayCount() \r
671                 || recordsHandled + getOffset() == getHitCount());\r
672 }\r
673 \r
674 var resultCCHeaderApplied = false;\r
675 \r
676 /* -------------------------------------------------------------------- */\r
677 /* dynamically add the copy count rows based on the org type 'countsrow' \r
678         is the row into which we will add TD's to hold the copy counts \r
679         This code generates copy count cells with an id of\r
680         'copy_count_cell_<depth>_<pagePosition>'  */\r
681 function resultAddCopyCounts(rec, pagePosition) {\r
682 \r
683         var r = table.rows[pagePosition + 1];\r
684         var countsrow = $n(r, config.names.result.counts_row );\r
685         var ccell = $n(countsrow, config.names.result.count_cell);\r
686 \r
687         var nodes = orgNodeTrail(findOrgUnit(getLocation()));\r
688         var node = nodes[0];\r
689         var type = findOrgType(node.ou_type());\r
690         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;\r
691         ccell.title = type.opac_label();\r
692         //addCSSClass(ccell, config.css.result.cc_cell_even);\r
693 \r
694         var lastcell = ccell;\r
695         var lastheadcell = null;\r
696 \r
697         var cchead = null;\r
698         var ccheadcell = null;\r
699         if(!resultCCHeaderApplied && !getLasso()) {\r
700                 ccrow = $('result_thead_row');\r
701                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));\r
702                 var t = ccheadcell.cloneNode(true);\r
703                 lastheadcell = t;\r
704                 t.appendChild(text(type.opac_label()));\r
705                 ccrow.appendChild(t);\r
706                 resultCCHeaderApplied = true;\r
707         }\r
708 }\r
709 \r
710 /* collect copy counts for a record using method 'methodName' */\r
711 function resultCollectCopyCounts(rec, pagePosition, methodName) {\r
712         if(rec == null || rec.doc_id() == null) return;\r
713 \r
714         var loc = getLasso();\r
715         if (loc) loc = -loc;\r
716         else loc= getLocation();\r
717 \r
718         var req = new Request(methodName, loc, rec.doc_id(), getForm() );\r
719         req.request.userdata = [ rec, pagePosition ];\r
720         req.callback(resultHandleCopyCounts);\r
721         req.send();\r
722 }\r
723 \r
724 function resultHandleCopyCounts(r) {\r
725         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); \r
726 }\r
727 \r
728 \r
729 /* XXX Needs to understand Lasso copy counts... */\r
730 /* display the collected copy counts */\r
731 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {\r
732         if(copy_counts == null || rec == null) return;\r
733         var r = table.rows[pagePosition + 1];\r
734         var cnt_avail = $n(r, "copy_count_avail");\r
735         if(cnt_avail && copy_counts[0]) {\r
736                 /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available';\r
737                 //else {\r
738                         fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount});\r
739                         $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies');\r
740                 //}\r
741         }\r
742 }\r
743 \r
744 function drawHoldsCount(r) {\r
745         if(!r.params[1]) return;\r
746         var row = $(r.params[1]);\r
747         if(!row) return;\r
748         var span = $n(row, 'copy_holds');\r
749         var resp = r.recv().content();\r
750         span.innerHTML = resp+' hold'+(resp==1?'':'s')+' ';\r
751 }\r
752 \r
753 function showDetailedInfo(bool) {\r
754         var simple_lbl  = $('results_simple_lbl');\r
755         var simple_link = $('results_simple_link');\r
756         var detail_lbl  = $('results_detail_lbl');\r
757         var detail_link = $('results_detail_link');\r
758         if(!simple_lbl || !simple_link || !detail_lbl || !detail_link) return;\r
759         \r
760         var tbls = dojo.query('.results_info_table',$('result_table'));\r
761         if(bool) {\r
762           tbls.forEach(function(node, index, arr){\r
763                 unHideMe($n(node,'results_pub_tr'));\r
764                 unHideMe($n(node,'results_isbn_tr'));\r
765                 unHideMe($n(node,'results_edition_tr'));\r
766                 unHideMe($n(node,'results_phys_desc_tr'));\r
767           });\r
768           hideMe(simple_lbl);\r
769           hideMe(detail_link);\r
770           unHideMe(simple_link);\r
771           unHideMe(detail_lbl);\r
772         } else {\r
773           tbls.forEach(function(node, index, arr){\r
774                 hideMe($n(node,'results_pub_tr'));\r
775                 hideMe($n(node,'results_isbn_tr'));\r
776                 hideMe($n(node,'results_edition_tr'));\r
777                 hideMe($n(node,'results_phys_desc_tr'));\r
778           });\r
779           unHideMe(simple_lbl);\r
780           unHideMe(detail_link);\r
781           hideMe(simple_link);\r
782           hideMe(detail_lbl);\r
783         }\r
784 }\r
785 \r
786 function fetchChiliFreshReviews() {\r
787     if (chilifresh && chilifresh != '(none)') {\r
788         try { chili_init(); } catch(E) { dump(E + '\n'); }\r
789     }\r
790 }\r
791 \r
792 function postResultsCollect() {\r
793         var it = getCacheValue('showHoldEditor');\r
794         if(it) {\r
795                 setCacheValue('showHoldEditor', null);\r
796                 holdsDrawEditor({record:it.record, type:it.type});\r
797         }\r
798 }\r