// DOM Helper
function DOMHelper() {
}

DOMHelper.prototype.createTR = function() {
	return document.createElement('TR');
}
DOMHelper.prototype.createTD = function() {
	return document.createElement('TD');
}
DOMHelper.prototype.createINPUT = function() {
	return document.createElement('INPUT');
}
DOMHelper.prototype.createSPAN = function() {
	return document.createElement('SPAN');
}
DOMHelper.prototype.createHIDDEN = function() {
	var hidden = document.createElement('INPUT');
	hidden.setAttribute('type', 'hidden');
	return hidden;
}
DOMHelper.prototype.createANCHOR = function() {
	return document.createElement('A');
}
DOMHelper.prototype.getById = function(id) {
	return document.getElementById(id);
}
DOMHelper.prototype.getFirstTBody = function(id) {
	return new DOMHelper.getById(id).tbody[0];
}
DOMHelper.prototype.getFormFieldValuesAsURLParameters = function(formId, fieldName) {
	var dh = new DOMHelper();
	var form = dh.getById(formId);
	var params = "";

	if (form == null) {
		return params;
	}
	
	var fields = form.getElementsByName(fieldName);
	if (fields != null && fields.length > 0) {
		params = fieldName+"=" + fields[0].value;
		
		for (var i=1; i < fields.length; i++) {
			var field = fields[i];
			params += "&"+fieldName+"=" + (field != null && field.value != "" ? field.value : "");
		}
	}
	
	return params;
}
DOMHelper.prototype.isFieldSet = function(field) {
	return field != null && field.value != null && field.value != "";
}

// XML Helper
var XMLHelper = (function() {
	function XMLHelper() {};
	
	XMLHelper.prototype.convert = function(doc) {
		if (doc != null) {
			if (isMoz || isSaf) {
				this.clean(doc);
			}
			return this.parse(doc);
		}
		return null;
	};
	
	XMLHelper.prototype.clean = function(doc) {
		if (doc != null) {
			var first = doc.firstChild;
			if (first.nodeName == "xml"/*IE*/) {
				first = doc.childNodes[1];
			}
			clean0(doc, first);
			return doc;
		}
		return null;
	};
	
	var REGEXP_EMPTY_NODE = new RegExp("^\\n\\s*$", "m");
	function clean0(p, node) {
		if (node != null) {
			if (node.hasChildNodes()) {
				for (var i = node.childNodes.length - 1; i >= 0 ; i--) {
					clean0(node, node.childNodes[i]);
				}
			} else {
				if (REGEXP_EMPTY_NODE.test(node.nodeValue)) {
					p.removeChild(node);
				}
			}
		}
	};
	
	XMLHelper.prototype.parse = function(doc) {
		if (doc != null) {
			var obj = {};
			var first = doc.firstChild;
			if (first.nodeName == "xml"/*IE*/) {
				first = doc.childNodes[1];
			}
			parse0(obj, first);
			return obj;
		}
		return null;
	};
	
	function parse0(obj, node) {
		if (node != null && node.nodeType == 1) {
			if (node.childNodes.length > 1) {
				var same = node.getElementsByTagName(node.firstChild.nodeName);
				if (same.length == node.childNodes.length) {
					same = null;
					var a = new Array();
					obj[node.nodeName] = a;
					for (var i = 0; i < node.childNodes.length; i++) {
						a.push({});
						parse0(a[i], node.childNodes[i]);
					}
				} else {
					for (var i = 0; i < node.childNodes.length; i++) {
						parse0(obj, node.childNodes[i]);
					}
				}
			} else if (node.childNodes.length == 1) {
				var first = node.firstChild;
				if (first.nodeType == 3/*#text*/ || first.nodeType == 4/*#pcdata*/) {
					var tmp = {};
					parse0(tmp, first);
					obj[node.nodeName] = tmp[first.nodeName];
				} else {
					// should not happend, but we never known...
					parse0(obj, node.firstChild);
				}
			}
		} else if (node.nodeType == 3/*#text*/ || node.nodeType == 4/*#pcdata*/) {
			obj[node.nodeName] = node.nodeValue;
		}
	};
	
	function getNodeValue(parent, name, index) {
		var nodes = parent.getElementsByTagName(name);
		if (nodes != null && nodes.length > 0) {
			var n = nodes[(index && index < nodes.length ? index : 0)];
			if (n.hasChildNodes()) {
				return n.firstChild.nodeValue;
			}
		}
		return null;
	};
	
	return XMLHelper;
})();
