]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/simple.js
LP#1570072: update hold notification methods upon preference changes
[Evergreen.git] / Open-ILS / web / js / ui / default / opac / simple.js
1 /* Keep this dead simple. No dojo. */
2 function $(s) { return document.getElementById(s); }
3 function removeClass(node, cls) {
4     if (!node || !node.className) return;
5     node.className =
6         node.className.replace(new RegExp("\\b" + cls + "\\b", "g"), "");
7 }
8 function addClass(node, cls) {
9     if (!node) return;
10     removeClass(node, cls);
11     if (!node.className) node.className = cls;
12     else node.className += ' ' + cls;
13 }
14 function unHideMe(node) { removeClass(node, "hide_me"); }
15 function hideMe(node) { addClass(node, "hide_me"); }
16
17 var _search_row_template, _expert_row_template;
18 function addSearchRow() {
19     if (!_search_row_template) {
20         t = $("adv_global_row").cloneNode(true);
21         t.id = null;
22         _search_row_template = t;
23     }
24
25     $("adv_global_tbody").insertBefore(
26         _search_row_template.cloneNode(true),
27         $("adv_global_addrow")
28     );
29
30     $("adv_global_input_table").rows[$("adv_global_input_table").rows.length - 2].getElementsByTagName("input")[0].value = "";
31 }
32
33 (function($){
34 var _search_row_template, _expert_row_template, t;
35 var _el_adv_global_row = $("adv_global_row"), _el_adv_expert_row = $("adv_expert_row");
36 if (_el_adv_global_row) {
37     t = _el_adv_global_row.cloneNode(true);
38     t.id = null;
39     _search_row_template = t;
40 }
41
42 if (_el_adv_expert_row) {
43     t = _el_adv_expert_row.cloneNode(true);
44     t.id = null;
45     _expert_row_template = t;
46 }
47 function addExpertRow() {
48     $("adv_expert_rows_here").appendChild(
49         _expert_row_template.cloneNode(true)
50     );
51 }
52
53 window.addSearchRow = addSearchRow;
54 window.addExpertRow = addExpertRow;
55 })($);
56 function killRowIfAtLeast(min, link) {
57     var row = link.parentNode.parentNode;
58     if (row.parentNode.getElementsByTagName("tr").length > min)
59         row.parentNode.removeChild(row);
60     return false;
61 }
62 function print_node(node_id) {
63     var iframe = document.createElement("iframe");
64     var source_node = $(node_id);
65     source_node.parentNode.appendChild(iframe);
66
67     var iwin = iframe.contentWindow;
68
69     /* These next three statements are only needed by IE, but they don't
70      * hurt FF/Chrome. */
71     iwin.document.open();
72     iwin.document.write(    /* XXX make better/customizable? */
73         "<html><head><title>Receipt</title></head><body></body></html>"
74     );
75     iwin.document.close();
76
77     iwin.document.body.innerHTML = source_node.innerHTML;
78     iframe.focus();
79
80     try { iframe.print(); } catch (e) { iwin.print(); }
81     setTimeout(function() { iframe.style.display = "none"; }, 3500);
82 }
83 function select_all_checkboxes(name, checked) {
84     var all = document.getElementsByTagName("input");
85     for (var i = 0; i < all.length; i++) {
86         if (all[i].type == "checkbox" && all[i].name == name) {
87             all[i].checked = checked;
88         }
89     }
90 }
91
92 function search_modifier_onchange(type, checkbox, submitOnChange) {
93     if (checkbox.form._adv && !checkbox.checked) {
94         var search_box = $('search_box');
95         var reg = new RegExp('#' + type + ' ?', 'g');
96         search_box.value = search_box.value.replace(reg, "");
97     }
98
99     if (submitOnChange) {  
100         checkbox.form.submit(); 
101     }
102 }
103
104 function exclude_onchange(checkbox) {
105     if (checkbox.form._adv && !checkbox.checked) {
106         var search_box = $('search_box');
107         // Other functions' form submits may create duplicates of this, so /g
108         var reg = /-search_format\(electronic\)/g;
109         search_box.value = search_box.value.replace(reg, "");
110         // Remove from the search form itself
111         var search_format_inputs = document.getElementsByName("fi:-search_format");
112         for (var j = 0; j < search_format_inputs.length; j++) {
113             if (search_format_inputs[j].value == 'electronic') {
114                 search_format_inputs[j].parentNode.removeChild(search_format_inputs[j]);
115             }
116         }
117
118     }
119
120     checkbox.form.submit();
121 }
122
123 // prefs notify update holds-related code
124 var hold_notify_prefs = [];
125 document.addEventListener("DOMContentLoaded", function() {
126     var form = document.getElementById('hold_notify_form');
127     if (!form) return;
128     var els = form.elements;
129     for (i = 0; i < els.length; i++){
130         var e = els[i];
131         if (e.id.startsWith("opac") || e.id == 'sms_carrier'){
132             hold_notify_prefs.push({
133                 name : e.id,
134                 oldval : e.type == 'checkbox' ? e.checked : e.value,
135                 newval : null
136             });
137             // set required attribute input fields that need it
138             if (e.id.includes('hold_notify') && !e.id.includes('email')){
139                 var fieldToReq = e.id.includes('sms') ? 'opac.default_sms_notify' : 'opac.default_phone';
140                 toggle_related_required(fieldToReq, e.checked);
141             }
142
143         }
144     }
145     form.addEventListener('submit', addHoldUpdates);
146 });
147
148 function appendChgInputs(chg){
149     // server-side we'll parse the param as an array where:
150     // [ #oldval, #newval, #name, [#arr of affected holds], #propagateBool ]
151     // this first POST will set the first three, and the confirmation interstitial
152     // the rest.
153     var form = document.getElementById('hold_notify_form');
154
155     var inputold = document.createElement('input');
156     inputold.setAttribute('type', 'hidden');
157     inputold.setAttribute('name', chg.name + '[]');
158     inputold.setAttribute('value', chg.oldval);
159     form.appendChild(inputold);
160
161     var inputnew = document.createElement('input');
162     inputnew.setAttribute('type', 'hidden');
163     inputnew.setAttribute('name', chg.name + '[]');
164     inputnew.setAttribute('value', chg.newval);
165     form.appendChild(inputnew);
166
167     var inputname = document.createElement('input');
168     inputname.setAttribute('type', 'hidden');
169     inputname.setAttribute('name', chg.name + '[]');
170     inputname.setAttribute('value', chg.name);
171     form.appendChild(inputname);
172 }
173
174 function addHoldUpdates(){
175     paramTranslate(hold_notify_prefs).forEach(function(chg){
176         // only append a change if it actually changed from
177         // what we had server-side originally
178         if (chg.newval != null && chg.oldval != chg.newval) appendChgInputs(chg);
179     });
180     return true;
181 }
182
183 function chkPh(number){
184     // normalize phone # for comparison, only digits
185     if (number == null || number == undefined) return '';
186     var regex = /[^\d]/g;
187     return number.replace(regex, '');
188 }
189
190 function idxOfName(n){
191     return hold_notify_prefs.findIndex(function(e){ return e.name === n});
192 }
193
194 function record_change(evt){
195     var field = evt.target;
196     switch(field.id){
197         case "opac.hold_notify.email":
198             var chg = hold_notify_prefs[idxOfName(field.id)]
199             chg.newval = field.checked;
200             break;
201         case "opac.hold_notify.phone":
202             var chg = hold_notify_prefs[idxOfName(field.id)]
203             chg.newval = field.checked;
204             toggle_related_required('opac.default_phone', chg.newval);
205             break;
206         case "opac.hold_notify.sms":
207             var chg = hold_notify_prefs[idxOfName(field.id)]
208             chg.newval = field.checked;
209             toggle_related_required('opac.default_sms_notify', chg.newval);
210             break;
211         case "sms_carrier": // carrier id string
212             var chg = hold_notify_prefs[idxOfName(field.id)]
213             chg.newval = field.value;
214             break;
215         case "opac.default_phone":
216             var chg = hold_notify_prefs[idxOfName(field.id)]
217             if (chkPh(field.value) != chkPh(chg.oldval)){
218                 chg.newval = field.value;
219             }
220             break;
221         case "opac.default_sms_notify":
222             var chg = hold_notify_prefs[idxOfName(field.id)]
223             if (chkPh(field.value) != chkPh(chg.oldval)){
224                 chg.newval = field.value;
225                 toggle_related_required('sms_carrier', chg.newval ? true : false);
226             }
227             break;
228     }
229 }
230
231 // there are the param values for the changed fields we expect server-side
232 function paramTranslate(chArr){
233     return chArr.map(function(ch){
234         var n = "";
235         switch(ch.name){
236             case "opac.hold_notify.email":
237                 n = "email_notify";
238                 break;
239             case "opac.hold_notify.phone":
240                 n = "phone_notify";
241                 break;
242             case "opac.hold_notify.sms":
243                 n = "sms_notify";
244                 break;
245             case "sms_carrier": // carrier id string
246                 n = "default_sms_carrier_id";
247                 break;
248             case "opac.default_phone":
249                 n = "default_phone";
250                 break;
251             case "opac.default_sms_notify":
252                 n = "default_sms";
253                 break;
254         }
255         return { name : n, oldval : ch.oldval, newval : ch.newval };
256     });
257 }
258
259 function updateHoldsCheck() {
260     // just dynamically add an input that flags that we have
261     // holds-related updates
262     var form = document.getElementById('hold_updates_form');
263     if (!form) return;
264     var els = form.elements;
265     var isValid = false;
266     for (i = 0; i < els.length; i++){
267         var e = els[i];
268         if (e.type == "checkbox" && e.checked){
269             var flag = document.createElement('input');
270             flag.setAttribute('name', 'hasHoldsChanges');
271             flag.setAttribute('type', 'hidden');
272             flag.setAttribute('value', 1);
273             form.appendChild(flag);
274             isValid = true;
275             return isValid;
276         }
277     }
278
279     alert("No option selected.");
280     return isValid;
281 }
282
283 function check_sms_carrier(e){
284     var sms_num = e.target;
285     // if sms number has anything in it that's not just whitespace, then require a carrier
286     if (!sms_num.value.match(/\S+/)) return;
287
288     var carrierSelect = document.getElementById('sms_carrier');
289     if (carrierSelect.selectedIndex == 0){
290         carrierSelect.setAttribute("required", "");
291     }
292
293 }
294
295 function canSubmit(evt){
296    // check hold updates form to see if we have any selected
297    // enable the submit button if we do
298     var form = document.getElementById('hold_updates_form');
299     var submit = form.querySelector('input[type="submit"]');
300     if (!form || !submit) return;
301     var els = form.elements;
302     for (i = 0; i < els.length; i++){
303         var e = els[i];
304         if (e.type == "checkbox" && !e.hidden && e.checked){
305             submit.removeAttribute("disabled");
306             return;
307         }
308     }
309
310     submit.setAttribute("disabled","");
311 }
312
313 function toggle_related_required(id, isRequired){
314     var input = document.getElementById(id);
315     input.required = isRequired;
316 }