/**
 * XML µ¥ÀÌÅÍ Ã³¸®¸¦ ´ã´çÇÏ´Â ÀÚ¹Ù½ºÅ©¸³Æ® °´Ã¼ <BR>
 * browser¿¡ Æ÷ÇÔµÈ Microsoft.XMLDOM activeX ¸¦ ÀÌ¿ëÇÑ´Ù. <BR>
 * ÂüÁ¶ URL : http://mie.paichai.ac.kr/users/Frog0214/workshop/xml/xmldom/xmlguide/dom-guide-document.htm
 *
 */
function XMLUtil() {
	/** XMLDocument °´Ã¼ */
	
	if (window.ActiveXObject) {   
        this.im_oXMLDoc = new ActiveXObject("Microsoft.XMLDOM");   
    } else if (document.implementation && document.implementation.createDocument) {   
        this.im_oXMLDoc = document.implementation.createDocument("","",null);   
    }   

	//this.im_oXMLDoc = new ActiveXObject("Microsoft.XMLDOM");
	this.im_oXMLDoc.async = false;
	this.im_oXMLDoc.validateOnParse = false;
	this.im_oXMLDoc.preserveWhiteSpace = true;

	/** XMLDocument ÀÇ RootNode Element */
	this.im_oRootElement = null;
	
	/** °´Ã¼ÀÇ method */
	this.getXMLDoc 		= getXMLDoc_XMLUtil;
	this.loadXML 		= loadXML_XMLUtil;
	this.loadUrl 		= loadUrl_XMLUtil;
	this.getRoot 		= getRoot_XMLUtil;
	this.findNode 		= findNode_XMLUtil;
	this.getChildNode	= getChildNode_XMLUtil;
	this.setText 		= setText_XMLUtil;
	this.getText 		= getText_XMLUtil;
	this.setAttribute	= setAttribute_XMLUtil;
	this.getAttribute	= getAttribute_XMLUtil;
	this.getXML			= getXML_XMLUtil;
	this.getUserObject	= getUserObject_XMLUtil;
} 


/**
 * XMLDocument °´Ã¼¸¦ ¹ÝÈ¯ÇÑ´Ù.
 *@return	XMLDocument °´Ã¼
 */
function getXMLDoc_XMLUtil(){
	return this.im_oXMLDoc;
}

/**
 * XML ¹®ÀÚ¿­À» ·ÎµåÇÑ´Ù.
 *@param	pm_sXMLString	XML ¹®ÀÚ¿­
 */
function loadXML_XMLUtil(pm_sXMLString){
	this.im_oXMLDoc.loadXML(pm_sXMLString);
	this.im_oRootElement = this.im_oXMLDoc.documentElement;
}

/**
 * Æ¯Á¤ Url ·ÎºÎÅÍ XML ¹®ÀÚ¿­À» ·ÎµåÇÑ´Ù.
 *@param	pm_sXMLUrl	XML URL
 */
function loadUrl_XMLUtil(pm_sXMLUrl){
	this.im_oXMLDoc.load(pm_sXMLUrl);
	if(this.im_oXMLDoc.readyState == 4){
		this.im_oRootElement = this.im_oXMLDoc.documentElement;
	}
}

/**
 * RootNode Element¸¦ ¹ÝÈ¯ÇÑ´Ù.
 *@return	RootNode Element °´Ã¼
 */
function getRoot_XMLUtil(){
	return this.im_oRootElement;
}

/**
 * RootNode ElementÀÇ XML Á¤º¸¸¦ ±¸ÇÑ´Ù.
 *@return	ÀüÃ¼ XMLÀÇ ¹®ÀÚ¿­
 */
function getXML_XMLUtil(){
	return this.im_oRootElement.xml;
}

/** 
 * ·çÆ®³ëµå¸¦ ±âÁØÀ¸·Î Æ¯Á¤ Å° Á¶°ÇÀ» ¸¸Á·ÇÏ´Â Node¸¦ ¹ÝÈ¯ÇÑ´Ù. 
 * @param	pm_sKey ´Â ·çÆ®³ëµå·ÎºÎÅÍ elementÀÇ ÀÌ¸§À» "." ·Î ±¸ºÐÇÑ °ªÀÌ´Ù.
 * @param	pm_sAttri 		attributeÀÇ ÀÌ¸§ (¾øÀ¸¸é null)
 * @param	pm_sAttriValue 	attributeÀÇ °ª (¾øÀ¸¸é null)
 * @return	Á¶°ÇÀ» ¸¸Á·ÇÏ´Â Element Node °´Ã¼
 */
function findNode_XMLUtil(pm_sKey, pm_sAttri, pm_sAttriValue) {
	var lm_sNodeNames = pm_sKey.split(".");
	if(lm_sNodeNames.length == 1 && lm_sNodeNames[0] == this.im_oRootElement.nodeName) return this.im_oRootElement;
	
	var lm_oParentElement = this.im_oRootElement;
	var lm_oChildArray = null;
	for(var i=1; i < lm_sNodeNames.length; i++) {
		if(lm_oParentElement.length == null) {
			lm_oChildArray = getChildNode_XMLUtil(lm_oParentElement, lm_sNodeNames[i]);
		} else {
			lm_oChildArray = getChildNodes_XMLUtil(lm_oParentElement, lm_sNodeNames[i]);
		}
			
		if(lm_oChildArray.length == 0) return null;
		else if(i == lm_sNodeNames.length-1) {
			for(var j=0; j < lm_oChildArray.length; j++) {
				if(pm_sAttri == null) return lm_oChildArray[j];
				else {
					if(lm_oChildArray[j].getAttribute(pm_sAttri) == pm_sAttriValue) return lm_oChildArray[j];
				}
			}//for j
			return null;
		}//if
		lm_oParentElement = lm_oChildArray;
	}//for i
	return null;
}

/** 
 * pm_oElement ¹Ù·Î ÇÏÀ§ÀÇ pm_sNodeName ÀÌ¸§ÀÇ Element¸¦ ±¸ÇÑ´Ù 
 *@param	pm_oElement		Element Node
 *@param	pm_sNodeName	°Ë»öÇÒ ³ëµåÀÇ ÀÌ¸§
 *@return	ÇÏÀ§ÀÇ pm_sNodeName ÀÌ¸§ÀÇ Element Node °´Ã¼
 */
function getChildNode_XMLUtil(pm_oElement, pm_sNodeName) {
	var lm_oChild = null;
	var lm_oArray = new Array();
	var lm_iCount = 0;
	for(var i=0; i <pm_oElement.childNodes.length; i++) {
		lm_oChild = pm_oElement.childNodes[i];
		if(lm_oChild.nodeTypeString == "element" 
					&& lm_oChild.nodeName == pm_sNodeName) {
			lm_oArray[lm_iCount] = lm_oChild;
			lm_iCount++;
		}
	}//for
	return lm_oArray;
}

/**
 * XML °´Ã¼¸¦ Object·Î ±¸¼ºÇÏ¿© ¹ÝÈ¯ÇÑ´Ù. <BR>
 * µ¿ÀÏÇÑ Element °¡ ¹Ýº¹µÇ´Â °æ¿ì´Â Element µéÀ» ºÎ¸ð Element ÀÇ attribute¿¡ 
 * type=array ¶ó°í Ç¥½ÃµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
 * @return	XML Á¤º¸¸¦ ±¸¼ºÇÑ °´Ã¼
 */
function getUserObject_XMLUtil() {
	var lm_oReturnObject = new Object();
	getUserObject2_XMLUtil(this.im_oRootElement, lm_oReturnObject);
	return lm_oReturnObject;
}

/**
 * getUserObjectÀÇ Àç±ÍÈ£Ãâ function
 */
function getUserObject2_XMLUtil(pm_oElement, pm_oObject) {
	var lm_sNodeName = pm_oElement.nodeName;
	var lm_bHasChild = hasChildNode_XMLUtil(pm_oElement);
	var lm_sType = pm_oElement.attributes.getNamedItem("type") != null ? 
			pm_oElement.attributes.getNamedItem("type").nodeValue : null;
	if(lm_bHasChild == false) {
		if(lm_sType == "array")	pm_oObject[lm_sNodeName] = new Array();
		else if(pm_oObject.length == null) pm_oObject[lm_sNodeName] = pm_oElement.text;	
		else pm_oObject[pm_oObject.length] = pm_oElement.text;
	} else {
		var lm_oObject = null;
		if(lm_sType == "array") lm_oObject = new Array();
		else lm_oObject = new Object();
		if(pm_oObject.length == null) pm_oObject[lm_sNodeName] = lm_oObject;	
		else pm_oObject[pm_oObject.length] = lm_oObject;
		
		for(var i=0; i <pm_oElement.childNodes.length; i++) {
			lm_oChild = pm_oElement.childNodes[i];
			if(lm_oChild.nodeTypeString == "element") {
				getUserObject2_XMLUtil(lm_oChild, lm_oObject);
			}
		}//for
	}//if
}

/** 
 * pm_oElement¿¡ ÇÏÀ§ Element°¡ ÀÖ´ÂÁö ±¸ÇÑ´Ù 
 *@param	pm_oElement		Element Node
 *@return	ÇÏÀ§ÀÇ Element°¡ ÀÖÀ¸¸é true ¾Æ´Ï¸é false ¹ÝÈ¯
 */
function hasChildNode_XMLUtil(pm_oElement) {
	var lm_oChild = null;
	var lm_iCount = 0;
	for(var i=0; i <pm_oElement.childNodes.length; i++) {
		lm_oChild = pm_oElement.childNodes[i];
		if(lm_oChild.nodeTypeString == "element") return true;
	}//for
	return false;
}

/** 
 * ¿©·¯ ElementÀÇ ÇÏÀ§ÀÇ pm_sNodeName ÀÌ¸§ÀÇ Element¸¦ ±¸ÇÑ´Ù 
 *@param	pm_oArray		Element Node¸¦ ´ã°í ÀÖ´Â Array
 *@param	pm_sNodeName	°Ë»öÇÒ ³ëµåÀÇ ÀÌ¸§
 *@return	ÇÏÀ§ÀÇ pm_sNodeName ÀÌ¸§ÀÇ Element Node °´Ã¼
 */
function getChildNodes_XMLUtil(pm_oArray, pm_sNodeName) {
	var lm_oChild = null;
	var lm_oReturnArray = new Array();
	var lm_iCount = 0;
	for(var i=0; i <pm_oArray.length; i++) {
		var lm_oElementArray = getChildNode_XMLUtil(pm_oArray[i], pm_sNodeName);
		for(var j=0; j < lm_oElementArray.length ;j++) {
			lm_oReturnArray[lm_iCount] = lm_oElementArray[j];
			lm_iCount++;
		}//for j
	}//for i
	return lm_oReturnArray;
}
	
/** 
 * Æ¯Á¤ Element¿¡ text °ªÀ» ¼³Á¤ÇÑ´Ù. <BR>
 * CDataSection ¶Ç´Â Text Node ¸¦ ºÐ°£ÇÏ¿© ¹®ÀÚ¿­À» ¼³Á¤ÇÑ´Ù. 
 *@param	pm_oElement	text¸¦ ¼³Á¤ÇÒ Element Node
 *@param	pm_sData	¼³Á¤ÇÒ ¹®ÀÚ¿­
 */
function setText_XMLUtil(pm_oElement, pm_sData) {
	if(hasCData_XMLUtil(pm_oElement)) setCData_XMLUtil(pm_oElement, pm_sData);
	else pm_oElement.text = pm_sData;
}

/** 
 * Æ¯Á¤ Element¿¡ text °ªÀ» ¹ÝÈ¯ÇÑ´Ù. <BR>
 *@param	pm_oElement	text¸¦ ¼³Á¤ÇÒ Element Node
 *@return	Element °¡ Æ÷ÇÔÇÏ°í ÀÖ´Â Text Node ¹× CDataSectionÀÇ ¹®ÀÚ¿­ °ª
 */
function getText_XMLUtil(pm_oElement) {
	return pm_oElement.text;
}

/** 
 * pm_oElement ÇÏÀ§¿¡ CDataSectionÀ» °¡Áö´ÂÁö¸¦ ¹ÝÈ¯ÇÑ´Ù. 
 *@param	pm_oElement	Element Node
 *@return	CDataSectionÀ» °¡Áö°í ÀÖÀ¸¸é true ¾Æ´Ï¸é false¸¦ ¹ÝÈ¯
 */
function hasCData_XMLUtil(pm_oElement) {
	for(var i=0; i <pm_oElement.childNodes.length; i++) {
		if(pm_oElement.childNodes[i].nodeTypeString == "cdatasection") return true;
	}//for
	return false;
}

/** 
 * Æ¯Á¤ Element ÀÇ CData¿¡ pm_sData¸¦ ¼³Á¤ÇÑ´Ù. 
 *@param	pm_oElement	Element Node
 *@param	pm_sData	¼³Á¤ÇÒ ¹®ÀÚ¿­
 */
function setCData_XMLUtil(pm_oElement, pm_sData) {
	for(var i=0; i <pm_oElement.childNodes.length; i++) {
		if(pm_oElement.childNodes[i].nodeTypeString == "cdatasection") {
			pm_oElement.childNodes[i].nodeValue = pm_sData;
		}
	}//for	
}

/** 
 * Æ¯Á¤ ElementÀÇ attribute ÀÇ °ªÀ» ¼³Á¤ÇÑ´Ù. <BR>
 *@param	pm_oElement	Element Node
 * @param	pm_sAttri 		attributeÀÇ ÀÌ¸§
 * @param	pm_sAttriValue 	attributeÀÇ °ª
 */
function setAttribute_XMLUtil(pm_oElement, pm_sAttri, pm_sAttriValue) {
	if(pm_oElement != null && pm_sAttriValue != null) 
		pm_oElement.setAttribute(pm_sAttri, pm_sAttriValue);
}

/** 
 * Æ¯Á¤ ElementÀÇ attribute ÀÇ °ªÀ» ¹ÝÈ¯ÇÑ´Ù. <BR>
  *@param	pm_oElement	Element Node
 * @param	pm_sAttri 		attributeÀÇ ÀÌ¸§
 */
function getAttribute_XMLUtil(pm_oElement, pm_sAttri) {
	if(pm_oElement.attributes.getNamedItem(pm_sAttri) == null) return null;
	else return pm_oElement.attributes.getNamedItem(pm_sAttri).nodeValue;
}


