/** * util.js  * by Garrett Smith  * Provides functionality for working nodeLists. */Browser = new function () {		this.isSupported = function(){		return typeof document.getElementsByTagName != "undefined"			&& typeof document.getElementById != "undefined";	};		var u = navigator.userAgent;	var OMNI = u.indexOf("Omni") > 0;	this.OP5 = /Opera [56]/.test(u);	this.OP7 = /Opera [7]/.test(u);	this.MAC = /Mac/.test(u);	if(!this.OP5 && !OMNI){		this.IE5 = /MSIE 5/.test(u);		this.IE5_0 = /MSIE 5.0/.test(u);		this.MOZ =/Gecko/.test(u);		this.MAC_IE5 = this.MAC && this.IE5;		this.IE6 = /MSIE 6/.test(u);		this.WIN9X = /Win9|Windows 9/.test(u);	}		};TokenizedExps = {EXT:/(\.(.[^\.]+)$)/};function getTokenizedExp(t, flag){	var x = TokenizedExps[t];	if(!x)		x = TokenizedExps[t] = new RegExp("(^|\\s)"+t+"($|\\s)", flag);	return x;}function hasToken(s, t){	return getTokenizedExp(t,"").test(s);};	/** Returns an Array of all childNodes *  who have a className that matches the className *  parameter. * *	Nested elements are not returned, only *	direct descendants (i.e. childNodes). */function getChildNodesWithClass(p, k){			var collection = p.childNodes;	var returnedCollection = [];	var exp = getTokenizedExp(k,"");	for(var i = 0, counter = 0, len = collection.length; i < len; i++)		if(exp.test(collection[i].className))			returnedCollection[counter++] = collection[i];	return returnedCollection;}/** Returns an Array of all descendant elements *  who have a className that matches the className *  parameter. This method differs from getChildNodesWithClass *  because it returns ALL descendants (deep). */	function getElementsWithClass(p, tagName, k){	var returnedCollection = [];	try{	var exp = getTokenizedExp(k,"");	var collection = (tagName == "*" && p.all) ?		p.all : p.getElementsByTagName(tagName);		for(var i = 0, counter = 0, len = collection.length; i < len; i++){				if(exp.test(collection[i].className))			returnedCollection[counter++] = collection[i];	}	return returnedCollection;	}	catch(x){	alert("p = "+ p  +" tagName = "+ tagName+" k = "+k);throw x;}}/** Returns an Array of all descendant elements *  where each element has a className that matches  *  any of the classNames in classList. * *  This method is like getElementsWithClass except it accepts  *  an Array of classes to search for. */	function getElementsFromClassList(el, tagName, classList){    var returnedCollection = new Array();        var collection = (tagName == "*" && el.all) ?    	el.all : el.getElementsByTagName(tagName);    var len = classList.length    var exps = [len];	for(var i = 0; i < len; i++)		exps[i] = getTokenizedExp(classList[i],"");	for(var j = 0, c = 0, coLen = collection.length; j < coLen; j++){		kloop: for(var k = 0; k < len; k++){			if(exps[k].test(collection[j].className)){				returnedCollection[c++] = collection[j];				break kloop;			}		}	}    return returnedCollection;}function findAncestorWithClass(el, k) {		if(el == null)		return null;	var exp = getTokenizedExp(k,"");	for(var p = el.parentNode;p != null;){			if( exp.test(p.className) )			return p;					p = p.parentNode;	}	return null;}function getDescendantById(p, id){	var childNodes = p.all ? p.all : p.getElementsByTagName("*");	for(var i = 0, len = childNodes.length; i < len; i++)		if(childNodes[i].id == id)			return childNodes[i];	return null;}function removeClass(el, k){	el.className = el.className.replace(getTokenizedExp(k, "g")," ").normalize();}function repaintFix(el){	el.style.visibility = 'hidden';	el.style.visibility = 'visible';}var trimExp = /^\s+|\s+$/g;String.prototype.trim = function(){		return this.replace(trimExp, "");};var wsMultExp = /\s\s+/g;String.prototype.normalize = function(){		return this.trim().replace(wsMultExp, " ");};var extExp = /(\.(.[^\.]+)$)/;if(!Array.prototype.unshift)	Array.prototype.unshift = function() {        this.reverse();        for(var i=arguments.length-1; i > -1; i--)            this[this.length] = arguments[i];        this.reverse();        return this.length;};function fireOnload(fn) {  // DOM					  		if(window.addEventListener) {		window.addEventListener("load", fn, false);	}  // IE	else if(window.attachEvent){		window.attachEvent("onload", fn);	}  // Mac IE	else {		var oldFp = (document.onreadystatechange != null) ?			document.onreadystatechange : function() {};					document.onreadystatechange = function() {			if(document.readyState == "interactive") {				oldFp();				fn();			}		};	}}