c6d8e2d6993c97ed6142818ce49ca2b558eaca7f
[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                                 value += ""; /* in case of number */ 
168                                 if( val && val.toLowerCase() == value.toLowerCase() ) {
169                                         sel.selectedIndex = i;
170                                         sel.options[i].selected = true;
171                                 }
172                         }
173                 }
174         }
175 }
176
177
178 /* split on spaces.  capitalize the first /\w/ character in
179    each substring */
180 function normalize(val) {
181
182    if(!val) return ""; 
183
184    var newVal = '';
185    try {val = val.split(' ');} catch(E) {return val;}
186    var reg = /\w/;
187
188    for( var c = 0; c < val.length; c++) {
189
190       var string = val[c];
191       var cap = false; 
192       for(var x = 0; x != string.length; x++) {
193
194          if(!cap) {
195             var ch = string.charAt(x);
196             if(reg.exec(ch + "")) {
197                newVal += string.charAt(x).toUpperCase();
198                cap = true;
199                continue;
200             }
201          }
202
203          newVal += string.charAt(x).toLowerCase();
204       }
205       if(c < (val.length-1)) newVal += " ";
206    }
207
208    newVal = newVal.replace(/\s*\.\s*$/,'');
209    newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / ');
210    newVal = newVal.replace(/\s*\/\s*$/,'');
211
212    return newVal;
213 }
214
215
216 /* returns true if n is null or stringifies to 'undefined' */
217 function isNull(n) {
218         if( n == null || n == undefined || n.toString().toLowerCase() == "undefined" 
219                 || n.toString().toLowerCase() == "null" )
220                 return true;
221         return false;
222 }
223
224
225 /* find nodes with an attribute of 'name' that equals nodeName */
226
227 function $n( root, nodeName ) { return findNodeByName(root,nodeName); }
228
229 function findNodeByName(root, nodeName) {
230         if( !root || !nodeName) return null;
231
232         if(root.nodeType != 1) return null;
233
234         if(root.getAttribute("name") == nodeName || root.name == nodeName ) 
235                 return root;
236
237         var children = root.childNodes;
238
239         for( var i = 0; i != children.length; i++ ) {
240                 var n = findNodeByName(children[i], nodeName);
241                 if(n) return n;
242         }
243
244         return null;
245 }
246
247
248 /* truncates the string at 'size' characters and appends a '...' to the end */
249 function truncate(string, size) {
250         if(string && size != null && 
251                         size > -1 && string.length > size) 
252                 return string.substr(0, size) + "... "; 
253         return string;
254 }
255
256
257 /* style sheets must have a 'name' attribute for these functions to work */
258 function setActivateStyleSheet(name) {
259         var i, a, main;
260         for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) {
261                 if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) {
262                         a.disabled = true;
263                         if (a.getAttribute ("name").indexOf(name) != -1)
264                                 a.disabled = false;
265                 }
266         }
267 }
268
269
270 /* ----------------------------------------------------- */
271 function scaleFonts(type) {
272
273         var size = "";
274         var ssize = "";
275         var a;
276
277         switch(type) {
278                 case "large": 
279                         size = "148%"; 
280                         ssize = "94%";
281                         break;
282         }
283
284         document.body.style.fontSize = size;
285         for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
286         for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
287         for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
288         for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
289         for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
290 }
291
292
293 function sortWordsIgnoreCase(a, b) {
294         a = a.toLowerCase();
295         b = b.toLowerCase();
296         if(a>b) return 1;
297         if(a<b) return -1;
298         return 0;
299 }
300
301
302
303
304
305