var Lib = {
	addEvent: function(elm, evType, fn) {
		if(elm.addEventListener) {
			elm.addEventListener(evType, fn, false);
		}

		else if(elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		}

		else {
			elm['on' + evType] = fn;
		}
	},

	offsetTop: function(obj) {
		retval = obj.offsetTop; useobj = obj;
		obj.prev = obj.offsetTop;

		while(useobj.nodeName.toLowerCase() != 'html') {
			if(obj.prev != useobj.offsetTop) {
				retval += useobj.offsetTop;
			}
			
			obj.prev = useobj.offsetTop;
			useobj = useobj.parentNode;
		}

		return retval;
	},

	offsetLeft: function(obj) {
		retval = 0; useobj = obj;

		while(useobj.nodeName.toLowerCase() != 'html') {
			retval += useobj.offsetLeft;
			useobj = useobj.parentNode;
		}

		return retval;
	},

	ascendDOM: function(e, target) {
		while(e.nodeName.toLowerCase() != target && e.nodeName.toLowerCase() != 'html') {
			e = e.parentNode;
		}

		return (e.nodeName.toLowerCase() == 'html') ? false : e;
	},

	nextSiblings: function(e, target) {
		while(e.nodeName.toLowerCase() != target && e.nodeName) {
			e = e.nextSibling;
		}

		return (e.nodeName) ? e : false;
	},

	previousSiblings: function(e, target) {
		while(e.nodeName.toLowerCase() != target && e.nodeName) {
			e = e.previousSibling;
		}

		return (e.nodeName) ? e : false;
	},

	getTarget: function(e) {
		return (window.event ? window.event.srcElement : e ? e.target : false);
	},

	getE: function(e) {
		return (window.event ? window.event : e ? e : false);
	},

	getCharCode: function(e) {
		var retval;

		if(e && e.which) {
			retval = e.which;
		}

		else if(e && e.keyCode) {
			retval = e.keyCode;
		}

		else if(window.event && window.event.keyCode) {
			retval = window.event.keyCode;
		}

		else {
			retval = false;
		}

		return retval;
	},

	stopNormal: function(e) {
		if(window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}

		else {
			e.stopPropagation();
			e.preventDefault();
		}
	},

	selectLoc: function(formSelect) {
		window.location = formSelect.options[formSelect.selectedIndex].value;
	},

	tickAllYes: function(formObj) {
		for(x = 0; x < formObj.elements.length; x++) {
			radio = formObj.elements[x];

			if(radio.type != 'radio') {
				continue;
			}

			if(radio.value == 1) {
				radio.checked = true;
			}

			else {
				radio.checked = false;
			}
		}
	},

	tickAllNo: function(formObj) {
		for(x = 0; x < formObj.elements.length; x++) {
			radio = formObj.elements[x];

			if(radio.type != 'radio') {
				continue;
			}

			if(radio.value == 1) {
				radio.checked = false;
			}

			else if(radio.value == 0) {
				radio.checked = true;
			}
		}
	},

	tickBoxes: function(formObj, tick) {
		tickvalue = false;

		if(tick.checked == true) {
			tickvalue = true;
		}

		for(x = 1; x < formObj.elements.length; x++) {
			tickbox = formObj.elements[x];

			if(tickbox.type != 'checkbox') {
				continue;
			}

			tickbox.checked = tickvalue;
		}
	},

	colorViewer: function(name, input) {
		var divit = document.getElementById(name);

		try {
			divit.style.background = input.value;
		} catch(csserror) {
			divit.style.background = "transparent";
		}
	},

	trim: function(trimmer) {
		return trimmer.replace(/^\s+/g, '').replace(/\s+$/g, '');
	},

	backToHtml: function(text) {
		text = text.replace(/&lt;/g, '<');
		text = text.replace(/&gt;/g, '>');
		text = text.replace(/&amp;/g, '&');

		return text;
	},

	matchClass: function(obj, cName) {
		myreg = new RegExp('\\b\\s*' + cName + '\\b');

		if(obj.className.match(myreg)) {
			return true;
		}

		return false;
	},

	addClass: function(obj, cName) {
		obj.className += ' ' + cName;
	},

	removeClass: function(obj, cName) {
		myreg = new RegExp('\\b\\s*' + cName + '\\b');
		obj.className = obj.className.replace(myreg, '');
	}
}