]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/utils.js
oops, JSAN hijinks
[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         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         currentFontSize = type;
409
410         switch(type) {
411                 case "large":  /* these are arbitrary.. but they seem to work ok in FF/IE */
412                         size = "142%"; 
413                         size2 = "107%"; 
414                         ssize = "94%";
415                         break;
416         }
417
418         document.getElementsByTagName('body')[0].style.fontSize = size;
419         for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
420         for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
421         for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
422         for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
423         for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
424         for (i = 0; (a = document.getElementsByTagName ("select")[i]); i++) a.style.fontSize = ssize;
425         for (i = 0; (a = document.getElementsByTagName ("a")[i]); i++) a.style.fontSize = size2;
426 }
427
428
429 function sortWordsIgnoreCase(a, b) {
430         a = a.toLowerCase();
431         b = b.toLowerCase();
432         if(a>b) return 1;
433         if(a<b) return -1;
434         return 0;
435 }
436
437
438 function getSelectedList(sel) {
439         if(!sel) return [];
440         var vals = [];
441         for( var i = 0; i != sel.options.length; i++ ) {
442                 if(sel.options[i].selected)
443                         vals.push(sel.options[i].value);
444         }
445         return vals;
446 }
447
448
449 function setEnterFunc(node, func) {
450         if(!(node && func)) return;
451         node.onkeydown = function(evt) {
452                 if( userPressedEnter(evt)) func();
453         }
454 }
455
456 function iterate( arr, callback ) {
457         for( var i = 0; i < arr.length; i++ ) 
458                 callback(arr[i]);
459 }
460
461
462
463
464 /* taken directly from the JSAN util.date library */
465 /* but changed from the util.date.interval_to_seconds invocation, 
466 because JSAN will assume the whole library is already loaded if 
467 it sees that, and the staff client uses both this file and the
468 JSAN library*/
469 function interval_to_seconds( $interval ) {
470
471         $interval = $interval.replace( /and/, ',' );
472         $interval = $interval.replace( /,/, ' ' );
473
474         var $amount = 0;
475         var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);  
476         for (var i in results) {
477                 var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
478                 if (result[2] == 's') $amount += result[1] ;
479                 if (result[2] == 'm') $amount += 60 * result[1] ;
480                 if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
481                 if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
482                 if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
483                 if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
484                 if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
485         }
486         return $amount;
487 }
488
489