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;
6 node.className.replace(new RegExp("\\b" + cls + "\\b", "g"), "");
8 function addClass(node, cls) {
10 removeClass(node, cls);
11 if (!node.className) node.className = cls;
12 else node.className += ' ' + cls;
14 function unHideMe(node) { removeClass(node, "hide_me"); }
15 function hideMe(node) { addClass(node, "hide_me"); }
17 var _search_row_template, _expert_row_template;
18 function addSearchRow() {
19 if (!_search_row_template) {
20 t = $("adv_global_row").cloneNode(true);
22 _search_row_template = t;
25 $("adv_global_tbody").insertBefore(
26 _search_row_template.cloneNode(true),
27 $("adv_global_addrow")
30 $("adv_global_input_table").rows[$("adv_global_input_table").rows.length - 2].getElementsByTagName("input")[0].value = "";
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);
39 _search_row_template = t;
42 if (_el_adv_expert_row) {
43 t = _el_adv_expert_row.cloneNode(true);
45 _expert_row_template = t;
47 function addExpertRow() {
48 $("adv_expert_rows_here").appendChild(
49 _expert_row_template.cloneNode(true)
53 window.addSearchRow = addSearchRow;
54 window.addExpertRow = addExpertRow;
56 function killRowIfAtLeast(min, link) {
57 var row = link.parentNode.parentNode;
58 if (row.parentNode.getElementsByTagName("tr").length > min)
59 row.parentNode.removeChild(row);
62 function print_node(node_id) {
63 var iframe = document.createElement("iframe");
64 var source_node = $(node_id);
65 source_node.parentNode.appendChild(iframe);
67 var iwin = iframe.contentWindow;
69 /* These next three statements are only needed by IE, but they don't
72 iwin.document.write( /* XXX make better/customizable? */
73 "<html><head><title>Receipt</title></head><body></body></html>"
75 iwin.document.close();
77 iwin.document.body.innerHTML = source_node.innerHTML;
80 try { iframe.print(); } catch (e) { iwin.print(); }
81 setTimeout(function() { iframe.style.display = "none"; }, 3500);
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;
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, "");
100 checkbox.form.submit();
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]);
120 checkbox.form.submit();
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');
128 var els = form.elements;
129 for (i = 0; i < els.length; i++){
131 if (e.id.startsWith("opac") || e.id == 'sms_carrier'){
132 hold_notify_prefs.push({
134 oldval : e.type == 'checkbox' ? e.checked : e.value,
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);
145 form.addEventListener('submit', addHoldUpdates);
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
153 var form = document.getElementById('hold_notify_form');
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);
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);
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);
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);
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, '');
190 function idxOfName(n){
191 return hold_notify_prefs.findIndex(function(e){ return e.name === n});
194 function record_change(evt){
195 var field = evt.target;
197 case "opac.hold_notify.email":
198 var chg = hold_notify_prefs[idxOfName(field.id)]
199 chg.newval = field.checked;
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);
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);
211 case "sms_carrier": // carrier id string
212 var chg = hold_notify_prefs[idxOfName(field.id)]
213 chg.newval = field.value;
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;
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);
231 // there are the param values for the changed fields we expect server-side
232 function paramTranslate(chArr){
233 return chArr.map(function(ch){
236 case "opac.hold_notify.email":
239 case "opac.hold_notify.phone":
242 case "opac.hold_notify.sms":
245 case "sms_carrier": // carrier id string
246 n = "default_sms_carrier_id";
248 case "opac.default_phone":
251 case "opac.default_sms_notify":
255 return { name : n, oldval : ch.oldval, newval : ch.newval };
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');
264 var els = form.elements;
266 for (i = 0; i < els.length; 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);
279 alert("No option selected.");
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;
288 var carrierSelect = document.getElementById('sms_carrier');
289 if (carrierSelect.selectedIndex == 0){
290 carrierSelect.setAttribute("required", "");
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++){
304 if (e.type == "checkbox" && !e.hidden && e.checked){
305 submit.removeAttribute("disabled");
310 submit.setAttribute("disabled","");
313 function toggle_related_required(id, isRequired){
314 var input = document.getElementById(id);
315 input.required = isRequired;