1 function $(id) { return getId(id); }
3 return document.getElementById(id);
6 function swapCSSClass(obj, old, newc ) {
7 removeCSSClass(obj, old );
8 addCSSClass(obj, newc );
12 function addCSSClass(e,c) {
15 var css_class_string = e.className;
19 css_class_array = css_class_string.split(/\s+/);
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] + " ";
28 e.className = string_ip;
31 function removeCSSClass(e, c) {
34 var css_class_string = '';
36 var css_class_array = e.className;
38 css_class_array = css_class_array.split(/\s+/);
41 for (var css_class in css_class_array) {
42 if (css_class_array[css_class] != c) {
44 css_class_string = css_class_array[css_class];
47 css_class_string = css_class_string + ' ' +
48 css_class_array[css_class];
52 e.className = css_class_string;
56 /*returns the character code pressed that caused the event */
57 function grabCharCode(evt) {
58 evt = (evt) ? evt : ((window.event) ? event : null);
60 return (evt.charCode ? evt.charCode :
61 ((evt.which) ? evt.which : evt.keyCode ));
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;
75 /* setTimeout because ie sux */
76 setTimeout( function(){ location.href = url; }, 0 );
80 function removeChildren(dom) {
82 while(dom.childNodes[0])
83 dom.removeChild(dom.childNodes[0]);
86 function appendClear(node, child) {
88 node.appendChild(child);
92 function instanceOf(object, constructorFunction) {
95 while (object != null) {
96 if (object == constructorFunction.prototype)
98 object = object.__proto__;
101 while(object != null) {
102 if( object instanceof constructorFunction )
104 object = object.__proto__;
111 /* ------------------------------------------------------------------------------------------- */
112 /* detect my browser */
113 var isMac, NS, NS4, NS6, IE, IE4, IE4mac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4;
114 function detect_browser() {
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;
128 IE5plus = IE5 || IE6;
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;
139 /* ------------------------------------------------------------------------------------------- */
143 if(t == null) t = "";
144 return document.createTextNode(t);
147 function elem(name, attrs, txt) {
148 var e = document.createElement(name);
151 if( key == 'id') e.id = attrs[key];
152 else e.setAttribute(key, attrs[key]);
155 if (txt) e.appendChild(text(txt));
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;
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;
200 function getSelectorVal( sel ) {
201 if(!sel) return null;
202 if( sel.selectedIndex < 0 ) return null;
203 var o = sel.options[sel.selectedIndex];
205 if(v == null) v = o.innerHTML;
209 function getSelectorName( sel ) {
210 var o = sel.options[sel.selectedIndex];
212 if(v == null || v == undefined || v == "") v = o.innerHTML;
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;
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;
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";
243 function findParentByNodeName(node, name) {
244 while( ( node = node.parentNode) )
245 if (node.nodeName == name) return node;
249 /* returns only elements in nodes childNodes list, not sub-children */
250 function getElementsByTagNameFlat( node, name ) {
252 for( var e in node.childNodes ) {
253 var n = node.childNodes[e];
254 if( n && n.nodeName == name ) elements.push(n);
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;
270 /* returns null if none of the tests are true. returns sub-array of
271 matching array items otherwise */
272 function grep( arr, func ) {
274 for( var i in arr ) {
276 results.push(arr[i]);
278 if(results.length > 0) return results;
282 function doSelectorActions(sel) {
284 sel.onchange = function() {
285 var o = sel.options[sel.selectedIndex];
286 if(o && o.onclick) o.onclick()
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;
295 for( var i = selector.options.length; i != index; i-- )
296 a[i] = selector.options[i-1];
298 var opt = setSelectorVal( selector, index, name, value, action, indent );
300 for( var i = index + 1; i < a.length; i++ )
301 selector.options[i] = a[i];
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);
314 var pre = elem("pre");
315 for( var i = 0; i != indent; i++ )
316 pre.appendChild(text(" "));
318 pre.appendChild(text(name));
319 option = new Option("", value);
320 selector.options[index] = option;
321 option.appendChild(pre);
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;
331 if(action) option.onclick = action;
336 /* split on spaces. capitalize the first /\w/ character in
338 function normalize(val) {
343 try {val = val.split(' ');} catch(E) {return val;}
346 for( var c = 0; c < val.length; c++) {
350 for(var x = 0; x != string.length; x++) {
353 var ch = string.charAt(x);
354 if(reg.exec(ch + "")) {
355 newVal += string.charAt(x).toUpperCase();
361 newVal += string.charAt(x).toLowerCase();
363 if(c < (val.length-1)) newVal += " ";
366 newVal = newVal.replace(/\s*\.\s*$/,'');
367 newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / ');
368 newVal = newVal.replace(/\s*\/\s*$/,'');
374 /* returns true if n is null or stringifies to 'undefined' */
376 if( n == null || n == undefined || n.toString().toLowerCase() == "undefined"
377 || n.toString().toLowerCase() == "null" )
383 /* find nodes with an attribute of 'name' that equals nodeName */
385 function $n( root, nodeName ) { return findNodeByName(root,nodeName); }
387 function findNodeByName(root, nodeName) {
388 if( !root || !nodeName) return null;
390 if(root.nodeType != 1) return null;
392 if(root.getAttribute("name") == nodeName || root.name == nodeName )
395 var children = root.childNodes;
397 for( var i = 0; i != children.length; i++ ) {
398 var n = findNodeByName(children[i], nodeName);
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) + "... ";
415 /* style sheets must have a 'name' attribute for these functions to work */
416 function setActivateStyleSheet(name) {
418 for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) {
419 if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) {
421 if (a.getAttribute ("name").indexOf(name) != -1)
428 /* ----------------------------------------------------- */
430 function scaleFonts(type) {
437 if(!currentFontSize) currentFontSize = 'regular';
438 if(currentFontSize == 'regular' && type == 'regular' ) return;
439 if( currentFontSize == type ) return;
440 currentFontSize = type;
443 case "large": /* these are arbitrary.. but they seem to work ok in FF/IE */
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;
461 function sortWordsIgnoreCase(a, b) {
470 function getSelectedList(sel) {
473 for( var i = 0; i != sel.options.length; i++ ) {
474 if(sel.options[i].selected)
475 vals.push(sel.options[i].value);
481 function setEnterFunc(node, func) {
482 if(!(node && func)) return;
483 node.onkeydown = function(evt) {
484 if( userPressedEnter(evt)) func();
488 function iterate( arr, callback ) {
489 for( var i = 0; i < arr.length; i++ )
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
501 function interval_to_seconds( $interval ) {
503 $interval = $interval.replace( /and/, ',' );
504 $interval = $interval.replace( /,/, ' ' );
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] ;
523 function openWindow( data ) {
525 var data = window.escape(
526 '<html><head><title></title></head><body>' + data + '</body></html>');
529 'data:text/html,' + data,
531 'chrome,resizable,width=700,height=500');
534 win = window.open('','', 'resizable,width=700,height=500,scrollbars=1');
535 win.document.body.innerHTML = data;
540 /* alerts the innerhtml of the node with the given id */
541 function alertId(id) {
543 if(node) alert(node.innerHTML);
546 function confirmId(id) {
548 if(node) return confirm(node.innerHTML);
552 function goBack() { history.back(); }
553 function goForward() { history.forward(); }
556 function uniquify(arr) {
559 for( var i = 0; i < arr.length; i++ ) {
561 if( ! grep( newarr, function(x) {return (x == item);}))
567 function contains(arr, item) {
568 for( var i = 0; i < arr.length; i++ )
569 if( arr[i] == item ) return true;
574 return (i && !(i+'').match(/f/i) );
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
581 Months are 1-12 (unlike the JS date object)
584 function buildDate( year, month, day, hours, minutes, seconds ) {
587 if(!month) month = 1;
589 if(!hours) hours = 0;
590 if(!minutes) minutes = 0;
591 if(!seconds) seconds = 0;
593 var d = new Date(year, month - 1, day, hours, minutes, seconds);
595 _debug('created date with ' +
596 (d.getYear() + 1900) +'-'+
597 (d.getMonth() + 1) +'-'+
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) ) {