1 /* Keep this dead simple. No dojo. */
3 function get(s) { return document.getElementById(s); }
4 function removeClass(node, cls) {
5 if (!node || !node.className) return;
7 node.className.replace(new RegExp("\\b" + cls + "\\b", "g"), "");
9 function addClass(node, cls) {
11 removeClass(node, cls);
12 if (!node.className) node.className = cls;
13 else node.className += ' ' + cls;
15 function unHideMe(node) { removeClass(node, "hide_me"); }
16 function hideMe(node) { addClass(node, "hide_me"); }
18 var _search_row_template, _expert_row_template;
19 function addSearchRow() {
20 if (!_search_row_template) {
21 t = get("adv_global_row").cloneNode(true);
23 _search_row_template = t;
26 get("adv_global_tbody").insertBefore(
27 _search_row_template.cloneNode(true),
28 get("adv_global_addrow")
31 get("adv_global_input_table").rows[get("adv_global_input_table").rows.length - 2].getElementsByTagName("input")[0].value = "";
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);
40 _search_row_template = t;
43 if (_el_adv_expert_row) {
44 t = _el_adv_expert_row.cloneNode(true);
46 _expert_row_template = t;
48 function addExpertRow() {
49 get("adv_expert_rows_here").appendChild(
50 _expert_row_template.cloneNode(true)
54 window.addSearchRow = addSearchRow;
55 window.addExpertRow = addExpertRow;
57 function killRowIfAtLeast(min, link) {
58 var row = link.parentNode.parentNode;
59 if (row.parentNode.getElementsByTagName("tr").length > min)
60 row.parentNode.removeChild(row);
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);
68 var iwin = iframe.contentWindow;
70 /* These next three statements are only needed by IE, but they don't
73 iwin.document.write( /* XXX make better/customizable? */
74 "<html><head><title>Receipt</title></head><body></body></html>"
76 iwin.document.close();
78 iwin.document.body.innerHTML = source_node.innerHTML;
81 try { iframe.print(); } catch (e) { iwin.print(); }
82 setTimeout(function() { iframe.style.display = "none"; }, 3500);
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;
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, "");
100 if (submitOnChange) {
101 checkbox.form.submit();
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]);
119 checkbox.form.submit();
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');
127 var els = form.elements;
128 for (i = 0; i < els.length; i++){
130 if (e.id.startsWith("opac") || e.id == 'sms_carrier'){
131 hold_notify_prefs.push({
133 oldval : e.type == 'checkbox' ? e.checked : e.value,
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);
144 form.addEventListener('submit', addHoldUpdates);
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
152 var form = document.getElementById('hold_notify_form');
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);
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);
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);
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);
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, '');
189 function idxOfName(n){
190 return hold_notify_prefs.findIndex(function(e){ return e.name === n});
193 function record_change(evt){
194 var field = evt.target;
196 case "opac.hold_notify.email":
197 var chg = hold_notify_prefs[idxOfName(field.id)]
198 chg.newval = field.checked;
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);
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);
210 case "sms_carrier": // carrier id string
211 var chg = hold_notify_prefs[idxOfName(field.id)]
212 chg.newval = field.value;
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;
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);
230 // there are the param values for the changed fields we expect server-side
231 function paramTranslate(chArr){
232 return chArr.map(function(ch){
235 case "opac.hold_notify.email":
238 case "opac.hold_notify.phone":
241 case "opac.hold_notify.sms":
244 case "sms_carrier": // carrier id string
245 n = "default_sms_carrier_id";
247 case "opac.default_phone":
250 case "opac.default_sms_notify":
254 return { name : n, oldval : ch.oldval, newval : ch.newval };
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');
263 var els = form.elements;
265 for (i = 0; i < els.length; 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);
277 alert("No option selected.");
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;
286 var carrierSelect = document.getElementById('sms_carrier');
287 if (carrierSelect.selectedIndex == 0){
288 carrierSelect.setAttribute("required", "");
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++){
302 if (e.type == "checkbox" && !e.hidden && e.checked){
303 submit.removeAttribute("disabled");
308 submit.setAttribute("disabled","");
311 function toggle_related_required(id, isRequired){
312 var input = document.getElementById(id);
313 input.required = isRequired;