function getRequestObject(responseFunction) {
	var request = null;

	try {
		request = new XMLHttpRequest();
		request.onreadystatechange = responseFunction;
		request.onload = responseFunction;
	} catch (trymicrosoft) {
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
			request.onreadystatechange = responseFunction;
		} catch (othermicrosoft) {
			try {
				request = new ActiveXObject("Microsoft.XMLHTTP");
				request.onreadystatechange = responseFunction;
			} catch (failed) {
				document.cookie = "ajax=false";
				request = null;
			}
		}
	}
	
	return request;
}

function sendRequest(requestObject, requestType, asynchronous, url, postData) {
	requestObject.open(requestType, url, asynchronous);
	if (requestType.toUpperCase() == "POST")
		requestObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	
	requestObject.send(postData);
}

function logError(exception, where) {
	if (document.createElement) {
		var url = "/services/?method=logError&error=" + escape_utf8(exception.message) + "&where=" + escape_utf8(where);
		var ifrm = document.createElement("iframe");
		ifrm.setAttribute("src", url);
		ifrm.style.display = "none";
		document.body.appendChild(ifrm);
	}
}

function escape_utf8(data) {
	if (data == "" || data == null)
		return "";
	
	data = data.toString();
	var buffer = "";
	for (var i = 0; i < data.length; i++) {
		var c = data.charCodeAt(i);
		var bs = new Array();

		if (c > 0x10000) {
			// 4 bytes
			bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18);
			bs[1] = 0x80 | ((c & 0x3F000) >>> 12);
			bs[2] = 0x80 | ((c & 0xFC0) >>> 6);
			bs[3] = 0x80 | (c & 0x3F);

		} else if (c > 0x800) {
			// 3 bytes
			bs[0] = 0xE0 | ((c & 0xF000) >>> 12);
			bs[1] = 0x80 | ((c & 0xFC0) >>> 6);
			bs[2] = 0x80 | (c & 0x3F);

		} else if (c > 0x80) {
			// 2 bytes
			bs[0] = 0xC0 | ((c & 0x7C0) >>> 6);
			bs[1] = 0x80 | (c & 0x3F);

		} else {
			// 1 byte
			bs[0] = c;
		}

		for (var j = 0; j < bs.length; j++) {
			var b = bs[j];
			var hex = nibble_to_hex((b & 0xF0) >>> 4) + nibble_to_hex(b & 0x0F);
			buffer += "%" + hex;
		}
	}

	return buffer;
}

function nibble_to_hex(nibble) {
	var chars = "0123456789ABCDEF";
	return chars.charAt(nibble);
}

