Browse Source

Add scayt ckeditor plugin manually after it was deleted by the latest Bower update - refs #1469

Yannick Warnier 8 years ago
parent
commit
8b1a04e23d
67 changed files with 3281 additions and 19 deletions
  1. 25 0
      app/Resources/public/assets/ckeditor/plugins/scayt/README.md
  2. 573 19
      app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/options.js
  3. BIN
      app/Resources/public/assets/ckeditor/plugins/scayt/icons/hidpi/scayt.png
  4. BIN
      app/Resources/public/assets/ckeditor/plugins/scayt/icons/scayt.png
  5. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/af.js
  6. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ar.js
  7. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/bg.js
  8. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/bn.js
  9. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/bs.js
  10. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ca.js
  11. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/cs.js
  12. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/cy.js
  13. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/da.js
  14. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/de.js
  15. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/el.js
  16. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-au.js
  17. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-ca.js
  18. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-gb.js
  19. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/en.js
  20. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/eo.js
  21. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/es.js
  22. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/et.js
  23. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/eu.js
  24. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/fa.js
  25. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/fi.js
  26. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/fo.js
  27. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr-ca.js
  28. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr.js
  29. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/gl.js
  30. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/gu.js
  31. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/he.js
  32. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/hi.js
  33. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/hr.js
  34. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/hu.js
  35. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/is.js
  36. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/it.js
  37. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ja.js
  38. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ka.js
  39. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/km.js
  40. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ko.js
  41. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ku.js
  42. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/lt.js
  43. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/lv.js
  44. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/mk.js
  45. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/mn.js
  46. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ms.js
  47. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/nb.js
  48. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/nl.js
  49. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/no.js
  50. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/pl.js
  51. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt-br.js
  52. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt.js
  53. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ro.js
  54. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ru.js
  55. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/sk.js
  56. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/sl.js
  57. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr-latn.js
  58. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr.js
  59. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/sv.js
  60. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/th.js
  61. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/tr.js
  62. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/ug.js
  63. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/uk.js
  64. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/vi.js
  65. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh-cn.js
  66. 13 0
      app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh.js
  67. 1877 0
      app/Resources/public/assets/ckeditor/plugins/scayt/plugin.js

+ 25 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/README.md

@@ -0,0 +1,25 @@
+CKEditor SCAYT Plugin
+=====================
+
+This plugin brings Spell Check As You Type (SCAYT) into up to CKEditor 4+.
+
+SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
+2. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
+
+        config.extraPlugins = 'scayt';
+
+That's all. SCAYT will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).

+ 573 - 19
app/Resources/public/assets/ckeditor/plugins/scayt/dialogs/options.js

@@ -1,19 +1,573 @@
-CKEDITOR.dialog.add("scaytDialog",function(c){var f=c.scayt,q='\x3cp\x3e\x3cimg src\x3d"'+f.getLogo()+'" /\x3e\x3c/p\x3e\x3cp\x3e'+f.getLocal("version")+f.getVersion()+"\x3c/p\x3e\x3cp\x3e"+f.getLocal("text_copyrights")+"\x3c/p\x3e",r=CKEDITOR.document,n={isChanged:function(){return null===this.newLang||this.currentLang===this.newLang?!1:!0},currentLang:f.getLang(),newLang:null,reset:function(){this.currentLang=f.getLang();this.newLang=null},id:"lang"},q=[{id:"options",label:f.getLocal("tab_options"),
-onShow:function(){},elements:[{type:"vbox",id:"scaytOptions",children:function(){var a=f.getApplicationConfig(),b=[],g={"ignore-all-caps-words":"label_allCaps","ignore-domain-names":"label_ignoreDomainNames","ignore-words-with-mixed-cases":"label_mixedCase","ignore-words-with-numbers":"label_mixedWithDigits"},e;for(e in a)a={type:"checkbox"},a.id=e,a.label=f.getLocal(g[e]),b.push(a);return b}(),onShow:function(){this.getChild();for(var a=c.scayt,b=0;b<this.getChild().length;b++)this.getChild()[b].setValue(a.getApplicationConfig()[this.getChild()[b].id])}}]},
-{id:"langs",label:f.getLocal("tab_languages"),elements:[{id:"leftLangColumn",type:"vbox",align:"left",widths:["100"],children:[{type:"html",id:"langBox",style:"overflow: hidden; white-space: normal;margin-bottom:15px;",html:'\x3cdiv\x3e\x3cdiv style\x3d"float:left;width:45%;margin-left:5px;" id\x3d"left-col-'+c.name+'"\x3e\x3c/div\x3e\x3cdiv style\x3d"float:left;width:45%;margin-left:15px;" id\x3d"right-col-'+c.name+'"\x3e\x3c/div\x3e\x3c/div\x3e',onShow:function(){var a=c.scayt.getLang();r.getById("scaytLang_"+
-c.name+"_"+a).$.checked=!0}},{type:"html",id:"graytLanguagesHint",html:'\x3cdiv style\x3d"margin:5px auto; width:95%;white-space:normal;" id\x3d"'+c.name+'graytLanguagesHint"\x3e\x3cspan style\x3d"width:10px;height:10px;display: inline-block; background:#02b620;vertical-align:top;margin-top:2px;"\x3e\x3c/span\x3e - This languages are supported by Grammar As You Type(GRAYT).\x3c/div\x3e',onShow:function(){var a=r.getById(c.name+"graytLanguagesHint");c.config.grayt_autoStartup||(a.$.style.display="none")}}]}]},
-{id:"dictionaries",label:f.getLocal("tab_dictionaries"),elements:[{type:"vbox",id:"rightCol_col__left",children:[{type:"html",id:"dictionaryNote",html:""},{type:"text",id:"dictionaryName",label:f.getLocal("label_fieldNameDic")||"Dictionary name",onShow:function(a){var b=a.sender,g=c.scayt;setTimeout(function(){b.getContentElement("dictionaries","dictionaryNote").getElement().setText("");null!=g.getUserDictionaryName()&&""!=g.getUserDictionaryName()&&b.getContentElement("dictionaries","dictionaryName").setValue(g.getUserDictionaryName())},
-0)}},{type:"hbox",id:"notExistDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"createDic",label:f.getLocal("btn_createDic"),title:f.getLocal("btn_createDic"),onClick:function(){var a=this.getDialog(),b=p,g=c.scayt,e=a.getContentElement("dictionaries","dictionaryName").getValue();g.createUserDictionary(e,function(d){d.error||b.toggleDictionaryButtons.call(a,!0);d.dialog=a;d.command="create";d.name=e;c.fire("scaytUserDictionaryAction",d)},function(d){d.dialog=
-a;d.command="create";d.name=e;c.fire("scaytUserDictionaryActionError",d)})}},{type:"button",id:"restoreDic",label:f.getLocal("btn_restoreDic"),title:f.getLocal("btn_restoreDic"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=p,e=a.getContentElement("dictionaries","dictionaryName").getValue();b.restoreUserDictionary(e,function(d){d.dialog=a;d.error||g.toggleDictionaryButtons.call(a,!0);d.command="restore";d.name=e;c.fire("scaytUserDictionaryAction",d)},function(d){d.dialog=a;d.command="restore";
-d.name=e;c.fire("scaytUserDictionaryActionError",d)})}}]},{type:"hbox",id:"existDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"removeDic",label:f.getLocal("btn_deleteDic"),title:f.getLocal("btn_deleteDic"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=p,e=a.getContentElement("dictionaries","dictionaryName"),d=e.getValue();b.removeUserDictionary(d,function(b){e.setValue("");b.error||g.toggleDictionaryButtons.call(a,!1);b.dialog=a;b.command="remove";
-b.name=d;c.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="remove";b.name=d;c.fire("scaytUserDictionaryActionError",b)})}},{type:"button",id:"renameDic",label:f.getLocal("btn_renameDic"),title:f.getLocal("btn_renameDic"),onClick:function(){var a=this.getDialog(),b=c.scayt,g=a.getContentElement("dictionaries","dictionaryName").getValue();b.renameUserDictionary(g,function(b){b.dialog=a;b.command="rename";b.name=g;c.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command=
-"rename";b.name=g;c.fire("scaytUserDictionaryActionError",b)})}}]},{type:"html",id:"dicInfo",html:'\x3cdiv id\x3d"dic_info_editor1" style\x3d"margin:5px auto; width:95%;white-space:normal;"\x3e'+f.getLocal("text_descriptionDic")+"\x3c/div\x3e"}]}]},{id:"about",label:f.getLocal("tab_about"),elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'\x3cdiv\x3e\x3cdiv id\x3d"scayt_about_"\x3e'+q+"\x3c/div\x3e\x3c/div\x3e"}]}];c.on("scaytUserDictionaryAction",function(a){var b=SCAYT.prototype.UILib,
-g=a.data.dialog,e=g.getContentElement("dictionaries","dictionaryNote").getElement(),d=a.editor.scayt,c;void 0===a.data.error?(c=d.getLocal("message_success_"+a.data.command+"Dic"),c=c.replace("%s",a.data.name),e.setText(c),b.css(e.$,{color:"blue"})):(""===a.data.name?e.setText(d.getLocal("message_info_emptyDic")):(c=d.getLocal("message_error_"+a.data.command+"Dic"),c=c.replace("%s",a.data.name),e.setText(c)),b.css(e.$,{color:"red"}),null!=d.getUserDictionaryName()&&""!=d.getUserDictionaryName()?g.getContentElement("dictionaries",
-"dictionaryName").setValue(d.getUserDictionaryName()):g.getContentElement("dictionaries","dictionaryName").setValue(""))});c.on("scaytUserDictionaryActionError",function(a){var b=SCAYT.prototype.UILib,c=a.data.dialog,e=c.getContentElement("dictionaries","dictionaryNote").getElement(),d=a.editor.scayt,f;""===a.data.name?e.setText(d.getLocal("message_info_emptyDic")):(f=d.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),e.setText(f));b.css(e.$,{color:"red"});null!=d.getUserDictionaryName()&&
-""!=d.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(d.getUserDictionaryName()):c.getContentElement("dictionaries","dictionaryName").setValue("")});var p={title:f.getLocal("text_title"),resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:340,minHeight:260,onLoad:function(){if(0!=c.config.scayt_uiTabs[1]){var a=p,b=a.getLangBoxes.call(this);b.getParent().setStyle("white-space","normal");a.renderLangList(b);this.definition.minWidth=this.getSize().width;this.resize(this.definition.minWidth,
-this.definition.minHeight)}},onCancel:function(){n.reset()},onHide:function(){c.unlockSelection()},onShow:function(){c.fire("scaytDialogShown",this);if(0!=c.config.scayt_uiTabs[2]){var a=c.scayt,b=this.getContentElement("dictionaries","dictionaryName"),g=this.getContentElement("dictionaries","existDic").getElement().getParent(),e=this.getContentElement("dictionaries","notExistDic").getElement().getParent();g.hide();e.hide();null!=a.getUserDictionaryName()&&""!=a.getUserDictionaryName()?(this.getContentElement("dictionaries",
-"dictionaryName").setValue(a.getUserDictionaryName()),g.show()):(b.setValue(""),e.show())}},onOk:function(){var a=p,b=c.scayt;this.getContentElement("options","scaytOptions");a=a.getChangedOption.call(this);b.commitOption({changedOptions:a})},toggleDictionaryButtons:function(a){var b=this.getContentElement("dictionaries","existDic").getElement().getParent(),c=this.getContentElement("dictionaries","notExistDic").getElement().getParent();a?(b.show(),c.hide()):(b.hide(),c.show())},getChangedOption:function(){var a=
-{};if(1==c.config.scayt_uiTabs[0])for(var b=this.getContentElement("options","scaytOptions").getChild(),g=0;g<b.length;g++)b[g].isChanged()&&(a[b[g].id]=b[g].getValue());n.isChanged()&&(a[n.id]=c.config.scayt_sLang=n.currentLang=n.newLang);return a},buildRadioInputs:function(a,b,g){var e=new CKEDITOR.dom.element("div"),d="scaytLang_"+c.name+"_"+b,f=CKEDITOR.dom.element.createFromHtml('\x3cinput id\x3d"'+d+'" type\x3d"radio"  value\x3d"'+b+'" name\x3d"scayt_lang" /\x3e'),m=new CKEDITOR.dom.element("label"),
-k=c.scayt;e.setStyles({"white-space":"normal",position:"relative","padding-bottom":"2px"});f.on("click",function(a){n.newLang=a.sender.getValue()});m.appendText(a);m.setAttribute("for",d);g&&c.config.grayt_autoStartup&&m.setStyles({color:"#02b620"});e.append(f);e.append(m);b===k.getLang()&&(f.setAttribute("checked",!0),f.setAttribute("defaultChecked","defaultChecked"));return e},renderLangList:function(a){var b=a.find("#left-col-"+c.name).getItem(0);a=a.find("#right-col-"+c.name).getItem(0);var g=
-f.getScaytLangList(),e=f.getGraytLangList(),d={},l=[],m=0,k=!1,h;for(h in g.ltr)d[h]=g.ltr[h];for(h in g.rtl)d[h]=g.rtl[h];for(h in d)l.push([h,d[h]]);l.sort(function(a,b){var c=0;a[1]>b[1]?c=1:a[1]<b[1]&&(c=-1);return c});d={};for(k=0;k<l.length;k++)d[l[k][0]]=l[k][1];l=Math.round(l.length/2);for(h in d)m++,k=h in e.ltr||h in e.rtl,this.buildRadioInputs(d[h],h,k).appendTo(m<=l?b:a)},getLangBoxes:function(){return this.getContentElement("langs","langBox").getElement()},contents:function(a,b){var c=
-[],e=b.config.scayt_uiTabs;if(e){for(var d in e)1==e[d]&&c.push(a[d]);c.push(a[a.length-1])}else return a;return c}(q,c)};return p});
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add( 'scaytDialog', function( editor ) {
+	var scayt_instance =  editor.scayt;
+
+	var aboutTabDefinition = '<p><img src="' + scayt_instance.getLogo() + '" /></p>' +
+				'<p>' + scayt_instance.getLocal('version') + scayt_instance.getVersion() + '</p>' +
+				'<p>' + scayt_instance.getLocal('text_copyrights') + '</p>';
+
+	var doc = CKEDITOR.document;
+
+	var optionGenerator = function() {
+		var scayt_instance_ = editor.scayt,
+			applicationConfig = scayt_instance.getApplicationConfig(),
+			optionArrayUiCheckboxes = [],
+			optionLocalizationList = {
+				"ignore-all-caps-words" 		: "label_allCaps",
+				"ignore-domain-names" 			: "label_ignoreDomainNames",
+				"ignore-words-with-mixed-cases" : "label_mixedCase",
+				"ignore-words-with-numbers" 	: "label_mixedWithDigits"
+			};
+
+		for(var option in applicationConfig) {
+
+			var checkboxConfig = {
+				type: "checkbox"
+			};
+
+			checkboxConfig.id  = option;
+			checkboxConfig.label  = scayt_instance.getLocal(optionLocalizationList[option]);
+
+			optionArrayUiCheckboxes.push(checkboxConfig);
+		}
+
+		return optionArrayUiCheckboxes;
+	};
+
+	var languageModelState = {
+		isChanged : function() {
+			return (this.newLang === null || this.currentLang === this.newLang) ? false : true;
+		},
+		currentLang: scayt_instance.getLang(),
+		newLang: null,
+		reset: function() {
+			this.currentLang = scayt_instance.getLang();
+			this.newLang = null;
+		},
+		id: 'lang'
+	};
+
+	var generateDialogTabs = function(tabsList, editor) {
+		var tabs = [],
+			uiTabs = editor.config.scayt_uiTabs;
+
+		if(!uiTabs) {
+			return tabsList;
+		} else {
+			for(var i in uiTabs) {
+				(uiTabs[i] == 1) && tabs.push(tabsList[i]);
+			}
+
+			tabs.push(tabsList[tabsList.length - 1]);
+		}
+
+		return tabs;
+	};
+
+	var dialogTabs = [{
+		id : 'options',
+		label : scayt_instance.getLocal('tab_options'),
+		onShow: function() {
+			// console.log("tab show");
+		},
+		elements : [
+			{
+				type: 'vbox',
+				id: 'scaytOptions',
+				children: optionGenerator(),
+				onShow: function() {
+					var optionsTab = this.getChild(),
+						scayt_instance =  editor.scayt;
+					for(var i = 0; i < this.getChild().length; i++) {
+						this.getChild()[i].setValue(scayt_instance.getApplicationConfig()[this.getChild()[i].id]);
+					}
+
+				}
+			}
+
+		]
+	},
+	{
+		id : 'langs',
+		label : scayt_instance.getLocal('tab_languages'),
+		elements : [
+			{
+				id: "leftLangColumn",
+				type: 'vbox',
+				align: 'left',
+				widths: ['100'],
+				children: [
+					{
+						type: 'html',
+						id: 'langBox',
+						style: 'overflow: hidden; white-space: normal;margin-bottom:15px;',
+						html: '<div><div style="float:left;width:45%;margin-left:5px;" id="left-col-' + editor.name + '"></div><div style="float:left;width:45%;margin-left:15px;" id="right-col-' + editor.name + '"></div></div>',
+						onShow: function() {
+							var scayt_instance =  editor.scayt;
+							var lang = scayt_instance.getLang(),
+								prefix_id = "scaytLang_",
+								radio = doc.getById(prefix_id + editor.name + '_' + lang);
+
+							radio.$.checked = true;
+						}
+					},
+					{
+						type: 'html',
+						id: 'graytLanguagesHint',
+						html: '<div style="margin:5px auto; width:95%;white-space:normal;" id="' + editor.name + 'graytLanguagesHint"><span style="width:10px;height:10px;display: inline-block; background:#02b620;vertical-align:top;margin-top:2px;"></span> - This languages are supported by Grammar As You Type(GRAYT).</div>',
+						onShow: function() {
+							var graytLanguagesHint = doc.getById(editor.name + 'graytLanguagesHint');
+
+							if (!editor.config.grayt_autoStartup) {
+								graytLanguagesHint.$.style.display = 'none';
+							}
+						}
+					}
+				]
+			}
+		]
+	},
+	{
+		id : 'dictionaries',
+		label : scayt_instance.getLocal('tab_dictionaries'),
+		elements : [
+			{
+				type: 'vbox',
+				id: 'rightCol_col__left',
+				children: [
+					{
+						type: 'html',
+						id: 'dictionaryNote',
+						html: ''
+					},
+					{
+						type: 'text',
+						id: 'dictionaryName',
+						label: scayt_instance.getLocal('label_fieldNameDic') || 'Dictionary name',
+						onShow: function(data) {
+							var dialog = data.sender,
+								scayt_instance = editor.scayt;
+
+							// IE7 specific fix
+							setTimeout(function() {
+								// clear dictionaryNote field
+								dialog.getContentElement("dictionaries", "dictionaryNote").getElement().setText('');
+
+								// restore/clear dictionaryName field
+								if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+									dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+								}
+							}, 0);
+						}
+					},
+					{
+						type: 'hbox',
+						id: 'notExistDic',
+						align: 'left',
+						style: 'width:auto;',
+						widths: [ '50%', '50%' ],
+						children: [
+							{
+								type: 'button',
+								id: 'createDic',
+								label: scayt_instance.getLocal('btn_createDic'),
+								title: scayt_instance.getLocal('btn_createDic'),
+								onClick: function() {
+									var dialog = this.getDialog(),
+										self = dialogDefinition,
+										scayt_instance = editor.scayt,
+										name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
+
+									scayt_instance.createUserDictionary(name, function(response) {
+										if(!response.error) {
+											self.toggleDictionaryButtons.call(dialog, true);
+										}
+										response.dialog = dialog;
+										response.command = "create";
+										response.name = name;
+										editor.fire("scaytUserDictionaryAction", response);
+									}, function(error) {
+										error.dialog = dialog;
+										error.command = "create";
+										error.name = name;
+										editor.fire("scaytUserDictionaryActionError", error);
+									});
+								}
+							},
+							{
+								type: 'button',
+								id: 'restoreDic',
+								label: scayt_instance.getLocal('btn_restoreDic'),
+								title: scayt_instance.getLocal('btn_restoreDic'),
+								onClick: function() {
+									var dialog = this.getDialog(),
+										scayt_instance = editor.scayt,
+										self = dialogDefinition,
+										name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
+
+									scayt_instance.restoreUserDictionary(name, function(response) {
+										response.dialog = dialog;
+										if(!response.error) {
+											self.toggleDictionaryButtons.call(dialog, true);
+										}
+										response.command = "restore";
+										response.name = name;
+										editor.fire("scaytUserDictionaryAction", response);
+									}, function(error) {
+										error.dialog = dialog;
+										error.command = "restore";
+										error.name = name;
+										editor.fire("scaytUserDictionaryActionError", error);
+									});
+								}
+							}
+						]
+					},
+					{
+						type: 'hbox',
+						id: 'existDic',
+						align: 'left',
+						style: 'width:auto;',
+						widths: [ '50%', '50%' ],
+						children: [
+							{
+								type: 'button',
+								id: 'removeDic',
+								label: scayt_instance.getLocal('btn_deleteDic'),
+								title: scayt_instance.getLocal('btn_deleteDic'),
+								onClick: function() {
+									var dialog = this.getDialog(),
+										scayt_instance = editor.scayt,
+										self = dialogDefinition,
+										dictionaryNameField = dialog.getContentElement("dictionaries", "dictionaryName"),
+										name = dictionaryNameField.getValue();
+
+									scayt_instance.removeUserDictionary(name, function(response) {
+										dictionaryNameField.setValue("");
+										if(!response.error) {
+											self.toggleDictionaryButtons.call(dialog, false);
+										}
+										response.dialog = dialog;
+										response.command = "remove";
+										response.name = name;
+										editor.fire("scaytUserDictionaryAction", response);
+									}, function(error) {
+										error.dialog = dialog;
+										error.command = "remove";
+										error.name = name;
+										editor.fire("scaytUserDictionaryActionError", error);
+									});
+								}
+							},
+							{
+								type: 'button',
+								id: 'renameDic',
+								label: scayt_instance.getLocal('btn_renameDic'),
+								title: scayt_instance.getLocal('btn_renameDic'),
+								onClick: function() {
+									var dialog = this.getDialog(),
+										scayt_instance = editor.scayt,
+										name = dialog.getContentElement("dictionaries", "dictionaryName").getValue();
+
+									scayt_instance.renameUserDictionary(name, function(response) {
+										response.dialog = dialog;
+										response.command = "rename";
+										response.name = name;
+										editor.fire("scaytUserDictionaryAction", response);
+									}, function(error) {
+										error.dialog = dialog;
+										error.command = "rename";
+										error.name = name;
+										editor.fire("scaytUserDictionaryActionError", error);
+									});
+								}
+							}
+						]
+					},
+					{
+						type: 'html',
+						id: 'dicInfo',
+						html: '<div id="dic_info_editor1" style="margin:5px auto; width:95%;white-space:normal;">' + scayt_instance.getLocal('text_descriptionDic')  + '</div>'
+					}
+				]
+			}
+		]
+	},
+	{
+		id : 'about',
+		label : scayt_instance.getLocal('tab_about'),
+		elements : [
+			{
+				type : 'html',
+				id : 'about',
+				style : 'margin: 5px 5px;',
+				html : '<div><div id="scayt_about_">' +
+						aboutTabDefinition +
+						'</div></div>'
+			}
+		]
+	}];
+
+	editor.on("scaytUserDictionaryAction", function(event) {
+		var UILib = SCAYT.prototype.UILib,
+			dialog = event.data.dialog,
+			dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
+			scayt_instance =  event.editor.scayt,
+			messageTemplate;
+
+		if(event.data.error === undefined) {
+
+			// success message
+			messageTemplate = scayt_instance.getLocal("message_success_" + event.data.command + "Dic");
+			messageTemplate = messageTemplate.replace('%s', event.data.name);
+			dictionaryNote.setText(messageTemplate);
+			UILib.css(dictionaryNote.$, {color: 'blue'});
+		} else {
+
+			// error message
+			if(event.data.name === '') {
+
+				// empty dictionary name
+				dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
+			} else {
+				messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
+				messageTemplate = messageTemplate.replace('%s', event.data.name);
+				dictionaryNote.setText(messageTemplate);
+			}
+			UILib.css(dictionaryNote.$, {color: 'red'});
+
+			if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+				dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+			} else {
+				dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
+			}
+		}
+	});
+
+	editor.on("scaytUserDictionaryActionError", function(event) {
+		var UILib = SCAYT.prototype.UILib,
+			dialog = event.data.dialog,
+			dictionaryNote = dialog.getContentElement("dictionaries", "dictionaryNote").getElement(),
+			scayt_instance =  event.editor.scayt,
+			messageTemplate;
+
+		if(event.data.name === '') {
+
+			// empty dictionary name
+			dictionaryNote.setText(scayt_instance.getLocal('message_info_emptyDic'));
+		} else {
+			messageTemplate = scayt_instance.getLocal("message_error_" + event.data.command + "Dic");
+			messageTemplate = messageTemplate.replace('%s', event.data.name);
+			dictionaryNote.setText(messageTemplate);
+		}
+		UILib.css(dictionaryNote.$, {color: 'red'});
+
+
+		if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+			dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+		} else {
+			dialog.getContentElement("dictionaries", "dictionaryName").setValue("");
+		}
+
+	});
+
+	var plugin = CKEDITOR.plugins.scayt;
+
+	var dialogDefinition = {
+		title:          scayt_instance.getLocal('text_title'),
+		resizable:      CKEDITOR.DIALOG_RESIZE_BOTH,
+		minWidth: 		340,
+		minHeight: 		260,
+		onLoad: function() {
+			if(editor.config.scayt_uiTabs[1] == 0) {
+				return;
+			}
+
+			var dialog = this,
+				self = dialogDefinition,
+				langBoxes = self.getLangBoxes.call(dialog);
+
+			langBoxes.getParent().setStyle("white-space", "normal");
+
+			//dialog.data = editor.fire( 'scaytDialog', {} );
+			self.renderLangList(langBoxes);
+
+			var scayt_instance = editor.scayt;
+
+			this.definition.minWidth = this.getSize().width;
+			this.resize(this.definition.minWidth, this.definition.minHeight);
+		},
+		onCancel: function() {
+			languageModelState.reset();
+		},
+		onHide: function() {
+			editor.unlockSelection();
+		},
+		onShow: function() {
+			editor.fire("scaytDialogShown", this);
+
+			if(editor.config.scayt_uiTabs[2] == 0) {
+				return;
+			}
+
+			var scayt_instance = editor.scayt,
+				self = dialogDefinition,
+				dialog = this,
+				dictionaryNameField = dialog.getContentElement("dictionaries", "dictionaryName"),
+				existance = dialog.getContentElement("dictionaries", "existDic").getElement().getParent(),
+				notExistance = dialog.getContentElement("dictionaries", "notExistDic").getElement().getParent();
+
+			existance.hide();
+			notExistance.hide();
+
+			if(scayt_instance.getUserDictionaryName() != null && scayt_instance.getUserDictionaryName() != '') {
+				dialog.getContentElement("dictionaries", "dictionaryName").setValue(scayt_instance.getUserDictionaryName());
+				existance.show();
+			} else {
+				dictionaryNameField.setValue("");
+				notExistance.show();
+			}
+		},
+		onOk: function() {
+			var dialog = this,
+				self = dialogDefinition,
+				scayt_instance =  editor.scayt,
+				scaytOptions = dialog.getContentElement("options", "scaytOptions"),
+				changedOptions = self.getChangedOption.call(dialog);
+
+			scayt_instance.commitOption({ changedOptions: changedOptions });
+		},
+		toggleDictionaryButtons: function(exist) {
+			var existance = this.getContentElement("dictionaries", "existDic").getElement().getParent(),
+				notExistance = this.getContentElement("dictionaries", "notExistDic").getElement().getParent();
+
+			if(exist) {
+				existance.show();
+				notExistance.hide();
+			} else {
+				existance.hide();
+				notExistance.show();
+			}
+
+		},
+		getChangedOption: function() {
+			var changedOption = {};
+
+			if(editor.config.scayt_uiTabs[0] == 1) {
+				var dialog = this,
+					scaytOptions = dialog.getContentElement("options", "scaytOptions").getChild();
+
+				for(var i = 0; i < scaytOptions.length; i++) {
+					if(scaytOptions[i].isChanged()) {
+						changedOption[scaytOptions[i].id] = scaytOptions[i].getValue();
+					}
+				}
+			}
+
+			if(languageModelState.isChanged()) {
+				changedOption[languageModelState.id] = editor.config.scayt_sLang = languageModelState.currentLang = languageModelState.newLang;
+			}
+
+			return changedOption;
+		},
+		buildRadioInputs: function(key, value, isSupportedByGrayt) {
+			var divContainer = new CKEDITOR.dom.element( 'div' ),
+				doc = CKEDITOR.document,
+				id = "scaytLang_" + editor.name + '_' + value,
+				radio = CKEDITOR.dom.element.createFromHtml( '<input id="' +
+					id + '" type="radio" ' +
+					' value="' + value + '" name="scayt_lang" />' ),
+
+				radioLabel = new CKEDITOR.dom.element( 'label' ),
+				scayt_instance = editor.scayt;
+
+			divContainer.setStyles({
+				"white-space": "normal",
+				'position': 'relative',
+				'padding-bottom': '2px'
+			});
+
+			radio.on( 'click', function(data) {
+				languageModelState.newLang = data.sender.getValue();
+			});
+
+			radioLabel.appendText(key);
+			radioLabel.setAttribute("for", id);
+
+			if(isSupportedByGrayt && editor.config.grayt_autoStartup) {
+				radioLabel.setStyles({
+					'color': '#02b620'
+				});
+			}
+
+			divContainer.append(radio);
+			divContainer.append(radioLabel);
+
+			if(value === scayt_instance.getLang()) {
+				radio.setAttribute("checked", true);
+				radio.setAttribute('defaultChecked', 'defaultChecked');
+			}
+
+			return divContainer;
+		},
+		renderLangList: function(langBoxes) {
+			var dialog = this,
+				leftCol = langBoxes.find('#left-col-' + editor.name).getItem(0),
+				rightCol = langBoxes.find('#right-col-' + editor.name).getItem(0),
+				scaytLangList = scayt_instance.getScaytLangList(),
+				graytLangList = scayt_instance.getGraytLangList(),
+				mergedLangList = {},
+				sortable = [],
+				counter = 0,
+				isSupportedByGrayt = false,
+				half, lang;
+
+			for(lang in scaytLangList.ltr) {
+				mergedLangList[lang] = scaytLangList.ltr[lang];
+			}
+
+			for(lang in scaytLangList.rtl) {
+				mergedLangList[lang] = scaytLangList.rtl[lang];
+			}
+
+			// sort alphabetically lang list
+			for(lang in mergedLangList) {
+				sortable.push([lang, mergedLangList[lang]]);
+			}
+			sortable.sort(function(a, b) {
+				var result = 0;
+				if(a[1] > b[1]) {
+					result = 1;
+				} else if(a[1] < b[1]) {
+					result = -1;
+				}
+				return result;
+			});
+			mergedLangList = {};
+			for(var i = 0; i < sortable.length; i++) {
+				mergedLangList[sortable[i][0]] = sortable[i][1];
+			}
+
+			half = Math.round(sortable.length / 2);
+
+			for(lang in mergedLangList) {
+				counter++;
+				isSupportedByGrayt = (lang in graytLangList.ltr) || (lang in graytLangList.rtl);
+				dialog.buildRadioInputs(mergedLangList[lang], lang, isSupportedByGrayt).appendTo(counter <= half ? leftCol : rightCol);
+			}
+		},
+		getLangBoxes: function() {
+			var dialog = this,
+				langboxes = dialog.getContentElement("langs", "langBox").getElement();
+
+			return langboxes;
+		},
+		contents: generateDialogTabs(dialogTabs, editor)
+	};
+
+	return dialogDefinition;
+});

BIN
app/Resources/public/assets/ckeditor/plugins/scayt/icons/hidpi/scayt.png


BIN
app/Resources/public/assets/ckeditor/plugins/scayt/icons/scayt.png


+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/af.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'af', {
+	btn_about: 'SCAYT info',
+	btn_dictionaries: 'Woordeboeke',
+	btn_disable: 'SCAYT af',
+	btn_enable: 'SCAYT aan',
+	btn_langs:'Tale',
+	btn_options: 'Opsies',
+	text_title:  'Speltoets terwyl u tik'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ar.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ar', {
+	btn_about: 'عن SCAYT',
+	btn_dictionaries: 'قواميس',
+	btn_disable: 'تعطيل SCAYT',
+	btn_enable: 'تفعيل SCAYT',
+	btn_langs:'لغات',
+	btn_options: 'خيارات',
+	text_title:  'تدقيق إملائي أثناء الكتابة'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/bg.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bg', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Речници',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/bn.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bn', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/bs.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'bs', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ca.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ca', {
+	btn_about: 'Quant a l\'SCAYT',
+	btn_dictionaries: 'Diccionaris',
+	btn_disable: 'Deshabilita SCAYT',
+	btn_enable: 'Habilitat l\'SCAYT',
+	btn_langs:'Idiomes',
+	btn_options: 'Opcions',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/cs.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'cs', {
+	btn_about: 'O aplikaci SCAYT',
+	btn_dictionaries: 'Slovníky',
+	btn_disable: 'Vypnout SCAYT',
+	btn_enable: 'Zapnout SCAYT',
+	btn_langs:'Jazyky',
+	btn_options: 'Nastavení',
+	text_title:  'Kontrola pravopisu během psaní (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/cy.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'cy', {
+	btn_about: 'Ynghylch SCAYT',
+	btn_dictionaries: 'Geiriaduron',
+	btn_disable: 'Analluogi SCAYT',
+	btn_enable: 'Galluogi SCAYT',
+	btn_langs:'Ieithoedd',
+	btn_options: 'Opsiynau',
+	text_title:  'Gwirio\'r Sillafu Wrth Deipio'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/da.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'da', {
+	btn_about: 'Om SCAYT',
+	btn_dictionaries: 'Ordbøger',
+	btn_disable: 'Deaktivér SCAYT',
+	btn_enable: 'Aktivér SCAYT',
+	btn_langs:'Sprog',
+	btn_options: 'Indstillinger',
+	text_title: 'Stavekontrol mens du skriver'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/de.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'de', {
+	btn_about: 'Über SCAYT',
+	btn_dictionaries: 'Wörterbücher',
+	btn_disable: 'SCAYT ausschalten',
+	btn_enable: 'SCAYT einschalten',
+	btn_langs:'Sprachen',
+	btn_options: 'Optionen',
+	text_title: 'Rechtschreibprüfung während der Texteingabe (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/el.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'el', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Λεξικά',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Γλώσσες',
+	btn_options: 'Επιλογές',
+	text_title: 'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-au.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-au', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title: 'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-ca.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-ca', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title: 'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/en-gb.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en-gb', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title: 'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/en.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'en', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title: 'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/eo.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'eo', {
+	btn_about: 'Pri OKDVT',
+	btn_dictionaries: 'Vortaroj',
+	btn_disable: 'Malebligi OKDVT',
+	btn_enable: 'Ebligi OKDVT',
+	btn_langs:'Lingvoj',
+	btn_options: 'Opcioj',
+	text_title:  'OrtografiKontrolado Dum Vi Tajpas (OKDVT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/es.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'es', {
+	btn_about: 'Acerca de Corrector',
+	btn_dictionaries: 'Diccionarios',
+	btn_disable: 'Desactivar Corrector',
+	btn_enable: 'Activar Corrector',
+	btn_langs:'Idiomas',
+	btn_options: 'Opciones',
+	text_title: 'Comprobar Ortografía Mientras Escribe'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/et.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'et', {
+	btn_about: 'SCAYT-ist lähemalt',
+	btn_dictionaries: 'Sõnaraamatud',
+	btn_disable: 'SCAYT keelatud',
+	btn_enable: 'SCAYT lubatud',
+	btn_langs:'Keeled',
+	btn_options: 'Valikud',
+	text_title:  'Õigekirjakontroll kirjutamise ajal'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/eu.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'eu', {
+	btn_about: 'SCAYTi buruz',
+	btn_dictionaries: 'Hiztegiak',
+	btn_disable: 'Desgaitu SCAYT',
+	btn_enable: 'Gaitu SCAYT',
+	btn_langs:'Hizkuntzak',
+	btn_options: 'Aukerak',
+	text_title:  'Ortografia Zuzenketa Idatzi Ahala (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/fa.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fa', {
+	btn_about: 'درباره SCAYT',
+	btn_dictionaries: 'دیکشنریها',
+	btn_disable: 'غیرفعالسازی SCAYT',
+	btn_enable: 'فعالسازی SCAYT',
+	btn_langs:'زبانها',
+	btn_options: 'گزینهها',
+	text_title:  'بررسی املای تایپ شما'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/fi.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fi', {
+	btn_about: 'Tietoja oikoluvusta kirjoitetaessa',
+	btn_dictionaries: 'Sanakirjat',
+	btn_disable: 'Poista käytöstä oikoluku kirjoitetaessa',
+	btn_enable: 'Ota käyttöön oikoluku kirjoitettaessa',
+	btn_langs:'Kielet',
+	btn_options: 'Asetukset',
+	text_title: 'Oikolue kirjoitettaessa'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/fo.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fo', {
+	btn_about: 'Um SCAYT',
+	btn_dictionaries: 'Orðabøkur',
+	btn_disable: 'Nokta SCAYT',
+	btn_enable: 'Loyv SCAYT',
+	btn_langs:'Tungumál',
+	btn_options: 'Uppseting',
+	text_title:  'Kanna stavseting, meðan tú skrivar'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr-ca.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fr-ca', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/fr.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'fr', {
+	btn_about: 'A propos de SCAYT',
+	btn_dictionaries: 'Dictionnaires',
+	btn_disable: 'Désactiver SCAYT',
+	btn_enable: 'Activer SCAYT',
+	btn_langs:'Langues',
+	btn_options: 'Options',
+	text_title: 'Vérification de l\'Orthographe en Cours de Frappe (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/gl.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'gl', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/gu.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'gu', {
+	btn_about: 'SCAYT વિષે',
+	btn_dictionaries: 'શબ્દકોશ',
+	btn_disable: 'SCAYT ડિસેબલ કરવું',
+	btn_enable: 'SCAYT એનેબલ કરવું',
+	btn_langs:'ભાષાઓ',
+	btn_options: 'વિકલ્પો',
+	text_title:  'ટાઈપ કરતા સ્પેલ તપાસો'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/he.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'he', {
+	btn_about: 'אודות SCAYT',
+	btn_dictionaries: 'מילון',
+	btn_disable: 'בטל SCAYT',
+	btn_enable: 'אפשר SCAYT',
+	btn_langs:'שפות',
+	btn_options: 'אפשרויות',
+	text_title:  'בדיקת איות בזמן כתיבה (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/hi.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hi', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/hr.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hr', {
+	btn_about: 'O SCAYT',
+	btn_dictionaries: 'Rječnici',
+	btn_disable: 'Onemogući SCAYT',
+	btn_enable: 'Omogući SCAYT',
+	btn_langs:'Jezici',
+	btn_options: 'Opcije',
+	text_title:  'Provjeri pravopis tijekom tipkanja (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/hu.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'hu', {
+	btn_about: 'SCAYT névjegy',
+	btn_dictionaries: 'Szótár',
+	btn_disable: 'SCAYT letiltása',
+	btn_enable: 'SCAYT engedélyezése',
+	btn_langs:'Nyelvek',
+	btn_options: 'Beállítások',
+	text_title:  'Helyesírás ellenőrzés gépelés közben'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/is.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'is', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/it.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'it', {
+	btn_about: 'About COMS',
+	btn_dictionaries: 'Dizionari',
+	btn_disable: 'Disabilita COMS',
+	btn_enable: 'Abilita COMS',
+	btn_langs:'Lingue',
+	btn_options: 'Opzioni',
+	text_title: 'Controllo Ortografico Mentre Scrivi'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ja.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ja', {
+	btn_about: 'SCAYTバージョン',
+	btn_dictionaries: '辞書',
+	btn_disable: 'SCAYT無効',
+	btn_enable: 'SCAYT有効',
+	btn_langs:'言語',
+	btn_options: 'オプション',
+	text_title:  'スペルチェック設定(SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ka.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ka', {
+	btn_about: 'SCAYT-ის შესახებ',
+	btn_dictionaries: 'ლექსიკონები',
+	btn_disable: 'SCAYT-ის გამორთვა',
+	btn_enable: 'SCAYT-ის ჩართვა',
+	btn_langs:'ენები',
+	btn_options: 'პარამეტრები',
+	text_title:  'მართლწერის შემოწმება კრეფისას'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/km.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'km', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ko.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ko', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ku.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ku', {
+	btn_about: 'دهربارهی SCAYT',
+	btn_dictionaries: 'فهرههنگهکان',
+	btn_disable: 'ناچالاککردنی SCAYT',
+	btn_enable: 'چالاککردنی SCAYT',
+	btn_langs:'زمانهکان',
+	btn_options: 'ههڵبژارده',
+	text_title:  'پشکنینی نووسه لهکاتی نووسین'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/lt.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'lt', {
+	btn_about: 'Apie SCAYT',
+	btn_dictionaries: 'Žodynai',
+	btn_disable: 'Išjungti SCAYT',
+	btn_enable: 'Įjungti SCAYT',
+	btn_langs:'Kalbos',
+	btn_options: 'Parametrai',
+	text_title:  'Tikrinti klaidas kai rašoma'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/lv.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'lv', {
+	btn_about: 'Par SCAYT',
+	btn_dictionaries: 'Vārdnīcas',
+	btn_disable: 'Atslēgt SCAYT',
+	btn_enable: 'Ieslēgt SCAYT',
+	btn_langs:'Valodas',
+	btn_options: 'Uzstādījumi',
+	text_title:  'Pārbaudīt gramatiku rakstot'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/mk.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'mk', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/mn.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'mn', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Толь бичгүүд',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Хэлүүд',
+	btn_options: 'Сонголт',
+	text_title:  'Spell Check As You Type'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ms.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ms', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/nb.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'nb', {
+	btn_about: 'Om SCAYT',
+	btn_dictionaries: 'Ordbøker',
+	btn_disable: 'Slå av SCAYT',
+	btn_enable: 'Slå på SCAYT',
+	btn_langs:'Språk',
+	btn_options: 'Valg',
+	text_title:  'Stavekontroll mens du skriver'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/nl.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'nl', {
+	btn_about: 'Over SCAYT',
+	btn_dictionaries: 'Woordenboeken',
+	btn_disable: 'SCAYT uitschakelen',
+	btn_enable: 'SCAYT inschakelen',
+	btn_langs:'Talen',
+	btn_options: 'Opties',
+	text_title: 'Controleer de spelling tijdens het typen'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/no.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'no', {
+	btn_about: 'Om SCAYT',
+	btn_dictionaries: 'Ordbøker',
+	btn_disable: 'Slå av SCAYT',
+	btn_enable: 'Slå på SCAYT',
+	btn_langs:'Språk',
+	btn_options: 'Valg',
+	text_title: 'Stavekontroll mens du skriver'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/pl.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pl', {
+	btn_about: 'Informacje o SCAYT',
+	btn_dictionaries: 'Słowniki',
+	btn_disable: 'Wyłącz SCAYT',
+	btn_enable: 'Włącz SCAYT',
+	btn_langs:'Języki',
+	btn_options: 'Opcje',
+	text_title:  'Sprawdź pisownię podczas pisania (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt-br.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pt-br', {
+	btn_about: 'Sobre a correção ortográfica durante a digitação',
+	btn_dictionaries: 'Dicionários',
+	btn_disable: 'Desabilitar correção ortográfica durante a digitação',
+	btn_enable: 'Habilitar correção ortográfica durante a digitação',
+	btn_langs:'Idiomas',
+	btn_options: 'Opções',
+	text_title: 'Correção ortográfica durante a digitação'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/pt.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'pt', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title: 'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ro.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ro', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ru.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ru', {
+	btn_about: 'О SCAYT',
+	btn_dictionaries: 'Словари',
+	btn_disable: 'Отключить SCAYT',
+	btn_enable: 'Включить SCAYT',
+	btn_langs:'Языки',
+	btn_options: 'Настройки',
+	text_title: 'Проверка орфографии по мере ввода (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/sk.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sk', {
+	btn_about: 'O KPPP (Kontrola pravopisu počas písania)',
+	btn_dictionaries: 'Slovníky',
+	btn_disable: 'Zakázať  KPPP (Kontrola pravopisu počas písania)',
+	btn_enable: 'Povoliť KPPP (Kontrola pravopisu počas písania)',
+	btn_langs:'Jazyky',
+	btn_options: 'Možnosti',
+	text_title:  'Kontrola pravopisu počas písania'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/sl.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sl', {
+	btn_about: 'O storitvi SCAYT',
+	btn_dictionaries: 'Slovarji',
+	btn_disable: 'Onemogoči SCAYT',
+	btn_enable: 'Omogoči SCAYT',
+	btn_langs:'Jeziki',
+	btn_options: 'Možnosti',
+	text_title:  'Črkovanje med tipkanjem'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr-latn.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sr-latn', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/sr.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sr', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/sv.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'sv', {
+	btn_about: 'Om SCAYT',
+	btn_dictionaries: 'Ordlistor',
+	btn_disable: 'Inaktivera SCAYT',
+	btn_enable: 'Aktivera SCAYT',
+	btn_langs:'Språk',
+	btn_options: 'Inställningar',
+	text_title: 'Stavningskontroll medan du skriver'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/th.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'th', {
+	btn_about: 'About SCAYT',
+	btn_dictionaries: 'Dictionaries',
+	btn_disable: 'Disable SCAYT',
+	btn_enable: 'Enable SCAYT',
+	btn_langs:'Languages',
+	btn_options: 'Options',
+	text_title:  'Spell Check As You Type' // MISSING
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/tr.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'tr', {
+	btn_about: 'SCAYT\'ı hakkında',
+	btn_dictionaries: 'Sözlükler',
+	btn_disable: 'SCAYT\'ı pasifleştir',
+	btn_enable: 'SCAYT\'ı etkinleştir',
+	btn_langs:'Diller',
+	btn_options: 'Seçenekler',
+	text_title:  'Girmiş olduğunuz kelime denetimi'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/ug.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'ug', {
+	btn_about: 'شۇئان ئىملا تەكشۈرۈش ھەققىدە',
+	btn_dictionaries: 'لۇغەت',
+	btn_disable: 'شۇئان ئىملا تەكشۈرۈشنى چەكلە',
+	btn_enable: 'شۇئان ئىملا تەكشۈرۈشنى قوزغات',
+	btn_langs:'تىل',
+	btn_options: 'تاللانما',
+	text_title:  'شۇئان ئىملا تەكشۈر'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/uk.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'uk', {
+	btn_about: 'Про SCAYT',
+	btn_dictionaries: 'Словники',
+	btn_disable: 'Вимкнути SCAYT',
+	btn_enable: 'Ввімкнути SCAYT',
+	btn_langs:'Мови',
+	btn_options: 'Опції',
+	text_title:  'Перефірка орфографії по мірі набору'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/vi.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'vi', {
+	btn_about: 'Thông tin về SCAYT',
+	btn_dictionaries: 'Từ điển',
+	btn_disable: 'Tắt SCAYT',
+	btn_enable: 'Bật SCAYT',
+	btn_langs:'Ngôn ngữ',
+	btn_options: 'Tùy chọn',
+	text_title:  'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh-cn.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'zh-cn', {
+	btn_about: '关于即时拼写检查',
+	btn_dictionaries: '字典',
+	btn_disable: '禁用即时拼写检查',
+	btn_enable: '启用即时拼写检查',
+	btn_langs:'语言',
+	btn_options: '选项',
+	text_title:  '即时拼写检查'
+});

+ 13 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/lang/zh.js

@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang( 'scayt', 'zh', {
+	btn_about: '關於即時拼寫檢查',
+	btn_dictionaries: '字典',
+	btn_disable: '關閉即時拼寫檢查',
+	btn_enable: '啟用即時拼寫檢查',
+	btn_langs: '語言',
+	btn_options: '選項',
+	text_title:  '即時拼寫檢查'
+});

+ 1877 - 0
app/Resources/public/assets/ckeditor/plugins/scayt/plugin.js

@@ -0,0 +1,1877 @@
+'use strict';
+CKEDITOR.plugins.add('scayt', {
+
+	//requires : ['menubutton', 'dialog'],
+	requires: 'menubutton,dialog',
+	lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh', // %REMOVE_LINE_CORE%
+	icons: 'scayt', // %REMOVE_LINE_CORE%
+	hidpi: true, // %REMOVE_LINE_CORE%
+	tabToOpen : null,
+	dialogName: 'scaytDialog',
+	init: function(editor) {
+		var self = this,
+			plugin = CKEDITOR.plugins.scayt;
+
+		this.bindEvents(editor);
+		this.parseConfig(editor);
+		this.addRule(editor);
+
+		// source mode
+		CKEDITOR.dialog.add(this.dialogName, CKEDITOR.getUrl(this.path + 'dialogs/options.js'));
+		// end source mode
+
+		this.addMenuItems(editor);
+		var config = editor.config,
+			lang = editor.lang.scayt,
+			env = CKEDITOR.env;
+
+		editor.ui.add('Scayt', CKEDITOR.UI_MENUBUTTON, {
+			label : lang.text_title,
+			title : ( editor.plugins.wsc ? editor.lang.wsc.title : lang.text_title ),
+			// SCAYT doesn't work in IE Compatibility Mode and IE (8 & 9) Quirks Mode
+			modes : {wysiwyg: !(env.ie && ( env.version < 8 || env.quirks ) ) },
+			toolbar: 'spellchecker,20',
+			refresh: function() {
+				var buttonState = editor.ui.instances.Scayt.getState();
+
+				// check if scayt is created
+				if(editor.scayt) {
+					// check if scayt is enabled
+					if(plugin.state.scayt[editor.name]) {
+						buttonState = CKEDITOR.TRISTATE_ON;
+					} else {
+						buttonState = CKEDITOR.TRISTATE_OFF;
+					}
+				}
+
+				editor.fire('scaytButtonState', buttonState);
+			},
+			onRender: function() {
+				var that = this;
+
+				editor.on('scaytButtonState', function(ev) {
+					if(typeof ev.data !== undefined) {
+						that.setState(ev.data);
+					}
+				});
+			},
+			onMenu : function() {
+				var scaytInstance = editor.scayt;
+
+				editor.getMenuItem('scaytToggle').label = editor.lang.scayt[(scaytInstance ? plugin.state.scayt[editor.name] : false) ? 'btn_disable' : 'btn_enable'];
+
+				// If UI tab is disabled we shouldn't show menu item
+				var menuDefinition = {
+					scaytToggle  : CKEDITOR.TRISTATE_OFF,
+					scaytOptions : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+					scaytLangs   : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+					scaytDict    : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+					scaytAbout   : scaytInstance ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED,
+					WSC          : editor.plugins.wsc ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+				};
+
+				if(!editor.config.scayt_uiTabs[0]) {
+					delete menuDefinition.scaytOptions;
+				}
+
+				if(!editor.config.scayt_uiTabs[1]) {
+					delete menuDefinition.scaytLangs;
+				}
+
+				if(!editor.config.scayt_uiTabs[2]) {
+					delete menuDefinition.scaytDict;
+				}
+
+				return menuDefinition;
+			}
+		});
+
+		// If the 'contextmenu' plugin is loaded, register the listeners.
+		if(editor.contextMenu && editor.addMenuItems) {
+			editor.contextMenu.addListener(function(element, selection) {
+				var scaytInstance = editor.scayt,
+					result, selectionNode;
+
+				if(scaytInstance) {
+					selectionNode = scaytInstance.getSelectionNode();
+
+					// SCAYT shouldn't build context menu if instance isnot created or word is without misspelling or grammar problem
+					if(selectionNode) {
+						var items = self.menuGenerator(editor, selectionNode);
+
+						scaytInstance.showBanner('.' + editor.contextMenu._.definition.panel.className.split(' ').join(' .'));
+						result = items;
+					}
+				}
+
+				return result;
+			});
+
+			editor.contextMenu._.onHide = CKEDITOR.tools.override(editor.contextMenu._.onHide, function(org) {
+				return function() {
+					var scaytInstance = editor.scayt;
+
+					if(scaytInstance) {
+						scaytInstance.hideBanner();
+					}
+
+					return org.apply(this);
+				};
+			});
+		}
+	},
+	addMenuItems: function(editor) {
+		var self = this,
+			plugin = CKEDITOR.plugins.scayt,
+			graytGroups = ['grayt_description', 'grayt_suggest', 'grayt_control'],
+			menuGroup = 'scaytButton';
+
+		editor.addMenuGroup(menuGroup);
+
+		var items_order = editor.config.scayt_contextMenuItemsOrder.split('|');
+
+		for(var pos = 0 ; pos < items_order.length ; pos++) {
+			items_order[pos] = 'scayt_' + items_order[pos];
+		}
+		items_order = graytGroups.concat(items_order);
+
+		if(items_order && items_order.length) {
+			for(var pos = 0 ; pos < items_order.length ; pos++) {
+				editor.addMenuGroup(items_order[pos], pos - 10);
+			}
+		}
+
+		editor.addCommand( 'scaytToggle', {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt;
+
+				plugin.state.scayt[editor.name] = !plugin.state.scayt[editor.name];
+
+				if(plugin.state.scayt[editor.name] === true) {
+					if(!scaytInstance) {
+						plugin.createScayt(editor);
+					}
+				} else {
+					if(scaytInstance) {
+						plugin.destroy(editor);
+					}
+				}
+			}
+		} );
+
+		editor.addCommand( 'scaytAbout', {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt;
+
+				scaytInstance.tabToOpen = 'about';
+				editor.lockSelection();
+				editor.openDialog(self.dialogName);
+			}
+		} );
+
+		editor.addCommand( 'scaytOptions', {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt;
+
+				scaytInstance.tabToOpen = 'options';
+				editor.lockSelection();
+				editor.openDialog(self.dialogName);
+			}
+		} );
+
+		editor.addCommand( 'scaytLangs', {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt;
+
+				scaytInstance.tabToOpen = 'langs';
+				editor.lockSelection();
+				editor.openDialog(self.dialogName);
+			}
+		} );
+
+		editor.addCommand( 'scaytDict', {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt;
+
+				scaytInstance.tabToOpen = 'dictionaries';
+				editor.lockSelection();
+				editor.openDialog(self.dialogName);
+			}
+		} );
+
+		var uiMenuItems = {
+			scaytToggle: {
+				label : editor.lang.scayt.btn_enable,
+				group : menuGroup,
+				command: 'scaytToggle'
+			},
+			scaytAbout: {
+				label : editor.lang.scayt.btn_about,
+				group : menuGroup,
+				command: 'scaytAbout'
+			},
+			scaytOptions: {
+				label : editor.lang.scayt.btn_options,
+				group : menuGroup,
+				command: 'scaytOptions'
+			},
+			scaytLangs: {
+				label : editor.lang.scayt.btn_langs,
+				group : menuGroup,
+				command: 'scaytLangs'
+			},
+			scaytDict: {
+				label : editor.lang.scayt.btn_dictionaries,
+				group : menuGroup,
+				command: 'scaytDict'
+			}
+		};
+
+		if(editor.plugins.wsc) {
+			uiMenuItems.WSC = {
+				label : editor.lang.wsc.toolbar,
+				group : menuGroup,
+				onClick: function() {
+					var inlineMode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE),
+						plugin = CKEDITOR.plugins.scayt,
+						scaytInstance = editor.scayt,
+						text = inlineMode ? editor.container.getText() : editor.document.getBody().getText();
+
+					text = text.replace(/\s/g, '');
+
+					if(text) {
+						if(scaytInstance && plugin.state.scayt[editor.name] && scaytInstance.setMarkupPaused) {
+							scaytInstance.setMarkupPaused(true);
+						}
+
+						editor.lockSelection();
+						editor.execCommand('checkspell');
+					} else {
+						alert('Nothing to check!');
+					}
+				}
+			}
+		}
+
+		editor.addMenuItems(uiMenuItems);
+	},
+	bindEvents: function(editor) {
+		var self = this,
+			plugin = CKEDITOR.plugins.scayt,
+			inline_mode = (editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE);
+
+		var scaytDestroy = function() {
+			plugin.destroy(editor);
+		};
+
+		/*
+		 * Dirty fix for placeholder drag&drop
+		 * Should be fixed with next release
+		 */
+		/*
+		editor.on('drop', function(evt) {
+			var dropRange = evt.data.dropRange;
+			var b = dropRange.createBookmark(true);
+			editor.scayt.removeMarkupInSelectionNode({ selectionNode: evt.data.target.$, forceBookmark: false });
+			dropRange.moveToBookmark(b);
+
+			evt.data.dropRange = dropRange;
+			return evt;
+		}, this, null, 0); // We should be sure that we modify dropRange before CKEDITOR.plugins.clipboard calls
+		*/
+
+		var contentDomReady = function() {
+			// The event is fired when editable iframe node was reinited so we should restart our service
+			if (plugin.state.scayt[editor.name] && !editor.readOnly && !editor.scayt) {
+				plugin.createScayt(editor);
+			}
+		};
+
+		var addMarkupStateHandlers = function() {
+			var editable = editor.editable();
+
+			editable.attachListener( editable, 'focus', function( evt ) {
+				if( CKEDITOR.plugins.scayt && !editor.scayt ) {
+					setTimeout(contentDomReady, 0); // we need small timeout in order to correctly set initial 'focused' option value in SCAYT core
+				}
+
+				var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[editor.name] && editor.scayt,
+					selectedElement, ranges, textLength, range;
+
+				if((inline_mode ? true : pluginStatus) && editor._.savedSelection) {
+					selectedElement = editor._.savedSelection.getSelectedElement();
+					ranges = !selectedElement && editor._.savedSelection.getRanges();
+
+					for(var i = 0; i < ranges.length; i++) {
+						range = ranges[i];
+						// we need to check type of node value in order to avoid error in IE when accessing 'nodeValue' property
+						if(typeof range.startContainer.$.nodeValue === 'string') {
+							textLength = range.startContainer.getText().length;
+							if(textLength < range.startOffset || textLength < range.endOffset) {
+								editor.unlockSelection(false);
+							}
+						}
+					}
+				}
+			}, this, null, -10 );	// priority "-10" is set to call SCAYT CKEDITOR.editor#unlockSelection before CKEDITOR.editor#unlockSelection call
+		};
+
+		var contentDomHandler = function() {
+			if(inline_mode) {
+
+				if (!editor.config.scayt_inlineModeImmediateMarkup) {
+					/*
+					 * Give an opportunity to CKEditor to perform all needed updates
+					 * and only after that call 'scaytDestroy' method (#72725)
+					 */
+					editor.on('blur', function () { setTimeout( scaytDestroy, 0 ); } );
+					editor.on('focus', contentDomReady);
+
+					// We need to check if editor has focus(created) right now.
+					// If editor is active - make attempt to create scayt
+					if(editor.focusManager.hasFocus) {
+						contentDomReady();
+					}
+
+				} else {
+					contentDomReady();
+				}
+
+			} else {
+				contentDomReady();
+			}
+
+			addMarkupStateHandlers();
+
+			/*
+			 * 'mousedown' handler handle widget selection (click on widget). To
+			 * fix the issue when widget#wrapper referenced to element which can
+			 * be broken after markup.
+			 */
+			var editable = editor.editable();
+			editable.attachListener(editable, 'mousedown', function( evt ) {
+				var target = evt.data.getTarget();
+				var widget = editor.widgets && editor.widgets.getByElement( target );
+				if ( widget ) {
+					widget.wrapper = target.getAscendant( function( el ) {
+						return el.hasAttribute( 'data-cke-widget-wrapper' )
+					}, true );
+				}
+			}, this, null, -10); // '-10': we need to be shure that widget#wrapper updated before any other calls
+		};
+
+		editor.on('contentDom', contentDomHandler);
+
+		editor.on('beforeCommandExec', function(ev) {
+			var scaytInstance = editor.scayt,
+				selectedLangElement = null,
+				forceBookmark = false,
+				removeMarkupInsideSelection = true;
+
+			// TODO: after switching in source mode not recreate SCAYT instance, try to just rerun markuping to don't make requests to server
+			if(ev.data.name in plugin.options.disablingCommandExec && editor.mode == 'wysiwyg') {
+				if(scaytInstance) {
+					plugin.destroy(editor);
+					editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
+				}
+			} else if(	ev.data.name === 'bold' || ev.data.name === 'italic' || ev.data.name === 'underline' ||
+						ev.data.name === 'strike' || ev.data.name === 'subscript' || ev.data.name === 'superscript' ||
+						ev.data.name === 'enter' || ev.data.name === 'cut' || ev.data.name === 'language') {
+				if(scaytInstance) {
+					if(ev.data.name === 'cut') {
+						removeMarkupInsideSelection = false;
+						// We need to force bookmark before we remove our markup.
+						// Otherwise we will get issues with cutting text via context menu.
+						forceBookmark = true;
+					}
+
+					// We need to remove all SCAYT markup from 'lang' node before it will be deleted.
+					// We need to remove SCAYT markup from selected text before creating 'lang' node as well.
+					if(ev.data.name === 'language') {
+						selectedLangElement = editor.plugins.language.getCurrentLangElement(editor);
+						selectedLangElement = selectedLangElement && selectedLangElement.$;
+						// We need to force bookmark before we remove our markup.
+						// Otherwise we will get issues with cutting text via language plugin menu.
+						forceBookmark = true;
+					}
+
+					editor.fire('reloadMarkupScayt', {
+						removeOptions: {
+							removeInside: removeMarkupInsideSelection,
+							forceBookmark: forceBookmark,
+							selectionNode: selectedLangElement
+						},
+						timeout: 0
+					});
+				}
+			}
+		});
+
+		editor.on('beforeSetMode', function(ev) {
+			var scaytInstance;
+			// needed when we use:
+			// CKEDITOR.instances.editor_ID.setMode("source")
+			// CKEDITOR.instances.editor_ID.setMode("wysiwyg")
+			// can't be implemented in editor.on('mode', function(ev) {});
+			if (ev.data == 'source') {
+				scaytInstance = editor.scayt;
+				if(scaytInstance) {
+					plugin.destroy(editor);
+					editor.fire('scaytButtonState', CKEDITOR.TRISTATE_DISABLED);
+				}
+
+				// remove custom data from body, to prevent waste properties showing in IE8
+				if(editor.document) { //GitHub #84 : make sure that document exists(e.g. when startup mode set to 'source')
+					editor.document.getBody().removeAttribute('_jquid');
+				}
+			}
+		});
+
+		editor.on('afterCommandExec', function(ev) {
+			if(editor.mode == 'wysiwyg' && (ev.data.name == 'undo' || ev.data.name == 'redo')) {
+				setTimeout(function() {
+					var scaytInstance = editor.scayt,
+						scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
+
+					/*
+					 * Checks SCAYT initialization of LangList. To prevent immediate
+					 * markup which is triggered by 'startSpellCheck' event.
+					 * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
+					 */
+					if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
+
+					scaytInstance.fire('startSpellCheck, startGrammarCheck');
+				}, 250);
+			}
+		});
+
+		// handle readonly changes
+		editor.on('readOnly', function(ev) {
+			var scaytInstance;
+
+			if(ev) {
+				scaytInstance = editor.scayt;
+
+				if(ev.editor.readOnly === true) {
+					if(scaytInstance) {
+						scaytInstance.fire('removeMarkupInDocument', {});
+					}
+				} else {
+					if(scaytInstance) {
+						scaytInstance.fire('startSpellCheck, startGrammarCheck');
+					} else if(ev.editor.mode == 'wysiwyg' && plugin.state.scayt[ev.editor.name] === true) {
+						plugin.createScayt(editor);
+						ev.editor.fire('scaytButtonState', CKEDITOR.TRISTATE_ON);
+					}
+				}
+			}
+		});
+
+		// we need to destroy SCAYT before CK editor will be completely destroyed
+		editor.on('beforeDestroy', scaytDestroy);
+
+		//#9439 after SetData method fires contentDom event and SCAYT create additional instanse
+		// This way we should destroy SCAYT on setData event when contenteditable Iframe was re-created
+		editor.on('setData', function() {
+			scaytDestroy();
+
+			// in inline mode SetData does not fire contentDom event
+			if(editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE || editor.plugins.divarea) {
+				contentDomHandler();
+			}
+		}, this, null, 50);
+
+		/*
+		 * Main entry point to react on changes in document
+		 */
+		editor.on('reloadMarkupScayt', function(ev) {
+			var removeOptions = ev.data && ev.data.removeOptions,
+				timeout = ev.data && ev.data.timeout;
+
+			/*
+			 * Perform removeMarkupInSelectionNode and 'startSpellCheck' fire
+			 * asynchroniosly and keep CKEDITOR flow as expected
+			 */
+			setTimeout(function() {
+				var scaytInstance = editor.scayt,
+					scaytLangList = scaytInstance && scaytInstance.getScaytLangList();
+
+				/*
+				 * Checks SCAYT initialization of LangList. To prevent immediate
+				 * markup which is triggered by 'startSpellCheck' event.
+				 * E.g.: Drop into inline CKEDITOR with scayt_autoStartup = true;
+				 */
+				if (!scaytLangList || !(scaytLangList.ltr && scaytLangList.rtl)) return;
+
+				/*
+				 * CKEditor can keep \u200B character in document (with selection#selectRanges)
+				 * we need to take care about that. For this case we fire
+				 * 'keydown' [left arrow], what will trigger 'removeFillingChar' on Webkit
+				 * to cleanup the document
+				 */
+				editor.document.fire( 'keydown', new CKEDITOR.dom.event( { keyCode: 37 } ) );
+
+				/* trigger remove markup with 'startSpellCheck' */
+				scaytInstance.removeMarkupInSelectionNode(removeOptions);
+				scaytInstance.fire('startSpellCheck, startGrammarCheck');
+			}, timeout || 0 );
+		});
+
+		// Reload spell-checking for current word after insertion completed.
+		editor.on('insertElement', function() {
+			// IE bug: we need wait here to make sure that focus is returned to editor, and we can store the selection before we proceed with markup
+			editor.fire('reloadMarkupScayt', {removeOptions: {forceBookmark: true}});
+		}, this, null, 50);
+
+		editor.on('insertHtml', function() {
+			editor.fire('reloadMarkupScayt');
+		}, this, null, 50);
+
+		editor.on('insertText', function() {
+			editor.fire('reloadMarkupScayt');
+		}, this, null, 50);
+
+		// The event is listening to open necessary dialog tab
+		editor.on('scaytDialogShown', function(ev) {
+			var dialog = ev.data,
+				scaytInstance = editor.scayt;
+
+			dialog.selectPage(scaytInstance.tabToOpen);
+		});
+	},
+	parseConfig: function(editor) {
+		var plugin = CKEDITOR.plugins.scayt;
+
+		// preprocess config for backward compatibility
+		plugin.replaceOldOptionsNames(editor.config);
+
+		// Checking editor's config after initialization
+		if(typeof editor.config.scayt_autoStartup !== 'boolean') {
+			editor.config.scayt_autoStartup = false;
+		}
+		plugin.state.scayt[editor.name] = editor.config.scayt_autoStartup;
+
+		if(typeof editor.config.grayt_autoStartup !== 'boolean') {
+			editor.config.grayt_autoStartup = false;
+		}
+		if(typeof editor.config.scayt_inlineModeImmediateMarkup !== 'boolean') {
+			editor.config.scayt_inlineModeImmediateMarkup = false;
+		}
+		plugin.state.grayt[editor.name] = editor.config.grayt_autoStartup;
+
+		if(!editor.config.scayt_contextCommands) {
+			editor.config.scayt_contextCommands = 'ignore|ignoreall|add';
+		}
+
+		if(!editor.config.scayt_contextMenuItemsOrder) {
+			editor.config.scayt_contextMenuItemsOrder = 'suggest|moresuggest|control';
+		}
+
+		if(!editor.config.scayt_sLang) {
+			editor.config.scayt_sLang = 'en_US';
+		}
+
+		if(editor.config.scayt_maxSuggestions === undefined || typeof editor.config.scayt_maxSuggestions != 'number' || editor.config.scayt_maxSuggestions < 0) {
+			editor.config.scayt_maxSuggestions = 5;
+		}
+
+		if(editor.config.scayt_minWordLength === undefined || typeof editor.config.scayt_minWordLength != 'number' || editor.config.scayt_minWordLength < 1) {
+			editor.config.scayt_minWordLength = 4;
+		}
+
+		if(editor.config.scayt_customDictionaryIds === undefined || typeof editor.config.scayt_customDictionaryIds !== 'string') {
+			editor.config.scayt_customDictionaryIds = '';
+		}
+
+		if(editor.config.scayt_userDictionaryName === undefined || typeof editor.config.scayt_userDictionaryName !== 'string') {
+			editor.config.scayt_userDictionaryName = null;
+		}
+
+		if(typeof editor.config.scayt_uiTabs === 'string' && editor.config.scayt_uiTabs.split(',').length === 3) {
+			var scayt_uiTabs = [], _tempUITabs = [];
+			editor.config.scayt_uiTabs = editor.config.scayt_uiTabs.split(',');
+
+			CKEDITOR.tools.search(editor.config.scayt_uiTabs, function(value) {
+				if (Number(value) === 1 || Number(value) === 0) {
+					_tempUITabs.push(true);
+					scayt_uiTabs.push(Number(value));
+				} else {
+					_tempUITabs.push(false);
+				}
+			});
+
+			if (CKEDITOR.tools.search(_tempUITabs, false) === null) {
+				editor.config.scayt_uiTabs = scayt_uiTabs;
+			} else {
+				editor.config.scayt_uiTabs = [1,1,1];
+			}
+
+		} else {
+			editor.config.scayt_uiTabs = [1,1,1];
+		}
+
+		if(typeof editor.config.scayt_serviceProtocol != 'string') {
+			editor.config.scayt_serviceProtocol = null;
+		}
+
+		if(typeof editor.config.scayt_serviceHost != 'string') {
+			editor.config.scayt_serviceHost = null;
+		}
+
+		if(typeof editor.config.scayt_servicePort != 'string') {
+			editor.config.scayt_servicePort = null;
+		}
+
+		if(typeof editor.config.scayt_servicePath != 'string') {
+			editor.config.scayt_servicePath = null;
+		}
+
+		if(!editor.config.scayt_moreSuggestions) {
+			editor.config.scayt_moreSuggestions = 'on';
+		}
+
+		if(typeof editor.config.scayt_customerId !== 'string') {
+			editor.config.scayt_customerId = '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
+		}
+
+		if(typeof editor.config.scayt_srcUrl !== 'string') {
+			var protocol = document.location.protocol;
+			protocol = protocol.search(/https?:/) != -1 ? protocol : 'http:';
+
+			editor.config.scayt_srcUrl = protocol + '//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js';
+		}
+
+		if(typeof CKEDITOR.config.scayt_handleCheckDirty !== 'boolean') {
+			CKEDITOR.config.scayt_handleCheckDirty = true;
+		}
+
+		if(typeof CKEDITOR.config.scayt_handleUndoRedo !== 'boolean') {
+			/* set default as 'true' */
+			CKEDITOR.config.scayt_handleUndoRedo = true;
+		}
+		/* checking 'undo' plugin, if no disable SCAYT handler */
+		CKEDITOR.config.scayt_handleUndoRedo = CKEDITOR.plugins.undo ? CKEDITOR.config.scayt_handleUndoRedo : false;
+
+		if(typeof editor.config.scayt_multiLanguageMode !== 'boolean') {
+			editor.config.scayt_multiLanguageMode = false;
+		}
+
+		if(typeof editor.config.scayt_multiLanguageStyles !== 'object') {
+			editor.config.scayt_multiLanguageStyles = {};
+		}
+
+		if(editor.config.scayt_ignoreAllCapsWords && typeof editor.config.scayt_ignoreAllCapsWords !== 'boolean') {
+			editor.config.scayt_ignoreAllCapsWords = false;
+		}
+
+		if(editor.config.scayt_ignoreDomainNames && typeof editor.config.scayt_ignoreDomainNames !== 'boolean') {
+			editor.config.scayt_ignoreDomainNames = false;
+		}
+
+		if(editor.config.scayt_ignoreWordsWithMixedCases && typeof editor.config.scayt_ignoreWordsWithMixedCases !== 'boolean') {
+			editor.config.scayt_ignoreWordsWithMixedCases = false;
+		}
+
+		if(editor.config.scayt_ignoreWordsWithNumbers && typeof editor.config.scayt_ignoreWordsWithNumbers !== 'boolean') {
+			editor.config.scayt_ignoreWordsWithNumbers = false;
+		}
+
+		if( editor.config.scayt_disableOptionsStorage ) {
+			var userOptions = CKEDITOR.tools.isArray( editor.config.scayt_disableOptionsStorage ) ? editor.config.scayt_disableOptionsStorage : ( typeof editor.config.scayt_disableOptionsStorage === 'string' ) ? [ editor.config.scayt_disableOptionsStorage ] : undefined,
+				availableValue = [ 'all', 'options', 'lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
+				valuesOption = ['lang', 'ignore-all-caps-words', 'ignore-domain-names', 'ignore-words-with-mixed-cases', 'ignore-words-with-numbers'],
+				search = CKEDITOR.tools.search,
+				indexOf = CKEDITOR.tools.indexOf;
+
+			var isValidOption = function( option ) {
+				return !!search( availableValue, option );
+			};
+
+			var makeOptionsToStorage = function( options ) {
+				var retval = [];
+
+				for (var i = 0; i < options.length; i++) {
+					var value = options[i],
+						isGroupOptionInUserOptions = !!search( options, 'options' );
+
+					if( !isValidOption( value ) || isGroupOptionInUserOptions && !!search( valuesOption, function( val ) { if( val === 'lang' ) { return false; } } ) ) {
+						return;
+					}
+
+					if( !!search( valuesOption, value ) ) {
+						valuesOption.splice( indexOf( valuesOption, value ), 1 );
+					}
+
+					if(  value === 'all' || isGroupOptionInUserOptions && !!search( options, 'lang' )) {
+						return [];
+					}
+
+					if( value === 'options' ) {
+						valuesOption = [ 'lang' ];
+					}
+				}
+
+				retval = retval.concat( valuesOption );
+
+				return retval;
+			};
+
+			editor.config.scayt_disableOptionsStorage = makeOptionsToStorage( userOptions );
+		}
+	},
+	addRule: function(editor) {
+		var plugin = CKEDITOR.plugins.scayt,
+			dataProcessor = editor.dataProcessor,
+			htmlFilter = dataProcessor && dataProcessor.htmlFilter,
+			pathFilters = editor._.elementsPath && editor._.elementsPath.filters,
+			dataFilter = dataProcessor && dataProcessor.dataFilter,
+			removeFormatFilter = editor.addRemoveFormatFilter,
+			pathFilter = function(element) {
+				var scaytInstance = editor.scayt;
+
+				if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
+					return false;
+				}
+			},
+			removeFormatFilterTemplate = function(element) {
+				var scaytInstance = editor.scayt,
+					result = true;
+
+				if( scaytInstance && (element.hasAttribute(plugin.options.data_attribute_name) || element.hasAttribute(plugin.options.problem_grammar_data_attribute)) ) {
+					result = false;
+				}
+
+				return result;
+			};
+
+		if(pathFilters) {
+			pathFilters.push(pathFilter);
+		}
+
+		if(dataFilter) {
+			var dataFilterRules = {
+				elements: {
+					span: function(element) {
+
+						var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
+							graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
+
+						if(plugin && (scaytState || graytState)) {
+							delete element.name;
+						}
+
+						return element;
+					}
+				}
+			};
+
+			dataFilter.addRules(dataFilterRules);
+		}
+
+		if (htmlFilter) {
+			var htmlFilterRules = {
+				elements: {
+					span: function(element) {
+
+						var scaytState = element.hasClass(plugin.options.misspelled_word_class) && element.attributes[plugin.options.data_attribute_name],
+							graytState = element.hasClass(plugin.options.problem_grammar_class) && element.attributes[plugin.options.problem_grammar_data_attribute];
+
+						if(plugin && (scaytState || graytState)) {
+							delete element.name;
+						}
+
+						return element;
+					}
+				}
+			};
+
+			htmlFilter.addRules(htmlFilterRules);
+		}
+
+		if(removeFormatFilter) {
+			removeFormatFilter.call(editor, removeFormatFilterTemplate);
+		}
+	},
+	scaytMenuDefinition: function(editor) {
+		var self = this,
+			plugin = CKEDITOR.plugins.scayt,
+			scayt_instance =  editor.scayt;
+
+		return {
+			scayt: {
+				scayt_ignore: {
+					label:  scayt_instance.getLocal('btn_ignore'),
+					group : 'scayt_control',
+					order : 1,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+						scaytInstance.ignoreWord();
+					}
+				},
+				scayt_ignoreall: {
+					label : scayt_instance.getLocal('btn_ignoreAll'),
+					group : 'scayt_control',
+					order : 2,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+						scaytInstance.ignoreAllWords();
+					}
+				},
+				scayt_add: {
+					label : scayt_instance.getLocal('btn_addWord'),
+					group : 'scayt_control',
+					order : 3,
+					exec : function(editor) {
+						var scaytInstance = editor.scayt;
+
+						// @TODO: We need to add set/restore bookmark logic to 'addWordToUserDictionary' method inside dictionarymanager.
+						// Timeout is used as tmp fix for IE9, when after hitting 'Add word' menu item, document container was blurred.
+						setTimeout(function() {
+							scaytInstance.addWordToUserDictionary();
+						}, 10);
+					}
+				},
+				scayt_option: {
+					label : scayt_instance.getLocal('btn_options'),
+					group : 'scayt_control',
+					order : 4,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+
+						scaytInstance.tabToOpen = 'options';
+						editor.lockSelection();
+						editor.openDialog(self.dialogName);
+					},
+					verification: function(editor) {
+						return (editor.config.scayt_uiTabs[0] == 1) ? true : false;
+					}
+				},
+				scayt_language: {
+					label : scayt_instance.getLocal('btn_langs'),
+					group : 'scayt_control',
+					order : 5,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+
+						scaytInstance.tabToOpen = 'langs';
+						editor.lockSelection();
+						editor.openDialog(self.dialogName);
+					},
+					verification: function(editor) {
+						return (editor.config.scayt_uiTabs[1] == 1) ? true : false;
+					}
+				},
+				scayt_dictionary: {
+					label : scayt_instance.getLocal('btn_dictionaries'),
+					group : 'scayt_control',
+					order : 6,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+
+						scaytInstance.tabToOpen = 'dictionaries';
+						editor.lockSelection();
+						editor.openDialog(self.dialogName);
+					},
+					verification: function(editor) {
+						return (editor.config.scayt_uiTabs[2] == 1) ? true : false;
+					}
+				},
+				scayt_about: {
+					label : scayt_instance.getLocal('btn_about'),
+					group : 'scayt_control',
+					order : 7,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+
+						scaytInstance.tabToOpen = 'about';
+						editor.lockSelection();
+						editor.openDialog(self.dialogName);
+					}
+				}
+			},
+			grayt: {
+				grayt_problemdescription: {
+					label : 'Grammar problem description',
+					group : 'grayt_description', // look at addMenuItems method for further info
+					order : 1,
+					state : CKEDITOR.TRISTATE_DISABLED,
+					exec: function(editor) {}
+				},
+				grayt_ignore: {
+					label : scayt_instance.getLocal('btn_ignore'),
+					group : 'grayt_control',
+					order : 2,
+					exec: function(editor) {
+						var scaytInstance = editor.scayt;
+
+						scaytInstance.ignorePhrase();
+					}
+				}
+			}
+		};
+	},
+	buildSuggestionMenuItems: function(editor, suggestions, isScaytNode) {
+		var self = this,
+			itemList = {},
+			subItemList = {},
+			replaceKeyName = isScaytNode ? 'word' : 'phrase',
+			updateEventName = isScaytNode ? 'startGrammarCheck' : 'startSpellCheck',
+			plugin = CKEDITOR.plugins.scayt,
+			scayt_instance = editor.scayt;
+
+		if(suggestions.length > 0 && suggestions[0] !== 'no_any_suggestions') {
+
+			if(isScaytNode) {
+				// build SCAYT suggestions
+				for(var i = 0; i < suggestions.length; i++) {
+
+					var commandName = 'scayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
+
+					editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
+
+					if(i < editor.config.scayt_maxSuggestions) {
+
+						// mainSuggestions
+						editor.addMenuItem(commandName, {
+							label: suggestions[i],
+							command: commandName,
+							group: 'scayt_suggest',
+							order: i + 1
+						});
+
+						itemList[commandName] = CKEDITOR.TRISTATE_OFF;
+
+					} else {
+
+						// moreSuggestions
+						editor.addMenuItem(commandName, {
+							label: suggestions[i],
+							command: commandName,
+							group: 'scayt_moresuggest',
+							order: i + 1
+						});
+
+						subItemList[commandName] = CKEDITOR.TRISTATE_OFF;
+
+						if(editor.config.scayt_moreSuggestions === 'on') {
+
+							editor.addMenuItem('scayt_moresuggest', {
+								label : scayt_instance.getLocal('btn_moreSuggestions'),
+								group : 'scayt_moresuggest',
+								order : 10,
+								getItems : function() {
+									return subItemList;
+								}
+							});
+
+							itemList['scayt_moresuggest'] = CKEDITOR.TRISTATE_OFF;
+						}
+					}
+				}
+			} else {
+				// build GRAYT suggestions
+				for(var i = 0; i < suggestions.length; i++) {
+					var commandName = 'grayt_suggest_' + CKEDITOR.plugins.scayt.suggestions[i].replace(' ', '_');
+
+					editor.addCommand(commandName, self.createCommand(CKEDITOR.plugins.scayt.suggestions[i], replaceKeyName, updateEventName));
+
+					// mainSuggestions
+					editor.addMenuItem(commandName, {
+						label: suggestions[i],
+						command: commandName,
+						group: 'grayt_suggest',
+						order: i + 1
+					});
+
+					itemList[commandName] = CKEDITOR.TRISTATE_OFF;
+				}
+			}
+		} else {
+			var noSuggestionsCommand = 'no_scayt_suggest';
+			itemList[noSuggestionsCommand] = CKEDITOR.TRISTATE_DISABLED;
+
+			editor.addCommand(noSuggestionsCommand, {
+				exec: function() {
+
+				}
+			});
+
+			editor.addMenuItem(noSuggestionsCommand, {
+				label : scayt_instance.getLocal('btn_noSuggestions') || noSuggestionsCommand,
+				command: noSuggestionsCommand,
+				group : 'scayt_suggest',
+				order : 0
+			});
+		}
+
+		return itemList;
+	},
+	menuGenerator: function(editor, selectionNode) {
+		var self = this,
+			scaytInstance = editor.scayt,
+			menuItems = this.scaytMenuDefinition(editor),
+			itemList = {},
+			allowedOption = editor.config.scayt_contextCommands.split('|'),
+			lang = selectionNode.getAttribute(scaytInstance.getLangAttribute()) || scaytInstance.getLang(),
+			word, grammarPhrase, isScaytNode, isGrammarNode, problemDescriptionText;
+
+
+		isScaytNode = scaytInstance.isScaytNode(selectionNode);
+		isGrammarNode = scaytInstance.isGraytNode(selectionNode);
+
+		if(isScaytNode) {
+			// we clicked scayt misspelling
+			// get suggestions
+			menuItems = menuItems.scayt;
+
+			word = selectionNode.getAttribute(scaytInstance.getScaytNodeAttributeName());
+
+			scaytInstance.fire('getSuggestionsList', {
+				lang: lang,
+				word: word
+			});
+
+			itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
+		} else if(isGrammarNode) {
+			// we clicked grammar problem
+			// get suggestions
+			menuItems = menuItems.grayt;
+			grammarPhrase = selectionNode.getAttribute(scaytInstance.getGraytNodeAttributeName());
+
+			// setup grammar problem description
+			problemDescriptionText = scaytInstance.getProblemDescriptionText(grammarPhrase, lang);
+			if(menuItems.grayt_problemdescription && problemDescriptionText) {
+				menuItems.grayt_problemdescription.label = problemDescriptionText;
+			}
+
+			scaytInstance.fire('getGrammarSuggestionsList', {
+				lang: lang,
+				phrase: grammarPhrase
+			});
+
+			itemList = this.buildSuggestionMenuItems(editor, CKEDITOR.plugins.scayt.suggestions, isScaytNode);
+		}
+
+		if(isScaytNode && editor.config.scayt_contextCommands == 'off') {
+			return itemList;
+		}
+
+		for(var key in menuItems) {
+			if(isScaytNode && CKEDITOR.tools.indexOf(allowedOption, key.replace('scayt_', '')) == -1 && editor.config.scayt_contextCommands != 'all') {
+				continue;
+			}
+
+			if(typeof menuItems[key].state != 'undefined') {
+				itemList[key] = menuItems[key].state;
+			} else {
+				itemList[key] = CKEDITOR.TRISTATE_OFF;
+			}
+
+			// delete item from context menu if its state isn't verified as allowed
+			if(typeof menuItems[key].verification === 'function' && !menuItems[key].verification(editor)) {
+				// itemList[key] = (menuItems[key].verification(editor)) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
+				delete itemList[key];
+			}
+
+			editor.addCommand(key, {
+				exec: menuItems[key].exec
+			});
+
+			editor.addMenuItem(key, {
+				label : editor.lang.scayt[menuItems[key].label] || menuItems[key].label,
+				command: key,
+				group : menuItems[key].group,
+				order : menuItems[key].order
+			});
+		}
+
+		return itemList;
+	},
+	createCommand: function(suggestion, replaceKeyName, updateEventName) {
+		return {
+			exec: function(editor) {
+				var scaytInstance = editor.scayt,
+					eventObject = {};
+
+				eventObject[replaceKeyName] = suggestion;
+				scaytInstance.replaceSelectionNode(eventObject);
+
+				// we need to remove grammar markup from selection node if we just performed replace action for misspelling
+				if(updateEventName === 'startGrammarCheck') {
+					scaytInstance.removeMarkupInSelectionNode({grammarOnly: true});
+				}
+				// for grayt problem replacement we need to fire 'startSpellCheck'
+				// for scayt misspelling replacement we need to fire 'startGrammarCheck'
+				scaytInstance.fire(updateEventName);
+			}
+		};
+	}
+});
+
+CKEDITOR.plugins.scayt = {
+	state: {
+		scayt: {},
+		grayt: {}
+	},
+	suggestions: [],
+	loadingHelper: {
+		loadOrder: []
+	},
+	isLoading: false,
+	options: {
+		disablingCommandExec: {
+			source: true,
+			newpage: true,
+			templates: true
+		},
+		data_attribute_name: 'data-scayt-word',
+		misspelled_word_class: 'scayt-misspell-word',
+		problem_grammar_data_attribute: 'data-grayt-phrase',
+		problem_grammar_class: 'gramm-problem'
+	},
+	backCompatibilityMap: {
+		'scayt_service_protocol': 'scayt_serviceProtocol',
+		'scayt_service_host'  : 'scayt_serviceHost',
+		'scayt_service_port'  : 'scayt_servicePort',
+		'scayt_service_path'  : 'scayt_servicePath',
+		'scayt_customerid'    : 'scayt_customerId'
+	},
+	replaceOldOptionsNames: function(config) {
+		for(var key in config) {
+			if(key in this.backCompatibilityMap) {
+				config[this.backCompatibilityMap[key]] = config[key];
+				delete config[key];
+			}
+		}
+	},
+	createScayt : function(editor) {
+		var self = this,
+			plugin = CKEDITOR.plugins.scayt;
+
+		this.loadScaytLibrary(editor, function(_editor) {
+			var textContainer = _editor.window && _editor.window.getFrame() || _editor.editable();
+
+			// Do not create SCAYT if there is no text container for usage
+			if(!textContainer) {
+				plugin.state.scayt[_editor.name] = false;
+				return;
+			}
+
+			var scaytInstanceOptions = {
+				lang 				: _editor.config.scayt_sLang,
+				container 			: textContainer.$,
+				customDictionary 	: _editor.config.scayt_customDictionaryIds,
+				userDictionaryName 	: _editor.config.scayt_userDictionaryName,
+				localization 		: _editor.langCode,
+				customer_id 		: _editor.config.scayt_customerId,
+				debug 				: _editor.config.scayt_debug,
+				data_attribute_name : self.options.data_attribute_name,
+				misspelled_word_class: self.options.misspelled_word_class,
+				problem_grammar_data_attribute: self.options.problem_grammar_data_attribute,
+				problem_grammar_class: self.options.problem_grammar_class,
+				'options-to-restore':  _editor.config.scayt_disableOptionsStorage,
+				focused 			: _editor.editable().hasFocus, // #30260 we need to set focused=true if CKEditor is focused before SCAYT initialization
+				ignoreElementsRegex : _editor.config.scayt_elementsToIgnore,
+				minWordLength 		: _editor.config.scayt_minWordLength,
+				multiLanguageMode 	: _editor.config.scayt_multiLanguageMode,
+				multiLanguageStyles	: _editor.config.scayt_multiLanguageStyles,
+				graytAutoStartup	: plugin.state.grayt[_editor.name]
+			};
+
+			if(_editor.config.scayt_serviceProtocol) {
+				scaytInstanceOptions['service_protocol'] = _editor.config.scayt_serviceProtocol;
+			}
+
+			if(_editor.config.scayt_serviceHost) {
+				scaytInstanceOptions['service_host'] = _editor.config.scayt_serviceHost;
+			}
+
+			if(_editor.config.scayt_servicePort) {
+				scaytInstanceOptions['service_port'] = _editor.config.scayt_servicePort;
+			}
+
+			if(_editor.config.scayt_servicePath) {
+				scaytInstanceOptions['service_path'] = _editor.config.scayt_servicePath;
+			}
+
+			//predefined options
+			if(typeof _editor.config.scayt_ignoreAllCapsWords === 'boolean') {
+				scaytInstanceOptions['ignore-all-caps-words'] = _editor.config.scayt_ignoreAllCapsWords;
+			}
+
+			if(typeof _editor.config.scayt_ignoreDomainNames === 'boolean') {
+				scaytInstanceOptions['ignore-domain-names'] = _editor.config.scayt_ignoreDomainNames;
+			}
+
+			if(typeof _editor.config.scayt_ignoreWordsWithMixedCases === 'boolean') {
+				scaytInstanceOptions['ignore-words-with-mixed-cases'] = _editor.config.scayt_ignoreWordsWithMixedCases;
+			}
+
+			if(typeof _editor.config.scayt_ignoreWordsWithNumbers === 'boolean') {
+				scaytInstanceOptions['ignore-words-with-numbers'] = _editor.config.scayt_ignoreWordsWithNumbers;
+			}
+
+			var scaytInstance = new SCAYT.CKSCAYT(scaytInstanceOptions, function() {
+					// success callback
+				}, function() {
+					// error callback
+				}),
+				wordsPrefix = 'word_';
+
+			scaytInstance.subscribe('suggestionListSend', function(data) {
+				// TODO: 1. Maybe store suggestions for specific editor
+				// TODO: 2. Fix issue with suggestion duplicates on on server
+				//CKEDITOR.plugins.scayt.suggestions = data.suggestionList;
+				var _wordsCollection = {},
+					_suggestionList =[];
+
+				for (var i = 0; i < data.suggestionList.length; i++) {
+					if (!_wordsCollection[wordsPrefix + data.suggestionList[i]]) {
+						_wordsCollection[wordsPrefix + data.suggestionList[i]] = data.suggestionList[i];
+						_suggestionList.push(data.suggestionList[i]);
+					}
+				}
+
+				CKEDITOR.plugins.scayt.suggestions = _suggestionList;
+			});
+
+			// if selection has changed programmatically by SCAYT we need to react appropriately
+			scaytInstance.subscribe('selectionIsChanged', function(data) {
+				var selection = _editor.getSelection();
+
+				if(selection.isLocked) {
+					_editor.lockSelection();
+				}
+			});
+
+			scaytInstance.subscribe('graytStateChanged', function(data) {
+				plugin.state.grayt[_editor.name] = data.state;
+			});
+
+			_editor.scayt = scaytInstance;
+
+			_editor.fire('scaytButtonState', _editor.readOnly ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_ON);
+		});
+	},
+	destroy: function(editor) {
+		if(editor.scayt) {
+			editor.scayt.destroy();
+		}
+
+		delete editor.scayt;
+		editor.fire('scaytButtonState', CKEDITOR.TRISTATE_OFF);
+	},
+	loadScaytLibrary: function(editor, callback) {
+		var self = this,
+			date,
+			timestamp,
+			scaytUrl;
+
+		// no need to process load requests from same editor as it can cause bugs with
+		// loading ckscayt app due to subsequent calls of some events
+		// need to be before 'if' statement, because of timing issue in CKEDITOR.scriptLoader
+		// when callback executing is delayed for a few milliseconds, and scayt can be created twise
+		// on one instance
+		if(this.loadingHelper[editor.name]) return;
+
+		if(typeof window.SCAYT === 'undefined' || typeof window.SCAYT.CKSCAYT !== 'function') {
+
+			// add onLoad callbacks for editors while SCAYT is loading
+			this.loadingHelper[editor.name] = callback;
+			this.loadingHelper.loadOrder.push(editor.name);
+
+			//creating unique timestamp for SCAYT URL
+			date = new Date();
+			timestamp = date.getTime();
+			scaytUrl = editor.config.scayt_srcUrl;
+
+			//if there already implemented timstamp for scayr_srcURL use it, if not use our timestamp
+			scaytUrl = scaytUrl + (scaytUrl.indexOf('?') >= 0 ? '' : '?' + timestamp);
+
+			if (!this.loadingHelper.ckscaytLoading) {
+				CKEDITOR.scriptLoader.load(scaytUrl, function(success) {
+					var editorName;
+
+					if ( success ) {
+						CKEDITOR.fireOnce('scaytReady');
+
+						for(var i = 0; i < self.loadingHelper.loadOrder.length; i++) {
+							editorName = self.loadingHelper.loadOrder[i];
+
+							if(typeof self.loadingHelper[editorName] === 'function') {
+								self.loadingHelper[editorName](CKEDITOR.instances[editorName]);
+							}
+
+							delete self.loadingHelper[editorName];
+						}
+						self.loadingHelper.loadOrder = [];
+					}
+				});
+				this.loadingHelper.ckscaytLoading = true;
+			}
+
+
+		} else if(window.SCAYT && typeof window.SCAYT.CKSCAYT === 'function') {
+			CKEDITOR.fireOnce('scaytReady');
+
+			if(!editor.scayt) {
+				if(typeof callback === 'function') {
+					callback(editor);
+				}
+			}
+		}
+	}
+};
+
+CKEDITOR.on('dialogDefinition', function(dialogDefinitionEvent) {
+	var dialogName = dialogDefinitionEvent.data.name,
+		dialogDefinition = dialogDefinitionEvent.data.definition,
+		dialog = dialogDefinition.dialog;
+
+	if (dialogName === 'scaytDialog') {
+		dialog.on('cancel', function(cancelEvent) {
+			return false;
+		}, this, null, -1);
+	}
+
+	if ( dialogName === 'checkspell' ) {
+		dialog.on( 'cancel', function( cancelEvent ) {
+			var editor = cancelEvent.sender && cancelEvent.sender.getParentEditor(),
+				plugin = CKEDITOR.plugins.scayt,
+				scaytInstance = editor.scayt;
+
+			if ( scaytInstance && plugin.state.scayt[ editor.name ] && scaytInstance.setMarkupPaused ) {
+				scaytInstance.setMarkupPaused( false );
+			}
+
+			editor.unlockSelection();
+		}, this, null, -2 ); // we need to call cancel callback before WSC plugin
+	}
+
+	if (dialogName === 'link') {
+		dialog.on('ok', function(okEvent) {
+			var editor = okEvent.sender && okEvent.sender.getParentEditor();
+
+			if(editor) {
+				setTimeout(function() {
+					editor.fire('reloadMarkupScayt', {
+						removeOptions: {
+							removeInside: true,
+							forceBookmark: true
+						},
+						timeout: 0
+					});
+				}, 0);
+			}
+		});
+	}
+});
+
+CKEDITOR.on('scaytReady', function() {
+
+	// Override editor.checkDirty method avoid CK checkDirty functionality to fix SCAYT issues with incorrect checkDirty behavior.
+	if(CKEDITOR.config.scayt_handleCheckDirty === true) {
+		var editorCheckDirty = CKEDITOR.editor.prototype;
+
+		editorCheckDirty.checkDirty = CKEDITOR.tools.override(editorCheckDirty.checkDirty, function(org) {
+
+			return function() {
+				var retval = null,
+					pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
+					scaytInstance = this.scayt;
+
+				if(!pluginStatus) {
+					retval = org.call(this);
+				} else {
+					retval = (this.status == 'ready');
+
+					if (retval) {
+						var currentData = scaytInstance.removeMarkupFromString(this.getSnapshot()),
+							prevData = scaytInstance.removeMarkupFromString(this._.previousValue);
+
+						retval = (retval && (prevData !== currentData))
+					}
+				}
+
+				return retval;
+			};
+		});
+
+		editorCheckDirty.resetDirty = CKEDITOR.tools.override(editorCheckDirty.resetDirty, function(org) {
+			return function() {
+				var pluginStatus = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[this.name] && this.scayt,
+					scaytInstance = this.scayt;//CKEDITOR.plugins.scayt.getScayt(this);
+
+				if(!pluginStatus) {
+					org.call(this);
+				} else {
+					this._.previousValue = scaytInstance.removeMarkupFromString(this.getSnapshot());
+				}
+			};
+		});
+	}
+
+	if (CKEDITOR.config.scayt_handleUndoRedo === true) {
+		var undoImagePrototype = CKEDITOR.plugins.undo.Image.prototype;
+
+		// add backword compatibility for CKEDITOR 4.2. method equals was repleced on other method
+		var equalsContentMethodName = (typeof undoImagePrototype.equalsContent == "function") ? 'equalsContent' : 'equals';
+
+		undoImagePrototype[equalsContentMethodName] = CKEDITOR.tools.override(undoImagePrototype[equalsContentMethodName], function(org) {
+			return function(otherImage) {
+				var pluginState = CKEDITOR.plugins.scayt && CKEDITOR.plugins.scayt.state.scayt[otherImage.editor.name] && otherImage.editor.scayt,
+					scaytInstance = otherImage.editor.scayt,
+					thisContents = this.contents,
+					otherContents = otherImage.contents,
+					retval = null;
+
+				// Making the comparison based on content without SCAYT word markers.
+				if(pluginState) {
+					this.contents = scaytInstance.removeMarkupFromString(thisContents) || '';
+					otherImage.contents = scaytInstance.removeMarkupFromString(otherContents) || '';
+				}
+
+				var retval = org.apply(this, arguments);
+
+				this.contents = thisContents;
+				otherImage.contents = otherContents;
+
+				return retval;
+			};
+		});
+	}
+});
+
+/**
+ * Automatically enables SCAYT on editor startup. When set to `true`, this option turns on SCAYT automatically
+ * after loading the editor.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_autoStartup = true;
+ *
+ * @cfg {Boolean} [scayt_autoStartup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables Grammar As You Type (GRAYT) on SCAYT startup. When set to `true`, this option turns on GRAYT automatically
+ * after SCAYT started.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.grayt_autoStartup = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [grayt_autoStartup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables SCAYT initialization when inline CKEditor is not focused. When set to `true`, SCAYT markup is
+ * displayed in both inline editor states, focused and unfocused, so the SCAYT instance is not destroyed. 
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		 config.scayt_inlineModeImmediateMarkup = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_inlineModeImmediateMarkup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the number of SCAYT suggestions to show in the main context menu.
+ * Possible values are:
+ *
+ * * `0` (zero) &ndash; No suggestions are shown in the main context menu. All
+ *     entries will be listed in the "More Suggestions" sub-menu.
+ * * Positive number &ndash; The maximum number of suggestions to show in the context
+ *     menu. Other entries will be shown in the "More Suggestions" sub-menu.
+ * * Negative number &ndash; Five suggestions are shown in the main context menu. All other
+ *     entries will be listed in the "More Suggestions" sub-menu.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Examples:
+ *
+ *		// Display only three suggestions in the main context menu.
+ *		config.scayt_maxSuggestions = 3;
+ *
+ *		// Do not show the suggestions directly.
+ *		config.scayt_maxSuggestions = 0;
+ *
+ * @cfg {Number} [scayt_maxSuggestions=5]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the minimum length of words that will be collected from the editor content for spell checking.
+ * Possible value is any positive number.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Examples:
+ *
+ *		// Set the minimum length of words that will be collected from editor text.
+ *		config.scayt_minWordLength = 5;
+ *
+ * @cfg {Number} [scayt_minWordLength=4]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the customer ID for SCAYT. Used for hosted users only. Required for migration from free
+ * to trial or paid versions.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Load SCAYT using my customer ID.
+ *		config.scayt_customerId  = 'your-encrypted-customer-id';
+ *
+ * @cfg {String} [scayt_customerId='1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables and disables the "More Suggestions" sub-menu in the context menu.
+ * Possible values are `'on'` and `'off'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Disables the "More Suggestions" sub-menu.
+ *		config.scayt_moreSuggestions = 'off';
+ *
+ * @cfg {String} [scayt_moreSuggestions='on']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Customizes the display of SCAYT context menu commands ("Add Word", "Ignore",
+ * "Ignore All", "Options", "Languages", "Dictionaries" and "About").
+ * This must be a string with one or more of the following
+ * words separated by a pipe character (`'|'`):
+ *
+ * * `off` &ndash; Disables all options.
+ * * `all` &ndash; Enables all options.
+ * * `ignore` &ndash; Enables the "Ignore" option.
+ * * `ignoreall` &ndash; Enables the "Ignore All" option.
+ * * `add` &ndash; Enables the "Add Word" option.
+ * * `option` &ndash; Enables the "Options" menu item.
+ * * `language` &ndash; Enables the "Languages" menu item.
+ * * `dictionary` &ndash; Enables the "Dictionaries" menu item.
+ * * `about` &ndash; Enables the "About" menu item.
+ *
+ * Please note that availability of the "Options", "Languages" and "Dictionaries" items
+ * also depends on the {@link CKEDITOR.config#scayt_uiTabs} option.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ *		// Show only "Add Word" and "Ignore All" in the context menu.
+ *		config.scayt_contextCommands = 'add|ignoreall';
+ *
+ * @cfg {String} [scayt_contextCommands='ignore|ignoreall|add']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the default spell checking language for SCAYT. Possible values are:
+ * `'en_US'`, `'en_GB'`, `'pt_BR'`, `'da_DK'`,
+ * `'nl_NL'`, `'en_CA'`, `'fi_FI'`, `'fr_FR'`,
+ * `'fr_CA'`, `'de_DE'`, `'el_GR'`, `'it_IT'`,
+ * `'nb_NO'`, `'pt_PT'`, `'es_ES'`, `'sv_SE'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Sets SCAYT to German.
+ *		config.scayt_sLang = 'de_DE';
+ *
+ * @cfg {String} [scayt_sLang='en_US']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Customizes the SCAYT dialog and SCAYT toolbar menu to show particular tabs and items.
+ * This setting must contain a `1` (enabled) or `0`
+ * (disabled) value for each of the following entries, in this precise order,
+ * separated by a comma (`','`): `'Options'`, `'Languages'`, and `'Dictionary'`.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Hides the "Languages" tab.
+ *		config.scayt_uiTabs = '1,0,1';
+ *
+ * @cfg {String} [scayt_uiTabs='1,1,1']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the protocol for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Defines the protocol for the WebSpellChecker service (ssrv.cgi) path.
+ *		config.scayt_serviceProtocol = 'https';
+ *
+ * @cfg {String} [scayt_serviceProtocol='http']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the host for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Defines the host for the WebSpellChecker service (ssrv.cgi) path.
+ *		config.scayt_serviceHost = 'my-host';
+ *
+ * @cfg {String} [scayt_serviceHost='svc.webspellchecker.net']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the port for the WebSpellChecker service (`ssrv.cgi`) full path.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Defines the port for the WebSpellChecker service (ssrv.cgi) path.
+ *		config.scayt_servicePort = '2330';
+ *
+ * @cfg {String} [scayt_servicePort='80']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the path to the WebSpellChecker service (`ssrv.cgi`).
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		// Defines the path to the WebSpellChecker service (ssrv.cgi).
+ *		config.scayt_servicePath = 'my-path/ssrv.cgi';
+ *
+ * @cfg {String} [scayt_servicePath='spellcheck31/script/ssrv.cgi']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Sets the URL to SCAYT core. Required to switch to the licensed version of SCAYT.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=migration:hosredfreetolicensedck)
+ * for more details.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_srcUrl = "http://my-host/spellcheck/lf/scayt/scayt.js";
+ *
+ * @cfg {String} [scayt_srcUrl='//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Links SCAYT to custom dictionaries. This is a string containing the dictionary IDs
+ * separated by commas (`','`). Available only for the licensed version.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:customdictionaries:licensed)
+ * for more details.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_customDictionaryIds = '3021,3456,3478';
+ *
+ * @cfg {String} [scayt_customDictionaryIds='']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Activates a User Dictionary in SCAYT. The user
+ * dictionary name must be used. Available only for the licensed version.
+ *
+ * Refer to [SCAYT documentation](http://wiki.webspellchecker.net/doku.php?id=installationandconfiguration:userdictionaries)
+ * for more details. 
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_userDictionaryName = 'MyDictionary';
+ *
+ * @cfg {String} [scayt_userDictionaryName='']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines the order of SCAYT context menu items by groups.
+ * This must be a string with one or more of the following
+ * words separated by a pipe character (`'|'`):
+ *
+ * * `suggest` &ndash; The main suggestion word list.
+ * * `moresuggest` &ndash; The "More suggestions" word list.
+ * * `control` &ndash; SCAYT commands, such as "Ignore" and "Add Word".
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ *		config.scayt_contextMenuItemsOrder = 'moresuggest|control|suggest';
+ *
+ * @cfg {String} [scayt_contextMenuItemsOrder='suggest|moresuggest|control']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * If set to `true`, it overrides the {@link CKEDITOR.editor#checkDirty checkDirty} functionality of CKEditor
+ * to fix SCAYT issues with incorrect `checkDirty` behavior. If set to `false`,
+ * it provides better performance on big preloaded text.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_handleCheckDirty = 'false';
+ *
+ * @cfg {String} [scayt_handleCheckDirty='true']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Configures undo/redo behavior of SCAYT in CKEditor.
+ * If set to `true`, it overrides the undo/redo functionality of CKEditor
+ * to fix SCAYT issues with incorrect undo/redo behavior. If set to `false`,
+ * it provides better performance on text undo/redo.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_handleUndoRedo = 'false';
+ *
+ * @cfg {String} [scayt_handleUndoRedo='true']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore All-Caps Words" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_ignoreAllCapsWords = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreAllCapsWords=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Domain Names" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_ignoreDomainNames = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreDomainNames=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Words with Mixed Case" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_ignoreWordsWithMixedCases = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreWordsWithMixedCases=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables the "Ignore Words with Numbers" option by default.
+ * You may need to {@link CKEDITOR.config#scayt_disableOptionsStorage disable option storing} for this setting to be
+ * effective because option storage has a higher priority.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_ignoreWordsWithNumbers = true;
+ *
+ * @since 4.5.6
+ * @cfg {Boolean} [scayt_ignoreWordsWithNumbers=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Disables storing of SCAYT options between sessions. Option storing will be turned off after a page refresh.
+ * The following settings can be used:
+ *
+ * * `'options'` &ndash; Disables storing of all SCAYT Ignore options.
+ * * `'ignore-all-caps-words'` &ndash; Disables storing of the "Ignore All-Caps Words" option.
+ * * `'ignore-domain-names'` &ndash; Disables storing of the "Ignore Domain Names" option.
+ * * `'ignore-words-with-mixed-cases'` &ndash; Disables storing of the "Ignore Words with Mixed Case" option.
+ * * `'ignore-words-with-numbers'` &ndash; Disables storing of the "Ignore Words with Numbers" option.
+ * * `'lang'` &ndash; Disables storing of the SCAYT spell check language.
+ * * `'all'` &ndash; Disables storing of all SCAYT options.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ *		// Disabling one option.
+ *		config.scayt_disableOptionsStorage = 'all';
+ *
+ *		// Disabling several options.
+ *  	config.scayt_disableOptionsStorage = ['lang', 'ignore-domain-names', 'ignore-words-with-numbers'];
+ *
+ *
+ * @cfg {String|Array} [scayt_disableOptionsStorage = '']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Specifies the names of tags that will be skipped while spell checking. This is a string containing tag names
+ * separated by commas (`','`). Please note that the `'style'` tag would be added to specified tags list.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_elementsToIgnore = 'del,pre';
+ *
+ * @cfg {String} [scayt_elementsToIgnore='style']
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Enables multi-language support in SCAYT. If set to `true`, turns on SCAYT multi-language support after loading the editor.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ *		config.scayt_multiLanguageMode = true;
+ *
+ * @cfg {Boolean} [scayt_multiLanguageMode=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Defines additional styles for misspellings for specified languages. Styles will be applied only if
+ * the {@link CKEDITOR.config#scayt_multiLanguageMode} option is set to `true` and the [Language](http://ckeditor.com/addon/language) 
+ * plugin is included and loaded in the editor. By default, all misspellings will still be underlined with the red waveline.
+ *
+ * Read more in the [documentation](#!/guide/dev_spellcheck) and see the [SDK sample](http://sdk.ckeditor.com/samples/spellchecker.html).
+ *
+ * Example:
+ *
+ *		// Display misspellings in French language with green color and underlined with red waveline.
+ *		config.scayt_multiLanguageStyles = {
+ *			'fr': 'color: green'
+ *		};
+ *
+ *		// Display misspellings in Italian language with green color and underlined with red waveline
+ *		// and German misspellings with red color only.
+ *		config.scayt_multiLanguageStyles = {
+ *			'it': 'color: green',
+ *			'de': 'background-image: none; color: red'
+ *		};
+ *
+ * @cfg {Object} [scayt_multiLanguageStyles = {}]
+ * @member CKEDITOR.config
+ */