
function JSLib() {
	var reportErrorEnabled = false;
	var reportErrorElement = '';

	/*
	 * Report an error either by writing to the innerHTML of an element or by calling alert()
	 */
	var reportError = function(message, error) {
		if(!reportErrorEnabled) return;
		
		if(reportErrorElement) {
			reportErrorElement.innerHMTL += message;
		} else {
			alert(message);
		}
	}
	
	/*
	 * Toggle an element's visibility, and optionally change the text on a toggling element
	 */
	this.toggleElement = function(element, force, toggle_element, text_on, text_off) {
		var el = "";
		var t_el = "";
		var display;
	
		if(!element || element == "") return;
		
		try {
			/*Get the element to toggle*/
			if(element.id) {	//actual container object provided
				el = element;
			} else {		//id of container provided
				el = document.getElementById(element);
			}
			
			if(!el) return;
			
			/*display or hide element? */
			if(force == 0) {
				display = "none";
			} else if(force == 1) {
				display = "";
			} else {	//toggle
				display = (el.style.display == "none") ? "" : "none";
			}
			el.style.display = display;
			
			/*Change the text to a toggle element*/
			if(toggle_element && toggle_element.id) { //container object provided
				t_el = toggle_element;
			} else if (toggle_element != "") { //id of container provided
				t_el = document.getElementById(toggle_element);
			}
			
			if(t_el) {
				if(display == "none" && text_off != "") {
					t_el.innerHTML = text_off;
				} else if(display == "" && text_on != "") {
					t_el.innerHTML = text_on;
				}
				
			}
		} catch (e) {
			reportError("Error displaying page content", e);
		}
	}
	
	/*
	 * Find the left point of an element
	 */
	this.findPosX = function(obj)
	{
		var curleft = 0;
		
		try {
			if (obj.offsetParent)
			{
				while (obj.offsetParent)
				{
					curleft += obj.offsetLeft
					obj = obj.offsetParent;
				}
			}
			else if (obj.x)
				curleft += obj.x;
		} catch (e) {
			reportError("Could not find left position of element", e);
			curleft = -1;
		}
		return curleft;
	}
	
	/*
	 * Find the top point of an element
	 */
	this.findPosY = function (obj)
	{
		var curtop = 0;
		try {
			if (obj.offsetParent)
			{
				while (obj.offsetParent)
				{
					curtop += obj.offsetTop
					obj = obj.offsetParent;
				}
			}
			else if (obj.y)
				curtop += obj.y;
		} catch (e) {
			reportError("Could not find top position of element", e);
			curtop = -1;
		}	
		return curtop;
	}
	
	/*
	 *	Set an element's position relative to an element
	 */
	this.setPositionByElement = function(element, referenceElement, offsetX, offsetY) {
		var x = this.findPosX(referenceElement) + offsetX;
		var y = this.findPosY(referenceElement) + offsetY;
		
		try {
			element.style.left = x+"px";
			element.style.top = y+"px";
			
		} catch (e) {
			reportError("Could not set position by element", e);
		}
	}

	this.setReportError = function(enable, element) {
		reportErrorEnabled = enable;
		
		reportErrorElement = (element && element.getAttribute) ? element : document.getElementById(element);
	}
}