]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/utils.js
start adding metarecord hold support
[Evergreen.git] / Open-ILS / web / opac / common / js / utils.js
1 function $(id) { return getId(id); }
2 function getId(id) {
3         return document.getElementById(id);
4 }
5
6 function swapCSSClass(obj, old, newc ) {
7         removeCSSClass(obj, old );
8         addCSSClass(obj, newc );
9 }
10
11
12 function addCSSClass(e,c) {
13         if(!e || !c) return;
14
15         var css_class_string = e.className;
16         var css_class_array;
17
18         if(css_class_string)
19                 css_class_array = css_class_string.split(/\s+/);
20
21         var string_ip = ""; /*strip out nulls*/
22         for (var css_class in css_class_array) {
23                 if (css_class_array[css_class] == c) { return; }
24                 if(css_class_array[css_class] !=null)
25                         string_ip += css_class_array[css_class] + " ";
26         }
27         string_ip += c;
28         e.className = string_ip;
29 }
30
31 function removeCSSClass(e, c) {
32         if(!e || !c) return;
33
34         var css_class_string = '';
35
36         var css_class_array = e.className;
37         if( css_class_array )
38                 css_class_array = css_class_array.split(/\s+/);
39
40         var first = 1;
41         for (var css_class in css_class_array) {
42                 if (css_class_array[css_class] != c) {
43                         if (first == 1) {
44                                 css_class_string = css_class_array[css_class];
45                                 first = 0;
46                         } else {
47                                 css_class_string = css_class_string + ' ' +
48                                         css_class_array[css_class];
49                         }
50                 }
51         }
52         e.className = css_class_string;
53 }
54
55
56 /*returns the character code pressed that caused the event */
57 function grabCharCode(evt) {
58    evt = (evt) ? evt : ((window.event) ? event : null); 
59    if( evt ) {
60       return (evt.charCode ? evt.charCode : 
61          ((evt.which) ? evt.which : evt.keyCode ));
62    } else { return -1; }
63 }       
64
65
66 /* returns true if the user pressed enter */
67 function userPressedEnter(evt) {
68    var code = grabCharCode(evt);
69    if(code==13||code==3) return true;
70    return false;
71 }   
72
73
74 function goTo(url) {
75         /* setTimeout because ie sux */
76         setTimeout( function(){ location.href = url; }, 0 );
77 }
78
79
80 function removeChildren(dom) {
81         if(!dom) return;
82         while(dom.childNodes[0])
83                 dom.removeChild(dom.childNodes[0]);
84 }
85
86 function appendClear(node, child) {
87         removeChildren(node);
88         node.appendChild(child);
89 }
90
91
92 function instanceOf(object, constructorFunction) {
93
94    if(!IE) {
95       while (object != null) {
96          if (object == constructorFunction.prototype)
97             return true;
98          object = object.__proto__;
99       }
100    } else {
101       while(object != null) {
102          if( object instanceof constructorFunction )
103             return true;
104          object = object.__proto__;
105       }
106    }
107    return false;
108 }         
109
110
111 /* ------------------------------------------------------------------------------------------- */
112 /* detect my browser */
113 var isMac, NS, NS4, NS6, IE, IE4, IE4mac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4;
114 function detect_browser() {       
115
116    isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false;
117    NS = (navigator.appName == "Netscape") ? true : false;
118    NS4 = (document.layers) ? true : false;
119    IE = (navigator.appName == "Microsoft Internet Explorer") ? true : false;
120    IEmac = ((document.all)&&(isMac)) ? true : false;
121    IE4plus = (document.all) ? true : false;
122    IE4 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 4.")!=-1)) ? true : false;
123    IE5 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 5.")!=-1)) ? true : false;
124    IE6 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 6.")!=-1)) ? true : false;
125    ver4 = (NS4 || IE4plus) ? true : false;
126    NS6 = (!document.layers) && (navigator.userAgent.indexOf('Netscape')!=-1)?true:false;
127
128    IE5plus = IE5 || IE6;
129    IEMajor = 0;
130
131    if (IE4plus) {
132       var start = navigator.appVersion.indexOf("MSIE");
133       var end = navigator.appVersion.indexOf(".",start);
134       IEMajor = parseInt(navigator.appVersion.substring(start+5,end));
135       IE5plus = (IEMajor>=5) ? true : false;
136    }
137 }  
138 detect_browser();
139 /* ------------------------------------------------------------------------------------------- */
140
141
142 function text(t) {
143         if(t == null) t = "";
144         return document.createTextNode(t);
145 }
146
147 function elem(name, attrs, txt) {
148     var e = document.createElement(name);
149     if (attrs) {
150         for (key in attrs) {
151                           if( key == 'id') e.id = attrs[key];
152                           else e.setAttribute(key, attrs[key]);
153         }
154     }
155     if (txt) e.appendChild(text(txt));
156     return e;
157 }                   
158
159
160 /* sel is the selector object, sets selected on the 
161         option with the given value. case does not matter...*/
162 function setSelector( sel, value ) {
163         if(sel && value != null) {
164                 for( var i = 0; i!= sel.options.length; i++ ) { 
165                         if( sel.options[i] ) {
166                                 var val = sel.options[i].value;
167                                 if( val == null || val == "" ) /* for IE */
168                                         val = sel.options[i].innerHTML;
169                                 value += ""; /* in case of number */ 
170                                 if( val && val.toLowerCase() == value.toLowerCase() ) {
171                                         sel.selectedIndex = i;
172                                         sel.options[i].selected = true;
173                                 }
174                         }
175                 }
176         }
177 }
178
179 function getSelectorVal( sel ) {
180         if(!sel) return null;
181         var o = sel.options[sel.selectedIndex];
182         var v = o.value; 
183         if(v == null) v = o.innerHTML;
184         return v;
185 }
186
187 function getSelectorName( sel ) {
188         var o = sel.options[sel.selectedIndex];
189         var v = o.name;
190         if(v == null || v == undefined || v == "") v = o.innerHTML;
191         return v;
192 }
193
194 function setSelectorByName( sel, name ) {
195         for( var o in sel.options ) {
196                 var opt = sel.options[o];
197                 if( opt.name == name || opt.innerHTML == name ) {
198                         sel.selectedIndex = o;
199                         opt.selected = true;
200                 }
201         }
202 }
203
204 function debugSelector(sel) {
205         var s = 'Selector\n';
206         for( var i = 0; i != sel.options.length; i++ ) {
207                 var o = sel.options[i];
208                 s += "\t" + o.innerHTML + "\n";
209         }
210         return s;
211 }
212
213 function findParentByNodeName(node, name) {
214         while( ( node = node.parentNode) ) 
215                 if (node.nodeName == name) return node;
216         return null;
217 }
218
219 /* returns only elements in nodes childNodes list, not sub-children */
220 function getElementsByTagNameFlat( node, name ) {
221         var elements = [];
222         for( var e in node.childNodes ) {
223                 var n = node.childNodes[e];
224                 if( n && n.nodeName == name ) elements.push(n);
225         }
226         return elements;
227 }
228
229 /* expects a tree with a id() method on each node and a 
230 children() method to get to each node */
231 function findTreeItemById( tree, id ) {
232         if( tree.id() == id ) return tree;
233         for( var c in tree.children() ) {
234                 var found = findTreeItemById( tree.children()[c], id );
235                 if(found) return found;
236         }
237         return null;
238 }
239
240 /* returns null if none of the tests are true.  returns sub-array of 
241 matching array items otherwise */
242 function grep( arr, func ) {
243         var results = [];
244         for( var i in arr ) {
245                 if( func(arr[i]) ) 
246                         results.push(arr[i]);
247         }
248         if(results.length > 0) return results;
249         return null;
250 }
251
252 function doSelectorActions(sel) {
253         if(IE && sel) { 
254                 sel.onchange = function() {
255                         var o = sel.options[sel.selectedIndex];
256                         if(o && o.onclick) o.onclick()
257                 }
258         }
259 }
260
261 /* if index < 0, the item is pushed onto the end */
262 function insertSelectorVal( selector, index, name, value, action, indent ) {
263         if( index < 0 ) index = selector.options.length;
264         var a = [];
265         for( var i = selector.options.length; i != index; i-- ) 
266                 a[i] = selector.options[i-1];
267
268         var opt = setSelectorVal( selector, index, name, value, action, indent );
269
270         for( var i = index + 1; i < a.length; i++ ) 
271                 selector.options[i] = a[i];
272
273         return opt;
274 }
275
276 function setSelectorVal( selector, index, name, value, action, indent ) {
277         if(!indent || indent < 0) indent = 0;
278         indent = parseInt(indent);
279
280         var option;
281
282         if(IE) {
283                 var pre = elem("pre");
284                 for( var i = 0; i != indent; i++ )
285                         pre.appendChild(text("   "));
286
287                 pre.appendChild(text(name));
288                 option = new Option("", value);
289                 selector.options[index] = option;
290                 option.appendChild(pre);
291         
292         } else {
293                 indent = indent * 14;
294                 option= new Option(name, value);
295                 option.setAttribute("style", "padding-left: "+indent+'px;');
296                 selector.options[index] = option;
297                 if(action) option.onclick = action;
298         }
299
300         if(action) option.onclick = action;
301         return option;
302 }
303
304
305 /* split on spaces.  capitalize the first /\w/ character in
306    each substring */
307 function normalize(val) {
308
309    if(!val) return ""; 
310
311    var newVal = '';
312    try {val = val.split(' ');} catch(E) {return val;}
313    var reg = /\w/;
314
315    for( var c = 0; c < val.length; c++) {
316
317       var string = val[c];
318       var cap = false; 
319       for(var x = 0; x != string.length; x++) {
320
321          if(!cap) {
322             var ch = string.charAt(x);
323             if(reg.exec(ch + "")) {
324                newVal += string.charAt(x).toUpperCase();
325                cap = true;
326                continue;
327             }
328          }
329
330          newVal += string.charAt(x).toLowerCase();
331       }
332       if(c < (val.length-1)) newVal += " ";
333    }
334
335    newVal = newVal.replace(/\s*\.\s*$/,'');
336    newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / ');
337    newVal = newVal.replace(/\s*\/\s*$/,'');
338
339    return newVal;
340 }
341
342
343 /* returns true if n is null or stringifies to 'undefined' */
344 function isNull(n) {
345         if( n == null || n == undefined || n.toString().toLowerCase() == "undefined" 
346                 || n.toString().toLowerCase() == "null" )
347                 return true;
348         return false;
349 }
350
351
352 /* find nodes with an attribute of 'name' that equals nodeName */
353
354 function $n( root, nodeName ) { return findNodeByName(root,nodeName); }
355
356 function findNodeByName(root, nodeName) {
357         if( !root || !nodeName) return null;
358
359         if(root.nodeType != 1) return null;
360
361         if(root.getAttribute("name") == nodeName || root.name == nodeName ) 
362                 return root;
363
364         var children = root.childNodes;
365
366         for( var i = 0; i != children.length; i++ ) {
367                 var n = findNodeByName(children[i], nodeName);
368                 if(n) return n;
369         }
370
371         return null;
372 }
373
374
375 /* truncates the string at 'size' characters and appends a '...' to the end */
376 function truncate(string, size) {
377         if(string && size != null && 
378                         size > -1 && string.length > size) 
379                 return string.substr(0, size) + "... "; 
380         return string;
381 }
382
383
384 /* style sheets must have a 'name' attribute for these functions to work */
385 function setActivateStyleSheet(name) {
386         var i, a, main;
387         for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) {
388                 if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) {
389                         a.disabled = true;
390                         if (a.getAttribute ("name").indexOf(name) != -1)
391                                 a.disabled = false;
392                 }
393         }
394 }
395
396
397 /* ----------------------------------------------------- */
398 var currentFontSize;
399 function scaleFonts(type) {
400
401         var size                = "";
402         var ssize       = "";
403         var size2       = "";
404         var a;
405         
406         if(!currentFontSize) currentFontSize = 'regular';
407         if(currentFontSize == 'regular' && type == 'regular' ) return;
408         if( currentFontSize == type ) return;
409         currentFontSize = type;
410
411         switch(type) {
412                 case "large":  /* these are arbitrary.. but they seem to work ok in FF/IE */
413                         size = "142%"; 
414                         size2 = "107%"; 
415                         ssize = "94%";
416                         break;
417         }
418
419         document.getElementsByTagName('body')[0].style.fontSize = size;
420         for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
421         for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
422         for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
423         for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
424         for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
425         for (i = 0; (a = document.getElementsByTagName ("select")[i]); i++) a.style.fontSize = ssize;
426         for (i = 0; (a = document.getElementsByTagName ("a")[i]); i++) a.style.fontSize = size2;
427 }
428
429
430 function sortWordsIgnoreCase(a, b) {
431         a = a.toLowerCase();
432         b = b.toLowerCase();
433         if(a>b) return 1;
434         if(a<b) return -1;
435         return 0;
436 }
437
438
439 function getSelectedList(sel) {
440         if(!sel) return [];
441         var vals = [];
442         for( var i = 0; i != sel.options.length; i++ ) {
443                 if(sel.options[i].selected)
444                         vals.push(sel.options[i].value);
445         }
446         return vals;
447 }
448
449
450 function setEnterFunc(node, func) {
451         if(!(node && func)) return;
452         node.onkeydown = function(evt) {
453                 if( userPressedEnter(evt)) func();
454         }
455 }
456
457 function iterate( arr, callback ) {
458         for( var i = 0; i < arr.length; i++ ) 
459                 callback(arr[i]);
460 }
461
462
463
464
465 /* taken directly from the JSAN util.date library */
466 /* but changed from the util.date.interval_to_seconds invocation, 
467 because JSAN will assume the whole library is already loaded if 
468 it sees that, and the staff client uses both this file and the
469 JSAN library*/
470 function interval_to_seconds( $interval ) {
471
472         $interval = $interval.replace( /and/, ',' );
473         $interval = $interval.replace( /,/, ' ' );
474         
475         var $amount = 0;
476         var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);  
477         for( var i = 0; i < results.length; i++ ) {
478                 if(!results[i]) continue;
479                 var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
480                 if (result[2] == 's') $amount += result[1] ;
481                 if (result[2] == 'm') $amount += 60 * result[1] ;
482                 if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
483                 if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
484                 if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
485                 if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
486                 if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
487         }
488         return $amount;
489 }
490
491
492 function openWindow( data ) {
493         if( isXUL() ) {
494                 var data = window.escape(
495                         '<html><head><title></title></head><body>' + data + '</body></html>');
496
497                 xulG.window_open(
498                         'data:text/html,' + data,
499                         '', 
500                         'chrome,resizable,width=700,height=500'); 
501
502         } else {
503                 win = window.open('','', 'resizable,width=700,height=500'); 
504                 win.document.body.innerHTML = data;
505         }
506 }
507
508
509 /* alerts the innerhtml of the node with the given id */
510 function alertId(id) {
511         var node = $(id);
512         if(node) alert(node.innerHTML);
513 }
514
515 function confirmId(id) {
516         var node = $(id);
517         if(node) return confirm(node.innerHTML);
518 }
519
520
521 function goBack() { history.back(); }
522 function goForward() { history.forward(); }
523
524
525 function uniquify(arr) {
526         if(!arr) return [];
527         var newarr = [];
528         for( var i = 0; i < arr.length; i++ ) {
529                 var item = arr[i];
530                 if( ! grep( newarr, function(x) {return (x == item);}))
531                         newarr.push(item);
532         }
533         return newarr;
534 }