]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/copy_details.js
992c9a0c13aab8674f3d5be07a627a1f2b9aaefa
[working/Evergreen.git] / Open-ILS / web / opac / skin / default / js / copy_details.js
1 var cpdTemplate;
2 var cpdCounter = 0;
3 var cpdNodes = {};
4
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
9 */
10 var showDueTime = false;
11
12 function cpdBuild( contextTbody, contextRow, record, callnumber, orgid, depth, copy_location, already_fetched_copies, peer_types ) {
13         var i = cpdCheckExisting(contextRow);
14         if(i) return i;
15
16         var counter = cpdCounter++;
17
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;
22
23         /* shove a dummy a tag in before the context previous sibling */
24         /*
25         contextTbody.insertBefore( 
26                 elem('a',{name:'slot_'+templateRow.id}), contextRow.previousSibling);
27         goTo('#slot_'+templateRow.id);
28         */
29
30         if(isXUL()) {
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'));
35         }
36
37         if (isXUL() || showDueDate) {
38                 unHideMe($n(templateRow, 'due_date_label'));
39         }
40
41         unHideMe(templateRow);
42
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');
48     }
49
50         var mainTbody = $n(templateRow, 'copies_tbody');
51         var extrasRow = mainTbody.removeChild($n(mainTbody, 'copy_extras_row'));
52
53     var request_args = {
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 */
57         record                  : record,
58         callnumber              : callnumber, 
59         orgid                           : orgid,
60         depth                           : depth,
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 */
65         counter                 : counter
66     }
67
68     if (! already_fetched_copies) {
69         var req = new Request(FETCH_COPIES_FROM_VOLUME, record.doc_id(), callnumber, orgid);
70         req.callback(cpdDrawCopies);
71
72         req.request.args = request_args;
73
74         req.send();
75     } else {
76         setTimeout(
77             function() {
78                 delete request_args['copy_location'];
79                 cpdDrawCopies({
80                     'args' : request_args,
81                     'getResultObject' : function() { return already_fetched_copies; }
82                 });
83             }, 0
84         );
85     }
86
87         if( contextRow.nextSibling ) 
88                 contextTbody.insertBefore( templateRow, contextRow.nextSibling );
89         else
90                 contextTbody.appendChild( templateRow );
91         _debug('creating new details row with id ' + templateRow.id);
92         cpdNodes[templateRow.id] = { templateRow : templateRow };
93         return templateRow.id;
94 }
95
96
97 function cpdBuildPrintWindow(record, orgid) {
98         var div = $('rdetail_print_details').cloneNode(true);
99         div.id = "";
100
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()));
108
109         return div;
110 }
111
112 function cpdStylePopupWindow(div) {
113         var tds = div.getElementsByTagName('td');
114         for( var i = 0; i < tds.length ; i++ ) {
115                 var td = tds[i];
116                 var sty = td.getAttribute('style');
117                 if(!sty) sty = "";
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);
121         }
122 }
123
124
125 /* builds a friendly print window for this CNs data */
126 function cpdBuildPrintPane(contextRow, record, cn, orgid, depth) {
127
128         var div = cpdBuildPrintWindow( record, orgid);
129
130     var whole_cn_text = (cn[0] ? cn[0] + ' ' : '') + cn[1] + (cn[2] ? ' ' + cn[2] : '');
131         $n(div, 'cn').appendChild(text(whole_cn_text));
132
133         unHideMe($n(div, 'copy_header'));
134
135         var subtbody = $n(contextRow.nextSibling, 'copies_tbody');
136         var rows = subtbody.getElementsByTagName('tr');
137
138         for( var r = 0; r < rows.length; r++ ) {
139                 var row = rows[r];
140                 if(!row) continue;
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';
147
148                 $n(div, 'tbody').appendChild(clone);
149         }
150
151         cpdStylePopupWindow(div);
152         openWindow( div.innerHTML);
153 }
154
155
156
157 /* hide any open tables and if we've already 
158         fleshed this cn, just unhide it */
159 function cpdCheckExisting( contextRow ) {
160
161         var existingid;
162         var next = contextRow.nextSibling;
163
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;
170         }
171
172         if(existingid) _debug('row exists with id ' + existingid);
173
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');
179         }
180
181         addCSSClass(contextRow, 'rdetail_context_row');
182         if(existingid) return existingid;
183         return null;
184 }
185
186 /*
187 function cpdFetchCopies(r) {
188         var args = r.args;
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);
193         req.send();
194 }
195 */
196
197 function cpdDrawCopies(r) {
198
199         var copies              = r.getResultObject();
200         var args                        = r.args;
201         var copytbody   = $n(args.templateRow, 'copies_tbody');
202         var copyrow             = copytbody.removeChild($n(copytbody, 'copies_row'));
203
204         if(isXUL()) {
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'));
209         }
210
211         if(isXUL() || showDueDate) {
212                 unHideMe($n(copyrow, 'copy_due_date_td'));
213         }
214
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;
224             req.send();
225         } else {
226             setTimeout(
227                 function(copy,row,pt) {
228                     return function() {
229                         cpdDrawCopy({
230                             'getResultObject' : function() { return copy; },
231                             'args' : r.args,
232                             'peer_type' : pt,
233                             'row' : row
234                         });
235                     };
236                 }(copies[i],row,pt), 0
237             );
238         }
239                 copytbody.appendChild(row);
240         }
241 }
242
243 function cpdDrawCopy(r) {
244         var copy = r.getResultObject();
245         var row  = r.row;
246         var pt   = r.peer_type;
247     var trow = r.args.templateRow;
248
249     if (r.args.copy_location && copy.location().name() != r.args.copy_location) {
250         hideMe(row);
251         return;
252     }
253
254         var b = $n(row, 'barcode').appendChild(text(copy.barcode()));
255
256     /* show the peer type*/
257     if (pt) {
258         $n(row, 'barcode').appendChild(text(' :: ' + pt));
259     }
260
261         $n(row, 'location').appendChild(text(copy.location().name()));
262         $n(row, 'status').appendChild(text(copy.status().name()));
263
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()));
273         }
274     }
275
276     /* show the other bibs link */
277     if (copy.peer_record_maps().length > 0) {
278         var l = $n(row, 'copy_multi_home');
279         unHideMe(l);
280         var link_args = {};
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() );
286         }
287         l.setAttribute('href',buildOPACLink(link_args));
288     }
289
290         if(isXUL()) {
291                 /* show the hold link */
292                 var l = $n(row, 'copy_hold_link');
293                 unHideMe(l);
294                 l.onclick = function() {
295                         holdsDrawEditor( 
296                                 { 
297                                         type                    : 'C',
298                                         copyObject      : copy,
299                                         onComplete      : function(){}
300                                 }
301                         );
302                 }
303
304                 /* show the book now link */
305                 l = $n(row, 'copy_reserve_link');
306                 unHideMe(l);
307                 l.onclick = function() {
308                         // XXX FIXME this duplicates things in cat/util.js
309                         // Also needs i18n
310                         dojo.require("fieldmapper.Fieldmapper");
311                         var r = fieldmapper.standardRequest(
312                                 ["open-ils.booking",
313                                         "open-ils.booking.resources.create_from_copies"],
314                                 [G.user.session, [copy.id()]]
315                         );
316                         if (!r) {
317                                 alert("No response from server!");
318                         } else if (r.ilsevent != undefined) {
319                                 alert("Error from server:\n" + js2JSON(r));
320                         } else {
321                                 xulG.auth = {"session": {"key": G.user.session}};
322                                 xulG.bresv_interface_opts = {"booking_results": r};
323                                 location.href = "/eg/booking/reservation";
324                         }
325                 }
326
327                 if( copy.age_protect() ) 
328                         appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
329
330                 var cd = copy.create_date();
331                 cd = cd.replace(/T.*/, '');
332                 $n(row, 'create_date_value').appendChild(text(cd));
333
334                 var yes = $('rdetail.yes').innerHTML;
335                 var no = $('rdetail.no').innerHTML;
336
337                 if( isTrue(copy.holdable()) &&
338                                 isTrue(copy.location().holdable()) &&
339                                 isTrue(copy.status().holdable()) ) {
340                         $n(row, 'copy_is_holdable').appendChild(text(yes));     
341                 } else {
342                         $n(row, 'copy_is_holdable').appendChild(text(no));      
343                 }
344         }
345
346         if (isXUL() || showDueDate) {
347                 var circ;
348                 if( copy.circulations() ) {
349                         circ = copy.circulations()[0];
350                         if( circ ) {
351                                 var due_time = dojo.date.stamp.fromISOString(circ.due_date());
352                                 if( showDueTime ) {
353                                         $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
354                                 } else {
355                                         $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
356                                 }
357                         }
358                 }
359         }
360
361         r.args.copy = copy;
362         r.args.copyrow = row;
363         cpdShowNotes(copy, r.args)
364         cpdShowStats(copy, r.args);
365
366 }
367
368 function _cpdExtrasInit(args) {
369
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');
375         newrow.id       = newrid;
376
377         var cr = args.copyrow;
378         var nr = cr.nextSibling;
379         var np = args.mainTbody;
380
381         /* insert the extras row into the main table */
382         if(nr) np.insertBefore( newrow, nr );
383         else np.appendChild(newrow);
384
385         var link = $n(args.copyrow, 'details_link');
386         var link2 = $n(args.copyrow, 'less_details_link');
387         var id = newrow.id;
388         link.id = id + '_morelink';
389         link2.id = id + '_lesslink';
390         unHideMe(link);
391         hideMe(link2);
392
393         link.setAttribute('href', 
394                         'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
395
396         link2.setAttribute('href', 
397                         'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
398
399         return [ tbody, rowt ];
400 }
401
402 function cpdShowNotes(copy, args) {
403         var notes = copy.notes();
404         if(!notes || notes.length == 0) return;
405
406         var a = _cpdExtrasInit(args);
407         var tbody = a[0];
408         var rowt = a[1];
409
410         for( var n in notes ) {
411                 var note = notes[n];
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'));
417                 unHideMe(row);
418                 tbody.appendChild(row);
419         }
420 }
421
422
423 function cpdShowStats(copy, args) {
424         var entries = copy.stat_cat_entry_copy_maps();
425         if(!entries || entries.length == 0) return;
426
427         var visibleStatCat = false;
428
429         /*
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
434         */
435
436         for( var n in entries )
437         {
438                         var entry = entries[n];
439                         if(isTrue(entry.stat_cat().opac_visible()))
440                         {
441                                 visibleStatCat = true;
442                                 break;
443                         }
444         }
445
446         if(!(isXUL() || visibleStatCat)) return;
447
448         var a = _cpdExtrasInit(args);
449         var tbody = a[0];
450         var rowt = a[1];
451
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'));
459                 unHideMe(row);
460                 tbody.appendChild(row);
461         }
462 }
463