]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/utils.js
fixed session cookie to work with IE
[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                                         return true;
174                                 }
175                         }
176                 }
177         }
178         return false;
179 }
180
181 function setSelectorRegex( sel, regex ) {
182         if(sel && regex != null) {
183                 for( var i = 0; i!= sel.options.length; i++ ) { 
184                         if( sel.options[i] ) {
185                                 var val = sel.options[i].value;
186                                 if( val == null || val == "" ) /* for IE */
187                                         val = sel.options[i].innerHTML;
188                                 value += ""; /* in case of number */ 
189                                 if( val && val.match(regex) ) {
190                                         sel.selectedIndex = i;
191                                         sel.options[i].selected = true;
192                                         return true;
193                                 }
194                         }
195                 }
196         }
197         return false;
198 }
199
200 function getSelectorVal( sel ) {
201         if(!sel) return null;
202         if( sel.selectedIndex < 0 ) return null;
203         var o = sel.options[sel.selectedIndex];
204         var v = o.value; 
205         if(v == null) v = o.innerHTML;
206         return v;
207 }
208
209 function getSelectorName( sel ) {
210         var o = sel.options[sel.selectedIndex];
211         var v = o.name;
212         if(v == null || v == undefined || v == "") v = o.innerHTML;
213         return v;
214 }
215
216 function setSelectorByName( sel, name ) {
217         for( var o in sel.options ) {
218                 var opt = sel.options[o];
219                 if( opt.name == name || opt.innerHTML == name ) {
220                         sel.selectedIndex = o;
221                         opt.selected = true;
222                 }
223         }
224 }
225
226 function findSelectorOptByValue( sel, val ) {
227         for( var i = 0; i < sel.options.length; i++ ) {
228                 var opt = sel.options[i];
229                 if( opt.value == val ) return opt;
230         }
231         return null;
232 }
233
234 function debugSelector(sel) {
235         var s = 'Selector\n';
236         for( var i = 0; i != sel.options.length; i++ ) {
237                 var o = sel.options[i];
238                 s += "\t" + o.innerHTML + "\n";
239         }
240         return s;
241 }
242
243 function findParentByNodeName(node, name) {
244         while( ( node = node.parentNode) ) 
245                 if (node.nodeName == name) return node;
246         return null;
247 }
248
249 /* returns only elements in nodes childNodes list, not sub-children */
250 function getElementsByTagNameFlat( node, name ) {
251         var elements = [];
252         for( var e in node.childNodes ) {
253                 var n = node.childNodes[e];
254                 if( n && n.nodeName == name ) elements.push(n);
255         }
256         return elements;
257 }
258
259 /* expects a tree with a id() method on each node and a 
260 children() method to get to each node */
261 function findTreeItemById( tree, id ) {
262         if( tree.id() == id ) return tree;
263         for( var c in tree.children() ) {
264                 var found = findTreeItemById( tree.children()[c], id );
265                 if(found) return found;
266         }
267         return null;
268 }
269
270 /* returns null if none of the tests are true.  returns sub-array of 
271 matching array items otherwise */
272 function grep( arr, func ) {
273         var results = [];
274         for( var i in arr ) {
275                 if( func(arr[i]) ) 
276                         results.push(arr[i]);
277         }
278         if(results.length > 0) return results;
279         return null;
280 }
281
282 function doSelectorActions(sel) {
283         if(IE && sel) { 
284                 sel.onchange = function() {
285                         var o = sel.options[sel.selectedIndex];
286                         if(o && o.onclick) o.onclick()
287                 }
288         }
289 }
290
291 /* if index < 0, the item is pushed onto the end */
292 function insertSelectorVal( selector, index, name, value, action, indent ) {
293         if( index < 0 ) index = selector.options.length;
294         var a = [];
295         for( var i = selector.options.length; i != index; i-- ) 
296                 a[i] = selector.options[i-1];
297
298         var opt = setSelectorVal( selector, index, name, value, action, indent );
299
300         for( var i = index + 1; i < a.length; i++ ) 
301                 selector.options[i] = a[i];
302
303         return opt;
304 }
305
306 /* changes the value of the option at the specified index */
307 function setSelectorVal( selector, index, name, value, action, indent ) {
308         if(!indent || indent < 0) indent = 0;
309         indent = parseInt(indent);
310
311         var option;
312
313         if(IE) {
314                 var pre = elem("pre");
315                 for( var i = 0; i != indent; i++ )
316                         pre.appendChild(text("   "));
317
318                 pre.appendChild(text(name));
319                 option = new Option("", value);
320                 selector.options[index] = option;
321                 option.appendChild(pre);
322         
323         } else {
324                 indent = indent * 14;
325                 option= new Option(name, value);
326                 option.setAttribute("style", "padding-left: "+indent+'px;');
327                 selector.options[index] = option;
328                 if(action) option.onclick = action;
329         }
330
331         if(action) option.onclick = action;
332         return option;
333 }
334
335
336 /* split on spaces.  capitalize the first /\w/ character in
337    each substring */
338 function normalize(val) {
339
340    if(!val) return ""; 
341
342    var newVal = '';
343    try {val = val.split(' ');} catch(E) {return val;}
344    var reg = /\w/;
345
346    for( var c = 0; c < val.length; c++) {
347
348       var string = val[c];
349       var cap = false; 
350       for(var x = 0; x != string.length; x++) {
351
352          if(!cap) {
353             var ch = string.charAt(x);
354             if(reg.exec(ch + "")) {
355                newVal += string.charAt(x).toUpperCase();
356                cap = true;
357                continue;
358             }
359          }
360
361          newVal += string.charAt(x).toLowerCase();
362       }
363       if(c < (val.length-1)) newVal += " ";
364    }
365
366    newVal = newVal.replace(/\s*\.\s*$/,'');
367    newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / ');
368    newVal = newVal.replace(/\s*\/\s*$/,'');
369
370    return newVal;
371 }
372
373
374 /* returns true if n is null or stringifies to 'undefined' */
375 function isNull(n) {
376         if( n == null || n == undefined || n.toString().toLowerCase() == "undefined" 
377                 || n.toString().toLowerCase() == "null" )
378                 return true;
379         return false;
380 }
381
382
383 /* find nodes with an attribute of 'name' that equals nodeName */
384
385 function $n( root, nodeName ) { return findNodeByName(root,nodeName); }
386
387 function findNodeByName(root, nodeName) {
388         if( !root || !nodeName) return null;
389
390         if(root.nodeType != 1) return null;
391
392         if(root.getAttribute("name") == nodeName || root.name == nodeName ) 
393                 return root;
394
395         var children = root.childNodes;
396
397         for( var i = 0; i != children.length; i++ ) {
398                 var n = findNodeByName(children[i], nodeName);
399                 if(n) return n;
400         }
401
402         return null;
403 }
404
405
406 /* truncates the string at 'size' characters and appends a '...' to the end */
407 function truncate(string, size) {
408         if(string && size != null && 
409                         size > -1 && string.length > size) 
410                 return string.substr(0, size) + "... "; 
411         return string;
412 }
413
414
415 /* style sheets must have a 'name' attribute for these functions to work */
416 function setActivateStyleSheet(name) {
417         var i, a, main;
418         for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) {
419                 if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) {
420                         a.disabled = true;
421                         if (a.getAttribute ("name").indexOf(name) != -1)
422                                 a.disabled = false;
423                 }
424         }
425 }
426
427
428 /* ----------------------------------------------------- */
429 var currentFontSize;
430 function scaleFonts(type) {
431
432         var size                = "";
433         var ssize       = "";
434         var size2       = "";
435         var a;
436         
437         if(!currentFontSize) currentFontSize = 'regular';
438         if(currentFontSize == 'regular' && type == 'regular' ) return;
439         if( currentFontSize == type ) return;
440         currentFontSize = type;
441
442         switch(type) {
443                 case "large":  /* these are arbitrary.. but they seem to work ok in FF/IE */
444                         size = "142%"; 
445                         size2 = "107%"; 
446                         ssize = "94%";
447                         break;
448         }
449
450         document.getElementsByTagName('body')[0].style.fontSize = size;
451         for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
452         for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
453         for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
454         for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
455         for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
456         for (i = 0; (a = document.getElementsByTagName ("select")[i]); i++) a.style.fontSize = ssize;
457         for (i = 0; (a = document.getElementsByTagName ("a")[i]); i++) a.style.fontSize = size2;
458 }
459
460
461 function sortWordsIgnoreCase(a, b) {
462         a = a.toLowerCase();
463         b = b.toLowerCase();
464         if(a>b) return 1;
465         if(a<b) return -1;
466         return 0;
467 }
468
469
470 function getSelectedList(sel) {
471         if(!sel) return [];
472         var vals = [];
473         for( var i = 0; i != sel.options.length; i++ ) {
474                 if(sel.options[i].selected)
475                         vals.push(sel.options[i].value);
476         }
477         return vals;
478 }
479
480
481 function setEnterFunc(node, func) {
482         if(!(node && func)) return;
483         node.onkeydown = function(evt) {
484                 if( userPressedEnter(evt)) func();
485         }
486 }
487
488 function iterate( arr, callback ) {
489         for( var i = 0; i < arr.length; i++ ) 
490                 callback(arr[i]);
491 }
492
493
494
495
496 /* taken directly from the JSAN util.date library */
497 /* but changed from the util.date.interval_to_seconds invocation, 
498 because JSAN will assume the whole library is already loaded if 
499 it sees that, and the staff client uses both this file and the
500 JSAN library*/
501 function interval_to_seconds( $interval ) {
502
503         $interval = $interval.replace( /and/, ',' );
504         $interval = $interval.replace( /,/, ' ' );
505         
506         var $amount = 0;
507         var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);  
508         for( var i = 0; i < results.length; i++ ) {
509                 if(!results[i]) continue;
510                 var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
511                 if (result[2] == 's') $amount += result[1] ;
512                 if (result[2] == 'm') $amount += 60 * result[1] ;
513                 if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
514                 if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
515                 if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
516                 if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
517                 if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
518         }
519         return $amount;
520 }
521
522
523 function openWindow( data ) {
524         if( isXUL() ) {
525                 var data = window.escape(
526                         '<html><head><title></title></head><body>' + data + '</body></html>');
527
528                 xulG.window_open(
529                         'data:text/html,' + data,
530                         '', 
531                         'chrome,resizable,width=700,height=500'); 
532
533         } else {
534                 win = window.open('','', 'resizable,width=700,height=500,scrollbars=1'); 
535                 win.document.body.innerHTML = data;
536         }
537 }
538
539
540 /* alerts the innerhtml of the node with the given id */
541 function alertId(id) {
542         var node = $(id);
543         if(node) alert(node.innerHTML);
544 }
545
546 function confirmId(id) {
547         var node = $(id);
548         if(node) return confirm(node.innerHTML);
549 }
550
551
552 function goBack() { history.back(); }
553 function goForward() { history.forward(); }
554
555
556 function uniquify(arr) {
557         if(!arr) return [];
558         var newarr = [];
559         for( var i = 0; i < arr.length; i++ ) {
560                 var item = arr[i];
561                 if( ! grep( newarr, function(x) {return (x == item);}))
562                         newarr.push(item);
563         }
564         return newarr;
565 }
566
567 function contains(arr, item) {
568         for( var i = 0; i < arr.length; i++ ) 
569                 if( arr[i] == item ) return true;
570         return false;
571 }
572
573 function isTrue(i) {
574         return (i && !(i+'').match(/f/i) );
575 }
576
577
578 /* builds a JS date object with the given info.  The given data
579         has to be valid (e.g. months == 30 is not valid).  Returns NULL on 
580         invalid date 
581         Months are 1-12 (unlike the JS date object)
582         */
583
584 function buildDate( year, month, day, hours, minutes, seconds ) {
585
586         if(!year) year = 0;
587         if(!month) month = 1;
588         if(!day) day = 1;
589         if(!hours) hours = 0;
590         if(!minutes) minutes = 0;
591         if(!seconds) seconds = 0;
592
593         var d = new Date(year, month - 1, day, hours, minutes, seconds);
594         
595         _debug('created date with ' +
596                 (d.getYear() + 1900) +'-'+
597                 (d.getMonth() + 1) +'-'+
598                 d.getDate()+' '+
599                 d.getHours()+':'+
600                 d.getMinutes()+':'+
601                 d.getSeconds());
602
603
604         if( 
605                 (d.getYear() + 1900) == year &&
606                 d.getMonth()    == (month - 1) &&
607                 d.getDate()             == new Number(day) &&
608                 d.getHours()    == new Number(hours) &&
609                 d.getMinutes() == new Number(minutes) &&
610                 d.getSeconds() == new Number(seconds) ) {
611                 return d;
612         }
613
614         return null;
615 }
616
617