Initial dev repository
[kcls-web.git] / opac / skin / kcls / js / result_common.js
diff --git a/opac/skin/kcls/js/result_common.js b/opac/skin/kcls/js/result_common.js
new file mode 100644 (file)
index 0000000..caba7c9
--- /dev/null
@@ -0,0 +1,803 @@
+\r
+var recordsHandled = 0;\r
+var recordsCache = [];\r
+var lowHitCount = 4;\r
+var isbnList = '';\r
+var googleBooksLink = true;\r
+buildOrgSel($('holdsCacheSel'), globalOrgTree, 0);\r
+\r
+var resultFetchAllRecords = false;\r
+var resultCompiledSearch = null;\r
+\r
+/* set up the event handlers */\r
+if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) {\r
+       G.evt.result.hitCountReceived.push(resultSetHitInfo);\r
+       G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts);\r
+       G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts);\r
+       G.evt.result.allRecordsReceived.push(function(){unHideMe($('tehSideBar'));},function(){unHideMe($('results_view_span'));},resultBuildCaches,\r
+               function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews, postResultsCollect);\r
+\r
+       attachEvt('result','lowHits',resultLowHits);\r
+       attachEvt('result','zeroHits',resultZeroHits);\r
+       attachEvt( "common", "locationUpdated", resultSBSubmit );\r
+       /* do this after we have ID's so the rank for mr pages will be correct */\r
+       attachEvt("result", "preCollectRecords", resultPaginate);\r
+}\r
+\r
+function resultSBSubmit(){searchBarSubmit();}\r
+\r
+/* returns the last 'index' postion ocurring in this page */\r
+function resultFinalPageIndex() {\r
+       if(getHitCount() < (getOffset() + getDisplayCount())) \r
+               return getHitCount() - 1;\r
+       return getOffset() + getDisplayCount() - 1;\r
+}\r
+\r
+function plausible_ident(s) {\r
+       s = s.replace(/^\s*(.+)\s*$/, '$1');\r
+       s = s.replace(/^(\S+)\s.*$/, '$1');\r
+       return s;\r
+}\r
+\r
+\r
+/* generic search method */\r
+function resultCollectSearchIds( type, method, handler ) {\r
+\r
+       var sort                = (getSort() == SORT_TYPE_REL) ? null : getSort(); \r
+       var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null;\r
+\r
+       var item_type;\r
+       var item_form;\r
+       var args = {};\r
+\r
+       if( type ) {\r
+               var form = parseForm(getForm());\r
+               item_type = form.item_type;\r
+               item_form = form.item_form;\r
+\r
+       } else {\r
+               item_type = (getItemType()) ? getItemType().split(/,/) : null;\r
+               item_form = (getItemForm()) ? getItemForm().split(/,/) : null;\r
+       }\r
+       \r
+       item_type=null;\r
+\r
+       var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount();\r
+\r
+       if( getOffset() > 0 ) {\r
+               if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() ) \r
+                       limit = getHitCount() - getOffset();\r
+       }\r
+\r
+       var lasso = getLasso();\r
+\r
+       if (lasso) args.org_unit = -lasso;\r
+       else args.org_unit = getLocation();\r
+\r
+       args.depth    = getDepth();\r
+       args.limit    = limit;\r
+       args.offset   = getOffset();\r
+       args.visibility_limit = 3000;\r
+    args.default_class = getStype();\r
+\r
+       if(sort) args.sort = sort;\r
+       if(sortdir) args.sort_dir = sortdir;\r
+       if(item_type) args.item_type    = item_type;\r
+       if(item_form) args.item_form    = item_form;\r
+    if(getAvail()) args.available = 1;\r
+       //args.format="marcxml";\r
+\r
+       if(getFacet()) args.facets = getFacet();\r
+\r
+       if(getAudience()) args.audience  = getAudience().split(/,/);\r
+       if(getLitForm()) args.lit_form  = getLitForm().split(/,/);\r
+       if(getLanguage()) args.language = getLanguage().split(/,/);\r
+       if(getBibLevel()) args.bib_level        = getBibLevel().split(/,/);\r
+       if(getCopyLocs()) args.locations        = getCopyLocs().split(/,/);\r
+    if(getPubdBefore()) args.before = getPubdBefore();\r
+    else if(getPubdAfter()) args.after = getPubdAfter();\r
+    else if(getPubdBetween()) args.between = getPubdBetween().split(/,/);\r
+\r
+       _debug('Search args: ' + js2JSON(args));\r
+       _debug('Raw query: ' + getTerm());\r
+\r
+       var req = new Request(method, args, getTerm(), 1);\r
+       req.callback(handler);\r
+       req.send();\r
+}\r
+\r
+\r
+\r
+\r
+\r
+/* set the search result info, number of hits, which results we're \r
+       displaying, links to the next/prev pages, etc. */\r
+function resultSetHitInfo() { \r
+\r
+       var lasso = getLasso();\r
+       if (!lasso) {\r
+               /* tell the user where the results are coming from */\r
+               var baseorg = findOrgUnit(getLocation());\r
+               var depth = getDepth();\r
+               var mydepth = findOrgDepth(baseorg);\r
+               if( findOrgDepth(baseorg) != depth ) {\r
+                       var tmporg = baseorg;\r
+                       while( mydepth > depth ) {\r
+                               mydepth--;\r
+                               tmporg = findOrgUnit(tmporg.parent_ou());\r
+                       }\r
+                       unHideMe($('including_results_for'));\r
+                       try{$('including_results_location').appendChild(text(tmporg.name()));} catch(e){}\r
+               }\r
+       }\r
+\r
+\r
+       try{searchTimer.stop()}catch(e){}\r
+\r
+       //if( findCurrentPage() == MRESULT ) {\r
+       if( findCurrentPage() == MRESULT || \r
+\r
+               (findCurrentPage() == RRESULT &&\r
+                       (\r
+                               getRtype() == RTYPE_TITLE ||\r
+                               getRtype() == RTYPE_AUTHOR ||\r
+                               getRtype() == RTYPE_SUBJECT ||\r
+                               getRtype() == RTYPE_SERIES ||\r
+                               getRtype() == RTYPE_KEYWORD \r
+                       )\r
+\r
+               ) ) {\r
+\r
+               if(getHitCount() <= lowHitCount && getTerm())\r
+                       runEvt('result', 'lowHits');\r
+       }\r
+\r
+       if(getHitCount() == 0) {\r
+               runEvt('result', 'zeroHits');\r
+               return;\r
+       }\r
+\r
+\r
+       var pages = getHitCount() / getDisplayCount();\r
+       if(pages % 1) pages = parseInt(pages) + 1;\r
+\r
+       \r
+\r
+       var cpage = (getOffset()/getDisplayCount()) + 1;\r
+\r
+       G.ui.result.current_page.appendChild(text(cpage));\r
+       G.ui.result.num_pages.appendChild(text(pages)); /* the ) is dumb */\r
+\r
+       $('current_page2').appendChild(text(cpage));\r
+       $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */\r
+\r
+       /* set the offsets */\r
+       var offsetEnd = getDisplayCount() + getOffset();  \r
+       if( getDisplayCount() > (getHitCount() - getOffset()))  \r
+               offsetEnd = getHitCount();\r
+\r
+       G.ui.result.offset_end.appendChild(text(offsetEnd));\r
+       G.ui.result.offset_start.appendChild(text(getOffset() + 1));\r
+\r
+       $('offset_end2').appendChild(text(offsetEnd));\r
+       $('offset_start2').appendChild(text(getOffset() + 1));\r
+\r
+       G.ui.result.result_count.appendChild(text(getHitCount()));\r
+       unHideMe(G.ui.result.info);\r
+       unHideMe($('result_numbers1'));\r
+\r
+       $('result_count2').appendChild(text(getHitCount()));\r
+       unHideMe($('result_info_div2'));\r
+}\r
+\r
+function resultLowHits() {\r
+       showCanvas();\r
+       unHideMe($('result_low_hits'));\r
+       if(getHitCount() > 0)\r
+               unHideMe($('result_low_hits_msg'));\r
+\r
+    var words = [];\r
+    for(var key in resultCompiledSearch.searches) \r
+        words.push(resultCompiledSearch.searches[key].term);\r
+\r
+       var sreq = new Request(CHECK_SPELL, words.join(' '));\r
+       sreq.callback(resultSuggestSpelling);\r
+       sreq.send();\r
+\r
+    for(var key in resultCompiledSearch.searches) {\r
+               var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term);\r
+               areq.callback(resultLowHitXRef);\r
+               areq.send();\r
+       }\r
+\r
+       if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) {\r
+               var a = {};\r
+               a[PARAM_FORM] = "all";\r
+               $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a));\r
+               unHideMe($('low_hits_remove_format'));\r
+       }\r
+\r
+       resultSuggestSearchClass();\r
+\r
+       if(getTerm()) resultExpandSearch(); /* advanced search */\r
+}\r
+\r
+var lowHitsXRefSet = {};\r
+var lowHitsXRefLink;\r
+var lowHitsXRefLinkParent;\r
+function resultLowHitXRef(r) {\r
+       if(!lowHitsXRefLink){\r
+               lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode;\r
+               lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link'));\r
+       }\r
+       var res = r.getResultObject();\r
+       var arr = res.from;\r
+       arr.concat(res.also);\r
+       if(arr && arr.length > 0) {\r
+               unHideMe($('low_hits_cross_ref'));\r
+               var word;\r
+               var c = 0;\r
+               while( word = arr.shift() ) {\r
+\r
+            if (lowHitsXRefSet[word] == 1) continue;\r
+            lowHitsXRefSet[word] = 1;\r
+\r
+                       if(c++ > 20) break;\r
+                       var a = {};\r
+                       a[PARAM_TERM] = word;\r
+                       var template = lowHitsXRefLink.cloneNode(true);\r
+                       template.setAttribute('href',buildOPACLink(a));\r
+                       template.appendChild(text(word));\r
+                       lowHitsXRefLinkParent.appendChild(template);\r
+                       lowHitsXRefLinkParent.appendChild(text(' '));\r
+               }\r
+       }\r
+}\r
+\r
+function resultZeroHits() {\r
+       hideMe($('result_header'));\r
+       hideMe($('result_table_div'));\r
+       hideMe($('statusbar'));\r
+       $('rresults_page').style.width="690px";\r
+       unHideMe($('zero_search_hits'));\r
+       $('zero_hits_term').innerHTML = getTerm();\r
+       //showCanvas();\r
+       unHideMe($('result_low_hits'));\r
+       unHideMe($('result_zero_hits_msg'));\r
+       if(getTerm()) resultExpandSearch(); /* advanced search */\r
+}\r
+\r
+function resultExpandSearch() {\r
+       var top = findOrgDepth(globalOrgTree);\r
+       if(getDepth() == top) return;\r
+       unHideMe($('low_hits_expand_range'));\r
+       var par = $('low_hits_expand_link').parentNode;\r
+       var template = par.removeChild($('low_hits_expand_link'));\r
+\r
+       var bottom = getDepth();\r
+       while( top < bottom ) {\r
+               var a = {};\r
+               a[PARAM_DEPTH] = top;\r
+               var temp = template.cloneNode(true);\r
+               temp.appendChild(text(findOrgTypeFromDepth(top).opac_label()))\r
+               temp.setAttribute('href',buildOPACLink(a));\r
+               par.appendChild(temp);\r
+               top++;\r
+       }\r
+}\r
+\r
+function resultSuggestSearchClass() {\r
+       var stype = getStype();\r
+       if(stype == STYPE_KEYWORD) return;\r
+       var a = {}; var ref;\r
+       unHideMe($('low_hits_search_type'));\r
+       if(stype != STYPE_TITLE) {\r
+               ref = $('low_hits_title_search');\r
+               unHideMe(ref);\r
+               a[PARAM_STYPE] = STYPE_TITLE;\r
+               ref.setAttribute('href',buildOPACLink(a));\r
+       }\r
+       if(stype != STYPE_AUTHOR) {\r
+               ref = $('low_hits_author_search');\r
+               unHideMe(ref);\r
+               a[PARAM_STYPE] = STYPE_AUTHOR;\r
+               ref.setAttribute('href',buildOPACLink(a));\r
+       }\r
+       if(stype != STYPE_SUBJECT) {\r
+               ref = $('low_hits_subject_search');\r
+               unHideMe(ref);\r
+               a[PARAM_STYPE] = STYPE_SUBJECT;\r
+               ref.setAttribute('href',buildOPACLink(a));\r
+       }\r
+       if(stype != STYPE_KEYWORD) {\r
+               ref = $('low_hits_keyword_search');\r
+               unHideMe(ref);\r
+               a[PARAM_STYPE] = STYPE_KEYWORD;\r
+               ref.setAttribute('href',buildOPACLink(a));\r
+       }\r
+       if(stype != STYPE_SERIES) {\r
+               ref = $('low_hits_series_search');\r
+               unHideMe(ref);\r
+               a[PARAM_STYPE] = STYPE_SERIES;\r
+               ref.setAttribute('href',buildOPACLink(a));\r
+       }\r
+}\r
+\r
+function resultSuggestSpelling(r) {\r
+       var res = r.getResultObject();\r
+       var phrase = getTerm();\r
+       var words = phrase.split(/ /);\r
+\r
+       var newterm = "";\r
+\r
+       for( var w = 0; w < words.length; w++ ) {\r
+               var word = words[w];\r
+               var blob = grep(res, function(i){return (i.word == word);});\r
+               if( blob ) blob = blob[0];\r
+               else continue;\r
+               if( blob.word == word ) {\r
+                       if( blob.suggestions && blob.suggestions[0] ) {\r
+                               newterm += " " + blob.suggestions[0];\r
+                               unHideMe($('did_you_mean'));\r
+                       } else {\r
+                               newterm += " " + word;\r
+                       }\r
+               }\r
+       }\r
+       var cell = $('zero_hits_suggestions');\r
+       var s = res[0].suggestions;\r
+       for(var i in s) {\r
+               if(i==0) continue;\r
+               if(i==10) break; //limit suggestions\r
+               cell.appendChild(elem('a',{href:buildOPACLink({t:s[i]})},s[i]));\r
+               cell.appendChild(elem('br'));\r
+       }\r
+       if(newterm.toLowerCase().trim()!=getTerm().toLowerCase().trim()) unHideMe($('zero_hits_label1'));\r
+       if(res[0].suggestions && res[0].suggestions.length>0) unHideMe($('zero_hits_label2'));\r
+\r
+       var arg = {};\r
+       arg[PARAM_TERM] = newterm;\r
+       $('spell_check_link').setAttribute('href', buildOPACLink(arg));\r
+       $('spell_check_link').appendChild(text(newterm));\r
+}\r
+\r
+\r
+function resultPaginate() {\r
+       var o = getOffset();\r
+       var args = {};\r
+\r
+       if( !(  ((o) + getDisplayCount()) >= getHitCount()) ) {\r
+\r
+               args[PARAM_OFFSET]      = o + getDisplayCount();\r
+               args[PARAM_SORT]                = SORT;\r
+               args[PARAM_SORT_DIR] = SORT_DIR;\r
+               args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);\r
+\r
+               G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); \r
+               addCSSClass(G.ui.result.next_link, config.css.result.nav_active);\r
+\r
+               $('next_link2').setAttribute("href", buildOPACLink(args)); \r
+               addCSSClass($('next_link2'), config.css.result.nav_active);\r
+\r
+               args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount());\r
+\r
+               /* when hit count is divisible by display count, we have to adjust */\r
+               if( getHitCount() % getDisplayCount() == 0 ) \r
+                       args[PARAM_OFFSET] -= getDisplayCount();\r
+       }\r
+\r
+       if( o > 0 ) {\r
+\r
+               var args = {};\r
+               args[PARAM_SORT]                = SORT;\r
+               args[PARAM_SORT_DIR] = SORT_DIR;\r
+               args[PARAM_RLIST]               = new CGI().param(PARAM_RLIST);\r
+\r
+               args[PARAM_OFFSET] = o - getDisplayCount();\r
+               G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); \r
+               addCSSClass(G.ui.result.prev_link, config.css.result.nav_active);\r
+\r
+               $('prev_link2').setAttribute( "href", buildOPACLink(args)); \r
+               addCSSClass($('prev_link2'), config.css.result.nav_active);\r
+\r
+               args[PARAM_OFFSET] = 0;\r
+               G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); \r
+               addCSSClass(G.ui.result.home_link, config.css.result.nav_active);\r
+       }\r
+       \r
+       // pagination - google style\r
+       var pages = getHitCount() / getDisplayCount();\r
+       var cpage = (getOffset()/getDisplayCount()) + 1;\r
+       var start = 0;\r
+       pages = Math.floor(pages);\r
+       cpage = Math.floor(cpage);\r
+       var end = pages>9?8:pages;\r
+       \r
+       // narrow our window of visible page numbers to 9 - sets start and end pages for the loop\r
+       if(cpage>4) {\r
+               start = cpage-5;\r
+               end = cpage+3>pages?pages:cpage+3;\r
+               if(cpage+3>pages) { start = (cpage-5)-(cpage-pages+3); }\r
+               if(start<0) start=0;\r
+       } // ugh... I hate math.\r
+       \r
+       if(pages>0) {\r
+               var span = $('nav_pages');\r
+               var span2 = $('nav_pages2');\r
+               for(var i=start; i<=end; i++) {\r
+                       if(i==end && (getHitCount()%getDisplayCount())==0) break;\r
+                       var temp = elem('span',{style:'padding:0px 3px;'});\r
+                       temp.style.padding='0px 3px';\r
+                       args[PARAM_OFFSET] = getDisplayCount()*i;\r
+                       if(i==cpage-1) { var link = text(i+1); temp.style.color="red" }\r
+                               else var link = elem('a',{href:buildOPACLink(args)},i+1);\r
+                       temp.appendChild(link);\r
+                       span.appendChild(temp);\r
+                       span2.appendChild(temp.cloneNode(true));\r
+               }\r
+       }\r
+       //////\r
+\r
+       if(getDisplayCount() < getHitCount()) {\r
+               unHideMe($('start_end_links_span'));\r
+               unHideMe($('start_end_links_span2'));\r
+   }\r
+\r
+       showCanvas();\r
+       try{searchTimer.stop()}catch(e){}\r
+}\r
+\r
+function buildunAPISpan (span, type, id) {\r
+       if(!span || !type || !id) return;\r
+       var cgi = new CGI();\r
+       var d = new Date();\r
+\r
+       addCSSClass(span,'unapi-id');\r
+\r
+       span.setAttribute(\r
+               'title',\r
+               'tag:' + cgi.server_name + ',' +\r
+                       d.getFullYear() +\r
+                       ':' + type + '/' + id\r
+       );\r
+}\r
+\r
+function unhideGoogleBooksLink (data) {\r
+    for ( var i in data ) {\r
+        //if (data[i].preview == 'noview') continue;\r
+\r
+        var gbspan = $n(document.documentElement, 'googleBooksLink-' + i);\r
+        var gba = $n(gbspan, "googleBooks-link");\r
+\r
+        gba.setAttribute(\r
+            'href',\r
+            data[i].info_url\r
+        );\r
+        removeCSSClass( gbspan, 'hide_me' );\r
+    }\r
+}\r
+\r
+/* display the record info in the record display table 'pos' is the \r
+               zero based position the record should have in the display table */\r
+function resultDisplayRecord(rec, pos, is_mr) {\r
+       //fieldmapper.IDL.load(['mvr']);\r
+       if(rec == null || rec.__c) rec = new mvr(); /* so the page won't die if there was an error */\r
+       recordsHandled++;\r
+       recordsCache.push(rec);\r
+\r
+       var r = table.rows[pos + 1];\r
+       r.id += "_" + rec.doc_id();\r
+    var currentISBN = cleanISBN(rec.isbn());\r
+\r
+    if (googleBooksLink) {\r
+           var gbspan = $n(r, "googleBooksLink");\r
+        if (currentISBN && gbspan) {\r
+            gbspan.setAttribute('name', gbspan.getAttribute('name') + '-' + currentISBN );\r
+            if (isbnList) isbnList += ', ';\r
+            isbnList += currentISBN;\r
+        }\r
+    }\r
+\r
+    if (currentISBN && chilifresh && chilifresh != '(none)') {\r
+        var cfrow = $n(r, "chilifreshReview");\r
+        if (cfrow) {\r
+            removeCSSClass( cfrow, 'hide_me' );\r
+        }\r
+        var cflink = $n(r, "chilifreshReviewLink");\r
+        if (cflink) {\r
+            cflink.setAttribute(\r
+                'id',\r
+                'isbn_' + currentISBN\r
+            );\r
+        }\r
+        var cfdiv = $n(r, "chilifreshReviewResult");\r
+        if (cfdiv) {\r
+            cfdiv.setAttribute(\r
+                'id',\r
+                'chili_review_' + currentISBN\r
+            )\r
+        }\r
+    }\r
+\r
+       var pic = $n(r, config.names.result.item_jacket);\r
+       if (!pic) pic = elem("img");\r
+       //pic.setAttribute("src", buildISBNSrc(currentISBN));\r
+       pic.setAttribute("width",55);\r
+\r
+       var title_link = $n(r, config.names.result.item_title);\r
+       var author_link = $n(r, config.names.result.item_author);\r
+       var row_count = $n(r,"results_row_count");\r
+       var myListLink = $n(r,"result_my_list_link");\r
+       var reviewsLink = $n(r, 'reviews_and_more');\r
+       if(currentISBN) {\r
+               reviewsLink.href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+currentISBN+"&Options=Y";\r
+       }\r
+\r
+       if( is_mr )  {\r
+               var onlyrec = onlyrecord[ getOffset() + pos ];\r
+               if(onlyrec) {\r
+                       buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec);\r
+\r
+                       var args = {};\r
+                       args.page = RDETAIL;\r
+                       args[PARAM_OFFSET] = 0;\r
+                       args[PARAM_RID] = onlyrec;\r
+                       args[PARAM_MRID] = rec.doc_id();\r
+                       pic.parentNode.setAttribute("href", buildOPACLink(args));\r
+                       title_link.setAttribute("href", buildOPACLink(args));\r
+                       title_link.appendChild(text(normalize(truncate(rec.title(), 65))));\r
+                       \r
+               } else {\r
+                       buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id());\r
+\r
+                       buildTitleLink(rec, title_link); \r
+                       var args = {};\r
+                       args.page = RRESULT;\r
+                       args[PARAM_OFFSET] = 0;\r
+                       args[PARAM_MRID] = rec.doc_id();\r
+                       pic.parentNode.setAttribute("href", buildOPACLink(args));\r
+               }\r
+\r
+       } else {\r
+               buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());\r
+\r
+               if(title_link) buildTitleDetailLink(rec, title_link); \r
+               var args = {};\r
+               args.page = RDETAIL;\r
+               args[PARAM_OFFSET] = 0;\r
+               args[PARAM_RID] = rec.doc_id();\r
+               pic.parentNode.setAttribute("href", buildOPACLink(args));\r
+\r
+               unHideMe($n(r,'place_hold_span'));\r
+               //$n(r,'place_hold_link').setAttribute('href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});');\r
+               $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); }\r
+\r
+               /** BILL */\r
+               //dojo.require('openils.BibTemplate');  // -- this causes redundant requests per record - put in js_common.xml instead\r
+               setTimeout(\r
+                   function () { \r
+                       //new openils.BibTemplate({root : $n(r, 'bib_cn_list'), record : rec.doc_id()}).render();\r
+                       new openils.BibTemplate({root : r, record : rec.doc_id()}).render();\r
+                    }, 0\r
+               );\r
+               /** BILL */\r
+       }\r
+       \r
+       if(row_count) row_count.innerHTML = (pos+1)+getOffset()+".";\r
+       if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");")\r
+       title_link.setAttribute("title",rec.title());\r
+       buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);\r
+\r
+       if(! is_mr ) {\r
+               $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate();\r
+               $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher();\r
+               $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN;\r
+               $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition();\r
+               $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description();\r
+               if(isInAnonList(parseInt(rec.doc_id()))) { \r
+                       $n(r, 'result_my_list_link').innerHTML = 'Remove from my list';\r
+                       $n(r, 'result_my_list_link').title = 'Remove from my list';\r
+                       //$n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
+               }\r
+               \r
+               if(!isNull(rec.edition()))      {\r
+                       unHideMe( $n(r, "result_table_extra_span"));\r
+                       $n(r, "result_table_edition_span").appendChild( text( rec.edition()) );\r
+               }\r
+               if(!isNull(rec.pubdate())) {\r
+                       unHideMe( $n(r, "result_table_extra_span"));\r
+                       unHideMe($n(r, "result_table_pub_span"));\r
+                       $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() ));\r
+               }\r
+               if(!isNull(rec.publisher()) ) {\r
+                       unHideMe( $n(r, "result_table_extra_span"));\r
+                       unHideMe($n(r, "result_table_pub_span"));\r
+                       $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() ));\r
+               }\r
+\r
+               if(!isNull(rec.physical_description()) ) {\r
+                       unHideMe( $n(r, "result_table_extra_span"));\r
+                       var t = " " + rec.physical_description();\r
+                       //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,'')));\r
+                       $n(r, "result_table_phys_span").appendChild( text(t));\r
+               }\r
+       }\r
+\r
+       resultBuildFormatIcons( r, rec, is_mr );\r
+       unHideMe(r);\r
+       runEvt("result", "recordDrawn", rec.doc_id(), title_link);\r
+\r
+       \r
+       if(resultPageIsDone())  {\r
+               runEvt('result', 'allRecordsReceived', recordsCache);\r
+       }\r
+}\r
+\r
+function resultDrawHoldsWindow(hold_target, hold_type) {\r
+    var src = location.href;\r
+    if(forceLoginSSL && src.match(/^http:/)) {\r
+        src = src.replace(/^http:/, 'https:');\r
+        if(src.match(/&hold_target=/)) {\r
+            src.replace(/&hold_target=(\d+)/, hold_target);\r
+        } else {\r
+            src += '&hold_target=' + hold_target;\r
+        }\r
+        location.href = src;\r
+    } else {\r
+        holdsDrawEditor({record:hold_target, type:hold_type});\r
+    }\r
+}\r
+\r
+\r
+function _resultFindRec(id) {\r
+       for( var i = 0; i != recordsCache.length; i++ ) {\r
+               var rec = recordsCache[i];\r
+               if( rec && rec.doc_id() == id )\r
+                       return rec;\r
+       }\r
+       return null;\r
+}\r
+\r
+\r
+function resultBuildFormatIcons( row, rec, is_mr ) {\r
+       var ress = "";\r
+       var imgEl = $n(row, "result_mat_type");\r
+       if(!imgEl) return;\r
+       \r
+       ress = getMarcData(rec.doc_id(),"998","d");\r
+       if(setFormatIcon(imgEl, ress)) unHideMe(imgEl);\r
+\r
+}\r
+\r
+function fetchGoogleBooksLink () {\r
+       return;\r
+    if (isbnList && googleBooksLink) {\r
+        var scriptElement = document.createElement("script");\r
+        scriptElement.setAttribute("id", "jsonScript");\r
+        scriptElement.setAttribute("src",\r
+            "https://books.google.com/books?bibkeys=" + \r
+            escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink");\r
+        scriptElement.setAttribute("type", "text/javascript");\r
+        // make the request to Google Book Search\r
+        document.documentElement.firstChild.appendChild(scriptElement);\r
+    }\r
+}\r
+\r
+function resultPageIsDone(pos) {\r
+\r
+       return (recordsHandled == getDisplayCount() \r
+               || recordsHandled + getOffset() == getHitCount());\r
+}\r
+\r
+var resultCCHeaderApplied = false;\r
+\r
+/* -------------------------------------------------------------------- */\r
+/* dynamically add the copy count rows based on the org type 'countsrow' \r
+       is the row into which we will add TD's to hold the copy counts \r
+       This code generates copy count cells with an id of\r
+       'copy_count_cell_<depth>_<pagePosition>'  */\r
+function resultAddCopyCounts(rec, pagePosition) {\r
+\r
+       var r = table.rows[pagePosition + 1];\r
+       var countsrow = $n(r, config.names.result.counts_row );\r
+       var ccell = $n(countsrow, config.names.result.count_cell);\r
+\r
+       var nodes = orgNodeTrail(findOrgUnit(getLocation()));\r
+       var node = nodes[0];\r
+       var type = findOrgType(node.ou_type());\r
+       ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;\r
+       ccell.title = type.opac_label();\r
+       //addCSSClass(ccell, config.css.result.cc_cell_even);\r
+\r
+       var lastcell = ccell;\r
+       var lastheadcell = null;\r
+\r
+       var cchead = null;\r
+       var ccheadcell = null;\r
+       if(!resultCCHeaderApplied && !getLasso()) {\r
+               ccrow = $('result_thead_row');\r
+               ccheadcell =  ccrow.removeChild($n(ccrow, "result_thead_ccell"));\r
+               var t = ccheadcell.cloneNode(true);\r
+               lastheadcell = t;\r
+               t.appendChild(text(type.opac_label()));\r
+               ccrow.appendChild(t);\r
+               resultCCHeaderApplied = true;\r
+       }\r
+}\r
+\r
+/* collect copy counts for a record using method 'methodName' */\r
+function resultCollectCopyCounts(rec, pagePosition, methodName) {\r
+       if(rec == null || rec.doc_id() == null) return;\r
+\r
+       var loc = getLasso();\r
+       if (loc) loc = -loc;\r
+       else loc= getLocation();\r
+\r
+       var req = new Request(methodName, loc, rec.doc_id(), getForm() );\r
+       req.request.userdata = [ rec, pagePosition ];\r
+       req.callback(resultHandleCopyCounts);\r
+       req.send();\r
+}\r
+\r
+function resultHandleCopyCounts(r) {\r
+       runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); \r
+}\r
+\r
+\r
+/* XXX Needs to understand Lasso copy counts... */\r
+/* display the collected copy counts */\r
+function resultDisplayCopyCounts(rec, pagePosition, copy_counts) {\r
+       if(copy_counts == null || rec == null) return;\r
+       var r = table.rows[pagePosition + 1];\r
+       var cnt_avail = $n(r, "copy_count_avail");\r
+       if(cnt_avail && copy_counts[0]) {\r
+               /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available';\r
+               //else {\r
+                       fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount});\r
+                       $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies');\r
+               //}\r
+       }\r
+}\r
+\r
+function drawHoldsCount(r) {\r
+       if(!r.params[1]) return;\r
+       var row = $(r.params[1]);\r
+       if(!row) return;\r
+       var span = $n(row, 'copy_holds');\r
+       var resp = r.recv().content();\r
+       span.innerHTML = resp+' hold'+(resp==1?'':'s')+' ';\r
+}\r
+\r
+function showDetailedInfo(bool) {\r
+       \r
+       var tbls = dojo.query('.results_info_table',$('result_table'));\r
+       if(bool) {\r
+         tbls.forEach(function(node, index, arr){\r
+               unHideMe($n(node,'results_pub_tr'));\r
+               unHideMe($n(node,'results_isbn_tr'));\r
+               unHideMe($n(node,'results_edition_tr'));\r
+               unHideMe($n(node,'results_phys_desc_tr'));\r
+         });\r
+       } else {\r
+         tbls.forEach(function(node, index, arr){\r
+               hideMe($n(node,'results_pub_tr'));\r
+               hideMe($n(node,'results_isbn_tr'));\r
+               hideMe($n(node,'results_edition_tr'));\r
+               hideMe($n(node,'results_phys_desc_tr'));\r
+         });\r
+       }\r
+}\r
+\r
+function fetchChiliFreshReviews() {\r
+    if (chilifresh && chilifresh != '(none)') {\r
+        try { chili_init(); } catch(E) { dump(E + '\n'); }\r
+    }\r
+}\r
+\r
+function postResultsCollect() {\r
+       var it = getCacheValue('showHoldEditor');\r
+       if(it) {\r
+               setCacheValue('showHoldEditor', null);\r
+               holdsDrawEditor({record:it.record, type:it.type});\r
+       }\r
+}\r