Index: FCKeditor/trunk/_dev/lint.conf
===================================================================
--- FCKeditor/trunk/_dev/lint.conf	(revision 4223)
+++ FCKeditor/trunk/_dev/lint.conf	(revision 4228)
@@ -27,5 +27,5 @@
 +useless_void                 # use of the void type may be unnecessary (void is always undefined)
 +multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
-+use_of_label                 # use of label
+-use_of_label                 # use of label
 -block_without_braces         # block statement without curly braces
 +leading_decimal_point        # leading decimal point may indicate a number or an object member
Index: FCKeditor/trunk/_dev/lint.mac.conf
===================================================================
--- FCKeditor/trunk/_dev/lint.mac.conf	(revision 4223)
+++ FCKeditor/trunk/_dev/lint.mac.conf	(revision 4228)
@@ -27,5 +27,5 @@
 +useless_void                 # use of the void type may be unnecessary (void is always undefined)
 +multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
-+use_of_label                 # use of label
+-use_of_label                 # use of label
 -block_without_braces         # block statement without curly braces
 +leading_decimal_point        # leading decimal point may indicate a number or an object member
Index: FCKeditor/trunk/editor/_source/classes/fckpanel.js
===================================================================
--- FCKeditor/trunk/editor/_source/classes/fckpanel.js	(revision 4223)
+++ FCKeditor/trunk/editor/_source/classes/fckpanel.js	(revision 4228)
@@ -234,4 +234,7 @@
 		}
 
+		// Save the popup related arguments so they can be used by others (e.g. SCAYT).
+		this._PopupArgs = [x, y, iMainWidth, eMainNode.offsetHeight, relElement];
+
 		// Second call: Show the Popup at the specified location, with the correct size.
 		this._Popup.show( x, y, iMainWidth, eMainNode.offsetHeight, relElement ) ;
Index: FCKeditor/trunk/editor/_source/internals/fckcommands.js
===================================================================
--- FCKeditor/trunk/editor/_source/internals/fckcommands.js	(revision 4223)
+++ FCKeditor/trunk/editor/_source/internals/fckcommands.js	(revision 4228)
@@ -143,4 +143,7 @@
 		case 'Undefined'	: oCommand = new FCKUndefinedCommand() ; break ;
 
+		case 'Scayt' : oCommand = FCKScayt.CreateCommand() ; break ;
+		case 'ScaytContext' : oCommand = FCKScayt.CreateContextCommand() ; break ;
+
 		// By default we assume that it is a named command.
 		default:
Index: FCKeditor/trunk/editor/_source/internals/fckscayt.js
===================================================================
--- FCKeditor/trunk/editor/_source/internals/fckscayt.js	(revision 4228)
+++ FCKeditor/trunk/editor/_source/internals/fckscayt.js	(revision 4228)
@@ -0,0 +1,408 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2009 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ *  - GNU General Public License Version 2 or later (the "GPL")
+ *    http://www.gnu.org/licenses/gpl.html
+ *
+ *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ *    http://www.gnu.org/licenses/lgpl.html
+ *
+ *  - Mozilla Public License Version 1.1 or later (the "MPL")
+ *    http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+var FCKScayt;
+
+(function()
+{
+	var scaytOnLoad = [] ;
+	var isEngineLoaded = (top.scayt) ? true : false ;
+	var scaytEnable, scaytReady ;
+
+	function ScaytEngineLoad( callback )
+	{
+		if ( isEngineLoaded )
+			return ;
+
+		isEngineLoaded = true ;
+		
+		var init = function () 
+		{
+			scayt = top.scayt ;
+			InitScayt() ;
+			var ScaytCombobox =  FCKToolbarItems.LoadedItems[ 'ScaytCombobox' ] ;
+			ScaytCombobox && ScaytCombobox.SetEnabled( scyt_control && scyt_control.disabled) ;
+			InitSetup() ;
+		};
+		
+		if ( top.scayt )
+		{
+			init() ;
+			return ;
+		}
+			
+		// Compose the scayt url.
+		if (FCK.Config.ScaytCustomUrl)
+			FCK.Config.ScaytCustomUrl = new String(FCK.Config.ScaytCustomUrl).replace( new RegExp( "^http[s]*:\/\/"),"") ;
+
+		var protocol	= document.location.protocol ;
+		var baseUrl		= FCK.Config.ScaytCustomUrl ||'svc.spellchecker.net/spellcheck3/lf/scayt/scayt4.js' ;
+		var scaytUrl	= protocol + '//' + baseUrl ;
+		var scaytConfigBaseUrl =  ParseUrl( scaytUrl ).path +  '/' ;
+
+		// SCAYT is targetted to CKEditor, so we need this trick to make it work here.
+		var CKEDITOR = top.window.CKEDITOR || ( top.window.CKEDITOR = {} ) ;
+		CKEDITOR._djScaytConfig =
+		{
+			baseUrl : scaytConfigBaseUrl,
+			addOnLoad : function()
+			{ 
+				init();
+			},
+			isDebug : false
+		};
+		
+		
+		if ( callback )
+			scaytOnLoad.push( callback ) ;
+		
+		DoLoadScript( scaytUrl ) ;
+	}
+
+	/**
+	 * DoLoadScript - load scripts with dinamic tag script creating
+	 * @param string url
+	 */
+	function DoLoadScript( url )
+	{
+		if (!url)
+            return false ;
+
+        var s = top.document.createElement('script') ;
+        s.type = 'text/javascript' ;
+        s.src = url ;
+        top.document.getElementsByTagName('head')[0].appendChild(s) ;
+
+        return true ;
+	}
+
+	function ParseUrl( data )
+	{
+		var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/) ;
+		return m ? { path: m[1], file: m[2] } : data ;
+	}
+
+	function InitScayt()
+	{
+		// Get public scayt params.
+		var oParams = {} ;
+		oParams.srcNodeRef				= FCK.EditingArea.IFrame; 		// Get the iframe.
+		// syntax : AppName.AppVersion@AppRevision
+		//oParams.assocApp  = "FCKEDITOR." + FCKeditorAPI.Varsion + "@" + FCKeditorAPI.VersionBuild;
+		oParams.customerid 				= FCK.Config.ScaytCustomerid ;
+		oParams.customDictionaryName 	= FCK.Config.ScaytCustomDictionaryName ;
+		oParams.userDictionaryName 		= FCK.Config.ScaytUserDictionaryName ;
+		oParams.defLang 				= FCK.Config.ScaytDefLang ;
+
+		var scayt = window.scayt;
+		var scayt_control = window.scayt_control = new scayt( oParams ) ;
+		
+		if ( scayt_control )
+		{
+			scayt_control.setDisabled( false ) ;
+			scaytReady = true;
+			scaytEnable = !scayt_control.disabled ;
+
+			// set default scayt status
+			var ScaytCombobox = FCKToolbarItems.LoadedItems[ 'ScaytCombobox' ] ;
+			ScaytCombobox && ScaytCombobox.Enable() ;
+			ShowScaytState() ;
+		}
+
+		for ( var i = 0 ; i < scaytOnLoad.length ; i++ )
+		{
+			try
+			{
+				scaytOnLoad[i].call( this ) ;
+			}
+			catch(err)
+			{}
+		}
+	}
+
+	// ###
+	// SCAYT command class.
+	var ScaytCommand  = function()
+	{
+		name = 'Scayt' ;
+	}
+
+	ScaytCommand.prototype.Execute = function( action )
+	{
+		switch ( action )
+		{
+			case 'Options' :
+			case 'Langs' :
+			case 'About' :
+				if ( isEngineLoaded && scaytReady && !scaytEnable )
+				{
+					ScaytMessage( 'SCAYT is not enabled' );
+					break;
+				}
+					
+				if ( isEngineLoaded && scaytReady )
+					FCKDialog.OpenDialog( 'Scayt', 'SCAYT Settings', 'dialog/fck_scayt.html?' + action.toLowerCase(), 343, 343 );
+				break;
+				
+			default :
+				if ( !isEngineLoaded )
+				{
+					var me = this;
+					ScaytEngineLoad( function ()
+						{
+							me.SetEnabled( !scayt_control.disabled ) ;
+						}) ;
+					
+					return true;
+				}
+				else if ( scaytReady )
+				{
+					// Switch the current scayt state.
+					if ( scaytEnable )
+						this.Disable() ;
+					else
+						this.Enable() ;
+
+					ShowScaytState() ;
+				}
+
+		}
+
+		if ( !isEngineLoaded )
+			return ScaytMessage( 'SCAYT is not loaded' ) || false;
+
+		if ( !scaytReady )
+			return ScaytMessage( 'SCAYT is not ready' ) || false;
+		
+		
+		return true;
+	}
+
+	ScaytCommand.prototype.Enable = function()
+	{
+		window.scayt_control.setDisabled( false ) ;
+		scaytEnable = true;
+		
+	}
+
+	ScaytCommand.prototype.Disable = function()
+	{
+		window.scayt_control.setDisabled( true ) ;
+		scaytEnable = false;
+	}
+
+	ScaytCommand.prototype.SetEnabled = function( state )
+	{
+		if ( state )
+			this.Enable() ;
+		else
+			this.Disable() ;
+
+		ShowScaytState() ;
+		return true;
+	}
+	
+	ScaytCommand.prototype.GetState = function()
+	{
+		return FCK_TRISTATE_OFF;
+	}
+
+	function ShowScaytState()
+	{
+		var combo = FCKToolbarItems.GetItem( 'SpellCheck' ) ;
+
+		if ( !combo )
+			return;
+
+		var bItem = combo._Combo._OuterTable.getElementsByTagName( 'img' )[1] ;
+		var dNode = combo._Combo.Items['trigger'] ;
+
+		if ( scaytEnable )
+		{
+			bItem.style.opacity = '1' ;
+			dNode.innerHTML = GetStatusLabel() ;
+		}
+		else
+		{
+			bItem.style.opacity = '0.5' ;
+			dNode.innerHTML = GetStatusLabel() ;
+		}
+	}
+
+	function GetStatusLabel()
+	{
+		if ( !scaytReady )
+			return  '<b>Enable SCAYT</b>' ;
+
+		return scaytEnable ? '<b>Disable SCAYT</b>' : '<b>Enable SCAYT</b>' ;
+	}
+
+	// ###
+	// Class for the toolbar item.
+	var ToolbarScaytComboBox = function( tooltip, style )
+	{
+		this.Command = FCKCommands.GetCommand( 'Scayt' ) ;
+		this.CommandName = 'Scayt' ;
+		this.Label = this.GetLabel() ;
+		this.Tooltip = FCKLang.ScaytTitle ;
+		this.Style = FCK_TOOLBARITEM_ONLYTEXT ; //FCK_TOOLBARITEM_ICONTEXT OR FCK_TOOLBARITEM_ONLYTEXT
+	}
+
+	ToolbarScaytComboBox.prototype = new FCKToolbarSpecialCombo ;
+
+	//Add the items to the combo list
+	ToolbarScaytComboBox.prototype.CreateItems = function()
+	{
+		this._Combo.AddItem( 'Trigger', '<b>Enable SCAYT</b>' );
+		this._Combo.AddItem( 'Options', FCKLang.ScaytTitleOptions || "Options"  );
+		this._Combo.AddItem( 'Langs', FCKLang.ScaytTitleLangs || "Languages");
+		this._Combo.AddItem( 'About', FCKLang.ScaytTitleAbout || "About");
+	}
+
+	// Label shown in the toolbar.
+	ToolbarScaytComboBox.prototype.GetLabel = function()
+	{
+		var strip = FCKConfig.SkinPath + 'fck_strip.gif';
+
+		return FCKBrowserInfo.IsIE ?
+				'<div class="TB_Button_Image"><img src="' + strip + '" style="top:-192px"></div>'
+			:
+				'<img class="TB_Button_Image" src="' + FCK_SPACER_PATH + '" style="background-position: 0px -192px;background-image: url(' + strip + ');">';
+	}
+
+	function ScaytMessage( m )
+	{
+		m && alert( m ) ;
+	}
+	
+	var ScaytContextCommand = function()
+	{
+		name = 'ScaytContext' ;
+	}
+	
+	ScaytContextCommand.prototype.Execute = function( contextInfo )
+	{
+		var action = contextInfo && contextInfo.action,
+			node = action && contextInfo.node;
+
+		if ( node )
+		{
+			switch ( action )
+			{
+				case 'Suggestion' :
+					scayt_control.replace( node, contextInfo.suggestion ) ;
+					break ;
+				case 'Ignore' :
+					scayt_control.ignore( node ) ;
+					break ;
+				case 'Ignore All' :
+					scayt_control.ignoreAll( node ) ;
+					break ;
+				case 'Add Word' :
+					scayt.addWordToUserDictionary( node ) ;
+					break ;
+			}
+		}
+	}
+
+	// Register context menu listeners.
+	function InitSetup()
+	{
+		FCK.ContextMenu.RegisterListener(
+			{
+				AddItems : function( menu )
+				{
+					if ( !scayt_control )
+						return;
+
+					var node = scayt_control.getScaytNode() ;
+
+					if ( !node )
+						return;
+
+					var suggestions = scayt.getSuggestion( scayt_control.getWord( node ), scayt_control.getLang() ) ;
+
+					if ( !suggestions || !suggestions.length )
+						return;
+
+					menu.AddSeparator() ;
+
+					var maxSuggestions = FCK.Config.ScaytMaxSuggestions || 5 ;
+					var suggAveCount = ( maxSuggestions == -1 ) ? suggestions.length : maxSuggestions ;
+
+					for ( var i = 0 ; i < suggAveCount ; i += 1)
+						menu.AddItem( 'ScaytContext', suggestions[i], null, false, { action : 'Suggestion', node : node, suggestion : suggestions[i] } );
+
+					menu.AddSeparator() ;
+					
+					menu.AddItem( 'ScaytContext', 'Ignore', null, false, { action : 'Ignore', node : node } );
+					menu.AddItem( 'ScaytContext', 'Ignore All', null, false, { action : 'Ignore All', node : node } );
+					menu.AddItem( 'ScaytContext', 'Add Word', null, false, { action : 'Add Word', node : node } );
+					try
+					{
+						if (scaytReady && scaytEnable)
+							scayt_control.fireOnContextMenu( null, FCK.ContextMenu._InnerContextMenu);
+						
+					}
+					catch( err ) {}
+				}
+			}) ;
+
+		FCK.Events.AttachEvent( 'OnPaste', function()
+			{
+					scayt_control.refresh() ;
+					return true;
+			} ) ;
+	}
+
+	// ##
+	// Register event listeners.
+	FCK.Events.AttachEvent( 'OnAfterSetHTML', function()
+		{
+			if ( FCKConfig.SpellChecker == 'SCAYT' )
+			{
+				if ( FCK.Config.ScaytAutoStartup )
+					ScaytEngineLoad()
+
+				ShowScaytState() ;
+			}
+		} ) ;
+
+	// ###
+	// The main object that holds the SCAYT interaction in the code.
+	FCKScayt =
+	{
+		CreateCommand : function()
+		{
+			return new ScaytCommand();
+		},
+
+		CreateContextCommand : function()
+		{
+			return new ScaytContextCommand();
+		},
+
+		CreateToolbarItem : function()
+		{
+			return new ToolbarScaytComboBox() ;
+		}
+	} ;
+})() ;
Index: FCKeditor/trunk/editor/_source/internals/fcktoolbaritems.js
===================================================================
--- FCKeditor/trunk/editor/_source/internals/fcktoolbaritems.js	(revision 4223)
+++ FCKeditor/trunk/editor/_source/internals/fcktoolbaritems.js	(revision 4228)
@@ -53,5 +53,4 @@
 		case 'PasteWord'		: oItem = new FCKToolbarButton( 'PasteWord'	, FCKLang.PasteWord, null, null, false, true, 11 ) ; break ;
 		case 'Print'			: oItem = new FCKToolbarButton( 'Print'		, FCKLang.Print, null, null, false, true, 12 ) ; break ;
-		case 'SpellCheck'		: oItem = new FCKToolbarButton( 'SpellCheck', FCKLang.SpellCheck, null, null, null, null, 13 ) ; break ;
 		case 'Undo'				: oItem = new FCKToolbarButton( 'Undo'		, FCKLang.Undo, null, null, false, true, 14 ) ; break ;
 		case 'Redo'				: oItem = new FCKToolbarButton( 'Redo'		, FCKLang.Redo, null, null, false, true, 15 ) ; break ;
@@ -114,4 +113,12 @@
 		case 'ShowBlocks'		: oItem = new FCKToolbarButton( 'ShowBlocks'	, FCKLang.ShowBlocks, null, null, null, true, 72 ) ; break ;
 
+		case 'SpellCheck' :
+			if ( FCKConfig.SpellChecker == 'SCAYT' )
+				oItem = FCKScayt.CreateToolbarItem() ;
+			else
+				oItem = new FCKToolbarButton( 'SpellCheck', FCKLang.SpellCheck, null, null, null, null, 13 ) ;
+
+			 break ;
+
 		default:
 			alert( FCKLang.UnknownToolbarItem.replace( /%1/g, itemName ) ) ;
Index: FCKeditor/trunk/editor/dialog/fck_scayt.html
===================================================================
--- FCKeditor/trunk/editor/dialog/fck_scayt.html	(revision 4228)
+++ FCKeditor/trunk/editor/dialog/fck_scayt.html	(revision 4228)
@@ -0,0 +1,746 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
+<!--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2009 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ *  - GNU General Public License Version 2 or later (the "GPL")
+ *    http://www.gnu.org/licenses/gpl.html
+ *
+ *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ *    http://www.gnu.org/licenses/lgpl.html
+ *
+ *  - Mozilla Public License Version 1.1 or later (the "MPL")
+ *    http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+-->
+<html>
+	<head>
+		<title>SCAYT Properties</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+		<meta content="noindex, nofollow" name="robots">
+		<script src="common/fck_dialog_common.js" type="text/javascript"></script>
+		<link type="text/css" href="fck_scayt/scayt_dialog.css" rel="stylesheet" />
+		<script type="text/javascript">
+
+			var dialog	= window.parent ;
+			var oEditor	= dialog.InnerDialogLoaded() ;
+			var FCKLang = oEditor.FCKLang;
+			var scayt = oEditor.scayt;
+			var scayt_control = oEditor.scayt_control;
+			var lang_list = {};
+            var	sLang;
+			var	fckLang;
+            var chosed_lang;
+			var options;
+			var	tabs = scayt_control.uiTags || [1,1,0,1];
+			var	userDicActive = tabs[2] == 1;
+			var	captions;
+			var dic_buttons = [
+				// [0] contains buttons for creating
+				"dic_create,dic_restore",
+				// [1] contains buton for manipulation
+				"dic_rename,dic_delete"
+			];
+			
+			var get = 
+				new function(){
+				 	
+					var mergeObjs = function(obj1, obj2)
+					{
+						for (var k in obj1)
+							obj2[k] = obj1[k];
+								
+						return obj2;
+					};
+
+					var removeWhitespaces = function( s )
+					{
+						s = s.replace( new RegExp("^ +| +$"), '' ) ;
+						return s ;
+					};
+					
+					var addEvent = function( el ,sEventName, fTodo )
+					{
+						if (el.addEventListener) {
+							el.addEventListener (sEventName,fTodo,false);
+							
+						} else if (el.attachEvent) {
+							el.attachEvent ("on"+sEventName,fTodo);
+							
+						} else {
+							el["on"+sEventName] = fTodo;
+						}
+					};
+
+					var getElementsByClassName = function (node,classname ,strTag) {
+						strTag = strTag || "*";
+					  	node = node || document;
+						if (node.getElementsByClassName)
+							return node.getElementsByClassName(classname);
+						else {
+							var objColl = node.getElementsByTagName(strTag);
+							if (!objColl.length &&  strTag == "*" &&  node.all) objColl = node.all;
+							var arr = new Array();
+							var delim = classname.indexOf('|') != -1  ? '|' : ' ';
+							var arrClass = classname.split(delim);
+							for (var i = 0, j = objColl.length; i < j; i++) {
+								var arrObjClass = objColl[i].className.split(' ');
+								if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
+								var c = 0;
+								comparisonLoop:
+									for ( var k = 0, l = arrObjClass.length ; k < l ; k++ )
+									{
+										for ( var m = 0, n = arrClass.length ; m < n ; m++ )
+										{
+											if ( arrClass[m] == arrObjClass[k] )
+												c++ ;
+
+											if ( ( delim == '|' && c == 1 ) || ( delim == ' ' && c == arrClass.length ) )
+											{
+												arr.push( objColl[i] ) ;
+												break comparisonLoop ;
+											}
+										}
+									}
+							}
+							return arr;
+						}
+					};
+					
+					var hasClassName = function ( sClassName, elem ) {
+						//.split(/\s+/);
+						var aCnames = elem.className.split(/\s+/) || [];
+						for (var i=0, l=aCnames.length; i<l ; i++){
+							if (sClassName == aCnames[i])
+								return true;
+						}
+						return false;
+					}
+						
+					var single = {
+						addClass 	: function ( sClassName ) {
+							//console.info( sClassName, this.className, );
+							if ( hasClassName(sClassName , this) )
+								return this;
+							var s = removeWhitespaces(this.className + " " +sClassName);
+							this.className = s;
+							return this;
+							
+						},
+						removeClass : function ( sClassName ) {
+							var s = removeWhitespaces(this.className.replace(sClassName,""));
+							this.className = s;
+							return this;
+						},
+						setStyle : function( oStyles )
+						{
+							for ( var style in oStyles )
+							{
+								this.style[style] = oStyles[style] ;
+							}
+							return this ;
+						},
+						bindOnclick		: function ( handler ) {
+							//addEvent( this, "click" , handler);
+							this.onclick = handler;
+							return this;
+						},
+						bindOnchange	: function ( handler ) {
+							//addEvent( this, "change" , handler);
+							this.onchange = handler;
+							return this;
+						},
+						getAttr : function ( sAttrName )
+						{
+							if ( !sAttrName )
+								return null;
+							
+							return this[sAttrName];
+						},
+						setAttr : function ( sAttrName , attrVal )
+						{
+							if ( !sAttrName || !attrVal )
+								return null;
+							
+							this[sAttrName] = attrVal;
+
+							return this;
+						},
+						remAttr : function ( sAttrName )
+						{
+							if ( !sAttrName ) 
+								return null;
+						}
+					};
+						
+					var singleCaller = function ( sMethod,args ) {
+						for ( var i=0, l=this.length; i<l ; i++ ){
+							var oItem = mergeObjs( single, this[i] );
+							oItem[sMethod].apply(this[i],args);
+						}
+					};
+					
+					
+					var collection = {
+						
+						addClass 	: function ( sClassName ){
+							singleCaller.call(this, "addClass", [sClassName])
+							return this;
+						},
+						removeClass 	: function ( sClassName ) {
+							singleCaller.call(this, "removeClass", [sClassName])
+							return this;
+						},
+						setStyle		: function ( oStyles ) {
+							singleCaller.call(this, "setStyle", [oStyles])
+							return this;
+						},
+						bindOnclick		: function ( f ) {
+							singleCaller.call(this, "bindOnclick", [f])
+							return this;
+						},
+						bindOnchange	: function ( f ) {
+							singleCaller.call(this, "bindOnchange", [f])
+							return this;
+						},
+						
+						forEach : function ( fTodo ) {
+							//el,i
+							for (var i=0, l=this.length; i<l ; i++){
+								fTodo.apply(this[i], [this[i],i ]);
+							}
+							return this;
+						}
+						
+					};
+					
+					
+					
+					this.byClass = function( sClassName ){
+						var o = getElementsByClassName(document, sClassName );
+						return o ? mergeObjs( collection, o ) : o;
+					};
+					
+					this.byId = function( sId ){
+						var o = document.getElementById( sId );
+						return o ? mergeObjs( single, o ) : o;
+					};
+					
+					this.gup = function ( name ){
+				        name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
+				        var regexS = '[\\?&]' + name + '=([^&#]*)' ;
+				        var regex = new RegExp( regexS ) ;
+				        var results = regex.exec( window.location.href ) ;
+				        
+				        if( results == null )
+				            return '' ;
+				        else
+				            return results[ 1 ] ;
+					};
+					this.wrap = function ( o ) {
+						return o ? mergeObjs( single, o ) : o;
+					};
+					this.forEach = function ( oScope, fTodo ){
+						collection.forEach.apply( oScope,[fTodo] );
+					};
+					
+				 };
+			
+			
+			
+			// Add the dialog tabs.
+			tabs[0] == 1 && dialog.AddTab( 'options', 'Options' ) ;
+			tabs[1] == 1 && dialog.AddTab( 'langs', 'Languages' ) ;
+			tabs[2] == 1 && dialog.AddTab( 'dictionary', 'Dictionary' ) ;
+			tabs[3] == 1 && dialog.AddTab( 'about', 'About' ) ;
+			
+			// Function called when a dialog tab is selected.
+			function OnDialogTabChange( tabCode )
+			{
+				ShowE('inner_options'	, ( tabCode == 'options' ) ) ;
+				ShowE('inner_langs'	, ( tabCode == 'langs' ) ) ;
+				ShowE('inner_dictionary'		, ( tabCode == 'dictionary' ) ) ;
+				ShowE('inner_about'	, ( tabCode == 'about' ) ) ;
+			}
+			
+			
+			
+				
+				
+			window.onload = function()
+			{
+				// Things to do when the page is loaded.
+			
+				if ( document.location.search.length )
+					dialog.SetSelectedTab( document.location.search.substr(1) ) ;
+			
+				dialog.SetOkButton( true ) ;
+				
+	                
+	                if (!scayt) throw "SCAYT is undefined";
+	                if (!scayt_control) throw "SCAYT_CONTROL is undefined";
+					
+					// show alowed tabs
+					tabs = scayt_control.uiTags || [1,1,1,0];
+					
+					
+					sLang = scayt_control.getLang();
+	                fckLang = "en";
+					options = scayt_control.option();
+					// apply captions
+					scayt.getCaption( fckLang, function( caps )
+					{
+						//console.info( "scayt.getCaption runned" )
+						captions = caps;
+						apllyCaptions();
+						//lang_list = scayt.getLangList();
+		                lang_list = scayt.getLangList() ;//|| {ltr: {"en_US" : "English","en_GB" : "British English","pt_BR" : "Brazilian Portuguese","da_DK" : "Danish","nl_NL" : "Dutch","en_CA" : "English Canadian","fi_FI" : "Finnish","fr_FR" : "French","fr_CA" : "French Canadian","de_DE" : "German","el_GR" : "Greek","hu_HU" : "Hungarian","it_IT" : "Italian","nb_NO" : "Norwegian","pl_PL" : "Polish","pt_PT" : "Portuguese","ru_RU" : "Russian","es_ES" : "Spanish","sv_SE" : "Swedish","tr_TR" : "Turkish","uk_UA" : "Ukrainian","cy_GB" : "Welsh"},rtl: {"ar_EG" : "Arabic"}};
+		                
+		                
+		                   
+		                
+		                // ** animate options
+		                get.byClass("_scayt_option").forEach(function(el,i){
+		                    
+							if ('undefined' != typeof(options[el.name])) {
+		                        // *** set default values
+								
+		                        if ( 1 == options[ el.name ] ){
+		                           //el.setAttribute("checked","true");
+								   get.wrap(el).setAttr("checked" ,true)
+								   //document.all_options[el.name].checked = "true";
+								   //el.checked = true;
+								   //alert( options[ dojo.attr(el ,'name') ] + " el " )
+		                        }
+								//console.info(options)
+		                        // *** bind events
+		                        get.wrap(el).bindOnclick( function(ev){
+									
+									var that = get.wrap(this);
+									var isCheck = that.getAttr("checked");
+									//console.info(isCheck)									
+		                            if ( isCheck == false ) {
+		                                
+										//that.setAttr("checked",false);
+										options[ this.name ] = 0;
+		                            }else{
+		                                //that.setAttr("checked",true);
+										options[ this.name ] = 1;
+		                            }
+									//console.info(options)
+		                        });
+		                    }
+		                });
+						
+						
+		                // * Create languages tab
+		                // ** convert langs obj to array
+		                var lang_arr = [];
+		                
+		                for (var k in lang_list.rtl){
+		                    // find curent lang
+		                    if ( k == sLang)
+		                        chosed_lang = lang_list.rtl[k] + "::" + k;
+		                    lang_arr[lang_arr.length] = lang_list.rtl[k] + "::" + k;
+		                        
+		                }
+		                for (var k in lang_list.ltr){
+		                     // find curent lang
+		                     if ( k == sLang)
+		                        chosed_lang = lang_list.ltr[k] + "::" + k;
+		                    lang_arr[lang_arr.length] = lang_list.ltr[k] + "::" + k;
+		                }
+		                lang_arr.sort();
+		                
+		                // ** find lang containers
+		                
+		                var lcol = get.byId("lcolid");
+		                var rcol = get.byId("rcolid");
+		                // ** place langs in DOM
+						
+		                get.forEach(lang_arr , function( l , i ){
+		                    
+							//console.info( l,i );
+							
+							var l_arr = l.split('::');
+		                    var l_name = l_arr[0];
+		                    var l_code = l_arr[1];
+		                    var row = document.createElement('div');
+		                    row.id = l_code;
+		                    row.className = "li";
+		                    // split langs on half
+		                    var col = ( i < lang_arr.length/2 ) ? lcol:rcol ;
+		                    
+		                    // append row
+		                    //console.dir( col )
+		                    col.appendChild(row);
+		                    var row_dom = get.byId( l_code )
+		                    row_dom.innerHTML = l_name;
+		                    	                    
+		                    var checkActiveLang = function( id ){
+		                        return chosed_lang.split("::")[1] == id;
+		                    };
+		                    // bind click
+		                    row_dom.bindOnclick(function(ev){
+		                        
+		                        if ( checkActiveLang(this.id) ) return false;
+		                        var elId = this.id;
+								get.byId(this.id)
+	                            	.addClass("Button")
+	                            	.removeClass("DarkBackground");
+		                            
+		                        window.setTimeout( function (){ get.byId(elId).setStyle({opacity:"0.5",cursor:"no-drop"});  } ,300 );
+		                        
+		                        get.byId(chosed_lang.split("::")[1])
+		                            .addClass("DarkBackground")
+		                            .removeClass("Button")
+		                            .setStyle({opacity:"1",cursor:"pointer"});
+		                            
+		                        chosed_lang = this.innerHTML + "::" + this.id;
+		                        return true;
+		                    })
+							.setStyle({
+		                        cursor:"pointer"
+		                    });
+		                    // select current lang
+		                    if (l == chosed_lang)
+		                        row_dom.addClass("Button").setStyle({opacity:"0.5",cursor:"no-drop"});
+		                    else 
+		                        row_dom.addClass("DarkBackground").setStyle({opacity:"1"});
+		                        
+		                });
+						// * user dictionary    
+						if ( userDicActive ){
+							initUserDictionary()
+										
+						}
+					});
+					
+					
+					
+			}
+			
+			
+			
+			
+			var buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ];
+			var labels  = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ];
+			
+			
+			function apllyCaptions ( ) 
+			{
+				
+				// fill tabs headers
+				// add missing captions
+				
+				get.byClass("PopupTab").forEach(function(el,i){
+					
+					if ( tabs[i] == 1 ){
+						el.style.display = "block";
+					}
+					el.innerHTML = captions['tab_'+el.id];
+					
+				});
+					
+				// Fill options labels.
+				for ( i in labels )
+				{
+					var label = 'label_' + labels[ i ],
+						labelElement = document.getElementById( label );
+					
+					if (  'undefined' != typeof labelElement
+					   && 'undefined' != typeof captions[ label ] && captions[ label ] !== ""
+					   && 'undefined' != typeof options[labels[ i ]] )
+					{
+						labelElement.innerHTML = captions[ label ];
+						var labelParent = labelElement.parentNode;
+						labelParent.style.display = "block";
+					}
+				}
+				// fill dictionary section
+				for ( var i in buttons )
+				{
+					var button = buttons[ i ];
+					get.byId( button ).innerHTML = '<span>' + captions[ 'button_' + button]  +'</span>' ;
+				}
+				get.byId("dname").innerHTML = captions['label_dname'];
+				get.byId( 'dic_info' ).innerHTML = captions[ 'dic_info' ];
+					
+				// fill about tab
+				var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
+					'<p>' + captions[ 'version' ]  + scayt.version.toString() + '</p>' +
+					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
+				
+				get.byId( 'scayt_about' ).innerHTML = about;	
+			
+			}
+			
+			
+			function initUserDictionary () {
+				
+				scayt.getNameUserDictionary(
+					function( o )
+					{
+						var dic_name = o.dname;
+						if ( dic_name )
+						{
+							get.byId( 'dic_name' ).value = dic_name;
+							display_dic_buttons( dic_buttons[1] );
+						}
+						else
+							display_dic_buttons( dic_buttons[0] );
+		
+					},
+					function ()
+					{
+						get.byId( 'dic_name' ).value("");
+						dic_error_message(captions["err_dic_enable"] || "Used dictionary are unaveilable now.")
+					}
+				);
+					
+				dic_success_message("");
+				
+				 // ** bind event listeners
+                get.byClass("button").bindOnclick(function( ){
+					
+					// get dic name
+					var dic_name = get.byId('dic_name').value ;
+					// check common dictionary rules
+					if (!dic_name) {
+						dic_error_message(" Dictionary name should not be empty. ");
+						return false;
+					}
+					//apply handler
+					window[this.id].apply( window, [this, dic_name, dic_buttons ] );
+						
+					//console.info( typeof window[this.id], window[this.id].calle )
+					return false;
+				});			
+			
+			}
+			
+			dic_create = function( el, dic_name , dic_buttons )
+			{
+				// comma separated button's ids include repeats if exists
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+
+				var err_massage = captions["err_dic_create"];
+				var suc_massage = captions["succ_dic_create"];
+				//console.info("--plugin ");
+
+				scayt.createUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_create callback called with args" , arg );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons ( dic_buttons[1] );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							dic_success_message (suc_massage);
+						},
+					function(arg)
+						{
+							//console.info( "dic_create errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" ,arg.dname );
+							dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
+						});
+
+			};
+
+			dic_rename = function( el, dic_name , dic_buttons )
+			{
+				//
+				// try to rename dictionary
+				// @TODO: rename dict
+				//console.info ( captions["err_dic_rename"] )
+				var err_massage = captions["err_dic_rename"] || "";
+				var suc_massage = captions["succ_dic_rename"] || "";
+				scayt.renameUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_rename callback called with args" , arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							set_dic_name( dic_name );
+							dic_success_message ( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( "dic_rename errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname  );
+							set_dic_name( dic_name );
+							dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
+						});
+			};
+
+			dic_delete = function ( el, dic_name , dic_buttons )
+			{
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+				var err_massage = captions["err_dic_delete"];
+				var suc_massage = captions["succ_dic_delete"];
+
+				// try to delete dictionary
+				// @TODO: delete dict
+				scayt.deleteUserDictionary(
+					function(arg)
+						{
+							//console.info( "dic_delete callback " , dic_name ,arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons ( dic_buttons[0] );
+							set_dic_name( "" ); // empty input field
+							dic_success_message( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( " dic_delete errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname );
+							dic_error_message(err_massage);
+						});
+			};
+
+			dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
+			{
+				// try to restore existing dictionary
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+				var err_massage = captions["err_dic_restore"];
+				var suc_massage = captions["succ_dic_restore"];
+
+				scayt.restoreUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_restore callback called with args" , arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons(dic_buttons[1]);
+							dic_success_message( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( " dic_restore errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname );
+							dic_error_message( err_massage );
+						});
+			};
+
+			function dic_error_message( m )
+			{
+				if ( !m )
+					return ;
+
+				get.byId('dic_message').innerHTML =  '<span class="error">' + m + '</span>' ;
+			}
+
+            function dic_success_message( m )
+            {
+				if ( !m ) 
+					return ;
+
+				get.byId('dic_message').innerHTML = '<span class="success">' + m + '</span>' ;
+			}
+
+			function display_dic_buttons ( sIds ){
+				sIds = new String( sIds );
+				get.forEach( sIds.split(','), function ( id,i) {
+					get.byId(id).setStyle({display:"inline"});
+				});
+			}
+			function hide_dic_buttons ( sIds ){
+				sIds = new String( sIds );
+				get.forEach( sIds.split(','), function ( id,i) {
+					get.byId(id).setStyle({display:"none"});
+				});
+			}
+			function set_dic_name ( dic_name ) {
+				get.byId('dic_name').value = dic_name;
+			}
+			function display_dic_tab () {
+				get.byId("dic_tab").style.display = "block";
+			}
+			
+			function Ok()
+			{
+				// Things to do when the Ok button is clicked.
+				var c = 0;
+			    // set upp options if any was set
+			    var o = scayt_control.option();
+				//console.info(options)
+			    for ( var oN in options ) {
+					
+			        if ( o[oN] != options[oN] && c == 0){
+						//console.info( "set option " )
+			            scayt_control.option( options );
+			            c++;
+			        }
+			    }
+			    //setup languge if it was change
+			    var csLang = chosed_lang.split("::")[1];
+			    if ( csLang && sLang != csLang ){
+			        scayt_control.setLang( csLang );
+					//console.info(sLang+" -> "+csLang , scayt_control)
+			        c++;
+			    }
+			    
+			    if ( c > 0 )  scayt_control.refresh();   
+			    
+			    return dialog.Cancel();
+				
+			}
+
+		</script>
+	</head>
+	<body style="OVERFLOW: hidden" scroll="no">
+		<div class="tab_container" id="inner_options">
+		   
+           <ul id="scayt_options">
+               <li class="_scayt_options">
+                   <input class="_scayt_option" type="checkbox" value="0" name="allCaps" />
+                   <label for="allCaps" id="label_allCaps"></label>
+               </li>
+               <li>
+                   <input class="_scayt_option" type="checkbox" value="0" name="ignoreDomainNames" />
+                   <label for="ignoreDomainNames" id="label_ignoreDomainNames"></label>
+               </li>
+               <li>
+                   <input class="_scayt_option" type="checkbox" value="0" name="mixedCase" />
+                   <label for="mixedCase" id="label_mixedCase"></label>
+               </li>
+               <li>
+                   <input class="_scayt_option" type="checkbox" value="0" name="mixedWithDigits" />
+                   <label for="mixedWithDigits" id="label_mixedWithDigits"></label>
+               </li>
+           </ul> 
+		</div>
+		<div class="tab_container" id="inner_langs">
+		   
+		   <div class="lcol" id="lcolid"></div>
+           <div class="rcol" id="rcolid"></div>
+		</div>
+		<div class="tab_container" id="inner_dictionary">
+		   		   
+		   <div id="dic_message"></div>
+			<div id="_off_dic_tab" class="dictionary" > 
+				<div style="padding-left:10px;">
+							<label id="dname" for="dname"></label>
+							<input type="text" size="14" maxlength="15" value="" id="dic_name" name="dic_name"/>
+						</div>
+						<div class="dic_buttons">
+							<a href="#" id="dic_create" class="button">  </a>
+							<a href="#" id="dic_delete" class="button">  </a>
+							<a href="#" id="dic_rename" class="button">  </a>
+							<a href="#" id="dic_restore" class="button">  </a>
+						</div>
+						
+						<div id="dic_info"></div>
+				
+			</div>
+		</div>
+		<div id="inner_about" class="tab_container">
+		   <div id="scayt_about"></div>
+		</div>
+	</body>
+</html>
Index: FCKeditor/trunk/editor/dialog/fck_scayt/scayt_dialog.css
===================================================================
--- FCKeditor/trunk/editor/dialog/fck_scayt/scayt_dialog.css	(revision 4228)
+++ FCKeditor/trunk/editor/dialog/fck_scayt/scayt_dialog.css	(revision 4228)
@@ -0,0 +1,169 @@
+html, body
+{
+	background-color: transparent;
+	margin: 0px;
+	padding: 0px;
+}
+
+body
+{
+	padding: 10px;
+}
+
+body, td, input, select, textarea
+{
+	font-size: 11px;
+	font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
+}
+
+.midtext
+{
+	padding:0px;
+	margin:10px;
+}
+
+.midtext p
+{
+	padding:0px;
+	margin:10px;
+}
+
+.Button
+{
+	border: #737357 1px solid;
+	color: #3b3b1f;
+	background-color: #c7c78f;
+}
+
+.PopupTabArea , .button
+{
+	color: #737357;
+	background-color: #e3e3c7;
+}
+
+.PopupTitleBorder
+{
+	border-bottom: #d5d59d 1px solid;
+}
+.PopupTabEmptyArea
+{
+	padding-left: 10px;
+	border-bottom: #d5d59d 1px solid;
+}
+
+.PopupTab, .PopupTabSelected
+{
+	border-right: #d5d59d 1px solid;
+	border-top: #d5d59d 1px solid;
+	border-left: #d5d59d 1px solid;
+	padding: 3px 5px 3px 5px;
+	color: #737357;
+}
+
+.PopupTab
+{
+	margin-top: 1px;
+	border-bottom: #d5d59d 1px solid;
+	cursor: pointer;
+	cursor: hand;
+}
+
+.PopupTabSelected
+{
+	font-weight: bold;
+	cursor: default;
+	padding-top: 4px;
+	border-bottom: #f1f1e3 1px solid;
+	background-color: #f1f1e3;
+}
+
+ul {
+    padding:0;
+    margin:0px 0px 12px 0px;
+    list-style-type:none;
+}
+ul.tabs {
+    height:20px;
+    margin:10px 0px;
+}
+ul.tabs li {
+    float: left;
+	display:none;
+}
+div.tab_container {
+    /*display:none;*/
+    padding: 0px 5px ;
+}
+.lcol {
+    float:left;
+    width:47%;
+    margin-left:5px;
+}
+.rcol {
+    float:right;
+    width:47%;
+    margin-right:5px;
+}
+div.tabs-container{
+	height:220px;
+	overflow-x:hidden;
+	overflow-y:auto;
+}
+
+div.tabs-container h3{
+    margin:5px 15px 7px 15px;
+    background-color:transparent;
+    font-size: 14px ;
+}
+
+.li {
+    border: 1px solid transparent;
+}
+
+#dic_message{
+	height: 24px;
+}
+#dic_message .error{
+	color: red ;
+}
+#dic_message .success{
+	color: blue ;
+}
+
+.dic_buttons {
+	margin-top: 5px;
+	padding-left:10px;
+}
+.dic_buttons a {
+	display: none;
+}
+a.button {
+	border: #d5d59d 1px solid;
+	padding: 2px 4px;
+	margin-right: 4px; 
+	text-decoration: none;
+}
+
+a.button:hover,
+a.button:active,
+a.button:visited{
+	padding: 2px 4px;
+	margin-right: 4px; 
+	text-decoration: none;
+}
+a.button:hover {
+	border: #d5d59d 1px solid;
+	color: #e3e3c7;
+	background-color: #737357;
+}
+
+#scayt_options li {
+	display: none;
+}
+
+#dic_info {
+	margin:10px;
+}
+#dic_tab {
+	display:none;
+}
Index: FCKeditor/trunk/editor/fckeditor.html
===================================================================
--- FCKeditor/trunk/editor/fckeditor.html	(revision 4223)
+++ FCKeditor/trunk/editor/fckeditor.html	(revision 4228)
@@ -203,4 +203,5 @@
 LoadScript( '_source/classes/fcktoolbarfontsizecombo.js' ) ;
 LoadScript( '_source/classes/fcktoolbarpanelbutton.js' ) ;
+LoadScript( '_source/internals/fckscayt.js' ) ;
 LoadScript( '_source/internals/fcktoolbaritems.js' ) ;
 LoadScript( '_source/classes/fcktoolbar.js' ) ;
Index: FCKeditor/trunk/editor/lang/en.js
===================================================================
--- FCKeditor/trunk/editor/lang/en.js	(revision 4223)
+++ FCKeditor/trunk/editor/lang/en.js	(revision 4228)
@@ -531,4 +531,9 @@
 DlgDivAdvancedTab	: "Advanced",
 DlgDivStyle		: "Style",
-DlgDivInlineStyle	: "Inline Style"
+DlgDivInlineStyle	: "Inline Style",
+
+ScaytTitle			: "SCAYT",
+ScaytTitleOptions	: "Options",
+ScaytTitleLangs		: "Languages",
+ScaytTitleAbout		: "About"
 };
Index: FCKeditor/trunk/fckconfig.js
===================================================================
--- FCKeditor/trunk/fckconfig.js	(revision 4223)
+++ FCKeditor/trunk/fckconfig.js	(revision 4228)
@@ -161,5 +161,5 @@
 FCKConfig.TemplatesXmlPath	= FCKConfig.EditorPath + 'fcktemplates.xml' ;
 
-FCKConfig.SpellChecker			= 'WSC' ;	// 'WSC' | 'SpellerPages' | 'ieSpell'
+FCKConfig.SpellChecker			= 'WSC' ;	// 'WSC' | 'SCAYT' | 'SpellerPages' | 'ieSpell'
 FCKConfig.IeSpellDownloadUrl	= 'http://www.iespell.com/download.php' ;
 FCKConfig.SpellerPagesServerScript = 'server-scripts/spellchecker.php' ;	// Available extension: .php .cfm .pl
Index: FCKeditor/trunk/fckpackager.xml
===================================================================
--- FCKeditor/trunk/fckpackager.xml	(revision 4223)
+++ FCKeditor/trunk/fckpackager.xml	(revision 4228)
@@ -147,4 +147,5 @@
 		<File path="editor/_source/classes/fcktoolbarfontsizecombo.js" />
 		<File path="editor/_source/classes/fcktoolbarpanelbutton.js" />
+		<File path="editor/_source/internals/fckscayt.js" />
 		<File path="editor/_source/internals/fcktoolbaritems.js" />
 		<File path="editor/_source/classes/fcktoolbar.js" />
@@ -243,4 +244,5 @@
 		<File path="editor/_source/classes/fcktoolbarfontsizecombo.js" />
 		<File path="editor/_source/classes/fcktoolbarpanelbutton.js" />
+		<File path="editor/_source/internals/fckscayt.js" />
 		<File path="editor/_source/internals/fcktoolbaritems.js" />
 		<File path="editor/_source/classes/fcktoolbar.js" />
