{\r
var commandName = 'scaytcheck',\r
openPage = '',\r
- scayt_paused = null;\r
+ scayt_paused = null,\r
+ scayt_control_id = null;\r
\r
// Checks if a value exists in an array\r
function in_array(needle, haystack)\r
{\r
// Initialise Scayt instance.\r
var oParams = {};\r
- oParams.srcNodeRef = editor.document.getWindow().$.frameElement; // Get the iframe.\r
+ // Get the iframe.\r
+ oParams.srcNodeRef = editor.document.getWindow().$.frameElement;\r
// syntax : AppName.AppVersion@AppRevision\r
- oParams.assocApp = "CKEDITOR." + CKEDITOR.version + "@" + CKEDITOR.revision;\r
- oParams.customerid = editor.config.scayt_customerid || "1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2";\r
- oParams.customDictionaryIds = editor.config.scayt_customDictionaryIds;\r
- oParams.userDictionaryName = editor.config.scayt_userDictionaryName;\r
- oParams.sLang = editor.config.scayt_sLang || "en_US";\r
+ oParams.assocApp = 'CKEDITOR.' + CKEDITOR.version + '@' + CKEDITOR.revision;\r
+ oParams.customerid = editor.config.scayt_customerid || '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';\r
+ oParams.customDictionaryIds = editor.config.scayt_customDictionaryIds || '';\r
+ oParams.userDictionaryName = editor.config.scayt_userDictionaryName || '';\r
+ oParams.sLang = editor.config.scayt_sLang || 'en_US';\r
\r
- if ( CKEDITOR._scaytParams )\r
+ oParams.onBeforeChange = function()\r
{\r
- for ( var k in CKEDITOR._scaytParams )\r
+ if ( !editor.checkDirty() )\r
+ setTimeout( function(){ editor.resetDirty(); } );\r
+ };\r
+\r
+ var scayt_custom_params = window.scayt_custom_params;\r
+ if ( typeof scayt_custom_params == 'object')\r
+ {\r
+ for ( var k in scayt_custom_params )\r
{\r
- oParams[ k ] = CKEDITOR._scaytParams[ k ];\r
+ oParams[ k ] = scayt_custom_params[ k ];\r
}\r
}\r
+ // needs for restoring a specific scayt control settings\r
+ if ( scayt_control_id )\r
+ oParams.id = scayt_control_id;\r
\r
var scayt_control = new window.scayt( oParams );\r
\r
var fTabs = [];\r
\r
for (var i = 0,l=4; i<l; i++)\r
- fTabs.push( uiTabs[i] && plugin.uiTabs[i] );\r
+ fTabs.push( uiTabs[i] && plugin.uiTabs[i] );\r
\r
plugin.uiTabs = fTabs;\r
try {\r
{\r
if ( (ev.data.name == 'source' || ev.data.name == 'newpage') && editor.mode == 'wysiwyg' )\r
{\r
- var scayt_instanse = plugin.getScayt( editor );\r
- if ( scayt_instanse )\r
+ var scayt_instance = plugin.getScayt( editor );\r
+ if ( scayt_instance )\r
{\r
- scayt_paused = scayt_instanse.paused = !scayt_instanse.disabled;\r
- scayt_instanse.destroy();\r
+ scayt_paused = scayt_instance.paused = !scayt_instance.disabled;\r
+ // store a control id for restore a specific scayt control settings\r
+ scayt_control_id = scayt_instance.id;\r
+ scayt_instance.destroy( true );\r
delete plugin.instances[ editor.name ];\r
}\r
}\r
});\r
\r
-\r
- editor.on( 'destroy', function()\r
+ editor.on( 'destroy', function( ev )\r
{\r
- plugin.getScayt( editor ).destroy();\r
+ var editor = ev.editor,\r
+ scayt_instance = plugin.getScayt( editor );\r
+ // store a control id for restore a specific scayt control settings\r
+ scayt_control_id = scayt_instance.id;\r
+ scayt_instance.destroy( true );\r
+ delete plugin.instances[ editor.name ];\r
});\r
+\r
// Listen to data manipulation to reflect scayt markup.\r
editor.on( 'afterSetData', function()\r
{\r
- if ( plugin.isScaytEnabled( editor ) )\r
- plugin.getScayt( editor ).refresh();\r
+ if ( plugin.isScaytEnabled( editor ) ) {\r
+ window.setTimeout( function(){ plugin.getScayt( editor ).refresh(); }, 10 );\r
+ }\r
});\r
\r
// Reload spell-checking for current word after insertion completed.\r
editor.getSelection().unlock( true );\r
\r
// Swallow any SCAYT engine errors.\r
- try{\r
- scayt_instance.refresh();\r
- }catch( er )\r
- {}\r
+ window.setTimeout( function(){ scayt_instance.refresh(); }, 10 );\r
}\r
}, this, null, 50 );\r
\r
editor.on( 'insertHtml', function()\r
{\r
-\r
var scayt_instance = plugin.getScayt( editor );\r
if ( plugin.isScaytEnabled( editor ) )\r
{\r
editor.getSelection().unlock( true );\r
\r
// Swallow any SCAYT engine errors.\r
- try{\r
- scayt_instance.refresh();\r
- }catch( er )\r
- {}\r
+ window.setTimeout( function(){ scayt_instance.refresh(); },10 );\r
}\r
}, this, null, 50 );\r
\r
\r
var dataProcessor = editor.dataProcessor,\r
htmlFilter = dataProcessor && dataProcessor.htmlFilter;\r
+\r
if ( htmlFilter )\r
{\r
htmlFilter.addRules(\r
},\r
isScaytEnabled : function( editor )\r
{\r
- var scayt_instanse = this.getScayt( editor );\r
- return ( scayt_instanse ) ? scayt_instanse.disabled === false : false;\r
+ var scayt_instance = this.getScayt( editor );\r
+ return ( scayt_instance ) ? scayt_instance.disabled === false : false;\r
},\r
loadEngine : function( editor )\r
{\r
+ // SCAYT doesn't work with Opera.\r
+ if ( CKEDITOR.env.opera )\r
+ return null;\r
+\r
if ( this.engineLoaded === true )\r
return onEngineLoad.apply( editor ); // Add new instance.\r
else if ( this.engineLoaded == -1 ) // We are waiting.\r
- return CKEDITOR.on( 'scaytReady', function(){ onEngineLoad.apply( editor );} ); // Use function(){} to avoid rejection as duplicate.\r
+ return CKEDITOR.on( 'scaytReady', function(){ onEngineLoad.apply( editor ); } ); // Use function(){} to avoid rejection as duplicate.\r
\r
CKEDITOR.on( 'scaytReady', onEngineLoad, editor );\r
CKEDITOR.on( 'scaytReady', function()\r
},\r
this,\r
null,\r
- 0 ); // First to run.\r
+ 0\r
+ ); // First to run.\r
\r
this.engineLoaded = -1; // Loading in progress.\r
\r
var protocol = document.location.protocol;\r
// Default to 'http' for unknown.\r
protocol = protocol.search( /https?:/) != -1? protocol : 'http:';\r
- var baseUrl = "svc.spellchecker.net/spellcheck3/lf/scayt/scayt21.js";\r
+ var baseUrl = 'svc.spellchecker.net/spellcheck31/lf/scayt/scayt22.js';\r
\r
- var scaytUrl = editor.config.scayt_srcUrl || ( protocol + "//" + baseUrl );\r
- var scaytConfigBaseUrl = plugin.parseUrl( scaytUrl ).path + "/";\r
+ var scaytUrl = editor.config.scayt_srcUrl || ( protocol + '//' + baseUrl );\r
+ var scaytConfigBaseUrl = plugin.parseUrl( scaytUrl ).path + '/';\r
\r
CKEDITOR._djScaytConfig =\r
{\r
[\r
function()\r
{\r
- CKEDITOR.fireOnce( "scaytReady" );\r
+ CKEDITOR.fireOnce( 'scaytReady' );\r
}\r
],\r
isDebug: false\r
// Add Options dialog.\r
CKEDITOR.dialog.add( commandName, CKEDITOR.getUrl( this.path + 'dialogs/options.js' ) );\r
// read ui tags\r
- var confuiTabs = editor.config.scayt_uiTabs || "1,1,1";\r
+ var confuiTabs = editor.config.scayt_uiTabs || '1,1,1';\r
var uiTabs =[];\r
- // string tp array convert\r
- confuiTabs = confuiTabs.split(",");\r
- // check array length ! allwaays must be 3 filled with 1 or 0\r
- for (var i=0,l=3; i<l; i++){\r
- var flag = parseInt(confuiTabs[i] || "1" ,10);\r
- uiTabs.push( flag );\r
+ // string to array convert\r
+ confuiTabs = confuiTabs.split( ',' );\r
+ // check array length ! always must be 3 filled with 1 or 0\r
+ for (var i=0,l=3; i<l; i++)\r
+ {\r
+ var flag = parseInt(confuiTabs[i] || '1' ,10);\r
+ uiTabs.push( flag );\r
}\r
\r
var menuGroup = 'scaytButton';\r
// combine menu items to render\r
var uiMuneItems = {};\r
\r
- // allways added\r
+ // always added\r
uiMuneItems.scaytToggle =\r
{\r
label : editor.lang.scayt.enable,\r
editor.openDialog( commandName );\r
}\r
};\r
- // allways added\r
+ // always added\r
uiMuneItems.scaytAbout =\r
{\r
label : editor.lang.scayt.about,\r
}\r
;\r
\r
- uiTabs[3] = 1; // about us tab is allways on\r
+ uiTabs[3] = 1; // about us tab is always on\r
plugin.uiTabs = uiTabs;\r
\r
editor.addMenuItems( uiMuneItems );\r
// If the "contextmenu" plugin is loaded, register the listeners.\r
if ( editor.contextMenu && editor.addMenuItems )\r
{\r
- editor.contextMenu.addListener( function( element )\r
+ editor.contextMenu.addListener( function( )\r
{\r
- if ( !( plugin.isScaytEnabled( editor ) && element ) )\r
+ if ( !plugin.isScaytEnabled( editor ) )\r
return null;\r
\r
var scayt_control = plugin.getScayt( editor ),\r
- word = scayt_control.getWord( element.$ );\r
+ node = scayt_control.getScaytNode();\r
+\r
+ if ( !node )\r
+ return null;\r
+\r
+ var word = scayt_control.getWord( node );\r
\r
if ( !word )\r
return null;\r
var sLang = scayt_control.getLang(),\r
_r = {},\r
items_suggestion = window.scayt.getSuggestion( word, sLang );\r
- if (!items_suggestion || !items_suggestion.length )\r
+ if ( !items_suggestion || !items_suggestion.length )\r
return null;\r
// Remove unused commands and menuitems\r
for ( i in moreSuggestions )\r
moreSuggestions = {}; // Reset items.\r
mainSuggestions = {};\r
\r
- var moreSuggestionsUnable = editor.config.scayt_moreSuggestions || "on";\r
+ var moreSuggestionsUnable = editor.config.scayt_moreSuggestions || 'on';\r
var moreSuggestionsUnableAdded = false;\r
\r
var maxSuggestions = editor.config.scayt_maxSuggestions;\r
( typeof maxSuggestions != 'number' ) && ( maxSuggestions = 5 );\r
!maxSuggestions && ( maxSuggestions = items_suggestion.length );\r
\r
- var contextCommands = editor.config.scayt_contextCommands || "all";\r
- contextCommands = contextCommands.split("|");\r
+ var contextCommands = editor.config.scayt_contextCommands || 'all';\r
+ contextCommands = contextCommands.split( '|' );\r
\r
for ( var i = 0, l = items_suggestion.length; i < l; i += 1 )\r
{\r
scayt_control.replace(el, s);\r
}\r
};\r
- })( element.$, items_suggestion[i] );\r
+ })( node, items_suggestion[i] );\r
\r
if ( i < maxSuggestions )\r
{\r
_r[ commandName ] = CKEDITOR.TRISTATE_OFF;\r
mainSuggestions[ commandName ] = CKEDITOR.TRISTATE_OFF;\r
}\r
- else if ( moreSuggestionsUnable == "on" )\r
+ else if ( moreSuggestionsUnable == 'on' )\r
{\r
addButtonCommand( editor, 'button_' + commandName, items_suggestion[i],\r
commandName, exec, 'scayt_moresuggest', i + 1 );\r
}\r
}\r
\r
- if ( moreSuggestionsUnableAdded ){\r
- // Rgister the More suggestions group;\r
+ if ( moreSuggestionsUnableAdded )\r
+ {\r
+ // Register the More suggestions group;\r
editor.addMenuItem( 'scayt_moresuggest',\r
{\r
label : editor.lang.scayt.moreSuggestions,\r
}\r
});\r
mainSuggestions[ 'scayt_moresuggest' ] = CKEDITOR.TRISTATE_OFF;\r
-\r
}\r
\r
- if ( in_array( "all",contextCommands ) || in_array("ignore",contextCommands) )\r
+ if ( in_array( 'all', contextCommands ) || in_array( 'ignore', contextCommands) )\r
{\r
var ignore_command = {\r
exec: function(){\r
- scayt_control.ignore(element.$);\r
+ scayt_control.ignore( node );\r
}\r
};\r
- addButtonCommand(editor, 'ignore', editor.lang.scayt.ignore, 'scayt_ignore', ignore_command, 'scayt_control', 1);\r
- mainSuggestions['scayt_ignore'] = CKEDITOR.TRISTATE_OFF;\r
+ addButtonCommand( editor, 'ignore', editor.lang.scayt.ignore, 'scayt_ignore', ignore_command, 'scayt_control', 1 );\r
+ mainSuggestions[ 'scayt_ignore' ] = CKEDITOR.TRISTATE_OFF;\r
}\r
\r
- if ( in_array( "all",contextCommands ) || in_array("ignoreall",contextCommands) )\r
+ if ( in_array( 'all', contextCommands ) || in_array( 'ignoreall', contextCommands ) )\r
{\r
var ignore_all_command = {\r
exec: function(){\r
- scayt_control.ignoreAll(element.$);\r
+ scayt_control.ignoreAll( node );\r
}\r
};\r
addButtonCommand(editor, 'ignore_all', editor.lang.scayt.ignoreAll, 'scayt_ignore_all', ignore_all_command, 'scayt_control', 2);\r
mainSuggestions['scayt_ignore_all'] = CKEDITOR.TRISTATE_OFF;\r
}\r
\r
- if ( in_array( "all",contextCommands ) || in_array("add",contextCommands) )\r
+ if ( in_array( 'all', contextCommands ) || in_array( 'add', contextCommands ) )\r
{\r
var addword_command = {\r
exec: function(){\r
- window.scayt.addWordToUserDictionary(element.$);\r
+ window.scayt.addWordToUserDictionary( node );\r
}\r
};\r
addButtonCommand(editor, 'add_word', editor.lang.scayt.addWord, 'scayt_add_word', addword_command, 'scayt_control', 3);\r
command.setState( plugin.isScaytEnabled( editor ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );\r
};\r
editor.on( 'showScaytState', showInitialState );\r
+ editor.on( 'instanceReady', function()\r
+ {\r
+ plugin.loadEngine( editor );\r
+ });\r
+ }\r
+ },\r
\r
- plugin.loadEngine( editor );\r
+ afterInit : function( editor )\r
+ {\r
+ // Prevent word marker line from displaying in elements path. (#3570)\r
+ var elementsPathFilters;\r
+ if ( editor._.elementsPath && ( elementsPathFilters = editor._.elementsPath.filters ) )\r
+ {\r
+ elementsPathFilters.push( function( element )\r
+ {\r
+ if ( element.hasAttribute( 'scaytid' ) )\r
+ return false;\r
+ } );\r
}\r
+\r
}\r
});\r
})();\r
\r
-// TODO: Documentation\r
-// CKEDITOR.config.scayt_maxSuggestions\r
-// CKEDITOR.config.scayt_autoStartup\r
+/**\r
+ * If enabled (true), turns on SCAYT automatically after loading the editor.\r
+ * @name CKEDITOR.config.scayt_autoStartup\r
+ * @type Boolean\r
+ * @default false\r
+ * @example\r
+ * config.scayt_autoStartup = true;\r
+ */\r
+\r
+/**\r
+ * Defines the number of SCAYT suggestions to show in the main context menu.\r
+ * The possible values are:\r
+ * <ul>\r
+ * <li>0 (zero): All suggestions are displayed in the main context menu.</li>\r
+ * <li>Positive number: The maximum number of suggestions to shown in context\r
+ * menu. Other entries will be shown in "More Suggestions" sub-menu.</li>\r
+ * <li>Negative number: No suggestions are shown in the main context menu. All\r
+ * entries will be listed in the "Suggestions" sub-menu.</li>\r
+ * </ul>\r
+ * @name CKEDITOR.config.scayt_maxSuggestions\r
+ * @type Number\r
+ * @default 5\r
+ * @example\r
+ * // Display only three suggestions in the main context menu.\r
+ * config.scayt_maxSuggestions = 3;\r
+ * @example\r
+ * // Do not show the suggestions directly.\r
+ * config.scayt_maxSuggestions = -1;\r
+ */\r
+\r
+/**\r
+ * Sets the customer ID for SCAYT. Required for migration from free version\r
+ * with banner to paid version.\r
+ * @name CKEDITOR.config.scayt_customerid\r
+ * @type String\r
+ * @default ''\r
+ * @example\r
+ * // Load SCAYT using my customer ID.\r
+ * config.scayt_customerid = 'your-encrypted-customer-id';\r
+ */\r
+\r
+/**\r
+ * Enables/disables the "More Suggestions" sub-menu in the context menu.\r
+ * The possible values are "on" or "off".\r
+ * @name CKEDITOR.config.scayt_moreSuggestions\r
+ * @type String\r
+ * @default 'on'\r
+ * @example\r
+ * // Disables the "More Suggestions" sub-menu.\r
+ * config.scayt_moreSuggestions = 'off';\r
+ */\r
+\r
+/**\r
+ * Customizes the display of SCAYT context menu commands ("Add Word", "Ignore"\r
+ * and "Ignore All"). It must be a string with one or more of the following\r
+ * words separated by a pipe ("|"):\r
+ * <ul>\r
+ * <li>"off": disables all options.</li>\r
+ * <li>"all": enables all options.</li>\r
+ * <li>"ignore": enables the "Ignore" option.</li>\r
+ * <li>"ignoreall": enables the "Ignore All" option.</li>\r
+ * <li>"add": enables the "Add Word" option.</li>\r
+ * </ul>\r
+ * @name CKEDITOR.config.scayt_contextCommands\r
+ * @type String\r
+ * @default 'all'\r
+ * @example\r
+ * // Show only "Add Word" and "Ignore All" in the context menu.\r
+ * config.scayt_contextCommands = 'add|ignoreall';\r
+ */\r
+\r
+/**\r
+ * Sets the default spellchecking language for SCAYT.\r
+ * @name CKEDITOR.config.scayt_sLang\r
+ * @type String\r
+ * @default 'en_US'\r
+ * @example\r
+ * // Sets SCAYT to German.\r
+ * config.scayt_sLang = 'de_DE';\r
+ */\r
+\r
+/**\r
+ * Sets the visibility of the SCAYT tabs in the settings dialog and toolbar\r
+ * button. The value must contain a "1" (enabled) or "0" (disabled) number for\r
+ * each of the following entries, in this precise order, separated by a\r
+ * comma (","): "Options", "Languages" and "Dictionary".\r
+ * @name CKEDITOR.config.scayt_uiTabs\r
+ * @type String\r
+ * @default '1,1,1'\r
+ * @example\r
+ * // Hide the "Languages" tab.\r
+ * config.scayt_uiTabs = '1,0,1';\r
+ */\r
+\r
+\r
+/**\r
+ * Set the URL to SCAYT core. Required to switch to licensed version of SCAYT application.\r
+ * Further details at http://wiki.spellchecker.net/doku.php?id=3rd:wysiwyg:fckeditor:wscckf3l .\r
+ * @name CKEDITOR.config.scayt_srcUrl\r
+ * @type String\r
+ * @default ''\r
+ * @example\r
+ * config.scayt_srcUrl = "http://my-host/spellcheck/lf/scayt/scayt.js";\r
+ */\r
+\r
+/**\r
+ * Links SCAYT to custom dictionaries. It's a string containing dictionary ids\r
+ * separared by commas (","). Available only for licensed version.\r
+ * Further details at http://wiki.spellchecker.net/doku.php?id=custom_dictionary_support .\r
+ * @name CKEDITOR.config.scayt_customDictionaryIds\r
+ * @type String\r
+ * @default ''\r
+ * @example\r
+ * config.scayt_customDictionaryIds = '3021,3456,3478"';\r
+ */\r
+\r
+/**\r
+ * Makes it possible to activate a custom dictionary on SCAYT. The user\r
+ * dictionary name must be used. Available only for licensed version.\r
+ * @name CKEDITOR.config.scayt_userDictionaryName\r
+ * @type String\r
+ * @default ''\r
+ * @example\r
+ * config.scayt_userDictionaryName = 'MyDictionary';\r
+ */\r