/**
 * @loadJson (JSON °øÅë ½ºÅ©¸³Æ®)
 * @version 1.0, 2008-06-03
 * @author Yoon Tae Hyun ( thrukill@hotmail.com )
*/
function loadJson() {
	var xmlHttp;
	var retStr;
	this.Result = getResult;
	this.mget = doRequestUsingGET;
	this.mpost = doRequestUsingPOST;

	function createXMLHttpRequest() {
		if (window.ActiveXObject) {
			xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
		} else if (window.XMLHttpRequest) {
			xmlHttp = new XMLHttpRequest();
		}
	}
	function handleStateChange() {
	    if(xmlHttp.readyState == 4) {
	        if(xmlHttp.status == 200) {
	        	try {
	        		retStr = xmlHttp.responseText;
	            } catch(e) {}
	        } else if (xmlHttp.status == 404) {
	        	alert('Àß ¸øµÈ ÆäÀÌÁö¸¦ È£ÃâÇÏ¿´½À´Ï´Ù.');
	        }
	    }
	}
	function hangleCheck(value) {
		return escape(value).replace(/\+/g, '%2B');
	}
	function doRequestUsingGET(vStr) {
	    createXMLHttpRequest();
	    xmlHttp.onreadystatechange = handleStateChange;
	    xmlHttp.open('GET', vStr, false);
	    xmlHttp.send(null);
	}
	function doRequestUsingPOST(vUrl, vStr) {
	    createXMLHttpRequest();
	    xmlHttp.open('POST', vUrl, false);
	    xmlHttp.onreadystatechange = handleStateChange;
	    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	    xmlHttp.send(vStr);
	}
	function getResult() {
		return retStr;
	}
}

/**
 * Ajax CallÀ» ÅëÇÑ Action Ã³¸®
 * »ç¿ë¹ý :
 * 		new Action(¼­ºñ½ºID, ºäID, ÇÔ¼ö¸í).copyParams(ÆûÀÌ¸§).run(°á°úfunction¿¡ ³Ñ°ÜÁÙ ÆÄ¶ó¹ÌÅÍµé<¼±ÅÃ ÀÔ·Â>);
 *      ¶Ç´Â
 *      var action = new Action(¼­ºñ½ºID, ºäID, ÇÔ¼ö¸í);
 *      action.copyParams(ÆûÀÌ¸§1);
 *      action.copyParams(ÆûÀÌ¸§2);
 *      action.addParam(Å°, °ª);
 *      action.run(°á°úfunction¿¡ ³Ñ°ÜÁÙ ÆÄ¶ó¹ÌÅÍµé<¼±ÅÃ ÀÔ·Â>);
 *  ¡Ø °á°úÇÔ¼öÀÇ ÆÄ¶ó¹ÌÅÍ
 *     Ã¹¹øÂ° parameter´Â responseText¸¦ JSon°´Ã¼È­½ÃÅ² Object°¡ ¿À¸ç,
 *     µÎ¹øÂ° ÀÌÈÄ´Â runÈ£Ãâ½Ã ´øÁø ÆÄ¶ó¹ÌÅÍ°¡ ¼ø¼­´ë·Î ¿À°Ô µÈ´Ù.
 *
 * @param aServiceId ¼­ºñ½ºID(ÇÊ¼ö ÀÔ·Â)
 * @param aViewId    ºäID(ÇÊ¼ö ÀÔ·Â)
 * @param aFuncName  Ajax½ÇÇàÈÄ È£ÃâµÇ´Â ÇÔ¼ö¸í(ÇÊ¼ö ÀÔ·Â)
 * @param aEncrypt   INIPlugin ¾ÏÈ£È­ ¿©ºÎ(true/false, Default true, ¼±ÅÃ ÀÔ·Â)
 */
function Action(aServiceId, aViewId, aFuncName, aEncrypt) {
	var actionUrl = "/wire.do";
	var serviceId = aServiceId == null ? "" : aServiceId;
	var viewId    = aViewId    == null ? "" : aViewId;
	var funcName  = aFuncName  == null ? "" : aFuncName;
	var bEncrypt  = aEncrypt   == null ? true : aEncrypt;
	var resultArgs = new Array();
	var paramForm  = null;
	var encForm    = null;
	var xmlRequest = false;
	var resultType = "0"; // 0:JSon°´Ã¼, 1:responseText
	
	this.getRequest = function() {
		try {
			xmlRequest = new XMLHttpRequest();
		} catch (microsoft) {
			try {
				xmlRequest = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (othermicrosoft) {
				try {
					xmlRequest = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (failed) {
					return false;
				}
			}
		}

		return xmlRequest;
	};
	
	this.createParamForm = function() {
		// IE9 ´ëºñ ¹®±¸ ¼öÁ¤(IE9¿¡¼­´Â document.createElement½Ã ¼Ó¼º±îÁö ¹®ÀåÀ¸·Î Ã³¸®ÇÏ´Â °ÍÀÌ ¾ÊµÊ)
		try {
			paramForm = document.createElement("<form name=__PARAMFORM__></form>");
		} catch (e) {
			paramForm = document.createElement("form");
			paramForm.setAttribute("name", "__PARAMFORM__");
		}
		document.body.appendChild(paramForm);
	};
	
	this.createEncForm = function() {
		// IE9 ´ëºñ ¹®±¸ ¼öÁ¤(IE9¿¡¼­´Â document.createElement½Ã ¼Ó¼º±îÁö ¹®ÀåÀ¸·Î Ã³¸®ÇÏ´Â °ÍÀÌ ¾ÊµÊ)
		try {
			encForm   = document.createElement("<form name=__ENCFORM__></form>");
		} catch (e) {
			encForm = document.createElement("form");
			encForm.setAttribute("name", "__ENCFORM__");
		}
		// IE9 ´ëºñ ¹®±¸ ¼öÁ¤(IE9¿¡¼­´Â document.createElement½Ã ¼Ó¼º±îÁö ¹®ÀåÀ¸·Î Ã³¸®ÇÏ´Â °ÍÀÌ ¾ÊµÊ)
		var INIpluginData = null;
		try {
			INIpluginData = document.createElement("<input type=hidden name=INIpluginData>");
		} catch (e) {
			INIpluginData = document.createElement("input");
			INIpluginData.setAttribute("type", "hidden");
			INIpluginData.setAttribute("name", "INIpluginData");
		}
		encForm.appendChild(INIpluginData);
		document.body.appendChild(encForm);
	};
	
	this.addParam = function(key, value) {
		if (!paramForm) this.createParamForm();
		// IE9 ´ëºñ ¹®±¸ ¼öÁ¤(IE9¿¡¼­´Â document.createElement½Ã ¼Ó¼º±îÁö ¹®ÀåÀ¸·Î Ã³¸®ÇÏ´Â °ÍÀÌ ¾ÊµÊ)
		var hiddenInput = null;
		try {
			hiddenInput = document.createElement("<input type=hidden name='" + key + "' value='" + value + "'>");
		} catch (e) {
			hiddenInput = document.createElement("input");
			hiddenInput.setAttribute("type", "hidden");
			hiddenInput.setAttribute("name", key);
			hiddenInput.setAttribute("value", value);
		}
		paramForm.appendChild(hiddenInput);
	};
	
	this.setActionUrl = function(aActionUrl) {
		actionUrl = aActionUrl;
	};
	
	this.setFuncName = function(aFuncName) {
		funcName = aFuncName;
	};
	
	this.setResultType = function(aType) {
		resultType = aType;
	};
	
	this.destroyForm = function() {
		if (paramForm != null) document.body.removeChild(paramForm);
		if (encForm != null) document.body.removeChild(encForm);
	};
	
	this.copyParams = function(oForm) {
		if (oForm.tagName.toUpperCase() == "FORM") {
			var objInputs = oForm.getElementsByTagName("input");
			
			for(var i = 0; i < objInputs.length; i++) {
				var obj = objInputs[i];
				switch (obj.type.toUpperCase()) {
				    case "HIDDEN" :
				    case "TEXT" :
				    	this.addParam(obj.name, obj.value);
				    	break;
				    case "RADIO" :
                        if (obj.checked == true) {
                            this.addParam(obj.name, obj.value);
                        }
				    	break;
				    default :
				    	break;
				}
			}
			
			var objSelects = oForm.getElementsByTagName("select");
			
			for(var i = 0; i < objSelects.length; i++) {
				var obj = objSelects[i];
				if (obj.length > 0) {
					this.addParam(obj.name, obj.options[obj.options.selectedIndex].value);
				}
			}
			
			var objTextareas = oForm.getElementsByTagName("textarea");
			
			for(var i = 0; i < objTextareas.length; i++) {
				this.addParam(objTextareas[k].name, objTextareas[k].value);
			}
		} else {
			alert("FORM °´Ã¼¸íÀ» ³Ö¾îÁÖ¼¼¿ä.");
		}
	};
	
	this.debug = function() {
		var parameters = "";
		var objInputs = paramForm.getElementsByTagName("INPUT");
		for (var i = 0; i < objInputs.length; i++) {
			parameters += "\n\t" + objInputs[i].name + "=" + objInputs[i].value;
		}
		alert("Ajax Call Debugging Á¤º¸\n"
		    + "=============================================\n"
		    + "1. serviceId : " + serviceId + "\n"
		    + "2. viewId : " + viewId + "\n"
		    + "3. parameters : " + parameters + "\n"
		    + "4. ÇÔ¼ö¸í : " + funcName);
	};
	
	this.run = function() {
		if (serviceId == "") {
			alert("serviceId°¡ ¾ø½À´Ï´Ù.");
			return;
		}
		
		if (viewId == "") {
			alert("viewId°¡ ¾ø½À´Ï´Ù.");
			return;
		}
		
		if (!this.getRequest()) {
			alert("XMLHttpRequest°´Ã¼¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.");
			return;
		}
	    xmlRequest.open('POST', actionUrl, false);
	    xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	    xmlRequest.onreadystatechange = this.callFunc;
	    
	    if (arguments.length > 0) {
		    for(var i = 0; i < arguments.length; i++) {
		    	resultArgs[i+1] = arguments[i];
		    }
	    }
		
		var PARAMS = "serviceId=" + serviceId + "&viewId=" + viewId;
		
		if (bEncrypt) {
			if (encForm == null) this.createEncForm();
			
			if (EncForm2(paramForm, encForm)) {
				PARAMS += "&INIpluginData=" + escape(encForm.INIpluginData.value);
				
			    xmlRequest.send(PARAMS);
			} else {
				alert('º¸¾È»ó ¹®Á¦°¡ »ý°Ü Àü¼ÛÀÌ Ãë¼Ò µÇ¾ú½À´Ï´Ù.');
			}
		} else {
			var parameters = "";
			var objInputs = paramForm.getElementsByTagName("INPUT");
			for (var i = 0; i < objInputs.length; i++) {
				parameters += "&" + objInputs[i].name + "=" + escape(objInputs[i].value);
			}
			xmlRequest.send(PARAMS + parameters);
		}
		
		this.destroyForm();
	};
	
	this.callFunc = function() {
	    if (xmlRequest.readyState == 4) {
	        if (xmlRequest.status == 200) {
	        	try {
	        		var result = xmlRequest.responseText;//alert(result);
	        		
	        		var start = result.indexOf("{'");
	        		if ( start < 0 ) start = result.indexOf("{\"");
	        		var retStr = result.substring(start, result.lastIndexOf("}")+1);
	        		
	        		if (retStr) {
	        			retStr = eval("(" + retStr + ")");
	        			
	        			if (retStr.ERROR.ERR != "0") {
	        				alert(retStr.ERROR.ERRMSG + "(" + retStr.ERROR.ERR + ")");
	        				return;
	        			}
	        		}
        			
	        		if (resultType == "0") {
		        		result = retStr;
	        		}
					
	    			resultArgs[0] = result;
    				window[funcName].apply(this, resultArgs);
				} catch (error) {
					alert(error);
					alert("ÁË¼ÛÇÕ´Ï´Ù. ½Ã½ºÅÛ Á¡°ËÁßÀÔ´Ï´Ù.\nÀá½Ã ÈÄ ´Ù½Ã ÀÌ¿ëÇØ ÁÖ½Ã±â ¹Ù¶ø´Ï´Ù.");
	            }
	        } else if (xmlRequest.status == 404) {
	        	alert('Àß¸øµÈ ÆäÀÌÁö¸¦ È£ÃâÇÏ¿´½À´Ï´Ù.');
	        } else {
	        	alert(xmlRequest.statusText);
	        }
	    }
	};
}
