5 /* showDueDate will show the due date in the OPAC */
6 var showDueDate = false;
7 /* showDueTime will show the due time (hours and minutes) in the OPAC;
8 if showDueDate is false, then showDueTime has no effect
10 var showDueTime = false;
12 function cpdBuild( contextTbody, contextRow, record, callnumber, orgid, depth, copy_location, already_fetched_copies, peer_types ) {
13 var i = cpdCheckExisting(contextRow);
16 var counter = cpdCounter++;
18 /* yank out all of the template rows */
19 if(!cpdTemplate) cpdTemplate = $('rdetail_volume_details_row');
20 var templateRow = cpdTemplate.cloneNode(true);
21 templateRow.id = 'cpd_row_' + counter;
23 /* shove a dummy a tag in before the context previous sibling */
25 contextTbody.insertBefore(
26 elem('a',{name:'slot_'+templateRow.id}), contextRow.previousSibling);
27 goTo('#slot_'+templateRow.id);
31 /* unhide before we unhide/clone the parent */
32 unHideMe($n(templateRow, 'age_protect_label'));
33 unHideMe($n(templateRow, 'create_date_label'));
34 unHideMe($n(templateRow, 'holdable_label'));
37 if (isXUL() || showDueDate) {
38 unHideMe($n(templateRow, 'due_date_label'));
41 unHideMe(templateRow);
43 var print = $n(templateRow,'print');
44 print.onclick = function() { cpdBuildPrintPane(
45 contextRow, record, callnumber, orgid, depth) };
46 if (callnumber == null) {
47 addCSSClass(print,'hide_me');
50 var mainTbody = $n(templateRow, 'copies_tbody');
51 var extrasRow = mainTbody.removeChild($n(mainTbody, 'copy_extras_row'));
54 peer_types : peer_types, /* indexed the same as already_fetched_copies */
55 contextTbody : contextTbody, /* tbody that holds the contextrow */
56 contextRow : contextRow, /* the row our new row will be inserted after */
58 callnumber : callnumber,
61 templateRow : templateRow, /* contains everything */
62 copy_location : copy_location,
63 mainTbody : mainTbody, /* holds the copy rows */
64 extrasRow : extrasRow, /* wrapper row for all extras */
68 if (! already_fetched_copies) {
69 var req = new Request(FETCH_COPIES_FROM_VOLUME, record.doc_id(), callnumber, orgid);
70 req.callback(cpdDrawCopies);
72 req.request.args = request_args;
78 delete request_args['copy_location'];
80 'args' : request_args,
81 'getResultObject' : function() { return already_fetched_copies; }
87 if( contextRow.nextSibling )
88 contextTbody.insertBefore( templateRow, contextRow.nextSibling );
90 contextTbody.appendChild( templateRow );
91 _debug('creating new details row with id ' + templateRow.id);
92 cpdNodes[templateRow.id] = { templateRow : templateRow };
93 return templateRow.id;
97 function cpdBuildPrintWindow(record, orgid) {
98 var div = $('rdetail_print_details').cloneNode(true);
101 $n(div, 'lib').appendChild(text(findOrgUnit(orgid).name()));
102 $n(div, 'title').appendChild(text(record.title()));
103 $n(div, 'author').appendChild(text(record.author()));
104 $n(div, 'edition').appendChild(text(record.edition()));
105 $n(div, 'pubdate').appendChild(text(record.pubdate()));
106 $n(div, 'publisher').appendChild(text(record.publisher()));
107 $n(div, 'phys').appendChild(text(record.physical_description()));
112 function cpdStylePopupWindow(div) {
113 var tds = div.getElementsByTagName('td');
114 for( var i = 0; i < tds.length ; i++ ) {
116 var sty = td.getAttribute('style');
118 td.setAttribute('style', sty + 'padding: 2px; border: 1px solid #F0F0E0;');
119 if( td.className && td.className.match(/hide_me/) )
120 td.parentNode.removeChild(td);
125 /* builds a friendly print window for this CNs data */
126 function cpdBuildPrintPane(contextRow, record, cn, orgid, depth) {
128 var div = cpdBuildPrintWindow( record, orgid);
130 var whole_cn_text = (cn[0] ? cn[0] + ' ' : '') + cn[1] + (cn[2] ? ' ' + cn[2] : '');
131 $n(div, 'cn').appendChild(text(whole_cn_text));
133 unHideMe($n(div, 'copy_header'));
135 var subtbody = $n(contextRow.nextSibling, 'copies_tbody');
136 var rows = subtbody.getElementsByTagName('tr');
138 for( var r = 0; r < rows.length; r++ ) {
141 var name = row.getAttribute('name');
142 if( name.match(/extras_row/) ) continue; /* hide the copy notes, stat-cats */
143 var clone = row.cloneNode(true);
144 var links = clone.getElementsByTagName('a');
145 for( var i = 0; i < links.length; i++ )
146 links[i].style.display = 'none';
148 $n(div, 'tbody').appendChild(clone);
151 cpdStylePopupWindow(div);
152 openWindow( div.innerHTML);
157 /* hide any open tables and if we've already
158 fleshed this cn, just unhide it */
159 function cpdCheckExisting( contextRow ) {
162 var next = contextRow.nextSibling;
164 if( next && next.getAttribute('templateRow') ) {
165 var obj = cpdNodes[next.id];
166 if(obj.templateRow.className.match(/hide_me/))
167 unHideMe(obj.templateRow);
168 else hideMe(obj.templateRow);
169 existingid = next.id;
172 if(existingid) _debug('row exists with id ' + existingid);
174 for( var o in cpdNodes ) {
175 var node = cpdNodes[o];
176 if( existingid && o == existingid ) continue;
177 hideMe(node.templateRow);
178 removeCSSClass(node.templateRow.previousSibling, 'rdetail_context_row');
181 addCSSClass(contextRow, 'rdetail_context_row');
182 if(existingid) return existingid;
187 function cpdFetchCopies(r) {
189 args.cn = r.getResultObject();
190 var req = new Request(FETCH_COPIES_FROM_VOLUME, args.cn.id());
191 req.request.args = args;
192 req.callback(cpdDrawCopies);
197 function cpdDrawCopies(r) {
199 var copies = r.getResultObject();
201 var copytbody = $n(args.templateRow, 'copies_tbody');
202 var copyrow = copytbody.removeChild($n(copytbody, 'copies_row'));
205 /* unhide before we unhide/clone the parent */
206 unHideMe($n(copyrow, 'age_protect_value'));
207 unHideMe($n(copyrow, 'create_date_value'));
208 unHideMe($n(copyrow, 'copy_holdable_td'));
211 if(isXUL() || showDueDate) {
212 unHideMe($n(copyrow, 'copy_due_date_td'));
215 for( var i = 0; i < copies.length; i++ ) {
216 var row = copyrow.cloneNode(true);
217 var copyid = copies[i];
218 var pt; if (args.peer_types) pt = args.peer_types[i];
219 if (typeof copyid != 'object') {
220 var req = new Request(FETCH_FLESHED_COPY, copyid);
221 req.callback(cpdDrawCopy);
222 req.request.args = r.args;
223 req.request.row = row;
227 function(copy,row,pt) {
230 'getResultObject' : function() { return copy; },
236 }(copies[i],row,pt), 0
239 copytbody.appendChild(row);
243 function cpdDrawCopy(r) {
244 var copy = r.getResultObject();
246 var pt = r.peer_type;
247 var trow = r.args.templateRow;
249 if (r.args.copy_location && copy.location().name() != r.args.copy_location) {
254 // Make barcode more useful for staff client usage
256 var my_a = document.createElement('a');
257 my_a.appendChild(text(copy.barcode()));
258 my_a.setAttribute("href","javascript:void(0);");
259 my_a.onclick = function() {
260 xulG.new_tab(xulG.urls.XUL_COPY_STATUS, {}, {'from_item_details_new': true, 'barcodes': [copy.barcode()]});
262 $n(row, 'barcode').appendChild(my_a);
265 $n(row, 'barcode').appendChild(text(copy.barcode()));
268 /* show the peer type*/
270 $n(row, 'barcode').appendChild(text(' :: ' + pt));
273 $n(row, 'location').appendChild(text(copy.location().name()));
274 $n(row, 'status').appendChild(text(copy.status().name()));
276 // append comma-separated list of part this copy is linked to
277 if(copy.parts() && copy.parts().length) {
278 unHideMe($n(trow, 'copy_part_label'));
279 unHideMe($n(row, 'copy_part'));
280 for(var i = 0; i < copy.parts().length; i++) {
281 var part = copy.parts()[i];
282 var node = $n(row, 'copy_part');
283 if(i > 0) node.appendChild(text(','));
284 node.appendChild(text(part.label()));
288 /* show the other bibs link */
289 if (copy.peer_record_maps().length > 0) {
290 var l = $n(row, 'copy_multi_home');
293 link_args.page = RRESULT;
294 link_args[PARAM_RTYPE] = RTYPE_LIST;
295 link_args[PARAM_RLIST] = new Array();
296 for (var i = 0; i < copy.peer_record_maps().length; i++) {
297 link_args[PARAM_RLIST].push( copy.peer_record_maps()[i].peer_record() );
299 l.setAttribute('href',buildOPACLink(link_args));
303 /* show the hold link */
304 var l = $n(row, 'copy_hold_link');
306 l.onclick = function() {
311 onComplete : function(){}
316 /* show the book now link */
317 l = $n(row, 'copy_reserve_link');
319 l.onclick = function() {
320 // XXX FIXME this duplicates things in cat/util.js
322 dojo.require("fieldmapper.Fieldmapper");
323 var r = fieldmapper.standardRequest(
325 "open-ils.booking.resources.create_from_copies"],
326 [G.user.session, [copy.id()]]
329 alert("No response from server!");
330 } else if (r.ilsevent != undefined) {
331 alert("Error from server:\n" + js2JSON(r));
333 xulG.auth = {"session": {"key": G.user.session}};
334 xulG.bresv_interface_opts = {"booking_results": r};
335 location.href = "/eg/booking/reservation";
339 if( copy.age_protect() )
340 appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
342 var cd = copy.create_date();
343 cd = cd.replace(/T.*/, '');
344 $n(row, 'create_date_value').appendChild(text(cd));
346 var yes = $('rdetail.yes').innerHTML;
347 var no = $('rdetail.no').innerHTML;
349 if( isTrue(copy.holdable()) &&
350 isTrue(copy.location().holdable()) &&
351 isTrue(copy.status().holdable()) ) {
352 $n(row, 'copy_is_holdable').appendChild(text(yes));
354 $n(row, 'copy_is_holdable').appendChild(text(no));
358 if (isXUL() || showDueDate) {
360 if( copy.circulations() ) {
361 circ = copy.circulations()[0];
363 var due_time = dojo.date.stamp.fromISOString(circ.due_date());
365 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
367 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
374 r.args.copyrow = row;
375 cpdShowNotes(copy, r.args)
376 cpdShowStats(copy, r.args);
380 function _cpdExtrasInit(args) {
382 var newrid = 'extras_row_' + args.copy.barcode();
383 var newrow = $(newrid);
384 if(!newrow) newrow = args.extrasRow.cloneNode(true);
385 var tbody = $n(newrow, 'extras_tbody');
386 var rowt = $n(tbody, 'extras_row');
389 var cr = args.copyrow;
390 var nr = cr.nextSibling;
391 var np = args.mainTbody;
393 /* insert the extras row into the main table */
394 if(nr) np.insertBefore( newrow, nr );
395 else np.appendChild(newrow);
397 var link = $n(args.copyrow, 'details_link');
398 var link2 = $n(args.copyrow, 'less_details_link');
400 link.id = id + '_morelink';
401 link2.id = id + '_lesslink';
405 link.setAttribute('href',
406 'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
408 link2.setAttribute('href',
409 'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
411 return [ tbody, rowt ];
414 function cpdShowNotes(copy, args) {
415 var notes = copy.notes();
416 if(!notes || notes.length == 0) return;
418 var a = _cpdExtrasInit(args);
422 for( var n in notes ) {
424 if(!isTrue(note.pub())) continue;
425 var row = rowt.cloneNode(true);
426 $n(row, 'key').appendChild(text(note.title()));
427 $n(row, 'value').appendChild(text(note.value()));
428 unHideMe($n(row, 'note'));
430 tbody.appendChild(row);
435 function cpdShowStats(copy, args) {
436 var entries = copy.stat_cat_entry_copy_maps();
437 if(!entries || entries.length == 0) return;
439 var visibleStatCat = false;
442 check all copy stat cats; if we find one that's OPAC visible,
443 set the flag and break the loop. If we've found one, or we're
444 in the staff client, build the table. if not, we return doing
445 nothing, as though the stat_cat_entry_copy_map was empty or null
448 for( var n in entries )
450 var entry = entries[n];
451 if(isTrue(entry.stat_cat().opac_visible()))
453 visibleStatCat = true;
458 if(!(isXUL() || visibleStatCat)) return;
460 var a = _cpdExtrasInit(args);
464 for( var n in entries ) {
465 var entry = entries[n];
466 if(!(isXUL() || isTrue(entry.stat_cat().opac_visible()))) continue;
467 var row = rowt.cloneNode(true);
468 $n(row, 'key').appendChild(text(entry.stat_cat().name()));
469 $n(row, 'value').appendChild(text(entry.stat_cat_entry().value()));
470 unHideMe($n(row, 'cat'));
472 tbody.appendChild(row);