// Manifesto: $Id: dtRTE.js,v 1.44 2008/10/25 02:21:18 spud Exp $
// license: GNU LGPL
// copyright 2001-2008: dada typo and contributors

dtdebug = 1;
function dtalert(msg) {
	if (dtdebug && window.console) window.console.log(msg);
}
function dtRTEcore() {
	this.majorVersion = "0";
	this.minorVersion = "5";
	this.mimeIndex = 'rte';
	this.instances = new Array();
	this.instancect = 0;
	this.current = false;
	this.resizer = false;
	this.field = "";
	this.forms = new Array();
	this.url = dtDOM.g_url;
	this.oldsubmit = false;
	this.img_array = new Array();
}
dtRTEcore.prototype.addInstance = function(ed) {
	if (ed.mimeIndex == 'html') this.mimeIndex = 'html';
	this.instances[ed.eid] = ed;
	this.loadContent(ed.eid);
	this.addEventHandlers(ed.eid);
	if (!inArray(this.forms,ed.form)) {
		var oldsubmit = false;
		oldsubmit = dtDOM.getAttr(ed.form,"onsubmit");
		if (oldsubmit && typeof oldsubmit != "undefined") {
			// remove the old onsubmit call
			dtDOM.removeAttr(ed.form,"onsubmit");
			ed.form.onsubmit = null;
			// turn oldsubmit into a proper function
			oldsubmit = String(oldsubmit).replace(/return /,"");
			oldsubmit = String(oldsubmit).replace(/\(this\);?/,"");
			ed.form.oldsubmit = oldsubmit;
			dtDOM.setAttr(ed.form,"oldsubmit",oldsubmit);
			//dtDOM.addEvent(ed.form,"submit", eval(oldsubmit));
		}
		dtDOM.addEvent(ed.form,"submit",dtRTEcore.prototype.doSubmit);
		this.forms.push(ed.form);
	}
};
dtRTEcore.prototype.addEventHandlers = function(eid) {
	ed = this.instances[eid];
	idoc = ed.getIframeDocument();
	dtDOM.addEvent(idoc,"select",g_dtRTE.handleEvent);
	dtDOM.addEvent(idoc,"click",g_dtRTE.handleEvent);
	dtDOM.addEvent(idoc,"mouseup",g_dtRTE.handleEvent);
	dtDOM.addEvent(idoc,"keypress",g_dtRTE.handleEvent);
	dtDOM.addEvent(idoc,"keyup",g_dtRTE.handleEvent);
};
dtRTEcore.prototype.doSubmit = function(e) {
	var evt = e ? e : window.event;
	if (g_dtRTE.mimeIndex == 'rte') {
		try {
			for(var eid in g_dtRTE.instances) {
				var ed = g_dtRTE.instances[eid];
				ed.cleanContent();
				ed.contentFromEditor();
			}
		}
		catch(err) {
			alert(err.message);
			alert("If you have problems submitting the form, try switching to 'HTML formatted' and resubmit.");
			if (evt.returnValue) {
				evt.returnValue = false;
			} else if (evt.preventDefault) {
				evt.preventDefault();
			} else {
				return false;
			}
		}
	}
	var targ = dtDOM.getEventTarget(evt);
	
	// add hash_media IDs to targ (form) as a field
	if (g_dtRTE.img_array.length != 0) {
		var hasharr = new Array();
		try {
			for(var ct=0;ct<g_dtRTE.img_array.length;ct++) {
				// alert('g_dtRTE.img_array index '+ct+', image '+(ct+1)+' of '+g_dtRTE.img_array.length+' which is an '+typeof g_dtRTE.img_array[ct]);
				hasharr[hasharr.length] = g_dtRTE.img_array[ct].hashid;
				// alert('DONE adding '+g_dtRTE.img_array[ct].hashid+' at index '+ct+' to the hasharr');
			}
			//alert('Setting hash_media (hidden input) to '+hasharr.toString());
			dtDOM.setAttr("hash_media","value",hasharr.toString());
		}
		catch(e) {
			if (!window.confirm('There was an error looping through your placed media files. Continue anyway?')) return false;
		}
	}
	try {
		if (targ.oldsubmit) {
			var oldsubmitfunc = eval(targ.oldsubmit);
			var test = oldsubmitfunc.apply(targ,[targ]);
			if (!test) {
				if (evt.returnValue) {
					evt.returnValue = false;
				} else if (evt.preventDefault) {
					evt.preventDefault();
				} else {
					return false;
				}
			}
		}
	}
	catch(e) {
		// alert("Error getting targ.oldsubmit from "+targ.nodeName+") "+e.name+": "+e.message);
	}
};
dtRTEcore.prototype.handleEvent = function(e) {
	var evt = e ? e : window.event;
	var targ = dtDOM.getEventTarget(evt);
	if (targ.ownerDocument && targ.ownerDocument.eid) {
		this.current = targ.ownerDocument.eid;
	} else {
		dtalert("Couldn't find target eid; defaulting to 1");
		this.current = "dtRTE_1";
	}
	var ed = g_dtRTE.instances[this.current];
	ed.focusedElement = targ;
	switch(evt.type) {
		case 'select':
		case 'click':
		case 'mouseup':
			// Safari-only hack for lack of selection objects
			if (dtDOM.isSafari && ed.focusedElement.nodeName == "IMG") {
				if (!ed.selection) ed.getSel();
				ed.selection.setByNode(ed.focusedElement,false);
			}
			g_dtRTE.updateToolbar(this.current);
			break;
		case 'keydown':
		case 'keypress':
			break;
		case 'keyup':
			if (evt.keyCode == 8 || evt.keyCode == 46) {
				// backspace
				ed.getSel();
				if ((ed.selection.parentElement.nodeName == "P" || ed.selection.parentElement.nodeName == "BODY") && ed.selection.parentElement.innerHTML == "<br>") {
					ed.selection.parentElement.removeChild(ed.selection.parentElement.firstChild);
					ed.selection.rng.collapse(false);
				}
				g_dtRTE.updateToolbar(this.current);
			} else if (evt.keyCode == 13) {
				// return key
				ed.getSel();
				//ed.selection.rng.insertNode(dtDOM.br());
				ed.selection.rng.collapse(false);
			} else if (inArray(ed.arrows,evt.keyCode)) {
				g_dtRTE.updateToolbar(this.current);
			}
			break;
	}
	return;
};
dtRTEcore.prototype.loadContent = function(eid) {
	ed = this.instances[eid];
	if (ed == null || ed == "undefined") {
		return false;
	}
	try {
		var content = ed.getTaContent();
		content = ed.makePlaceholderImages(content);
		if (dtDOM.isMSIE) {
			ed.setDesignMode();
			if (content != "") {
				ed.getIframeDocument().body.innerHTML = content;
			}
		} else {
			if (content != "") {
				ed.setIframeContent(content);
			}
			ed.setDesignMode();
		}
		ed.addPlaceholderClasses();
		if (ed.hidden) {
			ed.hide();
		} else {
			ed.getIframeWindow().focus();
			this.updateToolbar(eid);
		}
		window.status = "Design Mode: "+ed.iframeDocument.designMode;
	}
	catch(err) {
		window.status = "Error: "+err.message;
	}
};
dtRTEcore.prototype.setDesignMode = function(eid) {
	ed = this.instances[eid];
	ed.setDesignMode();
}
dtRTEcore.prototype.doExec = function(eid,action) {
	var ed = g_dtRTE.instances[eid];
	var iwindow = ed.getIframeWindow();
	var idoc = ed.getIframeDocument();
	var sel = ed.getSel();
	if (arguments.length == 3) {
		var extra = arguments[2];
	}
	switch (action) {
		case "dtInsertImage":
			if (ed.focusedElement && ed.focusedElement.nodeName == "IMG") {
				if (ed.focusedElement.src.indexOf('placeholder') != -1 || ed.focusedElement.id.indexOf('media_') != -1) {
					var allclass = dtDOM.getAttr(ed.focusedElement,"class");
					var imgclass = allclass.replace(/imagebox|placeholder/g,'').trim();
					this.openMediaBrowser(eid,ed.focusedElement.id,imgclass);
				} else {
					var allclass = dtDOM.getAttr(ed.focusedElement,"class");
					var imgclass = allclass.replace(/imagebox|placeholder/g,'').trim();
					this.openMediaBrowser(eid,ed.focusedElement.src,imgclass);
				}
			} else {
				this.openMediaBrowser(eid);
			}
			return false;
		case "dtCreateLink":
			if (sel.collapsed) {
				alert("There is no text currently selected for the link.");
			} else {
				var linknode = sel.containsLink();
				if (linknode != null) {
					sel.expandToLink(linknode);
					clnk = linknode.href;
					this.openLinkBrowser(eid,clnk);
				} else {
					this.openLinkBrowser(eid);
				}
			}
			return false;
		case "dtCreateAnchor":
			var linknode = sel.containsLink();
			if (linknode != null) {
				clnk = linknode.id;
			} else {
				clnk = "";
			}
			var anchorName;
			if (anchorName = window.prompt("Enter a name for your anchor",clnk)) {
				if (dtDOM.isMSIE) {
					if (linknode != null) {
						linknode.id = anchorName;
					} else {
						var rangeContents = sel.rng.text;
						sel.rng.pasteHTML("");
						sel.rng.pasteHTML('<a id="'+anchorName+'">'+rangeContents+'</a>');
					}
				} else {
					if (linknode != null) {
						linknode.id = anchorName;
					} else {
						var newA = dtDOM.buildElement("A",anchorName,false,idoc);
						newA.appendChild(idoc.createTextNode(sel.text));
						sel.rng.deleteContents();
						sel.rng.insertNode(newA);
						sel.rng.collapse(false);
					}
				}
			}
			break;
		case "dtMailto":
			if (!sel.collapsed) {
				if (isValidEmail(sel.text)) {
					if (js_g_obscure_email == "hide") {
						alert("Your site preference for email address handling does not permit mailto links");
						break;
					} else if (js_g_obscure_email == "on") {
						extra = '<a href="mailto:'+sel.text.replace('@','-AT-')+'" onclick="var reg=/-AT-/;this.href=this.href.replace(reg,\'@\');">'+sel.text.replace('@','-AT-')+'</a>';
						if (dtDOM.isMSIE) {
							sel.rng.pasteHTML(extra);
						} else {
							idoc.execCommand("inserthtml",false,extra);
						}
					} else {
						extra = "mailto:"+sel.text;
						idoc.execCommand("createlink",false,extra);
					}
				} else {
					alert(sel.text+" does not appear to be a valid email address");
				}
			}
			break;
		case "dtFixParagraphs":
			var content = ed.getIframeContent();
			if (content.indexOf("<p") == -1 && content.indexOf("<P") == -1) {
				var regex = new RegExp("[\r\n]+ *[\r\n]+","g");
				content = "<p>"+content.replace(regex,"<p>");
				var regex = /<br>{2}/g;
				content = "<p>"+content.replace(regex,"<p>");
				ed.setIframeContent(content);
			}
			this.disableButton(eid,"fixparagraphs");
			break;
		case "dtPasteWord":
			var content = this.getClipboard();
			alert(content);
			break;
		case "dtCleanUp":
			var content = ed.getIframeContent();
			if (content != "") {
				// remove any class="msoXXX"
				content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");
				// remove all style attributes
				//content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");
				// replace all spans
				//content = content.replace(/<\/?span[^>]*>/gi, "");
				// remove any font tags
				content = content.replace(/<\/?font[^>]*>/gi, "");

				// various niggly things
				content = content.replace(/<o:p><\/o:p>/gi, "");
				content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");
				content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
				content = content.replace(/<\\?\?xml[^>]*>/gi, "");
				content = content.replace(/<\/?\w+:[^>]*>/gi, "");
				
				// remove any excessive line breaking
				content = content.replace(/<p><br( \/)?>/gi, "<p>");
				// remove any empty paragraphs
				content = content.replace(/<p>[\r\n ]*<\/p>/gi, "");
				// remove any excessive returns
				content = content.replace(/[\r\n]{2} *[\r\n]{2}/gi, "");
				ed.setIframeContent(content);
			}
			break;
		case "dtBlockquote":
			if (dtDOM.isMSIE) {
				if (dtDOM.hasClass(eid+"_blockquote","pressed")) {
					var bqparent;
					bqparent = dtDOM.seekParentElement(sel.parentElement,"BLOCKQUOTE");
					if (bqparent != null) {
						sel.setByNode(sel.parentElement,true,false);
						var regexp = /<\/?blockquote>/gi;
						var rangeContents = sel.rng.htmlText.replace(regexp,"");
						sel.rng.pasteHTML("");
						sel.rng.pasteHTML(rangeContents);
					}
				} else {
					sel.rng.pasteHTML("<blockquote>"+sel.htmltext+"</blockquote>");
				}
			} else {
				if (dtDOM.hasClass(eid+"_blockquote","pressed")) {
					var bqparent;
					bqparent = dtDOM.seekParentElement(sel.parentElement,"BLOCKQUOTE");
					if (bqparent != null) {
						sel.setByNode(sel.parentElement,true,false);
						var rangeContents = sel.rng.extractContents();
						sel.parentElement.parentNode.removeChild(sel.parentElement);
						sel.rng.insertNode(rangeContents);
					}
				} else {
					var newBQ = dtDOM.buildElement("BLOCKQUOTE",false,false,idoc);
					newBQ.appendChild(sel.rng.cloneContents());
					sel.rng.deleteContents();
					sel.rng.insertNode(newBQ);
					sel.rng.collapse(false);
				}
			}
			break;
		case "forecolor":
			if (extra) {
				idoc.execCommand("ForeColor",false,extra);
			}
			break;
		case "formatblock":
		case "fontsize":
		case "createlink":
			if (extra) {
				idoc.execCommand(action,false,extra);
			}
			break;
		case "insertHTML":
			if (!sel.collapsed) {
				alert("Please de-select any text before inserting content.");
			} else if (extra) {
				if (dtDOM.isMSIE) {
					sel.rng.pasteHTML(extra);
				} else {
					idoc.execCommand("inserthtml",false,extra);
				}
			}
			break;
		case "unlink":
			var linknode = sel.containsLink();
			if (linknode != null && linknode.id && !linknode.href) {
				// anchor A tags (ID only, no HREF)
				if (dtDOM.isMSIE) {
					var rangeContents = sel.rng.htmlText;
					sel.rng.pasteHTML("");
					sel.rng.pasteHTML(rangeContents);
				} else {
					var rangeContents = linknode.innerHTML;
					sel.replaceSelf(rangeContents);
					// below is optional? recommended to merge adjacent text nodes
					//linknode.normalize();
				}
			} else {
				idoc.execCommand(action,false,null);
			}
			break;
		case "fullscreen":
			if (ed.isFullscreen) {
				// remove all the repositioning styles
				// (code used to remove entire "style" attribute
				// but that broke Safari 3.1.1 after repeating)
				dtDOM.removeStyle(ed.iframediv,"position");
				dtDOM.removeStyle(ed.iframediv,"top");
				dtDOM.removeStyle(ed.iframediv,"left");
				dtDOM.removeStyle(ed.iframediv,"zIndex");
				dtDOM.removeStyle(ed.iframediv,"height");
				dtDOM.removeStyle(ed.iframediv,"width");
				dtDOM.setStyle(ed.iframediv,"backgroundColor","transparent");
				// remove style attributes of iframe
				dtDOM.removeStyle(ed.iframe,"height");
				dtDOM.removeStyle(ed.iframe,"width");
				// restore h/w attributes of ifram
				dtDOM.setAttr(ed.iframe,{"height":ed.height,"width":ed.width});
				// reenable the resizer
				dtDOM.showHide(eid+"_resizer");
				if (dtDOM.isMSIE) dtDOM.setStyle("leftbar","visibility","visible");
				ed.isFullscreen = false;
			} else {
				dtDOM.setStyle(ed.iframediv,{"backgroundColor":"#ffffff","height":"100%","left":0,"position":"fixed","top":0,"width":"100%","zIndex":100 });
				dtDOM.setStyle(ed.iframe,{"height":"90%","width":"90%"});
				dtDOM.showHide(eid+"_resizer");
				if (dtDOM.isMSIE) dtDOM.setStyle("leftbar","visibility","hidden");
				ed.isFullscreen = true;
			}
			break;
		default:
			idoc.execCommand(action,false,null);
			break;
	}
	var newsel = ed.getSel();
	if (dtDOM.isGecko) {
		var newrng = newsel.rng;
		if (newrng.startContainer.nodeType == 3 && newrng.startOffset == newrng.startContainer.length && newrng.endContainer.nodeType == 3 && newrng.endOffset == newrng.endContainer.length && newrng.endContainer.parentNode == newrng.startContainer.nextSibling) {
			ed.selection.setByNode(newrng.startContainer.nextSibling,true);
		}
	}
	this.updateToolbar(eid);
	iwindow.focus();
	// Unknown command below...was in dev.dada version
	//this.hideEditor();
	return false;
};
dtRTEcore.prototype.showEditor = function() {
	for(var n in this.instances) {
		this.instances[n].contentToEditor();
		dtDOM.showHide(this.instances[n].textarea,"none");
		dtDOM.showHide(this.instances[n].iframediv,"block");
		dtDOM.showHide(this.instances[n].field+"_"+this.instances[n].uid+"_rte","inline");
		dtDOM.showHide(this.instances[n].field+"_"+this.instances[n].uid+"_html","none");
	}
};
dtRTEcore.prototype.hideEditor = function() {
	for(var n in this.instances) {
		this.instances[n].contentFromEditor();
		dtDOM.showHide(this.instances[n].iframediv,"none");
		dtDOM.setStyle(this.instances[n].textarea,"height",this.instances[n].iframe.style.height);
		dtDOM.showHide(this.instances[n].textarea,"block");
		dtDOM.showHide(this.instances[n].field+"_"+this.instances[n].uid+"_rte","none");
		dtDOM.showHide(this.instances[n].field+"_"+this.instances[n].uid+"_html","inline");
	}
};
dtRTEcore.prototype.disableButton = function(eid,bName) {
	var button = getObjectRef(eid+"_"+bName);
	if (button && button.src.indexOf("_d.gif") == -1) {
		button.src = button.src.replace(".gif","_d.gif");
	}
};
dtRTEcore.prototype.enableButton = function(eid,bName) {
	var button = getObjectRef(eid+"_"+bName);
	if (button && button.src.indexOf("_d.gif") != -1) {
		button.src = button.src.replace("_d.gif",".gif");
	}
};
dtRTEcore.prototype.resetToolbar = function(eid) {
	var ed = g_dtRTE.instances[eid];
	// verify designMode (often lost if RTE was hidden by default)
	if (ed.getIframeDocument().designMode.toLowerCase() == "off") {
		ed.setDesignMode();
	}
	if (ed.toolbar != "undefined") {
		var tbimgs = ed.toolbar.getElementsByTagName("img");
		for(var i=0;i<tbimgs.length;i++) {
			dtDOM.removeClass(tbimgs[i],"pressed");
			if (tbimgs[i].src.indexOf("_d.gif") != -1) {
				tbimgs[i].src = tbimgs[i].src.replace("_d","");
			}
		}
		var tbselects = ed.toolbar.getElementsByTagName("select");
		for(var i=0;i<tbselects.length;i++) {
			tbselects[i].selectedIndex = 0;
		}
	}
};
dtRTEcore.prototype.updateToolbar = function(eid) {
	this.resetToolbar(eid);
	var ed = g_dtRTE.instances[eid];
	var alignStop = false; // tells loop to stop calculating alignment after the first aligned node
	ed.getSel();
	if (ed.selection) {
		if (ed.selection.collapsed) {
			this.disableButton(eid,"createlink");
			this.disableButton(eid,"linkemail");
			this.disableButton(eid,"anchor");
			this.disableButton(eid,"unlink");
		} else if (ed.focusedElement && ed.focusedElement.nodeName == "IMG") {
			dtDOM.addClass(ed.eid+"_insertimg","pressed");
		} else {
			this.disableButton(eid,"specialchars");
			this.disableButton(eid,"insertimg");
		}
		var parents = dtDOM.getParentArray(ed.selection.parentElement);
		if (ed.selection.doubleclickElement && !parents[ed.selection.doubleclickElement]) {
			parents.unshift(ed.selection.doubleclickElement);
		}
		this.updatePathbar(eid,parents);
		/*
		*/
		for(var i=0;i<parents.length;i++) {
			var n = parents[i];
			var nColor = dtDOM.getStyle(n,"color");
			if (nColor != null && (nColor != "rgb(0, 0, 0)") && (nColor != "#000000")) dtDOM.addClass(ed.eid+"_"+"color","pressed");
			switch(n.nodeName) {
				case 'SPAN':
					break;
				case 'P':
					var menu = getObjectRef(ed.eid+"_block");
					dtDOM.setSelectByValue(menu,"<p>");
					break;
				case 'FONT':
					sizeattr = dtDOM.getAttr(n,"size");
					if (sizeattr != "undefined") {
						var menuoption = getObjectRef(ed.eid+"_fs_"+sizeattr);
						if (menuoption != null) menuoption.selected = true;
					}
					break;
				case 'BLOCKQUOTE':
					dtDOM.addClass(ed.eid+"_blockquote","pressed");
					break;
				case 'UL':
					dtDOM.addClass(ed.eid+"_ul","pressed");
					break;
				case 'OL':
					dtDOM.addClass(ed.eid+"_ol","pressed");
					break;
			}
		}
		var isLink = ed.selection.containsLink();
		if (!ed.selection.collapsed && isLink != null) {
			if (dtDOM.getAttr(isLink,"id")) {
				dtDOM.addClass(ed.eid+"_anchor","pressed");
				this.enableButton(eid,"anchor");
			} else {
				dtDOM.addClass(ed.eid+"_createlink","pressed");
				this.enableButton(eid,"createlink");
			}
		} else {
			this.disableButton(eid,"unlink");
		}
		var cursorarr = new Array("bold","italic",/*"underline",*/"justifyleft","justifyright","justifycenter","insertorderedlist","insertunorderedlist");
		for (var i=0;i<cursorarr.length;i++) {
			var press = ed.getIframeDocument().queryCommandState(cursorarr[i]);
			if (press) {
				switch (cursorarr[i]) {
					case 'insertorderedlist':
						dtDOM.addClass(ed.eid+"_ol","pressed");
						break;
					case 'insertunorderedlist':
						dtDOM.addClass(ed.eid+"_ul","pressed");
						break;
					default:
						dtDOM.addClass(ed.eid+"_"+cursorarr[i],"pressed");
				}
			}
		}
	}
};
dtRTEcore.prototype.updatePathbar = function(eid,p) {
	var ed = g_dtRTE.instances[eid];
	var pb = ed.pathbar;
	pb.innerHTML = "";
	pb.appendChild(document.createTextNode("Path: "));
	for(var i=p.length-1;i>=0;i--) {
		var a = dtDOM.buildElement("A",eid+"_path_"+i);
		dtDOM.setHandler(a,"onclick","return g_dtRTE.selectNodeFromPath('"+eid+"','"+i+"');");
		a.innerHTML = p[i].nodeName.toLowerCase();
		if (p[i].nodeName == "SPAN") {
			if (p[i].style["font-weight"] != "" && p[i].style["font-style"] != "") {
				a.innerHTML += " ("+dtDOM.getStyle(p[i],"font-weight")[0]+","+dtDOM.getStyle(p[i],"font-style")[0]+")";
			} else if (p[i].style["font-weight"] != "") {
				a.innerHTML += " ("+dtDOM.getStyle(p[i],"font-weight")[0]+")";
			} else if (p[i].style["font-style"] != "") {
				a.innerHTML += " ("+dtDOM.getStyle(p[i],"font-style")[0]+")";
			}
		}
		if (i > 0) a.innerHTML += " &raquo; ";
		pb.appendChild(a);
	}
	if (dtDOM.isGecko && ed.focusedElement && ed.focusedElement.nodeName == "IMG") {
		var a = dtDOM.buildElement("A",eid+"_path_"+i);
		a.innerHTML = " &raquo; ["+ed.focusedElement.nodeName.toLowerCase()+"]";
		pb.appendChild(a);
	}
};
dtRTEcore.prototype.selectNode = function(eid,obj) {
	var ed = g_dtRTE.instances[eid];
	if (!ed.selection) ed.getSel();
	ed.selection.setByNode(obj,true);
	return false;
};
dtRTEcore.prototype.selectNodeFromPath = function(eid,i) {
	var ed = g_dtRTE.instances[eid];
	if (!ed.selection) ed.getSel();
	var parents = dtDOM.getParentArray(ed.selection.parentElement);
	if (ed.selection.doubleclickElement && !parents[ed.selection.doubleclickElement]) {
		if (i == 0) {
			newsel = ed.getIframeDocument().createRange();
			newsel.selectNode(ed.selection.doubleclickElement);
			return false;
		} else {
			parents.unshift(ed.selection.doubleclickElement);
		}
	}
	if (parents[i]) {
		ed.selection.setByNode(parents[i],true);
	}
	ed.iframeWindow.focus();
	this.updateToolbar(eid);
	return false;
};
dtRTEcore.prototype.startVerticalDrag = function(e,eid,elemID) {
	var evt = e ? e : window.event;
	var ed = this.instances[eid];
	this.current = eid;
	this.resizer = new Object();
	this.resizer.ed = ed;
	this.resizer.elem = getObjectRef(elemID);
	this.resizer.proxy = getObjectRef(elemID+"_proxy");
	this.resizer.active = true;
	this.resizer.vertical = true;
	this.resizer.horizontal = false;
	this.resizer.startX = evt.screenX;
	this.resizer.startY = evt.screenY;
	this.resizer.minH = 100;
	this.resizer.minW = 430;
	this.resizer.startH = parseInt(dtDOM.getHeight(this.resizer.elem));
	this.resizer.startW = parseInt(dtDOM.getWidth(this.resizer.elem));
	dtDOM.setStyle(this.resizer.proxy,"height",this.resizer.startH+"px");
	dtDOM.setStyle(this.resizer.proxy,"width",this.resizer.startW+"px");
	dtDOM.setStyle(this.resizer.proxy,"border","1px solid #990000");
	dtDOM.showHide(this.resizer.elem,"none");
	dtDOM.showHide(this.resizer.proxy,"block");
	dtDOM.addEvent(document,"mousemove",g_dtRTE.handleDrag);
	dtDOM.addEvent(document,"mouseup",g_dtRTE.handleDrag);
	if (dtDOM.isMSIE) {
		evt.returnValue = false;
	} else {
		evt.preventDefault();
	}
};
dtRTEcore.prototype.handleDrag = function(e) {
	var evt = e ? e : window.event;
	if (g_dtRTE.resizer.horizontal) {
		var newW = g_dtRTE.resizer.startW + (evt.screenX-g_dtRTE.resizer.startX);
	} else {
		var newW = g_dtRTE.resizer.startW;
	}
	if (g_dtRTE.resizer.vertical) {
		var newH = g_dtRTE.resizer.startH + (evt.screenY-g_dtRTE.resizer.startY);
	} else {
		var newH = g_dtRTE.resizer.startH;
	}
	if (evt.type == "mousemove" && g_dtRTE.resizer.active) {
		if (g_dtRTE.resizer.vertical) dtDOM.setStyle(g_dtRTE.resizer.proxy,"height",newH+"px");
		if (g_dtRTE.resizer.horizontal) dtDOM.setStyle(g_dtRTE.resizer.proxy,"width",newW+"px");
		if (dtDOM.isMSIE) {
			evt.returnValue = false;
		} else {
			evt.preventDefault();
		}
	} else if (evt.type == "mouseup") {
		g_dtRTE.resizer.active = false;
		dtDOM.setStyle(g_dtRTE.resizer.proxy,"border","none");
		dtDOM.showHide(g_dtRTE.resizer.proxy,"none");
		if (g_dtRTE.resizer.vertical) {
			if (newH < g_dtRTE.resizer.minH) newH = g_dtRTE.resizer.minH;
			dtDOM.setStyle(g_dtRTE.resizer.elem,"height",newH+"px");
		}
		if (g_dtRTE.resizer.horizontal) {
			if (newW < g_dtRTE.resizer.minW) newW = g_dtRTE.resizer.minW;
			dtDOM.setStyle(g_dtRTE.resizer.elem,"width",newW+"px");
		}
		dtDOM.showHide(g_dtRTE.resizer.elem,"block");
		dtDOM.removeEvent(document,"mousemove",g_dtRTE.handleDrag);
		dtDOM.removeEvent(document,"mouseup",g_dtRTE.handleDrag);
	}
};
dtRTEcore.prototype.openMediaBrowser = function(eid) {
	if (window["m_browser"] && !window["m_browser"].closed) {
		m_browser.focus();
	} else {
		url = this.url+"_media_browser.php?eid=" + eid;
		if (arguments.length >= 2) {
			var regex = /media_([0-9]+)/;
			if (matches = regex.exec(arguments[1])) {
				var filenum = matches[1];
				url += "&m="+filenum;
			} else {
				url += "&lnk=" + arguments[1];
				if (arguments.length == 3) {
					url += "&cselector=" + arguments[2];
				}
			}
		}
		m_browser = window.open(url,"m_browser","top=80,left=80,width=670,height=400,toolbar=no,menubar=no,scrollbars=yes");
		m_browser.focus();
	}
	return false;
};
dtRTEcore.prototype.openLinkBrowser = function(eid) {
	if (window["l_browser"] && !window["l_browser"].closed) {
		l_browser.focus();
	} else {
		url = this.url+"link_browser.php?eid=" + eid;
		if (arguments.length == 2) {
			url += "&lnk=" + arguments[1];
		}
		l_browser = window.open(url,"l_browser","top=80,left=80,width=650,height=400,toolbar=no,menubar=no,scrollbars=yes");
		l_browser.focus();
	}
	return false;
};
dtRTEcore.prototype.getClipboard = function() {
	var div = getObjectRef("RTEclipboard");
	if (!div) {
		var div = dtDOM.buildElement("DIV","RTEclipboard",{"display":"none","overflow":"hidden","position":"absolute","width":1,"height":1});
		div = document.body.appendChild(div);
	}
	if (dtDOM.isMSIE) {
		div.innerHTML = '';
		var rng = document.body.createTextRange();
		rng.moveToElementText(div);
		rng.execCommand("Paste");
	} else {
		var rng = document.createRange();
		rng.selectNodeContents(div);
		document.execCommand("Paste",false);
	}
	var html = div.innerHTML;
	div.innerHTML = '';
	return html;
}
function dtRTE(uid) {
	this.uid = uid;
	this.eid = "dtRTE_"+(g_rtes.length + 1);
	this.field = "";
	this.form = false;
	this.textarea = false;
	this.iframe = false;
	this.iframediv = false;
	this.iframeWindow = false;
	this.iframeDocument = false;
	this.toolbar = false;
	this.pathbar = false;
	this.selection = false;
	this.hidden = false;
	this.iframeclass = "rteIframe";
	this.height = "300";
	this.width = "600";
	this.buttons = new Array();
	this.buttons.push(new Array("Bold","Italic","Left Justify","Center Text","Right Justify","Full Justify","Insert Ordered List","Insert Unordered List","Indent","Outdent","Insert Media","Create Link","Remove Link","Link Email","Create Anchor"));
	if (!dtDOM.isMSIE6) {
		this.buttons.push(new Array("Text Color","Font Size","Block Formatting","Special Characters","Blockquote","Remove Formatting",/*"Fix Paragraphs",*/"Clean Word","Fullscreen"));
	} else {
		//  skip Fullscreen for IE6
		this.buttons.push(new Array("Text Color","Font Size","Block Formatting","Special Characters","Blockquote","Remove Formatting",/*"Fix Paragraphs",*/"Clean Word"));
	}
	this.colorarr = new Array("#ffcc00","#cc0000","#006633","#0000cc","#000000","#999999","#cccccc","#ffffff");
	if (typeof js_g_colors == "object") this.colorarr = this.colorarr.concat(js_g_colors);
	this.specialchars = new Array("&#162;","&#8364;","&#163;","&#164;","&#165;","&#169;","&#174;","&#8482;","&#247;","&#215;","&#177;","&#188;","&#189;","&#190;","&#176;","&#185;","&#178;","&#179;","&#181;","&#171;","&#187;","&#8216;","&#8217;","&#8249;","&#8250;","&#8218;","&#8222;","&#8220;","&#8221;","&#161;","&#166;","&#167;","&#172;","&#175;","&#182;","&#183;","&#184;","&#191;","&#402;","&#8212;","&#8211;","&#8226;","&#8230;","&#8240;","&#170;","&#186;","&#223;","&#8224;","&#8225;","&#240;","&#208;","&#248;","&#216;","&#254;","&#222;","&#339;","&#338;","&#353;","&#352;","&#180;","&#710;","&#732;","&#168;","&#224;","&#225;","&#226;","&#227;","&#228;","&#229;","&#230;","&#192;","&#193;","&#194;","&#195;","&#196;","&#197;","&#198;","&#231;","&#199;","&#232;","&#233;","&#234;","&#235;","&#200;","&#201;","&#202;","&#203;","&#236;","&#237;","&#238;","&#239;","&#204;","&#205;","&#206;","&#207;","&#241;","&#209;","&#242;","&#243;","&#244;","&#245;","&#246;","&#210;","&#211;","&#212;","&#213;","&#214;","&#249;","&#250;","&#251;","&#252;","&#217;","&#218;","&#219;","&#220;","&#253;","&#255;","&#221;","&#376;");
	this.fsarr = new Array(1,2,3,4,5,6);
	this.fstextarr = new Array("XX Small","Extra Small","Small","Medium","Large","Extra Large");
	this.arrows = new Array(13,45,36,35,33,34,37,38,39,40);
	this.isFullscreen = false;
}
dtRTE.prototype.init = function(f) {
	this.field = f;
	this.textareaStr = this.field+"_"+this.uid;
	this.iframeStr = this.eid+"_iframe";
	this.iframedivStr = this.eid+"_iframediv";
	this.toolbarStr = this.eid+"_toolbar";
	this.getTextarea();
	this.buildIframe();
	this.buildToolbar();
	this.buildPathbar();
	try {
		this.setDesignMode();
	}
	catch(err) { window.status = "Failed to set designMode at init()" };
};
dtRTE.prototype.hide = function() {
	dtDOM.showHide(this.iframediv,"none");
};
dtRTE.prototype.getTextarea = function() {
	this.textarea = getObjectRef(this.textareaStr);
	this.form = this.textarea.form;
	return this.textarea;
};
dtRTE.prototype.getIframeDiv = function() {
	this.iframediv = getObjectRef(this.iframedivStr);
	return this.iframediv;
};
dtRTE.prototype.getIframe = function() {
	this.iframe = getObjectRef(this.iframeStr);
	return this.iframe;
};
dtRTE.prototype.getIframeWindow = function() {
	this.iframeWindow = this.iframe.contentWindow;
	return this.iframeWindow;
};
dtRTE.prototype.getIframeDocument = function() {
	if (dtDOM.isMSIE) {
		this.iframeDocument = this.iframe.contentWindow.document;
		this.iframe.contentWindow.document.eid = this.eid;
	} else {
		this.iframeDocument = this.iframe.contentDocument;
		this.iframe.contentDocument.eid = this.eid;
	}
	return this.iframeDocument;
};
dtRTE.prototype.getToolbar = function() {
	this.toolbar = getObjectRef(this.toolbarStr);
	return this.toolbar;
};
dtRTE.prototype.getTaContent = function() {
	return this.textarea.value;
};
dtRTE.prototype.getIframeContent = function() {
	return this.getIframeDocument().body.innerHTML;
};
dtRTE.prototype.setIframeContent = function(val) {
	this.getIframeDocument().body.innerHTML = val;
};
dtRTE.prototype.setDesignMode = function() {
	this.getIframeDocument().designMode = "On";
};
dtRTE.prototype.buildIframe = function() {
	var ifdiv = dtDOM.buildElement("div",this.iframedivStr,false);
	dtDOM.setStyle(ifdiv,"backgroundColor","transparent");
	var ifrattrs = { src: dtDOM.g_url+"blank.php", "class": this.iframeclass, height: this.height, width: this.width, contentEditable: true };
	var ifr = dtDOM.buildElement("iframe",this.iframeStr,ifrattrs);
	dtDOM.setStyle(ifr,"borderWidth","1px");
	this.iframe = ifdiv.appendChild(ifr);
	var rsodiv = dtDOM.buildElement("div",this.eid+"_iframe_proxy",false);
	rsodiv.appendChild(document.createTextNode("Drag vertically to resize"));
	dtDOM.setStyle(rsodiv,"fontSize","12px");
	dtDOM.setStyle(rsodiv,"textAlign","center");
	dtDOM.setStyle(rsodiv,"display","none");
	ifdiv.appendChild(rsodiv);
	this.iframediv = this.textarea.parentNode.appendChild(ifdiv);
};
dtRTE.prototype.buildToolbar = function() {
	var tbdivattrs = { "class": "rteToolbar" }
	var tbdiv = dtDOM.buildElement("div",this.toolbarStr,tbdivattrs);
	var tbdiv1 = dtDOM.buildElement("div",this.toolbarStr+"_1",{ "class": "rteToolbarRow" });
	for (var i=0;i<this.buttons[0].length;i++) {
		var ab = this.buildButton(this.buttons[0][i]);
		tbdiv1.appendChild(ab);
	}
	tbdiv.appendChild(tbdiv1);
	var tbdiv2 = dtDOM.buildElement("div",this.toolbarStr+"_2",{ "class": "rteToolbarRow" });
	dtDOM.setStyle(tbdiv2,"position","relative");
	for (var i=0;i<this.buttons[1].length;i++) {
		var btitle = this.buttons[1][i];
		var ab = this.buildButton(btitle);
		tbdiv2.appendChild(ab);
		switch(btitle) {
			case "Text Color":
				var attrs = { "class":"hidden" };
				outercdiv = dtDOM.buildElement("div",this.eid+"_colorgrid",attrs);
				var st = { "backgroundColor": "#eeeeee", "border": "1px solid #000000", "padding": "3px", "position": "absolute", "height": "60px", "width": "76px", "top": "24px", "left": "0", "zIndex": "10" };
				dtDOM.setStyle(outercdiv,st);
				for(var j=0;j<this.colorarr.length;j++) {
					var cdiv = dtDOM.buildElement("div",this.eid+"_"+this.colorarr[j].replace("#",""), { "title": this.colorarr[j] } );
					var st = { "backgroundColor": this.colorarr[j], "cssFloat": "left", "styleFloat": "left", "margin": "1px", "height": "16px", "width": "16px" };
					dtDOM.setStyle(cdiv,st);
					dtDOM.setHandler(cdiv,"onmousedown",'g_dtRTE.doExec("'+this.eid+'","forecolor",this.style.backgroundColor);this.parentNode.style.display="none";');
					if (j%4 == 0) dtDOM.setStyle(cdiv,"clear","left");
					outercdiv.appendChild(cdiv);
				}
				tbdiv2.appendChild(outercdiv);
				break;
			case "Special Characters":
				var attrs = { "class":"hidden" };
				outercdiv = dtDOM.buildElement("div",this.eid+"_specialcharsgrid",attrs);
				var st = { "backgroundColor": "#eeeeee", "border": "1px solid #000000", "padding": "3px", "position": "absolute", "width": "264px", "top": "24px", "left": "180px", "zIndex": "10" };
				dtDOM.setStyle(outercdiv,st);
				for(var j=0;j<this.specialchars.length;j++) {
					var cdiv = dtDOM.buildElement("div",false, { "title": this.specialchars[j] } );
					var st = { "backgroundColor": "#ffffff", "cssFloat": "left", "styleFloat": "left", "margin": "1px", "padding": "2px", "height": "16px", "width": "16px", "textAlign": "center" };
					dtDOM.setStyle(cdiv,st);
					cdiv.innerHTML = this.specialchars[j];
					dtDOM.setHandler(cdiv,"onmousedown",'g_dtRTE.doExec("'+this.eid+'","insertHTML","'+this.specialchars[j]+'");this.parentNode.style.display="none";');
					outercdiv.appendChild(cdiv);
				}
				tbdiv2.appendChild(outercdiv);
				break;
		}
	}
	tbdiv.appendChild(tbdiv2);
	this.toolbar = this.iframediv.insertBefore(tbdiv,this.iframe);
};
dtRTE.prototype.buildPathbar = function() {
	var fdivattrs = { "class": "rteFooter", title: "For best results, click on the path element to ensure your selection is accurate" }
	var fdiv = dtDOM.buildElement("div",this.eid+"_footer",fdivattrs);
	var pbresizer = dtDOM.buildElement("img",this.eid+"_resizer", { "class": "rteResize", src: dtDOM.g_url+"images/rte_icons/icon_resize.gif", title: "Click and drag to resize the window" } );
	dtDOM.setStyle(pbresizer,"float","right");
	dtDOM.setStyle(pbresizer,"verticalAlign","baseline");
	dtDOM.setHandler(pbresizer,"onmousedown","g_dtRTE.startVerticalDrag(event,'"+this.eid+"','"+this.eid+"_iframe');");
	fdiv.appendChild(pbresizer);
	var pbdivattrs = { "class": "rtePathbar" }
	var pbdiv = dtDOM.buildElement("div",this.eid+"_pathbar",pbdivattrs);
	this.pathbar = fdiv.appendChild(pbdiv);
	this.iframediv.appendChild(fdiv);
};
dtRTE.prototype.buildButton = function(action) {
	var attrs = { "class": "rteButtonlink" };
	var a = dtDOM.buildElement("A","",attrs);
	attrs = { "class": "rteButton", height: "21", width: "21", alt: action, title: action };
	var b = dtDOM.buildElement("IMG","",attrs);
	dtDOM.addEvent(b,"mousedown",rteMouseDown);
	switch(action) {
		case "Bold":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_bold.gif");
			dtDOM.setAttr(b,"id",this.eid+"_bold");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","bold");');
			a.appendChild(b);
			break;
		case "Italic":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_italic.gif");
			dtDOM.setAttr(b,"id",this.eid+"_italic");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","italic");');
			dtDOM.setStyle(a,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Left Justify":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_justifyleft.gif");
			dtDOM.setAttr(b,"id",this.eid+"_justifyleft");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","justifyleft");');
			a.appendChild(b);
			break;
		case "Center Text":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_justifycenter.gif");
			dtDOM.setAttr(b,"id",this.eid+"_justifycenter");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","justifycenter");');
			a.appendChild(b);
			break;
		case "Right Justify":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_justifyright.gif");
			dtDOM.setAttr(b,"id",this.eid+"_justifyright");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","justifyright");');
			//dtDOM.setStyle(a,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Full Justify":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_justifyfull.gif");
			dtDOM.setAttr(b,"id",this.eid+"_justifyfull");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","justifyfull");');
			dtDOM.setStyle(a,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Insert Ordered List":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_ol.gif");
			dtDOM.setAttr(b,"id",this.eid+"_ol");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","insertorderedlist");');
			a.appendChild(b);
			break;
		case "Insert Unordered List":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_ul.gif");
			dtDOM.setAttr(b,"id",this.eid+"_ul");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","insertunorderedlist");');
			a.appendChild(b);
			break;
		case "Indent":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_indent.gif");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","indent");');
			a.appendChild(b);
			break;
		case "Outdent":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_outdent.gif");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","outdent");');
			dtDOM.setStyle(a,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Insert Media":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_insertimg.gif");
			dtDOM.setAttr(b,"id",this.eid+"_insertimg");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtInsertImage");');
			a.appendChild(b);
			break;
		case "Create Link":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_createlink.gif");
			dtDOM.setAttr(b,"id",this.eid+"_createlink");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtCreateLink");');
			a.appendChild(b);
			break;
		case "Remove Link":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_unlink.gif");
			dtDOM.setAttr(b,"id",this.eid+"_unlink");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","unlink");');
			a.appendChild(b);
			break;
		case "Link Email":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_linkemail.gif");
			dtDOM.setAttr(b,"id",this.eid+"_linkemail");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtMailto");');
			a.appendChild(b);
			break;
		case "Create Anchor":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_anchor.gif");
			dtDOM.setAttr(b,"id",this.eid+"_anchor");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtCreateAnchor");');
			dtDOM.setStyle(b,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Text Color":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_color.gif");
			dtDOM.setAttr(b,"id",this.eid+"_color");
			dtDOM.setStyle(b,"marginRight","10px");
			dtDOM.setHandler(b,"onclick",'return dtDOM.showHide("'+this.eid+'_colorgrid");');
			a.appendChild(b);
			break;
		case "Font Size":
			a = dtDOM.buildElement("SELECT",this.eid+"_fontsize");
			dtDOM.setStyle(a,"marginRight","10px");
			dtDOM.setHandler(a,"onchange",'return g_dtRTE.doExec("'+this.eid+'","fontsize",this.options[this.selectedIndex].value);');
			b = dtDOM.buildElement("OPTION","");
			dtDOM.setAttr(b,"value","");
			b.appendChild(document.createTextNode("-- Font Size --"));
			a.appendChild(b);
			for(var i=0;i<this.fsarr.length;i++) {
				b = dtDOM.buildElement("OPTION",this.eid+"_fs_"+this.fsarr[i]);
				dtDOM.setAttr(b,"value",this.fsarr[i]);
				b.appendChild(document.createTextNode(this.fstextarr[i]));
				a.appendChild(b);
			}
			break;
		case "Block Formatting":
			a = dtDOM.buildElement("SELECT",this.eid+"_block");
			dtDOM.setAttr(a,"name",this.eid+"_block");
			dtDOM.setHandler(a,"onchange",'return g_dtRTE.doExec("'+this.eid+'","formatblock",this.options[this.selectedIndex].value);');
			dtDOM.setStyle(a,"marginRight","10px");
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","");
			b.appendChild(document.createTextNode("-- Block Formatting --"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","p");
			b.appendChild(document.createTextNode("Paragraph"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","<h2>");
			b.appendChild(document.createTextNode("Headline"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","<h3>");
			b.appendChild(document.createTextNode("Subhead"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","<h4>");
			b.appendChild(document.createTextNode("Tinyhead"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","<h6>");
			b.appendChild(document.createTextNode("Caption"));
			a.appendChild(b);
			b = dtDOM.buildElement("OPTION");
			dtDOM.setAttr(b,"value","<pre>");
			b.appendChild(document.createTextNode("Preformatted"));
			a.appendChild(b);
			break;
		case "Special Characters":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_specialchars.gif");
			dtDOM.setAttr(b,"id",this.eid+"_specialchars");
			dtDOM.setHandler(b,"onclick",'return dtDOM.showHide("'+this.eid+'_specialcharsgrid");');
			a.appendChild(b);
			break;
		case "Blockquote":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_blockquote.gif");
			dtDOM.setAttr(b,"id",this.eid+"_blockquote");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtBlockquote");');
			dtDOM.setStyle(b,"marginRight","10px");
			a.appendChild(b);
			break;
		case "Remove Formatting":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_unformat.gif");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","removeformat");');
			a.appendChild(b);
			break;
		case "Fix Paragraphs":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_fixparagraphs.gif");
			dtDOM.setAttr(b,"title","Add paragraph tags to replace double carriage returns");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtFixParagraphs");');
			a.appendChild(b);
			break;
		case "Paste Word":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_fixparagraphs.gif");
			dtDOM.setAttr(b,"title","Clean up Word HTML before pasting");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtPasteWord");');
			a.appendChild(b);
			break;
		case "Clean Word":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_cleanword.gif");
			dtDOM.setAttr(b,"title","Clean formatting after pasting from a Word document");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","dtCleanUp");');
			a.appendChild(b);
			break;
		case "Fullscreen":
			dtDOM.setAttr(b,"src",dtDOM.g_url+"images/rte_icons/icon_fullscreen.gif");
			dtDOM.setAttr(b,"title","Toggle fullscreen mode");
			dtDOM.setHandler(b,"onclick",'return g_dtRTE.doExec("'+this.eid+'","fullscreen");');
			a.appendChild(b);
			dtDOM.setStyle(a,"marginLeft","20px");
			break;
	}
	return a;
};
dtRTE.prototype.getSel = function() {
	if (!this.iframeWindow) this.getIframeWindow();
	if (this.iframeWindow.getSelection) {
		var sel = this.iframeWindow.getSelection();
	} else if (this.iframeDocument.getSelection) {
		var sel = this.iframeDocument.getSelection();
	} else if (this.iframeDocument.selection) {
		var sel = this.iframeDocument.selection;
	}
	this.selection = new dtRTEselection(this,sel);
	return this.selection;
};
dtRTE.prototype.contentFromEditor = function() {
	this.textualizePlaceholders();
	var content = this.getIframeContent();
	content = this.rgbToHex(content);
	if (content != "" && content.toLowerCase() != '<br>') {
		// MSIE only uses "<P>", so put returns before it
		if (dtDOM.isMSIE) {
			p_replace = "\r\n<p>";
			content = content.replace(/<p>/gi,p_replace);
			br_replace = "<br>\r\n";
		} else {
			// everything else uses a container, so put returns only after the close
			p_replace = "</p>\n\n";
			content = content.replace(/<\/p>/gi,p_replace);
			br_replace = "<br>\n";
		}
		content = content.replace(/<br>/gi,br_replace);
		content = content.replace(/<br>$/gi,"");
		this.textarea.value = content;
	}
};
dtRTE.prototype.contentToEditor = function() {
	var content = this.getTaContent();
	if (content != "") {
		var p_regex,br_regex;
		if (dtDOM.isMSIE) {
			p_regex = /[\r\n]{2} *[\r\n]{2}/g;
			br_regex = /[\r\n] *[\r\n]/g;
		} else {
			p_regex = /[\r\n] *[\r\n]/g;
			br_regex = /[\r\n]/g;
		}
		if (content.toLowerCase().indexOf('<br') == -1 && content.toLowerCase().indexOf('<p') == -1) {
			// un-HTMLized plain text, so do simple conversion of line breaks and paragraphs
			content = content.replace(p_regex,"<p>");
			content = content.replace(br_regex,"<br>");
		} else {
			// already-HTMLized plain text, so strip out superfluous line breaks
			content = content.replace(p_regex,"");
			content = content.replace(br_regex,"");
		}
		content = this.makePlaceholderImages(content);
	}
	this.setIframeContent(content);
	this.removeEmptySpans();
	this.textarea.blur();
};
dtRTE.prototype.cleanContent = function() {
	this.textualizePlaceholders();
	this.fontsToSpans();
	var c = this.getIframeContent();
	c = c.replace(/<p>\s*<\/p>/g, "");
	c = c.replace(/<a href="[^"]+"><\/a>/g, "");
	c = c.replace(/<p>\s*<br ?\/?>\s*<\/p>/g, "<p>&nbsp;</p>");
	c = c.replace(/<div>\s*<br ?\/?>\s*<\/p>/g, "");
	if (dtDOM.isSafari) {
		c = this.fixSafariSpans(c);
	}
	this.setIframeContent(c);
};
dtRTE.prototype.fontsToSpans = function() {
	var fonts = this.iframeDocument.getElementsByTagName("FONT");
	var sizes = new Array("xx-small","x-small","small","medium","large","x-large","xx-large");
	for(var i=0;i<fonts.length;i++) {
		var fFamily = dtDOM.getAttr(fonts[i],"family");
		var fSize = dtDOM.getAttr(fonts[i],"size");
		var fColor = dtDOM.getAttr(fonts[i],"color");
		var fInner = fonts[i].innerHTML;
		var s = dtDOM.buildElement("SPAN","",false,this.iframeDocument);
		if (fFamily) dtDOM.setStyle(s,"fontFamily",fFamily);
		if (fSize) dtDOM.setStyle(s,"fontSize",sizes[fSize]);
		if (fColor) dtDOM.setStyle(s,"color",fColor);
		s.innerHTML = fInner;
		fonts[i].parentNode.replaceChild(s,fonts[i]);
	}
};
dtRTE.prototype.fixSafariSpans = function(str) {
	str = str.replace(/ class="apple-style-span"/gi, "");
	return str;
};
dtRTE.prototype.removeEmptySpans = function() {
	var spans = this.iframeDocument.getElementsByTagName("SPAN");
	for(var i=spans.length-1;i>=0;i--) {
		dtalert("Spans["+i+"] has a style of "+dtDOM.getAttr(spans[i],"style").cssText);
		if (dtDOM.getAttr(spans[i],"style").cssText == "" && dtDOM.getAttr(spans[i],"class") == "") {
			var span_inner = spans[i].innerHTML;
			dtalert("Removing empty spans found innerHTML of "+span_inner);
			this.selection.setByNode(spans[i]);
			this.selection.replaceSelf(span_inner);
		}			
	}
};
dtRTE.prototype.rgbToHex = function(str) {
	function toHex(N) {
		if (N == null) return "00";
		N = parseInt(N);
		if (N==0 || isNaN(N)) return "00";
		N = Math.max(0,N);
		N = Math.min(N,255);
		N = Math.round(N);
		return "0123456789ABCDEF".charAt((N-N%16)/16) + "0123456789ABCDEF".charAt(N%16);
	}
	var regex = /rgb\s?\(([0-9]+),\s?([0-9]+),\s?([0-9]+)\)/gi;
	var rgbarray;
	while ((rgbarray = regex.exec(str)) != null) {
		var hex = toHex(rgbarray[1]) + toHex(rgbarray[2]) + toHex(rgbarray[3]);
 		str = str.replace(rgbarray[0],"#"+hex);
	}
	return str;
};
dtRTE.prototype.textualizePlaceholders = function() {
	// replaces media_n placeholder images with media_n text
	// or removes the "placeholder" class from the media_n tag
	var doc = this.iframeDocument;
	var imgs = doc.getElementsByTagName("img");
	if (imgs.length) {
		// go in reverse order, since as we replace images with text, the DOM updates
		for(var i=(imgs.length-1);i>=0;i--) {
			var title = dtDOM.getAttr(imgs[i],"title");
			if (title == "placeholder") {
				var imgid = dtDOM.getAttr(imgs[i],"id");
				var incfile = /media_[0-9]+/;
				m = incfile.exec(imgid);
				if (m != null) {
					var txtNode = doc.createTextNode("#"+m[0]+"#");
					imgs[i].parentNode.replaceChild(txtNode,imgs[i]);
				}
			}
		}
	}
}
dtRTE.prototype.makePlaceholderImages = function(str) {
	// convert the #media_123# placeholders to actual image tags
	var url,ph,cselectortxt,picsize,hw;
	var regex = /#(media_([0-9]+))#/;
	var classtxt = "placeholder imagebox";
	var hw = 60;
	while ((matches = regex.exec(str)) != null) {
		var phimg = false;
		var filenum = matches[2];
		// if the images were just added in the current session
		// then they are already in the img_array array
		var found = inDeepArray(g_dtRTE.img_array,"hashid",filenum);
		if (found !== false) {
			phimg = g_dtRTE.img_array[found];
		} else if (getObjectRef("imgarr_"+filenum) != false) {
			// otherwise we have to get them from hidden fields on the page
			phimg = new Object();
			phimg.src = ed.form["imgarr_"+filenum+"_src"].value;
			phimg.hashid = filenum;
			phimg.cselector = ed.form["imgarr_"+filenum+"_cselector"].value;
			phimg.embed_thumb = ed.form["imgarr_"+filenum+"_embed_thumb"].value;
			phimg.alt_text = ed.form["imgarr_"+filenum+"_alt_text"].value;
			phimg.media_id = ed.form["imgarr_"+filenum+"_objectid"].value;
			g_dtRTE.img_array[g_dtRTE.img_array.length] = phimg;
		}
		// in theory, we could get an orphaned #media_n# where the hash_media record is gone
		// so don't break!
		if (phimg != false) {
			classtxt += " "+phimg.cselector;
			if (phimg.embed_thumb != 'thumb') {
				classtxt += " placelarge";
				hw = 120;
			}
			var repltxt = '<img id="'+matches[1]+'" src="'+phimg.src+'" class="'+classtxt+'" height="'+hw+'" width="'+hw+'" alt="'+phimg.alt_text+'" title="placeholder" />';
			str = str.replace(matches[0],repltxt);
		} else {
			str = str.replace(matches[0],"[BROKEN REFERENCE TO MEDIA_HASH OBJECT "+filenum+"]");
		}
	}
	return str;
};
dtRTE.prototype.addPlaceholderClasses = function() {
	// add "placeholder" (and optionally "placelarge") class to #media_n# images
	var doc = this.iframeDocument;
	var imgs = doc.getElementsByTagName("img");
	if (imgs.length) {
		var regex = /(media_[0-9]+);?([a-z]+)?;?(large|thumb)?/;
		// go in reverse order, since as we replace images with text, the DOM updates
		for(var i=(imgs.length-1);i>=0;i--) {
			var alt = dtDOM.getAttr(imgs[i],"alt");
			if (ph = regex.exec(alt) != null) {
				dtDOM.addClass(imgs[i],"placeholder");
				if (typeof ph[3] != "undefined" && ph[3] == "large") {
					dtDOM.addClass(imgs[i],"placelarge");
				}
			}
		}
	}
};
function dtRTEselection(ed,sel) {
	this.editor = ed;
	this.selection = sel;
	this.collapsed = false;
	this.isControl = false;
	this.linkNode = null;
	this.controlNode = null;
	this.rng = false;
	this.text = "";
	this.htmltext = "";
	this.parentElement = false;
	if (dtDOM.isMSIE) {
		this.rng = sel.createRange();
		if (sel.type == "None" || this.rng.htmlText == "") this.collapsed = true;
		// if type is "Control" (the resizable image box), grab the contents
		// temporarily disabled with if (false)
		if (sel.type == "Control") {
			this.isControl = true;
			this.controlNode = this.rng(0);
			this.htmltext = this.rng(0).outerHTML;
			this.parentElement = this.rng(0).parentElement;
			if (this.parentElement.tagName == "BODY") {
				this.rng = this.parentElement.createTextRange();
			} else {
				this.rng = this.editor.getIframeDocument().body.createTextRange();
			}
			this.setByNode(this.controlNode);
		} else {
			this.text = this.rng.text;
			this.htmltext = this.rng.htmlText;
			this.parentElement = this.rng.parentElement();
		}
	} else {
		this.rng = sel.getRangeAt(0);
		this.collapsed = this.rng.collapsed;
		dtalert('My selection object has a collapsed state of '+this.collapsed+' and a range starting in a '+this.rng.startContainer+' tag.');
		this.text = this.rng.toString();
		this.parentElement = this.rng.commonAncestorContainer;
		if (this.parentElement.nodeType != 1) {
			this.parentText = this.parentElement;
			this.parentElement = this.parentText.parentNode;
		}
		if (!this.collapsed) {
			this.getDoubleclickElement();
		}
	}
};
dtRTEselection.prototype.setByNode = function(node,contents,after) {
	if (dtDOM.isMSIE) {
		this.rng.moveToElementText(node);
		this.rng.select();
	} else {
		this.selection.removeAllRanges();
		if (contents) {
			this.rng.selectNodeContents(node);
		} else {
			this.rng.selectNode(node);
		}
		if (after) {
			this.rng.collapse(false);
		} else {
			this.selection.addRange(this.rng);
		}
	}
	dtalert('After setByNode for '+node.nodeName+', selection anchorNode: '+this.selection.anchorNode.nodeName);
	dtalert('After setByNode, selection anchorOffset: '+this.selection.anchorOffset);
	dtalert('After setByNode, selection focusNode: '+this.selection.focusNode.nodeName);
	dtalert('After setByNode, selection focusOffset: '+this.selection.focusOffset);
	dtalert('After setByNode, selection isCollapsed: '+this.selection.isCollapsed);
	dtalert('After setByNode, selection type: '+this.selection.type);
	dtalert('After setByNode, selection range startContainer: '+this.rng.startContainer.nodeName);
	dtalert('After setByNode, selection range startOffset: '+this.rng.startOffset);
	dtalert('After setByNode, selection range endContainer: '+this.rng.endContainer.nodeName);
	dtalert('After setByNode, selection range endOffset: '+this.rng.endOffset);
	dtalert('After setByNode, selection range collapsed: '+this.rng.collapsed);
	dtalert('After setByNode, selection range commonAncestorContainer: '+this.rng.commonAncestorContainer);
};
dtRTEselection.prototype.replaceSelf = function(c) {
	this.rng.deleteContents();
	var frag = this.rng.createContextualFragment(c);
	this.rng.insertNode(frag);
};
dtRTEselection.prototype.getDoubleclickElement = function() {
	if (dtDOM.isMSIE) {
	} else {
		if (this.rng.startContainer.nodeType == 3 && (this.rng.startOffset == 0 || this.rng.startOffset == this.rng.startContainer.length) && this.rng.endContainer.nodeType == 3 && this.rng.endOffset == 0) {
			if (this.rng.startContainer.nextSibling == this.rng.endContainer.previousSibling) {
				this.doubleclickElement = this.rng.startContainer.nextSibling;
			} else if (this.rng.startContainer.parentNode == this.rng.endContainer.previousSibling) {
				this.doubleclickElement = this.rng.startContainer.parentNode;
			}
		}
	}
};
function rangeIntersectsNode(range, node) {
	var nodeRange = node.ownerDocument.createRange();
	try {
		nodeRange.selectNode(node);
	}
	catch (e) {
		nodeRange.selectNodeContents(node);
	}
	return range.compareBoundaryPoints(Range.END_TO_START, nodeRange) == -1 && range.compareBoundaryPoints(Range.START_TO_END, nodeRange) == 1;
}
dtRTEselection.prototype.containsLink = function() {
	var r = null;
	if (this.parentElement.nodeName == "A") return this.parentElement;
	if (this.parentElement.nodeName != "BODY") {
		var r = dtDOM.seekParentElement(this.parentElement,"A");
		if (r == null) {
			if (this.parentText) {
				r = dtDOM.seekChildElement(this.parentText,"A");
			} else if (!dtDOM.isMSIE) {
				tempr = dtDOM.seekChildElement(this.parentElement,"A");
				if (tempr != null && rangeIntersectsNode(this.rng,tempr)) {
					r = tempr;
				}
			}
		}
	}
	return r;
};
function rangeCompareNode(range, node) {
	var nodeRange = node.ownerDocument.createRange();
	try {
		nodeRange.selectNode(node);
	}
	catch (e) {
		nodeRange.selectNodeContents(node);
	}
	var nodeIsBefore = range.compareBoundaryPoints(Range.START_TO_START, nodeRange) == 1;
	var nodeIsAfter = range.compareBoundaryPoints(Range.END_TO_END, nodeRange) == -1;
	if (nodeIsBefore && !nodeIsAfter) return 0;
	if (!nodeIsBefore && nodeIsAfter) return 1;
	if (nodeIsBefore && nodeIsAfter) return 2;
	return 3;
}
dtRTEselection.prototype.expandToLink = function(linknode) {
	if (dtDOM.isMSIE) {
	} else {
		if (rangeCompareNode(this.rng,linknode) == 2) {
			dtalert("Extending range backwards and forwards");
			this.rng.selectNode(linknode);
			this.selection.addRange(this.rng);
		} else {
			var arng = this.editor.iframeDocument.createRange();
			arng.selectNode(linknode);
			if (arng.compareBoundaryPoints(arng.START_TO_START,this.rng) == -1) {
				dtalert("Extending range backwards");
				this.rng.setStart(this.parentElement,arng.startOffset);
				this.selection.addRange(this.rng);
			} else if (arng.compareBoundaryPoints(arng.END_TO_END,this.rng) == 1) {
				dtalert("Extending range forwards");
				this.rng.setEnd(this.parentElement,arng.endOffset);
				this.selection.addRange(this.rng);
			}
		}
	}
	this.linkNode = linknode;
	return true;
};
function rteToggleButton(obj) {
	if (dtDOM.getAttr(obj,"class").indexOf("pressed") != -1) {
		dtalert("Button is pressed, unsetting");
		dtDOM.removeClass(obj,"pressed");
	} else {
		dtalert("Button is not pressed, setting");
		dtDOM.addClass(obj,"pressed");
	}
}
function rteMouseOver(e) {
	var evt = e ? e : window.event; 
	if (dtDOM.isMSIE) {
		targ = evt.srcElement;
	} else {
		targ = evt.target;
	}
	targ.style.borderBottomColor = "#999999";
	targ.style.borderRightColor = "#999999";
}
function rteMouseOut(e) {
	var evt = e ? e : window.event; 
	if (dtDOM.isMSIE) {
		targ = evt.srcElement;
	} else {
		targ = evt.target;
	}
	targ.style.borderBottomColor = "#eeeeee";
	targ.style.borderRightColor = "#eeeeee";
}
function rteMouseDown(e) {
	var evt = e ? e : window.event; 
	if (evt.returnValue) {
		evt.returnValue = false;
	} else if (evt.preventDefault) {
		evt.preventDefault( );
	} else {
		return false;
	}
}
function rteInsertMediaURL(eid,str,cselector) {
	if (eid == "") return false;
	var ed = g_dtRTE.instances[eid];
	if (str.lastIndexOf("/") != -1) {
		var altstr = str.substr(str.lastIndexOf("/")+1);
	} else {
		var altstr = str;
	}
	if (ed.selection && ed.selection.collapsed) {
		if (dtDOM.isMSIE) {
			var cselectortxt = cselector ? " "+cselector : "";
			var txt = '<img src="'+str+'" class="imagebox'+cselectortxt+'" alt="'+altstr+'">';
			ed.selection.rng.pasteHTML(txt);
		} else {
			var ph = dtDOM.buildElement("IMG","", { "src": str, "class": "imagebox", "alt": altstr },ed.getIframeDocument());
			if (cselector != "") dtDOM.addClass(ph,cselector);
			ed.selection.rng.insertNode(ph);
		}
	} else {
		alert("There is currently text selected. Please deselect the text and leave only an insertion point.");
	}
	return false;
}
function rteInsertMediaHashPlaceholder(eid,i) {
	if (eid == "") return false;
	// copy the image object locally (IE7 seems to think that the i passed in "belongs" to the popup window...
	// despite trying to append i to g_dtRTE.img_array, after this function finishes execution, the object acts like it's empty
	phimg = new Object();
	phimg.src = i.src;
	phimg.hashid = i.hashid;
	phimg.cselector = i.cselector;
	phimg.embed_thumb = i.embed_thumb;
	phimg.alt_text = i.alt_text;
	phimg.media_id = i.media_id;

	var ed = g_dtRTE.instances[eid];
	// save the image object in a javascript array for later access
	var found = inDeepArray(g_dtRTE.img_array,"hashid",i.objectid);
	if (found !== false) {
		g_dtRTE.img_array[found] = phimg;
	} else {
		g_dtRTE.img_array[g_dtRTE.img_array.length] = phimg;
	}
	
	var hw = 60;
	var classtxt = "placeholder imagebox";
	if (i.cselector != "thumb") hw = 120;
	if (ed.focusedElement && ed.focusedElement.nodeName == "IMG") {
		ed.getSel();
		if (dtDOM.isMSIE) {
			if (i.cselector != "none") classtxt += " "+i.cselector;
			if (i.embed_thumb != "thumb") classtxt += " placelarge";
			ed.selection.rng.pasteHTML('<img id="media_'+i.objectid+'" src="'+i.src+'" class="'+classtxt+'" alt="'+i.alt_text+'" title="placeholder" />');
		} else {
			dtalert("Attempting to replace existing focusedElement IMG");
			dtalert('The editor selection object has a collapsed state of '+ed.selection.collapsed+' and a range starting in a '+ed.selection.rng.startContainer+' tag.');
			var ph = dtDOM.buildElement("IMG","media_"+i.objectid,{ "src": i.src, "class": classtxt, "alt": i.alt_text, "title": "placeholder" },ed.getIframeDocument());
			if (i.cselector != "none") dtDOM.addClass(ph,i.cselector);
			if (i.embed_thumb != "thumb") dtDOM.addClass(ph,"placelarge");
			try {
				ed.selection.rng.deleteContents();
				ed.selection.rng.insertNode(ph);
			}
			catch(e) {
				dtalert("Error "+e.name+": "+e.message);
			}
		}
	} else if (ed.selection && ed.selection.collapsed) {
		if (dtDOM.isMSIE) {
			if (i.cselector != "none") classtxt += " "+i.cselector;
			if (i.embed_thumb != "thumb") classtxt += " placelarge";
			ed.selection.rng.pasteHTML('<img id="media_'+i.objectid+'" src="'+i.src+'" class="'+classtxt+'" alt="'+i.alt_text+'" title="placeholder" />');
		} else {
			var ph = dtDOM.buildElement("IMG","media_"+i.objectid,{ "src": i.src, "class": classtxt, "alt": i.alt_text, "title": "placeholder" },ed.getIframeDocument());
			dtalert("Attempting to insert new IMG from "+dtDOM.getAttr(ph,"src"));
			if (i.cselector != "none") dtDOM.addClass(ph,i.cselector);
			if (i.embed_thumb != "thumb") dtDOM.addClass(ph,"placelarge");
			try {
				ed.selection.rng.insertNode(ph);
			}
			catch(e) {
				dtalert('Error '+e.name+': '+e.message);
			}
		}
	} else {
		alert("There is currently text selected. Please deselect the text and leave only an insertion point.");
	}
	return false;
}
function rteInsertMediaPlaceholder(eid,url,str,cselector,scale) {
	if (eid == "") return false;
	var ed = g_dtRTE.instances[eid];
	var hw = 60;
	var alt = str+";"+cselector+";"+scale;
	var classtxt = "placeholder imagebox";
	if (url == "") {
		// this is a #file_n# reference, so build a placeholder graphic
		url = dtDOM.g_url+"images/rte_icons/placeholder.gif";
		alt = "placeholder";
		// change placeholder/images menu to "placeholders" if possible
		if (ed.form.form_embedded_media) dtDOM.setSelectByValue(ed.form.form_embedded_media,"placeholders");
		// get the cselector settings from the options/caption section
		try {
			var regex = /file_([0-9]+)/;
			var matches = regex.exec(str);
			var filenum = matches[1];
			var cselectorgrp = ed.form["form_cselector["+filenum+"]"];
			for(var i=0;i<cselectorgrp.length;i++) {
				if (cselectorgrp[i].checked) {
					cselector = cselectorgrp[i].value;
					break;
				}
			}
			var sizegrp = ed.form["form_embed_thumb["+filenum+"]"];
			// sizegrp[1] is "thumb"
			if (!sizegrp[1].checked) {
				scale = 'large';
			}
		}
		catch(e) {}
	}
	if (scale == "large") hw = 120;
	if (ed.selection && ed.selection.collapsed) {
		if (dtDOM.isMSIE) {
			if (cselector != "none") classtxt += " "+cselector;
			if (scale == "large") classtxt += " placelarge";
			ed.selection.rng.pasteHTML('<img id="'+str+'" src="'+url+'" class="'+classtxt+'" alt="'+alt+'" />');
		} else {
			var ph = dtDOM.buildElement("IMG",str,{ "src": url, "class": classtxt, "alt": alt });
			if (cselector != "none") dtDOM.addClass(ph,cselector);
			if (scale == "large") dtDOM.addClass(ph,"placelarge");
			ed.selection.rng.insertNode(ph);
		}
	} else if (ed.focusedElement && ed.focusedElement.nodeName == "IMG") {
		if (dtDOM.isMSIE) {
			if (cselector != "none") classtxt += " "+cselector;
			if (scale == "large") classtxt += " placelarge";
			ed.selection.rng.pasteHTML('<img id="'+str+'" src="'+url+'" class="'+classtxt+'" alt="'+alt+'" />');
		} else {
			var ph = dtDOM.buildElement("IMG",str,{ "src": url, "class": classtxt, "alt": alt });
			if (cselector != "none") dtDOM.addClass(ph,cselector);
			if (scale == "large") dtDOM.addClass(ph,"placelarge");
			ed.selection.rng.deleteContents();
			ed.selection.rng.insertNode(ph);
		}
	} else {
		alert("There is currently text selected. Please deselect the text and leave only an insertion point.");
	}
	return false;
}
function rteInsertLink(eid,path,newwin,add_g_url) {
	var ed = g_dtRTE.instances[eid];
	if (!ed.selection || ed.selection.collapsed) {
		alert("There is no text currently selected for the link.");
		return false;
	}
	if (add_g_url) path = dtDOM.g_url + path;
	if (dtDOM.isMSIE) {
		if (newwin) {
			if (ed.selection.htmltext) {
				contents = ed.selection.htmltext;
			} else {
				contents = ed.selection.text;
			}
			var txt = '<a href="'+path+'" onclick="return newWindow(this.href);">'+contents+'</a>';
			ed.selection.rng.pasteHTML(txt);
		} else {
			g_dtRTE.doExec(eid,'createlink',path);
		}
	} else {
		if (ed.selection.linkNode != null) {
			dtDOM.setAttr(ed.selection.linkNode,"href",path);
			if (newwin) {
				dtDOM.setHandler(ed.selection.linkNode,"onclick","return newWindow(this.href);");
			} else {
				dtDOM.setHandler(ed.selection.linkNode,"onclick",false);
			}
		} else {
			var lnk = dtDOM.buildElement("A","", { "href": path }, ed.iframeDocument);
			if (newwin) dtDOM.setHandler(lnk,"onclick","return newWindow(this.href);");
			try {
				ed.selection.rng.surroundContents(lnk);
			} catch(e) { dtalert(e.message) }
		}
	}
}
function rteMimeChange(val) {
	if (val == g_dtRTE.mimeIndex) return false;
	if (val == 'rte') {
		g_dtRTE.showEditor();
	} else {
		g_dtRTE.hideEditor();
	}
	g_dtRTE.mimeIndex = val;
	return false;
}
