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);
};

//Contains the href of HtmlEditorTableFormats.css
var Telerik_RadEditor_TableFormatsCSSLink = "";

//overwriting getDialogArguments for the predefined MOSS table layouts
Telerik.Web.UI.Editor.CommandList._oldGetDialogArguments = Telerik.Web.UI.Editor.CommandList._getDialogArguments;
Telerik.Web.UI.Editor.CommandList._getDialogArguments = function (argument, tagName, editor, commandName)
{
    //cal the original function from RadEditor for ASP.NET AJAX 
    Telerik.Web.UI.Editor.CommandList._oldGetDialogArguments(argument, tagName, editor, commandName);        

    //Add css
    if ("TD" == tagName || "TH" == tagName || "TABLE" == tagName)
    {
        //set the link for the Table formats css
        if (!Telerik_RadEditor_TableFormatsCSSLink)
        {
            var links = document.getElementsByTagName("LINK"); 
            var linksLength = links.length;
            for (var i = 0; i < linksLength; i++)
            {
                var href = links[i].getAttribute("href");
                if (href.indexOf("HtmlEditorTableFormats.css") != -1)
                {
                    Telerik_RadEditor_TableFormatsCSSLink = href;                    
                    break;
                }                        
            }
        }   
        argument.editorTableFormatsCSSLink = Telerik_RadEditor_TableFormatsCSSLink;
        //set the predefined formats 
        var tableFormats = [
            {
                name : "tFormat1"
                , text : "Table Format 1" 
                , table : "ms-rteTable-1"
                , evenRow : "ms-rteTableEvenRow-1"
                , oddRow : "ms-rteTableOddRow-1"
                , headerRow : "ms-rteTableHeaderRow-1"
                , footerRow : "ms-rteTableFooterRow-1"
                , evenHeaderCol : "ms-rteTableHeaderEvenCol-1"
                , oddHeaderCol : "ms-rteTableHeaderOddCol-1"
                , firstHeaderCol : "ms-rteTableHeaderFirstCol-1"
                , lastHeaderCol : "ms-rteTableHeaderLastCol-1"
                , evenCol : "ms-rteTableEvenCol-1"
                , oddCol : "ms-rteTableOddCol-1"
                , firstCol : "ms-rteTableFirstCol-1"
                , lastCol : "ms-rteTableLastCol-1"
                , evenFooterCol : "ms-rteTableFooterEvenCol-1"
                , oddFooterCol : "ms-rteTableFooterOddCol-1"
                , firstFooterCol : "ms-rteTableFooterFirstCol-1"
                , lastFooterCol : "ms-rteTableFooterLastCol-1"		    
            }, 
            {
                name : "tFormat2" 
                , text : "Table Format 2" 
                , table : "ms-rteTable-2"
                , evenRow : "ms-rteTableEvenRow-2"
                , oddRow : "ms-rteTableOddRow-2"
                , headerRow : "ms-rteTableHeaderRow-2"
                , footerRow : "ms-rteTableFooterRow-2"
                , evenHeaderCol : "ms-rteTableHeaderEvenCol-2"
                , oddHeaderCol : "ms-rteTableHeaderOddCol-2"
                , firstHeaderCol : "ms-rteTableHeaderFirstCol-2"
                , lastHeaderCol : "ms-rteTableHeaderLastCol-2"
                , evenCol : "ms-rteTableEvenCol-2"
                , oddCol : "ms-rteTableOddCol-2"
                , firstCol : "ms-rteTableFirstCol-2"
                , lastCol : "ms-rteTableLastCol-2"
                , evenFooterCol : "ms-rteTableFooterEvenCol-2"
                , oddFooterCol : "ms-rteTableFooterOddCol-2"
                , firstFooterCol : "ms-rteTableFooterFirstCol-2"
                , lastFooterCol : "ms-rteTableFooterLastCol-2"		    
            }, 
            {
                name : "tFormat3" 
                , text : "Table Format 3" 
                , table : "ms-rteTable-3"
                , evenRow : "ms-rteTableEvenRow-3"
                , oddRow : "ms-rteTableOddRow-3"
                , headerRow : "ms-rteTableHeaderRow-3"
                , footerRow : "ms-rteTableFooterRow-3"
                , evenHeaderCol : "ms-rteTableHeaderEvenCol-3"
                , oddHeaderCol : "ms-rteTableHeaderOddCol-3"
                , firstHeaderCol : "ms-rteTableHeaderFirstCol-3"
                , lastHeaderCol : "ms-rteTableHeaderLastCol-3"
                , evenCol : "ms-rteTableEvenCol-3"
                , oddCol : "ms-rteTableOddCol-3"
                , firstCol : "ms-rteTableFirstCol-3"
                , lastCol : "ms-rteTableLastCol-3"
                , evenFooterCol : "ms-rteTableFooterEvenCol-3"
                , oddFooterCol : "ms-rteTableFooterOddCol-3"
                , firstFooterCol : "ms-rteTableFooterFirstCol-3"
                , lastFooterCol : "ms-rteTableFooterLastCol-3"
            }
            , 
            {
                name : "tFormat4" 
                , text : "Table Format 4" 
                , table : "ms-rteTable-4"
                , evenRow : "ms-rteTableEvenRow-4"
                , oddRow : "ms-rteTableOddRow-4"
                , headerRow : "ms-rteTableHeaderRow-4"
                , footerRow : "ms-rteTableFooterRow-4"
                , evenHeaderCol : "ms-rteTableHeaderEvenCol-4"
                , oddHeaderCol : "ms-rteTableHeaderOddCol-4"
                , firstHeaderCol : "ms-rteTableHeaderFirstCol-4"
                , lastHeaderCol : "ms-rteTableHeaderLastCol-4"
                , evenCol : "ms-rteTableEvenCol-4"
                , oddCol : "ms-rteTableOddCol-4"
                , firstCol : "ms-rteTableFirstCol-4"
                , lastCol : "ms-rteTableLastCol-4"
                , evenFooterCol : "ms-rteTableFooterEvenCol-4"
                , oddFooterCol : "ms-rteTableFooterOddCol-4"
                , firstFooterCol : "ms-rteTableFooterFirstCol-4"
                , lastFooterCol : "ms-rteTableFooterLastCol-4"
            }
            ,
            {
                name : "tFormat5" 
                , text : "Table Format 5" 
                , table : "ms-rteTable-5"
                , evenRow : "ms-rteTableEvenRow-5"
                , oddRow : "ms-rteTableOddRow-5"
                , headerRow : "ms-rteTableHeaderRow-5"
                , footerRow : "ms-rteTableFooterRow-5"
                , evenHeaderCol : "ms-rteTableHeaderEvenCol-5"
                , oddHeaderCol : "ms-rteTableHeaderOddCol-5"
                , firstHeaderCol : "ms-rteTableHeaderFirstCol-5"
                , lastHeaderCol : "ms-rteTableHeaderLastCol-5"
                , evenCol : "ms-rteTableEvenCol-5"
                , oddCol : "ms-rteTableOddCol-5"
                , firstCol : "ms-rteTableFirstCol-5"
                , lastCol : "ms-rteTableLastCol-5"
                , evenFooterCol : "ms-rteTableFooterEvenCol-5"
                , oddFooterCol : "ms-rteTableFooterOddCol-5"
                , firstFooterCol : "ms-rteTableFooterFirstCol-5"
                , lastFooterCol : "ms-rteTableFooterLastCol-5"
            }
        ];
        		               
        argument.tableFormats = tableFormats; 
    }        
} 

// 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;
}