Initial dev repository
[kcls-web.git] / opac / skin / kcls / 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         } // ugh... I hate math.\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                         if(i==end && (getHitCount()%getDisplayCount())==0) break;\r
429                         var temp = elem('span',{style:'padding:0px 3px;'});\r
430                         temp.style.padding='0px 3px';\r
431                         args[PARAM_OFFSET] = getDisplayCount()*i;\r
432                         if(i==cpage-1) { var link = text(i+1); temp.style.color="red" }\r
433                                 else var link = elem('a',{href:buildOPACLink(args)},i+1);\r
434                         temp.appendChild(link);\r
435                         span.appendChild(temp);\r
436                         span2.appendChild(temp.cloneNode(true));\r
437                 }\r
438         }\r
439         //////\r
440 \r
441         if(getDisplayCount() < getHitCount()) {\r
442                 unHideMe($('start_end_links_span'));\r
443                 unHideMe($('start_end_links_span2'));\r
444    }\r
445 \r
446         showCanvas();\r
447         try{searchTimer.stop()}catch(e){}\r
448 }\r
449 \r
450 function buildunAPISpan (span, type, id) {\r
451         if(!span || !type || !id) return;\r
452         var cgi = new CGI();\r
453         var d = new Date();\r
454 \r
455         addCSSClass(span,'unapi-id');\r
456 \r
457         span.setAttribute(\r
458                 'title',\r
459                 'tag:' + cgi.server_name + ',' +\r
460                         d.getFullYear() +\r
461                         ':' + type + '/' + id\r
462         );\r
463 }\r
464 \r
465 function unhideGoogleBooksLink (data) {\r
466     for ( var i in data ) {\r
467         //if (data[i].preview == 'noview') continue;\r
468 \r
469         var gbspan = $n(document.documentElement, 'googleBooksLink-' + i);\r
470         var gba = $n(gbspan, "googleBooks-link");\r
471 \r
472         gba.setAttribute(\r
473             'href',\r
474             data[i].info_url\r
475         );\r
476         removeCSSClass( gbspan, 'hide_me' );\r
477     }\r
478 }\r
479 \r
480 /* display the record info in the record display table 'pos' is the \r
481                 zero based position the record should have in the display table */\r
482 function resultDisplayRecord(rec, pos, is_mr) {\r
483         //fieldmapper.IDL.load(['mvr']);\r
484         if(rec == null || rec.__c) rec = new mvr(); /* so the page won't die if there was an error */\r
485         recordsHandled++;\r
486         recordsCache.push(rec);\r
487 \r
488         var r = table.rows[pos + 1];\r
489         r.id += "_" + rec.doc_id();\r
490     var currentISBN = cleanISBN(rec.isbn());\r
491 \r
492     if (googleBooksLink) {\r
493             var gbspan = $n(r, "googleBooksLink");\r
494         if (currentISBN && gbspan) {\r
495             gbspan.setAttribute('name', gbspan.getAttribute('name') + '-' + currentISBN );\r
496             if (isbnList) isbnList += ', ';\r
497             isbnList += currentISBN;\r
498         }\r
499     }\r
500 \r
501     if (currentISBN && chilifresh && chilifresh != '(none)') {\r
502         var cfrow = $n(r, "chilifreshReview");\r
503         if (cfrow) {\r
504             removeCSSClass( cfrow, 'hide_me' );\r
505         }\r
506         var cflink = $n(r, "chilifreshReviewLink");\r
507         if (cflink) {\r
508             cflink.setAttribute(\r
509                 'id',\r
510                 'isbn_' + currentISBN\r
511             );\r
512         }\r
513         var cfdiv = $n(r, "chilifreshReviewResult");\r
514         if (cfdiv) {\r
515             cfdiv.setAttribute(\r
516                 'id',\r
517                 'chili_review_' + currentISBN\r
518             )\r
519         }\r
520     }\r
521 \r
522         var pic = $n(r, config.names.result.item_jacket);\r
523         if (!pic) pic = elem("img");\r
524         //pic.setAttribute("src", buildISBNSrc(currentISBN));\r
525         pic.setAttribute("width",55);\r
526 \r
527         var title_link = $n(r, config.names.result.item_title);\r
528         var author_link = $n(r, config.names.result.item_author);\r
529         var row_count = $n(r,"results_row_count");\r
530         var myListLink = $n(r,"result_my_list_link");\r
531         var reviewsLink = $n(r, 'reviews_and_more');\r
532         if(currentISBN) {\r
533                 reviewsLink.href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+currentISBN+"&Options=Y";\r
534         }\r
535 \r
536         if( is_mr )  {\r
537                 var onlyrec = onlyrecord[ getOffset() + pos ];\r
538                 if(onlyrec) {\r
539                         buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);\r
540 \r
541                         var args = {};\r
542                         args.page = RDETAIL;\r
543                         args[PARAM_OFFSET] = 0;\r
544                         args[PARAM_RID] = onlyrec;\r
545                         args[PARAM_MRID] = rec.doc_id();\r
546                         pic.parentNode.setAttribute("href", buildOPACLink(args));\r
547                         title_link.setAttribute("href", buildOPACLink(args));\r
548                         title_link.appendChild(text(normalize(truncate(rec.title(), 65))));\r
549                         \r
550                 } else {\r
551                         buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());\r
552 \r
553                         buildTitleLink(rec, title_link); \r
554                         var args = {};\r
555                         args.page = RRESULT;\r
556                         args[PARAM_OFFSET] = 0;\r
557                         args[PARAM_MRID] = rec.doc_id();\r
558                         pic.parentNode.setAttribute("href", buildOPACLink(args));\r
559                 }\r
560 \r
561         } else {\r
562                 buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());\r
563 \r
564                 if(title_link) buildTitleDetailLink(rec, title_link); \r
565                 var args = {};\r
566                 args.page = RDETAIL;\r
567                 args[PARAM_OFFSET] = 0;\r
568                 args[PARAM_RID] = rec.doc_id();\r
569                 pic.parentNode.setAttribute("href", buildOPACLink(args));\r
570 \r
571                 unHideMe($n(r,'place_hold_span'));\r
572                 //$n(r,'place_hold_link').setAttribute('href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');\r
573                 $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); }\r
574 \r
575                 /** BILL */\r
576                 //dojo.require('openils.BibTemplate');  // -- this causes redundant requests per record - put in js_common.xml instead\r
577                 setTimeout(\r
578                     function () { \r
579                         //new openils.BibTemplate({root : $n(r, 'bib_cn_list'), record : rec.doc_id()}).render();\r
580                         new openils.BibTemplate({root : r, record : rec.doc_id()}).render();\r
581                     }, 0\r
582                 );\r
583                 /** BILL */\r
584         }\r
585         \r
586         if(row_count) row_count.innerHTML = (pos+1)+getOffset()+".";\r
587         if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");")\r
588         title_link.setAttribute("title",rec.title());\r
589         buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);\r
590 \r
591         if(! is_mr ) {\r
592                 $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate();\r
593                 $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher();\r
594                 $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN;\r
595                 $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition();\r
596                 $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description();\r
597                 if(isInAnonList(parseInt(rec.doc_id()))) { \r
598                         $n(r, 'result_my_list_link').innerHTML = 'Remove from my list';\r
599                         $n(r, 'result_my_list_link').title = 'Remove from my list';\r
600                         //$n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
601                 }\r
602                 \r
603                 if(!isNull(rec.edition()))      {\r
604                         unHideMe( $n(r, "result_table_extra_span"));\r
605                         $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );\r
606                 }\r
607                 if(!isNull(rec.pubdate())) {\r
608                         unHideMe( $n(r, "result_table_extra_span"));\r
609                         unHideMe($n(r, "result_table_pub_span"));\r
610                         $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));\r
611                 }\r
612                 if(!isNull(rec.publisher()) ) {\r
613                         unHideMe( $n(r, "result_table_extra_span"));\r
614                         unHideMe($n(r, "result_table_pub_span"));\r
615                         $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));\r
616                 }\r
617 \r
618                 if(!isNull(rec.physical_description()) ) {\r
619                         unHideMe( $n(r, "result_table_extra_span"));\r
620                         var t = " " + rec.physical_description();\r
621                         //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));\r
622                         $n(r, "result_table_phys_span").appendChild( text(t));\r
623                 }\r
624         }\r
625 \r
626         resultBuildFormatIcons( r, rec, is_mr );\r
627         unHideMe(r);\r
628         runEvt("result", "recordDrawn", rec.doc_id(), title_link);\r
629 \r
630         \r
631         if(resultPageIsDone())  {\r
632                 runEvt('result', 'allRecordsReceived', recordsCache);\r
633         }\r
634 }\r
635 \r
636 function resultDrawHoldsWindow(hold_target, hold_type) {\r
637     var src = location.href;\r
638     if(forceLoginSSL && src.match(/^http:/)) {\r
639         src = src.replace(/^http:/, 'https:');\r
640         if(src.match(/&hold_target=/)) {\r
641             src.replace(/&hold_target=(\d+)/, hold_target);\r
642         } else {\r
643             src += '&hold_target=' + hold_target;\r
644         }\r
645         location.href = src;\r
646     } else {\r
647         holdsDrawEditor({record:hold_target, type:hold_type});\r
648     }\r
649 }\r
650 \r
651 \r
652 function _resultFindRec(id) {\r
653         for( var i = 0; i != recordsCache.length; i++ ) {\r
654                 var rec = recordsCache[i];\r
655                 if( rec && rec.doc_id() == id )\r
656                         return rec;\r
657         }\r
658         return null;\r
659 }\r
660 \r
661 \r
662 function resultBuildFormatIcons( row, rec, is_mr ) {\r
663         var ress = "";\r
664         var imgEl = $n(row, "result_mat_type");\r
665         if(!imgEl) return;\r
666         \r
667         ress = getMarcData(rec.doc_id(),"998","d");\r
668         if(setFormatIcon(imgEl, ress)) unHideMe(imgEl);\r
669 \r
670 }\r
671 \r
672 function fetchGoogleBooksLink () {\r
673         return;\r
674     if (isbnList && googleBooksLink) {\r
675         var scriptElement = document.createElement("script");\r
676         scriptElement.setAttribute("id", "jsonScript");\r
677         scriptElement.setAttribute("src",\r
678             "https://books.google.com/books?bibkeys=" + \r
679             escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink");\r
680         scriptElement.setAttribute("type", "text/javascript");\r
681         // make the request to Google Book Search\r
682         document.documentElement.firstChild.appendChild(scriptElement);\r
683     }\r
684 }\r
685 \r
686 function resultPageIsDone(pos) {\r
687 \r
688         return (recordsHandled == getDisplayCount() \r
689                 || recordsHandled + getOffset() == getHitCount());\r
690 }\r
691 \r
692 var resultCCHeaderApplied = false;\r
693 \r
694 /* -------------------------------------------------------------------- */\r
695 /* dynamically add the copy count rows based on the org type 'countsrow' \r
696         is the row into which we will add TD's to hold the copy counts \r
697         This code generates copy count cells with an id of\r
698         'copy_count_cell_<depth>_<pagePosition>'  */\r
699 function resultAddCopyCounts(rec, pagePosition) {\r
700 \r
701         var r = table.rows[pagePosition + 1];\r
702         var countsrow = $n(r, config.names.result.counts_row );\r
703         var ccell = $n(countsrow, config.names.result.count_cell);\r
704 \r
705         var nodes = orgNodeTrail(findOrgUnit(getLocation()));\r
706         var node = nodes[0];\r
707         var type = findOrgType(node.ou_type());\r
708         ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;\r
709         ccell.title = type.opac_label();\r
710         //addCSSClass(ccell, config.css.result.cc_cell_even);\r
711 \r
712         var lastcell = ccell;\r
713         var lastheadcell = null;\r
714 \r
715         var cchead = null;\r
716         var ccheadcell = null;\r
717         if(!resultCCHeaderApplied && !getLasso()) {\r
718                 ccrow = $('result_thead_row');\r
719                 ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));\r
720                 var t = ccheadcell.cloneNode(true);\r
721                 lastheadcell = t;\r
722                 t.appendChild(text(type.opac_label()));\r
723                 ccrow.appendChild(t);\r
724                 resultCCHeaderApplied = true;\r
725         }\r
726 }\r
727 \r
728 /* collect copy counts for a record using method 'methodName' */\r
729 function resultCollectCopyCounts(rec, pagePosition, methodName) {\r
730         if(rec == null || rec.doc_id() == null) return;\r
731 \r
732         var loc = getLasso();\r
733         if (loc) loc = -loc;\r
734         else loc= getLocation();\r
735 \r
736         var req = new Request(methodName, loc, rec.doc_id(), getForm() );\r
737         req.request.userdata = [ rec, pagePosition ];\r
738         req.callback(resultHandleCopyCounts);\r
739         req.send();\r
740 }\r
741 \r
742 function resultHandleCopyCounts(r) {\r
743         runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); \r
744 }\r
745 \r
746 \r
747 /* XXX Needs to understand Lasso copy counts... */\r
748 /* display the collected copy counts */\r
749 function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {\r
750         if(copy_counts == null || rec == null) return;\r
751         var r = table.rows[pagePosition + 1];\r
752         var cnt_avail = $n(r, "copy_count_avail");\r
753         if(cnt_avail && copy_counts[0]) {\r
754                 /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available';\r
755                 //else {\r
756                         fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount});\r
757                         $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies');\r
758                 //}\r
759         }\r
760 }\r
761 \r
762 function drawHoldsCount(r) {\r
763         if(!r.params[1]) return;\r
764         var row = $(r.params[1]);\r
765         if(!row) return;\r
766         var span = $n(row, 'copy_holds');\r
767         var resp = r.recv().content();\r
768         span.innerHTML = resp+' hold'+(resp==1?'':'s')+' ';\r
769 }\r
770 \r
771 function showDetailedInfo(bool) {\r
772         \r
773         var tbls = dojo.query('.results_info_table',$('result_table'));\r
774         if(bool) {\r
775           tbls.forEach(function(node, index, arr){\r
776                 unHideMe($n(node,'results_pub_tr'));\r
777                 unHideMe($n(node,'results_isbn_tr'));\r
778                 unHideMe($n(node,'results_edition_tr'));\r
779                 unHideMe($n(node,'results_phys_desc_tr'));\r
780           });\r
781         } else {\r
782           tbls.forEach(function(node, index, arr){\r
783                 hideMe($n(node,'results_pub_tr'));\r
784                 hideMe($n(node,'results_isbn_tr'));\r
785                 hideMe($n(node,'results_edition_tr'));\r
786                 hideMe($n(node,'results_phys_desc_tr'));\r
787           });\r
788         }\r
789 }\r
790 \r
791 function fetchChiliFreshReviews() {\r
792     if (chilifresh && chilifresh != '(none)') {\r
793         try { chili_init(); } catch(E) { dump(E + '\n'); }\r
794     }\r
795 }\r
796 \r
797 function postResultsCollect() {\r
798         var it = getCacheValue('showHoldEditor');\r
799         if(it) {\r
800                 setCacheValue('showHoldEditor', null);\r
801                 holdsDrawEditor({record:it.record, type:it.type});\r
802         }\r
803 }\r