var RadE_HasRules = false;
Type.registerNamespace("Telerik.Web.UI.Editor");
if (typeof(Telerik.Web.UI.Editor.CommandList) == "undefined")
    Telerik.Web.UI.Editor.CommandList = {};

Telerik.Web.UI.Editor.CommandList["MOSSRightToLeft"] = function(commandName, editor, args)
{
	Telerk_MOSS_SetDirectionOfSelection(editor, "rtl");
};
Telerik.Web.UI.Editor.CommandList["MOSSLeftToRight"] = function(commandName, editor, args)
{
	Telerk_MOSS_SetDirectionOfSelection(editor, "ltr");
};
Telerik.Web.UI.Editor.CommandList["MOSSHelp"] = function(commandName, editor, args)
{
	HelpWindowKey('WCMHTMLEditor');
};
Telerik.Web.UI.Editor.CommandList["ToggleSource"] = function(commandName, editor, args)
{
	//todo: call the source dialog as the MOSS editor does
	editor.set_mode(Telerik.Web.UI.EditModes.Html);
};
Telerik.Web.UI.Editor.CommandList["MOSSInsertTable"] = function(commandName, editor, args)
{
	//todo: change the dialog to use the moss default (after firefox is fixed)
	editor.fire("TableWizard", args);
};
Telerik.Web.UI.Editor.CommandList["MOSSImageManager"] = function(commandName, editor, args)
{
	var params = editor._dialogParameters;
	var docEditor = editor.get_document();
	var configObj=new AssetPickerConfig("");
	configObj.ClientID=editor.get_id();
	configObj.DefaultAssetLocation="";
	configObj.DefaultAssetImageLocation="";
	configObj.CurrentWebBaseUrl=params["CurrentWebBaseUrl"];
	configObj.ManageHyperlink=false;
	configObj.AllowExternalUrls=params["AllowExternalUrls"];
	var bInserting=false;
	var elemToReplace=null;
	var imageAssetObj=new ImageAsset("");

	elemToReplace=editor.getSelectedElement();
	if (elemToReplace && elemToReplace.tagName && elemToReplace.tagName.toUpperCase() == "BODY")
	{
		//if there is no selection or selection is the whole content body
		elemToReplace = null;
	}
	var elemImage=FormJSRTE_GetNearestContainingParentElementOfTypes(editor.get_contentWindow().frameElement.id, elemToReplace, new Array("IMG"));
	if(!elemImage)
	{
		bInserting=true;
		elemImage=docEditor.createElement("IMG");
		elemImage.border=0;
	}
	configObj.ReturnCallback=function(newAssetUrl, newAssetText, currentConfig, dialogReturnedData)
	{
		if (dialogReturnedData)
		{
			if (bInserting)
			{
				var tempDiv = docEditor.createElement("DIV");
				tempDiv.appendChild(elemImage);
				editor.pasteHtml(tempDiv.innerHTML,commandName);
				tempDiv = null;
			}
		}
	}
	var dialogReturnedData=imageAssetObj.LaunchModalDialogOnElement(configObj, elemImage, true, !bInserting );
};
Telerik.Web.UI.Editor.CommandList["MOSSLinkManager"] = function(commandName, editor, args)
{
	var params = editor._dialogParameters;
	var docEditor = editor.get_document();
	var configObj=new AssetPickerConfig("");
	configObj.ClientID=editor.get_id();
	configObj.DefaultAssetLocation="";
	configObj.DefaultAssetImageLocation="";
	configObj.CurrentWebBaseUrl=params["CurrentWebBaseUrl"];
	configObj.AllowExternalUrls=params["AllowExternalUrls"];
	var bInserting=false;
	var elemToReplace=null;
	var linkAsset=new LinkAsset("");
	var innerLinkHTML=null;
	linkAsset.ManageLinkDisplayText=false;
	var elemLink=FormJSRTE_GetNearestContainingParentElementOfTypes(editor.get_contentWindow().frameElement.id, editor.getSelectedElement(), new Array("A"));
	if(!elemLink)
	{
		bInserting=true;
		elemLink=docEditor.createElement("A");
		if (elemLink==null) return;
		var editorSelection = editor.getSelection();
		if (editorSelection.isControl())
		{
			elemToReplace=editor.getSelectedElement();
		}
		else
		{
			innerLinkHTML = editorSelection.getHtml();
		}
	}
	else
	{
		innerLinkHTML=elemLink.innerHTML;
	}
	configObj.ReturnCallback=function(newAssetUrl, newAssetText, currentConfig, dialogReturnedData)
	{
		if (dialogReturnedData)
		{
			var linkText = "";
			if ($telerik.isIE)
				linkText = elemLink.innerText;
			else
				linkText = elemLink.textContent;
			if(innerLinkHTML && innerLinkHTML != "")
			{
				elemLink.innerHTML=innerLinkHTML;
			}
			else if(linkText == "")
			{
				if(linkAsset.AssetText && linkAsset.AssetText !="")
				{
					linkText=linkAsset.AssetText;
				}
				else
				{
					linkText=linkAsset.AssetUrl;
				}
				elemLink.innerHTML += linkText;
			}
			if (elemToReplace !=null)
			{
			    var parentEl = elemToReplace.parentNode;
				elemLink.innerHTML="";
				parentEl.insertBefore(elemLink, elemToReplace);
				elemLink.appendChild(elemToReplace);
				linkAsset.FixupIconsAndEmptyAnchors(elemLink);
				return;
			}
			else if (bInserting)
			{
				var selection=docEditor.selection;
				if (selection !=null)
				{
					var textRange=selection.createRange();
					if (textRange !=null)
					{
						var text=textRange.text;
						if (text && text !="" && !text.match(/^\s+$/))
						{
							textRange.execCommand("Unlink");
							elemLink.innerHTML=textRange.htmlText;
							linkAsset.FixupIconsAndEmptyAnchors(elemLink);
						}
						var tempDiv = docEditor.createElement("DIV");
						tempDiv.appendChild(elemLink);
						textRange.pasteHTML(tempDiv.innerHTML);
					}
				}
				else
				{
					//if we cannot get the selection, use the editor paste function instead
					var tempDiv = docEditor.createElement("DIV");
					tempDiv.appendChild(elemLink);
					editor.pasteHtml(tempDiv.innerHTML, commandName);
					tempDiv = null;
				}
			}
			else
			{
				linkAsset.FixupIconsAndEmptyAnchors(elemLink);
			}
		}
	}
	linkAsset.LaunchModalDialogOnElement(configObj, elemLink, true, !bInserting);
};
Telerik.Web.UI.Editor.CommandList["MOSSTemplateManager"] = function(commandName, editor, args)
{
	if (!RadE_HasRules)
	{
		RTE2_InstantiateStaticSafeHtmlRules();
		RadE_HasRules = true;
	}
	var params = editor._dialogParameters;
	var docEditor = editor.get_document();
	var configObj=new AssetPickerConfig("");
	configObj.ClientID=editor.get_id();
	configObj.DefaultAssetLocation="";
	configObj.CurrentWebBaseUrl=params["CurrentWebBaseUrl"];
	configObj.AllowExternalUrls=params["AllowExternalUrls"];
	var bInserting=false;
	var elemToReplace=null;
	var fragmentId=null;
	var elemViewToEdit=FormJSRTE_GetNearestContainingParentElementOfTypes(editor.get_contentWindow().frameElement.id, editor.getSelectedElement(), new Array("SPAN"));
	if ((elemViewToEdit !=null) && (elemViewToEdit.id==g_strRTE2ReusableFragmentCommonToken))
	{
		fragmentId=elemViewToEdit.getAttribute("fragmentid");
	}
	var dialogInput=new Object();
	dialogInput.fragmentId=fragmentId;
	var callback=function(dialogOutput)
	{
		if ((dialogOutput !=null) && (dialogOutput.fragmentView !=null))
		{
			var selection=docEditor.selection;
			if (selection !=null)
			{
				if (selection.type=="Control")
				{
					var controlRange=selection.createRange();
					if (controlRange !=null)
					{
						controlRange.execCommand("Delete");
					}
				}
				if (selection.type !="Control")
				{
					var textRange=selection.createRange();
					if (textRange !=null)
					{
						var safeHtmlDocument=RadE_CreateTemporaryDocument();
						safeHtmlDocument.body.innerHTML=dialogOutput.fragmentView;
						var elements=RTE2_GetAllElements(safeHtmlDocument);
						//setting these to hardcoded values since they are not passed in the params[] array yet.
						var instanceVariables = new Object();
						instanceVariables.EditorOpenFromWebPart = false;
						instanceVariables.DisableCustomStyles = false;
						RTE2_ApplyContentFilters(elements, instanceVariables);
						textRange.pasteHTML(dialogOutput.fragmentView);
						RTE2_AlterReusableFragmentHighlights(docEditor.body, "ms-reusableTextView");
					}
				}
			}
			else
			{
				editor.pasteHtml(dialogOutput.fragmentView, commandName);
				RTE2_AlterReusableFragmentHighlights(docEditor.body, "ms-reusableTextView");
			}
		}
	};
	var dialogUrl=params["CurrentWebBaseUrl"]+"/_layouts/ReusableTextPicker.aspx";
	commonShowModalDialog(dialogUrl, "dialogHeight:600px; dialogWidth:800px; center:yes; resizable:yes; scroll:no; status:no;", callback, dialogInput);
};

// support functions
function Telerk_MOSS_SetDirectionOfSelection(editor, strDirection)
{
	var rngSelection=editor.getSelection();
	var strTagNames;
	strTagNames="|H1|H2|H3|H4|H5|H6|P|PRE|TD|DIV|BLOCKQUOTE|DT|DD|TABLE|HR|IMG|BODY|TR|UL|OL|";
	if (rngSelection.getParentElement())
	{
		var elemSelectionParent=rngSelection.getParentElement();
		while ((elemSelectionParent !=null) && (strTagNames.indexOf("|"+elemSelectionParent.tagName+"|")==-1))
		{
			elemSelectionParent=elemSelectionParent.parentNode;
		}
		if (elemSelectionParent)
		{
			Telerik_MOSS_SetDirectionOnElement(elemSelectionParent, strDirection);
		}
	}
}

function Telerik_MOSS_SetDirectionOnElement(element, strDirection)
{
	if ("ltr"==strDirection)
	{
		element.dir="ltr";
		element.align="left";
	}
	else if ("rtl"==strDirection)
	{
		element.dir="rtl";
		element.align="right";
	}
}

function RadE_CreateTemporaryDocument()
{
	// creating a temporary document for storing template content
	var iframe = document.createElement('iframe');
	document.body.appendChild(iframe);
	iframe.src = "javascript:'<html></html>'";
	iframe.frameBorder = '0';
	iframe.style.width = "0px";
	iframe.style.height = "0px";
	var doc = iframe.contentWindow.document;
	doc.open();
	doc.writeln('<head><style></style></head><body></body>');
	doc.close();
	if (!doc.body)
	{
		var oBody = doc.createElement("body");
		doc.appendChild(oBody);
	}
	if (doc.getElementsByTagName("head").length < 1)
	{
		var oHead = doc.createElement("head");
		oHead.style.visibility = "hidden";
		doc.body.parentNode.insertBefore(oHead, doc.body);
	}
	return doc;
}

//this code belongs in form.js, however it is copied here as well since in some pages form.js is not loaded by default.
function FormJSRTE_GetNearestContainingParentElementOfTypes(strBaseElementID, elem, aTagNames)
{
	var aTagNames_length=aTagNames.length;
	if (elem==null) return null;
	for (var i=0; i<aTagNames_length; i++)
	{
		if (elem.tagName==aTagNames[i])
		{
			return elem;
		}
	}
	var elemParent=elem.parentNode;
	while (elemParent !=null)
	{
		if (elemParent.id==strBaseElementID)
		{
			return null;
		}
		for (var i=0; i<aTagNames_length; i++)
		{
			if (elemParent.tagName==aTagNames[i])
			{
				return elemParent;
			}
		}
		elemParent=elemParent.parentNode;
	}
	return null;
}