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