]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/holds.js
copy/volume holds are essentially done, maybe some tweaking needed
[working/Evergreen.git] / Open-ILS / web / opac / skin / default / js / holds.js
1 var holdsOrgSelectorBuilt = false;
2 var holdArgs;
3
4
5
6 function holdsHandleStaff() {
7         swapCanvas($('xulholds_box'));
8         $('xul_recipient_barcode').focus();
9         $('xul_recipient_barcode').onkeypress = function(evt) 
10                 {if(userPressedEnter(evt)) { _holdsHandleStaff(); } };
11         $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff;
12         $('xul_recipient_me').onclick = _holdsHandleStaffMe;
13 }
14
15 function _holdsHandleStaffMe() {
16         holdArgs.recipient = G.user;
17         holdsDrawEditor();
18 }
19
20 function _holdsHandleStaff() {
21         var barcode = $('xul_recipient_barcode').value;
22         var user = grabUserByBarcode( G.user.session, barcode );
23         if(!user) return;
24         holdArgs.recipient = user;
25         holdsDrawEditor();
26 }
27
28
29 /** args:
30   * record, volume, copy (ids)
31   * request, recipient, editHold (objects)
32   */
33 function holdsDrawEditor(args) {
34
35         holdArgs = (args) ? args : holdArgs;
36
37         if(isXUL() && holdArgs.recipient == null 
38                         && holdArgs.editHold == null) {
39                 holdsHandleStaff();
40                 return;
41         }
42
43         if(!holdArgs.recipient) holdArgs.recipient = G.user;
44         if(!holdArgs.requestor) holdArgs.requestor = G.user;
45
46         if(!(holdArgs.requestor && holdArgs.requestor.session)) {
47                 detachAllEvt('common','locationChanged');
48                 attachEvt('common','loggedIn', holdsDrawEditor)
49                 initLogin();
50                 return;
51         }
52
53         if(holdArgs.editHold) /* flesh the args with the existing hold */
54                 holdArgsFromHold(holdArgs.editHold, holdArgs);
55
56         holdsDrawWindow();
57
58         if(holdArgs.editHold) {
59                 hideMe($('holds_submit'));
60                 unHideMe($('holds_update'));
61                 var req = new Request(FETCH_HOLD_STATUS, 
62                         G.user.session, holdArgs.editHold.id());
63                 req.send(true);
64                 holdArgs.status = req.result();
65                 _holdsUpdateEditHold();
66         }  
67
68 }
69
70
71 /* updates the edit window with the existing hold's data */
72 function _holdsUpdateEditHold() {
73
74         var hold = holdArgs.editHold;
75         var status = holdArgs.status;
76
77         var orgsel = $('holds_org_selector');
78         setSelector(orgsel, hold.pickup_lib());
79
80         if( hold.capture_time() || status > 2 )
81                 orgsel.disabled = true;
82         else    
83                 orgsel.disabled = false;
84
85
86         $('holds_submit').onclick = holdsEditHold;
87         $('holds_update').onclick = holdsEditHold;
88
89         if(hold.phone_notify()) {
90                 $('holds_enable_phone').checked = true;
91                 $('holds_phone').value = hold.phone_notify();
92
93         } else {
94                 $('holds_phone').disabled = true;
95                 $('holds_enable_phone').checked = false;
96         }
97
98         if(hold.email_notify()) {
99                 $('holds_enable_email').checked = true;
100
101         } else {
102                 $('holds_enable_email').checked = false;
103         }
104 }
105
106 function holdsEditHold() {
107         var hold = holdsBuildHoldFromWindow();
108         if(!hold) return;
109         holdsUpdate(hold);
110         showCanvas();
111         if(holdArgs.onComplete)
112                 holdArgs.onComplete(hold);
113 }
114
115 function holdArgsFromHold(hold, oargs) {
116         var args = (oargs) ? oargs : {};
117         args.type = hold.hold_type();
118         var target = hold.target();
119
120         switch(args.type) {
121                 case 'M':
122                         args.metarecord = target;
123                         break;
124                 case 'T':
125                         args.record = target;
126                         break;
127                 case 'V':
128                         args.volume = target;
129                         break;
130                 case 'C':
131                         args.copy = target;
132                         break;
133         }
134         return args;
135 }
136
137 function holdFetchObjects(hold, doneCallback) {
138
139         var args = (hold) ? holdArgsFromHold(hold) : holdArgs;
140
141         var type = args.type;
142
143         if( type == 'C' ) {
144
145                 if( args.copyObject ) {
146
147                         args.copy = args.copyObject.id();
148                         args.volume = args.copyObject.call_number();
149                         _h_set_vol(args, doneCallback);
150
151                 } else {
152                         var creq = new Request(FETCH_COPY, args.copy);
153
154                         creq.callback(
155                                 function(r) {
156                                         var cp = r.getResultObject();
157                                         args.copyObject = cp;
158                                         args.volume = args.copyObject.call_number();
159                                         _h_set_vol(args, doneCallback);
160                                 }
161                         );
162                         creq.send();
163                 }
164         } else {
165                 if( type == 'V' ) {
166                         _h_set_vol(args, doneCallback);
167
168                 } else {
169                         if( type == 'T' ) {
170                                 _h_set_rec(args, doneCallback);
171                         }
172                 }
173         }
174
175         return args;
176 }
177
178 function _h_set_vol(args, doneCallback) {
179
180         if( args.volumeObject ) {
181                 args.volume = args.volumeObject.id();
182                 args.record = args.volumeObject.record();
183                 _h_set_rec(args, doneCallback);
184
185         } else {
186
187                 var vreq = new Request(FETCH_VOLUME, args.volume);
188                 vreq.callback(
189                         function(r) {
190                                 var vol = r.getResultObject();
191                                 args.volumeObject = vol;
192                                 args.record = vol.record();
193                                 _h_set_rec(args, doneCallback);
194                         }
195                 );
196                 vreq.send();
197         }
198 }
199
200 function _h_set_rec(args, doneCallback) {
201         if(args.recordObject) {
202                 args.record = args.recordObject.doc_id();
203         } else {
204                 args.recordObject = findRecord( args.record, 'T' );
205         }
206         if(doneCallback) doneCallback(args);
207 }
208
209
210
211 function holdsDrawWindow() {
212         swapCanvas($('holds_box'));
213         $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
214         $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
215         $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
216         holdFetchObjects(null, function(){__holdsDrawWindow();});
217 }
218
219 function __holdsDrawWindow() {
220
221         var rec = holdArgs.recordObject;
222         var vol = holdArgs.volumeObject;
223         var copy = holdArgs.copyObject;
224
225         if(!holdsOrgSelectorBuilt) {
226                 holdsBuildOrgSelector(null,0);
227                 holdsOrgSelectorBuilt = true;
228         }
229
230         if(isXUL()) {
231                 var dsel = $('holds_depth_selector');
232                 unHideMe($('holds_depth_selector_row'));
233                 if(dsel.getElementsByTagName('option').length == 0) {
234                         var types = globalOrgTypes;
235                         var depth = findOrgDepth(G.user.ws_ou());
236                         iterate(types, 
237                                 function(t) {
238                                         if(t.depth() > depth) return;
239                                         insertSelectorVal(dsel, -1, t.opac_label(), t.depth());
240                                 }
241                         );
242                 }
243         }
244
245         appendClear($('holds_recipient'), text(
246                 holdArgs.recipient.family_name() + ', ' +  
247                         holdArgs.recipient.first_given_name()));
248         appendClear($('holds_title'), text(rec.title()));
249         appendClear($('holds_author'), text(rec.author()));
250
251         if( holdArgs.type == 'V' || holdArgs.type == 'C' ) {
252
253                 unHideMe($('holds_type_row'));
254                 unHideMe($('holds_cn_row'));
255                 appendClear($('holds_cn'), text(holdArgs.volumeObject.label()));
256
257                 if( holdArgs.type == 'V'  ) {
258                         unHideMe($('holds_is_cn'));
259                         hideMe($('holds_is_copy'));
260
261                 } else {
262                         hideMe($('holds_is_cn'));
263                         unHideMe($('holds_is_copy'));
264                         unHideMe($('holds_copy_row'));
265                         appendClear($('holds_copy'), text(holdArgs.copyObject.barcode()));
266                 }
267
268         } else {
269                 hideMe($('holds_type_row'));
270                 hideMe($('holds_copy_row'));
271                 hideMe($('holds_cn_row'));
272         }
273
274         removeChildren($('holds_format'));
275         for( var i in rec.types_of_resource() ) {
276                 var res = rec.types_of_resource()[i];
277                 var img = elem("img");
278                 setResourcePic(img, res);
279                 $('holds_format').appendChild(text(' '+res+' '));
280                 $('holds_format').appendChild(img);
281                 $('holds_format').appendChild(text(' '));
282         }
283
284
285         $('holds_phone').value = holdArgs.recipient.day_phone();
286         appendClear( $('holds_email'), text(holdArgs.recipient.email()));
287
288         var pref = G.user.prefs[PREF_HOLD_NOTIFY];
289
290         if(pref) {
291                 if( ! pref.match(/email/i) ) 
292                         $('holds_enable_email').checked = false;
293
294                 if( ! pref.match(/phone/i) ) {
295                         $('holds_phone').disabled = true;
296                         $('holds_enable_phone').checked = false;
297                 }
298         }
299
300         appendClear($('holds_physical_desc'), text(rec.physical_description()));
301         if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row'));
302 }
303
304
305 function holdsCheckPossibility(pickuplib) {
306         var rec = holdArgs.record;
307         var type = holdArgs.type;
308         var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, 
309                         { titleid : rec, patronid : G.user.id(), depth : 0, pickup_lib : pickuplib } );
310         req.send(true);
311         return req.result();
312 }
313
314
315 function holdsBuildOrgSelector(node) {
316
317         if(!node) node = globalOrgTree;
318
319         var selector = $('holds_org_selector');
320         var index = selector.options.length;
321
322         var type = findOrgType(node.ou_type());
323         var indent = type.depth() - 1;
324         var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent );
325         if(!type.can_have_vols()) opt.disabled = true;
326         
327         if( node.id() == holdArgs.recipient.home_ou() ) {
328                 selector.selectedIndex = index;
329                 selector.options[index].selected = true;        
330         }
331
332         for( var i in node.children() ) {
333                 var child = node.children()[i];
334                 if(child) holdsBuildOrgSelector(child);
335         }
336 }
337
338 function holdsBuildHoldFromWindow() {
339
340         var org = $('holds_org_selector').options[
341                 $('holds_org_selector').selectedIndex].value;
342
343         var hold = new ahr();
344         if(holdArgs.editHold) {
345                 hold = holdArgs.editHold;
346                 holdArgs.editHold = null;
347         }
348
349         if( $('holds_enable_phone').checked ) {
350                 var phone = $('holds_phone').value;
351                 if( !phone || !phone.match(REGEX_PHONE) ) {
352                         alert($('holds_bad_phone').innerHTML);
353                         return null;
354                 }
355                 hold.phone_notify(phone);
356
357         } else {
358                 hold.phone_notify("");
359         }
360
361         if( $('holds_enable_email').checked ) 
362                 hold.email_notify(1);
363         else
364                 hold.email_notify(0);
365
366         var target;
367
368         switch(holdArgs.type) {
369                 case 'M':
370                         target = holdArgs.metarecord;
371                         break;
372                 case 'T':
373                         target = holdArgs.record;
374                         break;
375                 case 'V':
376                         target = holdArgs.volume;
377                         break;
378                 case 'C':
379                         target = holdArgs.copy;
380                         break;
381         }
382
383
384         hold.pickup_lib(org); 
385         hold.request_lib(org); 
386         hold.requestor(holdArgs.requestor.id());
387         hold.usr(holdArgs.recipient.id());
388         hold.hold_type(holdArgs.type);
389         hold.target(target);
390
391         if(isXUL())             
392                 hold.selection_depth(getSelectorVal($('holds_depth_selector')));
393         return hold;
394 }
395         
396 function holdsPlaceHold(hold) {
397
398         if(!hold) return;
399
400         swapCanvas($('check_holds_box'));
401
402         if( holdArgs.type == 'M' || holdArgs.type == 'T' ) {
403                 if( ! holdsCheckPossibility(hold.pickup_lib() ) ) {
404                         alert($('hold_not_allowed').innerHTML);
405                         swapCanvas($('holds_box'));
406                         return;
407                 }
408         }
409
410         var req = new Request( CREATE_HOLD, holdArgs.requestor.session, hold );
411         req.send(true);
412         var res = req.result();
413
414         if( res == '1' ) alert($('holds_success').innerHTML);
415         else alert($('holds_failure').innerHTML);
416         
417         showCanvas();
418
419         holdArgs = null;
420         runEvt('common', 'holdUpdated');
421 }
422
423 function holdsCancel(holdid, user) {
424         if(!user) user = G.user;
425         var req = new Request(CANCEL_HOLD, user.session, holdid);
426         req.send(true);
427         return req.result();
428         runEvt('common', 'holdUpdated');
429 }
430
431 function holdsUpdate(hold, user) {
432         if(!user) user = G.user;
433         var req = new Request(UPDATE_HOLD, user.session, hold);
434         req.send(true);
435         var x = req.result(); /* cause an exception if there is one */
436         runEvt('common', 'holdUpdated');
437 }
438
439
440
441