function ping(url) {
	try {
		var xhr = new XHR();
		xhr.open("HEAD", url, false);
		xhr.send(null);
	} catch(ex) {
		// silently fail but still follow link
	}
	return true;
}

// this is a class
// this class has all the same methods and properties as the XMLHttpRequest object
// except that when this class calls the onreadystatechange function (event handler) is passes a reference to this object back to that function
// This is exceptionally useful for multiple http requests since you'll always know exactly which request fired the onreadystatechange function
// Works For Sure® in my Firefox and IE6

function XHR() {
	try {
		this.request = new XMLHttpRequest();
	} catch(ex) {
		try {
			this.request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(ex) {
			try {
				this.request = new ActiveXObject("Microsoft.XMLHTTP")
			} catch(ex) {
				return false
			}
		}
	}
// 	this.request = window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : null);
	
	this.abort = function() { return this.request.abort(); }
	this.getAllResponseHeaders = function() { return this.request.getAllResponseHeader(); }
	this.getResponseHeader = function(x) { return this.request.getResponseHeader(x); }
	this.open = function(w,x,y,z) { 
		if(y) { this.async = true; } else { this.async = false; }
		this.readyState = 1; return this.request.open(w,x,y,z); 
	}
	var onreadystatechange = function() { return false; }
	this.send = function(data) {
		if(this.onreadystatechange) {
			onreadystatechange = this.onreadystatechange;
			onreadystatechange._this = this;
			this.request.onreadystatechange = function() {
				var x = onreadystatechange._this;
				try {
					x.responseText = x.request.responseText;
					x.responseXML = x.request.responseXML;
					x.readyState = x.request.readyState;
					x.status = x.request.status;
					x.statusText = x.request.statusText;
				} catch(ex) {
				
				}
				onreadystatechange(x);
			};
		}		
		var result = this.request.send(data);
		if(this.async == false) {
			try {
				this.responseText = this.request.responseText;
				this.responseXML = this.request.responseXML;
				this.readyState = this.request.readyState;
				this.status = this.request.status;
				this.statusText = this.request.statusText;
			} catch(ex) {
			
			}
		}
		return result;
	}
	this.setRequestHeader = function(x, y) { return this.request.setRequestHeader(x, y); }
}