function getXmlHttpObject()
{
	var xmlHttp = null;
	try {
  		// Firefox, Opera, Safari, IE7
  		xmlHttp = new XMLHttpRequest();
  	}
	catch (e)
  	{
  		// IE6
  		try
    	{
    		xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    	}
  		catch (e)
    	{
    		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    	}
  	}
	return xmlHttp;
}

/**
 * async GET request
 */
function asyncRequest(url, callback, errorCallback, params)
{
		// if no error callback set, use a default that just throws the error,
		// notifying the browser so we can see it in the browser javascript log
    if(errorCallback == null){
		errorCallback = function(error){
    		throw "Error contacting server on refresh: " + error;
	    };
    }

    var xmlreq = getXmlHttpObject();
    xmlreq.open("POST", url, true);
    xmlreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlreq.onreadystatechange = function(){
        if (xmlreq.readyState == 4 && xmlreq.status == 200) {
            if (xmlreq.responseText){
                callback(xmlreq.responseText);
            }
            else{
                errorCallback("Server returned null response with HTTP OK");
            }
        }
        else if (xmlreq.readyState == 4 && xmlreq.status != 200) {
            errorCallback(xmlreq.status);
        }
    };
    xmlreq.send(params);
}

function toolTip(text,obj,diff) {
	var toolTip = document.getElementById('toolTipBox');
	toolTip.innerHTML=text;
	toolTip.style.display="block";
	updatePos(obj, diff);
	obj.onmouseout=function(){
		hideMe();
	}	
}
function updatePos(obj, diff) {
	var toolTip = document.getElementById('toolTipBox');
	var pos = getPos(obj);
	var diffX = diff;
	var diffY = toolTip.clientHeight;
	var targetX = pos[0] + diffX;
	var targetY = pos[1] - diffY;
	var yOffset = getOffsetY();
	var xOffset = getOffsetX();
	var x;
	if(targetX+toolTip.clientWidth >= document.body.clientWidth){
		x = (document.body.clientWidth - toolTip.clientWidth) + 'px';
	}
	else if(targetX < xOffset){
		x = xOffset + 'px';
	}
	else{
		x = targetX + 'px';
	}
	var y;
	if(targetY < yOffset){
		y = yOffset + 'px';
	}
	else{
		y = targetY + 'px';
	}
	toolTip.style.top = y;
	toolTip.style.left = x;
}

function hideMe() {
	hideElement(document.getElementById('toolTipBox'));
}

function hideElement(element) {
	if(element){
		element.style.display="none";
	}
}

function showElement(element){
	if(element){
		element.style.display='block';
	}
}

function getOffsetX(){
	var xOffset;
	if(window.pageXOffset){
		xOffset = window.pageXOffset;
	}
	else if(document.body.scrollLeft){
		xOffset = document.body.scrollLeft;
	}
	else if(document.documentElement){
		if(document.documentElement.scrollLeft){
			xOffset = document.documentElement.scrollLeft;
		}
	}
	if(!xOffset){
		return 0;
	}
	return xOffset;
}

function getWindowTop(){
	if( window.pageYOffset ) {
		return window.pageYOffset;
	}
	else if ( document.body.scrollTop){
		return document.body.scrollTop;
	}
	else if(document.documentElement){
		if(document.documentElement.scrollTop){
			return document.documentElement.scrollTop;
		}
		else{
			return 0;
		}
	}
	else{
		return 0;
	}
}

// sends an element to the top of the browser window
function sendToTop(element){
	var position = getWindowTop();
	element.style.top = position + "px";
}

function getOffsetY(){
	var yOffset;
	if(window.pageYOffset){
		yOffset = window.pageYOffset;
	}
	else if(document.body.scrollTop){
		yOffset = document.body.scrollTop;
	}
	else if(document.documentElement){
		if(document.documentElement.scrollTop){
			yOffset = document.documentElement.scrollTop;
		}
	}
	if(!yOffset){
		return 0;
	}
	return yOffset;
}

function getPos(obj) {
	if( typeof(obj.offsetParent) != 'undefined' ) {
		for(var posX=0, posY=0; obj; obj=obj.offsetParent ) {
			posX += obj.offsetLeft;
			posY += obj.offsetTop;
		}
		return [posX, posY];
	}
	else {
		return [obj.x, obj.y];
	}
}

// Get an element's position with width and height {x, y, cx, cy}
function getAbsDimensions(element) {
	var position = new Object;
	position.x = 0;
	position.y = 0;

	if(element) {
		position.x = element.offsetLeft;
		position.y = element.offsetTop;

		if( element.offsetParent ) {
			var parentpos = getAbsDimensions(element.offsetParent);
			position.x += parentpos.x;
			position.y += parentpos.y;
		}
	}
	position.cx = element.offsetWidth;
	position.cy = element.offsetHeight;
	return position;
}

// Returns true if an element is inside the absolute coordinates {x, y}
function isInPt(element, x, y){
	var pos = getAbsDimensions(element);	
	var l=pos.x;
	var t=pos.y;
	var r=l + pos.cx;
	var b=t + pos.cy;				
	return  (x > l) && (x < r) && (y > t) && (y < b);				
}

// Safely evaluates JSON data so that it only contains data, not executable code
function safeEval(text) {
	var object = ( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')') );
	return object;
}

function trim(str){
	return str.replace(/^\s+|\s+$/g, '');
}

