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 var b = $n(row, 'barcode').appendChild(text(copy.barcode()));
256 /* show the peer type*/
258 $n(row, 'barcode').appendChild(text(' :: ' + pt));
261 $n(row, 'location').appendChild(text(copy.location().name()));
262 $n(row, 'status').appendChild(text(copy.status().name()));
264 // append comma-separated list of part this copy is linked to
265 if(copy.parts() && copy.parts().length) {
266 unHideMe($n(trow, 'copy_part_label'));
267 unHideMe($n(row, 'copy_part'));
268 for(var i = 0; i < copy.parts().length; i++) {
269 var part = copy.parts()[i];
270 var node = $n(row, 'copy_part');
271 if(i > 0) node.appendChild(text(','));
272 node.appendChild(text(part.label()));
276 /* show the other bibs link */
277 if (copy.peer_record_maps().length > 0) {
278 var l = $n(row, 'copy_multi_home');
281 link_args.page = RRESULT;
282 link_args[PARAM_RTYPE] = RTYPE_LIST;
283 link_args[PARAM_RLIST] = new Array();
284 for (var i = 0; i < copy.peer_record_maps().length; i++) {
285 link_args[PARAM_RLIST].push( copy.peer_record_maps()[i].peer_record() );
287 l.setAttribute('href',buildOPACLink(link_args));
291 /* show the hold link */
292 var l = $n(row, 'copy_hold_link');
294 l.onclick = function() {
299 onComplete : function(){}
304 /* show the book now link */
305 l = $n(row, 'copy_reserve_link');
307 l.onclick = function() {
308 // XXX FIXME this duplicates things in cat/util.js
310 dojo.require("fieldmapper.Fieldmapper");
311 var r = fieldmapper.standardRequest(
313 "open-ils.booking.resources.create_from_copies"],
314 [G.user.session, [copy.id()]]
317 alert("No response from server!");
318 } else if (r.ilsevent != undefined) {
319 alert("Error from server:\n" + js2JSON(r));
321 xulG.auth = {"session": {"key": G.user.session}};
322 xulG.bresv_interface_opts = {"booking_results": r};
323 location.href = "/eg/booking/reservation";
327 if( copy.age_protect() )
328 appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
330 var cd = copy.create_date();
331 cd = cd.replace(/T.*/, '');
332 $n(row, 'create_date_value').appendChild(text(cd));
334 var yes = $('rdetail.yes').innerHTML;
335 var no = $('rdetail.no').innerHTML;
337 if( isTrue(copy.holdable()) &&
338 isTrue(copy.location().holdable()) &&
339 isTrue(copy.status().holdable()) ) {
340 $n(row, 'copy_is_holdable').appendChild(text(yes));
342 $n(row, 'copy_is_holdable').appendChild(text(no));
346 if (isXUL() || showDueDate) {
348 if( copy.circulations() ) {
349 circ = copy.circulations()[0];
351 var due_time = dojo.date.stamp.fromISOString(circ.due_date());
353 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
355 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
362 r.args.copyrow = row;
363 cpdShowNotes(copy, r.args)
364 cpdShowStats(copy, r.args);
368 function _cpdExtrasInit(args) {
370 var newrid = 'extras_row_' + args.copy.barcode();
371 var newrow = $(newrid);
372 if(!newrow) newrow = args.extrasRow.cloneNode(true);
373 var tbody = $n(newrow, 'extras_tbody');
374 var rowt = $n(tbody, 'extras_row');
377 var cr = args.copyrow;
378 var nr = cr.nextSibling;
379 var np = args.mainTbody;
381 /* insert the extras row into the main table */
382 if(nr) np.insertBefore( newrow, nr );
383 else np.appendChild(newrow);
385 var link = $n(args.copyrow, 'details_link');
386 var link2 = $n(args.copyrow, 'less_details_link');
388 link.id = id + '_morelink';
389 link2.id = id + '_lesslink';
393 link.setAttribute('href',
394 'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
396 link2.setAttribute('href',
397 'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
399 return [ tbody, rowt ];
402 function cpdShowNotes(copy, args) {
403 var notes = copy.notes();
404 if(!notes || notes.length == 0) return;
406 var a = _cpdExtrasInit(args);
410 for( var n in notes ) {
412 if(!isTrue(note.pub())) continue;
413 var row = rowt.cloneNode(true);
414 $n(row, 'key').appendChild(text(note.title()));
415 $n(row, 'value').appendChild(text(note.value()));
416 unHideMe($n(row, 'note'));
418 tbody.appendChild(row);
423 function cpdShowStats(copy, args) {
424 var entries = copy.stat_cat_entry_copy_maps();
425 if(!entries || entries.length == 0) return;
427 var visibleStatCat = false;
430 check all copy stat cats; if we find one that's OPAC visible,
431 set the flag and break the loop. If we've found one, or we're
432 in the staff client, build the table. if not, we return doing
433 nothing, as though the stat_cat_entry_copy_map was empty or null
436 for( var n in entries )
438 var entry = entries[n];
439 if(isTrue(entry.stat_cat().opac_visible()))
441 visibleStatCat = true;
446 if(!(isXUL() || visibleStatCat)) return;
448 var a = _cpdExtrasInit(args);
452 for( var n in entries ) {
453 var entry = entries[n];
454 if(!(isXUL() || isTrue(entry.stat_cat().opac_visible()))) continue;
455 var row = rowt.cloneNode(true);
456 $n(row, 'key').appendChild(text(entry.stat_cat().name()));
457 $n(row, 'value').appendChild(text(entry.stat_cat_entry().value()));
458 unHideMe($n(row, 'cat'));
460 tbody.appendChild(row);