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