function cleanupHTML(rte, displayMessage) {
	var oRTE;
	if (document.all) {
		oRTE = frames[rte].document;
	} else {
		oRTE = document.getElementById(rte).contentWindow.document;
	}
	
	//if viewing source, switch back to design view
	if (document.getElementById("txtSrc"+rte).innerHTML == RTE_btnShowDesignView) {
		toggleHTMLSrc(rte, true);
	}
	// get text and strip out nbsps which is not done by trim()
	var oldString = oRTE.body.innerHTML;
	var newString = oldString.replace(/&nbsp;/ig, " ");

	// change allowed tags
	var r1 = "@open@";
	var r2 = "@close@";
	// a href
	newString = newString.replace(/<a\b[^>]+href=['"]([^>]+)['"][^>]*>/ig, r1 + 'a href="$1"' + r2);
	// simple tags
	var allowedTags = new Array("a", "address", "b", "strong", "i", "em", "h1", "h2", "h3", "h4",
								"h5", "h6", "p", "pre", "br", "ol", "ul", "li", "center", "sup", "sub", "hr");
	for (var i=0; i<allowedTags.length; i++) {
		var reg = new RegExp("<(\\/?)" + allowedTags[i] + "\\b([^>]*)>", "ig");
		newString = newString.replace(reg, r1 + '$1' + allowedTags[i] + r2);
	}
	// font, span, div
	newString = replaceSpans(newString, "span", "bold", "strong", r1, r2);
	newString = replaceSpans(newString, "span", "italic", "em", r1, r2);
	newString = replaceSpans(newString, "span", "center", "center", r1, r2);
	newString = replaceSpans(newString, "font", "bold", "strong", r1, r2);
	newString = replaceSpans(newString, "font", "italic", "em", r1, r2);
	newString = replaceSpans(newString, "div", "bold", "strong", r1, r2);
	newString = replaceSpans(newString, "div", "italic", "em", r1, r2);
	newString = replaceSpans(newString, "div", "center", "center", r1, r2);

	// strip HTML out and fix allowed tags
	newString = stripHTML(newString);
	newString = newString.replace(/@open@/g, "<");
	newString = newString.replace(/@close@/g, ">");

	// write back cleaned up html
	if (newString != oldString) {
		var undoField = document.getElementById(rte + 'undoCleanupHdn');
		var undoOption = document.getElementById(rte + 'undoCleanupOption');
		
		undoField.value = oldString;
		undoOption.style.display = "inline";
		oRTE.body.innerHTML = newString;
		updateRTE(rte);

		// display message
		if (displayMessage == true) alert(RTE_SourceCodeCleanupDone);
	}else{
		if (displayMessage == true) alert(RTE_NoCleanupNeeded);
	}
}

function replaceSpans(plain, oldTag, property, newTag, r1, r2) {
	var start, end, s, before, here, after, neu;
	start = '<' + oldTag; // kann auch global sein
	end = '</' + oldTag + '>'; // kann auch global sein
	s = plain.search(start);
	if (s==-1) return plain;
	before = plain.substring(0, s);
	here = plain.substr(s);
	s = here.search(end);
	if (s==-1) s = here.length-1;
	after = here.substr(s + end.length);
	here = here.substring(0, s + end.length);
	var reg = new RegExp("(^<" + oldTag + "\\b[^>]+[\'\"][^>]*" + property + "[^>]*[\'\"][^>]*>)", "i");
	if (matsch = here.match(reg)) neu = r1 + newTag + r2 + here.substring(matsch[0].length, here.length-end.length) + r1 + '/' + newTag + r2;
	else neu = here;
	after = replaceSpans(after, oldTag, property, newTag, r1, r2);
	return before + neu + after;
}

function undoCleanup(rte) {
	var undoField = document.getElementById(rte + 'undoCleanupHdn');
	var undoOption = document.getElementById(rte + 'undoCleanupOption');
	var oRTE;
	if (document.all) {
		oRTE = frames[rte].document;
	} else {
		oRTE = document.getElementById(rte).contentWindow.document;
	}
	
	//if viewing source, switch back to design view
	if (document.getElementById("txtSrc"+rte).innerHTML == RTE_btnShowDesignView) {
		toggleHTMLSrc(rte, true);
	}
	// put the old contents back in
	oRTE.body.innerHTML = undoField.value;
	undoOption.style.display = "none";
	undoField.value = "";
	updateRTE(rte);
}