
// Cross-Browser Rich Text Editor
// Version 3.08
// Written by Kevin Roth (http://www.kevinroth.com/rte/)
// Visit the support forums at http://www.kevinroth.com/forums/index.php?c=2
// License: http://creativecommons.org/licenses/by/2.5/

//init globals
var lang = "en";
var encoding = "UTF-8";
var debugMode = true;
var isRichText = false;
var defaultWidth = 500;
var defaultHeight = 200;
var allRTEs = "";
var currentRTE = "";
var selectionText = "";
var rng;
var lastCommand;
var maxLoops = 20;
var loopCnt = 0;
//var baseUrl = window.parent.document.location.protocol + "//" + document.domain + "/";
var baseUrl = document.location.href.match(/.+\//);
var jsProjectRef = "";
var jsCacheId = "";
var jsSession = "";

var cssFile = "";
var generateXHTML = true;
var encodeHTML = false;

//browser vars
var ua = navigator.userAgent.toLowerCase();
var isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1));
var ieVersion = parseFloat(ua.substring(ua.indexOf('msie ') + 5));
var isGecko = (ua.indexOf("gecko") != -1);
var isSafari = (ua.indexOf("safari") != -1);
//var safariVersion = parseFloat(ua.substring(ua.lastIndexOf("safari/") + 7));
var webkitVersion = get_webkit_version();
if (webkitVersion) {
	webkitVersion = webkitVersion["major"];
} else {
	webkitVersion = null;
}
var isKonqueror = (ua.indexOf("konqueror") != -1);
var konquerorVersion = parseFloat(ua.substring(ua.indexOf('konqueror/') + 10));
var isOpera = (ua.indexOf("opera") != -1);
var isNetscape = (ua.indexOf("netscape") != -1);
var netscapeVersion = parseFloat(ua.substring(ua.lastIndexOf('/') + 1));

//command vars
var toolbar1Enabled = true;
var toolbar2Enabled = true;

var cmdFormatBlockEnabled = true;
var cmdFontNameEnabled = true;
var cmdFontSizeEnabled = true;
var cmdIncreaseFontSizeEnabled = false;
var cmdDecreaseFontSizeEnabled = false;

var cmdBoldEnabled = true;
var cmdItalicEnabled = true;
var cmdUnderlineEnabled = true;
var cmdStrikethroughEnabled = true;
var cmdSuperscriptEnabled = true;
var cmdSubscriptEnabled = true;

var cmdJustifyLeftEnabled = true;
var cmdJustifyCenterEnabled = true;
var cmdJustifyRightEnabled = true;
var cmdJustifyFullEnabled = true;

var cmdInsertHorizontalRuleEnabled = true;
var cmdInsertOrderedListEnabled = true;
var cmdInsertUnorderedListEnabled = true;

var cmdOutdentEnabled = true;
var cmdIndentEnabled = true;
var cmdForeColorEnabled = true;
var cmdHiliteColorEnabled = true;
var cmdInsertHTMLEnabled = true;
var cmdSpellCheckEnabled = false;
var cmdCreateLinkEnabled = true;
var cmdInsertImageEnabled = true;

var cmdCutEnabled = true;
var cmdCopyEnabled = true;
var cmdPasteEnabled = true;
var cmdUndoEnabled = true;
var cmdRedoEnabled = true;
var cmdRemoveFormatEnabled = true;
var cmdUnlinkEnabled = true;


function RTEinit(css, genXHTML, encHTML)
{
	//set browser vars
	try {
		//set global vars
		cssFile = css;
		generateXHTML = genXHTML;
		if (encHTML) encodeHTML = true;

		//check to see if designMode mode is available and disable unsupported commands
		if (document.designMode) {
			if (document.getElementById && !isIE && !isSafari && !isKonqueror) {
				isRichText = true;
				if (isGecko || isOpera) {
					cmdIncreaseFontSizeEnabled = true;
					cmdDecreaseFontSizeEnabled = true;
					cmdCutEnabled = false;
					cmdCopyEnabled = false;
					cmdPasteEnabled = false;
				}
				if (isNetscape && netscapeVersion < 8) {
					cmdInsertHTMLEnabled = false;
				}
			} else if (isIE && ieVersion >= 5.5) {
				isRichText = true;
				cmdSpellCheckEnabled = true;
			} else if (isSafari) {
				if (webkitVersion >= 420) {
					isRichText = true;
				} else if (webkitVersion >= 312) {
					//Safari 1.3+ is capable of designMode, Safari 1.3 = webkit build 312
					isRichText = true;
					toolbar1Enabled = false;
					cmdStrikethroughEnabled = false;
					cmdJustifyFullEnabled = false;
					cmdInsertHorizontalRuleEnabled = false;
					cmdInsertOrderedListEnabled = false;
					cmdInsertUnorderedListEnabled = false;
					cmdOutdentEnabled = false;
					cmdIndentEnabled = false;
					cmdInsertImageEnabled = false;
					cmdPasteEnabled = false;
					cmdInsertHTMLEnabled = false;
					cmdCreateLinkEnabled = false;
					cmdUnlinkEnabled = false;
					cmdRemoveFormatEnabled = false;
				}
			}
		}

		//MMM: z-index:10000
		if (isRichText) {
			document.write('<style type="text/css">@import "/Scriptor/bos/rendererJSrte.xd/httprtecss/2591739828.css";</style>');
			document.write('<iframe width="150" height="100" id="cp" src="/Scriptor/bos/rendererJSrte.xd/httppalette/2591739828.htm" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="visibility:hidden; position: absolute;z-index:10000"></iframe>');
			if (isIE) {
				document.onmouseover = raiseButton;
				document.onmouseout  = normalButton;
				document.onmousedown = lowerButton;
				document.onmouseup   = raiseButton;
			}
		}

		//for testing standard textarea, uncomment the following line
		//isRichText = false;
	} catch (e) {
		if (debugMode) alert("1"+e);
	}
}


function enableDesignMode(rte, html, readOnly) {
	try {
		var frameHtml = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
		frameHtml += "<html id=\"" + rte + "\" xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n";
		frameHtml += "<head>\n";
        frameHtml += "";
		frameHtml += "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n";
		frameHtml += "<base href=\"" + baseUrl + "\" />\n";
		frameHtml += "<style type=\"text/css\">\n";
		if (cssFile.length > 0) {
			frameHtml += "@import url(" + cssFile + ");\n";
		} else {
			frameHtml += "body {\n";
			frameHtml += "	background: #FFF;\n";
			frameHtml += "	margin: 0px;\n";
			frameHtml += "	padding: 0px;\n";
    		frameHtml += "  Font-size: 10px;\n";
    		frameHtml += "  FONT-FAMILY:  Verdana;\n";
			frameHtml += "}\n";
		}
		frameHtml += "</style>\n";
		frameHtml += "</head>\n";
		frameHtml += "<body>\n";
		frameHtml += html + "\n";
		frameHtml += "</body>\n";
		frameHtml += "</html>";

		var oRTE = document.getElementById(rte);
		try {
			if (isGecko) {
				if (!readOnly) oRTE.contentDocument.designMode = "on";
				try {
					var oRTEDoc = oRTE.contentWindow.document;
					oRTEDoc.open("text/html","replace");
					oRTEDoc.write(frameHtml);
					oRTEDoc.close();
					if (!readOnly) oRTEDoc.addEventListener("keypress", geckoKeyPress, true);
				} catch (e) {
					alert("2.Error preloading content.");
				}
			} else if (oRTE.contentWindow) {
				//IE 5.5+
				try {
					var oRTEDoc = oRTE.contentWindow.document;
					oRTEDoc.open("text/html","replace");
					oRTEDoc.write(frameHtml);
					oRTEDoc.close();
					if (!readOnly && isIE) oRTEDoc.attachEvent("onkeypress", evt_ie_keypress);
				} catch (e) {
					alert("3.Error preloading content.");
				}
				if (!readOnly) oRTEDoc.designMode = "on";
			} else {
				//IE5 and Opera
				var oRTEDoc = oRTE.document;
				oRTEDoc.open("text/html","replace");
				oRTEDoc.write(frameHtml);
				oRTEDoc.close();
				if (!readOnly && isIE) oRTEDoc.attachEvent("onkeypress", evt_ie_keypress);
				if (!readOnly) oRTEDoc.designMode = "on";
			}
		} catch (e) {
			//some browsers may take some time to enable design mode.
			//Keep looping until able to set.
			if (loopCnt < maxLoops) {
				setTimeout("enableDesignMode('" + rte + "', '" + html + "', " + readOnly + ");", 100);
				loopCnt += 1;
			} else {
				alert("4.Error enabling designMode.");
			}
		}
	} catch (e) {
		if (debugMode) alert("5."+e);
	}
}

function updateRTE(rte) 
{
	try
	{
		if (isRichText)
		{
			//if viewing source, switch back to design view
			if (document.getElementById("chkSrc" + rte) && document.getElementById("chkSrc" + rte).checked)
				document.getElementById("chkSrc" + rte).click();
	        var oHdnField = document.getElementById('hdn-' + rte);
			if (!oHdnField)
				return false;
			
			setHiddenVal(rte);
			return true;
		}
		
	} catch (e) {
		if (debugMode) alert("6."+e);
	}
    return true;
}

function updateRTEs() {
	try 
	{
		if (allRTEs != "") 
		{
			var vRTEs = allRTEs.split(";"),allRTEsNew = "";
			for (var i = 0; i < vRTEs.length; i++) 
			{
				if (!updateRTE(vRTEs[i]))
					continue;
				if (allRTEsNew)
					allRTEsNew += ";";
				allRTEsNew += vRTEs[i];
			}
			allRTEs = allRTEsNew;
		}
	} catch (e) {
		if (debugMode) alert("7."+e);
	}
}

function rteCommand(rte, command, option) {
	//function to perform command
	try {
		var oRTE = document.getElementById(rte);
		if (oRTE.contentWindow) {
			oRTE.contentWindow.focus();
			oRTE.contentWindow.document.execCommand(command, false, option);
		} else {
			oRTE.document.focus();
			oRTE.document.execCommand(command, false, option);
		}

		return false;
	} catch (e) {
		if (debugMode) alert("8."+e);
	}
}

function dlgColorPalette(rte, command) {
	//function to display or hide color palettes
	try {
		setRange(rte);

		//get dialog position
		var buttonElement = document.getElementById(command + '_' + rte);
		var iLeftPos = findPosX(buttonElement);
		var iTopPos = findPosY(buttonElement) + buttonElement.offsetHeight;
		var oDialog = document.getElementById('cp');

		oDialog.style.left = iLeftPos + "px";
		oDialog.style.top = iTopPos + "px";

		if ((command == lastCommand) && (rte == currentRTE)) {
			//if current command dialog is currently open, close it
			if (oDialog.style.visibility == "hidden") {
				showHideElement('cp', 'show');
			} else {
				showHideElement('cp', 'hide');
			}
		} else {
			showHideElement('cp', 'show');
		}

		//save current values
		lastCommand = command;
		currentRTE = rte;
		//alert("color palette rte="+currentRTE+", command="+lastCommand+", src="+oDialog.src);
	} catch (e) {
		if (debugMode) alert("9."+e);
	}
}

function dlgInsertTable(rte) {
	//function to open insert table dialog
	try {
		//save current values
		setRange(rte);
		currentRTE = rte;
		InsertTable = popUpWin('/Scriptor/bos/rendererJSrte.xd/httpinsert_table/2591739828.htm', 'InsertTable', 360, 180, '');
		if (InsertTable) {
			setTimeout("InsertTable.focus()",100);
		} else {
			alert("Error: While Launching New Window...\nYour browser maybe blocking up Popup windows.\n\nPlease check your Popup Blocker Settings");
		}
	} catch (e) {
		if (debugMode) alert("10."+e);
	}
}

function dlgInsertLink(rte)
{
	//function to open insert link dialog
	//try
	//{
		if (cmdInsertHTMLEnabled)
		{
			//save current values
			setRange(rte);
			currentRTE = rte;
			InsertLink = popUpWin('/Scriptor/bos/rendererJSrte.xd/httpinsert_link/2591739828.htm?selectionText=' + selectionText, 'InsertLink', 360, 180, '');
			if (InsertLink)
			{
				setTimeout("InsertLink.focus()",100);
			}
			else
			{
				alert("Error: While Launching New Window...\nYour browser maybe blocking up Popup windows.\n\nPlease check your Popup Blocker Settings");
			}
		}
		else
		{
			var url = prompt("Enter URL", "http://");
            if ((url != null) && (url != ""))
				rteCommand(rte, "createlink", url);
		}
	/*}
	catch (e)
	{
		if (debugMode) alert(e);
	}*/
}

function dlgInsertSpecialChar(rte) {
	//function to open insert special character dialog
	try {
		//save current values
		setRange(rte);
		currentRTE = rte;
		InsertSpecialChar = popUpWin('/Scriptor/bos/rendererJSrte.xd/httpinsert_special_char/2591739828.htm', 'InsertSpecialChar', 360, 250, '');
		if (InsertSpecialChar) {
			setTimeout("InsertSpecialChar.focus()",100);
		} else {
			alert("Error: While Launching New Window...\nYour browser maybe blocking up Popup windows.\n\nPlease check your Popup Blocker Settings");
		}
	} catch (e) {
		if (debugMode) alert("11."+e);
	}
}

function popUpWin (url, win, width, height, options)
{
	try
	{
		var leftPos = (screen.availWidth - width) / 2;
		var topPos = (screen.availHeight - height) / 2;
		options += ',width=' + width + ',height=' + height + ',top=' + topPos + ',left=' + leftPos;
		return window.open(url, win, options);
	}
	catch (e)
	{
		if (debugMode) alert("12."+e);
	}
}

function setColor(color) {
	//function to set color
	try {
		var rte = currentRTE;
		if (isSafari || isIE) {
			if (lastCommand == "hilitecolor") lastCommand = "backcolor";

			//retrieve selected range
			if (!isSafari) rng.select();
		}

		rteCommand(rte, lastCommand, color);
		showHideElement('cp', "hide");
	} catch (e) {
		if (debugMode) alert("13."+e);
	}
}

function addImage(rte)
{
	//function to add image
	try
	{
        if (cmdInsertHTMLEnabled)
        {
            //save current values
            setRange(rte);
            currentRTE = rte;
            InsertLink = popUpWin('/Scriptor/bos/netbrowser.xd/httpMain//root/toolbox/rteInsertImage?projectRef='+jsProjectRef+'&cacheid='+jsCacheId+'/imgPopup&wintype=InsertImage&eventId=histostart&$ishape='+rte+jsSession, 'InsertImage', 550, 400, 'resizable=yes,titlebar=no,addressbar=no,scrollbars=yes');
            if (InsertLink)
            {
                setTimeout("InsertLink.focus()",100);
            }
            else
            {
                alert("Error: While Launching New Window...\nYour browser maybe blocking up Popup windows.\n\nPlease check your Popup Blocker Settings");
            }
        }
        else
        {
	        imagePath = prompt('Enter Image URL:', 'http://');
	        if ((imagePath != null) && (imagePath != ""))
	            rteCommand(rte, 'InsertImage', imagePath);
        }
	}
	catch (e)
	{
		if (debugMode) alert("14."+e);
	}
}

//positioning functions courtesy of Peter-Paul Koch - http://www.quirksmode.org/
function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
		}
	}
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curtop += obj.offsetTop;
		}
	}
	return curtop;
}

function selectFont(rte, selectname) {
	//function to handle font changes
	try {
		var idx = document.getElementById(selectname).selectedIndex;
		// First one is always a label
		if (idx != 0) {
			var selected = document.getElementById(selectname).options[idx].value;
			var cmd = selectname.replace('_' + rte, '');
			rteCommand(rte, cmd, selected);
			document.getElementById(selectname).selectedIndex = 0;
		}
	} catch (e) {
		if (debugMode) alert("15."+e);
	}
}

function insertHTML(html) {
	//function to add HTML -- thanks dannyuk1982
	try {
		if (document.all && !isOpera) {
			rng.pasteHTML(html);
			rng.collapse(false);
			rng.select();
		} else {
			rteCommand(currentRTE, 'inserthtml', html);
		}
	} catch (e) {
		if (debugMode) alert("16."+e);
	}
}

function showHideElement(element, showHide) {
	//function to show or hide elements
	try {
		//element variable can be string or object
		if (document.getElementById(element)) {
			element = document.getElementById(element);
			if (showHide == "show") {
				if (element.id.substring(0,7) == "toolbar") element.style.display = "block";
				element.style.visibility = "visible";
			} else if (showHide == "hide") {
				if (element.id.substring(0,7) == "toolbar") element.style.display = "none";
				element.style.visibility = "hidden";
			}
		}
	} catch (e) {
		if (debugMode) alert("17."+e);
	}
}

function setRange(rte) {
	//function to store range of current selection
	try {
		var oRTE = document.getElementById(rte);
		if (oRTE.contentWindow) {
			var oRTEDoc = oRTE.contentWindow.document;
			oRTE.contentWindow.focus();
		} else {
			var oRTEDoc = oRTE.document;
			oRTEDoc.focus();
		}

		if (document.all) {
			sel = oRTEDoc.selection;
			rng = sel.createRange();
			if (encodeHTML) {
				selectionText = htmlEncode(rng.text.toString());
			} else {
				selectionText = rng.text.toString();
			}
		} else if (document.getSelection) {
			rng = oRTEDoc.createRange();
			if (encodeHTML) {
				selectionText = htmlEncode(oRTEDoc.getSelection());
			} else {
				selectionText = oRTEDoc.getSelection();
			}
		}
	} catch (e) {
		if (debugMode) alert("18."+e);
	}
}

function stripHTML(oldString) {
	//function to strip all html
	try {
		var newString = oldString.replace(/(<([^>]+)>)/ig,"");

		//replace carriage returns and line feeds
		newString = newString.replace(/\r\n/g," ");
		newString = newString.replace(/\n/g," ");
		newString = newString.replace(/\r/g," ");

		//trim string
		newString = trim(newString);

		return newString;
	} catch (e) {
		if (debugMode) alert("19."+e);
	}
}

function trim(sInString) {
	//removes leading and trailing spaces from the passed string
	try {
		sInString = sInString.replace(/^\s+/g, "");
		return sInString.replace(/\s+$/g, "");
	} catch (e) {
		if (debugMode) alert("20."+e);
	}
}

function cleanWordContent(wordContent) {
	//found at http://blogs.speerio.net/peerio/
	//	wordDiv = document.createElement("DIV");
	//	wordDiv.innerHTML = wordContent;
	//	for (var i = 0; i < wordDiv.all.length; i++) {
	//		wordDiv.all[i].removeAttribute("className","",0);
	//		wordDiv.all[i].removeAttribute("style","",0);
	//	}
	//	wordContent = wordDiv.innerHTML;

	wordContent = String(wordContent).replace(/<\\?\?xml[^>]*>/g,"");
	wordContent = String(wordContent).replace(/<\/?o:p[^>]*>/g,"");
	wordContent = String(wordContent).replace(/<\/?v:[^>]*>/g,"");
	wordContent = String(wordContent).replace(/<\/?o:[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/&nbsp;/g,"");//<p>&nbsp;</p>
	//	wordContent = String(wordContent).replace(/<\/?SPAN[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?FONT[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?STRONG[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?P[^>]*><\/P>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H1[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H2[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H3[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H4[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H5[^>]*>/g,"");
	//	wordContent = String(wordContent).replace(/<\/?H6[^>]*>/g,"");

	return wordContent;
}

function RTEtoggleHTMLSrc(rte)
{
    //contributed by Bob Hutzel (thanks Bob!)
    try
	{
        var oHdnField = document.getElementById('hdn-' + rte);
        var oRTE = document.getElementById(rte);
        if (oRTE.contentWindow)
		{
            var oRTEDoc = oRTE.contentWindow.document;
        }
		else
		{
            var oRTEDoc = oRTE.document;
        }

        if (document.getElementById("chkSrc" + rte).checked)
		{
            //we are checking the box, show source
//            showHideElement(rte+"_cmdStyle", "hide");
            showHideElement(rte+"_cmdFontName", "hide");
            showHideElement(rte+"_cmdFontSize", "hide");
//            showHideElement(rte+"_cmdIncreaseFontSize", "hide");
//            showHideElement(rte+"_cmdDecreaseFontSize", "hide");
//            showHideElement("toolbar2_" + rte, "hide");

            showHideElement(rte+"_cmdBold", "hide");
            showHideElement(rte+"_cmdItalic", "hide");
            showHideElement(rte+"_cmdUnderline", "hide");
            showHideElement(rte+"_cmdStrikethrough", "hide");
            showHideElement(rte+"_cmdJustifyLeft", "hide");
            showHideElement(rte+"_cmdJustifyCenter", "hide");
            showHideElement(rte+"_cmdJustifyRight", "hide");
            showHideElement(rte+"_cmdInsertHorizontalRule", "hide");
            showHideElement(rte+"_cmdInsertOrderedList", "hide");
            showHideElement(rte+"_cmdInsertUnorderedList", "hide");
            showHideElement(rte+"_cmdOutdent", "hide");
            showHideElement(rte+"_cmdIndent", "hide");
            showHideElement(rte+"_cmdForeColor", "hide");
            showHideElement(rte+"_cmdHiliteColor", "hide");
            showHideElement(rte+"_cmdInsertImage", "hide");
            showHideElement(rte+"_cmdInsertTable", "hide");
            showHideElement(rte+"_cmdUndo", "hide");
            showHideElement(rte+"_cmdRedo", "hide");
            showHideElement(rte+"_cmdRemoveFormat", "hide");

            setHiddenVal(rte);
            if (encodeHTML)
			{
                var htmlSrc = oRTEDoc.createTextNode(htmlDecode(oHdnField.value));
            }
			else
			{
                var htmlSrc = oRTEDoc.createTextNode(oHdnField.value);
            }
            oRTEDoc.body.innerHTML = "";
            oRTEDoc.body.appendChild(htmlSrc);
        }
		else
		{
            //we are unchecking the box, show rich text
            //showHideElement(rte+"_cmdStyle", "show");
            showHideElement(rte+"_cmdFontName", "show");
            showHideElement(rte+"_cmdFontSize", "show");
            //showHideElement(rte+"_cmdIncreaseFontSize", cmdIncreaseFontSizeEnabled?"show":"hide");
            //showHideElement(rte+"_cmdDecreaseFontSize", cmdDecreaseFontSizeEnabled?"show":"hide");
            //showHideElement("toolbar2_" + rte, "show");

	        showHideElement(rte+"_cmdBold", "show");
	        showHideElement(rte+"_cmdItalic", "show");
	        showHideElement(rte+"_cmdUnderline", "show");
	        showHideElement(rte+"_cmdStrikethrough", "show");
	        showHideElement(rte+"_cmdJustifyLeft", "show");
	        showHideElement(rte+"_cmdJustifyCenter", "show");
	        showHideElement(rte+"_cmdJustifyRight", "show");
	        showHideElement(rte+"_cmdInsertHorizontalRule", "show");
	        showHideElement(rte+"_cmdInsertOrderedList", "show");
	        showHideElement(rte+"_cmdInsertUnorderedList", "show");
	        showHideElement(rte+"_cmdOutdent", "show");
	        showHideElement(rte+"_cmdIndent", "show");
	        showHideElement(rte+"_cmdForeColor", "show");
	        showHideElement(rte+"_cmdHiliteColor", "show");
	        showHideElement(rte+"_cmdInsertImage", "show");
	        showHideElement(rte+"_cmdInsertTable", "show");
	        showHideElement(rte+"_cmdUndo", "show");
	        showHideElement(rte+"_cmdRedo", "show");
	        showHideElement(rte+"_cmdRemoveFormat", "show");


            if (isIE)
			{
                var htmlSrc = oRTEDoc.body.innerText;
            }
			else
			{
                var htmlSrc = oRTEDoc.body.ownerDocument.createRange();
                htmlSrc.selectNodeContents(oRTEDoc.body);
                htmlSrc = htmlSrc.toString();
            }
            setHtmlSrc(rte, htmlSrc);
        }
    }
	catch (e)
	{
        if (debugMode) alert("21."+e);
    }
}

function toggleHTMLSrc(rte, toolbar1, toolbar2) {
	//contributed by Bob Hutzel (thanks Bob!)
	try {
		var oHdnField = document.getElementById('hdn-' + rte);
		var oRTE = document.getElementById(rte);
		if (oRTE.contentWindow) {
			var oRTEDoc = oRTE.contentWindow.document;
		} else {
			var oRTEDoc = oRTE.document;
		}

		if (document.getElementById("chkSrc" + rte).checked) {
			//we are checking the box, show source
			if (toolbar1) showHideElement("toolbar1_" + rte, "hide");
			if (toolbar2) showHideElement("toolbar2_" + rte, "hide");
			setHiddenVal(rte);
			if (encodeHTML) {
				var htmlSrc = oRTEDoc.createTextNode(htmlDecode(oHdnField.value));
			} else {
				var htmlSrc = oRTEDoc.createTextNode(oHdnField.value);
			}
			oRTEDoc.body.innerHTML = "";
			oRTEDoc.body.appendChild(htmlSrc);
		} else {
			//we are unchecking the box, show rich text
			if (toolbar1) showHideElement("toolbar1_" + rte, "show");
			if (toolbar2) showHideElement("toolbar2_" + rte, "show");

			if (isIE) {
				var htmlSrc = oRTEDoc.body.innerText;
			} else {
				var htmlSrc = oRTEDoc.body.ownerDocument.createRange();
				htmlSrc.selectNodeContents(oRTEDoc.body);
				htmlSrc = htmlSrc.toString();
			}
			setHtmlSrc(rte, htmlSrc);
		}
	} catch (e) {
		if (debugMode) alert("22."+e);
	}
}

function setHiddenVal(rte)
{
	//set hidden form field value for current rte
	try
	{
		var oHdnField = document.getElementById('hdn-' + rte);
		if (oHdnField.value == null)
			oHdnField.value = "";

		var html = getHtmlSrc(rte);
		if (typeof(html) == "undefined")
		{
			alert("rte "+rte+" has no body !");
			return;
		}
		html = cleanWordContent(html);

		if (generateXHTML)
		{
			//convert html output to xhtml (thanks Jacob Lee!)
			html = getXHTML(html);
		}

		//if there is no content (other than formatting) set value to nothing
		if (stripHTML(html.replace("&nbsp;", " ")) == "" &&
			html.toLowerCase().search("<hr") == -1 &&
			html.toLowerCase().search("<img") == -1)
			html = "";

		var newVal;
		if (encodeHTML)
			newVal = htmlEncode(html);
		else
			newVal = html;

		if (oHdnField.value != newVal)
		{
			oHdnField.value = newVal;
			EprFldHdnChanged(oHdnField);
		}
	}
	catch (e)
	{
		if (debugMode) alert("23."+e);
	}
}

function getHtmlSrc(rte) {
//	try {
		var oRTE = document.getElementById(rte);
		var oRTEDoc;
		if (oRTE.contentWindow)
		{
			oRTEDoc = oRTE.contentWindow.document;
		}
		else
		{
			oRTEDoc = oRTE.document;
		}
		return oRTEDoc.body.innerHTML;
/*	} catch (e) {
		if (debugMode) alert("24."+e);
	}*/
}

function setHtmlSrc(rte, html) {
	try {
		var oRTE = document.getElementById(rte);
		if (oRTE.contentWindow) {
			var oRTEDoc = oRTE.contentWindow.document;
		} else {
			var oRTEDoc = oRTE.document;
		}
		if (isIE) { //fix for IE
			var output = htmlEncode(html);
			output = output.replace("%3CP%3E%0D%0A%3CHR%3E", "%3CHR%3E");
			output = output.replace("%3CHR%3E%0D%0A%3C/P%3E", "%3CHR%3E");
			oRTEDoc.body.innerHTML = htmlDecode(output);
		} else {
			oRTEDoc.body.innerHTML = html;
		}
	} catch (e) {
		if (debugMode) alert("25."+e);
	}
}

function htmlEncode(text) {
	return text.replace(/\&/ig,  '&amp;').replace(/\</ig,  '&lt;').replace(/\>/ig,  '&gt;').replace(/\"/ig,  '&quot;');
}

function htmlDecode(text) {
	return text.replace(/\&lt\;/ig,  '<').replace(/\&gt\;/ig,  '>').replace(/\&quot\;/ig,  '"').replace(/\&amp\;/ig,  '&');
}

// webkit.org webkit detection scripts
function parse_webkit_version(version) {
	try {
		var bits = version.split(".");
		var is_nightly = (version[version.length - 1] == "+");
		if (is_nightly) {
			var minor = "+";
		} else {
			var minor = parseInt(bits[1]);
			// If minor is Not a Number (NaN) return an empty string
			if (isNaN(minor)) {
				minor = "";
			}
		}
		return {major: parseInt(bits[0]), minor: minor, is_nightly: is_nightly};
	} catch (e) {
		if (debugMode) alert("26."+e);
	}
}

function get_webkit_version() {
	try {
		var regex = new RegExp("\\(.*\\) AppleWebKit/(.*) \\((.*)");
		var matches = regex.exec(navigator.userAgent);
        if (!matches)
			return null;
		var webkit_version = parse_webkit_version(matches[1]);
		return {major: webkit_version['major'], minor: webkit_version['minor'], is_nightly: webkit_version['is_nightly']};
	} catch (e) {
		if (debugMode) alert("27."+e);
	}
}

//********************
//Gecko-Only Functions
//********************
function geckoKeyPress(evt) {
	//function to add bold, italic, and underline shortcut commands to gecko RTEs
	//contributed by Anti Veeranna (thanks Anti!)
	try {
		var rte = evt.target.id;

		if (evt.ctrlKey) {
			var key = String.fromCharCode(evt.charCode).toLowerCase();
			var cmd = '';
			switch (key) {
			case 'b': cmd = "bold"; break;
			case 'i': cmd = "italic"; break;
			case 'u': cmd = "underline"; break;
			};

			if (cmd) {
				rteCommand(rte, cmd);

				// stop the event bubble
				evt.preventDefault();
				evt.stopPropagation();
			}
		}
	} catch (e) {
		if (debugMode) alert("28."+e);
	}
}

//*****************
//IE-Only Functions
//*****************
function evt_ie_keypress(event) {
	try {
		ieKeyPress(event, rte);
	} catch (e) {
		if (debugMode) alert("29."+e);
	}
}

function ieKeyPress(evt, rte) {
	try {
		var key = (evt.which || evt.charCode || evt.keyCode);
		var stringKey = String.fromCharCode(key).toLowerCase();

		//the following breaks list and indentation functionality in IE (don't use)
		//	switch (key) {
		//		case 13:
		//			//insert <br> tag instead of <p>
		//			//change the key pressed to null
		//			evt.keyCode = 0;
		//
		//			//insert <br> tag
		//			currentRTE = rte;
		//			insertHTML('<br>');
		//			break;
		//	};
	} catch (e) {
		if (debugMode) alert("30."+e);
	}
}

function checkspell() {
	//function to perform spell check
	try {
		var tmpis = new ActiveXObject("ieSpell.ieSpellExtension");
		tmpis.CheckAllLinkedDocuments(document);
	} catch(e) {
		if(e.number==-2146827859) {
			if (confirm("ieSpell not detected.  Click Ok to go to download page."))
				window.open("http://www.iespell.com/download.php","DownLoad");
		} else {
			alert("Error Loading ieSpell: Exception " + e.number);
		}
	}
}

function raiseButton(e) {
	try {
		var el = window.event.srcElement;

		className = el.className;
		if (className == 'rteImage' || className == 'rteImageLowered') {
			el.className = 'rteImageRaised';
		}
	} catch (e) {
		if (debugMode) alert("31."+e);
	}
}

function normalButton(e) {
	try {
		var el = window.event.srcElement;

		className = el.className;
		if (className == 'rteImageRaised' || className == 'rteImageLowered') {
			el.className = 'rteImage';
		}
	} catch (e) {
		if (debugMode) alert("32."+e);
	}
}

function lowerButton(e) {
	try {
		var el = window.event.srcElement;

		className = el.className;
		if (className == 'rteImage' || className == 'rteImageRaised') {
			el.className = 'rteImageLowered';
		}
	} catch (e) {
		if (debugMode) alert("33."+e);
	}
}

function RTEcmdEnabled(rteID,cmdName,cmdEnabled)
{
    var cmd = document.getElementById(rteID+"_"+cmdName);
    if (!cmd)
        return;
    cmd.style.visibility = cmdEnabled?"visible":"hidden";
}

function RTEadd(rteID,htmlTxt)
{
    if (allRTEs.length > 0) allRTEs += ";";
    allRTEs += rteID;

    RTEcmdEnabled(rteID,'cmdIncreaseFontSize',cmdIncreaseFontSizeEnabled);
    RTEcmdEnabled(rteID,'cmdDecreaseFontSize',cmdDecreaseFontSizeEnabled);
    RTEcmdEnabled(rteID,'cmdBold',cmdBoldEnabled);
    RTEcmdEnabled(rteID,'cmdItalic',cmdItalicEnabled);
    RTEcmdEnabled(rteID,'cmdUnderline',cmdUnderlineEnabled);
    RTEcmdEnabled(rteID,'cmdStrikethrough',cmdStrikethroughEnabled);
    RTEcmdEnabled(rteID,'cmdSuperscript',cmdSuperscriptEnabled);
    RTEcmdEnabled(rteID,'cmdJustifyLeft',cmdJustifyLeftEnabled);
    RTEcmdEnabled(rteID,'cmdJustifyCenter',cmdJustifyCenterEnabled);
    RTEcmdEnabled(rteID,'cmdJustifyRight',cmdJustifyRightEnabled);
//    RTEcmdEnabled(rteID,'cmdJustifyFull',cmdJustifyFullEnabled);
    RTEcmdEnabled(rteID,'cmdInsertHorizontalRule',cmdInsertHorizontalRuleEnabled);
    RTEcmdEnabled(rteID,'cmdInsertOrderedList',cmdInsertOrderedListEnabled);
    RTEcmdEnabled(rteID,'cmdInsertUnorderedList',cmdInsertUnorderedListEnabled);
    RTEcmdEnabled(rteID,'cmdOutdent',cmdOutdentEnabled);
    RTEcmdEnabled(rteID,'cmdIndent',cmdIndentEnabled);
    RTEcmdEnabled(rteID,'cmdForeColor',cmdForeColorEnabled);
    RTEcmdEnabled(rteID,'cmdHiliteColor',cmdHiliteColorEnabled);
    RTEcmdEnabled(rteID,'cmdInsertLink',(cmdInsertHTMLEnabled && cmdCreateLinkEnabled));
    RTEcmdEnabled(rteID,'cmdUnlink',cmdUnlinkEnabled && cmdInsertHTMLEnabled && cmdCreateLinkEnabled);
    RTEcmdEnabled(rteID,'cmdInsertImage',cmdInsertImageEnabled);
    RTEcmdEnabled(rteID,'cmdInsertSpecialChars',cmdInsertHTMLEnabled);
    RTEcmdEnabled(rteID,'cmdInsertTable',cmdInsertHTMLEnabled && !isOpera);
    RTEcmdEnabled(rteID,'cmdSpellCheck',cmdSpellCheckEnabled);
    RTEcmdEnabled(rteID,'cmdCut',cmdCutEnabled);
    RTEcmdEnabled(rteID,'cmdCopy',cmdCopyEnabled);
    RTEcmdEnabled(rteID,'cmdPaste',cmdPasteEnabled);
    RTEcmdEnabled(rteID,'cmdUndo',cmdUndoEnabled);
    RTEcmdEnabled(rteID,'cmdRedo',cmdRedoEnabled);
    RTEcmdEnabled(rteID,'cmdRemoveFormat',cmdRemoveFormatEnabled);

	var newVal = htmlDecode(htmlTxt);
	var oHdnField = document.getElementById('hdn-' + rteID);
	oHdnField.value = newVal;
	enableDesignMode(rteID, newVal, this.readOnly);

	if (isGecko)
	{
	    //set focus on the RTE
	    currentRTE = rteID;
	    insertHTML("<br>");
	    rteCommand(rteID, "undo");
	}

	//uncheck toggle source checkbox
	var toggleCheck =  document.getElementById("chkSrc" + rteID);
	if (toggleCheck)
		toggleCheck.checked = false;
}

function RTEdel(rteID)
{
}



