]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/copy_details.js
e5c50c09392a15ea2e1a385009e64d101818eea9
[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 ) {
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
47         var mainTbody = $n(templateRow, 'copies_tbody');
48         var extrasRow = mainTbody.removeChild($n(mainTbody, 'copy_extras_row'));
49
50         var req = new Request(FETCH_COPIES_FROM_VOLUME, record.doc_id(), callnumber, orgid);
51         req.callback(cpdDrawCopies);
52
53         req.request.args = { 
54                 contextTbody    : contextTbody, /* tbody that holds the contextrow */
55                 contextRow              : contextRow, /* the row our new row will be inserted after */
56                 record                  : record,
57                 callnumber              : callnumber, 
58                 orgid                           : orgid,
59                 depth                           : depth,
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 */
64                 counter                 : counter
65         };
66
67         if( contextRow.nextSibling ) 
68                 contextTbody.insertBefore( templateRow, contextRow.nextSibling );
69         else
70                 contextTbody.appendChild( templateRow );
71
72         req.send();
73         _debug('creating new details row with id ' + templateRow.id);
74         cpdNodes[templateRow.id] = { templateRow : templateRow };
75         return templateRow.id;
76 }
77
78
79 function cpdBuildPrintWindow(record, orgid) {
80         var div = $('rdetail_print_details').cloneNode(true);
81         div.id = "";
82
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()));
90
91         return div;
92 }
93
94 function cpdStylePopupWindow(div) {
95         var tds = div.getElementsByTagName('td');
96         for( var i = 0; i < tds.length ; i++ ) {
97                 var td = tds[i];
98                 var sty = td.getAttribute('style');
99                 if(!sty) sty = "";
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);
103         }
104 }
105
106
107 /* builds a friendly print window for this CNs data */
108 function cpdBuildPrintPane(contextRow, record, callnumber, orgid, depth) {
109
110         var div = cpdBuildPrintWindow( record, orgid);
111
112         $n(div, 'cn').appendChild(text(callnumber));
113
114         unHideMe($n(div, 'copy_header'));
115
116         var subtbody = $n(contextRow.nextSibling, 'copies_tbody');
117         var rows = subtbody.getElementsByTagName('tr');
118
119         for( var r = 0; r < rows.length; r++ ) {
120                 var row = rows[r];
121                 if(!row) continue;
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';
128
129                 $n(div, 'tbody').appendChild(clone);
130         }
131
132         cpdStylePopupWindow(div);
133         openWindow( div.innerHTML);
134 }
135
136
137
138 /* hide any open tables and if we've already 
139         fleshed this cn, just unhide it */
140 function cpdCheckExisting( contextRow ) {
141
142         var existingid;
143         var next = contextRow.nextSibling;
144
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;
151         }
152
153         if(existingid) _debug('row exists with id ' + existingid);
154
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');
160         }
161
162         addCSSClass(contextRow, 'rdetail_context_row');
163         if(existingid) return existingid;
164         return null;
165 }
166
167 /*
168 function cpdFetchCopies(r) {
169         var args = r.args;
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);
174         req.send();
175 }
176 */
177
178 function cpdDrawCopies(r) {
179
180         var copies              = r.getResultObject();
181         var args                        = r.args;
182         var copytbody   = $n(args.templateRow, 'copies_tbody');
183         var copyrow             = copytbody.removeChild($n(copytbody, 'copies_row'));
184
185         if(isXUL()) {
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'));
190         }
191
192         if(isXUL() || showDueDate) {
193                 unHideMe($n(copyrow, 'copy_due_date_td'));
194         }
195
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;
203                 req.send();
204                 copytbody.appendChild(row);
205         }
206 }
207
208 function cpdDrawCopy(r) {
209         var copy = r.getResultObject();
210         var row  = r.row;
211
212     if (r.args.copy_location && copy.location().name() != r.args.copy_location) {
213         hideMe(row);
214         return;
215     }
216
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()));
220
221         if(isXUL()) {
222                 /* show the hold link */
223                 var l = $n(row, 'copy_hold_link');
224                 unHideMe(l);
225                 l.onclick = function() {
226                         holdsDrawEditor( 
227                                 { 
228                                         type                    : 'C',
229                                         copyObject      : copy,
230                                         onComplete      : function(){}
231                                 }
232                         );
233                 }
234
235                 /* show the book now link */
236                 l = $n(row, 'copy_reserve_link');
237                 unHideMe(l);
238                 l.onclick = function() {
239                         // XXX FIXME this duplicates things in cat/util.js
240                         // Also needs i18n
241                         dojo.require("fieldmapper.Fieldmapper");
242                         var r = fieldmapper.standardRequest(
243                                 ["open-ils.booking",
244                                         "open-ils.booking.resources.create_from_copies"],
245                                 [G.user.session, [copy.id()]]
246                         );
247                         if (!r) {
248                                 alert("No response from server!");
249                         } else if (r.ilsevent != undefined) {
250                                 alert("Error from server:\n" + js2JSON(r));
251                         } else {
252                                 xulG.auth = {"session": {"key": G.user.session}};
253                                 xulG.bresv_interface_opts = {"booking_results": r};
254                                 location.href = "/eg/booking/reservation";
255                         }
256                 }
257
258                 if( copy.age_protect() ) 
259                         appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
260
261                 var cd = copy.create_date();
262                 cd = cd.replace(/T.*/, '');
263                 $n(row, 'create_date_value').appendChild(text(cd));
264
265                 var yes = $('rdetail.yes').innerHTML;
266                 var no = $('rdetail.no').innerHTML;
267
268                 if( isTrue(copy.holdable()) &&
269                                 isTrue(copy.location().holdable()) &&
270                                 isTrue(copy.status().holdable()) ) {
271                         $n(row, 'copy_is_holdable').appendChild(text(yes));     
272                 } else {
273                         $n(row, 'copy_is_holdable').appendChild(text(no));      
274                 }
275         }
276
277         if (isXUL() || showDueDate) {
278                 var circ;
279                 if( copy.circulations() ) {
280                         circ = copy.circulations()[0];
281                         if( circ ) {
282                                 var due_time = dojo.date.stamp.fromISOString(circ.due_date());
283                                 if( showDueTime ) {
284                                         $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
285                                 } else {
286                                         $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
287                                 }
288                         }
289                 }
290         }
291
292         r.args.copy = copy;
293         r.args.copyrow = row;
294         cpdShowNotes(copy, r.args)
295         cpdShowStats(copy, r.args);
296
297 }
298
299 function _cpdExtrasInit(args) {
300
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');
306         newrow.id       = newrid;
307
308         var cr = args.copyrow;
309         var nr = cr.nextSibling;
310         var np = args.mainTbody;
311
312         /* insert the extras row into the main table */
313         if(nr) np.insertBefore( newrow, nr );
314         else np.appendChild(newrow);
315
316         var link = $n(args.copyrow, 'details_link');
317         var link2 = $n(args.copyrow, 'less_details_link');
318         var id = newrow.id;
319         link.id = id + '_morelink';
320         link2.id = id + '_lesslink';
321         unHideMe(link);
322         hideMe(link2);
323
324         link.setAttribute('href', 
325                         'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
326
327         link2.setAttribute('href', 
328                         'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
329
330         return [ tbody, rowt ];
331 }
332
333 function cpdShowNotes(copy, args) {
334         var notes = copy.notes();
335         if(!notes || notes.length == 0) return;
336
337         var a = _cpdExtrasInit(args);
338         var tbody = a[0];
339         var rowt = a[1];
340
341         for( var n in notes ) {
342                 var note = notes[n];
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'));
348                 unHideMe(row);
349                 tbody.appendChild(row);
350         }
351 }
352
353
354 function cpdShowStats(copy, args) {
355         var entries = copy.stat_cat_entry_copy_maps();
356         if(!entries || entries.length == 0) return;
357
358         var visibleStatCat = false;
359
360         /*
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
365         */
366
367         for( var n in entries )
368         {
369                         var entry = entries[n];
370                         if(isTrue(entry.stat_cat().opac_visible()))
371                         {
372                                 visibleStatCat = true;
373                                 break;
374                         }
375         }
376
377         if(!(isXUL() || visibleStatCat)) return;
378
379         var a = _cpdExtrasInit(args);
380         var tbody = a[0];
381         var rowt = a[1];
382
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'));
390                 unHideMe(row);
391                 tbody.appendChild(row);
392         }
393 }
394