// JavaScript Document
function BetterInnerHTML(element, HTML, clearfirst) {

	// load the HTML as XML
	function Load(xmlString) {
		var xml;
		if (typeof DOMParser != "undefined") xml = (new DOMParser()).parseFromString(xmlString, "application/xml");
		else {
			var ieDOM = ["MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
			for (var i = 0; i < ieDOM.length && !xml; i++) {
				try { xml = new ActiveXObject(ieDOM[i]); xml.loadXML(xmlString); }
				catch(e) {}
			}
		}
		return xml;
	}

	// recursively copy the XML into the DOM
	function Copy(domNode, xmlDoc, level) {

		if (typeof level == "undefined") level = 1;
		if (level > 1) {

			if (xmlDoc.nodeType == 1) {

				// element node
				var thisNode = document.createElement(xmlDoc.nodeName);

				// attributes
				for (var a = 0, attr = xmlDoc.attributes.length; a < attr; a++) {
					var aName = xmlDoc.attributes[a].name, aValue = xmlDoc.attributes[a].value, evt = (aName.substr(0,2) == "on");
					if (!evt) {
						switch (aName) {
							case "class": thisNode.className = aValue; break;
							case "for": thisNode.htmlFor = aValue; break;
							default: thisNode.setAttribute(aName, aValue);
						}
					}
				}

				// append node
				domNode = domNode.appendChild(thisNode);

				// attach event
				if (evt) domNode[aName] = function() { eval(aValue); };
			}
			else if (xmlDoc.nodeType == 3) {
				// text node
				var text = (xmlDoc.nodeValue ? xmlDoc.nodeValue : "");
				var test = text.replace(/^\s*|\s*$/g, "");
				if (test.indexOf("<!--") != 0 && test.indexOf("-->") != (test.length - 3)) domNode.appendChild(document.createTextNode(text));
			}
		}

		// do child nodes
		for (var i = 0, j = xmlDoc.childNodes.length; i < j; i++) Copy(domNode, xmlDoc.childNodes[i], level+1);
	}

	// load the XML and copies to DOM
	HTML = "<root>"+HTML+"</root>";
	var xmlDoc = Load(HTML);
	if (element && xmlDoc) {
		if (clearfirst != false) while (element.lastChild) element.removeChild(element.lastChild);
		Copy(element, xmlDoc.documentElement);
	}
}
