/** 
* Author    : MC 심새 (ganer9r@naver.com) 
* Make Date : 2006-09-22 
* comment   : ajax의 xml을 javascript 객체형식으로 자동 변환 
**/ 


/* Ajax 사용을 위한 기본 콤포넌트 Start */ 
function AjaxDataControl(){ 
	this.xmlHttp           = null; 

	this.getHttpRequest    = function(URL, object)
	{ 
		var xmlHttp        = this.xmlHttp; 
		var xmlData        = null; 
		// FF일 경우 window.XMLHttpRequest 객체가 존재한다. 
		if(!xmlHttp) { 
			if(window.XMLHttpRequest) { 
				xmlHttp    = new XMLHttpRequest(); 
			} else { 
				xmlHttp    = new ActiveXObject("Microsoft.XMLHTTP"); 
			} 
			this.xmlHttp   = xmlHttp; 
		} 

		if (object.queryString)		// queryString값이 존재하면 POST방식
		{
			xmlHttp.open('POST', URL, true); 
//			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=euc-kr"); 
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
			xmlHttp.send(object.queryString); 
		}
		else
		{
			xmlHttp.open('GET', URL, true); 
			xmlHttp.send(''); 
		}

		xmlHttp.onreadystatechange = function() 
		{ 
			// readyState 가 4 고 status 가 200 일 경우 올바르게 가져옴 
			if(xmlHttp.readyState==4 && xmlHttp.status == 200 && xmlHttp.statusText=='OK') { 
				if (object.responseMode==0)
					var xmlData        = xmlHttp.responseXML; 
				else
					var xmlData        = xmlHttp.responseText;

				object.setXmlData(xmlData); 
			} 
		} 
	} 

	this.getXmlRootNode = function(nodes, rootName)
	{ 
		var rootNode    = nodes.getElementsByTagName(rootName); 
		return rootNode; 
	} 
} 
/* Ajax 사용을 위한 기본 콤포넌트 End */ 


/* Ajax에서 리턴받은 XML NODE를 JAVASCRIPT OBJECT 형식으로 변환 Start */ 
function AjaxObject(){ 
	this.ac              = null; 
	this.xmlData         = null; 
	this.rootName        = null; 
	this.functionName    = null; 
	this.responseMode    = null; 
	this.queryString     = null; 

	this.inArray         = function(array, value)
	{ 
		var result       = false; 

		for(var i=0; i < array.length; i++){ 
			if(array[i] == value){ 
				result   = true; 
				break; 
			} 
		} 

		return result; 
	} 

	this.getHttpRequest      = function(Url, functionName, responseMode, queryString)
	{ 

		if (! functionName)	// 콜백함수가 없으면 동기식 호출
		{
			if(window.XMLHttpRequest) { 
				var xmlHttp    = new XMLHttpRequest(); 
			} else { 
				var xmlHttp    = new ActiveXObject("Microsoft.XMLHTTP"); 
			} 

            if (queryString) // queryString값이 존재하면 POST방식
            {
                xmlHttp.open('POST', Url, false); 
                xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
                xmlHttp.send(queryString); 
            }
            else 
            {
                xmlHttp.open('GET', Url, false);	// 동기식 false
                xmlHttp.send(''); 
            }

			if(xmlHttp.status == 200)
				return xmlHttp.responseText;	// 동기식은 리턴 후 종료됨
		}
		
		this.responseMode	 = responseMode;
		this.queryString	 = queryString;
		if(this.ac == null){ 
			this.ac          = new AjaxDataControl(); 
		} 
		this.functionName    = functionName; 
		this.ac.getHttpRequest(Url, this); 
	} 

	this.setMakeObject       = function(nodeData)
	{ 
		var resultObject     = new Object; 
		resultObject.length  = 0; 

		if(nodeData.hasChildNodes() ){ 
			var nodeChilds   = nodeData.childNodes; 
			var nodeNameList = new Array(); 
			var isNodeChilds = false; 

			for(var i = 0; i<nodeChilds.length;i++){ 

				if(nodeChilds[i].nodeType == '1'){ 

					var returnObj    = this.setMakeObject(nodeChilds[i] ); 

					if( typeof(returnObj) == "string"){ 
						resultObject[ nodeChilds[i].nodeName ]     = this.setMakeObject(nodeChilds[i] ); 
						resultObject.length    += 1; 
					}else{ 

						if(resultObject[ nodeChilds[i].nodeName ]){ 
							resultObject[ nodeChilds[i].nodeName ].push( returnObj ); 
						}else{ 
							resultObject[ nodeChilds[i].nodeName ] = new Array(); 
							resultObject[ nodeChilds[i].nodeName ].push( returnObj ); 

							resultObject.length    += 1; 
						} 
					} 
					isNodeChilds    = true; 

				} 
			} 

			if(!isNodeChilds){ 
				resultObject    = nodeChilds[0].nodeValue; 
			}else{ 

			} 
		} 

		return resultObject; 
	} 

	this.setMakeControl     = function()
	{ 
		if(this.xmlData != null){ 
			var rootNode    = this.ac.getXmlRootNode(this.xmlData, this.rootName); 
			var list        = this.setMakeObject(rootNode[0]); 
			eval( this.functionName+"(list)" ); 
		} 
	} 

	this.setXmlData         = function(data)
	{ 
		if (this.responseMode==0)
		{
			this.xmlData        = data; 
			this.rootName       = data.documentElement.nodeName; 
			this.setMakeControl(); 
		}
		else if (this.responseMode==1)
		{
			var arr = new Array();
			list = data.split("|");
			for (i=0;i<list.length;i++)
			{
				couple = list[i].split("=");
				arr[couple[0]] = couple[1];
			}
			eval( this.functionName+"(arr)" ); 
		}
		else
		{
			list = data.split("|");
			eval( this.functionName+"(list)" ); 
		}
	} 

} 
/* Ajax에서 리턴받은 XML NODE를 JAVASCRIPT OBJECT 형식으로 변환 End */ 


// 폼의 모든 요소명과 값을 쿼리스트링 문자열로 반환
function setQueryString(frm){
	var queryString = "ajax=Y";
	for(var i = 0; i < frm.elements.length; i++) 
	{
		if (frm.elements[i].type!="button") 
		{
			if (frm.elements[i].type=="checkbox") 
			{
				if (frm.elements[i].checked)
					queryString += "&" + frm.elements[i].name + "=" + escape(frm.elements[i].value);
				else
					queryString += "&" + frm.elements[i].name + "=";
			}
			else if (frm.elements[i].type=="radio") 
			{
				if (frm.elements[i].checked)
					queryString += "&" + frm.elements[i].name + "=" + escape(frm.elements[i].value);
			}
			else
			{
				queryString += "&" + frm.elements[i].name + "=" + escape(frm.elements[i].value);
			}
		}
	}
	return queryString;
}

/****************************	사용법 Start
/// ajaxTest.asp
	<SCRIPT LANGUAGE="JavaScript" src="/include/js/ajax.js"></SCRIPT>
	<SCRIPT LANGUAGE="JavaScript">
	function setFunction() {			// 필요시 적절하게 파라미터 추가
		var xml_url		= "xml.asp";
		var aObj	= new AjaxObject;						// Ajax오브젝트t 선언 
		aObj.getHttpRequest(xml_url, "putFunction");		// 참조 Url, 리턴 함수명, 0이면 XML형식 그 외 경우는 Text,

	//	var queryString = setQueryString(document.forms[0]);
	//	var queryString = "name="+escape('홍길동');
	//	aObj.getHttpRequest(xml_url, "putFunction", null, queryString);	// queryString 파라미터가 있으면 POST방식
	}	

	function putFunction(data) {			//리턴 함수에는 obj를 받을 인자 필수!!! 
		ret = data['item'][0]['name'];		// responseMode = 0 : 2차원 배열 XML
		ret = data.name;					// responseMode = 1 : 1차원 배열 속성명, data.name, data['name']
		ret = data;							// responseMode = null or 생략시 : data, data[0-9]
	}
	</SCRIPT>
	<input type="button" value=" Ajax 클릭!! " onClick="setFunction();">

/// xmlReturn.asp
	<%
	Response.CharSet = "euc-kr" 
	Response.AddHeader "Pragma","no-cache"
	Response.AddHeader "Expires","0"

	Response.AddHeader "Content-type", "text/xml"					' Text이면 주석처리
	Response.Write "<?xml version=""1.0"" encoding=""EUC-KR"" ?>"	' Text이면 주석처리

	Response.Write return_value		' XML이면 아래 <root> 형식
									' Text이면 분리자,  1 : name=홍길동|gender=남|....  null or 생략시 : OK or 홍길동|남|....
	%>
	<root> 
		<item> 
			<name>홍길동</name> 
			<mail>hong@test.com</mail> 
		</item> 
		<item> 
			<name>고길동</name> 
			<mail>go@test.com</mail> 
		</item> 
	</root> 

	이런 XML이 있는 경우 변환되서 리턴받는 Object는 아래와 같은 형식을 하고 있습니다. 
	data['item'][0]['name'] = '홍길동'; 
	data['item'][0]['mail'] = 'hong@test.com';; 
	data['item'][1]['name'] = '홍길동'; 
	data['item'][1]['mail'] = 'go@test.com';; 

	루트 노드는 자동생략합니다. 
	맨 마지막 노드를 제외하고는 배열정보가 항상 들어갑니다. 
********************************************************************************/
