/*------------------------------------------------------------------------------
 * 1. 파일명: ajax.utf8.js
 * 2. 설  명: AJAX를 이용한 처리와 관련된 함수를 정의한다.
 * 3. 의존성:
 * 4. 작성일: 2006.12.15.
 -----------------------------------------------------------------------------*/



/**
 * XMLHttpRequest를 통해 처리를 요청한다.
 * 처리는 sync. 하게 일어나도록 한다.
 */
function send(url) {
	var res = null;

	/* XMLHttpRequest를 얻는다. */
	var xmlHttp = getXMLHttpRequest();

	if ( xmlHttp != null ) {
		/* URI 부분과 파라미터 부분을 분리한다. */
		var index = url.indexOf("?");

		var data = "";
		if ( index > -1 ) {
			data = url.substring(index + 1);
			url = url.substring(0, index);
		}

		xmlHttp.open("POST", url, false); // 동기로 호출.

		/* POST로 정보를 보내기 전에 Content-Type 값을 설정한다. */
		var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
		xmlHttp.setRequestHeader("Content-Type", contentType);

		xmlHttp.send(data);


		res = eval("(" + xmlHttp.responseText + ")");
	}

	/* 사용한 XMLHttpRequest를 돌려준다. */
	returnXMLHttpRequest(xmlHttp);

	return res;
}


/**
 * XMLHttpRequest를 이용하여 POST 방식으로 처리를 요청한다.
 * 처리는 sync. 하게 일어난다.
 */
function sendForm(form) {
	var res = null;

	var url = form.action;
	var xmlHttp = getXMLHttpRequest();

	if ( xmlHttp != null ) {
		xmlHttp.open("POST", url, false); // 동기로 호출.

		/* POST로 정보를 보내기 전에 Content-Type 값을 설정한다. */
		var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
		xmlHttp.setRequestHeader("Content-Type", contentType);

		/* POST로 보낼 데이타를 생성한다. */
		var postData = makePostData(form);

		xmlHttp.send(postData);

		res = eval("(" + xmlHttp.responseText + ")");
	}

	/* 사용한 XMLHttpRequest를 돌려준다. */
	returnXMLHttpRequest(xmlHttp);

	return res;
}


/**
 * 주어진 Form에 있는 정보를 POST 로 실어 보낼
 * 자료 형식으로 만들어 돌려 준다.
 */
function makePostData(form) {
	var data = "";

	var length = form.elements.length;
	for ( var i = 0; i < length; i++ ) {
		if ( i > 0 ) data += "&";

		var elem = form.elements[i];

		/* Disabled 된 항목은 보내지 않는다. */
		if ( elem.disabled ) continue;

		/* 자료형태가 radio나 checkbox인 경우는 check된 항목의 값만 보낸다.
		   value 항목이 정의되어 있지 않으면 true를 보낸다. */
		if ( ( elem.type == "radio" || elem.type == "checkbox" )
				&& elem.checked ) {
			data += elem.name + "=" + ( isEmpty(elem.value) ? "true" : encodeURIComponent(elem.value) );
		}
		else {
			/* type이 text나 select-single 인 경우. select-multi 인 경우는 일단 고려 안 한다. */
			data += elem.name + "=" + encodeURIComponent(elem.value);
		}
	}

	return data;
}


/**
 * XMLHttpRequest 객체를 돌려 준다.
 * 이미 생성되어 사용중이지 않은 게 있으면 이를 주고
 * 사용중이 아닌 게 없으면 만들어 돌려 준다.
 */
var httpReqStack = new Array();

function getXMLHttpRequest() {
	var httpReq = null;

	if ( httpReqStack.length > 0 ) {
		httpReq = httpReqStack.pop();
	}
	else {
		httpReq = newXMLHttpRequest();
	}

	return httpReq;
}


/**
 * 이미 사용한 XMLHttpRequest를 돌려받는다.
 */
function returnXMLHttpRequest(httpReq) {
	httpReqStack.push(httpReq);
}


/**
 * 브라우저의 종류에 맞게 XMLHttpRequest 객체를 생성하여
 * 돌려 준다.
 */
function newXMLHttpRequest() {
	var reqHttp;

	if ( window.ActiveXObject ) { // IE
		try {
			reqHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				reqHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e1) {
				reqHttp = null;
			}
		}
	}
	else if ( window.XMLHttpRequest ) { // IE 이외
		try {
			reqHttp = new XMLHttpRequest();
		}
		catch (e) {
		}
	}

	if ( reqHttp == null ) {
		alert("XMLHttpRequest 객체를 생성하는데 실패하였습니다.");
	}

	return reqHttp;
}


function deleteAllRow(obj) {
	var childCount = obj.childNodes.length;

	for ( var i = (childCount - 1); i >= 0; i-- ) {
		obj.deleteRow(i);
	}
}

function makeTableRow(dataArray) {
	var rowObj = document.createElement("tr");

	for ( var i = 0; i < dataArray.length; i++ ) {
		var dataObj = document.createElement("td");

		dataObj.innerHTML = dataArray[i];

		rowObj.appendChild(dataObj);
	}

	return rowObj;
}
