var divName = 'mydiv'; // div that is to follow the mouse
var offX = 15;         // X offset from mouse position
var offY = 15;         // Y offset from mouse position
var viewState = "hidden";
var mo_cache = new Array();

function dbg(text) {
    document.getElementById("dbg").innerHTML+=text+"<br/>";
}
 
function makeRequest(url) {
    try {

	var url_parts = url.split("=");
	var cache_url = unescape(url_parts[url_parts.length-1]);

	// See if has already been cached
	if(mo_cache[cache_url]) {
	    showText(mo_cache[cache_url]);
	    return;
	}
	
	var http_request = false;
	
	viewState = "pending";

	if (window.XMLHttpRequest) { // Mozilla, Safari,...
	    http_request = new XMLHttpRequest();
	    if (http_request.overrideMimeType) {
		http_request.overrideMimeType('text/xml');
		// See note below about this line
	    }
	} else if (window.ActiveXObject) { // IE
	    try {
		http_request = new ActiveXObject("Msxml2.XMLHTTP");
	    } catch (e) {
		try {
		    http_request = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {}
	    }
	}
	
	if (!http_request) {
	    alert('Giving up :( Cannot create an XMLHTTP instance');
	    return false;
	}
	http_request.onreadystatechange = function() { alertContents(http_request); };
	http_request.open('GET', url, true);
	http_request.send(null);
    } catch(e) {
	//	alert("makeRequest: "+e);
    }
}

function alertContents(http_request) {
    try {
	if (http_request.readyState == 4) {
	    if (http_request.status == 200) {
		if(http_request.responseText != "") {
		    if(viewState == "pending") {
			var response_parts = http_request.responseText.split(":::");
			mo_cache[response_parts[0]] = response_parts[1];
			showText(response_parts[1]);
		    }
		}
	    } else {
	    alert('There was a problem with the request.');
	    }
	}
    } catch(e) { 
	//	alert("alertContents: "+e);
    }
}

function showText(text) {
    var obj = document.getElementById(divName);
    if (!obj) {
	return;
    }
    obj.style.visibility = 'visible';
    obj.innerHTML = text;
    obj.width = "300px";
}

function hideText() {
    viewState = "hidden";
    var obj = document.getElementById(divName);
    if (!obj) {
	return;
    }
    obj.width = "0px";
    obj.style.visibility = 'hidden';
    
}

// no changes required below this line
function mouseX(evt) {
    try {
	if (!evt) evt = window.event;
	if (evt.pageX) return evt.pageX;
	else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft);
	else return 0;
    } catch(e) {
	//	alert("MouseX: "+e);
    }
}
function mouseY(evt) {
    try {
	if (!evt) {
	    evt = window.event;
	}
	
	if (evt.pageY) {
	    return evt.pageY;
	} else if (evt.clientY) {
	    return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	} else {
	    return 0;
	}
    }  catch(e) {
	//	alert("MouseY: "+e);
    }
}    

function follow(evt) {
    try {
	if (document.getElementById) {
	    var obj = document.getElementById(divName);
	    if (!obj) {
		return;
	    }
	    obj.style.left = parseInt(mouseX(evt))+offX + 'px';
	    obj.style.top = parseInt(mouseY(evt))+offY + 'px';
	}
    } catch(e) {
	//	alert("Follow Error: "+e);
    }
}

document.onmousemove = follow;
