var HTTP = new Object();

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();
};

/* HTML form 을 입력으로 받아, post 형식으로 submit 한다. asynchronous 임.
 *
 * @param form : submit 할 form 엘리먼트
 * @param callback : 결과를 핸들링할 callback 함수(첫번째 인자로 responseText가 들어간다.)
 * 사용방법 :
 * <form name="testForm" action="test.jsp" method="post">
 *	......
 *	<input type="submit" onclick="HTTP.formSumbit(this.form, testCallback); return false;"/>
 * </form> 
 */
HTTP.formSubmit = function(form, callback) {
	var param = "";
	param = this.makeParam(form);
	var request = HTTP.newRequest();
	request.open('POST', form.action, true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.setRequestHeader("Content-length", param.length);
    request.setRequestHeader("Connection", "close");
    request.onreadystatechange = function() {
		if(request.readyState == 4 && request.status == 200) {
			callback(request.responseText);
			relocateFooter();
		}
	}
    request.send(param);
};

/* form 내부에 있는 필드들을 대상으로 parameter 문자열을 생성하여 return 한다. */
HTTP.makeParam=function(form) {
	var param = "";
	var fields = form.elements;
	for (var i=0; i<fields.length; i++) {
		if (fields[i].name == null || fields[i].name == "" ) continue;
		if ( (fields[i].type=="radio" || fields[i].type=="checkbox" )&& !fields[i].checked) continue;
		param += "&";
		param += fields[i].name;
		param += "=" + encodeURIComponent(fields[i].value);
	}
	return param;
};


HTTP.getText = function(url, param, callback){
	var request = HTTP.newRequest();
	request.onreadystatechange = function() {
		if(request.readyState == 4 && request.status == 200){
			callback(param, request.responseText);
		}
	}	
	request.open("GET", url);
	request.send(null);
};