79959c295d715e669de1e6ac7a7071c4b0ee7865
[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 == "") 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         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 function scaleFonts(type) {
399
400         var size                = "";
401         var ssize       = "";
402         var size2       = "";
403         var a;
404
405         switch(type) {
406                 case "large":  /* these are arbitrary.. but they seem to work ok in FF/IE */
407                         size = "142%"; 
408                         size2 = "107%"; 
409                         ssize = "94%";
410                         break;
411         }
412
413         document.getElementsByTagName('body')[0].style.fontSize = size;
414         for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
415         for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
416         for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
417         for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
418         for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
419         for (i = 0; (a = document.getElementsByTagName ("select")[i]); i++) a.style.fontSize = ssize;
420         for (i = 0; (a = document.getElementsByTagName ("a")[i]); i++) a.style.fontSize = size2;
421 }
422
423
424 function sortWordsIgnoreCase(a, b) {
425         a = a.toLowerCase();
426         b = b.toLowerCase();
427         if(a>b) return 1;
428         if(a<b) return -1;
429         return 0;
430 }
431
432
433
434
435
436 function setEnterFunc(node, func) {
437         if(!(node && func)) return;
438         node.onkeydown = function(evt) {
439                 if( userPressedEnter(evt)) func();
440         }
441 }