/*
 * Ajax.js - XML/Data HTTP Post script
 *
 * Copyright (c) Sangah Management Consulting / Solution SI Team. Since 2006
 * All rights reserved by SAPP (Struts Architectures' Progressive Package) Solution.
 * All source codes are ONLY for "SAPP Solution".
 *
 * Created by mornya, 2007.11.09
 * Modified by mornya, 2008.01.25 (UTF-8 encode)
 * Modified by mornya, 2008.03.03 (refactoring)
 * Modified by mornya, 2008.07.20 (update)
 */

Ajax = function() {}

/*
 * Internal Function: Create socket send object
 */
Ajax.prototype.getConnection = function ()
{
	var xmlHttpRequest = null;

	if (window.ActiveXObject) {
		// Microsoft Internet Explorer
		xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else {
		// Etc Browser
		xmlHttpRequest = new XMLHttpRequest();
		xmlHttpRequest.overrideMimeType("text/xml");
	}

	return xmlHttpRequest;
}

/*
 * Internal Function: Encode URI component
 */
Ajax.prototype.escape = function (paramValue)
{
	return encodeURIComponent(paramValue);
}

/*
 * send query as post: Execute this function before send ajax request
 * ex) ajax.query(document.forms[0]);
 */
Ajax.prototype.query = function (docForm)
{
	var submitString = "";
	var formElement = "";
	var lastElementName = "";

	for (var i=0; i<docForm.elements.length; i++) {
		formElement = docForm.elements[i];
		switch (formElement.type) {
			case "text":
			case "select-one":
			case "hidden":
			case "password":
			case "textarea":
				submitString += formElement.name + "=" + this.escape(formElement.value) + "&";
				break;
			case "radio":
				if (formElement.checked == true) {
					submitString += formElement.name + "=" + this.escape(formElement.value) + "&";
				}
				break;
			case "checkbox":
				if (formElement.checked == true) {
					if (formElement.name == lastElementName) {
						if (submitString.lastIndexOf("&") == submitString.length-1) {
							submitString = submitString.substring(0, submitString.length - 1);
						}
						submitString += "," + this.escape(formElement.value);
				 	}
				 	else {
						submitString += formElement.name + "=" + this.escape(formElement.value);
				 	}
				 	submitString += "&";
					lastElementName = formElement.name;
				}
				break;
			default: break;
		}
	}
	submitString = submitString.substring(0, submitString.length - 1);
	//document.all("result").value = submitString;
	return submitString;
}

/*
 * Send Ajax Request.
 * Requests by alternative type(parameter or form-submit) as needed.
 * Function created: mornya, 2008.07.22
 *
 * ajax = new Ajax();
 *
 * ex1) ajax.request("/DoSomething.action", ajax.QueryForm(document.forms[0]), "cmdDoSomeThingResult");
 *      - send as form-submit type
 * ex2) ajax.request("/DoSomething.action?form.type=X", null, "cmdDoSomethingResult");
 *      - send as parameter type
 */
Ajax.prototype.request = function (actionUrl, submitParameter, resultFunction)
{
	try {
		var xmlHttpRequest = this.getConnection();

		if (xmlHttpRequest != null) {
			xmlHttpRequest.open("POST", actionUrl, true); // always post method type
			xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			xmlHttpRequest.onreadystatechange = function()
			{
				if (xmlHttpRequest.readyState == 4) {
					switch (xmlHttpRequest.status) {
						case 404:
							alert("[XMLHttp Error]\n\n\"" + actionUrl + "\"이 존재하지 않습니다.\n관리자에게 문의하시기 바랍니다.");
							break;
						case 500:
							document.write(xmlHttpRequest.responseText);
							alert("[XMLHttp Error]\n\n서버측 응답 오류로 인해 실행이 중지되었습니다.\n관리자에게 문의하시기 바랍니다.");
							break;
						case 200:
							// Success
							if ((resultFunction != null) && (resultFunction != "")) {
								try {
									eval(resultFunction + "(xmlHttpRequest.responseText);");
								}
								catch (e) {
									alert(
										"[XMLHttp Error]\n\n"+
										"결과를 처리할 함수("+resultFunction+")가 존재하지 않거나,\n"+
										"함수 내에 잘못된 결과가 실행되었습니다.\n"+
										"관리자에게 문의하시기 바랍니다.\n\n"+
										"- 오류내용: " + e.message
									);
								}
							}
							break;
						default:
							alert("[XMLHttp Error]\n\n"+xmlHttpRequest.status+" 오류가 발생했습니다.\n\n"+xmlHttpRequest.responseText);
							break;
					}
				}
			}
			xmlHttpRequest.send(submitParameter);
		}
	}
	catch (e) {
		alert("[XMLHttp Error]\n\n"+e.description);
	}
}

