// JavaScript Document
function HTTP() {
}
HTTP._factories = [
	function() { return new XMLHttpRequest(); },
	function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
	function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];
HTTP._factory = null;
HTTP.newRequest = function() {
	if (HTTP._factory != null) return HTTP._factory();
	for(var i = 0; i < HTTP._factories.length; i++) {
		try {
			var factory = HTTP._factories[i];
			var request = factory();
			if (request != null) {
				HTTP._factory = factory;
				return request;
			}
		}
		catch(e) {
			continue;
		}
	}
	HTTP._factory = function() {
		throw new Error("XMLHttpRequest not supported");
	}
	HTTP._factory();
};
HTTP.prototype.getText = function (url, callback) {
	var request = HTTP.newRequest();
	var responseValue;
	request.onreadystatechange = function() {
		if (request.readyState == 4 && request.status == 200) {
			callback(request.responseText);
		}
	}
	request.open("GET", url);
	request.send(null);
};
HTTP.prototype.post = function (url, values, callback) {
	var request = HTTP.newRequest();
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				callback(HTTP._getResponse(request));
			}
			else {
				callback(null);
			}
		}
	}
	request.open("POST", url);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send(HTTP.encodeFormData(values));
};
HTTP.encodeFormData = function(data) {
	var pairs = [];
	var regexp = /%20/g;
	for(var name in data) {
		var value = data[name].toString();
		var pair = encodeURIComponent(name).replace(regexp,"+") + '=' +
					encodeURIComponent(value).replace(regexp,"+");
		pairs.push(pair);
	}
	return pairs.join('&');
};
HTTP._getResponse = function(request) {
	switch(request.getResponseHeader("Content-Type")) {
		case "text/xml":
			return request.responseXML;
		case "text/json":
		case "text/javascript":
		case "application/javascript":
		case "application/x-javascript":
			return eval(request.responseText);
		default:
			return request.responseText;
	}
};

/**
 * Send an HTTP POST request to the specified URL, using the names and values
 * of the properties of the options.parameters object as the body of the request.
 * Parse the server's response according to its content type and pass
 * the resulting value to the callback function. If an HTTP error occurs,
 * call the specified options.errorHandler function, or pass null to the callback
 * if no error handler is specified.
 *
 * Added for Change Log #20071205-01.
 */
HTTP.post = function (url, callback, options) {
	var request = HTTP.newRequest();
	var n = 0;
	var timer;
	if (options.timeout) timer = setTimeout(function() { request.abort(); if (options.timeoutHandler) options.timeoutHandler(url); }, options.timeout);

	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (timer) clearTimeout(timer);
			if (request.status == 200) {
				callback(HTTP._getResponse(request));
			}
			else {
				if (options.errorHandler)	options.errorHandler(request.status, request.statusText);
				else						callback(null);
			}
		} else if (options.progressHandler) {
			options.progressHandler(++n);
		}
	}
	
	request.open("POST", url);
	// This header tells the server how to interpret the body of the request.
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	// Encode the properties of the options.parameters object and send them as the body of the request.
	request.send(HTTP.encodeFormData(options.parameters));
};
