/**
 * XMLElement에서 노드 값을 반환한다. 노드에 자식이 있는 경우 자식이 없는 노드까지 탐색하여 값을 가져온다.
 * @param node XMLNode
 * @return 노드 값
 */
function getXmlNodeValue(node) {
	if (node.childNodes.length > 0)
		return getXmlNodeValue(node.childNodes[0]);
	else {
		var objValue = node.nodeValue;
		return objValue;
	}	
}

/**
 * XMLElement의 속성들을 JSON 타입으로 반환한다.
 * @param node XMLNode
 * @return JSON Object로 표현된 속성들
 */
function getXmlAttributeToJSON(node) {
	var jsonString = '{';
	
	for (var i = 0; i < node.attributes.length; i++) {
		var nodeValue = node.attributes[i].nodeValue; 
		jsonString += "'" + node.attributes[i].nodeName + "': " + nodeValue.toJSON();
		if (i + 1 != node.attributes.length)
			jsonString += ', ';
	}
	jsonString += '}';

	return jsonString.evalJSON();
}

/**
 * 모든 자식 노드들을 삭제한다.
 * @param parent 삭제할 자식 노드를 갖는 부모 노드
 */
function removeAllChildren(parent) {
	var children = parent.childElements();
	
	for (var i = 0; i < children.length; i++) {
		if (children[i].childElements().length > 0)
			removeAllChildren(children[i]);
		parent.removeChild(children[i]);
	}
}

/**
 * 자식 노드들을 JSON Object로 변환한다.
 * @param obj XMLNode
 * @return JSON Object로 표현된 값
 */
function nodeToJSON(obj) {
	var jsonString = '{';
	
	for (var i = 0; i < obj.childNodes.length; i++) {
		var nodeValue = getXmlNodeValue(obj.childNodes[i]);
		jsonString += "'" + obj.childNodes[i].nodeName + "':" + (nodeValue == null ? "''" : nodeValue.toJSON());
		if (i + 1 != obj.childNodes.length)
			jsonString += ",";
	}

	jsonString += '}';
	return jsonString.evalJSON();
}

/**
 * XMLElement에서 노드 값을 반환한다. 노드에 자식이 있는 경우 자식이 없는 노드까지 탐색하여 값을 가져온다.
 * @param node XMLNode
 * @return 노드 값
 */
/*
function getXmlNodeValueEx(node) {
	if (node.childNodes.length > 0) {
		var childValues = new Array();
		for (var i = 0; i < node.childNodes.length; i++) {
			var childNode = node.childNodes[i];
			if (childNode.nodeType == 1) {	// NODE ELEMENT
				var lastValue = childValues.last();
				if (lastValue != undefined && lastValue != null) {
					if (lastValue.type == 'text') {
						childValues.without(lastValue);
					}
				}
				childValues.push({'name': node.nodeName, 'value': getXmlNodeValueEx(childNode), 'type': 'element'});
			} else if (childNode.nodeType == 3) {	// TEXT node
				if (childValues.size() > 0 && childValues[childValues.size() - 1].type == 'element')
					continue; // 무시(공백 노드일 경우가 많음)
				else if (childValues.size() > 0 && childValues[childValues.size() - 1].type == 'text') {
					// 이전 값과 합친다.
					var prevValue = childValues[childValues.size() - 1];
					prevValue.value = prevValue.value + childNode.nodeValue;
					childValues[childValues.size() - 1] = prevValue;
				} else if (childValues.size() == 0) {
					var value = childNode.nodeValue;
					childValues.push({'name': null, 'value': value.toJSON(), 'type': 'text'});
				}
			} else if (childNode.nodeType == 4) {	// CDATA section
				childValues.clear();
				var value = childNode.nodeValue;
				childValues.push({'name': null, 'value': value.toJSON(), 'type': 'cdata'});
				break;
			}
		}
		
		if (childValues.size() == 0)
			return 'null';
		else {
			var firstValue = childValues.first();
			var returnValue;
			if (firstValue.type == 'element') {
				returnValue = "{";
				returnValue += "}";
			}
		}
	} else {
		var objValue = node.nodeValue;
		return objValue.toJSON();
	}	
}
*/

/**
 * 자식 노드들을 JSON Object로 변환한다.
 * @param obj XMLNode
 * @return JSON Object로 표현된 값
 */
function xmlNodeToJSON(obj) {
	var jsonString = '{';
	
	for (var i = 0; i < obj.childNodes.length; i++) {
		var nodeValue = getXmlNodeValueEx(obj.childNodes[i]);
		var attrs = getXmlAttributeToJSON(obj.childNodes[i]);
		jsonString += "'" + obj.childNodes[i].nodeName + "': {'attrs':" + Object.toJSON(attrs) + ", 'value': " + nodeValue + '}';
		if (i + 1 != obj.childNodes.length)
			jsonString += ",";
	}

	jsonString += '}';
	return jsonString.evalJSON();
}

/**
 * 객체를 화면 중앙에 표시한다.
 * @param obj 표시할 객체
 */
function centerPosition(obj) {
	var dimensions = obj.getDimensions();

	var fullWidth, fullHeight;
	var docSize = document.viewport.getDimensions();
	if(docSize.width == 0)
	{
		fullWidth = document.body.clientWidth;
		fullHeight = document.body.clientHeight;
	}
	else
	{
		fullWidth = docSize.width;
		fullHeight = docSize.height;
	}
	
	var scrollOffset = document.viewport.getScrollOffsets();

	var leftpos = (fullWidth / 2) - (dimensions.width / 2) + scrollOffset.left;
	var toppos = (fullHeight / 2) - (dimensions.height / 2) + scrollOffset.top;

	obj.setStyle({'left':leftpos+'px','top':toppos+'px'});
}

function replaceImage(imageObj, imageUrl) {
	imageObj = $(imageObj);
	imageObj.src = imageUrl;
}