testing commit, please ignore
[kcls-web.git] / opac / skin / login1 / js / rdetail.js
1 /* */\r
2 \r
3 if(findCurrentPage()==RDETAIL){\r
4 detachAllEvt('common', 'run');\r
5 attachEvt("common", "run", rdetailDraw);\r
6 attachEvt("rdetail", "recordDrawn", rdetailBuildStatusColumns);\r
7 attachEvt("rdetail", "recordDrawn", rdetailBuildInfoRows);\r
8 attachEvt("rdetail", "recordDrawn", rdetailGetPageIds);\r
9 \r
10 /* Per-skin configuration settings */\r
11 var rdetailLocalOnly = true;\r
12 var rdetailShowLocal = true;\r
13 var rdetailShowCopyLocation = true;\r
14 var rdetailGoogleBookPreview = false;\r
15 var rdetailDisplaySerialHoldings = true;\r
16 var rdetailEnableRefWorks = false;\r
17 var rdetailRefWorksHost = 'http://www.refworks.com';\r
18 \r
19 /* vars vars vars */\r
20 var record = null;\r
21 var cp_statuses = null;\r
22 var recordsCache = [];\r
23 \r
24 var copyRowParent = null;\r
25 var copyRow = null;\r
26 var statusRow = null;\r
27 var numStatuses = null;\r
28 var defaultCN;\r
29 var callnumberCache = {};\r
30 var globalCNCache = {};\r
31 var localTOC;\r
32 var cachedRecords;\r
33 var _statusPositions = {};\r
34 var opac_strings;\r
35 \r
36 var nextContainerIndex;\r
37 \r
38 var nextRecord;\r
39 var prevRecord;\r
40 \r
41 var rdetailPrev = null;\r
42 var rdetailNext = null;\r
43 var rdetailStart = null;\r
44 var rdetailEnd = null;\r
45 \r
46 if(location.href.match(/&place_hold=1/)) {\r
47     // prevent load flicker between canvases\r
48     hideMe(dojo.byId('canvas_main'));\r
49 }\r
50 \r
51 \r
52 /* serials are currently the only use of Dojo strings in the OPAC */\r
53         if (rdetailDisplaySerialHoldings) {\r
54                 dojo.require("dijit.Menu");\r
55                 dojo.require("dijit.form.Button");\r
56                 dojo.requireLocalization("openils.opac", "opac");\r
57                 opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");\r
58         }\r
59 }\r
60 \r
61 function rdetailReload() {\r
62         var args = {};\r
63         args[PARAM_LOCATION] = getNewSearchLocation();\r
64         args[PARAM_DEPTH] = depthSelGetDepth();\r
65         goTo(buildOPACLink(args));\r
66 }\r
67 \r
68 /* looks to see if we have a next and/or previous record in the\r
69    record cache, if so, set up the nav links */\r
70 function rdetailSetPaging(ids) {\r
71 \r
72         cachedRecords = {};\r
73         cachedRecords.ids = ids;\r
74 \r
75         for( var i = 0; i < cachedRecords.ids.length; i++ ) {\r
76                 var rec = cachedRecords.ids[i];\r
77                 if( rec == getRid() ) {\r
78                         if( i > 0 ) prevRecord = cachedRecords.ids[i-1];\r
79                         if( i < cachedRecords.ids.length - 1 )\r
80                                 nextRecord = cachedRecords.ids[i+1];\r
81                         break;\r
82                 }\r
83         }\r
84 \r
85         $('np_offset').appendChild(text(i + 1));\r
86         $('np_count').appendChild(text(getHitCount()));\r
87 \r
88         if(prevRecord) {\r
89                 unHideMe($('np_table'));\r
90                 unHideMe($('np_prev'));\r
91                 unHideMe($('np_start'));\r
92                 rdetailPrev = function() { _rdetailNav(prevRecord); };\r
93                 rdetailStart = function() { _rdetailNav(cachedRecords.ids[0]); };\r
94         }\r
95 \r
96         if(nextRecord) {\r
97                 unHideMe($('np_table'));\r
98                 unHideMe($('np_next'));\r
99                 unHideMe($('np_end'));\r
100                 rdetailNext = function() { _rdetailNav(nextRecord); };\r
101                 rdetailEnd = function() { _rdetailNav(cachedRecords.ids[cachedRecords.ids.length-1]); };\r
102         }\r
103 \r
104         runEvt('rdetail', 'nextPrevDrawn', i, cachedRecords.ids.length);\r
105 }\r
106 \r
107 \r
108 function _rdetailNav(id, offset) {\r
109         var args = {};\r
110         args[PARAM_RID] = id;\r
111         goTo(buildOPACLink(args));\r
112 }\r
113 \r
114 function rdetailHandlePlaceHold() {\r
115     function reload() {\r
116         location.href = location.href.replace(/&place_hold=1/, '');\r
117     }\r
118     attachEvt("common", "holdUpdated", reload);\r
119     attachEvt("common", "holdUpdateCanceled", reload);\r
120     attachEvt("common", "loginCanceled", reload);\r
121     holdsDrawEditor({record:getRid(), type: 'T'});\r
122 }\r
123 \r
124 \r
125 function rdetailDraw() {\r
126 \r
127     if(new CGI().param('place_hold')) {\r
128         rdetailHandlePlaceHold();\r
129         return;\r
130     }\r
131 \r
132         detachAllEvt('common','depthChanged');\r
133         detachAllEvt('common','locationUpdated');\r
134         attachEvt('common','depthChanged', rdetailReload);\r
135         attachEvt('common','locationUpdated', rdetailReload);\r
136         attachEvt('common','holdUpdated', rdetailReload);\r
137         attachEvt('common','holdUpdateCanceled', rdetailReload);\r
138 \r
139         copyRowParent = G.ui.rdetail.cp_info_row.parentNode;\r
140         copyRow = copyRowParent.removeChild(G.ui.rdetail.cp_info_row);\r
141         statusRow = G.ui.rdetail.cp_status.parentNode;\r
142         statusRow.id = '__rdsrow';\r
143 \r
144         G.ui.rdetail.cp_info_local.onclick = rdetailShowLocalCopies;\r
145         G.ui.rdetail.cp_info_all.onclick = rdetailShowAllCopies;\r
146 \r
147         if(getLocation() == globalOrgTree.id())\r
148                 hideMe(G.ui.rdetail.cp_info_all);\r
149 \r
150    if(getRid()) {\r
151                    var req = new Request(FETCH_RMODS, getRid());  \r
152                    req.callback(_rdetailDraw);  \r
153                    req.send();  \r
154  \r
155    } else { // No record ID was specified\r
156  \r
157           // If we have an ISBN in the URL, let's try to find that record\r
158           // This allows direct linking by ISBN.\r
159           // Note, this uses the first record it finds\r
160           if(getRtype() == RTYPE_ISBN) {\r
161                    var req = new Request(FETCH_ADV_ISBN_RIDS, getAdvTerm());\r
162                    req.callback(\r
163                            function(r) {\r
164                                    var blob = r.getResultObject();\r
165                                    if(blob && blob.count > 0)\r
166                                            RID = blob.ids[0];\r
167                                    var req2 = new Request(FETCH_RMODS, getRid());\r
168                                    req2.callback(_rdetailDraw);\r
169                                    req2.send();\r
170                            }\r
171                    );\r
172                    req.send();\r
173            }\r
174    }\r
175 \r
176 \r
177         if (rdetailDisplaySerialHoldings) {\r
178                 var req = new Request(FETCH_MFHD_SUMMARY, getRid());\r
179                 req.callback(_holdingsDraw);\r
180                 req.send();\r
181                 if (isXUL()) {\r
182                         var here = findOrgUnit(getLocation());\r
183                         dojo.place("<div id='mfhd_ad_menu' class='hide_me'></div>", "rdetail_details_table", "after");\r
184                         var mfhd_add = new dijit.Menu({style:"float: right;"});\r
185                         new dijit.MenuItem({onClick:function(){\r
186                                 var req = new Request(CREATE_MFHD_RECORD, G.user.session, 1, here.id(), getRid());\r
187                                 var res = req.send();\r
188                                 alert(dojo.string.substitute(opac_strings.CREATED_MFHD_RECORD, [here.name()]));\r
189                         }, label:opac_strings.CREATE_MFHD}).placeAt(mfhd_add);\r
190                         mfhd_add.placeAt('mfhd_ad_menu');\r
191                 }\r
192         }\r
193 \r
194         detachAllEvt("result", "idsReceived");\r
195         G.evt.result.hitCountReceived = [];\r
196         G.evt.result.recordReceived = [];\r
197         G.evt.result.copyCountsReceived = [];\r
198         G.evt.result.allRecordsReceived = [];\r
199         //unHideMe($('rdetail_copy_info_link'));\r
200 }\r
201 \r
202 function rdetailGetPageIds() {\r
203         attachEvt("result", "idsReceived", rdetailSetPaging );\r
204         resultFetchAllRecords = true;\r
205         rresultCollectIds(true);\r
206 }\r
207 \r
208 \r
209 function buildunAPISpan (span, type, id) {\r
210         var cgi = new CGI();\r
211         var d = new Date();\r
212 \r
213         addCSSClass(span,'unapi-id');\r
214 \r
215         span.setAttribute(\r
216                 'title', 'tag:' + cgi.server_name + ',' +\r
217                 d.getFullYear() + ':' + type + '/' + id\r
218         );\r
219 }\r
220 \r
221 function rdetailViewMarc(r,id) {\r
222         hideMe($('rdetail_extras_loading'));\r
223         $('rdetail_view_marc_box').innerHTML = r.getResultObject();\r
224 \r
225         var div = elem('div', { "class" : 'hide_me' });\r
226         var span = div.appendChild( elem('abbr') );\r
227 \r
228         buildunAPISpan( span, 'biblio-record_entry', record.doc_id() );\r
229 \r
230         $('rdetail_view_marc_box').insertBefore(span, $('rdetail_view_marc_box').firstChild);\r
231 }\r
232 \r
233 \r
234 function rdetailShowLocalCopies() {\r
235         rdetailShowLocal = true;\r
236         rdetailBuildInfoRows();\r
237         hideMe(G.ui.rdetail.cp_info_local);\r
238         unHideMe(G.ui.rdetail.cp_info_all);\r
239         hideMe(G.ui.rdetail.cp_info_none); \r
240 }\r
241 \r
242 function rdetailShowAllCopies() {\r
243 \r
244         rdetailShowLocal = false;\r
245         rdetailBuildInfoRows();\r
246         hideMe(G.ui.rdetail.cp_info_all);\r
247         unHideMe(G.ui.rdetail.cp_info_local);\r
248         hideMe(G.ui.rdetail.cp_info_none); \r
249 }\r
250 \r
251 function OpenMarcEditWindow(pcrud, rec) {\r
252         /*\r
253            To run in Firefox directly, must set signed.applets.codebase_principal_support\r
254            to true in about:config\r
255          */\r
256         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\r
257         win = window.open('/xul/server/cat/marcedit.xul'); // XXX version?\r
258         dojo.require('openils.PermaCrud');\r
259 \r
260         win.xulG = {\r
261                 "record": {"marc": rec.marc()},\r
262                 "save": {\r
263                         "label": opac_strings.SAVE_MFHD_LABEL,\r
264                         "func": function(xmlString) {\r
265                                 rec.marc(xmlString);\r
266                                 rec.ischanged(true);\r
267                                 pcrud.update(rec);\r
268                         }\r
269                 }\r
270         };\r
271 }\r
272 \r
273 function loadMarcEditor(recId) {\r
274         var pcrud = new openils.PermaCrud({"authtoken": G.user.session});\r
275         var rec = pcrud.retrieve("sre", recId);\r
276         if (rec) {\r
277                 OpenMarcEditWindow(pcrud, rec);\r
278         }\r
279 }\r
280 \r
281 /*\r
282  * This function could be written much more intelligently\r
283  * Limited brain power means that I'm brute-forcing it for now\r
284  */\r
285 function _holdingsDraw(h) {\r
286         holdings = h.getResultObject();\r
287         if (!holdings) { return null; }\r
288 \r
289         dojo.forEach(holdings, _holdingsDrawMFHD);\r
290 \r
291 }\r
292 \r
293 function _holdingsDrawMFHD(holdings, entryNum) {\r
294 \r
295         var here = findOrgUnit(getLocation());\r
296         if (getDepth() > 0 || getDepth === 0 ) {\r
297                 while (getDepth() < findOrgDepth(here))\r
298                 here = findOrgUnit( here.parent_ou() );\r
299                 if (!orgIsMine(findOrgUnit(here), findOrgUnit(holdings.owning_lib()))) {\r
300                         return null;\r
301                 }\r
302         }\r
303 \r
304         var hh = holdings.holdings();\r
305         var hch = holdings.current_holdings();\r
306         var hs = holdings.supplements();\r
307         var hcs = holdings.current_supplements();\r
308         var hi = holdings.indexes();\r
309         var hci = holdings.current_indexes();\r
310         var ho = holdings.online();\r
311         var hm = holdings.missing();\r
312         var hinc = holdings.incomplete();\r
313         var hloc = holdings.location() || 'MFHD';\r
314 \r
315         if (    hh.length == 0 && hch.length == 0 && hs.length == 0 &&\r
316                 hcs.length == 0 && hi.length == 0 && hci.length == 0 &&\r
317                 ho.length == 0 && hm.length == 0 && hinc.length == 0\r
318         ) {\r
319 \r
320                 if (isXUL()) {\r
321                         /* \r
322                          * If we have a record, but nothing to show for it, then the\r
323                          * record is likely empty or corrupt. This gives cataloguers a\r
324                          * chance to add holdings or correct the record\r
325                          */\r
326                         hh = 'PLACEHOLDER';\r
327                 } else {\r
328                         return null;\r
329                 }\r
330         }\r
331 \r
332         dojo.place("<table style='width: 100%;'><caption id='mfhdHoldingsCaption" + entryNum + "' class='rdetail_header color_1'>" +\r
333                 dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) +\r
334                 "</caption><tbody id='rdetail_holdings_tbody_" + entryNum +\r
335                 "'></tbody></table>", "rdetail_details_table", "after"\r
336         );\r
337         if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); }\r
338         if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); }\r
339         if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); }\r
340         if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); }\r
341         if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); }\r
342         if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); }\r
343         if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); }\r
344         if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); }\r
345         if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); }\r
346 \r
347         if (isXUL()) {\r
348                 dojo.require('openils.Event');\r
349                 dojo.require('openils.PermaCrud');\r
350                 var mfhd_edit = new dijit.Menu({});\r
351                 new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first");\r
352                 new dijit.MenuItem({onClick:function(){\r
353                         var pcrud = new openils.PermaCrud({"authtoken": G.user.session});\r
354                         var mfhd_rec = pcrud.retrieve("sre", holdings.id());\r
355                         if (mfhd_rec) {\r
356                                 pcrud.eliminate(mfhd_rec);\r
357                                 alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()]));\r
358                         }\r
359                 }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last");\r
360                 // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last");\r
361                 var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"});\r
362                 mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last");\r
363                 mfhd_edit.startup();\r
364         }\r
365 }\r
366 \r
367 function _holdingsDrawMFHDEntry(entryNum, entryName, entry) {\r
368         var flatEntry = entry.toString().replace(/,/g, ', ');\r
369         dojo.place("<tr><td> </td><td nowrap='nowrap' class='rdetail_desc'>" + entryName + "</td><td class='rdetail_item'>" + flatEntry + "</td></tr>", "rdetail_holdings_tbody_" + entryNum, "last");\r
370 }\r
371 \r
372 function _rdetailDraw(r) {\r
373         record = r.getResultObject();\r
374 \r
375         runEvt('rdetail', 'recordRetrieved', record.doc_id());\r
376         \r
377         if(isInAnonList(parseInt(record.doc_id()))) { \r
378                 $('add_mylist').innerHTML = '';\r
379                 $('add_mylist').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
380         }\r
381 \r
382         G.ui.rdetail.title.appendChild(text(record.title()));\r
383         buildSearchLink(STYPE_AUTHOR, record.author(), G.ui.rdetail.author);\r
384         if(record.isbn()) { unHideMe($('rdetail_isbn_lbl')); G.ui.rdetail.isbn.appendChild(text(cleanISBN(record.isbn()))); }\r
385         if(record.edition()) { unHideMe($('rdetail_ed_lbl')); G.ui.rdetail.edition.appendChild(text(record.edition())); }\r
386         if(record.pubdate()) { unHideMe($('rdetail_pubdate_lbl')); G.ui.rdetail.pubdate.appendChild(text(record.pubdate())); }\r
387         if(record.publisher()) { unHideMe($('rdetail_pub_lbl')); G.ui.rdetail.publisher.appendChild(text(record.publisher())); }\r
388         if(record.physical_description()) { unHideMe($('rdetail_phys_lbl')); $('rdetail_physical_desc').appendChild(text(record.physical_description())); }\r
389         $('rd_reviews_and_more').href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+cleanISBN(record.isbn())+"&Options=Y";\r
390         \r
391         var code = getMarcData(record.doc_id(),"998","d");\r
392         \r
393         if(code) { unHideMe($('rdetail_form_lbl')); G.ui.rdetail.tor.innerHTML = get998dValue(code); }\r
394         if(record.synopsis()) { unHideMe($('rdetail_sum_lbl')); G.ui.rdetail.abstr.appendChild(text(record.synopsis())); }\r
395 //javascript: alert(getMarcData(22531007,"998","d"));\r
396         try{\r
397                 if(record.isbn()) {\r
398                         if(ENABLE_ADDED_CONTENT_ATTRIB_LINKS) {\r
399                                 unHideMe($('rdetail.jacket_attrib_div'));\r
400                                 var href = $('rdetail.jacket_attrib_link').getAttribute('href') +cleanISBN(record.isbn());\r
401                                 $('rdetail.jacket_attrib_link').setAttribute('href', href);\r
402                         }\r
403                         rdetailCheckForGBPreview();\r
404 \r
405                 } else {\r
406                         //hideMe($("rdetail.jacket_attrib_div"));\r
407                         //hideMe($("rdetail_img_link"));\r
408                 }\r
409         } catch(E) {}\r
410 \r
411 \r
412         // see if the record has any external links \r
413         var links = record.online_loc();\r
414         for( var i = 0; links && links.length > 0 && i < links.length; i = i + 3 ) {\r
415                 var href = links[i];\r
416                 // avoid matching "HTTP: The Complete Reference"\r
417                 if( href.match(/https?:\/|ftps?:\/|mailto:/i) ) {\r
418                         unHideMe($('rdetail_online_row'));\r
419                         // MODS can contain a display label (used for the text of the link)\r
420                         // as well as a note about the URL; many legacy systems conflate the\r
421                         // two and generate MARC records that expect the note to be used as\r
422                         // the text of the link, with no display label; here's the canonical\r
423                         // format:\r
424                         //\r
425                         // 856 40 $uhttp://localhost$yDisplay label$zPublic note\r
426                         //\r
427                         // Note that the MARC21slim2MODS XSL concatenates $3 and $y together\r
428                         // (as $y was defined later in MARC21's life as the display label)\r
429                         var displayLabel = '' + links[i+1];\r
430                         var note = '' + links[i+2];\r
431                         if(!displayLabel || displayLabel.match(/https?:\/|ftps?:\/|mailto:/i)) {\r
432                                 if(!note || note.match(/https?:\/|ftps?:\/|mailto:/i)) {\r
433                                         displayLabel = href;\r
434                                 } else {\r
435                                         displayLabel = note;\r
436                                 }\r
437                         }\r
438                         $('rdetail_online').appendChild(elem('a', {href:href,'class':'classic_link'}, displayLabel));\r
439                         if (note && note != displayLabel) {\r
440                                 $('rdetail_online').appendChild(elem('span', {'class':'url_note'}, ' - ' + note));\r
441                         }\r
442                         $('rdetail_online').appendChild(elem('br'));\r
443                 }\r
444         }\r
445 \r
446         // Fill in our unAPI ID, if anyone cares\r
447         var abbrs = document.getElementsByTagName('abbr');\r
448         var span;\r
449         for (var i = 0; i < abbrs.length; i = i + 1) {\r
450                 if (abbrs[i].getAttribute('name') == 'unapi') {\r
451                         span = abbrs[i];\r
452                         break;\r
453                 }\r
454         }\r
455         buildunAPISpan( span, 'biblio-record_entry', record.doc_id() );\r
456 \r
457     $('rdetail_place_hold').onclick = function() {\r
458         var src = location.href;\r
459 \r
460         if(forceLoginSSL && src.match(/^http:/)) {\r
461 \r
462             src = src.replace(/^http:/, 'https:');\r
463 \r
464             if(!src.match(/&place_hold=1/)) {\r
465                 src += '&place_hold=1';\r
466             }\r
467 \r
468             location.href = src;\r
469     \r
470         } else {\r
471             holdsDrawEditor({record:record.doc_id(), type:'T'});\r
472         }\r
473     }\r
474 \r
475 \r
476         var RW = $('rdetail_exp_refworks');\r
477         if (RW && rdetailEnableRefWorks) {\r
478 \r
479                 var here = (findOrgUnit(getLocation())).name();\r
480                 var org_name = here.replace(" ", "+");\r
481                 var cgi = new CGI();\r
482 \r
483                 RW.setAttribute(\r
484                         'href',\r
485                         rdetailRefWorksHost + '/express/expressimport.asp?vendor='\r
486                         + org_name\r
487                         + '&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F'\r
488                         + cgi.server_name + '/opac/extras/supercat/marctxt/record/'\r
489                         + record.doc_id()\r
490                );\r
491 \r
492                 RW.setAttribute('target', 'RefWorksMain');\r
493 \r
494                 unHideMe($('rdetail_exp_refworks_span'));\r
495         }\r
496 \r
497         //$('rdetail_img_link').setAttribute('href', buildISBNSrc(cleanISBN(record.isbn()), 'large'));\r
498         //G.ui.rdetail.image.setAttribute("src", buildISBNSrc(cleanISBN(record.isbn())));\r
499         runEvt("rdetail", "recordDrawn");\r
500         recordsCache.push(record);\r
501 \r
502         rdetailSetExtrasSelector();\r
503 \r
504         var breq = new Request(FETCH_BRE, [getRid()]);\r
505         breq.callback( rdetailCheckDeleted );\r
506         breq.send();\r
507 \r
508         //resultBuildCaches( [ record ] );\r
509         //resultDrawSubjects();\r
510         //resultDrawSeries();\r
511 \r
512         // grab added content \r
513         acCollectData(cleanISBN(record.isbn()), rdetailhandleAC);\r
514         \r
515         var currentISBN = cleanISBN(record.isbn());\r
516         \r
517             // ChiliFresh\r
518     if (chilifresh && chilifresh != '(none)' && currentISBN) {\r
519         $('chilifreshReviewLink').setAttribute('id','isbn_'+currentISBN);\r
520         $('chilifreshReviewResult').setAttribute('id','chili_review_'+currentISBN);\r
521         unHideMe($('rdetail_reviews_link'));\r
522         unHideMe($('rdetail_chilifresh_reviews'));\r
523         try {\r
524             chili_init();\r
525         } catch(E) {\r
526             alert(E + '\n');\r
527             hideMe($('rdetail_reviews_link'));\r
528             hideMe($('rdetail_chilifresh_reviews'));\r
529         }\r
530     }\r
531 \r
532         var it = getCacheValue('showHoldEditor');\r
533         if(it) {\r
534                 setCacheValue('showHoldEditor', null);\r
535                 holdsDrawEditor({record:it.record, type:it.type});\r
536         }\r
537     // Novelist\r
538     if (novelist && currentISBN) {\r
539         unHideMe($('rdetail_novelist_link'));\r
540     }\r
541 }\r
542 \r
543 \r
544 \r
545 function rdetailCheckDeleted(r) {\r
546         var br = r.getResultObject()[0];\r
547         if( isTrue(br.deleted()) ) {\r
548                 hideMe($('rdetail_place_hold'));\r
549                 $('rdetail_more_actions_selector').disabled = true;\r
550                 unHideMe($('rdetail_deleted_exp'));\r
551         }\r
552 }\r
553 \r
554 function rdetailSetExtrasSelector() {\r
555         if(!grabUser()) return;\r
556         unHideMe($('rdetail_more_actions'));\r
557 \r
558         var req = new Request( \r
559                         FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' );\r
560         req.callback(rdetailAddBookbags);\r
561         req.send();\r
562 }\r
563 \r
564 var myListsFetched = false;\r
565 var selectedItem = null;\r
566 function addMyList(id) {\r
567         if(!id) id = record.doc_id();\r
568         //if(!grabUser()) { alert("Please login first"); goTo(buildOPACLink({page:MYOPAC}, false, true)); return; }\r
569         \r
570         var holdsLink = $n($('result_table_template_'+id), 'result_my_list_link');\r
571         if(!holdsLink) holdsLink = $('add_mylist');\r
572         var lbl = $('myListLabel');\r
573         var title = "";\r
574         if(_resultFindRec) title = _resultFindRec(id);\r
575         if(title) title = title.title();\r
576         if(lbl) lbl.innerHTML = title; else lbl.innerHTML = "";\r
577         \r
578         //if(!grabUser()) {\r
579                 isCacheListDrawn = false;\r
580                 for(var i in anonListCache) {\r
581                         if(anonListCache[i] == id) {\r
582                                 anonListCache.splice(i, 1);\r
583                                 setCacheValue('anonListCache', anonListCache);\r
584                                 if(!anonListCache.length) hideMe($('cacheListLink'));\r
585                                 if(holdsLink) {\r
586                                         holdsLink.innerHTML = '';\r
587                                         holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist.gif'}, null));\r
588                                         holdsLink.title = "Add to my list";\r
589                                 }\r
590                                 return;\r
591                         }\r
592                 }       \r
593 \r
594                 anonListCache.push(id);\r
595                 setCacheValue('anonListCache', anonListCache);\r
596                 unHideMe($('cacheListLink'));\r
597                 if(holdsLink) {\r
598                         holdsLink.innerHTML = '';\r
599                         holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null));\r
600                         holdsLink.title = "Remove from my list";\r
601                 }\r
602                 return;\r
603         //}\r
604         \r
605         selectedItem = id;\r
606         var selector = $('mylist_selector');\r
607         \r
608         if(findCurrentPage()==RDETAIL) {\r
609                 unHideMe($('rdetail_more_actions_selector'));\r
610         } else if(findCurrentPage()==RRESULT) {\r
611                 hideResultsPage(true);\r
612                 unHideMe($('mylist_div'));\r
613         }\r
614         if(!myListsFetched) {\r
615                 myListsFetched = true;\r
616                 var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' );\r
617                 req.callback(showMyLists);\r
618                 req.send();\r
619         }\r
620 }\r
621 \r
622 function saveMyList() {\r
623         if(!selectedItem) return true;\r
624         var newList = $('mylist_new');\r
625         if(!newList) return true;\r
626         \r
627         var selector = $('mylist_selector');\r
628         if(!selector.options.length && !newList.value) { alert('Please choose a name for the new list'); newList.focus(); return false; }\r
629 \r
630         if(newList.value) {\r
631                 var id;\r
632                 var name = newList.value\r
633                 if(id = containerCreate(name)) {\r
634                         selector.options.length=0;\r
635                         if(!selector.options.length) {\r
636                                 unHideMe($('myListSelect'));\r
637                                 var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' );\r
638                                 req.callback(showMyLists);\r
639                                 req.send();\r
640                         }\r
641                         if(containerCreateItem(id, selectedItem)) {\r
642                                 alert('Item successfully added to list');\r
643                                 newList.value = "";\r
644                         } else { return false; }\r
645                 } else { return false; }\r
646         } else { //save to selected list\r
647                 var selectedID = selector.options[selector.selectedIndex].value;\r
648                 if(containerCreateItem(selectedID, selectedItem)) {\r
649                         alert('Item successfully added to list');\r
650                         newList.value = "";\r
651                 } else { return false; }\r
652         }\r
653         \r
654         if(findCurrentPage()==RDETAIL) {\r
655                 hideMe($('rdetail_more_actions_selector'));\r
656         } else if(findCurrentPage()==RRESULT) {\r
657                 hideResultsPage(false);\r
658         }\r
659         return true;\r
660 }\r
661 \r
662 function showMyLists(r) {\r
663         var containers = r.getResultObject();\r
664         var selector = $('mylist_selector');\r
665 \r
666         for( var i = 0; i != containers.length; i++ ) {\r
667                 var container = containers[i];\r
668                 insertSelectorVal( selector, i, container.name(), container.id(), null, 0 );\r
669         }\r
670         if(!selector.options.length) hideMe($('myListSelect'));\r
671 }\r
672 \r
673 \r
674 function rdetailAddBookbags(r) {\r
675 \r
676         var containers = r.getResultObject();\r
677         var selector = $('rdetail_more_actions_selector');\r
678         var found = false;\r
679         var index = 3;\r
680         doSelectorActions(selector);\r
681 \r
682         for( var i = 0; i != containers.length; i++ ) {\r
683                 found = true;\r
684                 var container = containers[i];\r
685                 insertSelectorVal( selector, index++, container.name(), \r
686                                 "container_" + container.id(), rdetailAddToBookbag,  1 );\r
687         }\r
688 \r
689         nextContainerIndex = index;\r
690 }\r
691 \r
692 var _actions = {};\r
693 function rdetailNewBookbag() {\r
694         var name = prompt($('rdetail_bb_new').innerHTML,"");\r
695         if(!name) return;\r
696 \r
697         var id;\r
698         if( id = containerCreate( name ) ) {\r
699                 alert($('rdetail_bb_success').innerHTML);\r
700                 var selector = $('rdetail_more_actions_selector');\r
701                 insertSelectorVal( selector, nextContainerIndex++, name, \r
702                                 "container_" + id, rdetailAddToBookbag, 1 );\r
703                 setSelector( selector, 'start' );\r
704         }\r
705 }\r
706 \r
707 \r
708 function rdetailAddToBookbag() {\r
709         var selector = $('rdetail_more_actions_selector');\r
710         var id = selector.options[selector.selectedIndex].value;\r
711         setSelector( selector, 'start' );\r
712 \r
713         if( containerCreateItem( id.substring(10), record.doc_id() )) {\r
714                 alert($('rdetail_bb_item_success').innerHTML);\r
715         }\r
716 }\r
717 \r
718 \r
719 var rdetailMarcFetched = false;\r
720 function rdetailShowExtra(type, args) {\r
721 \r
722         hideMe($('rdetail_copy_info_div'));\r
723         hideMe($('rdetail_reviews_div'));\r
724         hideMe($('rdetail_toc_div'));\r
725         hideMe($('rdetail_anotes_div'));\r
726         hideMe($('rdetail_excerpt_div'));\r
727         hideMe($('rdetail_preview_div'));\r
728         hideMe($('rdetail_marc_div'));\r
729         hideMe($('cn_browse'));\r
730         hideMe($('rdetail_cn_browse_div'));\r
731         hideMe($('rdetail_notes_div'));\r
732         hideMe($('rdetail_novelist_div'));\r
733 \r
734         removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected');\r
735         removeCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected');\r
736         removeCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected');\r
737         removeCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected');\r
738         removeCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected');\r
739         removeCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected');\r
740         removeCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected');\r
741         removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected');\r
742         removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected');\r
743         removeCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected');\r
744 \r
745         switch(type) {\r
746 \r
747                 case "copyinfo": \r
748                         unHideMe($('rdetail_copy_info_div')); \r
749                         addCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected');\r
750                         break;\r
751 \r
752                 case "reviews": \r
753                         addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected');\r
754                         unHideMe($('rdetail_reviews_div')); \r
755                         break;\r
756 \r
757                 case "excerpt": \r
758                         addCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected');\r
759                         unHideMe($('rdetail_excerpt_div'));\r
760                         break;\r
761 \r
762                 case "preview": \r
763                         addCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected');\r
764                         unHideMe($('rdetail_preview_div'));\r
765                         rdetailDisplayGBPreview();\r
766                         break;\r
767 \r
768                 case "anotes": \r
769                         addCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected');\r
770                         unHideMe($('rdetail_anotes_div'));\r
771                         break;\r
772 \r
773                 case "toc": \r
774                         addCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected');\r
775                         unHideMe($('rdetail_toc_div'));\r
776                         break;\r
777 \r
778                 case "marc": \r
779                         addCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected');\r
780                         unHideMe($('rdetail_marc_div')); \r
781                         if(rdetailMarcFetched) return;\r
782                         unHideMe($('rdetail_extras_loading'));\r
783                         rdetailMarcFetched = true;\r
784                         var req = new Request( FETCH_MARC_HTML, record.doc_id() );\r
785                         req.callback(rdetailViewMarc); \r
786                         req.send();\r
787                         break;\r
788 \r
789                 case "novelist": \r
790                         addCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected');\r
791                         unHideMe($('rdetail_novelist_div')); \r
792                         break;\r
793 \r
794                 case 'cn':\r
795                         addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected');\r
796                         unHideMe($('rdetail_cn_browse_div'));\r
797                         rdetailShowCNBrowse(defaultCN, getLocation(), null, true);\r
798                         break;\r
799 \r
800         }\r
801 }\r
802 \r
803 function rdetailVolumeDetails(args) {\r
804         var row = $(args.rowid);\r
805         var tbody = row.parentNode;\r
806         cpdBuild( tbody, row, record, args.cn, args.org, args.depth, args.copy_location );\r
807         return;\r
808 }\r
809 \r
810 function rdetailBuildCNList() {\r
811 \r
812         var select = $('cn_browse_selector');\r
813         var index = 0;\r
814         var arr = [];\r
815         for( var cn in callnumberCache ) arr.push( cn );\r
816         arr.sort();\r
817 \r
818         if( arr.length == 0 ) {\r
819                 hideMe($('rdetail_cn_browse_select_div'));\r
820                 return;\r
821         }\r
822 \r
823         for( var i in arr ) {\r
824                 var cn = arr[i];\r
825                 var opt = new Option(cn);\r
826                 select.options[index++] = opt;\r
827         }\r
828         select.onchange = rdetailGatherCN;\r
829 }\r
830 \r
831 function rdetailGatherCN() {\r
832         var cn = getSelectorVal($('cn_browse_selector'));\r
833         rdetailShowCNBrowse( cn, getLocation(), getDepth(), true );\r
834         setSelector( $('cn_browse_selector'), cn );\r
835 }\r
836 \r
837 \r
838 function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) {\r
839 \r
840         if(!cn) {\r
841                 unHideMe($('cn_browse_none'));\r
842                 hideMe($('rdetail_cn_browse_select_div'));\r
843                 return;\r
844         }\r
845 \r
846         unHideMe($('rdetail_cn_browse_select_div'));\r
847         rdetailBuildCNList();\r
848         setSelector( $('cn_browse_selector'), cn );\r
849         hideMe($('rdetail_copy_info_div'));\r
850         hideMe($('rdetail_reviews_div'));\r
851         hideMe($('rdetail_toc_div'));\r
852         hideMe($('rdetail_marc_div'));\r
853         unHideMe($('rdetail_cn_browse_div'));\r
854         unHideMe($('cn_browse'));\r
855         if( !rdetailLocalOnly && ! fromOnclick ) depth = findOrgDepth(globalOrgTree);\r
856         cnBrowseGo(cn, loc, depth);\r
857 }\r
858 \r
859 function rdetailhandleAC(data) {\r
860 \r
861         if( data.reviews.html ) {\r
862                 $('rdetail_review_container').innerHTML = data.reviews.html;\r
863                 unHideMe($('rdetail_reviews_link'));\r
864         }\r
865 \r
866         if( data.toc.html ) {\r
867                 $('rdetail_toc_div').innerHTML = data.toc.html;\r
868                 unHideMe($('rdetail_toc_link'));\r
869         }\r
870 \r
871         if( data.excerpt.html ) {\r
872                 $('rdetail_excerpt_div').innerHTML = data.excerpt.html;\r
873                 unHideMe($('rdetail_excerpt_link'));\r
874         }\r
875 \r
876         if( data.anotes.html ) {\r
877                 $('rdetail_anotes_div').innerHTML = data.anotes.html;\r
878                 unHideMe($('rdetail_anotes_link'));\r
879         }\r
880 }\r
881 \r
882 function rdetailShowReviews(r) {\r
883         hideMe($('rdetail_extras_loading'));\r
884         var res = r.getResultObject();\r
885         var par = $('rdetail_reviews_div');\r
886         var template = par.removeChild($('rdetail_review_template'));\r
887         if( res && res.length > 0 ) {\r
888                 unHideMe($('rdetail_reviews_link'));\r
889                 for( var i = 0; i != res.length; i++ ) {\r
890                         var rev = res[i];       \r
891                         if( rev.text && rev.info ) {\r
892                                 var node = template.cloneNode(true);\r
893                                 $n(node, 'review_header').appendChild(text(rev.info));\r
894                                 $n(node, 'review_text').appendChild(text(rev.text));\r
895                                 par.appendChild(node);\r
896                         }\r
897                 }\r
898         }\r
899 }\r
900 \r
901 \r
902 function rdetailShowTOC(r) {\r
903         hideMe($('rdetail_extras_loading'));\r
904         var resp = r.getResultObject();\r
905         if(resp) {\r
906                 unHideMe($('rdetail_toc_link'));\r
907                 $('rdetail_toc_div').innerHTML = resp;\r
908         }\r
909 }\r
910 \r
911 function rdetailBuildInfoRows() {\r
912         var req;\r
913         var method = FETCH_COPY_COUNTS_SUMMARY;\r
914         if (rdetailShowCopyLocation)\r
915                 method = FETCH_COPY_LOCATION_COUNTS_SUMMARY;\r
916 \r
917 \r
918         if( rdetailShowLocal ) \r
919                 req = new Request(method, record.doc_id(), 1, 0)\r
920         else\r
921                 req = new Request(method, record.doc_id());\r
922         req.callback(_rdetailBuildInfoRows);\r
923         req.send();\r
924 }\r
925 \r
926 function _rdetailRows(node) {\r
927 \r
928         if( rdetailShowLocal && /*getLocation()*/1 != globalOrgTree.id() ) {\r
929                 var loc = findOrgUnit(1/*getLocation()*/);\r
930                 if( node ) {\r
931                         if( !orgIsMine(node, loc) && !orgIsMine(loc,node) ) return;\r
932                 } else {\r
933                         for( var i = 0; i < globalOrgTree.children().length; i++ ) {\r
934                                 var org = findOrgUnit(globalOrgTree.children()[i]);\r
935                                 if( orgIsMine(org, loc) ) {\r
936                                         node = org;\r
937                                         break;\r
938                                 }\r
939                         }\r
940                 } \r
941         }\r
942 \r
943         if(!node && findOrgType(globalOrgTree.ou_type()).can_have_vols())\r
944                 node = globalOrgTree;\r
945 \r
946 \r
947         /* don't show hidden orgs */\r
948 \r
949         if(node) {\r
950 \r
951                 //if(!isXUL() && !isTrue(node.opac_visible())) return;\r
952                 if(!isXUL() && !isTrue(node.opac_visible())) {\r
953                         // locally suppressed orgs should appear in the copy summary\r
954                         if(!localSuppressedOrgs[node.id()]) {  // indexOf() on user arrays isn't supported on <= IE8\r
955                                 return; \r
956                         }\r
957         }\r
958                 \r
959                 // , 1555:true, 1499:true, 1510:true, 1538:true\r
960 \r
961                 var row = copyRow.cloneNode(true);\r
962                 row.id = "cp_info_" + node.id();\r
963 \r
964                 var libtd = findNodeByName( row, config.names.rdetail.lib_cell );\r
965                 var cntd  = findNodeByName( row, config.names.rdetail.cn_cell );\r
966                 var cpctd = findNodeByName( row, config.names.rdetail.cp_count_cell );\r
967                 var actions = $n(row, 'rdetail_actions_cell');\r
968 \r
969                 var p = libtd.getElementsByTagName('a')[0];\r
970                 libtd.insertBefore(text(node.name()), p);\r
971                 libtd.setAttribute("style", "padding-left: " + ((findOrgDepth(node) - 1)  * 9) + "px;");\r
972 \r
973                 if(!findOrgType(node.ou_type()).can_have_vols()) {\r
974 \r
975                         row.removeChild(cntd);\r
976                         row.removeChild(cpctd);\r
977                         row.removeChild(actions);\r
978                         row.setAttribute('novols', '1');\r
979 \r
980                         libtd.setAttribute("colspan", numStatuses + 3 );\r
981                         libtd.colSpan = numStatuses + 3;\r
982                         addCSSClass(row, 'copy_info_region_row');\r
983                 } \r
984 \r
985                 copyRowParent.appendChild(row);\r
986 \r
987         } else { node = globalOrgTree; }\r
988 \r
989         for( var c in node.children() ) \r
990                 _rdetailRows(node.children()[c]);\r
991 }\r
992 \r
993 function rdetailCNPrint(orgid, cn) {\r
994         var div = cpdBuildPrintWindow( record, orgid);\r
995         var template = div.removeChild($n(div, 'cnrow'));\r
996         var rowNode = $("cp_info_" + orgid);\r
997         cpdStylePopupWindow(div);\r
998         openWindow(div.innerHTML);\r
999 }\r
1000 \r
1001 var localCNFound = false;\r
1002 var ctr = 0;\r
1003 function _rdetailBuildInfoRows(r) {\r
1004         var showLibCount = 5;\r
1005 \r
1006         if (rdetailShowCopyLocation)\r
1007                 unHideMe( $n( $('rdetail_copy_info_table'), 'rdetail_copylocation_header' ));\r
1008 \r
1009         removeChildren(copyRowParent);\r
1010 \r
1011         _rdetailRows();\r
1012 \r
1013         var summary = r.getResultObject();\r
1014         if(!summary) return;\r
1015         \r
1016         // sort by name - desc\r
1017         if(getOrigLocation()) summary.sort(function(a,b){\r
1018                 if(a[0]==getOrigLocation()) return -1;\r
1019                 if(b[0]==getOrigLocation()) return 1;\r
1020                 return findOrgUnit(a[0]).name()>=findOrgUnit(b[0]).name()?1:-1;\r
1021         }); else summary.sort(function(a,b){\r
1022                 return findOrgUnit(a[0]).name()>=findOrgUnit(b[0]).name()?1:-1;\r
1023         });     \r
1024 \r
1025         var found = false;\r
1026         if(summary.length>showLibCount) unHideMe($('lib_info_more'));\r
1027         for( var i = 0; i < summary.length; i++ ) {\r
1028 \r
1029                 var arr = summary[i];\r
1030                 globalCNCache[arr[1]] = 1;\r
1031                 var thisOrg = findOrgUnit(arr[0]);\r
1032                 var rowNode = $("cp_info_" + thisOrg.id());\r
1033                 if(!rowNode) continue;\r
1034 \r
1035                 if(rowNode.getAttribute("used")) {\r
1036 \r
1037                         if( rowNode.nextSibling ) {\r
1038                                 sib = rowNode.nextSibling;\r
1039                                 o ='cp_info_'+thisOrg.id()+'_';\r
1040                                 /* push the new row on as the last row for this org unit */\r
1041                                 while( sib && sib.id.match(o) ) {\r
1042                                         sib = sib.nextSibling;\r
1043                                 }\r
1044                                 if(sib)\r
1045                                         rowNode = copyRowParent.insertBefore(copyRow.cloneNode(true), sib);\r
1046                                 else\r
1047                                         rowNode = copyRowParent.appendChild(copyRow.cloneNode(true));\r
1048                         } else {\r
1049                                 rowNode = copyRowParent.appendChild(copyRow.cloneNode(true));\r
1050                         }\r
1051 \r
1052                         var n = findNodeByName( rowNode, config.names.rdetail.lib_cell );\r
1053                         n.appendChild(text(thisOrg.name()));\r
1054                         n.setAttribute("style", "padding-left: " + ((findOrgDepth(thisOrg) - 1)  * 9) + "px;");\r
1055                         rowNode.id = "cp_info_" + thisOrg.id() + '_' + (++ctr); \r
1056 \r
1057                 } else {\r
1058                         rowNode.setAttribute("used", "1");\r
1059                 }\r
1060 \r
1061                 var cpc_temp = rowNode.removeChild(\r
1062                                 findNodeByName(rowNode, config.names.rdetail.cp_count_cell));\r
1063 \r
1064                 var statuses = arr[2];\r
1065                 var cl = '';\r
1066                 if (rdetailShowCopyLocation) {\r
1067                         cl = arr[2];\r
1068                         statuses = arr[3];\r
1069                 }\r
1070 \r
1071                 var tehTR = $('rdetails_status_head');\r
1072                 \r
1073                 if(tehTR) {\r
1074                         var par = i<showLibCount?tehTR.parentNode:$('rdetails_status2');\r
1075                         var newRow = elem('tr');\r
1076                         var lib_td = elem('td',{nowrap:"nowrap"});\r
1077                         var stat = statuses[0]?"Available":"Checked Out";\r
1078                         var url = mapLibUrl(arr[0]);\r
1079                         var libLink = elem('a',{href:url},'View Library Info');\r
1080                         if(!url) hideMe(libLink);\r
1081                         stat = statuses[6]?"Due":stat;\r
1082                         lib_td.appendChild(libLink);\r
1083                         \r
1084                         newRow.appendChild(elem('td',{nowrap:"nowrap"},thisOrg.name()));\r
1085                         newRow.appendChild(elem('td',{nowrap:"nowrap"},cl));\r
1086                         newRow.appendChild(lib_td);\r
1087                         newRow.appendChild(elem('td',{nowrap:"nowrap"},stat));\r
1088                         newRow.appendChild(elem('td',{nowrap:"nowrap"},arr[1]));\r
1089                         par.appendChild(newRow);\r
1090                 }\r
1091 \r
1092                 rdetailApplyStatuses(rowNode, cpc_temp, statuses);\r
1093 \r
1094                 var isLocal = false;\r
1095                 if( orgIsMine( findOrgUnit(getLocation()), thisOrg ) ) { \r
1096                         found = true; \r
1097                         isLocal = true; \r
1098                         if(!localCNFound) {\r
1099                                 localCNFound = true;\r
1100                                 defaultCN = arr[1];\r
1101                         }\r
1102                 }\r
1103 \r
1104                 //if(isLocal) unHideMe(rowNode);\r
1105                 unHideMe(rowNode);\r
1106 \r
1107                 rdetailSetPath( thisOrg, isLocal );\r
1108                 rdetailBuildBrowseInfo( rowNode, arr[1], isLocal, thisOrg, cl );\r
1109 \r
1110                 if( i == summary.length - 1 && !defaultCN) defaultCN = arr[1];\r
1111         }\r
1112 \r
1113         if(!found) unHideMe(G.ui.rdetail.cp_info_none);\r
1114 }\r
1115 \r
1116 function rdetailBuildBrowseInfo(row, cn, local, orgNode, cl) {\r
1117         if(local) {\r
1118                 var cache = callnumberCache[cn];\r
1119                 if( cache ) cache.count++;\r
1120                 else callnumberCache[cn] = { count : 1 };\r
1121         }\r
1122 \r
1123         var depth = getDepth();\r
1124         if( !local ) depth = findOrgDepth(globalOrgTree);\r
1125 \r
1126         $n(row, 'rdetail_callnumber_cell').appendChild(text(cn));\r
1127 \r
1128         if (rdetailShowCopyLocation) {\r
1129                 var cl_cell = $n(row, 'rdetail_copylocation_cell');\r
1130                 cl_cell.appendChild(text(cl));\r
1131                 unHideMe(cl_cell);\r
1132         }\r
1133 \r
1134         _debug('setting action clicks for cn ' + cn);\r
1135 \r
1136         var dHref = 'javascript:rdetailVolumeDetails('+\r
1137                         '{copy_location : "'+cl+'", rowid : "'+row.id+'", cn :"'+cn+'", depth:"'+depth+'", org:"'+orgNode.id()+'", local: '+local+'});';\r
1138 \r
1139         var bHref = 'javascript:rdetailShowCNBrowse("' + cn + '", '+orgNode.id()+', "'+depth+'");'; \r
1140 \r
1141         unHideMe( $n(row, 'details') )\r
1142                 $n(row, 'details').setAttribute('href', dHref);\r
1143         unHideMe( $n(row, 'browse') )\r
1144                 $n(row, 'browse').setAttribute('href', bHref);\r
1145 \r
1146         if(isXUL()) {\r
1147                 unHideMe($n(row, 'hold_div'));\r
1148                 $n(row, 'hold').onclick = function() {\r
1149                         var req = new Request(FETCH_VOLUME_BY_INFO, cn, record.doc_id(), orgNode.id());\r
1150                         req.callback(\r
1151                                         function(r) {\r
1152                                         var vol = r.getResultObject();\r
1153                                         holdsDrawEditor({type: 'V', volumeObject : vol});\r
1154                                         });\r
1155                         req.send();\r
1156                 };\r
1157         }\r
1158 }\r
1159 \r
1160 // sets the path to org as 'active' and displays the path if it's local \r
1161 function rdetailSetPath(org, local) {\r
1162         if( findOrgDepth(org) == 0 ) return;\r
1163         var row = $("cp_info_" + org.id());\r
1164         row.setAttribute("hasinfo", "1");\r
1165         unHideMe(row);\r
1166         rdetailSetPath(findOrgUnit(org.parent_ou()), local);\r
1167 }\r
1168 \r
1169 //Append all the statuses for a given summary to the \r
1170 //copy summary table \r
1171 function rdetailApplyStatuses( row, template, statuses ) {\r
1172         for( var j in _statusPositions ) {\r
1173                 var stat = _statusPositions[j];\r
1174                 var val = statuses[stat.id()];\r
1175                 var nn = template.cloneNode(true);\r
1176                 if(val) nn.appendChild(text(val));\r
1177                 else nn.appendChild(text(0));\r
1178                 row.appendChild(nn);\r
1179         }\r
1180 }\r
1181 \r
1182 //Add one td (creating a new column) to the copy summary\r
1183 //table for each opac_visible copy status\r
1184 function rdetailBuildStatusColumns() {\r
1185 \r
1186         rdetailGrabCopyStatuses();\r
1187         var parent = statusRow;\r
1188         var template = parent.removeChild(G.ui.rdetail.cp_status);\r
1189 \r
1190         var i = 0;\r
1191         for( i = 0; i < cp_statuses.length; i++ ) {\r
1192 \r
1193                 var c = cp_statuses[i];\r
1194                 if( c && isTrue(c.opac_visible()) ) {\r
1195                         var name = c.name();\r
1196                         _statusPositions[i] = c;\r
1197                         var node = template.cloneNode(true);\r
1198                         var data = findNodeByName( node, config.names.rdetail.cp_status);\r
1199 \r
1200                         data.appendChild(text(name));\r
1201                         parent.appendChild(node);\r
1202                 }\r
1203         }       \r
1204 \r
1205         numStatuses = 0;\r
1206         for(x in _statusPositions) numStatuses++; \r
1207 }\r
1208 \r
1209 function rdetailGrabCopyStatuses() {\r
1210         if(cp_statuses) return cp_statuses;\r
1211         var req = new Request(FETCH_COPY_STATUSES);\r
1212         req.send(true);\r
1213         cp_statuses = req.result();\r
1214         cp_statuses = cp_statuses.sort(_rdetailSortStatuses);\r
1215 }\r
1216 \r
1217 function _rdetailSortStatuses(a, b) {\r
1218         return parseInt(a.id()) - parseInt(b.id());\r
1219 }\r
1220 \r
1221 /**\r
1222  * Check for a Google Book preview \r
1223  */\r
1224 function rdetailCheckForGBPreview() {\r
1225         if (!rdetailGoogleBookPreview) return;\r
1226         searchForGBPreview( cleanISBN(record.isbn()) );\r
1227 }\r
1228 \r
1229 /**\r
1230  *\r
1231  * @param {DOM object} query The form element containing the\r
1232  *                     input parameters "isbns"\r
1233  */\r
1234 function searchForGBPreview( isbn ) {\r
1235 \r
1236         // Delete any previous Google Booksearch JSON queries.\r
1237         var GBPJsonScript = document.getElementById("GBPJsonScript");\r
1238         if (GBPJsonScript) {\r
1239                 GBPJsonScript.parentNode.removeChild(GBPJsonScript);\r
1240         }\r
1241 \r
1242         // Add a script element with the src as the user's Google Booksearch query. \r
1243         // JSON output is specified by including the alt=json-in-script argument\r
1244         // and the callback function is also specified as a URI argument.\r
1245         var GBPScriptElement = document.createElement("script");\r
1246 \r
1247         GBPScriptElement.setAttribute("id", "GBPJsonScript");\r
1248         GBPScriptElement.setAttribute("src",\r
1249                         "http://books.google.com/books?bibkeys=" + \r
1250                         isbn + "&jscmd=viewapi&callback=GBPreviewCallback");\r
1251         GBPScriptElement.setAttribute("type", "text/javascript");\r
1252 \r
1253         // make the request to Google booksearch\r
1254         document.documentElement.firstChild.appendChild(GBPScriptElement);\r
1255 }\r
1256 \r
1257 /**\r
1258  * This function is the call-back function for the JSON scripts which \r
1259  * executes a Google book search response.\r
1260  *\r
1261  * XXX I18N of text needed\r
1262  *\r
1263  * @param {JSON} booksInfo is the JSON object pulled from the Google books service.\r
1264  */\r
1265 function GBPreviewCallback(GBPBookInfo) {\r
1266         var GBPreviewDiv = document.getElementById("rdetail_preview_div");\r
1267         var GBPBook;\r
1268 \r
1269         for ( i in GBPBookInfo ) {\r
1270                 GBPBook = GBPBookInfo[i];\r
1271         }\r
1272 \r
1273         if ( !GBPBook ) {\r
1274                 return;\r
1275         }\r
1276 \r
1277         if ( GBPBook.preview != "noview" ) {\r
1278                 if ( GBPBook.preview == 'full' ) {\r
1279                         setText( $('rdetail_preview_link'), $('rdetail_preview_full_text').innerHTML );\r
1280                         $('rdetail_preview_link_a').title = $('rdetail_preview_title').innerHTML;      \r
1281                 }\r
1282 \r
1283                 // Add a button below the book cover image to load the preview.\r
1284                 GBPBadge = document.createElement( 'img' );\r
1285                 GBPBadge.src = 'http://books.google.com/intl/en/googlebooks/images/gbs_preview_button1.gif';\r
1286                 GBPBadge.title = $('rdetail_preview_badge').innerHTML;\r
1287                 GBPBadge.style.border = 0;\r
1288                 GBPBadgelink = document.createElement( 'a' );\r
1289                 GBPBadgelink.href = 'javascript:rdetailShowExtra("preview");';\r
1290                 GBPBadgelink.appendChild( GBPBadge );\r
1291                 $('rdetail_image_cell').appendChild( GBPBadgelink );\r
1292                 $('rdetail_preview_div').style.height = 600;\r
1293 \r
1294                 /* Display the "Preview" tab in the Extras section */\r
1295                 unHideMe( $('rdetail_preview_link' ) );\r
1296         }\r
1297 }\r
1298 \r
1299 /**\r
1300  *  This is called when the user clicks on the 'Preview' link.  We assume\r
1301  *  a preview is available from Google if this link was made visible.\r
1302  *\r
1303  * XXX I18N of Google Book Preview language attribute needed\r
1304  */\r
1305 function rdetailDisplayGBPreview() {\r
1306         unHideMe($('rdetail_extras_loading'));\r
1307         GBPreviewPane = $('rdetail_preview_div');\r
1308         if ( GBPreviewPane.getAttribute('loaded') == null ||\r
1309                 GBPreviewPane.getAttribute('loaded') == "false" ) {\r
1310                 google.load("books", "0", {"callback" : rdetailGBPViewerLoadCallback, "language": "en"} );\r
1311                 GBPreviewPane.setAttribute('loaded', 'true');\r
1312         }\r
1313 }\r
1314 \r
1315 function rdetailGBPViewerLoadCallback() {\r
1316         hideMe($('rdetail_extras_loading'));\r
1317         var GBPViewer = new google.books.DefaultViewer(document.getElementById('rdetail_preview_div'));\r
1318         GBPViewer.load('ISBN:' + cleanISBN(record.isbn()) );\r
1319 \r
1320 }\r