From 7adcb81e4f83f98c468889aaa5a85558ba88c770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Mon, 25 Jan 2016 17:45:33 +0100 Subject: Initial commit --- sources/plugins/wsc/LICENSE.md | 28 + sources/plugins/wsc/README.md | 25 + sources/plugins/wsc/dialogs/ciframe.html | 66 + sources/plugins/wsc/dialogs/tmpFrameset.html | 52 + sources/plugins/wsc/dialogs/wsc.css | 82 + sources/plugins/wsc/dialogs/wsc.js | 3152 ++++++++++++++++++++++ sources/plugins/wsc/dialogs/wsc_ie.js | 176 ++ sources/plugins/wsc/icons/hidpi/spellchecker.png | Bin 0 -> 2816 bytes sources/plugins/wsc/icons/spellchecker.png | Bin 0 -> 836 bytes sources/plugins/wsc/lang/af.js | 24 + sources/plugins/wsc/lang/ar.js | 24 + sources/plugins/wsc/lang/bg.js | 24 + sources/plugins/wsc/lang/bn.js | 24 + sources/plugins/wsc/lang/bs.js | 24 + sources/plugins/wsc/lang/ca.js | 24 + sources/plugins/wsc/lang/cs.js | 24 + sources/plugins/wsc/lang/cy.js | 24 + sources/plugins/wsc/lang/da.js | 24 + sources/plugins/wsc/lang/de.js | 24 + sources/plugins/wsc/lang/el.js | 24 + sources/plugins/wsc/lang/en-au.js | 24 + sources/plugins/wsc/lang/en-ca.js | 24 + sources/plugins/wsc/lang/en-gb.js | 24 + sources/plugins/wsc/lang/en.js | 24 + sources/plugins/wsc/lang/eo.js | 24 + sources/plugins/wsc/lang/es.js | 24 + sources/plugins/wsc/lang/et.js | 24 + sources/plugins/wsc/lang/eu.js | 24 + sources/plugins/wsc/lang/fa.js | 24 + sources/plugins/wsc/lang/fi.js | 24 + sources/plugins/wsc/lang/fo.js | 24 + sources/plugins/wsc/lang/fr-ca.js | 24 + sources/plugins/wsc/lang/fr.js | 24 + sources/plugins/wsc/lang/gl.js | 24 + sources/plugins/wsc/lang/gu.js | 24 + sources/plugins/wsc/lang/he.js | 24 + sources/plugins/wsc/lang/hi.js | 24 + sources/plugins/wsc/lang/hr.js | 24 + sources/plugins/wsc/lang/hu.js | 24 + sources/plugins/wsc/lang/is.js | 24 + sources/plugins/wsc/lang/it.js | 24 + sources/plugins/wsc/lang/ja.js | 24 + sources/plugins/wsc/lang/ka.js | 24 + sources/plugins/wsc/lang/km.js | 24 + sources/plugins/wsc/lang/ko.js | 24 + sources/plugins/wsc/lang/ku.js | 24 + sources/plugins/wsc/lang/lt.js | 24 + sources/plugins/wsc/lang/lv.js | 24 + sources/plugins/wsc/lang/mk.js | 24 + sources/plugins/wsc/lang/mn.js | 24 + sources/plugins/wsc/lang/ms.js | 24 + sources/plugins/wsc/lang/nb.js | 24 + sources/plugins/wsc/lang/nl.js | 24 + sources/plugins/wsc/lang/no.js | 24 + sources/plugins/wsc/lang/pl.js | 24 + sources/plugins/wsc/lang/pt-br.js | 24 + sources/plugins/wsc/lang/pt.js | 24 + sources/plugins/wsc/lang/ro.js | 24 + sources/plugins/wsc/lang/ru.js | 24 + sources/plugins/wsc/lang/sk.js | 24 + sources/plugins/wsc/lang/sl.js | 24 + sources/plugins/wsc/lang/sr-latn.js | 24 + sources/plugins/wsc/lang/sr.js | 24 + sources/plugins/wsc/lang/sv.js | 24 + sources/plugins/wsc/lang/th.js | 24 + sources/plugins/wsc/lang/tr.js | 24 + sources/plugins/wsc/lang/ug.js | 24 + sources/plugins/wsc/lang/uk.js | 24 + sources/plugins/wsc/lang/vi.js | 24 + sources/plugins/wsc/lang/zh-cn.js | 24 + sources/plugins/wsc/lang/zh.js | 24 + sources/plugins/wsc/plugin.js | 142 + 72 files changed, 5211 insertions(+) create mode 100644 sources/plugins/wsc/LICENSE.md create mode 100644 sources/plugins/wsc/README.md create mode 100644 sources/plugins/wsc/dialogs/ciframe.html create mode 100644 sources/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 sources/plugins/wsc/dialogs/wsc.css create mode 100644 sources/plugins/wsc/dialogs/wsc.js create mode 100644 sources/plugins/wsc/dialogs/wsc_ie.js create mode 100644 sources/plugins/wsc/icons/hidpi/spellchecker.png create mode 100644 sources/plugins/wsc/icons/spellchecker.png create mode 100644 sources/plugins/wsc/lang/af.js create mode 100644 sources/plugins/wsc/lang/ar.js create mode 100644 sources/plugins/wsc/lang/bg.js create mode 100644 sources/plugins/wsc/lang/bn.js create mode 100644 sources/plugins/wsc/lang/bs.js create mode 100644 sources/plugins/wsc/lang/ca.js create mode 100644 sources/plugins/wsc/lang/cs.js create mode 100644 sources/plugins/wsc/lang/cy.js create mode 100644 sources/plugins/wsc/lang/da.js create mode 100644 sources/plugins/wsc/lang/de.js create mode 100644 sources/plugins/wsc/lang/el.js create mode 100644 sources/plugins/wsc/lang/en-au.js create mode 100644 sources/plugins/wsc/lang/en-ca.js create mode 100644 sources/plugins/wsc/lang/en-gb.js create mode 100644 sources/plugins/wsc/lang/en.js create mode 100644 sources/plugins/wsc/lang/eo.js create mode 100644 sources/plugins/wsc/lang/es.js create mode 100644 sources/plugins/wsc/lang/et.js create mode 100644 sources/plugins/wsc/lang/eu.js create mode 100644 sources/plugins/wsc/lang/fa.js create mode 100644 sources/plugins/wsc/lang/fi.js create mode 100644 sources/plugins/wsc/lang/fo.js create mode 100644 sources/plugins/wsc/lang/fr-ca.js create mode 100644 sources/plugins/wsc/lang/fr.js create mode 100644 sources/plugins/wsc/lang/gl.js create mode 100644 sources/plugins/wsc/lang/gu.js create mode 100644 sources/plugins/wsc/lang/he.js create mode 100644 sources/plugins/wsc/lang/hi.js create mode 100644 sources/plugins/wsc/lang/hr.js create mode 100644 sources/plugins/wsc/lang/hu.js create mode 100644 sources/plugins/wsc/lang/is.js create mode 100644 sources/plugins/wsc/lang/it.js create mode 100644 sources/plugins/wsc/lang/ja.js create mode 100644 sources/plugins/wsc/lang/ka.js create mode 100644 sources/plugins/wsc/lang/km.js create mode 100644 sources/plugins/wsc/lang/ko.js create mode 100644 sources/plugins/wsc/lang/ku.js create mode 100644 sources/plugins/wsc/lang/lt.js create mode 100644 sources/plugins/wsc/lang/lv.js create mode 100644 sources/plugins/wsc/lang/mk.js create mode 100644 sources/plugins/wsc/lang/mn.js create mode 100644 sources/plugins/wsc/lang/ms.js create mode 100644 sources/plugins/wsc/lang/nb.js create mode 100644 sources/plugins/wsc/lang/nl.js create mode 100644 sources/plugins/wsc/lang/no.js create mode 100644 sources/plugins/wsc/lang/pl.js create mode 100644 sources/plugins/wsc/lang/pt-br.js create mode 100644 sources/plugins/wsc/lang/pt.js create mode 100644 sources/plugins/wsc/lang/ro.js create mode 100644 sources/plugins/wsc/lang/ru.js create mode 100644 sources/plugins/wsc/lang/sk.js create mode 100644 sources/plugins/wsc/lang/sl.js create mode 100644 sources/plugins/wsc/lang/sr-latn.js create mode 100644 sources/plugins/wsc/lang/sr.js create mode 100644 sources/plugins/wsc/lang/sv.js create mode 100644 sources/plugins/wsc/lang/th.js create mode 100644 sources/plugins/wsc/lang/tr.js create mode 100644 sources/plugins/wsc/lang/ug.js create mode 100644 sources/plugins/wsc/lang/uk.js create mode 100644 sources/plugins/wsc/lang/vi.js create mode 100644 sources/plugins/wsc/lang/zh-cn.js create mode 100644 sources/plugins/wsc/lang/zh.js create mode 100644 sources/plugins/wsc/plugin.js (limited to 'sources/plugins/wsc') diff --git a/sources/plugins/wsc/LICENSE.md b/sources/plugins/wsc/LICENSE.md new file mode 100644 index 00000000..6096de23 --- /dev/null +++ b/sources/plugins/wsc/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor WSC Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/sources/plugins/wsc/README.md b/sources/plugins/wsc/README.md new file mode 100644 index 00000000..346e2ab1 --- /dev/null +++ b/sources/plugins/wsc/README.md @@ -0,0 +1,25 @@ +CKEditor WebSpellChecker Plugin +=============================== + +This plugin brings Web Spell Checker (WSC) into CKEditor. + +WSC is "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/wsc" folder in your CKEditor installation. +2. Enable the "wsc" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'wsc'; + +That's all. WSC 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/). diff --git a/sources/plugins/wsc/dialogs/ciframe.html b/sources/plugins/wsc/dialogs/ciframe.html new file mode 100644 index 00000000..8e4e6bc9 --- /dev/null +++ b/sources/plugins/wsc/dialogs/ciframe.html @@ -0,0 +1,66 @@ + + + + + + + + +

+ diff --git a/sources/plugins/wsc/dialogs/tmpFrameset.html b/sources/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 00000000..19c7c9cc --- /dev/null +++ b/sources/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/sources/plugins/wsc/dialogs/wsc.css b/sources/plugins/wsc/dialogs/wsc.css new file mode 100644 index 00000000..2a622f22 --- /dev/null +++ b/sources/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/sources/plugins/wsc/dialogs/wsc.js b/sources/plugins/wsc/dialogs/wsc.js new file mode 100644 index 00000000..eb96af8a --- /dev/null +++ b/sources/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,3152 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + (function() { + // Create support tools + var appTools = (function(){ + var inited = {}; + + var _init = function(handler) { + if (window.addEventListener) { + window.addEventListener('message', handler, false); + } else { + window.attachEvent("onmessage", handler); + } + }; + + var unbindHandler = function(handler) { + if (window.removeEventListener) { + window.removeEventListener('message', handler, false); + } else { + window.detachEvent('onmessage', handler); + } + }; + + var _sendCmd = function(o) { + var str, + type = Object.prototype.toString, + objObject = "[object Object]", + fn = o.fn || null, + id = o.id || '', + target = o.target || window, + message = o.message || { + 'id': id + }; + + if (o.message && type.call(o.message) == objObject) { + (o.message.id) ? o.message.id : o.message.id = id; + message = o.message; + } + + str = window.JSON.stringify(message, fn); + target.postMessage(str, '*'); + }; + + var _hashCreate = function(o, fn) { + fn = fn || null; + var str = window.JSON.stringify(o, fn); + return str; + }; + + var _hashParse = function(str, fn) { + fn = fn || null; + return window.JSON.parse(str, fn); + }; + + var setCookie = function(name, value, options) { + options = options || {}; + + var expires = options.expires; + + if (typeof expires == "number" && expires) { + var d = new Date(); + d.setTime(d.getTime() + expires*1000); + expires = options.expires = d; + } + if (expires && expires.toUTCString) { + options.expires = expires.toUTCString(); + } + + value = encodeURIComponent(value); + var updatedCookie = name + "=" + value; + + for(var propName in options) { + var propValue = options[propName]; + updatedCookie += "; " + propName; + if (propValue !== true) { + updatedCookie += "=" + propValue; + } + } + document.cookie = updatedCookie; + }; + + var getCookie = function(name) { + var matches = document.cookie.match(new RegExp( + "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" + )); + return matches ? decodeURIComponent(matches[1]) : undefined; + }; + + var deleteCookie = function(name) { + setCookie(name, "", { expires: -1 }); + }; + + var findFocusable = function(ckEl) { + var result = null, + focusableSelectors = 'a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]'; + + if(ckEl) { + result = ckEl.find(focusableSelectors); + } + + return result; + }; + + var getStyle = function(el, prop) { + if(document.defaultView && document.defaultView.getComputedStyle) { + return document.defaultView.getComputedStyle(el, null)[prop]; + } else if(el.currentStyle) { + return el.currentStyle[prop]; + } else { + return el.style[prop]; + } + }; + + var isHidden = function(el) { + return el.offsetWidth === 0 || el.offsetHeight == 0 || getStyle(el, 'display') === 'none'; + }; + + var isVisible = function(el) { + return !isHidden(el); + }; + + var hasClass = function (obj, cname) { + return !!(obj.className ? obj.className.match(new RegExp('(\\s|^)'+cname+'(\\s|$)')) : false); + }; + + return { + postMessage: { + init: _init, + send: _sendCmd, + unbindHandler: unbindHandler + }, + hash: { + create: function() { + + }, + + parse: function() { + + } + }, + cookie: { + set: setCookie, + get: getCookie, + remove: deleteCookie + }, + misc: { + findFocusable: findFocusable, + isVisible: isVisible, + hasClass: hasClass + } + }; + })(); + + var NS = NS || {}; + NS.TextAreaNumber = null; + NS.load = true; + NS.cmd = { + "SpellTab": 'spell', + "Thesaurus": 'thes', + "GrammTab": 'grammar' + }; + NS.dialog = null; + NS.optionNode = null; + NS.selectNode = null; + NS.grammerSuggest = null; + NS.textNode = {}; + NS.iframeMain = null; + NS.dataTemp = ''; + NS.div_overlay = null; + NS.textNodeInfo = {}; + NS.selectNode = {}; + NS.selectNodeResponce = {}; + NS.langList = null; + NS.langSelectbox = null; + NS.banner = ''; + NS.show_grammar = null; + NS.div_overlay_no_check = null; + NS.targetFromFrame = {}; + NS.onLoadOverlay = null; + NS.LocalizationComing = {}; + NS.OverlayPlace = null; + NS.sessionid = ''; + NS.LocalizationButton = { + 'ChangeTo_button': { + 'instance' : null, + 'text' : 'Change to', + 'localizationID': 'ChangeTo' + }, + + 'ChangeAll': { + 'instance' : null, + 'text' : 'Change All' + }, + + 'IgnoreWord': { + 'instance' : null, + 'text' : 'Ignore word' + }, + + 'IgnoreAllWords': { + 'instance' : null, + 'text' : 'Ignore all words' + }, + + 'Options': { + 'instance' : null, + 'text' : 'Options', + 'optionsDialog': { + 'instance' : null + } + }, + + 'AddWord': { + 'instance' : null, + 'text' : 'Add word' + }, + + 'FinishChecking_button': { + 'instance' : null, + 'text' : 'Finish Checking', + 'localizationID': 'FinishChecking' + }, + + 'FinishChecking_button_block': { + 'instance' : null, + 'text' : 'Finish Checking', + 'localizationID': 'FinishChecking' + } + }; + + NS.LocalizationLabel = { + 'ChangeTo_label': { + 'instance' : null, + 'text' : 'Change to', + 'localizationID': 'ChangeTo' + }, + + 'Suggestions': { + 'instance' : null, + 'text' : 'Suggestions' + }, + + 'Categories': { + 'instance' : null, + 'text' : 'Categories' + }, + + 'Synonyms': { + 'instance' : null, + 'text' : 'Synonyms' + } + }; + + var SetLocalizationButton = function(obj) { + var el, localizationID; + + for(var i in obj) { + el = NS.dialog.getContentElement(NS.dialog._.currentTabId, i); + + if(el) { + el = el.getElement(); + } else { + el = obj[i].instance.getElement().getFirst() || obj[i].instance.getElement(); + } + + localizationID = obj[i].localizationID || i; + el.setText(NS.LocalizationComing[localizationID]); + } + }; + + var SetLocalizationLabel = function(obj) { + var el, localizationID; + + for(var i in obj) { + el = NS.dialog.getContentElement(NS.dialog._.currentTabId, i); + + if(!el) { + el = obj[i].instance; + } + + if(el.setLabel) { + localizationID = obj[i].localizationID || i; + el.setLabel(NS.LocalizationComing[localizationID] + ':'); + } + } + }; + var OptionsConfirm = function(state) { + if (state) { + nameNode.setValue(''); + } + }; + + var iframeOnload = false; + var nameNode, selectNode, frameId; + + NS.framesetHtml = function(tab) { + var str = ''; + return str; + }; + + NS.setIframe = function(that, nameTab) { + var iframe, + str = NS.framesetHtml(nameTab), + iframeId = NS.iframeNumber + '_' + nameTab, + // tmp.html from wsc/dialogs + iframeInnerHtml = + '' + + '' + + '' + + '' + + 'iframe' + + + '' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + that.getElement().setHtml(str); + iframe = document.getElementById(iframeId); + iframe = (iframe.contentWindow) ? iframe.contentWindow : (iframe.contentDocument.document) ? iframe.contentDocument.document : iframe.contentDocument; + iframe.document.open(); + iframe.document.write(iframeInnerHtml); + iframe.document.close(); + }; + + NS.setCurrentIframe = function(currentTab) { + var that = NS.dialog._.contents[currentTab].Content, + tabID, iframe; + + NS.setIframe(that, currentTab); + + }; + + NS.setHeightBannerFrame = function() { + var height = "90px", + bannerPlaceSpellTab = NS.dialog.getContentElement('SpellTab', 'banner').getElement(), + bannerPlaceGrammTab = NS.dialog.getContentElement('GrammTab', 'banner').getElement(), + bannerPlaceThesaurus = NS.dialog.getContentElement('Thesaurus', 'banner').getElement(); + + bannerPlaceSpellTab.setStyle('height', height); + bannerPlaceGrammTab.setStyle('height', height); + bannerPlaceThesaurus.setStyle('height', height); + }; + + NS.setHeightFrame = function() { + var currentTab = NS.dialog._.currentTabId, + tabID = NS.iframeNumber + '_' + currentTab, + iframe = document.getElementById(tabID); + + iframe.style.height = '240px'; + }; + + NS.sendData = function(scope) { + var currentTab = scope._.currentTabId, + that = scope._.contents[currentTab].Content, + tabID, iframe; + + NS.previousTab = currentTab; + NS.setIframe(that, currentTab); + + var loadNewTab = function(event) { + currentTab = scope._.currentTabId; + event = event || window.event; + + if (!event.data.getTarget().is('a')) { + return; + } + + if(currentTab === NS.previousTab) return; + NS.previousTab = currentTab; + + that = scope._.contents[currentTab].Content; + tabID = NS.iframeNumber + '_' + currentTab; + NS.div_overlay.setEnable(); + + if (!that.getElement().getChildCount()) { + NS.setIframe(that, currentTab); + iframe = document.getElementById(tabID); + NS.targetFromFrame[tabID] = iframe.contentWindow; + } else { + sendData(NS.targetFromFrame[tabID], NS.cmd[currentTab]); + } + }; + + scope.parts.tabs.removeListener('click', loadNewTab); + scope.parts.tabs.on('click', loadNewTab); + }; + + NS.buildSelectLang = function(aId) { + var divContainer = new CKEDITOR.dom.element('div'), + selectContainer = new CKEDITOR.dom.element('select'), + id = "wscLang" + aId; + + divContainer.addClass("cke_dialog_ui_input_select"); + divContainer.setAttribute("role", "presentation"); + divContainer.setStyles({ + 'height': 'auto', + 'position': 'absolute', + 'right': '0', + 'top': '-1px', + 'width': '160px', + 'white-space': 'normal' + }); + + selectContainer.setAttribute('id', id); + selectContainer.addClass("cke_dialog_ui_input_select"); + selectContainer.setStyles({ + 'width': '160px' + }); + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + divContainer.append(selectContainer); + + return divContainer; + + }; + + NS.buildOptionLang = function(key, aId) { + var id = "wscLang" + aId; + var select = document.getElementById(id), + fragment = document.createDocumentFragment(), + create_option, txt_option, + sort = []; + + if(select.options.length === 0) { + for (var lang in key) { + sort.push([lang, key[lang]]); + } + sort.sort(); + + for (var i = 0; i < sort.length; i++) { + create_option=document.createElement("option"); + create_option.setAttribute("value", sort[i][1]); + txt_option = document.createTextNode(sort[i][0]); + create_option.appendChild(txt_option); + + fragment.appendChild(create_option); + } + select.appendChild(fragment); + } + + // make appropriate option selected according to current selected language + for (var j = 0; j < select.options.length; j++) { + if (select.options[j].value == NS.selectingLang) { + select.options[j].selected = "selected"; + } + } + }; + + NS.buildOptionSynonyms = function(key) { + var syn = NS.selectNodeResponce[key]; + + var select = getSelect( NS.selectNode['Synonyms'] ); + + NS.selectNode['Synonyms'].clear(); + + for (var i = 0; i < syn.length; i++) { + var option = document.createElement('option'); + option.text = syn[i]; + option.value = syn[i]; + + select.$.add(option, i); + } + + NS.selectNode['Synonyms'].getInputElement().$.firstChild.selected = true; + NS.textNode['Thesaurus'].setValue(NS.selectNode['Synonyms'].getInputElement().getValue()); + }; + + var setBannerInPlace = function(htmlBanner) { + var findBannerPlace = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'banner').getElement(); + findBannerPlace.setHtml(htmlBanner); + + }; + + var overlayBlock = function overlayBlock(opt) { + var progress = opt.progress || "", + doc = document, + target = opt.target || doc.body, + overlayId = opt.id || "overlayBlock", + opacity = opt.opacity || "0.9", + background = opt.background || "#f1f1f1", + getOverlay = doc.getElementById(overlayId), + thisOverlay = getOverlay || doc.createElement("div"); + + thisOverlay.style.cssText = "position: absolute;" + + "top:30px;" + + "bottom:41px;" + + "left:1px;" + + "right:1px;" + + "z-index: 10020;" + + "padding:0;" + + "margin:0;" + + "background:" + background + ";" + + "opacity: " + opacity + ";" + + "filter: alpha(opacity=" + opacity * 100 + ");" + + "display: none;"; + thisOverlay.id = overlayId; + + if (!getOverlay) { + target.appendChild(thisOverlay); + } + + return { + setDisable: function() { + thisOverlay.style.display = "none"; + }, + setEnable: function() { + thisOverlay.style.display = "block"; + } + }; + }; + + var buildRadioInputs = function(key, value, check) { + var divContainer = new CKEDITOR.dom.element('div'), + radioButton = new CKEDITOR.dom.element('input'), + radioLabel = new CKEDITOR.dom.element('label'), + id = "wscGrammerSuggest" + key + "_" + value; + + divContainer.addClass("cke_dialog_ui_input_radio"); + divContainer.setAttribute("role", "presentation"); + divContainer.setStyles({ + width: "97%", + padding: "5px", + 'white-space': 'normal' + }); + + radioButton.setAttributes({ + type: "radio", + value: value, + name: 'wscGrammerSuggest', + id: id + }); + radioButton.setStyles({ + "float":"left" + }); + + radioButton.on("click", function(data) { + NS.textNode['GrammTab'].setValue(data.sender.getValue()); + }); + + (check) ? radioButton.setAttribute("checked", true) : false; + + radioButton.addClass("cke_dialog_ui_radio_input"); + + radioLabel.appendText(key); + radioLabel.setAttribute("for", id); + radioLabel.setStyles({ + 'display': "block", + 'line-height': '16px', + 'margin-left': '18px', + 'white-space': 'normal' + }); + + divContainer.append(radioButton); + divContainer.append(radioLabel); + + return divContainer; + }; + + var statusGrammarTab = function(aState) { //#19221 + aState = aState || 'true'; + if(aState !== null && aState == 'false'){ + hideGrammTab(); + } + }; + + var langConstructor = function(lang) { + var langSelectBox = new __constructLangSelectbox(lang), + selectId = "wscLang" + NS.dialog.getParentEditor().name, + selectContainer = document.getElementById(selectId), + currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + NS.buildOptionLang(langSelectBox.setLangList, NS.dialog.getParentEditor().name); + tabView[langSelectBox.getCurrentLangGroup(NS.selectingLang)].onShow(); + statusGrammarTab(NS.show_grammar); + + selectContainer.onchange = function(e) { + var langGroup = langSelectBox.getCurrentLangGroup(this.value), + currentTabId = NS.dialog._.currentTabId, + cmd; + + e = e || window.event; + + tabView[langGroup].onShow(); + statusGrammarTab(NS.show_grammar); + NS.div_overlay.setEnable(); + NS.selectingLang = this.value; + + // get command for current opened tan + cmd = NS.cmd[currentTabId]; + // check whether current tab can be opened after language switching + if(!langGroup || !tabView[langGroup] || !tabView[langGroup].allowedTabCommands[cmd]) { + // if not so - set default tab to open after reload + cmd = tabView[langGroup].defaultTabCommand; + } + + for(var key in NS.cmd) { + if(NS.cmd[key] == cmd) { + NS.previousTab = key; + break; + } + } + + appTools.postMessage.send({ + 'message': { + 'changeLang': NS.selectingLang, + 'text': NS.dataTemp, + 'cmd': cmd + }, + 'target': NS.targetFromFrame[frameId], + 'id': 'selectionLang_outer__page' + }); + }; + + }; + + var disableButtonSuggest = function(word) { + var changeToButton, changeAllButton, + styleDisable = function(instanceButton) { + var button = NS.dialog.getContentElement(NS.dialog._.currentTabId, instanceButton) || NS.LocalizationButton[instanceButton].instance; + button.getElement().hasClass('cke_disabled') ? button.getElement().setStyle('color', '#a0a0a0') : button.disable(); + }, + styleEnable = function(instanceButton) { + var button = NS.dialog.getContentElement(NS.dialog._.currentTabId, instanceButton) || NS.LocalizationButton[instanceButton].instance; + button.enable(); + button.getElement().setStyle('color', '#333'); + }; + + if (word == 'no_any_suggestions') { + word = 'No suggestions'; + + changeToButton = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'ChangeTo_button') || NS.LocalizationButton['ChangeTo_button'].instance; + changeToButton.disable(); + changeAllButton = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'ChangeAll') || NS.LocalizationButton['ChangeAll'].instance; + changeAllButton.disable(); + + styleDisable('ChangeTo_button'); + styleDisable('ChangeAll'); + + return word; + } else { + styleEnable('ChangeTo_button'); + styleEnable('ChangeAll'); + + return word; + } + }; + + function getSelect( obj ) { + if ( obj && obj.domId && obj.getInputElement().$ ) + return obj.getInputElement(); + else if ( obj && obj.$ ) + return obj; + return false; + } + + var handlerId = { + iframeOnload: function(response) { + NS.div_overlay.setEnable(); + iframeOnload = true; + var currentTab = NS.dialog._.currentTabId, + tabId = NS.iframeNumber + '_' + currentTab; + sendData(NS.targetFromFrame[tabId], NS.cmd[currentTab]); + }, + + suggestlist: function(response) { + delete response.id; + NS.div_overlay_no_check.setDisable(); + hideCurrentFinishChecking(); + langConstructor(NS.langList); + + var word = disableButtonSuggest(response.word), + suggestionsList = ''; + + if (word instanceof Array) { + word = response.word[0]; + } + + word = word.split(','); + suggestionsList = word; + + NS.textNode['SpellTab'].setValue(suggestionsList[0]); + + var select = getSelect( selectNode ); + + selectNode.clear(); + + for (var i = 0; i < suggestionsList.length; i++) { + var option = document.createElement('option'); + option.text = suggestionsList[i]; + option.value = suggestionsList[i]; + + select.$.add(option, i); + } + + showCurrentTabs(); + NS.div_overlay.setDisable(); + + }, + + grammerSuggest: function(response) { + delete response.id; + delete response.mocklangs; + + hideCurrentFinishChecking(); + langConstructor(NS.langList); // Show select language for this command CKEDITOR.config.wsc_cmd + var firstSuggestValue = response.grammSuggest[0];// ? firstSuggestValue = response.grammSuggest[0] : firstSuggestValue = 'No suggestion for this words'; + NS.grammerSuggest.getElement().setHtml(''); + + NS.textNode['GrammTab'].reset(); + NS.textNode['GrammTab'].setValue(firstSuggestValue); + + NS.textNodeInfo['GrammTab'].getElement().setHtml(''); + NS.textNodeInfo['GrammTab'].getElement().setText(response.info); + + var arr = response.grammSuggest, + len = arr.length, + check = true; + + for (var i = 0; i < len; i++) { + NS.grammerSuggest.getElement().append(buildRadioInputs(arr[i], arr[i], check)); + check = false; + } + + showCurrentTabs(); + NS.div_overlay.setDisable(); + }, + + thesaurusSuggest: function(response) { + delete response.id; + delete response.mocklangs; + + hideCurrentFinishChecking(); + langConstructor(NS.langList); // Show select language for this command CKEDITOR.config.wsc_cmd + NS.selectNodeResponce = response; + + NS.textNode['Thesaurus'].reset(); + + var select = getSelect( NS.selectNode['Categories'] ), + count = 0; + + NS.selectNode['Categories'].clear(); + + for (var i in response) { + + var option = document.createElement('option'); + option.text = i; + option.value = i; + + select.$.add(option, count); + count++ + } + + var synKey = NS.selectNode['Categories'].getInputElement().getChildren().$[0].value; + NS.selectNode['Categories'].getInputElement().getChildren().$[0].selected = true; + NS.buildOptionSynonyms(synKey); + + showCurrentTabs(); + NS.div_overlay.setDisable(); + count = 0; + }, + finish: function(response) { + delete response.id; + + hideCurrentTabs(); + showCurrentFinishChecking(); + NS.div_overlay.setDisable(); + }, + settext: function(response) { + delete response.id; + + var command = NS.dialog.getParentEditor().getCommand( 'checkspell' ), + editor = NS.dialog.getParentEditor(); + + //set local storage for synchronization before scayt reinit + if (editor.scayt && editor.wsc.isSsrvSame) { + var wscUDN = editor.wsc.udn; + + if (!wscUDN) { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', ''); + } else { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN); + } + } + + + try { + editor.focus(); + } catch(e) {} + + editor.setData(response.text, function(){ + NS.dataTemp = ''; + editor.unlockSelection(); + editor.fire('saveSnapshot'); + NS.dialog.hide(); + }); + + }, + ReplaceText: function(response) { + + delete response.id; + NS.div_overlay.setEnable(); + + NS.dataTemp = response.text; + NS.selectingLang = response.currentLang; + + if (response.cmd = 'spell' && response.len !== '0' && response.len) { + NS.div_overlay.setDisable(); + } else { + window.setTimeout(function() { + try { + NS.div_overlay.setDisable(); + } catch(e) {} + }, 500); + } + + SetLocalizationButton(NS.LocalizationButton); + SetLocalizationLabel(NS.LocalizationLabel); + + }, + options_checkbox_send: function(response) { + delete response.id; + + var obj = { + 'osp': appTools.cookie.get('osp'), + 'udn': appTools.cookie.get('udn'), + 'cust_dic_ids': NS.cust_dic_ids + }; + + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + appTools.postMessage.send({ + 'message': obj, + 'target': NS.targetFromFrame[frameId], + 'id': 'options_outer__page' + }); + }, + + getOptions: function(response) { + var udn = response.DefOptions.udn; + NS.LocalizationComing = response.DefOptions.localizationButtonsAndText; + NS.show_grammar = response.show_grammar; + NS.langList = response.lang; + NS.bnr = response.bannerId; + NS.sessionid = response.sessionid; + if (response.bannerId) { + NS.setHeightBannerFrame(); + setBannerInPlace(response.banner); + } else { + NS.setHeightFrame(); + } + + if (udn == 'undefined') { + if (NS.userDictionaryName) { + udn = NS.userDictionaryName; + + var obj = { + 'osp': appTools.cookie.get('osp'), + 'udn': NS.userDictionaryName, + 'cust_dic_ids': NS.cust_dic_ids, + 'id': 'options_dic_send', + 'udnCmd': 'create' + }; + + appTools.postMessage.send({ + 'message': obj, + 'target': NS.targetFromFrame[frameId] + }); + + } else{ + udn = ''; + } + } + + appTools.cookie.set('osp', response.DefOptions.osp); + appTools.cookie.set('udn', udn); + appTools.cookie.set('cust_dic_ids', response.DefOptions.cust_dic_ids); + + appTools.postMessage.send({ + 'id': 'giveOptions' + }); + }, + + options_dic_send: function(response) { + + var obj = { + 'osp': appTools.cookie.get('osp'), + 'udn': appTools.cookie.get('udn'), + 'cust_dic_ids': NS.cust_dic_ids, + 'id': 'options_dic_send', + 'udnCmd': appTools.cookie.get('udnCmd') + }; + + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + appTools.postMessage.send({ + 'message': obj, + 'target': NS.targetFromFrame[frameId] + }); + }, + data: function(response) { + delete response.id; + }, + + giveOptions: function() { + + }, + + setOptionsConfirmF:function() { + OptionsConfirm(false); + }, + + setOptionsConfirmT:function() { + OptionsConfirm(true); + }, + + clickBusy: function() { + NS.div_overlay.setEnable(); + }, + + suggestAllCame: function() { + NS.div_overlay.setDisable(); + NS.div_overlay_no_check.setDisable(); + }, + + TextCorrect: function() { + langConstructor(NS.langList); + } + + }; + + var handlerIncomingData = function(event) { + event = event || window.event; + var response = window.JSON.parse(event.data); + + if(response && response.id) { + handlerId[response.id](response); + } + }; + + var handlerButtonOptions = function(event) { + event = event || window.event; + + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + appTools.postMessage.send({ + 'message': { + 'cmd': 'Options' + }, + 'target': NS.targetFromFrame[frameId], + 'id': 'cmd' + }); + + }; + + var sendData = function(frameTarget, cmd, sendText, reset_suggest) { + cmd = cmd || CKEDITOR.config.wsc_cmd; + reset_suggest = reset_suggest || false; + sendText = sendText || NS.dataTemp; + + appTools.postMessage.send({ + 'message': { + 'customerId': NS.wsc_customerId, + 'text': sendText, + 'txt_ctrl': NS.TextAreaNumber, + 'cmd': cmd, + 'cust_dic_ids': NS.cust_dic_ids, + 'udn': NS.userDictionaryName, + 'slang': NS.selectingLang, + 'reset_suggest': reset_suggest, + 'sessionid': NS.sessionid + }, + 'target': frameTarget, + 'id': 'data_outer__page' + }); + + NS.div_overlay.setEnable(); + }; + + var tabView = { + "superset": { + onShow: function() { + showThesaurusTab(); + showGrammTab(); + showSpellTab(); + }, + allowedTabCommands: { + "spell": true, + "grammar": true, + "thes": true + }, + defaultTabCommand: "spell" + }, + "usual": { + onShow: function() { + hideThesaurusTab(); + hideGrammTab(); + showSpellTab(); + }, + allowedTabCommands: { + "spell": true + }, + defaultTabCommand: "spell" + }, + "rtl": { + onShow: function() { + hideThesaurusTab(); + hideGrammTab(); + showSpellTab(); + }, + allowedTabCommands: { + "spell": true + }, + defaultTabCommand: "spell" + }, + "spellgrammar": { + onShow: function() { + hideThesaurusTab(); + showGrammTab(); + showSpellTab(); + }, + allowedTabCommands: { + "spell": true, + "grammar": true + }, + defaultTabCommand: "spell" + }, + "spellthes": { + onShow: function() { + showThesaurusTab(); + hideGrammTab(); + showSpellTab(); + }, + allowedTabCommands: { + "spell": true, + "thes": true + }, + defaultTabCommand: "spell" + } + }; + + var showFirstTab = function(scope) { + var cmdManger = function(cmdView) { + var obj = {}; + var _getCmd = function(cmd) { + for (var tabId in cmdView) { + obj[cmdView[tabId]] = tabId; + } + return obj[cmd]; + }; + return { + getCmdByTab: _getCmd + }; + }; + + var cmdM = new cmdManger(NS.cmd), + tabToOpen = cmdM.getCmdByTab(CKEDITOR.config.wsc_cmd); + + scope.selectPage(tabToOpen); + NS.sendData(scope); + }; + + var showThesaurusTab = function() { + NS.dialog.showPage('Thesaurus'); + }; + + var hideThesaurusTab = function() { + NS.dialog.hidePage('Thesaurus'); + }; + + var showGrammTab = function() { + NS.dialog.showPage('GrammTab'); + }; + + var hideGrammTab = function() { + NS.dialog.hidePage('GrammTab'); + }; + + var showSpellTab = function() { + NS.dialog.showPage('SpellTab'); + }; + + var hideSpellTab = function() { + NS.dialog.hidePage('SpellTab'); + }; + + var showCurrentTabs = function() { + var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'bottomGroup').getElement(); + + target.removeStyle('display'); + target.removeStyle('position'); + target.removeStyle('left'); + + target.show(); + }; + + var hideCurrentTabs = function() { + var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'bottomGroup').getElement(), + activeElement = document.activeElement, + focusableElements; + + target.setStyles({ + display: 'block', + position: 'absolute', + left: '-9999px' + }); + + setTimeout(function() { + target.removeStyle('display'); + target.removeStyle('position'); + target.removeStyle('left'); + + target.hide(); + + NS.dialog._.editor.focusManager.currentActive.focusNext(); + + focusableElements = appTools.misc.findFocusable(NS.dialog.parts.contents); + if(!appTools.misc.hasClass(activeElement, 'cke_dialog_tab') && !appTools.misc.hasClass(activeElement, 'cke_dialog_contents_body') && appTools.misc.isVisible(activeElement)) { + try { + activeElement.focus(); + } catch(e) {} + } else { + for(var i = 0, tmpCkEl; i < focusableElements.count(); i++) { + tmpCkEl = focusableElements.getItem(i); + if(appTools.misc.isVisible(tmpCkEl.$)) { + try { + tmpCkEl.$.focus(); + } catch(e) {} + + break; + } + } + } + }, 0); + }; + + var showCurrentFinishChecking = function() { + var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'BlockFinishChecking').getElement(); + + target.removeStyle('display'); + target.removeStyle('position'); + target.removeStyle('left'); + + target.show(); + }; + + var hideCurrentFinishChecking = function() { + var target = NS.dialog.getContentElement(NS.dialog._.currentTabId, 'BlockFinishChecking').getElement(), + activeElement = document.activeElement, + focusableElements; + + target.setStyles({ + display: 'block', + position: 'absolute', + left: '-9999px' + }); + + setTimeout(function() { + target.removeStyle('display'); + target.removeStyle('position'); + target.removeStyle('left'); + + target.hide(); + + NS.dialog._.editor.focusManager.currentActive.focusNext(); + + focusableElements = appTools.misc.findFocusable(NS.dialog.parts.contents); + if(!appTools.misc.hasClass(activeElement, 'cke_dialog_tab') && !appTools.misc.hasClass(activeElement, 'cke_dialog_contents_body') && appTools.misc.isVisible(activeElement)) { + try { + activeElement.focus(); + } catch(e) {} + } else { + for(var i = 0, tmpCkEl; i < focusableElements.count(); i++) { + tmpCkEl = focusableElements.getItem(i); + if(appTools.misc.isVisible(tmpCkEl.$)) { + try { + tmpCkEl.$.focus(); + } catch(e) {} + + break; + } + } + } + }, 0); + }; + + + +function __constructLangSelectbox(languageGroup) { + if( !languageGroup ) { throw "Languages-by-groups list are required for construct selectbox"; } + + var that = this, + o_arr = [], + priorLang ="en_US", + priorLangTitle = "", + currLang = NS.selectingLang; + + for ( var group in languageGroup){ + for ( var langCode in languageGroup[group]){ + var langName = languageGroup[group][langCode]; + if ( langName == priorLang ) { + priorLangTitle = langName; + } else { + o_arr.push( langName ); + } + } + } + + o_arr.sort(); + if(priorLangTitle) { + o_arr.unshift( priorLangTitle ); + } + + var searchGroup = function ( code ){ + for ( var group in languageGroup){ + for ( var langCode in languageGroup[group]){ + if ( langCode.toUpperCase() === code.toUpperCase() ) { + return group; + } + } + } + return ""; + }; + + var _setLangList = function() { + var langList = {}, + langArray = []; + for (var group in languageGroup) { + for ( var langCode in languageGroup[group]){ + langList[languageGroup[group][langCode]] = langCode; + } + } + return langList; + }; + + var _return = { + getCurrentLangGroup: function(code) { + return searchGroup(code); + }, + setLangList: _setLangList() + }; + + return _return; +} + +CKEDITOR.dialog.add('checkspell', function(editor) { + var handlerButtons = function(event) { + event = event || window.event; + + // because in chrome and safary document.activeElement returns tag. We need to signal that clicked element is active + this.getElement().focus(); + + NS.div_overlay.setEnable(); + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId, + new_word = NS.textNode[currentTabId].getValue(), + cmd = this.getElement().getAttribute("title-cmd"); + + appTools.postMessage.send({ + 'message': { + 'cmd': cmd, + 'tabId': currentTabId, + 'new_word': new_word + }, + 'target': NS.targetFromFrame[frameId], + 'id': 'cmd_outer__page' + }); + + if (cmd == 'ChangeTo' || cmd == 'ChangeAll') { + editor.fire('saveSnapshot'); + } + + if (cmd == 'FinishChecking') { + editor.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame()); + } + + }, + constraints = { + minWidth: 560, + minHeight: 444 + }; + + function initView(dialog) { + var newViewSettings = { + left: parseInt(editor.config.wsc_left, 10), + top: parseInt(editor.config.wsc_top, 10), + width: parseInt(editor.config.wsc_width, 10), + height: parseInt(editor.config.wsc_height, 10) + }, + viewSize = CKEDITOR.document.getWindow().getViewPaneSize(), + currentPosition = dialog.getPosition(), + currentSize = dialog.getSize(), + savePosition = 0; + + if(!dialog._.resized) { + var wrapperHeight = currentSize.height - dialog.parts.contents.getSize('height', !(CKEDITOR.env.gecko || CKEDITOR.env.opera || CKEDITOR.env.ie && CKEDITOR.env.quirks)), + wrapperWidth = currentSize.width - dialog.parts.contents.getSize('width', 1); + + if(newViewSettings.width < constraints.minWidth || isNaN(newViewSettings.width)) { + newViewSettings.width = constraints.minWidth; + } + if(newViewSettings.width > viewSize.width - wrapperWidth) { + newViewSettings.width = viewSize.width - wrapperWidth; + } + + if(newViewSettings.height < constraints.minHeight || isNaN(newViewSettings.height)) { + newViewSettings.height = constraints.minHeight; + } + if(newViewSettings.height > viewSize.height - wrapperHeight) { + newViewSettings.height = viewSize.height - wrapperHeight; + } + + currentSize.width = newViewSettings.width + wrapperWidth; + currentSize.height = newViewSettings.height + wrapperHeight; + + dialog._.fromResizeEvent = false; + dialog.resize(newViewSettings.width, newViewSettings.height); + setTimeout(function() { + dialog._.fromResizeEvent = false; + CKEDITOR.dialog.fire('resize', { + dialog: dialog, + width: newViewSettings.width, + height: newViewSettings.height + }, editor); + }, 300); + } + + if(!dialog._.moved) { + savePosition = isNaN(newViewSettings.left) && isNaN(newViewSettings.top) ? 0 : 1; + + if(isNaN(newViewSettings.left)) { + newViewSettings.left = (viewSize.width - currentSize.width) / 2; + } + if(newViewSettings.left < 0) { + newViewSettings.left = 0; + } + if(newViewSettings.left > viewSize.width - currentSize.width) { + newViewSettings.left = viewSize.width - currentSize.width; + } + + if(isNaN(newViewSettings.top)) { + newViewSettings.top = (viewSize.height - currentSize.height) / 2; + } + if(newViewSettings.top < 0) { + newViewSettings.top = 0; + } + if(newViewSettings.top > viewSize.height - currentSize.height) { + newViewSettings.top = viewSize.height - currentSize.height; + } + + dialog.move(newViewSettings.left, newViewSettings.top, savePosition); + } + } + + function createWscObjectForUdAndUdnSyncrhonization() { + editor.wsc = {}; + + //DataStorage object for cookies and localStorage manipulation + (function( object ) { + 'use strict'; + + var DataTypeManager = { + separator: '<$>', + getDataType: function(value) { + var type; + + if(typeof value === 'undefined') { + type = 'undefined'; + } else if(value === null) { + type = 'null'; + } else { + type = Object.prototype.toString.call(value).slice(8, -1); + } + return type; + }, + convertDataToString: function(value) { + var str, + type = this.getDataType(value).toLowerCase(); + + str = type + this.separator + value; + return str; + }, + // get value type and convert value due to type, since all stored values are String + restoreDataFromString: function(str) { + var value = str, + type, + separatorStartIndex; + + // @TODO: remove this line much later. Support of old format for options + str = this.backCompatibility(str); + + if(typeof str === 'string') { + separatorStartIndex = str.indexOf(this.separator); + type = str.substring(0, separatorStartIndex); + value = str.substring(separatorStartIndex + this.separator.length); + + switch(type) { + case 'boolean': + value = value === 'true'; + break; + case 'number': + value = parseFloat(value); + break; + // we assume that we will store string values only, due to performance + case 'array': + value = value === '' ? [] : value.split(','); + break; + case 'null': + value = null; + break; + case 'undefined': + value = undefined; + break; + } + } + return value; + }, + // old data type support + // here we trying to convert data from old format into new + // @TODO: remove this function much later + backCompatibility: function(str) { + var convertedStr = str, + value, + separatorStartIndex; + + if(typeof str === 'string') { + separatorStartIndex = str.indexOf(this.separator); + // is it old format? + if(separatorStartIndex < 0) { + // try to get number from string + value = parseFloat(str); + // is it not a number? + if(isNaN(value)) { + // yes, this is not a number. Lets check is this is an array "[comma,separated,values]" + if((str[0] === '[') && (str[str.length - 1] === ']')) { + // this is an array. Lets remove brackets symbols and extract the words + str = str.replace('[', ''); + str = str.replace(']', ''); + if(str === '') { + value = []; + } else { + value = str.split(','); + } + // value = str === '[]' ? [] : str.split(','); + } else if(str === 'true' || str === 'false') { + // this is boolean value + value = str === 'true'; + } else { + // this is string + value = str; + } + } + + convertedStr = this.convertDataToString(value); + } + } + + return convertedStr; + } + }; + + var LocalStorage = { + + get: function( key ) { + var value = DataTypeManager.restoreDataFromString( window.localStorage.getItem(key) ); + return value; + }, + + set: function( key, value ) { + var _value = DataTypeManager.convertDataToString( value ); + window.localStorage.setItem( key, _value ); + }, + + del: function( key ) { + window.localStorage.removeItem( key ); + }, + + clear: function() { + window.localStorage.clear(); + } + }; + + var CookiesStorage = { + + expiration: (function() { + return 60 * 60 * 24 * 366; + }()), + + get: function(key) { + var value = DataTypeManager.restoreDataFromString(this.getCookie(key)); + return value; + }, + + set: function(key, value) { + var _value = DataTypeManager.convertDataToString(value); + this.setCookie(key, _value, {expires: this.expiration}); + }, + + del: function(key) { + this.deleteCookie(key); + }, + + getCookie: function(name) { + var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)")); + return matches ? decodeURIComponent(matches[1]) : undefined; + }, + + setCookie: function(name, value, props) { + props = props || {}; + var exp = props.expires; + + if (typeof exp === "number" && exp) { + var d = new Date(); + + d.setTime(d.getTime() + exp * 1000); + exp = props.expires = d; + } + + if(exp && exp.toUTCString) { + props.expires = exp.toUTCString(); + } + + value = encodeURIComponent(value); + var updatedCookie = name + "=" + value; + + for(var propName in props) { + var propValue = props[propName]; + + updatedCookie += "; " + propName; + + if(propValue !== true) { + updatedCookie += "=" + propValue; + } + } + + document.cookie = updatedCookie; + }, + + deleteCookie: function(name) { + this.setCookie(name, null, {expires: -1}); + }, + + // delete all cookies + clear: function() { + var cookies = document.cookie.split(";"); + + for (var i = 0; i < cookies.length; i++) { + var cookie = cookies[i]; + var eqPos = cookie.indexOf("="); + var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; + + this.deleteCookie(name); + } + } + }; + + var strategy = window.localStorage ? LocalStorage : CookiesStorage; + + var DataStorage = { + // Get data within storage for key + getData: function( key ) { + return strategy.get( key ); + }, + + // Set data within storage + setData: function( key, value ) { + strategy.set( key, value ); + }, + + // Delete data within storage for key + deleteData: function( key ) { + strategy.del( key ); + }, + + // Clear storage + clear: function() { + strategy.clear(); + } + }; + + // Static Module of Storage Data in the localStorage. + object.DataStorage = DataStorage; + }( editor.wsc )); + + editor.wsc.operationWithUDN = function(command, UDName) { + var obj = { + 'udn': UDName, + 'id': 'operationWithUDN', + 'udnCmd': command + }; + var currentTabId = NS.dialog._.currentTabId, + frameId = NS.iframeNumber + '_' + currentTabId; + + appTools.postMessage.send({ + 'message': obj, + 'target': NS.targetFromFrame[frameId] + }); + }; + editor.wsc.getLocalStorageUDN = function() { + var udn = editor.wsc.DataStorage.getData('scayt_user_dictionary_name'); + + if (!udn) { + return; + } + + return udn; + }; + editor.wsc.getLocalStorageUD = function() { + var ud = editor.wsc.DataStorage.getData('scayt_user_dictionary'); + + if (!ud) { + return; + } + + return ud; + }; + editor.wsc.addWords = function(words, callback) { + var url = editor.config.wsc.DefaultParams.serviceHost + editor.config.wsc.DefaultParams.ssrvHost + + '?cmd=dictionary&format=json&' + + 'customerid=1%3AncttD3-fIoSf2-huzwE4-Y5muI2-mD0Tt-kG9Wz-UEDFC-tYu243-1Uq474-d9Z2l3&' + + 'action=addword&word='+ words + '&callback=toString&synchronization=true', + script = document.createElement('script'); + + script['type'] = 'text/javascript'; + script['src'] = url; + document.getElementsByTagName("head")[0].appendChild(script); + + //chrome, firefox, safari + script.onload = callback; + + //IE + script.onreadystatechange = function() { + if (this.readyState === 'loaded') { + callback(); + } + }; + }; + editor.wsc.cgiOrigin = function() { + var wscServiceHostString = editor.config.wsc.DefaultParams.serviceHost, + wscServiceHostArray = wscServiceHostString.split('/'), + cgiOrigin = wscServiceHostArray[0] + '//' + wscServiceHostArray[2]; + + return cgiOrigin; + }; + editor.wsc.isSsrvSame = false; + } + + return { + title: editor.config.wsc_dialogTitle || editor.lang.wsc.title, + minWidth: constraints.minWidth, + minHeight: constraints.minHeight, + buttons: [CKEDITOR.dialog.cancelButton], + onLoad: function() { + NS.dialog = this; + hideThesaurusTab(); + hideGrammTab(); + showSpellTab(); + + //creating wsc object for UD synchronization between wsc and scayt + if (editor.plugins.scayt) { + createWscObjectForUdAndUdnSyncrhonization(); + } + }, + onShow: function() { + NS.dialog = this; + + editor.lockSelection(editor.getSelection()); + + NS.TextAreaNumber = 'cke_textarea_' + editor.name; + appTools.postMessage.init(handlerIncomingData); + NS.dataTemp = editor.getData(); + //NS.div_overlay.setDisable(); + NS.OverlayPlace = NS.dialog.parts.tabs.getParent().$; + if(CKEDITOR && CKEDITOR.config){ + NS.wsc_customerId = editor.config.wsc_customerId; + NS.cust_dic_ids = editor.config.wsc_customDictionaryIds; + NS.userDictionaryName = editor.config.wsc_userDictionaryName; + NS.defaultLanguage = CKEDITOR.config.defaultLanguage; + var protocol = document.location.protocol == "file:" ? "http:" : document.location.protocol; + var wscCoreUrl = editor.config.wsc_customLoaderScript || ( protocol + '//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid=' + NS.wsc_customerId + '&cmd=script&doc=wsc&schema=22'); + } else { + NS.dialog.hide(); + return; + } + + initView(this); + + CKEDITOR.scriptLoader.load(wscCoreUrl, function(success) { + if(CKEDITOR.config && CKEDITOR.config.wsc && CKEDITOR.config.wsc.DefaultParams){ + NS.serverLocationHash = CKEDITOR.config.wsc.DefaultParams.serviceHost; + NS.logotype = CKEDITOR.config.wsc.DefaultParams.logoPath; + NS.loadIcon = CKEDITOR.config.wsc.DefaultParams.iconPath; + NS.loadIconEmptyEditor = CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor; + NS.LangComparer = new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare(); + }else{ + NS.serverLocationHash = DefaultParams.serviceHost; + NS.logotype = DefaultParams.logoPath; + NS.loadIcon = DefaultParams.iconPath; + NS.loadIconEmptyEditor = DefaultParams.iconPathEmptyEditor; + NS.LangComparer = new _SP_FCK_LangCompare(); + } + + NS.pluginPath = CKEDITOR.getUrl(editor.plugins.wsc.path); + NS.iframeNumber = NS.TextAreaNumber; + NS.templatePath = NS.pluginPath + 'dialogs/tmp.html'; + NS.LangComparer.setDefaulLangCode( NS.defaultLanguage ); + NS.currentLang = editor.config.wsc_lang || NS.LangComparer.getSPLangCode( editor.langCode ) || 'en_US'; + NS.selectingLang = NS.currentLang; + NS.div_overlay = new overlayBlock({ + opacity: "1", + background: "#fff url(" + NS.loadIcon + ") no-repeat 50% 50%", + target: NS.OverlayPlace + + }); + + var number_ck = NS.dialog.parts.tabs.getId(), + dialogPartsTab = CKEDITOR.document.getById(number_ck); + + dialogPartsTab.setStyle('width', '97%'); + if (!dialogPartsTab.getElementsByTag('DIV').count()){ + dialogPartsTab.append(NS.buildSelectLang(NS.dialog.getParentEditor().name)); + } + + NS.div_overlay_no_check = new overlayBlock({ + opacity: "1", + id: 'no_check_over', + background: "#fff url(" + NS.loadIconEmptyEditor + ") no-repeat 50% 50%", + target: NS.OverlayPlace + }); + + if (success) { + showFirstTab(NS.dialog); + NS.dialog.setupContent(NS.dialog); + } + + if (editor.plugins.scayt) { + //is ssrv.cgi path for WSC and scayt same + editor.wsc.isSsrvSame = (function() { + var wscSsrvWholePath, + wscServiceHost = CKEDITOR.config.wsc.DefaultParams.serviceHost.replace('lf/22/js/../../../', '').split('//')[1], + wscSsrvHost = CKEDITOR.config.wsc.DefaultParams.ssrvHost, + scaytSsrvWholePath, + scaytSsrvProtocol, + scaytSsrvHost, + scaytSsrvPath, + + scaytSrcUrl = editor.config.scayt_srcUrl, + scaytSsrvSrcUrlSsrvProtocol, + scaytSsrvSrcUrlSsrvHost, + scaytSsrvSrcUrlSsrvPath, + + scaytBasePath, + scaytBasePathSsrvProtocol, + scaytBasePathSsrvHost, + scaytBasePathSsrvPath; + + if (window.SCAYT && window.SCAYT.CKSCAYT) { + scaytBasePath = SCAYT.CKSCAYT.prototype.basePath; + scaytBasePathSsrvProtocol = scaytBasePath.split('//')[0]; + scaytBasePathSsrvHost = scaytBasePath.split('//')[1].split('/')[0]; + scaytBasePathSsrvPath = scaytBasePath.split(scaytBasePathSsrvHost + '/')[1].replace('/lf/scayt3/ckscayt/', '') + '/script/ssrv.cgi'; + } + + if (scaytSrcUrl && !scaytBasePath && !editor.config.scayt_servicePath) { + scaytSsrvSrcUrlSsrvProtocol = scaytSrcUrl.split('//')[0]; + scaytSsrvSrcUrlSsrvHost = scaytSrcUrl.split('//')[1].split('/')[0]; + scaytSsrvSrcUrlSsrvPath = scaytSrcUrl.split(scaytSsrvSrcUrlSsrvHost + '/')[1].replace('/lf/scayt3/ckscayt/ckscayt.js', '') + '/script/ssrv.cgi'; + } + + scaytSsrvProtocol = editor.config.scayt_serviceProtocol || scaytBasePathSsrvProtocol || scaytSsrvSrcUrlSsrvProtocol; + scaytSsrvHost = editor.config.scayt_serviceHost || scaytBasePathSsrvHost || scaytSsrvSrcUrlSsrvHost; + scaytSsrvPath = editor.config.scayt_servicePath || scaytBasePathSsrvPath || scaytSsrvSrcUrlSsrvPath; + + wscSsrvWholePath = '//' + wscServiceHost + wscSsrvHost; + scaytSsrvWholePath = '//' + scaytSsrvHost + '/' + scaytSsrvPath; + + return wscSsrvWholePath === scaytSsrvWholePath; + })(); + } + + //wsc on scayt UserDictionary and UserDictionaryName synchronization + if (window.SCAYT && editor.wsc && editor.wsc.isSsrvSame) { + var cgiOrigin = editor.wsc.cgiOrigin(); + editor.wsc.syncIsDone = false; + + var getUdOrUdn = function (e) { + if (e.origin === cgiOrigin) { + var data = JSON.parse(e.data); + + if (data.ud && data.ud !== 'undefined') { + editor.wsc.ud = data.ud; + } else if (data.ud === 'undefined') { + editor.wsc.ud = undefined; + } + + if (data.udn && data.udn !== 'undefined') { + editor.wsc.udn = data.udn; + } else if (data.udn === 'undefined') { + editor.wsc.udn = undefined; + } + + if (!editor.wsc.syncIsDone) { + udSynchronization(editor.wsc.ud); + editor.wsc.syncIsDone = true; + } + } + }; + + var udSynchronization = function(cookieUd) { + var localStorageUdArray = editor.wsc.getLocalStorageUD(), + newUd; + + if (localStorageUdArray instanceof Array) { + newUd = localStorageUdArray.toString(); + } + + if (newUd !== undefined && newUd !== '') { + setTimeout(function() { + editor.wsc.addWords(newUd, function() { + showFirstTab(NS.dialog); + NS.dialog.setupContent(NS.dialog); + }); + }, 400); + } + }; + + if (window.addEventListener){ + addEventListener("message", getUdOrUdn, false); + } else { + window.attachEvent("onmessage", getUdOrUdn); + } + + //wsc on scayt UserDictionaryName synchronization + setTimeout( + function() { + var udn = editor.wsc.getLocalStorageUDN(); + + if (udn !== undefined) { + editor.wsc.operationWithUDN('restore', udn); + } + + }, + 500); //need to wait spell.js file to load + + } + }); + + }, + onHide: function() { + var scaytPlugin = CKEDITOR.plugins.scayt, + scaytInstance = editor.scayt; + + editor.unlockSelection(); + + if(scaytPlugin && scaytInstance && scaytPlugin.state[editor.name]) { + scaytInstance.setMarkupPaused(false); + } + + NS.dataTemp = ''; + NS.sessionid = ''; + appTools.postMessage.unbindHandler(handlerIncomingData); + + //scayt on wsc UserDictionary and UserDictionaryName synchronization + if (editor.plugins.scayt && editor.wsc && editor.wsc.isSsrvSame) { + var wscUDN = editor.wsc.udn, + wscUD = editor.wsc.ud, + wscUDarray, + i; + + if (editor.scayt) { // if SCAYT active + if (!wscUDN) { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', ''); + editor.scayt.removeUserDictionary(); + } else { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN); + editor.scayt.restoreUserDictionary(wscUDN); + } + + if (wscUD) { + setTimeout(function() { + wscUDarray = wscUD.split(','); + for (i = 0; i < wscUDarray.length; i += 1) { + editor.scayt.addWordToUserDictionary(wscUDarray[i]); + } + }, 200); //wait for 'removeUserDictionary' command response + } + + if (!wscUD) { + editor.wsc.DataStorage.setData('scayt_user_dictionary', []); + } + + } else { //if SCAYT not active + + if (!wscUDN) { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', ''); + } else { + editor.wsc.DataStorage.setData('scayt_user_dictionary_name', wscUDN); + } + + if (wscUD) { + wscUDarray = wscUD.split(','); + editor.wsc.DataStorage.setData('scayt_user_dictionary', wscUDarray); + } + } + } + }, + contents: [ + { + id: 'SpellTab', + label: 'SpellChecker', + accessKey: 'S', + elements: [ + { + type: 'html', + id: 'banner', + label: 'banner', + style: '', //TODO + html: '
' + }, + { + type: 'html', + id: 'Content', + label: 'spellContent', + html: '', + setup: function(dialog) { + var tabId = NS.iframeNumber + '_' + dialog._.currentTabId; + var iframe = document.getElementById(tabId); + NS.targetFromFrame[tabId] = iframe.contentWindow; + } + }, + { + type: 'hbox', + id: 'bottomGroup', + style: 'width:560px; margin: 0 auto;', + widths: ['50%', '50%'], + children: [ + { + type: 'hbox', + id: 'leftCol', + align: 'left', + width: '50%', + children: [ + { + type: 'vbox', + id: 'rightCol1', + widths: ['50%', '50%'], + children: [ + { + type: 'text', + id: 'ChangeTo_label', + label: NS.LocalizationLabel['ChangeTo_label'].text + ':', + labelLayout: 'horizontal', + labelStyle: 'font: 12px/25px arial, sans-serif;', + width: '140px', + 'default': '', + onShow: function() { + NS.textNode['SpellTab'] = this; + NS.LocalizationLabel['ChangeTo_label'].instance = this; + }, + onHide: function() { + this.reset(); + } + }, + { + type: 'hbox', + id: 'rightCol', + align: 'right', + width: '30%', + children: [ + { + type: 'vbox', + id: 'rightCol_col__left', + children: [ + { + type: 'text', + id: 'labelSuggestions', + label: NS.LocalizationLabel['Suggestions'].text + ':', + onShow: function() { + NS.LocalizationLabel['Suggestions'].instance = this; + this.getInputElement().setStyles({ + display: 'none' + }); + } + }, + { + type: 'html', + id: 'logo', + html: 'WebSpellChecker.net', + setup: function(dialog) { + this.getElement().$.src = NS.logotype; + this.getElement().getParent().setStyles({ + "text-align": "left" + }); + } + } + ] + }, + { + type: 'select', + id: 'list_of_suggestions', + labelStyle: 'font: 12px/25px arial, sans-serif;', + size: '6', + inputStyle: 'width: 140px; height: auto;', + items: [['loading...']], + onShow: function() { + selectNode = this; + }, + onChange: function() { + NS.textNode['SpellTab'].setValue(this.getValue()); + } + } + ] + } + ] + } + ] + }, + { + type: 'hbox', + id: 'rightCol', + align: 'right', + width: '50%', + children: [ + { + type: 'vbox', + id: 'rightCol_col__left', + widths: ['50%', '50%', '50%', '50%'], + children: [ + { + type: 'button', + id: 'ChangeTo_button', + label: NS.LocalizationButton['ChangeTo_button'].text, + title: 'Change to', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'ChangeTo'); + NS.LocalizationButton['ChangeTo_button'].instance = this; + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'ChangeAll', + label: NS.LocalizationButton['ChangeAll'].text, + title: 'Change All', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + NS.LocalizationButton['ChangeAll'].instance = this; + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'AddWord', + label: NS.LocalizationButton['AddWord'].text, + title: 'Add word', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + NS.LocalizationButton['AddWord'].instance = this; + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'FinishChecking_button', + label: NS.LocalizationButton['FinishChecking_button'].text, + title: 'Finish Checking', + style: 'width: 100%;margin-top: 9px;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + NS.LocalizationButton['FinishChecking_button'].instance = this; + }, + onClick: handlerButtons + } + ] + }, + { + type: 'vbox', + id: 'rightCol_col__right', + widths: ['50%', '50%', '50%'], + children: [ + { + type: 'button', + id: 'IgnoreWord', + label: NS.LocalizationButton['IgnoreWord'].text, + title: 'Ignore word', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + NS.LocalizationButton['IgnoreWord'].instance = this; + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'IgnoreAllWords', + label: NS.LocalizationButton['IgnoreAllWords'].text, + title: 'Ignore all words', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + NS.LocalizationButton['IgnoreAllWords'].instance = this; + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'Options', + label: NS.LocalizationButton['Options'].text, + title: 'Option', + style: 'width: 100%;', + onLoad: function() { + NS.LocalizationButton['Options'].instance = this; + if (document.location.protocol == "file:") { + this.disable(); + } + }, + onClick: function() { + // because in chrome and safary document.activeElement returns tag. We need to signal that clicked element is active + this.getElement().focus(); + + if (document.location.protocol == "file:") { + alert('WSC: Options functionality is disabled when runing from file system'); + } else { + activeElement = document.activeElement; + editor.openDialog('options'); + } + } + } + ] + } + ] + } + ] + }, + { + type: 'hbox', + id: 'BlockFinishChecking', + style: 'width:560px; margin: 0 auto;', + widths: ['70%', '30%'], + onShow: function() { + this.getElement().setStyles({ + display: 'block', + position: 'absolute', + left: '-9999px' + }); + }, + onHide: showCurrentTabs, + children: [ + { + type: 'hbox', + id: 'leftCol', + align: 'left', + width: '70%', + children: [ + { + type: 'vbox', + id: 'rightCol1', + setup: function() { + this.getChild()[0].getElement().$.src = NS.logotype; + this.getChild()[0].getElement().getParent().setStyles({ + "text-align": "center" + }); + }, + children: [ + { + type: 'html', + id: 'logo', + html: 'WebSpellChecker.net' + } + ] + } + ] + }, + { + type: 'hbox', + id: 'rightCol', + align: 'right', + width: '30%', + children: [ + { + type: 'vbox', + id: 'rightCol_col__left', + children: [ + { + type: 'button', + id: 'Option_button', + label: NS.LocalizationButton['Options'].text, + title: 'Option', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + if (document.location.protocol == "file:") { + this.disable(); + } + }, + onClick: function() { + // because in chrome and safary document.activeElement returns tag. We need to signal that clicked element is active + this.getElement().focus(); + + if (document.location.protocol == "file:") { + alert('WSC: Options functionality is disabled when runing from file system'); + } else { + activeElement = document.activeElement; + editor.openDialog('options'); + } + } + }, + { + type: 'button', + id: 'FinishChecking_button_block', + label: NS.LocalizationButton['FinishChecking_button_block'].text, + title: 'Finish Checking', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + }, + onClick: handlerButtons + } + ] + } + ] + } + ] + } + ] + }, + { + id: 'GrammTab', + label: 'Grammar', + accessKey: 'G', + elements: [ + { + type: 'html', + id: 'banner', + label: 'banner', + style: '', //TODO + html: '
' + }, + { + type: 'html', + id: 'Content', + label: 'GrammarContent', + html: '', + setup: function() { + var tabId = NS.iframeNumber + '_' + NS.dialog._.currentTabId; + var iframe = document.getElementById(tabId); + NS.targetFromFrame[tabId] = iframe.contentWindow; + } + }, + { + type: 'vbox', + id: 'bottomGroup', + style: 'width:560px; margin: 0 auto;', + children: [ + { + type: 'hbox', + id: 'leftCol', + widths: ['66%', '34%'], + children: [ + { + type: 'vbox', + children: [ + { + type: 'text', + id: 'text', + label: "Change to:", + labelLayout: 'horizontal', + labelStyle: 'font: 12px/25px arial, sans-serif;', + inputStyle: 'float: right; width: 200px;', + 'default': '', + onShow: function() { + NS.textNode['GrammTab'] = this; + }, + onHide: function() { + this.reset(); + } + }, + { + type: 'html', + id: 'html_text', + html: "
", + onShow: function(e) { + NS.textNodeInfo['GrammTab'] = this; + } + }, + { + type: 'html', + id: 'radio', + html: "", + onShow: function() { + NS.grammerSuggest = this; + } + } + ] + }, + { + type: 'vbox', + children: [ + { + type: 'button', + id: 'ChangeTo_button', + label: 'Change to', + title: 'Change to', + style: 'width: 133px; float: right;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'ChangeTo'); + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'IgnoreWord', + label: 'Ignore word', + title: 'Ignore word', + style: 'width: 133px; float: right;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'IgnoreAllWords', + label: 'Ignore Problem', + title: 'Ignore Problem', + style: 'width: 133px; float: right;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onClick: handlerButtons + }, + { + type: 'button', + id: 'FinishChecking_button', + label: NS.LocalizationButton['FinishChecking_button'].text, + title: 'Finish Checking', + style: 'width: 133px; float: right; margin-top: 9px;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + }, + onClick: handlerButtons + } + ] + } + ] + } + ] + }, + { + type: 'hbox', + id: 'BlockFinishChecking', + style: 'width:560px; margin: 0 auto;', + widths: ['70%', '30%'], + onShow: function() { + this.getElement().setStyles({ + display: 'block', + position: 'absolute', + left: '-9999px' + }); + }, + onHide: showCurrentTabs, + children: [ + { + type: 'hbox', + id: 'leftCol', + align: 'left', + width: '70%', + children: [ + { + type: 'vbox', + id: 'rightCol1', + children: [ + { + type: 'html', + id: 'logo', + html: 'WebSpellChecker.net', + setup: function() { + this.getElement().$.src = NS.logotype; + this.getElement().getParent().setStyles({ + "text-align": "center" + }); + } + } + ] + } + ] + }, + { + type: 'hbox', + id: 'rightCol', + align: 'right', + width: '30%', + children: [ + { + type: 'vbox', + id: 'rightCol_col__left', + children: [ + { + type: 'button', + id: 'FinishChecking_button_block', + label: NS.LocalizationButton['FinishChecking_button_block'].text, + title: 'Finish Checking', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + }, + onClick: handlerButtons + } + ] + } + ] + } + ] + } + ] + }, + { + id: 'Thesaurus', + label: 'Thesaurus', + accessKey: 'T', + elements: [ + { + type: 'html', + id: 'banner', + label: 'banner', + style: '', //TODO + html: '
' + }, + { + type: 'html', + id: 'Content', + label: 'spellContent', + html: '', + setup: function() { + var tabId = NS.iframeNumber + '_' + NS.dialog._.currentTabId; + var iframe = document.getElementById(tabId); + NS.targetFromFrame[tabId] = iframe.contentWindow; + } + }, + { + type: 'vbox', + id: 'bottomGroup', + style: 'width:560px; margin: -10px auto; overflow: hidden;', + children: [ + { + type: 'hbox', + widths: ['75%', '25%'], + children: [ + { + type: 'vbox', + children: [ + { + type: 'hbox', + widths: ['65%', '35%'], + children: [ + { + type: 'text', + id: 'ChangeTo_label', + label: NS.LocalizationLabel['ChangeTo_label'].text + ':', + labelLayout: 'horizontal', + inputStyle: 'width: 160px;', + labelStyle: 'font: 12px/25px arial, sans-serif;', + 'default': '', + onShow: function(e) { + NS.textNode['Thesaurus'] = this; + NS.LocalizationLabel['ChangeTo_label'].instance = this; + }, + onHide: function() { + this.reset(); + } + }, + { + type: 'button', + id: 'ChangeTo_button', + label: NS.LocalizationButton['ChangeTo_button'].text, + title: 'Change to', + style: 'width: 121px; margin-top: 1px;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'ChangeTo'); + NS.LocalizationButton['ChangeTo_button'].instance = this; + }, + onClick: handlerButtons + } + ] + }, + { + type: 'hbox', + children: [ + { + type: 'select', + id: 'Categories', + label: NS.LocalizationLabel['Categories'].text + ':', + labelStyle: 'font: 12px/25px arial, sans-serif;', + size: '5', + inputStyle: 'width: 180px; height: auto;', + items: [], + onShow: function() { + NS.selectNode['Categories'] = this; + NS.LocalizationLabel['Categories'].instance = this; + }, + onChange: function() { + NS.buildOptionSynonyms(this.getValue()); + } + }, + { + type: 'select', + id: 'Synonyms', + label: NS.LocalizationLabel['Synonyms'].text + ':', + labelStyle: 'font: 12px/25px arial, sans-serif;', + size: '5', + inputStyle: 'width: 180px; height: auto;', + items: [], + onShow: function() { + NS.selectNode['Synonyms'] = this; + NS.textNode['Thesaurus'].setValue(this.getValue()); + NS.LocalizationLabel['Synonyms'].instance = this; + }, + onChange: function(e) { + NS.textNode['Thesaurus'].setValue(this.getValue()); + } + } + ] + } + ] + }, + { + type: 'vbox', + width: '120px', + style: "margin-top:46px;", + children: [ + { + type: 'html', + id: 'logotype', + label: 'WebSpellChecker.net', + html: 'WebSpellChecker.net', + setup: function() { + this.getElement().$.src = NS.logotype; + this.getElement().getParent().setStyles({ + "text-align": "center" + }); + } + }, + { + type: 'button', + id: 'FinishChecking_button', + label: NS.LocalizationButton['FinishChecking_button'].text, + title: 'Finish Checking', + style: 'width: 100%; float: right; margin-top: 9px;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + }, + onClick: handlerButtons + } + ] + } + ] + } + ] + }, + { + type: 'hbox', + id: 'BlockFinishChecking', + style: 'width:560px; margin: 0 auto;', + widths: ['70%', '30%'], + onShow: function() { + this.getElement().setStyles({ + display: 'block', + position: 'absolute', + left: '-9999px' + }); + }, + children: [ + { + type: 'hbox', + id: 'leftCol', + align: 'left', + width: '70%', + children: [ + { + type: 'vbox', + id: 'rightCol1', + children: [ + { + type: 'html', + id: 'logo', + html: 'WebSpellChecker.net', + setup: function() { + this.getElement().$.src = NS.logotype; + this.getElement().getParent().setStyles({ + "text-align": "center" + }); + } + } + ] + } + ] + }, + { + type: 'hbox', + id: 'rightCol', + align: 'right', + width: '30%', + children: [ + { + type: 'vbox', + id: 'rightCol_col__left', + children: [ + { + type: 'button', + id: 'FinishChecking_button_block', + label: NS.LocalizationButton['FinishChecking_button_block'].text, + title: 'Finish Checking', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", 'FinishChecking'); + }, + onClick: handlerButtons + } + ] + } + ] + } + ] + } + ] + } + ] + }; +}); + +var activeElement = null; + +// Options dialog +CKEDITOR.dialog.add('options', function(editor) { + var dialog = null; + var linkOnCheckbox = {}; + var checkboxState = {}; + var ospString = null; + var OptionsTextError = null; + var cmd = null; + + var set_osp = []; + var dictionaryState = { + 'udn': appTools.cookie.get('udn'), + 'osp': appTools.cookie.get('osp') + }; + + var setHandlerOptions = function() { + var osp = appTools.cookie.get('osp'), + strToArr = osp.split(""); + + checkboxState['IgnoreAllCapsWords'] = strToArr[0]; + checkboxState['IgnoreWordsNumbers'] = strToArr[1]; + checkboxState['IgnoreMixedCaseWords'] = strToArr[2]; + checkboxState['IgnoreDomainNames'] = strToArr[3]; + }; + + var sendDicOptions = function(event) { + event = event || window.event; + cmd = this.getElement().getAttribute("title-cmd"); + var osp = []; + + osp[0] = checkboxState['IgnoreAllCapsWords']; + osp[1] = checkboxState['IgnoreWordsNumbers']; + osp[2] = checkboxState['IgnoreMixedCaseWords']; + osp[3] = checkboxState['IgnoreDomainNames']; + + osp = osp.toString().replace(/,/g, ""); + + + appTools.cookie.set('osp', osp); + appTools.cookie.set('udnCmd', cmd ? cmd : 'ignore'); + if (cmd == "delete") { + + appTools.postMessage.send({ + 'id': 'options_dic_send' + }); + } else { + var udn = ''; + if(nameNode.getValue() !== ''){ + udn = nameNode.getValue(); + } + appTools.cookie.set('udn', udn); + appTools.postMessage.send({ + 'id': 'options_dic_send' + }); + } + + }; + + + var sendAllOptions = function() { + var osp = []; + + osp[0] = checkboxState['IgnoreAllCapsWords']; + osp[1] = checkboxState['IgnoreWordsNumbers']; + osp[2] = checkboxState['IgnoreMixedCaseWords']; + osp[3] = checkboxState['IgnoreDomainNames']; + + osp = osp.toString().replace(/,/g, ""); + + appTools.cookie.set('osp', osp); + + appTools.postMessage.send({ + 'id': 'options_checkbox_send' + }); + + + }; + + var cameOptions = function() { + OptionsTextError.getElement().setHtml(NS.LocalizationComing['error']); + OptionsTextError.getElement().show(); + }; + + return { + title: NS.LocalizationComing['Options'], + minWidth: 430, + minHeight: 130, + resizable: CKEDITOR.DIALOG_RESIZE_NONE, + contents: [ + { + id: 'OptionsTab', + label: 'Options', + accessKey: 'O', + elements: [ + { + type: 'hbox', + id: 'options_error', + children: [ + { + type: 'html', + style: "display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red", + html: '
', + onShow: function() { + OptionsTextError = this; + } + } + ] + }, + { + type: 'vbox', + id: 'Options_content', + children: [ + { + type: 'hbox', + id: 'Options_manager', + widths: ['52%', '48%'], + children: [ + { + type: 'fieldset', + label: 'Spell Checking Options', + style: 'border: none;margin-top: 13px;padding: 10px 0 10px 10px', + onShow: function() { + this.getInputElement().$.children[0].innerHTML = NS.LocalizationComing['SpellCheckingOptions']; + }, + children: [ + { + type: 'vbox', + id: 'Options_checkbox', + children: [ + { + type: 'checkbox', + id: 'IgnoreAllCapsWords', + label: 'Ignore All-Caps Words', + labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;', + style: "float:left; min-height: 16px;", + 'default': '', + onClick: function() { + checkboxState[this.id] = (!this.getValue()) ? 0 : 1; + } + }, + { + type: 'checkbox', + id: 'IgnoreWordsNumbers', + label: 'Ignore Words with Numbers', + labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;', + style: "float:left; min-height: 16px;", + 'default': '', + onClick: function() { + checkboxState[this.id] = (!this.getValue()) ? 0 : 1; + } + }, + { + type: 'checkbox', + id: 'IgnoreMixedCaseWords', + label: 'Ignore Mixed-Case Words', + labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;', + style: "float:left; min-height: 16px;", + 'default': '', + onClick: function() { + checkboxState[this.id] = (!this.getValue()) ? 0 : 1; + } + }, + { + type: 'checkbox', + id: 'IgnoreDomainNames', + label: 'Ignore Domain Names', + labelStyle: 'margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;', + style: "float:left; min-height: 16px;", + 'default': '', + onClick: function() { + checkboxState[this.id] = (!this.getValue()) ? 0 : 1; + } + } + ] + } + ] + }, + { + type: 'vbox', + id: 'Options_DictionaryName', + children: [ + { + type: 'text', + id: 'DictionaryName', + style: 'margin-bottom: 10px', + label: 'Dictionary Name:', + labelLayout: 'vertical', + labelStyle: 'font: 12px/25px arial, sans-serif;', + 'default': '', + onLoad: function() { + nameNode = this; + var udn = NS.userDictionaryName ? NS.userDictionaryName : appTools.cookie.get('udn') && undefined ? ' ' : this.getValue(); + this.setValue(udn); + }, + onShow: function() { + nameNode = this; + var udn = !appTools.cookie.get('udn') ? this.getValue() : appTools.cookie.get('udn'); + this.setValue(udn); + this.setLabel(NS.LocalizationComing['DictionaryName']); + }, + onHide: function() { + this.reset(); + } + }, + { + type: 'hbox', + id: 'Options_buttons', + children: [ + { + type: 'vbox', + id: 'Options_leftCol_col', + widths: ['50%', '50%'], + children: [ + { + type: 'button', + id: 'create', + label: 'Create', + title: 'Create', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onShow: function() { + var el = this.getElement().getFirst() || this.getElement(); + + el.setText(NS.LocalizationComing['Create']); + }, + onClick: sendDicOptions + }, + { + type: 'button', + id: 'restore', + label: 'Restore', + title: 'Restore', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onShow: function() { + var el = this.getElement().getFirst() || this.getElement(); + + el.setText(NS.LocalizationComing['Restore']); + }, + onClick: sendDicOptions + } + ] + }, + { + type: 'vbox', + id: 'Options_rightCol_col', + widths: ['50%', '50%'], + children: [ + { + type: 'button', + id: 'rename', + label: 'Rename', + title: 'Rename', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onShow: function() { + var el = this.getElement().getFirst() || this.getElement(); + + el.setText(NS.LocalizationComing['Rename']); + }, + onClick: sendDicOptions + }, + { + type: 'button', + id: 'delete', + label: 'Remove', + title: 'Remove', + style: 'width: 100%;', + onLoad: function() { + this.getElement().setAttribute("title-cmd", this.id); + }, + onShow: function() { + var el = this.getElement().getFirst() || this.getElement(); + + el.setText(NS.LocalizationComing['Remove']); + }, + onClick: sendDicOptions + } + ] + } + ] + } + ] + } + ] + }, + { + type: 'hbox', + id: 'Options_text', + children: [ + { + type: 'html', + style: "text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;", + html: "
" + NS.LocalizationComing['OptionsTextIntro'] + "
", + onShow: function() { + this.getElement().setText(NS.LocalizationComing['OptionsTextIntro']); + } + } + ] + } + ] + } + ] +} +], + buttons: [CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton], + onOk: function() { + sendAllOptions(); + OptionsTextError.getElement().hide(); + OptionsTextError.getElement().setHtml(' '); + }, + onLoad: function() { + dialog = this; + // appTools.postMessage.init(cameOptions); + + linkOnCheckbox['IgnoreAllCapsWords'] = dialog.getContentElement('OptionsTab', 'IgnoreAllCapsWords'); + linkOnCheckbox['IgnoreWordsNumbers'] = dialog.getContentElement('OptionsTab', 'IgnoreWordsNumbers'); + linkOnCheckbox['IgnoreMixedCaseWords'] = dialog.getContentElement('OptionsTab', 'IgnoreMixedCaseWords'); + linkOnCheckbox['IgnoreDomainNames'] = dialog.getContentElement('OptionsTab', 'IgnoreDomainNames'); + + }, + onShow: function() { + appTools.postMessage.init(cameOptions); + setHandlerOptions(); + + (!parseInt(checkboxState['IgnoreAllCapsWords'], 10)) ? linkOnCheckbox['IgnoreAllCapsWords'].setValue('', false) : linkOnCheckbox['IgnoreAllCapsWords'].setValue('checked', false); + (!parseInt(checkboxState['IgnoreWordsNumbers'], 10)) ? linkOnCheckbox['IgnoreWordsNumbers'].setValue('', false) : linkOnCheckbox['IgnoreWordsNumbers'].setValue('checked', false); + (!parseInt(checkboxState['IgnoreMixedCaseWords'], 10)) ? linkOnCheckbox['IgnoreMixedCaseWords'].setValue('', false) : linkOnCheckbox['IgnoreMixedCaseWords'].setValue('checked', false); + (!parseInt(checkboxState['IgnoreDomainNames'], 10)) ? linkOnCheckbox['IgnoreDomainNames'].setValue('', false) : linkOnCheckbox['IgnoreDomainNames'].setValue('checked', false); + + checkboxState['IgnoreAllCapsWords'] = (!linkOnCheckbox['IgnoreAllCapsWords'].getValue()) ? 0 : 1; + checkboxState['IgnoreWordsNumbers'] = (!linkOnCheckbox['IgnoreWordsNumbers'].getValue()) ? 0 : 1; + checkboxState['IgnoreMixedCaseWords'] = (!linkOnCheckbox['IgnoreMixedCaseWords'].getValue()) ? 0 : 1; + checkboxState['IgnoreDomainNames'] = (!linkOnCheckbox['IgnoreDomainNames'].getValue()) ? 0 : 1; + + linkOnCheckbox['IgnoreAllCapsWords'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreAllCapsWords']; + linkOnCheckbox['IgnoreWordsNumbers'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreWordsWithNumbers']; + linkOnCheckbox['IgnoreMixedCaseWords'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreMixedCaseWords']; + linkOnCheckbox['IgnoreDomainNames'].getElement().$.lastChild.innerHTML = NS.LocalizationComing['IgnoreDomainNames']; + }, + onHide: function() { + appTools.postMessage.unbindHandler(cameOptions); + if(activeElement) { + try { + activeElement.focus(); + } catch(e) {} + } + } + }; +}); + +// Expand the spell-check frame when dialog resized. (#6829) +CKEDITOR.dialog.on( 'resize', function( evt ) { + var data = evt.data, + dialog = data.dialog, + currentTabId = dialog._.currentTabId, + tabID = NS.iframeNumber + '_' + currentTabId, + iframe = CKEDITOR.document.getById(tabID); + + if ( dialog._.name == 'checkspell' ) { + if (NS.bnr) { + iframe && iframe.setSize( 'height', data.height - '310' ); + } else { + iframe && iframe.setSize( 'height', data.height - '220' ); + } + + // add flag that indicate whether dialog has been resized by user + if(dialog._.fromResizeEvent && !dialog._.resized) { + dialog._.resized = true; + } + dialog._.fromResizeEvent = true; + } +}); + +CKEDITOR.on('dialogDefinition', function(dialogDefinitionEvent) { + + if(dialogDefinitionEvent.data.name === 'checkspell') { + var dialogDefinition = dialogDefinitionEvent.data.definition; + + NS.onLoadOverlay = new overlayBlock({ + opacity: "1", + background: "#fff", + target: dialogDefinition.dialog.parts.tabs.getParent().$ + }); + + NS.onLoadOverlay.setEnable(); + + dialogDefinition.dialog.on('cancel', function(cancelEvent) { + dialogDefinition.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame()); + NS.div_overlay.setDisable(); + NS.onLoadOverlay.setDisable(); + return false; + }, this, null, -1); + } +}); +})(); diff --git a/sources/plugins/wsc/dialogs/wsc_ie.js b/sources/plugins/wsc/dialogs/wsc_ie.js new file mode 100644 index 00000000..f47e507f --- /dev/null +++ b/sources/plugins/wsc/dialogs/wsc_ie.js @@ -0,0 +1,176 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'checkspell', function( editor ) { + var number = CKEDITOR.tools.getNextNumber(), + iframeId = 'cke_frame_' + number, + textareaId = 'cke_data_' + number, + errorBoxId = 'cke_error_' + number, + interval, + protocol = document.location.protocol || 'http:', + errorMsg = editor.lang.wsc.notAvailable; + + var pasteArea = + '