]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/staff.js
LP1915464 follow-up: use spaces, not tabs; remove extra comma
[Evergreen.git] / Open-ILS / web / js / ui / default / opac / staff.js
1 /* staff client integration functions */
2
3 // Browser staff client runs the TPAC within an iframe, whose onload
4 // is not called until after the page onload is called. window.onload
5 // actions are wrapped in timeouts (below) to ensure the wrapping page
6 // has a chance to insert the necessary xulG, etc. functions into the
7 // window.
8
9 function debug(msg){dump(msg+'\n')}
10 var eventCache={};
11 function attachEvt(scope, name, action) {
12     if(!eventCache[scope]) eventCache[scope] = {};
13     if(!eventCache[scope][name]) eventCache[scope][name] = [];
14     eventCache[scope][name].push(action);
15 }
16 function runEvt(scope, name) {
17     debug('running event '+scope+':'+name);
18     var args = Array.prototype.slice.call(arguments).slice(2);
19     if(eventCache[scope]) {
20         var evt = eventCache[scope][name];
21         for(var i in evt) {evt[i].apply(evt[i], args);}
22     } 
23 }
24 function staff_hold_usr_input_disabler(input) {
25     document.getElementById("hold_usr_input").disabled =
26         Boolean(Number(input.value));
27     staff_hold_usr_barcode_changed();
28 }
29
30 var debounce_barcode_change = function() {
31     var timeout;
32
33     return function(event) {
34         clearTimeout(timeout);
35         document.getElementById('patron_usr_barcode_not_found').style.display = 'none';
36
37         if (event.which == '13') {
38             staff_hold_usr_barcode_changed();
39             return false;
40         }
41
42         var duration = event.type == 'paste' ? 0 : 500;
43         timeout = setTimeout(staff_hold_usr_barcode_changed, duration);
44
45         return true;
46     };
47 }();
48
49 function no_hold_submit(event) {
50     if (event.which == 13) {
51         staff_hold_usr_barcode_changed();
52         return false;
53     }
54     return true;
55 }
56
57 function toggleMROptions(on) {
58     var anchor = document.getElementById("advanced_hold_link");
59     // Check for not equal to block so it works on first click.
60     if (anchor) {
61         if (on) {
62             anchor.style.display = "inline";
63         } else {
64             anchor.style.display = "none";
65         }
66     }
67 }
68
69 function maybeDisable (thing, value) {
70     var el = document.getElementById(thing);
71     if (el) el.disabled = value;
72 }
73
74 function toggleOnSubscription(isSub) {
75     toggleMROptions(!isSub);
76     maybeDisable("override_blocks_subscription",!isSub);
77     maybeDisable("pickup_lib",isSub);
78     maybeDisable("email_notify",isSub);
79     maybeDisable("phone_notify_checkbox",isSub);
80     maybeDisable("phone_notify",isSub);
81     maybeDisable("sms_notify_checkbox",isSub);
82     maybeDisable("sms_carrier",isSub);
83     maybeDisable("sms_notify",isSub);
84 }
85
86 function staff_hold_usr_barcode_changed(isload) {
87
88     if (!document.getElementById('place_hold_submit')) {
89         // in some cases, the submit button is not present.
90         // exit early to avoid needless JS errors
91         return;
92     }
93
94     if (!window.xulG) return;
95  
96     var sub_el = document.getElementById('hold_usr_is_subscription');
97     var adv_link = document.getElementById('advanced_hold_link');
98     if (adv_link) {
99         adv_link.setAttribute('href', adv_link.getAttribute('href').replace(/&?is_requestor=[012]/,''));
100         var is_requestor = 0;
101         if (document.getElementById('hold_usr_is_requestor').checked) {
102             is_requestor = 1;
103         } else if (sub_el && sub_el.checked) {
104             is_requestor = 2;
105         }
106         adv_link.setAttribute('href', adv_link.getAttribute('href') + '&is_requestor=' + is_requestor.toString());
107     }
108
109     var cur_hold_barcode = undefined;
110     var barcode = isload;
111     if(!barcode || barcode === true) barcode = document.getElementById('staff_barcode').value;
112     var only_settings = true;
113
114     toggleOnSubscription(false);
115     if(sub_el && sub_el.checked) {
116         toggleOnSubscription(true);
117         if(!isload) {
118             only_settings = false;
119         }
120     } else if(!document.getElementById('hold_usr_is_requestor').checked) {
121         if(!isload) {
122             barcode = document.getElementById('hold_usr_input').value;
123             only_settings = false;
124         }
125         if(barcode && barcode != '' && !document.getElementById('hold_usr_is_requestor_not').checked)
126             document.getElementById('hold_usr_is_requestor_not').checked = 'checked';
127     }
128
129     if((barcode == undefined || barcode == '') && (!sub_el || !sub_el.checked)) {
130         document.getElementById('patron_name').innerHTML = '';
131         // No submitting on empty barcode, but empty barcode doesn't really count as "not found" either
132         document.getElementById('place_hold_submit').disabled = true;
133         document.getElementById("patron_usr_barcode_not_found").style.display = 'none';
134         cur_hold_barcode = null;
135         return;
136     }
137     if(barcode == cur_hold_barcode)
138         return;
139     // No submitting until we think the barcode is valid
140     document.getElementById('place_hold_submit').disabled = true;
141
142     if (window.IAMBROWSER) {
143         // Browser client operates asynchronously
144         if (!xulG.get_barcode_and_settings_async) return;
145         xulG.get_barcode_and_settings_async(barcode, only_settings)
146         .then(
147             function(load_info) { // load succeeded
148                 staff_hold_usr_barcode_changed2(
149                     isload, only_settings, barcode, cur_hold_barcode, load_info);
150             },
151             function() { 
152                 // load failed (rejected).  Call staff_hold_usr_barcode_changed2
153                 // anyway, since it handles clearing the form
154                 staff_hold_usr_barcode_changed2(
155                     isload, only_settings, barcode, cur_hold_barcode, false);
156             }
157         )
158     } else {
159         // XUL version is synchronous
160         if (!xulG.get_barcode_and_settings) return;
161         var load_info = xulG.get_barcode_and_settings(window, barcode, only_settings);
162         staff_hold_usr_barcode_changed2(isload, only_settings, barcode, cur_hold_barcode, load_info);
163     }
164 }
165
166 function staff_hold_usr_barcode_changed2(
167     isload, only_settings, barcode, cur_hold_barcode, load_info) {
168
169     var sub_el = document.getElementById('hold_usr_is_subscription');
170
171     if(load_info == false || load_info == undefined) {
172         document.getElementById('patron_name').innerHTML = '';
173         document.getElementById("patron_usr_barcode_not_found").style.display = '';
174         cur_hold_barcode = null;
175         return;
176     }
177     cur_hold_barcode = load_info.barcode;
178     if ((!only_settings || (isload && isload !== true)) && (!sub_el || !sub_el.checked)) {
179         // Safe at this point as we already set cur_hold_barcode
180         document.getElementById('hold_usr_input').value = load_info.barcode;
181
182         // Patron preferred pickup loc overrides the default pickup lib 
183         // unless the default to workstation setting is enabled
184         document.getElementById('pickup_lib').value = 
185             !load_info.settings['circ.staff_placed_holds_default_to_ws_ou'] &&
186             load_info.settings['opac.default_pickup_location'] ?
187             load_info.settings['opac.default_pickup_location'] : load_info.pickup_lib;
188     }
189
190     if (!load_info.settings['opac.default_sms_notify']){
191         load_info.settings['opac.default_sms_notify'] = '';
192     }
193
194     if (!load_info.settings['opac.default_sms_carrier']){
195         load_info.settings['opac.default_sms_carrier'] = '';
196     }
197
198     if (!sub_el || !sub_el.checked) {
199         if (load_info.settings['opac.hold_notify'] || load_info.settings['opac.hold_notify'] === '') {
200             var email = load_info.settings['opac.hold_notify'].indexOf('email') > -1;
201             var phone = load_info.settings['opac.hold_notify'].indexOf('phone') > -1;
202             var sms = load_info.settings['opac.hold_notify'].indexOf('sms') > -1;
203             var update_elements = document.getElementsByName('email_notify');
204             for(var i in update_elements) update_elements[i].checked = (email ? 'checked' : '');
205             update_elements = document.getElementsByName('phone_notify_checkbox');
206             for(var i in update_elements) update_elements[i].checked = (phone ? 'checked' : '');
207             update_elements = document.getElementsByName('sms_notify_checkbox');
208             for(var i in update_elements) update_elements[i].checked = (sms ? 'checked' : '');
209         }
210     
211         update_elements = document.getElementsByName('phone_notify');
212         for(var i in update_elements) update_elements[i].value = load_info.settings['opac.default_phone']
213             ? load_info.settings['opac.default_phone'] : '';
214         update_elements = document.getElementsByName('sms_notify');
215         for(var i in update_elements) update_elements[i].value = load_info.settings['opac.default_sms_notify'];
216         update_elements = document.getElementsByName('sms_carrier');
217         for(var i in update_elements) update_elements[i].value = load_info.settings['opac.default_sms_carrier'];
218         update_elements = document.getElementsByName('email_notify');
219         for(var i in update_elements) {
220             update_elements[i].disabled = (load_info.user_email ? false : true);
221             if(update_elements[i].disabled) update_elements[i].checked = false;
222         }
223         update_elements = document.getElementsByName('email_address');
224         for(var i in update_elements) update_elements[i].textContent = load_info.user_email;
225         if(!document.getElementById('hold_usr_is_requestor').checked && document.getElementById('hold_usr_input').value) {
226             document.getElementById('patron_name').innerHTML = load_info.patron_name;
227             document.getElementById("patron_usr_barcode_not_found").style.display = 'none';
228         }
229     }
230     // Ok, now we can allow submitting again, unless this is a "true" load, in which case we likely have a blank barcode box active
231
232     // update the advanced hold options link to propagate the patron
233     // barcode if clicked.  This is needed when the patron barcode
234     // is manually entered (i.e. the staff client does not provide one).
235     var adv_link = document.getElementById('advanced_hold_link');
236     if (adv_link) { // not present on MR hold pages
237         var href = adv_link.getAttribute('href').replace(
238             /;usr_barcode=[^;\&]+|$/, 
239             ';usr_barcode=' + encodeURIComponent(cur_hold_barcode));
240         adv_link.setAttribute('href', href);
241     }
242
243     if (isload !== true)
244         document.getElementById('place_hold_submit').disabled = false;
245 }
246 window.onload = function() {
247     // record details page events
248
249     setTimeout(function() {
250
251         if (location.href.match(/is_requestor=[012]/)) {
252             var loc = location.href;
253             var is_req_match = new RegExp("is_requestor=[012]");
254             var is_req = is_req_match.exec(loc).toString();
255             is_req = is_req.replace(/is_requestor=/, '');
256             if (is_req == "2") {
257                 var sub_el = document.getElementById('hold_usr_is_subscription');
258                 if (sub_el) {
259                     sub_el.checked = 'checked';
260                 }
261                 document.getElementById('hold_usr_input').disabled = true;
262             } else if (is_req == "1") {
263                 document.getElementById('hold_usr_is_requestor').checked = 'checked';
264                 document.getElementById('hold_usr_input').disabled = true;
265             } else {
266                 document.getElementById('hold_usr_is_requestor_not').checked = 'checked';
267                 document.getElementById('hold_usr_input').disabled = false;
268             }
269         }
270
271         var rec = location.href.match(/\/opac\/record\/(\d+)/);
272         if(rec && rec[1]) { 
273             runEvt('rdetail', 'recordRetrieved', rec[1]); 
274             runEvt('rdetail', 'MFHDDrawn');
275         }
276         if(location.href.match(/place_hold/)) {
277             // patron barcode may come from XUL or a CGI param
278             var patron_barcode = xulG.patron_barcode ||
279                 document.getElementById('hold_usr_input').value;
280             if(patron_barcode) {
281                 staff_hold_usr_barcode_changed(patron_barcode);
282             } else {
283                 staff_hold_usr_barcode_changed(true);
284             }
285         }
286     });
287 }
288
289 function rdetail_next_prev_actions(index, count, prev, next, start, end, results) {
290     /*  we mostly get the relative URL from the template:  recid?query_args...
291         replace the recid and args on location.href to get the new URL  */
292     function fullurl(url) {
293         if (url.match(/eg\/opac\/results/)) {
294             return location.href.replace(/\/eg\/opac\/.+$/, url);
295         } else {
296             return location.href.replace(/\/\d+\??.*/, '/' + url);
297         }
298     }
299
300     if (index > 0) {
301         if(prev) 
302             window.rdetailPrev = function() { location.href = fullurl(prev); }
303         if(start) 
304             window.rdetailStart = function() { location.href = fullurl(start); }
305     }
306
307     if (index < count - 1) {
308         if(next) 
309             window.rdetailNext = function() { location.href = fullurl(next); }
310         if(end) 
311             window.rdetailEnd = function() { location.href = fullurl(end); }
312     }
313
314     window.rdetailBackToResults = function() { location.href = fullurl(results); };
315
316     ol = window.onload;
317     window.onload = function() {
318         if(ol) ol(); 
319         setTimeout(function() {
320             runEvt('rdetail', 'nextPrevDrawn', Number(index), Number(count)); 
321         });
322     };
323 }