/************************************************
 *
 *	Allow only 1 instance of RadEditor object per editorID
 *
 ************************************************/
function GetRadEditor(editorID)
{
	var topWindow = GetTopWindow(); // window
	var radEditorVarName = "topWindow.RadEditor_" + editorID;
	var re = eval(radEditorVarName);	
	
	if (re)
		return re;
		
	eval(radEditorVarName + " = new RadEditorObject('" + editorID + "');");
	return eval(radEditorVarName);	
}

function CreateRadEditor(	editorID
							, allowCustomColors
							, applicationPath
							, language
							, dialogsScheme
							, serverName
							, serverPort 								
							, serverPath 
							, windowWidth
							, mediaFilters
							, documentsFilters
							, sessionID1							
							, useSession
							, newLineBr		
							, baseScheme							
							, toolsFile								
							, toolsWidth
							, toolsHeight
							, toolsOnPage
							, toolsClientID
							, sessionID2
							, clearPasteFormatting
							, stripAbsoluteAnchorPaths
							, stripAbsoluteImagePaths
							, enableUndoRedo
							, enableHtmlIndentation
							, useClassicDialogs
							, blankIFrameLocation
						)
{
	var radEditor = GetRadEditor(editorID);
	
	radEditor.ApplicationPath	= applicationPath;
	radEditor.Language			= language;	
	radEditor.Localization		= eval("localization_" + radEditor.Language.replace("-", "_"));	
	
	radEditor.BaseScheme		= unescape(baseScheme);
	radEditor.DialogsScheme		= unescape(dialogsScheme);
	radEditor.RadControlsDir	= unescape(eval("radEditorRadControlsDir" + editorID));
	
	radEditor.ServerName		= serverName;
	radEditor.ServerPort		= serverPort;
	radEditor.ServerPath		= serverPath;
	
	radEditor.Window			= null;
	radEditor.WindowName		= null;
	
	radEditor.ToolBar			= null;
	radEditor.ContentArea		= document.getElementById("radEditorContainer" + editorID);
	radEditor.HtmlArea			= document.getElementById("radEditorText" + editorID);

	radEditor.MediaFilters		= mediaFilters;
	radEditor.DocumentsFilters	= documentsFilters;
	
	radEditor.SessionID			= sessionID1;
	radEditor.SessionID2		= sessionID2;
	
	radEditor.UseSession			= useSession;
	radEditor.NewLineBr				= newLineBr;
	radEditor.AllowCustomColors		= allowCustomColors;
	radEditor.ClearPasteFormatting	= clearPasteFormatting;
	radEditor.StripAbsoluteAnchorPaths = stripAbsoluteAnchorPaths;
	radEditor.StripAbsoluteImagePaths = stripAbsoluteImagePaths;
		
	radEditor.Width				= windowWidth;
	
	radEditor.ToolsFile			= toolsFile;
	radEditor.ToolsClientID		= toolsClientID;
	radEditor.ToolsOnPage		= toolsOnPage;
	radEditor.ToolsWidth		= toolsWidth;
	radEditor.ToolsHeight		= toolsHeight;
	
	radEditor.EnableUndoRedo		= enableUndoRedo;
	radEditor.EnableHtmlIndentation	= enableHtmlIndentation;
	
	radEditor.UseClassicDialogs		= useClassicDialogs;
	radEditor.BlankIFrameLocation	= blankIFrameLocation;
	
	//radEditor.OnPaste = MyOnPaste; //ATTACH OnPaste HANDLER EXAMPLE
	
	return radEditor;
}

function MyOnPaste(radEditor)
{
	alert("MyOnPaste");
}

/************************************************
 *
 *	Class RadEditor - main r.a.d.editor object
 *
 ************************************************/
function RadEditorObject(editorID, sessionID)
{
	this.RadEditorID		= editorID;
	this.SessionID			= sessionID;
	
	this.ApplicationPath	= "";
	this.RadControlsDir		= "";
	
	this.Language			= "";
	this.Localization		= null;
	
	this.DialogsScheme		= "";
	this.BaseScheme			= "";
	
	this.ServerName			= "";
	this.ServerPort			= "";
	this.ServerPath			= "";
	
	this.Window				= null;	// RAD editor main window
	this.ContentArea		= null;	// document.all["radEditorContainer" + editorID]
	this.HtmlArea			= null;	// document.all["radEditorText" + editorID]
	this.ToolBar			= null;
	
	this.UseSession			= false;
	this.NewLineBr			= false;;
	this.MediaFilters		= "";
	this.DocumentFilters	= "";	
	
	this.AllowCustomColors			= true;
	this.ClearPasteFormatting		= false;
	this.StripAbsoluteAnchorPaths	= false;
	this.StripAbsoluteImagePaths	= false;
	
	this.ToolsFile			= "";	
	
	this.Width				= 0;
	
	this.ToolsClientID		= "";
	this.ToolsOnPage		= false;
	this.ToolsWidth			= 0;
	this.ToolsHeight		= 0;

	this.EnableUndoRedo		= true;
	this.EnableHtmlIndentation	= true;

	this.OnPaste = null;
};

RadEditorObject.prototype.GetFullRadControlsPath = function(sessionID)
{
	if (!sessionID)
		var sessionID = "";
		
	return (this.ApplicationPath + sessionID + this.RadControlsDir);
};

RadEditorObject.prototype.GetServerUrlArray = function()
{
	return new Array(	this.ServerName + ":" + this.ServerPort + this.ServerPath,
						this.ServerName + this.ServerPort,
						this.ServerName + ":" + this.ServerPort,
						this.ServerName	);
};

/////////////////////////////////////////////////
//	RadCssClass
//
function RadCssClass(rule, alias)
{	
	this.Rule = rule;	
	this.Tag = this.GetClassTag(this.Rule);
	
	if (!alias || "" == alias)
		this.Alias = this.GetDisplayName(this.Rule);
	else
		this.Alias = alias;
		
	this.ClassName = this.GetClassName(this.Rule);
}

RadCssClass.prototype.GetClassTag = function(rule)
{	
	var str = rule ? rule.selectorText : "";
	var lastIndex = str.lastIndexOf(".");
	if (lastIndex == 0) 
	{ 
		return "ALL"; 
	}
	var firstIndex = str.lastIndexOf(" ", lastIndex);
	return str.substring((firstIndex + 1), lastIndex);
}

RadCssClass.prototype.GetDisplayName = function(rule)
{
	if (!rule)
		return "";
		
	var ruleSelectorText = rule.selectorText;
		
	var startIndex = ruleSelectorText.indexOf(".");
	if (-1 == startIndex)
		startIndex = 0;
	else
		startIndex += 1;
		
	var endIndex = ruleSelectorText.indexOf(":");
	if (-1 == endIndex)
		endIndex = ruleSelectorText.length;
		
	return ruleSelectorText.substring(startIndex, endIndex);
}

RadCssClass.prototype.GetClassName = function(rule)
{	
	var str = rule.selectorText;
	var lastIndex = str.lastIndexOf(".");
	if (lastIndex == -1) 
		return "";
/*	var firstIndex = str.indexOf(":", lastIndex);
	if (firstIndex != -1)
		return "";
	firstIndex = str.indexOf(" ", lastIndex);
	if (firstIndex == -1) 
		firstIndex = str.length;	*/		
	var firstIndex = str.indexOf(" ", lastIndex);	
	if (-1 == firstIndex)
		firstIndex = str.indexOf(":", lastIndex);	
		
	if (-1 == firstIndex)
		firstIndex = str.length;
		
	return str.substring((lastIndex + 1), firstIndex);

}

RadCssClass.prototype.CompareByTag = function(radCssClass)
{
	if (this.Tag != radCssClass.Tag)
	{
		if ("ALL" == this.Tag.toUpperCase())
			return 1;			
		else if ("ALL" == radCssClass.Tag.toUpperCase())
			return -1;
	}

	if (this.Tag > radCssClass.Tag)
		return 1;
	else if (this.Tag < radCssClass.Tag)
		return -1;
		
	return 0;
}

RadCssClass.prototype.CompareByTagSelectorText = function(radCssClass)
{
	var res = this.CompareByTag(radCssClass);
	if (0 != res)
		return res;

	if (this.selectorText > radCssClass.selectorText)
		return 1;
	else if (this.selectorText < radCssClass.selectorText)
		return -1;
	else
		return 0;
}

RadCssClass.prototype.CompareByTagAlias = function(radCssClass)
{
	var res = this.CompareByTag(radCssClass);
	if (0 != res)
		return res;
	
	if (this.Alias > radCssClass.Alias)
		return 1;
	else if (this.Alias < radCssClass.Alias)
		return -1;
	else
		return 0;
}

/////////////////////////////////////////////////
//	RadCssClassArray
//
function RadCssClassArray(editorID, cssFilter)
{	
	this.IsIE = (null != document.all);
	this.CssClassArray = this.CreateCssArray(editorID, cssFilter);
}

RadCssClassArray.prototype.CreateCssArray = function(editorID, cssFilter)
{
	var arr = new Array();
	try
	{
		for (var i = 0; i < document.styleSheets.length; i++)
		{
			try
			{
				var cssHref = document.styleSheets[i].href;
				
				if (cssHref.lastIndexOf(eval('radEditorScheme' + editorID)) > -1) 
					continue;
				if ((cssHref.indexOf('Spell/Schemes') > 0) && (cssHref.indexOf('Main.css') > 0))
					continue;
				var arrRules = null;				
				if (this.IsIE)
					arrRules = document.styleSheets[i].rules;
				else
					arrRules = document.styleSheets[i].cssRules;
					
				for (var j = 0; j < arrRules.length; j++)
				{
					try
					{	
						var rule = arrRules[j];
						var outAlias = this.CheckCssFilter(rule, cssFilter);
						
						if (null != outAlias && !this.FindRule(arr, rule))	
						{
							arr[arr.length] = new RadCssClass(rule, outAlias);
						}
					}
					catch (ex)
					{
					}
				}
			}
			catch (ex)
			{
			}
		}
		
		arr.sort(SortRadCssClassesArrayByTagSelectorText);	
	}
	catch(ex)
	{
		arr = null;
	}
	
	return arr;
}

RadCssClassArray.prototype.FindRule = function(radCssClassArray, rule)
{
	if (!radCssClassArray)
		return true;
	
	var ruleSelector = rule.selectorText;
	ruleSelector = ruleSelector.replace(/:\w*/gi, "");
	
	var rcc = null;	
	for (var i = 0; i < radCssClassArray.length; i++)
	{
		rcc = radCssClassArray[i];
		if (rcc.Rule.selectorText == ruleSelector)
			return true;
	}
	
	return false;
}

RadCssClassArray.prototype.CheckCssFilter = function(rule, arrFilter)
{
	if (!arrFilter)
		return "";
	if (!rule)
		return null;
	for (var i = 1; i < arrFilter.length; i += 2)
	{
		var value = arrFilter[i];
		var name = arrFilter[i + 1];
		
		if (rule.selectorText.toUpperCase() == value.toUpperCase())
		{
			return name;
		}
	}		
	return null;
}

RadCssClassArray.prototype.SelectCssClassesByTagName = function(arrTags)
{
	var arr = new Array();	
	for (var i = 0; i < this.CssClassArray.length; i++)
	{
		var rcc = this.CssClassArray[i];
		
		if (!arrTags)
		{
			arr[arr.length] = rcc;
		}
		else
		{
			for (var j = 0; j < arrTags.length; j++)
			{
				if (rcc.Tag.toUpperCase() == arrTags[j].toUpperCase())
					arr[arr.length] = rcc;
			}
		}
	}	
	arr.sort(SortRadCssClassesArrayByTagAlias);
	return arr;
}

function SortRadCssClassesArrayByTagSelectorText(radCssClass1, radCssClass2)
{
	if (!radCssClass1 && !radCssClass2)
		return 0;
		
	if (!radCssClass2)
		return 1;
		
	if (!radCssClass1)
		return -1;
		
	return radCssClass1.CompareByTagSelectorText(radCssClass2);
}

function SortRadCssClassesArrayByTagAlias(radCssClass1, radCssClass2)
{
	if (!radCssClass1 && !radCssClass2)
		return 0;
		
	if (!radCssClass2)
		return 1;
		
	if (!radCssClass1)
		return -1;
		
	return radCssClass1.CompareByTagAlias(radCssClass2);
}

