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 ) {
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) };
47 var mainTbody = $n(templateRow, 'copies_tbody');
48 var extrasRow = mainTbody.removeChild($n(mainTbody, 'copy_extras_row'));
50 var req = new Request(FETCH_COPIES_FROM_VOLUME, record.doc_id(), callnumber, orgid);
51 req.callback(cpdDrawCopies);
54 contextTbody : contextTbody, /* tbody that holds the contextrow */
55 contextRow : contextRow, /* the row our new row will be inserted after */
57 callnumber : callnumber,
60 templateRow : templateRow, /* contains everything */
61 copy_location : copy_location,
62 mainTbody : mainTbody, /* holds the copy rows */
63 extrasRow : extrasRow, /* wrapper row for all extras */
67 if( contextRow.nextSibling )
68 contextTbody.insertBefore( templateRow, contextRow.nextSibling );
70 contextTbody.appendChild( templateRow );
73 _debug('creating new details row with id ' + templateRow.id);
74 cpdNodes[templateRow.id] = { templateRow : templateRow };
75 return templateRow.id;
79 function cpdBuildPrintWindow(record, orgid) {
80 var div = $('rdetail_print_details').cloneNode(true);
83 $n(div, 'lib').appendChild(text(findOrgUnit(orgid).name()));
84 $n(div, 'title').appendChild(text(record.title()));
85 $n(div, 'author').appendChild(text(record.author()));
86 $n(div, 'edition').appendChild(text(record.edition()));
87 $n(div, 'pubdate').appendChild(text(record.pubdate()));
88 $n(div, 'publisher').appendChild(text(record.publisher()));
89 $n(div, 'phys').appendChild(text(record.physical_description()));
94 function cpdStylePopupWindow(div) {
95 var tds = div.getElementsByTagName('td');
96 for( var i = 0; i < tds.length ; i++ ) {
98 var sty = td.getAttribute('style');
100 td.setAttribute('style', sty + 'padding: 2px; border: 1px solid #F0F0E0;');
101 if( td.className && td.className.match(/hide_me/) )
102 td.parentNode.removeChild(td);
107 /* builds a friendly print window for this CNs data */
108 function cpdBuildPrintPane(contextRow, record, callnumber, orgid, depth) {
110 var div = cpdBuildPrintWindow( record, orgid);
112 $n(div, 'cn').appendChild(text(callnumber));
114 unHideMe($n(div, 'copy_header'));
116 var subtbody = $n(contextRow.nextSibling, 'copies_tbody');
117 var rows = subtbody.getElementsByTagName('tr');
119 for( var r = 0; r < rows.length; r++ ) {
122 var name = row.getAttribute('name');
123 if( name.match(/extras_row/) ) continue; /* hide the copy notes, stat-cats */
124 var clone = row.cloneNode(true);
125 var links = clone.getElementsByTagName('a');
126 for( var i = 0; i < links.length; i++ )
127 links[i].style.display = 'none';
129 $n(div, 'tbody').appendChild(clone);
132 cpdStylePopupWindow(div);
133 openWindow( div.innerHTML);
138 /* hide any open tables and if we've already
139 fleshed this cn, just unhide it */
140 function cpdCheckExisting( contextRow ) {
143 var next = contextRow.nextSibling;
145 if( next && next.getAttribute('templateRow') ) {
146 var obj = cpdNodes[next.id];
147 if(obj.templateRow.className.match(/hide_me/))
148 unHideMe(obj.templateRow);
149 else hideMe(obj.templateRow);
150 existingid = next.id;
153 if(existingid) _debug('row exists with id ' + existingid);
155 for( var o in cpdNodes ) {
156 var node = cpdNodes[o];
157 if( existingid && o == existingid ) continue;
158 hideMe(node.templateRow);
159 removeCSSClass(node.templateRow.previousSibling, 'rdetail_context_row');
162 addCSSClass(contextRow, 'rdetail_context_row');
163 if(existingid) return existingid;
168 function cpdFetchCopies(r) {
170 args.cn = r.getResultObject();
171 var req = new Request(FETCH_COPIES_FROM_VOLUME, args.cn.id());
172 req.request.args = args;
173 req.callback(cpdDrawCopies);
178 function cpdDrawCopies(r) {
180 var copies = r.getResultObject();
182 var copytbody = $n(args.templateRow, 'copies_tbody');
183 var copyrow = copytbody.removeChild($n(copytbody, 'copies_row'));
186 /* unhide before we unhide/clone the parent */
187 unHideMe($n(copyrow, 'age_protect_value'));
188 unHideMe($n(copyrow, 'create_date_value'));
189 unHideMe($n(copyrow, 'copy_holdable_td'));
192 if(isXUL() || showDueDate) {
193 unHideMe($n(copyrow, 'copy_due_date_td'));
196 for( var i = 0; i < copies.length; i++ ) {
197 var row = copyrow.cloneNode(true);
198 var copyid = copies[i];
199 var req = new Request(FETCH_FLESHED_COPY, copies[i]);
200 req.callback(cpdDrawCopy);
201 req.request.args = r.args;
202 req.request.row = row;
204 copytbody.appendChild(row);
208 function cpdDrawCopy(r) {
209 var copy = r.getResultObject();
212 if (r.args.copy_location && copy.location().name() != r.args.copy_location) {
217 $n(row, 'barcode').appendChild(text(copy.barcode()));
218 $n(row, 'location').appendChild(text(copy.location().name()));
219 $n(row, 'status').appendChild(text(copy.status().name()));
222 /* show the hold link */
223 var l = $n(row, 'copy_hold_link');
225 l.onclick = function() {
230 onComplete : function(){}
235 /* show the book now link */
236 l = $n(row, 'copy_reserve_link');
238 l.onclick = function() {
239 // XXX FIXME this duplicates things in cat/util.js
241 dojo.require("fieldmapper.Fieldmapper");
242 var r = fieldmapper.standardRequest(
244 "open-ils.booking.resources.create_from_copies"],
245 [G.user.session, [copy.id()]]
248 alert("No response from server!");
249 } else if (r.ilsevent != undefined) {
250 alert("Error from server:\n" + js2JSON(r));
252 xulG.auth = {"session": {"key": G.user.session}};
253 xulG.bresv_interface_opts = {"booking_results": r};
254 location.href = "/eg/booking/reservation";
258 if( copy.age_protect() )
259 appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
261 var cd = copy.create_date();
262 cd = cd.replace(/T.*/, '');
263 $n(row, 'create_date_value').appendChild(text(cd));
265 var yes = $('rdetail.yes').innerHTML;
266 var no = $('rdetail.no').innerHTML;
268 if( isTrue(copy.holdable()) &&
269 isTrue(copy.location().holdable()) &&
270 isTrue(copy.status().holdable()) ) {
271 $n(row, 'copy_is_holdable').appendChild(text(yes));
273 $n(row, 'copy_is_holdable').appendChild(text(no));
277 if (isXUL() || showDueDate) {
279 if( copy.circulations() ) {
280 circ = copy.circulations()[0];
282 var due_time = dojo.date.stamp.fromISOString(circ.due_date());
284 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
286 $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
293 r.args.copyrow = row;
294 cpdShowNotes(copy, r.args)
295 cpdShowStats(copy, r.args);
299 function _cpdExtrasInit(args) {
301 var newrid = 'extras_row_' + args.copy.barcode();
302 var newrow = $(newrid);
303 if(!newrow) newrow = args.extrasRow.cloneNode(true);
304 var tbody = $n(newrow, 'extras_tbody');
305 var rowt = $n(tbody, 'extras_row');
308 var cr = args.copyrow;
309 var nr = cr.nextSibling;
310 var np = args.mainTbody;
312 /* insert the extras row into the main table */
313 if(nr) np.insertBefore( newrow, nr );
314 else np.appendChild(newrow);
316 var link = $n(args.copyrow, 'details_link');
317 var link2 = $n(args.copyrow, 'less_details_link');
319 link.id = id + '_morelink';
320 link2.id = id + '_lesslink';
324 link.setAttribute('href',
325 'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
327 link2.setAttribute('href',
328 'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
330 return [ tbody, rowt ];
333 function cpdShowNotes(copy, args) {
334 var notes = copy.notes();
335 if(!notes || notes.length == 0) return;
337 var a = _cpdExtrasInit(args);
341 for( var n in notes ) {
343 if(!isTrue(note.pub())) continue;
344 var row = rowt.cloneNode(true);
345 $n(row, 'key').appendChild(text(note.title()));
346 $n(row, 'value').appendChild(text(note.value()));
347 unHideMe($n(row, 'note'));
349 tbody.appendChild(row);
354 function cpdShowStats(copy, args) {
355 var entries = copy.stat_cat_entry_copy_maps();
356 if(!entries || entries.length == 0) return;
358 var visibleStatCat = false;
361 check all copy stat cats; if we find one that's OPAC visible,
362 set the flag and break the loop. If we've found one, or we're
363 in the staff client, build the table. if not, we return doing
364 nothing, as though the stat_cat_entry_copy_map was empty or null
367 for( var n in entries )
369 var entry = entries[n];
370 if(isTrue(entry.stat_cat().opac_visible()))
372 visibleStatCat = true;
377 if(!(isXUL() || visibleStatCat)) return;
379 var a = _cpdExtrasInit(args);
383 for( var n in entries ) {
384 var entry = entries[n];
385 if(!(isXUL() || isTrue(entry.stat_cat().opac_visible()))) continue;
386 var row = rowt.cloneNode(true);
387 $n(row, 'key').appendChild(text(entry.stat_cat().name()));
388 $n(row, 'value').appendChild(text(entry.stat_cat_entry().value()));
389 unHideMe($n(row, 'cat'));
391 tbody.appendChild(row);