diff --git a/.gitignore b/.gitignore index ee03c6a6..8c365aa8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,9 @@ elogd elconv elog *.o + +# Mac +.DS_Store + +# Logbook generated files +logbooks/* diff --git a/scripts/ckeditor-config.js b/scripts/ckeditor-config.js new file mode 100755 index 00000000..4a7b47e1 --- /dev/null +++ b/scripts/ckeditor-config.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + +CKEDITOR.editorConfig = function( config ) { + // Define changes to default configuration here. For example: + // config.language = 'fr'; + // config.uiColor = '#AADC6E'; + config.extraPlugins = 'abbr,timestamp,dndfiles,eqneditor'; + config.filebrowserUploadUrl = "./" +}; diff --git a/scripts/ckeditor/CHANGES.md b/scripts/ckeditor/CHANGES.md new file mode 100755 index 00000000..b718aabf --- /dev/null +++ b/scripts/ckeditor/CHANGES.md @@ -0,0 +1,612 @@ +CKEditor 4 Changelog +==================== + +## CKEditor 4.4.3 + +**Security Updates:** + +* Fixed XSS vulnerability in the Preview plugin reported by Mario Heiderich of [Cure53](https://cure53.de/). + +**An upgrade is highly recommended!** + +New Features: + +* [#12164](http://dev.ckeditor.com/ticket/12164): Added the "Justify" option to the "Horizontal Alignment" drop-down in the Table Cell Properties dialog window. + +Fixed Issues: + +* [#12110](http://dev.ckeditor.com/ticket/12110): Fixed: Editor crash after deleting a table. Thanks to [Alin Purcaru](https://github.com/mesmerizero)! +* [#11897](http://dev.ckeditor.com/ticket/11897): Fixed: **Enter** key used in an empty list item creates a new line instead of breaking the list. Thanks to [noam-si](https://github.com/noam-si)! +* [#12140](http://dev.ckeditor.com/ticket/12140): Fixed: Double-clicking linked widgets opens two dialog windows. +* [#12132](http://dev.ckeditor.com/ticket/12132): Fixed: Image is inserted with `width` and `height` styles even when they are not allowed. +* [#9317](http://dev.ckeditor.com/ticket/9317): [IE] Fixed: [`config.disableObjectResizing`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-disableObjectResizing) does not work on IE. **Note**: We were not able to fix this issue on IE11+ because necessary events stopped working. See a [last resort workaround](http://dev.ckeditor.com/ticket/9317#comment:16) and make sure to [support our complaint to Microsoft](https://connect.microsoft.com/IE/feedback/details/742593/please-respect-execcommand-enableobjectresizing-in-contenteditable-elements). +* [#9638](http://dev.ckeditor.com/ticket/9638): Fixed: There should be no information about accessibility help available under the *Alt+0* keyboard shortcut if the [Accessibility Help](http://ckeditor.com/addon/a11yhelp) plugin is not available. +* [#8117](http://dev.ckeditor.com/ticket/8117) and [#9186](http://dev.ckeditor.com/ticket/9186): Fixed: In HTML5 `` tags should be allowed everywhere, including inside the `` element. +* [#10422](http://dev.ckeditor.com/ticket/10422): Fixed: [`config.fillEmptyBlocks`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fillEmptyBlocks) not working properly if a function is specified. + +## CKEditor 4.4.2 + +Important Notes: + +* The CKEditor testing environment is now publicly available. Read more about how to set up the environment and execute tests in the [CKEditor Testing Environment](http://docs.ckeditor.com/#!/guide/dev_tests) guide. + Please note that the [`tests/`](https://github.com/ckeditor/ckeditor-dev/tree/master/tests) directory which contains editor tests is not available in release packages. It can only be found in the development version of CKEditor on [GitHub](https://github.com/ckeditor/ckeditor-dev/). + +New Features: + +* [#11909](http://dev.ckeditor.com/ticket/11909): Introduced a parameter to prevent the [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) method from recording undo snapshots. + +Fixed Issues: + +* [#11757](http://dev.ckeditor.com/ticket/11757): Fixed: Imperfections in the [Moono](http://ckeditor.com/addon/moono) skin. Thanks to [danyaPostfactum](https://github.com/danyaPostfactum)! +* [#10091](http://dev.ckeditor.com/ticket/10091): Blockquote should be treated like an object by the styles system. Thanks to [dan-james-deeson](https://github.com/dan-james-deeson)! +* [#11478](http://dev.ckeditor.com/ticket/11478): Fixed: Issue with passing jQuery objects to [adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) configuration. +* [#10867](http://dev.ckeditor.com/ticket/10867): Fixed: Issue with setting encoded URI as image link. +* [#11983](http://dev.ckeditor.com/ticket/11983): Fixed: Clicking a nested widget does not focus it. Additionally, performance of the [`widget.repository.getByElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-getByElement) method was improved. +* [#12000](http://dev.ckeditor.com/ticket/12000): Fixed: Nested widgets should be initialized on [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) and [`nestedEditable.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.nestedEditable-method-setData). +* [#12022](http://dev.ckeditor.com/ticket/12022): Fixed: Outer widget's drag handler is not created at all if it has any nested widgets inside. +* [#11960](http://dev.ckeditor.com/ticket/11960): [Blink/WebKit] Fixed: The caret should be scrolled into view on *Backspace* and *Delete* (covers only the merging blocks case). +* [#11306](http://dev.ckeditor.com/ticket/11306): [OSX][Blink/WebKit] Fixed: No widget entries in the context menu on widget right-click. +* [#11957](http://dev.ckeditor.com/ticket/11957): Fixed: Alignment labels in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window are not translated. +* [#11980](http://dev.ckeditor.com/ticket/11980): [Blink/WebKit] Fixed: `` elements created when joining adjacent elements (non-collapsed selection). +* [#12009](http://dev.ckeditor.com/ticket/12009): [Nested widgets] Integration with the [Magic Line](http://ckeditor.com/addon/magicline) plugin. +* [#11387](http://dev.ckeditor.com/ticket/11387): Fixed: `role="radiogroup"` should be applied only to radio inputs' container. +* [#7975](http://dev.ckeditor.com/ticket/7975): [IE8] Fixed: Errors when trying to select an empty table cell. +* [#11947](http://dev.ckeditor.com/ticket/11947): [Firefox+IE11] Fixed: *Shift+Enter* in lists produces two line breaks. +* [#11972](http://dev.ckeditor.com/ticket/11972): Fixed: Feature detection in the [`element.setText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-setText) method should not trigger the layout engine. +* [#7634](http://dev.ckeditor.com/ticket/7634): Fixed: The [Flash Dialog](http://ckeditor.com/addon/flash) plugin omits the `allowFullScreen` parameter in the editor data if set to `true`. +* [#11910](http://dev.ckeditor.com/ticket/11910): Fixed: [Enhanced Image](http://ckeditor.com/addon/image2) does not take [`config.baseHref`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-baseHref) into account when updating image dimensions. +* [#11753](http://dev.ckeditor.com/ticket/11753): Fixed: Wrong [`checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method value after focusing or blurring a widget. +* [#11830](http://dev.ckeditor.com/ticket/11830): Fixed: Impossible to pass some arguments to [CKBuilder](https://github.com/ckeditor/ckbuilder) when using the `/dev/builder/build.sh` script. +* [#11945](http://dev.ckeditor.com/ticket/11945): Fixed: [Form Elements](http://ckeditor.com/addon/forms) plugin should not change a core method. +* [#11384](http://dev.ckeditor.com/ticket/11384): [IE9+] Fixed: `IndexSizeError` thrown when pasting into a non-empty selection anchored in one text node. + +## CKEditor 4.4.1 + +New Features: + +* [#9661](http://dev.ckeditor.com/ticket/9661): Added the option to [configure](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-linkJavaScriptLinksAllowed) anchor tags with JavaScript code in the `href` attribute. + +Fixed Issues: + +* [#11861](http://dev.ckeditor.com/ticket/11861): [Webkit/Blink] Fixed: Span elements created while joining adjacent elements. **Note:** This patch only covers cases when *Backspace* or *Delete* is pressed on a collapsed (empty) selection. The remaining case, with a non-empty selection, will be fixed in the next release. +* [#10714](http://dev.ckeditor.com/ticket/10714): [iOS] Fixed: Selection and drop-downs are broken if a touch event listener is used due to a [Webkit bug](https://bugs.webkit.org/show_bug.cgi?id=128924). Thanks to [Arty Gus](https://github.com/artygus)! +* [#11911](http://dev.ckeditor.com/ticket/11911): Fixed setting the `dir` attribute for a preloaded language in [CKEDITOR.lang](http://docs.ckeditor.com/#!/api/CKEDITOR.lang). Thanks to [Akash Mohapatra](https://github.com/akashmohapatra)! +* [#11926](http://dev.ckeditor.com/ticket/11926): Fixed: [Code Snippet](http://ckeditor.com/addon/codesnippet) does not decode HTML entities when loading code from the `` element. +* [#11223](http://dev.ckeditor.com/ticket/11223): Fixed: Issue when [Protected Source](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-protectedSource) was not working in the `` element. +* [#11859](http://dev.ckeditor.com/ticket/11859): Fixed: Removed the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin dependency from the [Code Snippet](http://ckeditor.com/addon/codesnippet) sample. +* [#11754](http://dev.ckeditor.com/ticket/11754): [Chrome] Fixed: Infinite loop when content includes not closed attributes. +* [#11848](http://dev.ckeditor.com/ticket/11848): [IE] Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) throwing an exception when there was no selection in the editor. +* [#11801](http://dev.ckeditor.com/ticket/11801): Fixed: Editor anchors unavailable when linking the [Enhanced Image](http://ckeditor.com/addon/image2) widget. +* [#11626](http://dev.ckeditor.com/ticket/11626): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) sets invalid column width. +* [#11872](http://dev.ckeditor.com/ticket/11872): Made [`element.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-addClass) chainable symmetrically to [`element.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-removeClass). +* [#11813](http://dev.ckeditor.com/ticket/11813): Fixed: Link lost while pasting a captioned image and restoring an undo snapshot ([Enhanced Image](http://ckeditor.com/addon/image2)). +* [#11814](http://dev.ckeditor.com/ticket/11814): Fixed: _Link_ and _Unlink_ entries persistently displayed in the [Enhanced Image](http://ckeditor.com/addon/image2) context menu. +* [#11839](http://dev.ckeditor.com/ticket/11839): [IE9] Fixed: The caret jumps out of the editable area when resizing the editor in the source mode. +* [#11822](http://dev.ckeditor.com/ticket/11822): [Webkit] Fixed: Editing anchors by double-click is broken in some cases. +* [#11823](http://dev.ckeditor.com/ticket/11823): [IE8] Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) throws an error over scrollbar. +* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: It is not possible to change the language back to _Not set_ in the [Code Snippet](http://ckeditor.com/addon/codesnippet) dialog window. +* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: [Filter](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied inside elements with the `contenteditable` attribute set to `true`. +* [#11798](http://dev.ckeditor.com/ticket/11798): Fixed: Inserting a non-editable element inside a table cell breaks the table. +* [#11793](http://dev.ckeditor.com/ticket/11793): Fixed: Drop-down is not "on" when clicking it while the editor is blurred. +* [#11850](http://dev.ckeditor.com/ticket/11850): Fixed: Fake objects with the `contenteditable` attribute set to `false` are not downcasted properly. +* [#11811](http://dev.ckeditor.com/ticket/11811): Fixed: Widget's data is not encoded correctly when passed to an attribute. +* [#11777](http://dev.ckeditor.com/ticket/11777): Fixed encoding ampersand in the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin. +* [#11880](http://dev.ckeditor.com/ticket/11880): [IE8-9] Fixed: Linked image has a default thick border. + +Other Changes: + +* [#11807](http://dev.ckeditor.com/ticket/11807): Updated jQuery version used in the sample to 1.11.0 and tested CKEditor jQuery Adapter with version 1.11.0 and 2.1.0. +* [#9504](http://dev.ckeditor.com/ticket/9504): Stopped using deprecated `attribute.specified` in all browsers except Internet Explorer. +* [#11809](http://dev.ckeditor.com/ticket/11809): Changed tab size in `<pre>` to 4 spaces. + +## CKEditor 4.4 + +**Important Notes:** + +* Marked the [`editor.beforePaste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-beforePaste) event as deprecated. +* The default class of captioned images has changed to `image` (was: `caption`). Please note that once edited in CKEditor 4.4+, all existing images of the `caption` class (`<figure class="caption">`) will be [filtered out](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) unless the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option is set to `caption`. For backward compatibility (i.e. when upgrading), it is highly recommended to use this setting, which also helps prevent CSS conflicts, etc. This does not apply to new CKEditor integrations. +* Widgets without defined buttons are no longer registered automatically to the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter). Before CKEditor 4.4 widgets were registered to the ACF which was an incorrect behavior ([#11567](http://dev.ckeditor.com/ticket/11567)). This change should not have any impact on standard scenarios, but if your button does not execute the widget command, you need to set [`allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-allowedContent) and [`requiredContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-requiredContent) properties for it manually, because the editor will not be able to find them. +* The [Show Borders](http://ckeditor.com/addon/showborders) plugin was added to the Standard installation package in order to ensure that unstyled tables are still visible for the user ([#11665](http://dev.ckeditor.com/ticket/11665)). +* Since CKEditor 4.4 the editor instance should be passed to [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) methods to ensure full compatibility with other features (e.g. applying styles to widgets requires that). We ensured backward compatibility though, so the [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) will work even when the editor instance is not provided. + +New Features: + +* [#11297](http://dev.ckeditor.com/ticket/11297): Styles can now be applied to widgets. The definition of a style which can be applied to a specific widget must contain two additional properties — `type` and `widget`. Read more in the [Widget Styles](http://docs.ckeditor.com/#!/guide/dev_styles-section-widget-styles) section of the "Syles Drop-down" guide. Note that by default, widgets support only classes and no other attributes or styles. Related changes and features: + * Introduced the [`CKEDITOR.style.addCustomHandler()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-static-method-addCustomHandler) method for registering custom style handlers. + * The [`CKEDITOR.style.apply()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-apply) and [`CKEDITOR.style.remove()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-remove) methods are now called with an editor instance instead of the document so they can be reused by the [`CKEDITOR.editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) and [`CKEDITOR.editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) methods. Backward compatibility was preserved, but from CKEditor 4.4 it is highly recommended to pass an editor instead of a document to these methods. + * Many new methods and properties were introduced in the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget) to make the handling of styles by widgets fully customizable. See: [`widget.definition.styleableElements`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleableElements), [`widget.definition.styleToAllowedContentRule`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleToAllowedContentRules), [`widget.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-addClass), [`widget.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeClass), [`widget.getClasses()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-getClasses), [`widget.hasClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-hasClass), [`widget.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-applyStyle), [`widget.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeStyle), [`widget.checkStyleActive()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-checkStyleActive). + * Integration with the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) required an introduction of the [`CKEDITOR.style.toAllowedContent()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-toAllowedContentRules) method which can be implemented by the custom style handler and if exists, it is used by the [`CKEDITOR.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter) to translate a style to [allowed content rules](http://docs.ckeditor.com/#!/api/CKEDITOR.filter.allowedContentRules). +* [#11300](http://dev.ckeditor.com/ticket/11300): Various changes in the [Enhanced Image](http://ckeditor.com/addon/image2) plugin: + * Introduced the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option to configure the class of captioned images. + * Introduced the [`config.image2_alignClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_alignClasses) option to configure the way images are aligned with CSS classes. + If this setting is defined, the editor produces classes instead of inline styles for aligned images. + * Default image caption can be translated (customized) with the `editor.lang.image2.captionPlaceholder` string. +* [#11341](http://dev.ckeditor.com/ticket/11341): [Enhanced Image](http://ckeditor.com/addon/image2) plugin: It is now possible to add a link to any image type. +* [#10202](http://dev.ckeditor.com/ticket/10202): Introduced wildcard support in the [Allowed Content Rules](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) format. +* [#10276](http://dev.ckeditor.com/ticket/10276): Introduced blacklisting in the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter). +* [#10480](http://dev.ckeditor.com/ticket/10480): Introduced code snippets with code highlighting. There are two versions available so far — the default [Code Snippet](http://ckeditor.com/addon/codesnippet) which uses the [highlight.js](http://highlightjs.org) library and the [Code Snippet GeSHi](http://ckeditor.com/addon/codesnippetgeshi) which uses the [GeSHi](http://qbnz.com/highlighter/) library. +* [#11737](http://dev.ckeditor.com/ticket/11737): Introduced an option to prevent [filtering](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) of an element that matches custom criteria (see [`filter.addElementCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-method-addElementCallback)). +* [#11532](http://dev.ckeditor.com/ticket/11532): Introduced the [`editor.addContentsCss()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addContentsCss) method that can be used for [adding custom CSS files](http://docs.ckeditor.com/#!/guide/plugin_sdk_styles). +* [#11536](http://dev.ckeditor.com/ticket/11536): Added the [`CKEDITOR.tools.htmlDecode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-htmlDecode) method for decoding HTML entities. +* [#11225](http://dev.ckeditor.com/ticket/11225): Introduced the [`CKEDITOR.tools.transparentImageData`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-property-transparentImageData) property which contains transparent image data to be used in CSS or as image source. + +Other Changes: + +* [#11377](http://dev.ckeditor.com/ticket/11377): Unified internal representation of empty anchors using the [fake objects](http://ckeditor.com/addon/fakeobjects). +* [#11422](http://dev.ckeditor.com/ticket/11422): Removed Firefox 3.x, Internet Explorer 6 and Opera 12.x leftovers in code. +* [#5217](http://dev.ckeditor.com/ticket/5217): Setting data (including switching between modes) creates a new undo snapshot. Besides that: + * Introduced the [`editable.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-property-status) property. + * Introduced a new `forceUpdate` option for the [`editor.lockSnapshot`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-lockSnapshot) event. + * Fixed: Selection not being unlocked in inline editor after setting data ([#11500](http://dev.ckeditor.com/ticket/11500)). +* The [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin was updated to the latest version. + +Fixed Issues: + +* [#10190](http://dev.ckeditor.com/ticket/10190): Fixed: Removing block style with [`editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) should result in a paragraph and not a div. +* [#11727](http://dev.ckeditor.com/ticket/11727): Fixed: The editor tries to select a non-editable image which was clicked. + +## CKEditor 4.3.5 + +New Features: + +* Added new translation: Tatar. + +Fixed Issues: + +* [#11677](http://dev.ckeditor.com/ticket/11677): Fixed: Undo/Redo keystrokes are blocked in the source mode. +* [#11717](http://dev.ckeditor.com/ticket/11717): [Document Properties](http://ckeditor.com/addon/docprops) plugin requires the [Color Dialog](http://ckeditor.com/addon/colordialog) plugin to work. + +## CKEditor 4.3.4 + +Fixed Issues: + +* [#11597](http://dev.ckeditor.com/ticket/11597): [IE11] Fixed: Error thrown when trying to open the [preview](http://ckeditor.com/addon/preview) using the keyboard. +* [#11544](http://dev.ckeditor.com/ticket/11544): [Placeholders](http://ckeditor.com/addon/placeholder) will no longer be upcasted in parents not accepting `<span>` elements. +* [#8663](http://dev.ckeditor.com/ticket/8663): Fixed [`element.renameNode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-renameNode) not clearing the [`element.getName()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-getName) cache. +* [#11574](http://dev.ckeditor.com/ticket/11574): Fixed: *Backspace* destroying the DOM structure if an inline editable is placed in a list item. +* [#11603](http://dev.ckeditor.com/ticket/11603): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) attaches to tables outside the editable. +* [#9205](http://dev.ckeditor.com/ticket/9205), [#7805](http://dev.ckeditor.com/ticket/7805), [#8216](http://dev.ckeditor.com/ticket/8216): Fixed: `{cke_protected_1}` appearing in data in various cases where HTML comments are placed next to `"` or `'`. +* [#11635](http://dev.ckeditor.com/ticket/11635): Fixed: Some attributes are not protected before the content is passed through the fix bin. +* [#11660](http://dev.ckeditor.com/ticket/11660): [IE] Fixed: Table content is lost when some extra markup is inside the table. +* [#11641](http://dev.ckeditor.com/ticket/11641): Fixed: Switching between modes in the classic editor removes content styles for the inline editor. +* [#11568](http://dev.ckeditor.com/ticket/11568): Fixed: [Styles](http://ckeditor.com/addon/stylescombo) drop-down list is not enabled on selection change. + +## CKEditor 4.3.3 + +Fixed Issues: + +* [#11500](http://dev.ckeditor.com/ticket/11500): [Webkit/Blink] Fixed: Selection lost when setting data in another inline editor. Additionally, [`selection.removeAllRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-removeAllRanges) is now scoped to selection's [root](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-property-root). +* [#11104](http://dev.ckeditor.com/ticket/11104): [IE] Fixed: Various issues with scrolling and selection when focusing widgets. +* [#11487](http://dev.ckeditor.com/ticket/11487): Moving mouse over the [Enhanced Image](http://ckeditor.com/addon/image2) widget will no longer change the value returned by the [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method. +* [#8673](http://dev.ckeditor.com/ticket/8673): [WebKit] Fixed: Cannot select and remove the [Page Break](http://ckeditor.com/addon/pagebreak). +* [#11413](http://dev.ckeditor.com/ticket/11413): Fixed: Incorrect [`editor.execCommand()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand) behavior. +* [#11438](http://dev.ckeditor.com/ticket/11438): Splitting table cells vertically is no longer changing table structure. +* [#8899](http://dev.ckeditor.com/ticket/8899): Fixed: Links in the [About CKEditor](http://ckeditor.com/addon/about) dialog window now open in a new browser window or tab. +* [#11490](http://dev.ckeditor.com/ticket/11490): Fixed: [Menu button](http://ckeditor.com/addon/menubutton) panel not showing in the source mode. +* [#11417](http://dev.ckeditor.com/ticket/11417): The [`widget.doubleclick`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-event-doubleclick) event is not canceled anymore after editing was triggered. +* [#11253](http://dev.ckeditor.com/ticket/11253): [IE] Fixed: Clipped upload button in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window. +* [#11359](http://dev.ckeditor.com/ticket/11359): Standardized the way anchors are discovered by the [Link](http://ckeditor.com/addon/link) plugin. +* [#11058](http://dev.ckeditor.com/ticket/11058): [IE8] Fixed: Error when deleting a table row. +* [#11508](http://dev.ckeditor.com/ticket/11508): Fixed: [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor) discovering protected attributes within other attributes' values. +* [#11533](http://dev.ckeditor.com/ticket/11533): Widgets: Avoid recurring upcasts if the DOM structure was modified during an upcast. +* [#11400](http://dev.ckeditor.com/ticket/11400): Fixed: The [`domObject.removeAllListeners()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.domObject-method-removeAllListeners) method does not remove custom listeners completely. +* [#11493](http://dev.ckeditor.com/ticket/11493): Fixed: The [`selection.getRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-getRanges) method does not override cached ranges when used with the `onlyEditables` argument. +* [#11390](http://dev.ckeditor.com/ticket/11390): [IE] All [XML](http://ckeditor.com/addon/xml) plugin [methods](http://docs.ckeditor.com/#!/api/CKEDITOR.xml) now work in IE10+. +* [#11542](http://dev.ckeditor.com/ticket/11542): [IE11] Fixed: Blurry toolbar icons when Right-to-Left UI language is set. +* [#11504](http://dev.ckeditor.com/ticket/11504): Fixed: When [`config.fullPage`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fullPage) is set to `true`, entities are not encoded in editor output. +* [#11004](http://dev.ckeditor.com/ticket/11004): Integrated [Enhanced Image](http://ckeditor.com/addon/image2) dialog window with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter). +* [#11439](http://dev.ckeditor.com/ticket/11439): Fixed: Properties get cloned in the Cell Properties dialog window if multiple cells are selected. + +## CKEditor 4.3.2 + +Fixed Issues: + +* [#11331](http://dev.ckeditor.com/ticket/11331): A menu button will have a changed label when selected instead of using the `aria-pressed` attribute. +* [#11177](http://dev.ckeditor.com/ticket/11177): Widget drag handler improvements: + * [#11176](http://dev.ckeditor.com/ticket/11176): Fixed: Initial position is not updated when the widget data object is empty. + * [#11001](http://dev.ckeditor.com/ticket/11001): Fixed: Multiple synchronous layout recalculations are caused by initial drag handler positioning causing performance issues. + * [#11161](http://dev.ckeditor.com/ticket/11161): Fixed: Drag handler is not repositioned in various situations. + * [#11281](http://dev.ckeditor.com/ticket/11281): Fixed: Drag handler and mask are duplicated after widget reinitialization. +* [#11207](http://dev.ckeditor.com/ticket/11207): [Firefox] Fixed: Misplaced [Enhanced Image](http://ckeditor.com/addon/image2) resizer in the inline editor. +* [#11102](http://dev.ckeditor.com/ticket/11102): `CKEDITOR.template` improvements: + * [#11102](http://dev.ckeditor.com/ticket/11102): Added newline character support. + * [#11216](http://dev.ckeditor.com/ticket/11216): Added "\\'" substring support. +* [#11121](http://dev.ckeditor.com/ticket/11121): [Firefox] Fixed: High Contrast mode is enabled when the editor is loaded in a hidden iframe. +* [#11350](http://dev.ckeditor.com/ticket/11350): The default value of [`config.contentsCss`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-contentsCss) is affected by [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl). +* [#11097](http://dev.ckeditor.com/ticket/11097): Improved the [Autogrow](http://ckeditor.com/addon/autogrow) plugin performance when dealing with very big tables. +* [#11290](http://dev.ckeditor.com/ticket/11290): Removed redundant code in the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin. +* [#11133](http://dev.ckeditor.com/ticket/11133): [Page Break](http://ckeditor.com/addon/pagebreak) becomes editable if pasted. +* [#11126](http://dev.ckeditor.com/ticket/11126): Fixed: Native Undo executed once the bottom of the snapshot stack is reached. +* [#11131](http://dev.ckeditor.com/ticket/11131): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Error thrown when switching to source mode if the selection was in widget's nested editable. +* [#11139](http://dev.ckeditor.com/ticket/11139): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Elements Path is not cleared after switching to source mode. +* [#10778](http://dev.ckeditor.com/ticket/10778): Fixed a bug with range enlargement. The range no longer expands to visible whitespace. +* [#11146](http://dev.ckeditor.com/ticket/11146): [IE] Fixed: Preview window switches Internet Explorer to Quirks Mode. +* [#10762](http://dev.ckeditor.com/ticket/10762): [IE] Fixed: JavaScript code displayed in preview window's URL bar. +* [#11186](http://dev.ckeditor.com/ticket/11186): Introduced the [`widgets.repository.addUpcastCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-addUpcastCallback) method that allows to block upcasting given element to a widget. +* [#11307](http://dev.ckeditor.com/ticket/11307): Fixed: Paste as Plain Text conflict with the [MooTools](http://mootools.net) library. +* [#11140](http://dev.ckeditor.com/ticket/11140): [IE11] Fixed: Anchors are not draggable. +* [#11379](http://dev.ckeditor.com/ticket/11379): Changed default contents `line-height` to unitless values to avoid huge text overlapping (like in [#9696](http://dev.ckeditor.com/ticket/9696)). +* [#10787](http://dev.ckeditor.com/ticket/10787): [Firefox] Fixed: Broken replacement of text while pasting into `div`-based editor. +* [#10884](http://dev.ckeditor.com/ticket/10884): Widgets integration with the [Show Blocks](http://ckeditor.com/addon/showblocks) plugin. +* [#11021](http://dev.ckeditor.com/ticket/11021): Fixed: An error thrown when selecting entire editable contents while fake selection is on. +* [#11086](http://dev.ckeditor.com/ticket/11086): [IE8] Re-enable inline widgets drag&drop in Internet Explorer 8. +* [#11372](http://dev.ckeditor.com/ticket/11372): Widgets: Special characters encoded twice in nested editables. +* [#10068](http://dev.ckeditor.com/ticket/10068): Fixed: Support for protocol-relative URLs. +* [#11283](http://dev.ckeditor.com/ticket/11283): [Enhanced Image](http://ckeditor.com/addon/image2): A `<div>` element with `text-align: center` and an image inside is not recognised correctly. +* [#11196](http://dev.ckeditor.com/ticket/11196): [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp): Allowed additional keyboard button labels to be translated in the dialog window. + +## CKEditor 4.3.1 + +**Important Notes:** + +* To match the naming convention, the `language` button is now `Language` ([#11201](http://dev.ckeditor.com/ticket/11201)). +* [Enhanced Image](http://ckeditor.com/addon/image2) button, context menu, command, and icon names match those of the [Image](http://ckeditor.com/addon/image) plugin ([#11222](http://dev.ckeditor.com/ticket/11222)). + +Fixed Issues: + +* [#11244](http://dev.ckeditor.com/ticket/11244): Changed: The [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method now fires the [`widget.repository.checkWidgets`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-event-checkWidgets) event, so from CKEditor 4.3.1 it is preferred to use the method rather than fire the event. +* [#11171](http://dev.ckeditor.com/ticket/11171): Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) and [`editor.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText) methods do not call the [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method. +* [#11085](http://dev.ckeditor.com/ticket/11085): [IE8] Replaced preview generated by the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget with a placeholder. +* [#11044](http://dev.ckeditor.com/ticket/11044): Enhanced WAI-ARIA support for the [Language](http://ckeditor.com/addon/language) plugin drop-down menu. +* [#11075](http://dev.ckeditor.com/ticket/11075): With drop-down menu button focused, pressing the *Down Arrow* key will now open the menu and focus its first option. +* [#11165](http://dev.ckeditor.com/ticket/11165): Fixed: The [File Browser](http://ckeditor.com/addon/filebrowser) plugin cannot be removed from the editor. +* [#11159](http://dev.ckeditor.com/ticket/11159): [IE9-10] [Enhanced Image](http://ckeditor.com/addon/image2): Fixed buggy discovery of image dimensions. +* [#11101](http://dev.ckeditor.com/ticket/11101): Drop-down lists no longer break when given double quotes. +* [#11077](http://dev.ckeditor.com/ticket/11077): [Enhanced Image](http://ckeditor.com/addon/image2): Empty undo step recorded when resizing the image. +* [#10853](http://dev.ckeditor.com/ticket/10853): [Enhanced Image](http://ckeditor.com/addon/image2): Widget has paragraph wrapper when de-captioning unaligned image. +* [#11198](http://dev.ckeditor.com/ticket/11198): Widgets: Drag handler is not fully visible when an inline widget is in a heading. +* [#11132](http://dev.ckeditor.com/ticket/11132): [Firefox] Fixed: Caret is lost after drag and drop of an inline widget. +* [#11182](http://dev.ckeditor.com/ticket/11182): [IE10-11] Fixed: Editor crashes (IE11) or works with minor issues (IE10) if a page is loaded in Quirks Mode. See [`env.quirks`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-quirks) for more details. +* [#11204](http://dev.ckeditor.com/ticket/11204): Added `figure` and `figcaption` styles to the `contents.css` file so [Enhanced Image](http://ckeditor.com/addon/image2) looks nicer. +* [#11202](http://dev.ckeditor.com/ticket/11202): Fixed: No newline in [BBCode](http://ckeditor.com/addon/bbcode) mode. +* [#10890](http://dev.ckeditor.com/ticket/10890): Fixed: Error thrown when pressing the *Delete* key in a list item. +* [#10055](http://dev.ckeditor.com/ticket/10055): [IE8-10] Fixed: *Delete* pressed on a selected image causes the browser to go back. +* [#11183](http://dev.ckeditor.com/ticket/11183): Fixed: Inserting a horizontal rule or a table in multiple row selection causes a browser crash. Additionally, the [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) method does not insert the element into every range of a selection any more. +* [#11042](http://dev.ckeditor.com/ticket/11042): Fixed: Selection made on an element containing a non-editable element was not auto faked. +* [#11125](http://dev.ckeditor.com/ticket/11125): Fixed: Keyboard navigation through menu and drop-down items will now cycle. +* [#11011](http://dev.ckeditor.com/ticket/11011): Fixed: The [`editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) method removes attributes from nested elements. +* [#11179](http://dev.ckeditor.com/ticket/11179): Fixed: [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy) does not cleanup content generated by the [Table Resize](http://ckeditor.com/addon/tableresize) plugin for inline editors. +* [#11237](http://dev.ckeditor.com/ticket/11237): Fixed: Table border attribute value is deleted when pasting content from Microsoft Word. +* [#11250](http://dev.ckeditor.com/ticket/11250): Fixed: HTML entities inside the `<textarea>` element are not encoded. +* [#11260](http://dev.ckeditor.com/ticket/11260): Fixed: Initially disabled buttons are not read by JAWS as disabled. +* [#11200](http://dev.ckeditor.com/ticket/11200): Added [Clipboard](http://ckeditor.com/addon/clipboard) plugin as a dependency for [Widget](http://ckeditor.com/addon/widget) to fix drag and drop. + +## CKEditor 4.3 + +New Features: + +* [#10612](http://dev.ckeditor.com/ticket/10612): Internet Explorer 11 support. +* [#10869](http://dev.ckeditor.com/ticket/10869): Widgets: Added better integration with the [Elements Path](http://ckeditor.com/addon/elementspath) plugin. +* [#10886](http://dev.ckeditor.com/ticket/10886): Widgets: Added tooltip to the drag handle. +* [#10933](http://dev.ckeditor.com/ticket/10933): Widgets: Introduced drag and drop of block widgets with the [Line Utilities](http://ckeditor.com/addon/lineutils) plugin. +* [#10936](http://dev.ckeditor.com/ticket/10936): Widget System changes for easier integration with other dialog systems. +* [#10895](http://dev.ckeditor.com/ticket/10895): [Enhanced Image](http://ckeditor.com/addon/image2): Added file browser integration. +* [#11002](http://dev.ckeditor.com/ticket/11002): Added the [`draggable`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-draggable) option to disable drag and drop support for widgets. +* [#10937](http://dev.ckeditor.com/ticket/10937): [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget improvements: + * loading indicator ([#10948](http://dev.ckeditor.com/ticket/10948)), + * applying paragraph changes (like font color change) to iframe ([#10841](http://dev.ckeditor.com/ticket/10841)), + * Firefox and IE9 clipboard fixes ([#10857](http://dev.ckeditor.com/ticket/10857)), + * fixing same origin policy issue ([#10840](http://dev.ckeditor.com/ticket/10840)), + * fixing undo bugs ([#10842](http://dev.ckeditor.com/ticket/10842), [#10930](http://dev.ckeditor.com/ticket/10930)), + * fixing other minor bugs. +* [#10862](http://dev.ckeditor.com/ticket/10862): [Placeholder](http://ckeditor.com/addon/placeholder) plugin was rewritten as a widget. +* [#10822](http://dev.ckeditor.com/ticket/10822): Added styles system integration with non-editable elements (for example widgets) and their nested editables. Styles cannot change non-editable content and are applied in nested editable only if allowed by its type and content filter. +* [#10856](http://dev.ckeditor.com/ticket/10856): Menu buttons will now toggle the visibility of their panels when clicked multiple times. [Language](http://ckeditor.com/addon/language) plugin fixes: Added active language highlighting, added an option to remove the language. +* [#10028](http://dev.ckeditor.com/ticket/10028): New [`config.dialog_noConfirmCancel`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-dialog_noConfirmCancel) configuration option that eliminates the need to confirm closing of a dialog window when the user changed any of its fields. +* [#10848](http://dev.ckeditor.com/ticket/10848): Integrate remaining plugins ([Styles](http://ckeditor.com/addon/stylescombo), [Format](http://ckeditor.com/addon/format), [Font](http://ckeditor.com/addon/font), [Color Button](http://ckeditor.com/addon/colorbutton), [Language](http://ckeditor.com/addon/language) and [Indent](http://ckeditor.com/addon/indent)) with [active filter](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter). +* [#10855](http://dev.ckeditor.com/ticket/10855): Change the extension of emoticons in the [BBCode](http://ckeditor.com/addon/bbcode) sample from GIF to PNG. + +Fixed Issues: + +* [#10831](http://dev.ckeditor.com/ticket/10831): [Enhanced Image](http://ckeditor.com/addon/image2): Merged `image2inline` and `image2block` into one `image2` widget. +* [#10835](http://dev.ckeditor.com/ticket/10835): [Enhanced Image](http://ckeditor.com/addon/image2): Improved visibility of the resize handle. +* [#10836](http://dev.ckeditor.com/ticket/10836): [Enhanced Image](http://ckeditor.com/addon/image2): Preserve custom mouse cursor while resizing the image. +* [#10939](http://dev.ckeditor.com/ticket/10939): [Firefox] [Enhanced Image](http://ckeditor.com/addon/image2): hovering the image causes it to change. +* [#10866](http://dev.ckeditor.com/ticket/10866): Fixed: Broken *Tab* key navigation in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window. +* [#10833](http://dev.ckeditor.com/ticket/10833): Fixed: *Lock ratio* option should be on by default in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window. +* [#10881](http://dev.ckeditor.com/ticket/10881): Various improvements to *Enter* key behavior in nested editables. +* [#10879](http://dev.ckeditor.com/ticket/10879): [Remove Format](http://ckeditor.com/addon/removeformat) should not leak from a nested editable. +* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [WebSpellChecker](http://ckeditor.com/addon/wsc) fails to apply changes if a nested editable was focused. +* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [SCAYT](http://ckeditor.com/addon/wsc) blocks typing in nested editables. +* [#11079](http://dev.ckeditor.com/ticket/11079): Add button icons to the [Placeholder](http://ckeditor.com/addon/placeholder) sample. +* [#10870](http://dev.ckeditor.com/ticket/10870): The `paste` command is no longer being disabled when the clipboard is empty. +* [#10854](http://dev.ckeditor.com/ticket/10854): Fixed: Firefox prepends `<br>` to `<body>`, so it is stripped by the HTML data processor. +* [#10823](http://dev.ckeditor.com/ticket/10823): Fixed: [Link](http://ckeditor.com/addon/link) plugin does not work with non-editable content. +* [#10828](http://dev.ckeditor.com/ticket/10828): [Magic Line](http://ckeditor.com/addon/magicline) integration with the Widget System. +* [#10865](http://dev.ckeditor.com/ticket/10865): Improved hiding copybin, so copying widgets works smoothly. +* [#11066](http://dev.ckeditor.com/ticket/11066): Widget's private parts use CSS reset. +* [#11027](http://dev.ckeditor.com/ticket/11027): Fixed: Block commands break on widgets; added the [`contentDomInvalidated`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-contentDomInvalidated) event. +* [#10430](http://dev.ckeditor.com/ticket/10430): Resolve dependence of the [Image](http://ckeditor.com/addon/image) plugin on the [Form Elements](http://ckeditor.com/addon/forms) plugin. +* [#10911](http://dev.ckeditor.com/ticket/10911): Fixed: Browser *Alt* hotkeys will no longer be blocked while a widget is focused. +* [#11082](http://dev.ckeditor.com/ticket/11082): Fixed: Selected widget is not copied or cut when using toolbar buttons or context menu. +* [#11083](http://dev.ckeditor.com/ticket/11083): Fixed list and div element application to block widgets. +* [#10887](http://dev.ckeditor.com/ticket/10887): Internet Explorer 8 compatibility issues related to the Widget System. +* [#11074](http://dev.ckeditor.com/ticket/11074): Temporarily disabled inline widget drag and drop, because of seriously buggy native `range#moveToPoint` method. +* [#11098](http://dev.ckeditor.com/ticket/11098): Fixed: Wrong selection position after undoing widget drag and drop. +* [#11110](http://dev.ckeditor.com/ticket/11110): Fixed: IFrame and Flash objects are being incorrectly pasted in certain conditions. +* [#11129](http://dev.ckeditor.com/ticket/11129): Page break is lost when loading data. +* [#11123](http://dev.ckeditor.com/ticket/11123): [Firefox] Widget is destroyed after being dragged outside of `<body>`. +* [#11124](http://dev.ckeditor.com/ticket/11124): Fixed the [Elements Path](http://ckeditor.com/addon/elementspath) in an editor using the [Div Editing Area](http://ckeditor.com/addon/divarea). + +## CKEditor 4.3 Beta + +New Features: + +* [#9764](http://dev.ckeditor.com/ticket/9764): Widget System. + * [Widget plugin](http://ckeditor.com/addon/widget) introducing the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget). + * New [`editor.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) and [`editor.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-shiftEnterMode) properties – normalized versions of [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) and [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode). + * Dynamic editor settings. Starting from CKEditor 4.3 Beta, *Enter* mode values and [content filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) instances may be changed dynamically (for example when the caret was placed in an element in which editor features should be adjusted). When you are implementing a new editor feature, you should base its behavior on [dynamic](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) or [static](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) *Enter* mode values depending on whether this feature works in selection context or globally on editor content. + * Dynamic *Enter* mode values – [`editor.setActiveEnterMode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveEnterMode) method, [`editor.activeEnterModeChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeEnterModeChange) event, and two properties: [`editor.activeEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) and [`editor.activeShiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeShiftEnterMode). + * Dynamic content filter instances – [`editor.setActiveFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveFilter) method, [`editor.activeFilterChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeFilterChange) event, and [`editor.activeFilter`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter) property. + * "Fake" selection was introduced. It makes it possible to virtually select any element when the real selection remains hidden. See the [`selection.fake()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-fake) method. + * Default [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied to non-editable elements (elements with `contenteditable` attribute set to `false` and their descendants) anymore. To add a rule which will be applied to all elements you need to pass an additional argument to the [`filter.addRules()`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter-method-addRules) method. + * Dozens of new methods were introduced – most interesting ones: + * [`document.find()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-find), + * [`document.findOne()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-findOne), + * [`editable.insertElementIntoRange()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElementIntoRange), + * [`range.moveToClosestEditablePosition()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-moveToClosestEditablePosition), + * New methods for [`htmlParser.node`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.node) and [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element). +* [#10659](http://dev.ckeditor.com/ticket/10659): New [Enhanced Image](http://ckeditor.com/addon/image2) plugin that introduces a widget with integrated image captions, an option to center images, and dynamic "click and drag" resizing. +* [#10664](http://dev.ckeditor.com/ticket/10664): New [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin that introduces the MathJax widget. +* [#7987](https://dev.ckeditor.com/ticket/7987): New [Language](http://ckeditor.com/addon/language) plugin that implements Language toolbar button to support [WCAG 3.1.2 Language of Parts](http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html). +* [#10708](http://dev.ckeditor.com/ticket/10708): New [smileys](http://ckeditor.com/addon/smiley). + +## CKEditor 4.2.3 + +Fixed Issues: + +* [#10994](http://dev.ckeditor.com/ticket/10994): Fixed: Loading external jQuery library when opening the [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) sample directly from file. +* [#10975](http://dev.ckeditor.com/ticket/10975): [IE] Fixed: Error thrown while opening the color palette. +* [#9929](http://dev.ckeditor.com/ticket/9929): [Blink/WebKit] Fixed: A non-breaking space is created once a character is deleted and a regular space is typed. +* [#10963](http://dev.ckeditor.com/ticket/10963): Fixed: JAWS issue with the keyboard shortcut for [Magic Line](http://ckeditor.com/addon/magicline). +* [#11096](http://dev.ckeditor.com/ticket/11096): Fixed: TypeError: Object has no method 'is'. + +## CKEditor 4.2.2 + +Fixed Issues: + +* [#9314](http://dev.ckeditor.com/ticket/9314): Fixed: Incorrect error message on closing a dialog window without saving changs. +* [#10308](http://dev.ckeditor.com/ticket/10308): [IE10] Fixed: Unspecified error when deleting a row. +* [#10945](http://dev.ckeditor.com/ticket/10945): [Chrome] Fixed: Clicking with a mouse inside the editor does not show the caret. +* [#10912](http://dev.ckeditor.com/ticket/10912): Prevent default action when content of a non-editable link is clicked. +* [#10913](http://dev.ckeditor.com/ticket/10913): Fixed [`CKEDITOR.plugins.addExternal()`](http://docs.ckeditor.com/#!/api/CKEDITOR.resourceManager-method-addExternal) not handling paths including file name specified. +* [#10666](http://dev.ckeditor.com/ticket/10666): Fixed [`CKEDITOR.tools.isArray()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-isArray) not working cross frame. +* [#10910](http://dev.ckeditor.com/ticket/10910): [IE9] Fixed JavaScript error thrown in Compatibility Mode when clicking and/or typing in the editing area. +* [#10868](http://dev.ckeditor.com/ticket/10868): [IE8] Prevent the browser from crashing when applying the Inline Quotation style. +* [#10915](http://dev.ckeditor.com/ticket/10915): Fixed: Invalid CSS filter in the Kama skin. +* [#10914](http://dev.ckeditor.com/ticket/10914): Plugins [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock) are now included in the build configuration. +* [#10812](http://dev.ckeditor.com/ticket/10812): Fixed [`range.createBookmark2()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-createBookmark2) incorrectly normalizing offsets. This bug was causing many issues: [#10850](http://dev.ckeditor.com/ticket/10850), [#10842](http://dev.ckeditor.com/ticket/10842). +* [#10951](http://dev.ckeditor.com/ticket/10951): Reviewed and optimized focus handling on panels (combo, menu buttons, color buttons, and context menu) to enhance accessibility. Fixed [#10705](http://dev.ckeditor.com/ticket/10705), [#10706](http://dev.ckeditor.com/ticket/10706) and [#10707](http://dev.ckeditor.com/ticket/10707). +* [#10704](http://dev.ckeditor.com/ticket/10704): Fixed a JAWS issue with the Select Color dialog window title not being announced. +* [#10753](http://dev.ckeditor.com/ticket/10753): The floating toolbar in inline instances now has a dedicated accessibility label. + +## CKEditor 4.2.1 + +Fixed Issues: + +* [#10301](http://dev.ckeditor.com/ticket/10301): [IE9-10] Undo fails after 3+ consecutive paste actions with a JavaScript error. +* [#10689](http://dev.ckeditor.com/ticket/10689): Save toolbar button saves only the first editor instance. +* [#10368](http://dev.ckeditor.com/ticket/10368): Move language reading direction definition (`dir`) from main language file to core. +* [#9330](http://dev.ckeditor.com/ticket/9330): Fixed pasting anchors from MS Word. +* [#8103](http://dev.ckeditor.com/ticket/8103): Fixed pasting nested lists from MS Word. +* [#9958](http://dev.ckeditor.com/ticket/9958): [IE9] Pressing the "OK" button will trigger the `onbeforeunload` event in the popup dialog. +* [#10662](http://dev.ckeditor.com/ticket/10662): Fixed styles from the Styles drop-down list not registering to the ACF in case when the [Shared Spaces plugin](http://ckeditor.com/addon/sharedspace) is used. +* [#9654](http://dev.ckeditor.com/ticket/9654): Problems with Internet Explorer 10 Quirks Mode. +* [#9816](http://dev.ckeditor.com/ticket/9816): Floating toolbar does not reposition vertically in several cases. +* [#10646](http://dev.ckeditor.com/ticket/10646): Removing a selected sublist or nested table with *Backspace/Delete* removes the parent element. +* [#10623](http://dev.ckeditor.com/ticket/10623): [WebKit] Page is scrolled when opening a drop-down list. +* [#10004](http://dev.ckeditor.com/ticket/10004): [ChromeVox] Button names are not announced. +* [#10731](http://dev.ckeditor.com/ticket/10731): [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin breaks cloning of editor configuration. +* It is now possible to set per instance [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin configuration instead of setting the configuration globally. + +## CKEditor 4.2 + +**Important Notes:** + +* Dropped compatibility support for Internet Explorer 7 and Firefox 3.6. + +* Both the Basic and the Standard distribution packages will not contain the new [Indent Block](http://ckeditor.com/addon/indentblock) plugin. Because of this the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) might remove block indentations from existing contents. If you want to prevent this, either [add an appropriate ACF rule to your filter](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) or create a custom build based on the Basic/Standard package and add the Indent Block plugin in [CKBuilder](http://ckeditor.com/builder). + +New Features: + +* [#10027](http://dev.ckeditor.com/ticket/10027): Separated list and block indentation into two plugins: [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock). +* [#8244](http://dev.ckeditor.com/ticket/8244): Use *(Shift+)Tab* to indent and outdent lists. +* [#10281](http://dev.ckeditor.com/ticket/10281): The [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) is now available. Several jQuery-related issues fixed: [#8261](http://dev.ckeditor.com/ticket/8261), [#9077](http://dev.ckeditor.com/ticket/9077), [#8710](http://dev.ckeditor.com/ticket/8710), [#8530](http://dev.ckeditor.com/ticket/8530), [#9019](http://dev.ckeditor.com/ticket/9019), [#6181](http://dev.ckeditor.com/ticket/6181), [#7876](http://dev.ckeditor.com/ticket/7876), [#6906](http://dev.ckeditor.com/ticket/6906). +* [#10042](http://dev.ckeditor.com/ticket/10042): Introduced [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title) setting to change the human-readable title of the editor. +* [#9794](http://dev.ckeditor.com/ticket/9794): Added [`editor.onChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event. +* [#9923](http://dev.ckeditor.com/ticket/9923): HiDPI support in the editor UI. HiDPI icons for [Moono skin](http://ckeditor.com/addon/moono) added. +* [#8031](http://dev.ckeditor.com/ticket/8031): Handle `required` attributes on `<textarea>` elements — introduced [`editor.required`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-required) event. +* [#10280](http://dev.ckeditor.com/ticket/10280): Ability to replace `<textarea>` elements with the inline editor. + +Fixed Issues: + +* [#10599](http://dev.ckeditor.com/ticket/10599): [Indent](http://ckeditor.com/addon/indent) plugin is no longer required by the [List](http://ckeditor.com/addon/list) plugin. +* [#10370](http://dev.ckeditor.com/ticket/10370): Inconsistency in data events between framed and inline editors. +* [#10438](http://dev.ckeditor.com/ticket/10438): [FF, IE] No selection is done on an editable element on executing [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData). + +## CKEditor 4.1.3 + +New Features: + +* Added new translation: Indonesian. + +Fixed Issues: + +* [#10644](http://dev.ckeditor.com/ticket/10644): Fixed a critical bug when pasting plain text in Blink-based browsers. +* [#5189](http://dev.ckeditor.com/ticket/5189): [Find/Replace](http://ckeditor.com/addon/find) dialog window: rename "Cancel" button to "Close". +* [#10562](http://dev.ckeditor.com/ticket/10562): [Housekeeping] Unified CSS gradient filter formats in the [Moono](http://ckeditor.com/addon/moono) skin. +* [#10537](http://dev.ckeditor.com/ticket/10537): Advanced Content Filter should register a default rule for [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode). +* [#10610](http://dev.ckeditor.com/ticket/10610): [`CKEDITOR.dialog.addIframe()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-static-method-addIframe) incorrectly sets the iframe size in dialog windows. + +## CKEditor 4.1.2 + +New Features: + +* Added new translation: Sinhala. + +Fixed Issues: + +* [#10339](http://dev.ckeditor.com/ticket/10339): Fixed: Error thrown when inserted data was totally stripped out after filtering and processing. +* [#10298](http://dev.ckeditor.com/ticket/10298): Fixed: Data processor breaks attributes containing protected parts. +* [#10367](http://dev.ckeditor.com/ticket/10367): Fixed: [`editable.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertText) loses characters when `RegExp` replace controls are being inserted. +* [#10165](http://dev.ckeditor.com/ticket/10165): [IE] Access denied error when `document.domain` has been altered. +* [#9761](http://dev.ckeditor.com/ticket/9761): Update the *Backspace* key state in [`keystrokeHandler.blockedKeystrokes`](http://docs.ckeditor.com/#!/api/CKEDITOR.keystrokeHandler-property-blockedKeystrokes) when calling [`editor.setReadOnly()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly). +* [#6504](http://dev.ckeditor.com/ticket/6504): Fixed: Race condition while loading several [`config.customConfig`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-customConfig) files. +* [#10146](http://dev.ckeditor.com/ticket/10146): [Firefox] Empty lines are being removed while [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) is [`CKEDITOR.ENTER_BR`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-ENTER_BR). +* [#10360](http://dev.ckeditor.com/ticket/10360): Fixed: ARIA `role="application"` should not be used for dialog windows. +* [#10361](http://dev.ckeditor.com/ticket/10361): Fixed: ARIA `role="application"` should not be used for floating panels. +* [#10510](http://dev.ckeditor.com/ticket/10510): Introduced unique voice labels to differentiate between different editor instances. +* [#9945](http://dev.ckeditor.com/ticket/9945): [iOS] Scrolling not possible on iPad. +* [#10389](http://dev.ckeditor.com/ticket/10389): Fixed: Invalid HTML in the "Text and Table" template. +* [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin user interface was changed to match CKEditor 4 style. + +## CKEditor 4.1.1 + +New Features: + +* Added new translation: Albanian. + +Fixed Issues: + +* [#10172](http://dev.ckeditor.com/ticket/10172): Pressing *Delete* or *Backspace* in an empty table cell moves the cursor to the next/previous cell. +* [#10219](http://dev.ckeditor.com/ticket/10219): Error thrown when destroying an editor instance in parallel with a `mouseup` event. +* [#10265](http://dev.ckeditor.com/ticket/10265): Wrong loop type in the [File Browser](http://ckeditor.com/addon/filebrowser) plugin. +* [#10249](http://dev.ckeditor.com/ticket/10249): Wrong undo/redo states at start. +* [#10268](http://dev.ckeditor.com/ticket/10268): [Show Blocks](http://ckeditor.com/addon/showblocks) does not recover after switching to Source view. +* [#9995](http://dev.ckeditor.com/ticket/9995): HTML code in the `<textarea>` should not be modified by the [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor). +* [#10320](http://dev.ckeditor.com/ticket/10320): [Justify](http://ckeditor.com/addon/justify) plugin should add elements to Advanced Content Filter based on current [Enter mode](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode). +* [#10260](http://dev.ckeditor.com/ticket/10260): Fixed: Advanced Content Filter blocks [`tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces). Unified `data-cke-*` attributes filtering. +* [#10315](http://dev.ckeditor.com/ticket/10315): [WebKit] [Undo manager](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager) should not record snapshots after a filling character was added/removed. +* [#10291](http://dev.ckeditor.com/ticket/10291): [WebKit] Space after a filling character should be secured. +* [#10330](http://dev.ckeditor.com/ticket/10330): [WebKit] The filling character is not removed on `keydown` in specific cases. +* [#10285](http://dev.ckeditor.com/ticket/10285): Fixed: Styled text pasted from MS Word causes an infinite loop. +* [#10131](http://dev.ckeditor.com/ticket/10131): Fixed: [`undoManager.update()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-method-update) does not refresh the command state. +* [#10337](http://dev.ckeditor.com/ticket/10337): Fixed: Unable to remove `<s>` using [Remove Format](http://ckeditor.com/addon/removeformat). + +## CKEditor 4.1 + +Fixed Issues: + +* [#10192](http://dev.ckeditor.com/ticket/10192): Closing lists with the *Enter* key does not work with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) in several cases. +* [#10191](http://dev.ckeditor.com/ticket/10191): Fixed allowed content rules unification, so the [`filter.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-property-allowedContent) property always contains rules in the same format. +* [#10224](http://dev.ckeditor.com/ticket/10224): Advanced Content Filter does not remove non-empty `<a>` elements anymore. +* Minor issues in plugin integration with Advanced Content Filter: + * [#10166](http://dev.ckeditor.com/ticket/10166): Added transformation from the `align` attribute to `float` style to preserve backward compatibility after the introduction of Advanced Content Filter. + * [#10195](http://dev.ckeditor.com/ticket/10195): [Image](http://ckeditor.com/addon/image) plugin no longer registers rules for links to Advanced Content Filter. + * [#10213](http://dev.ckeditor.com/ticket/10213): [Justify](http://ckeditor.com/addon/justify) plugin is now correctly registering rules to Advanced Content Filter when [`config.justifyClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-justifyClasses) is defined. + +## CKEditor 4.1 RC + +New Features: + +* [#9829](http://dev.ckeditor.com/ticket/9829): Advanced Content Filter - data and features activation based on editor configuration. + + Brand new data filtering system that works in 2 modes: + + * Based on loaded features (toolbar items, plugins) - the data will be filtered according to what the editor in its + current configuration can handle. + * Based on [`config.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent) rules - the data + will be filtered and the editor features (toolbar items, commands, keystrokes) will be enabled if they are allowed. + + See the `datafiltering.html` sample, [guides](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) and [`CKEDITOR.filter` API documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.filter). +* [#9387](http://dev.ckeditor.com/ticket/9387): Reintroduced [Shared Spaces](http://ckeditor.com/addon/sharedspace) - the ability to display toolbar and bottom editor space in selected locations and to share them by different editor instances. +* [#9907](http://dev.ckeditor.com/ticket/9907): Added the [`contentPreview`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-contentPreview) event for preview data manipulation. +* [#9713](http://dev.ckeditor.com/ticket/9713): Introduced the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin that brings raw HTML editing for inline editor instances. +* Included in [#9829](http://dev.ckeditor.com/ticket/9829): Introduced new events, [`toHtml`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toHtml) and [`toDataFormat`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toDataFormat), allowing for better integration with data processing. +* [#9981](http://dev.ckeditor.com/ticket/9981): Added ability to filter [`htmlParser.fragment`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.fragment), [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element) etc. by many [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter)s before writing structure to an HTML string. +* Included in [#10103](http://dev.ckeditor.com/ticket/10103): + * Introduced the [`editor.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-status) property to make it easier to check the current status of the editor. + * Default [`command`](http://docs.ckeditor.com/#!/api/CKEDITOR.command) state is now [`CKEDITOR.TRISTATE_DISABLE`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-TRISTATE_DISABLED). It will be activated on [`editor.instanceReady`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-instanceReady) or immediately after being added if the editor is already initialized. +* [#9796](http://dev.ckeditor.com/ticket/9796): Introduced `<s>` as a default tag for strikethrough, which replaces obsolete `<strike>` in HTML5. + +## CKEditor 4.0.3 + +Fixed Issues: + +* [#10196](http://dev.ckeditor.com/ticket/10196): Fixed context menus not opening with keyboard shortcuts when [Autogrow](http://ckeditor.com/addon/autogrow) is enabled. +* [#10212](http://dev.ckeditor.com/ticket/10212): [IE7-10] Undo command throws errors after multiple switches between Source and WYSIWYG view. +* [#10219](http://dev.ckeditor.com/ticket/10219): [Inline editor] Error thrown after calling [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy). + +## CKEditor 4.0.2 + +Fixed Issues: + +* [#9779](http://dev.ckeditor.com/ticket/9779): Fixed overriding [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl) with `CKEDITOR_GETURL`. +* [#9772](http://dev.ckeditor.com/ticket/9772): Custom buttons in the dialog window footer have different look and size ([Moono](http://ckeditor.com/addon/moono), [Kama](http://ckeditor.com/addon/kama) skins). +* [#9029](http://dev.ckeditor.com/ticket/9029): Custom styles added with the [`stylesSet.add()`](http://docs.ckeditor.com/#!/api/CKEDITOR.stylesSet-method-add) are displayed in the wrong order. +* [#9887](http://dev.ckeditor.com/ticket/9887): Disable [Magic Line](http://ckeditor.com/addon/magicline) when [`editor.readOnly`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) is set. +* [#9882](http://dev.ckeditor.com/ticket/9882): Fixed empty document title on [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) if set via the Document Properties dialog window. +* [#9773](http://dev.ckeditor.com/ticket/9773): Fixed rendering problems with selection fields in the Kama skin. +* [#9851](http://dev.ckeditor.com/ticket/9851): The [`selectionChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-selectionChange) event is not fired when mouse selection ended outside editable. +* [#9903](http://dev.ckeditor.com/ticket/9903): [Inline editor] Bad positioning of floating space with page horizontal scroll. +* [#9872](http://dev.ckeditor.com/ticket/9872): [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) returns `true` when called onload. Removed the obsolete `editor.mayBeDirty` flag. +* [#9893](http://dev.ckeditor.com/ticket/9893): [IE] Fixed broken toolbar when editing mixed direction content in Quirks mode. +* [#9845](http://dev.ckeditor.com/ticket/9845): Fixed TAB navigation in the [Link](http://ckeditor.com/addon/link) dialog window when the Anchor option is used and no anchors are available. +* [#9883](http://dev.ckeditor.com/ticket/9883): Maximizing was making the entire page editable with [divarea](http://ckeditor.com/addon/divarea)-based editors. +* [#9940](http://dev.ckeditor.com/ticket/9940): [Firefox] Navigating back to a page with the editor was making the entire page editable. +* [#9966](http://dev.ckeditor.com/ticket/9966): Fixed: Unable to type square brackets with French keyboard layout. Changed [Magic Line](http://ckeditor.com/addon/magicline) keystrokes. +* [#9507](http://dev.ckeditor.com/ticket/9507): [Firefox] Selection is moved before editable position when the editor is focused for the first time. +* [#9947](http://dev.ckeditor.com/ticket/9947): [WebKit] Editor overflows parent container in some edge cases. +* [#10105](http://dev.ckeditor.com/ticket/10105): Fixed: Broken [sourcearea](http://ckeditor.com/addon/sourcearea) view when an RTL language is set. +* [#10123](http://dev.ckeditor.com/ticket/10123): [WebKit] Fixed: Several dialog windows have broken layout since the latest WebKit release. +* [#10152](http://dev.ckeditor.com/ticket/10152): Fixed: Invalid ARIA property used on menu items. + +## CKEditor 4.0.1.1 + +Fixed Issues: + +* Security update: Added protection against XSS attack and possible path disclosure in the PHP sample. + +## CKEditor 4.0.1 + +Fixed Issues: + +* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in the new [Moono skin](http://ckeditor.com/addon/moono). +* Accessibility issues (mainly in inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844). +* [Magic Line](http://ckeditor.com/addon/magicline) plugin: + * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic Line. + * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic Line support for forms. + * [#9573](http://dev.ckeditor.com/ticket/9573): Magic Line does not disappear on `mouseout` in a specific case. +* [#9754](http://dev.ckeditor.com/ticket/9754): [WebKit] Cutting & pasting simple unformatted text generates an inline wrapper in WebKit browsers. +* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS Word. +* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging. +* Context menu: + * [#9712](http://dev.ckeditor.com/ticket/9712): Opening the context menu destroys editor focus. + * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over the floating toolbar. + * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates a JavaScript error in inline mode when the editor is attached to a header element. +* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing the window. +* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div-based editor puts the editing area under the bottom UI space. +* [#9528](http://dev.ckeditor.com/ticket/9528): Host page `box-sizing` style should not influence the editor UI elements. +* [#9503](http://dev.ckeditor.com/ticket/9503): [Form Elements](http://ckeditor.com/addon/forms) plugin adds context menu listeners only on supported input types. Added support for `tel`, `email`, `search` and `url` input types. +* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in a narrow window. +* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog window does not populate width correctly. +* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in a nested table removes the outer table cell. +* [#9815](http://dev.ckeditor.com/ticket/9815): Cannot edit dialog window fields in an editor initialized in the jQuery UI modal dialog. +* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialog windows do not show completely in a small window. +* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a `<div>` element stay permanently even after the user exits editing the `<div>`. +* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing the Format drop-down list by clicking its button. +* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when the `border-width` style is specified. +* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read-only mode. +* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected images. +* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>` elements. +* [#9709](http://dev.ckeditor.com/ticket/9709): [Paste from Word](http://ckeditor.com/addon/pastefromword) should not depend on configuration from other styles. +* [#9726](http://dev.ckeditor.com/ticket/9726): Removed [Color Dialog](http://ckeditor.com/addon/colordialog) plugin dependency from [Table Tools](http://ckeditor.com/addon/tabletools). +* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly in the [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp) dialog window. +* [#9771](http://dev.ckeditor.com/ticket/9771): [WebKit & Opera] Fixed scrolling issues when pasting. +* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] `onChange` is not fired for checkboxes in dialogs. +* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When opening a toolbar menu for the first time and pressing the *Down Arrow* key, focus goes to the next toolbar button instead of the menu options. +* [#9847](http://dev.ckeditor.com/ticket/9847): [Elements Path](http://ckeditor.com/addon/elementspath) should not be initialized in the inline editor. +* [#9853](http://dev.ckeditor.com/ticket/9853): [`editor.addRemoveFormatFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addRemoveFormatFilter) is exposed before it really works. +* [#8893](http://dev.ckeditor.com/ticket/8893): Value of the [`pasteFromWordCleanupFile`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFromWordCleanupFile) configuration option is now taken from the instance configuration. +* [#9693](http://dev.ckeditor.com/ticket/9693): Removed "Live Preview" checkbox from UI color picker. + + +## CKEditor 4.0 + +The first stable release of the new CKEditor 4 code line. + +The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever +possible. The list of relevant changes can be found in the [API Changes page of +the CKEditor 4 documentation][1]. + +[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes" diff --git a/scripts/ckeditor/LICENSE.md b/scripts/ckeditor/LICENSE.md new file mode 100755 index 00000000..afc4a3cd --- /dev/null +++ b/scripts/ckeditor/LICENSE.md @@ -0,0 +1,1274 @@ +Software License Agreement +========================== + +CKEditor - The text editor for Internet - http://ckeditor.com +Copyright (c) 2003-2014, CKSource - 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 + (See Appendix A) + + - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + http://www.gnu.org/licenses/lgpl.html + (See Appendix B) + + - Mozilla Public License Version 1.1 or later (the "MPL") + http://www.mozilla.org/MPL/MPL-1.1.html + (See Appendix C) + +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. In any case, your choice will not restrict any +recipient of your version of this software to use, reproduce, modify +and distribute this software under any of the above licenses. + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by +CKSource engineers and consists of CKSource-owned intellectual +property. In some specific instances, CKEditor will incorporate work +done by developers outside of CKSource with their express permission. + +(Ignore this line: %REMOVE_START%) + +Software available at our repository and developer version only: + +JavaScript Lint: At _dev/_thirdparty/jsl can be found the executable +files of JavaScript Lint, which are licensed under the terms of the +Mozilla Public License Version 1.1 (http://www.mozilla.org/MPL/). +JavaScript Lint is Copyright (c) 2006 Matthias Miller. + +(Ignore this line: %REMOVE_END%) +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. + +--- + +Appendix A: The GPL License +--------------------------- + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software-to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix B: The LGPL License +---------------------------- + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software-to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages-typically libraries-of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +GNU LESSER GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix C: The MPL License +--------------------------- + +MOZILLA PUBLIC LICENSE +Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/scripts/ckeditor/README.md b/scripts/ckeditor/README.md new file mode 100755 index 00000000..c5a55cd8 --- /dev/null +++ b/scripts/ckeditor/README.md @@ -0,0 +1,39 @@ +CKEditor 4 +========== + +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +http://ckeditor.com - See LICENSE.md for license information. + +CKEditor is a text editor to be used inside web pages. It's not a replacement +for desktop text editors like Word or OpenOffice, but a component to be used as +part of web applications and websites. + +## Documentation + +The full editor documentation is available online at the following address: +http://docs.ckeditor.com + +## Installation + +Installing CKEditor is an easy task. Just follow these simple steps: + + 1. **Download** the latest version from the CKEditor website: + http://ckeditor.com. You should have already completed this step, but be + sure you have the very latest version. + 2. **Extract** (decompress) the downloaded file into the root of your website. + +**Note:** CKEditor is by default installed in the `ckeditor` folder. You can +place the files in whichever you want though. + +## Checking Your Installation + +The editor comes with a few sample pages that can be used to verify that +installation proceeded properly. Take a look at the `samples` directory. + +To test your installation, just call the following page at your website: + + http://<your site>/<CKEditor installation path>/samples/index.html + +For example: + + http://www.example.com/ckeditor/samples/index.html diff --git a/scripts/ckeditor/bender.js b/scripts/ckeditor/bender.js new file mode 100755 index 00000000..d80231f3 --- /dev/null +++ b/scripts/ckeditor/bender.js @@ -0,0 +1,117 @@ +'use strict'; + +var config = { + + applications: { + ckeditor: { + path: '.', + files: [ + 'ckeditor.js' + ] + } + }, + + assertion: 'yui', + + plugins: [ + 'benderjs-yui', + 'benderjs-jquery', + 'benderjs-ckeditor' + ], + + tests: { + 'Adapters': { + applications: [ 'ckeditor' ], + basePath: 'tests/', + paths: [ + 'adapters/', + '!/_' + ], + jquery: [ '1.7', '1.7.2', '1.8.3', '1.9.1', '1.10.2', '2.0.0' ] + }, + + 'Core': { + applications: [ 'ckeditor' ], + basePath: 'tests/', + paths: [ + 'core/', + '!/_' + ], + regressions: { + // IE8 (#11242) + 'tests/core/style/editor#test apply inline style on non-editable inline element - at non-editable inline boundary': 'env.ie && env.version == 8', + 'tests/core/style/editor#test remove inline style from non-editable inline element - at non-editable inline boundary': 'env.ie && env.version == 8', + + // IE8 (fails only in testing env - window.window === window gives false) + 'tests/core/tools#test_clone_Window': 'env.ie && env.version == 8', + + // Safari (#11111) + 'tests/core/dom/range/enlarge#test_enlarge_element12': 'env.safari', + + // Safari (#11980) + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace #2': 'env.safari', + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace #3': 'env.safari', + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace #9': 'env.safari', + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #2': 'env.safari', + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #3': 'env.safari', + 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #8': 'env.safari', + + // Firefox (#12104) + 'tests/core/editor/focus#test blur after setData': 'env.gecko' + } + }, + + 'Plugins': { + applications: [ 'ckeditor' ], + basePath: 'tests/', + paths: [ + 'plugins/', + '!/_' + ], + regressions: { + // IE10 + 'tests/plugins/ajax/ajax#test_loadXml_sync': 'env.ie && env.version > 9', + 'tests/plugins/ajax/ajax#test_loadXml_async': 'env.ie && env.version > 9', + + // IE8 (#11242) + 'tests/plugins/indent/indent#test indent next to inline non-editable': 'env.ie && env.version == 8', + + // IE8 (#11055) + 'tests/plugins/widget/nestededitables#test pasting widget which was copied (d&d) when its nested editable was focused': 'env.ie && env.version == 8', + + // Firefox (#11399) + 'tests/plugins/widget/nestededitables#test selection in nested editable is preserved after opening and closing dialog - inline editor': 'env.gecko', + + // Firefox (#12104) + 'tests/plugins/widget/widgetselection#test focusing widget': 'env.gecko', + 'tests/plugins/widget/widgetselection#test focusing by click': 'env.gecko', + 'tests/plugins/widget/widgetselection#test focus editor when focusing widget by click': 'env.gecko', + 'tests/plugins/widget/widgetselection#test focus editor when focusing widget by method': 'env.gecko' + } + }, + + 'Tickets': { + applications: [ 'ckeditor' ], + basePath: 'tests/', + paths: [ + 'tickets/', + '!/_' + ], + regressions: { + // IE8 & IE9 have problems with loading iframe. + 'tests/tickets/11121/1#test HC detection in hidden iframe': 'env.ie && env.version < 10' + } + }, + + 'Utils': { + applications: [ 'ckeditor' ], + basePath: 'tests/', + paths: [ + 'utils/', + '!/_' + ] + } + } +}; + +module.exports = config; \ No newline at end of file diff --git a/scripts/ckeditor/build-config.js b/scripts/ckeditor/build-config.js new file mode 100755 index 00000000..e446f47f --- /dev/null +++ b/scripts/ckeditor/build-config.js @@ -0,0 +1,112 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * This file was added automatically by CKEditor builder. + * You may re-use it at any time to build CKEditor again. + * + * If you would like to build CKEditor online again + * (for example to upgrade), visit one the following links: + * + * (1) http://ckeditor.com/builder + * Visit online builder to build CKEditor from scratch. + * + * (2) http://ckeditor.com/builder/1113842bdc54a1d62d9d96eac156fd49 + * Visit online builder to build CKEditor, starting with the same setup as before. + * + * (3) http://ckeditor.com/builder/download/1113842bdc54a1d62d9d96eac156fd49 + * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before. + * + * NOTE: + * This file is not used by CKEditor, you may remove it. + * Changing this file will not change your CKEditor configuration. + */ + +var CKBUILDER_CONFIG = { + skin: 'moono', + preset: 'full', + ignore: [ + '.bender', + '.DS_Store', + '.gitignore', + '.gitattributes', + '.idea', + '.mailmap', + 'bender.js', + 'bender-err.log', + 'bender-out.log', + 'dev', + 'node_modules', + 'package.json', + 'README.md', + 'tests' + ], + plugins : { + 'a11yhelp' : 1, + 'about' : 1, + 'basicstyles' : 1, + 'bidi' : 1, + 'blockquote' : 1, + 'clipboard' : 1, + 'colorbutton' : 1, + 'colordialog' : 1, + 'contextmenu' : 1, + 'dialogadvtab' : 1, + 'div' : 1, + 'elementspath' : 1, + 'enterkey' : 1, + 'entities' : 1, + 'filebrowser' : 1, + 'find' : 1, + 'flash' : 1, + 'floatingspace' : 1, + 'font' : 1, + 'format' : 1, + 'forms' : 1, + 'horizontalrule' : 1, + 'htmlwriter' : 1, + 'iframe' : 1, + 'image' : 1, + 'image2' : 1, + 'imagepaste' : 1, + 'indentblock' : 1, + 'indentlist' : 1, + 'justify' : 1, + 'language' : 1, + 'link' : 1, + 'list' : 1, + 'liststyle' : 1, + 'magicline' : 1, + 'maximize' : 1, + 'newpage' : 1, + 'pagebreak' : 1, + 'pastefromword' : 1, + 'pastetext' : 1, + 'preview' : 1, + 'print' : 1, + 'removeformat' : 1, + 'resize' : 1, + 'save' : 1, + 'scayt' : 1, + 'selectall' : 1, + 'showblocks' : 1, + 'showborders' : 1, + 'smiley' : 1, + 'sourcearea' : 1, + 'specialchar' : 1, + 'stylescombo' : 1, + 'tab' : 1, + 'table' : 1, + 'tabletools' : 1, + 'templates' : 1, + 'toolbar' : 1, + 'undo' : 1, + 'wsc' : 1, + 'wysiwygarea' : 1 + }, + languages : { + 'en' : 1 + } +}; \ No newline at end of file diff --git a/scripts/ckeditor/ckeditor.js b/scripts/ckeditor/ckeditor.js new file mode 100755 index 00000000..abb087d1 --- /dev/null +++ b/scripts/ckeditor/ckeditor.js @@ -0,0 +1,42 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// Compressed version of core/ckeditor_base.js. See original for instructions. +/*jsl:ignore*/ +window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"",version:"%VERSION%",revision:"%REV%",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),c=0;c<b.length;c++){var d=b[c].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(d){a=d[1];break}}-1==a.indexOf(":/")&&"//"!=a.slice(0,2)&&(a=0===a.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+a:location.href.match(/^[^\?]*\/(?:)/)[0]+a);if(!a)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return a}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&"/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a)&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",a,!1),b()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),b())}catch(d){}}function b(){for(var a;a=c.shift();)a()}var c=[];return function(b){c.push(b);"complete"===document.readyState&&setTimeout(a,1);if(1==c.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",a);window.attachEvent("onload",a);b=!1;try{b=!window.frameElement}catch(e){}if(document.documentElement.doScroll&&b){var f=function(){try{document.documentElement.doScroll("left")}catch(b){setTimeout(f,1);return}a()};f()}}}}()},e=window.CKEDITOR_GETURL;if(e){var g=b.getUrl;b.getUrl=function(a){return e.call(b,a)||g.call(b,a)}}return b}()); +/*jsl:end*/ + +if ( CKEDITOR.loader ) + CKEDITOR.loader.load( 'ckeditor' ); +else { + // Set the script name to be loaded by the loader. + CKEDITOR._autoLoad = 'ckeditor'; + + // Include the loader script. + if ( document.body && ( !document.readyState || document.readyState == 'complete' ) ) { + var script = document.createElement( 'script' ); + script.type = 'text/javascript'; + script.src = CKEDITOR.getUrl( 'core/loader.js' ); + document.body.appendChild( script ); + } else + document.write( '<script type="text/javascript" src="' + CKEDITOR.getUrl( 'core/loader.js' ) + '"></script>' ); + +} + +/** + * The skin to load for all created instances, it may be the name of the skin + * folder inside the editor installation path, or the name and the path separated + * by a comma. + * + * **Note:** This is a global configuration that applies to all instances. + * + * CKEDITOR.skinName = 'moono'; + * + * CKEDITOR.skinName = 'myskin,/customstuff/myskin/'; + * + * @cfg {String} [skinName='moono'] + * @member CKEDITOR + */ +CKEDITOR.skinName = 'moono'; diff --git a/scripts/ckeditor/config.js b/scripts/ckeditor/config.js new file mode 100755 index 00000000..d7e28f2e --- /dev/null +++ b/scripts/ckeditor/config.js @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + +CKEDITOR.editorConfig = function( config ) { + + // %REMOVE_START% + // The configuration options below are needed when running CKEditor from source files. + config.plugins = 'dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,horizontalrule,htmlwriter,iframe,wysiwygarea,image,indent,indentblock,indentlist,smiley,justify,menubutton,language,link,list,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,scayt,stylescombo,tab,table,tabletools,undo,wsc,lineutils,widget,image2,imagepaste'; + config.skin = 'moono'; + // %REMOVE_END% + + // Define changes to default configuration here. For example: + // config.language = 'fr'; + // config.uiColor = '#AADC6E'; + config.customConfig = '../ckeditor-config.js' +}; diff --git a/scripts/ckeditor/contents.css b/scripts/ckeditor/contents.css new file mode 100755 index 00000000..c19bcf58 --- /dev/null +++ b/scripts/ckeditor/contents.css @@ -0,0 +1,134 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ + +body +{ + /* Font */ + font-family: sans-serif, Arial, Verdana, "Trebuchet MS"; + font-size: 12px; + + /* Text color */ + color: #333; + + /* Remove the background color to make it transparent */ + background-color: #fff; + + margin: 20px; +} + +.cke_editable +{ + font-size: 13px; + line-height: 1.6; +} + +blockquote +{ + font-style: italic; + font-family: Georgia, Times, "Times New Roman", serif; + padding: 2px 0; + border-style: solid; + border-color: #ccc; + border-width: 0; +} + +.cke_contents_ltr blockquote +{ + padding-left: 20px; + padding-right: 8px; + border-left-width: 5px; +} + +.cke_contents_rtl blockquote +{ + padding-left: 8px; + padding-right: 20px; + border-right-width: 5px; +} + +a +{ + color: #0782C1; +} + +ol,ul,dl +{ + /* IE7: reset rtl list margin. (#7334) */ + *margin-right: 0px; + /* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/ + padding: 0 40px; +} + +h1,h2,h3,h4,h5,h6 +{ + font-weight: normal; + line-height: 1.2; +} + +hr +{ + border: 0px; + border-top: 1px solid #ccc; +} + +img.right +{ + border: 1px solid #ccc; + float: right; + margin-left: 15px; + padding: 5px; +} + +img.left +{ + border: 1px solid #ccc; + float: left; + margin-right: 15px; + padding: 5px; +} + +pre +{ + white-space: pre-wrap; /* CSS 2.1 */ + word-wrap: break-word; /* IE7 */ + -moz-tab-size: 4; + -o-tab-size: 4; + -webkit-tab-size: 4; + tab-size: 4; +} + +.marker +{ + background-color: Yellow; +} + +span[lang] +{ + font-style: italic; +} + +figure +{ + text-align: center; + border: solid 1px #ccc; + border-radius: 2px; + background: rgba(0,0,0,0.05); + padding: 10px; + margin: 10px 20px; + display: inline-block; +} + +figure > figcaption +{ + text-align: center; + display: block; /* For IE8 */ +} + +a > img { + padding: 1px; + margin: 1px; + border: none; + outline: 1px solid #0782C1; +} \ No newline at end of file diff --git a/scripts/ckeditor/core/_bootstrap.js b/scripts/ckeditor/core/_bootstrap.js new file mode 100755 index 00000000..d6802af5 --- /dev/null +++ b/scripts/ckeditor/core/_bootstrap.js @@ -0,0 +1,74 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview API initialization code. + */ + +( function() { + // Disable HC detection in WebKit. (#5429) + if ( CKEDITOR.env.webkit ) + CKEDITOR.env.hc = false; + else { + // Check whether high contrast is active by creating a colored border. + var hcDetect = CKEDITOR.dom.element.createFromHtml( '<div style="width:0;height:0;position:absolute;left:-10000px;' + + 'border:1px solid;border-color:red blue"></div>', CKEDITOR.document ); + + hcDetect.appendTo( CKEDITOR.document.getHead() ); + + // Update CKEDITOR.env. + // Catch exception needed sometimes for FF. (#4230) + try { + var top = hcDetect.getComputedStyle( 'border-top-color' ), + right = hcDetect.getComputedStyle( 'border-right-color' ); + + // We need to check if getComputedStyle returned any value, because on FF + // it returnes empty string if CKEditor is loaded in hidden iframe. (#11121) + CKEDITOR.env.hc = !!( top && top == right ); + } catch ( e ) { + CKEDITOR.env.hc = false; + } + + hcDetect.remove(); + } + + if ( CKEDITOR.env.hc ) + CKEDITOR.env.cssClass += ' cke_hc'; + + // Initially hide UI spaces when relevant skins are loading, later restored by skin css. + CKEDITOR.document.appendStyleText( '.cke{visibility:hidden;}' ); + + // Mark the editor as fully loaded. + CKEDITOR.status = 'loaded'; + CKEDITOR.fireOnce( 'loaded' ); + + // Process all instances created by the "basic" implementation. + var pending = CKEDITOR._.pending; + if ( pending ) { + delete CKEDITOR._.pending; + + for ( var i = 0; i < pending.length; i++ ) { + CKEDITOR.editor.prototype.constructor.apply( pending[ i ][ 0 ], pending[ i ][ 1 ] ); + CKEDITOR.add( pending[ i ][ 0 ] ); + } + } +} )(); + +/** + * Indicates that CKEditor is running on a High Contrast environment. + * + * if ( CKEDITOR.env.hc ) + * alert( 'You\'re running on High Contrast mode. The editor interface will get adapted to provide you a better experience.' ); + * + * @property {Boolean} hc + * @member CKEDITOR.env + */ + +/** + * Fired when a CKEDITOR core object is fully loaded and ready for interaction. + * + * @event loaded + * @member CKEDITOR + */ diff --git a/scripts/ckeditor/core/ckeditor.js b/scripts/ckeditor/core/ckeditor.js new file mode 100755 index 00000000..aaa37d35 --- /dev/null +++ b/scripts/ckeditor/core/ckeditor.js @@ -0,0 +1,204 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Contains the third and last part of the {@link CKEDITOR} object + * definition. + */ + +/** @class CKEDITOR */ + +// Remove the CKEDITOR.loadFullCore reference defined on ckeditor_basic. +delete CKEDITOR.loadFullCore; + +/** + * Stores references to all editor instances created. The name of the properties + * in this object correspond to instance names, and their values contain the + * {@link CKEDITOR.editor} object representing them. + * + * alert( CKEDITOR.instances.editor1.name ); // 'editor1' + * + * @property {Object} + */ +CKEDITOR.instances = {}; + +/** + * The document of the window storing the CKEDITOR object. + * + * alert( CKEDITOR.document.getBody().getName() ); // 'body' + * + * @property {CKEDITOR.dom.document} + */ +CKEDITOR.document = new CKEDITOR.dom.document( document ); + +/** + * Adds an editor instance to the global {@link CKEDITOR} object. This function + * is available for internal use mainly. + * + * @param {CKEDITOR.editor} editor The editor instance to be added. + */ +CKEDITOR.add = function( editor ) { + CKEDITOR.instances[ editor.name ] = editor; + + editor.on( 'focus', function() { + if ( CKEDITOR.currentInstance != editor ) { + CKEDITOR.currentInstance = editor; + CKEDITOR.fire( 'currentInstance' ); + } + } ); + + editor.on( 'blur', function() { + if ( CKEDITOR.currentInstance == editor ) { + CKEDITOR.currentInstance = null; + CKEDITOR.fire( 'currentInstance' ); + } + } ); + + CKEDITOR.fire( 'instance', null, editor ); +}; + +/** + * Removes an editor instance from the global {@link CKEDITOR} object. This function + * is available for internal use only. External code must use {@link CKEDITOR.editor#method-destroy}. + * + * @private + * @param {CKEDITOR.editor} editor The editor instance to be removed. + */ +CKEDITOR.remove = function( editor ) { + delete CKEDITOR.instances[ editor.name ]; +}; + +( function() { + var tpls = {}; + + /** + * Adds a named {@link CKEDITOR.template} instance to be reused among all editors. + * This will return the existing one if a template with same name is already + * defined. Additionally, it fires the "template" event to allow template source customization. + * + * @param {String} name The name which identifies a UI template. + * @param {String} source The source string for constructing this template. + * @returns {CKEDITOR.template} The created template instance. + */ + CKEDITOR.addTemplate = function( name, source ) { + var tpl = tpls[ name ]; + if ( tpl ) + return tpl; + + // Make it possible to customize the template through event. + var params = { name: name, source: source }; + CKEDITOR.fire( 'template', params ); + + return ( tpls[ name ] = new CKEDITOR.template( params.source ) ); + }; + + /** + * Retrieves a defined template created with {@link CKEDITOR#addTemplate}. + * + * @param {String} name The template name. + */ + CKEDITOR.getTemplate = function( name ) { + return tpls[ name ]; + }; +} )(); + +( function() { + var styles = []; + + /** + * Adds CSS rules to be appended to the editor document. + * This method is mostly used by plugins to add custom styles to the editor + * document. For basic content styling the `contents.css` file should be + * used instead. + * + * **Note:** This function should be called before the creation of editor instances. + * + * // Add styles for all headings inside editable contents. + * CKEDITOR.addCss( '.cke_editable h1,.cke_editable h2,.cke_editable h3 { border-bottom: 1px dotted red }' ); + * + * @param {String} css The style rules to be appended. + * @see CKEDITOR.config#contentsCss + */ + CKEDITOR.addCss = function( css ) { + styles.push( css ); + }; + + /** + * Returns a string will all CSS rules passed to the {@link CKEDITOR#addCss} method. + * + * @returns {String} A string containing CSS rules. + */ + CKEDITOR.getCss = function() { + return styles.join( '\n' ); + }; +} )(); + +// Perform global clean up to free as much memory as possible +// when there are no instances left +CKEDITOR.on( 'instanceDestroyed', function() { + if ( CKEDITOR.tools.isEmpty( this.instances ) ) + CKEDITOR.fire( 'reset' ); +} ); + +// Load the bootstrap script. +CKEDITOR.loader.load( '_bootstrap' ); // %REMOVE_LINE% + +// Tri-state constants. +/** + * Used to indicate the ON or ACTIVE state. + * + * @readonly + * @property {Number} [=1] + */ +CKEDITOR.TRISTATE_ON = 1; + +/** + * Used to indicate the OFF or INACTIVE state. + * + * @readonly + * @property {Number} [=2] + */ +CKEDITOR.TRISTATE_OFF = 2; + +/** + * Used to indicate the DISABLED state. + * + * @readonly + * @property {Number} [=0] + */ +CKEDITOR.TRISTATE_DISABLED = 0; + +/** + * The editor which is currently active (has user focus). + * + * function showCurrentEditorName() { + * if ( CKEDITOR.currentInstance ) + * alert( CKEDITOR.currentInstance.name ); + * else + * alert( 'Please focus an editor first.' ); + * } + * + * @property {CKEDITOR.editor} currentInstance + * @see CKEDITOR#event-currentInstance + */ + +/** + * Fired when the CKEDITOR.currentInstance object reference changes. This may + * happen when setting the focus on different editor instances in the page. + * + * var editor; // A variable to store a reference to the current editor. + * CKEDITOR.on( 'currentInstance', function() { + * editor = CKEDITOR.currentInstance; + * } ); + * + * @event currentInstance + */ + +/** + * Fired when the last instance has been destroyed. This event is used to perform + * global memory cleanup. + * + * @event reset + */ diff --git a/scripts/ckeditor/core/ckeditor_base.js b/scripts/ckeditor/core/ckeditor_base.js new file mode 100755 index 00000000..06979317 --- /dev/null +++ b/scripts/ckeditor/core/ckeditor_base.js @@ -0,0 +1,315 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Contains the first and essential part of the {@link CKEDITOR} + * object definition. + */ + +// #### Compressed Code +// Must be updated on changes in the script as well as updated in the ckeditor.js file. + +// window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"",version:"%VERSION%",revision:"%REV%",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),c=0;c<b.length;c++){var d=b[c].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(d){a=d[1];break}}-1==a.indexOf(":/")&&"//"!=a.slice(0,2)&&(a=0===a.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+a:location.href.match(/^[^\?]*\/(?:)/)[0]+a);if(!a)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return a}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&"/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a)&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",a,!1),b()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),b())}catch(d){}}function b(){for(var a;a=c.shift();)a()}var c=[];return function(b){c.push(b);"complete"===document.readyState&&setTimeout(a,1);if(1==c.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",a);window.attachEvent("onload",a);b=!1;try{b=!window.frameElement}catch(e){}if(document.documentElement.doScroll&&b){var f=function(){try{document.documentElement.doScroll("left")}catch(b){setTimeout(f,1);return}a()};f()}}}}()},e=window.CKEDITOR_GETURL;if(e){var g=b.getUrl;b.getUrl=function(a){return e.call(b,a)||g.call(b,a)}}return b}()); +// The Closure Compiler online service should be used when updating this manually: +// http://closure-compiler.appspot.com/ + +// #### Raw code +// ATTENTION: read the above "Compressed Code" notes when changing this code. + +if ( !window.CKEDITOR ) { + /** + * This is the API entry point. The entire CKEditor code runs under this object. + * @class CKEDITOR + * @singleton + */ + window.CKEDITOR = ( function() { + var CKEDITOR = { + + /** + * A constant string unique for each release of CKEditor. Its value + * is used, by default, to build the URL for all resources loaded + * by the editor code, guaranteeing clean cache results when + * upgrading. + * + * alert( CKEDITOR.timestamp ); // e.g. '87dm' + */ + timestamp: '', // %REMOVE_LINE% + /* // %REMOVE_LINE% + // The production implementation contains a fixed timestamp, unique + // for each release and generated by the releaser. + // (Base 36 value of each component of YYMMDDHH - 4 chars total - e.g. 87bm == 08071122) + timestamp: '%TIMESTAMP%', + */ // %REMOVE_LINE% + + /** + * Contains the CKEditor version number. + * + * alert( CKEDITOR.version ); // e.g. 'CKEditor 3.4.1' + */ + version: '%VERSION%', + + /** + * Contains the CKEditor revision number. + * The revision number is incremented automatically, following each + * modification to the CKEditor source code. + * + * alert( CKEDITOR.revision ); // e.g. '3975' + */ + revision: '%REV%', + + /** + * A 3-digit random integer, valid for the entire life of the CKEDITOR object. + * + * alert( CKEDITOR.rnd ); // e.g. 319 + * + * @property {Number} + */ + rnd: Math.floor( Math.random() * ( 999 /*Max*/ - 100 /*Min*/ + 1 ) ) + 100 /*Min*/, + + /** + * Private object used to hold core stuff. It should not be used outside of + * the API code as properties defined here may change at any time + * without notice. + * + * @private + */ + _: { + pending: [] + }, + + /** + * Indicates the API loading status. The following statuses are available: + * + * * **unloaded**: the API is not yet loaded. + * * **basic_loaded**: the basic API features are available. + * * **basic_ready**: the basic API is ready to load the full core code. + * * **loaded**: the API can be fully used. + * + * Example: + * + * if ( CKEDITOR.status == 'loaded' ) { + * // The API can now be fully used. + * doSomething(); + * } else { + * // Wait for the full core to be loaded and fire its loading. + * CKEDITOR.on( 'load', doSomething ); + * CKEDITOR.loadFullCore && CKEDITOR.loadFullCore(); + * } + */ + status: 'unloaded', + + /** + * The full URL for the CKEditor installation directory. + * It is possible to manually provide the base path by setting a + * global variable named `CKEDITOR_BASEPATH`. This global variable + * must be set **before** the editor script loading. + * + * alert( CKEDITOR.basePath ); // e.g. 'http://www.example.com/ckeditor/' + * + * @property {String} + */ + basePath: ( function() { + // ATTENTION: fixes to this code must be ported to + // var basePath in "core/loader.js". + + // Find out the editor directory path, based on its <script> tag. + var path = window.CKEDITOR_BASEPATH || ''; + + if ( !path ) { + var scripts = document.getElementsByTagName( 'script' ); + + for ( var i = 0; i < scripts.length; i++ ) { + var match = scripts[ i ].src.match( /(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i ); + + if ( match ) { + path = match[ 1 ]; + break; + } + } + } + + // In IE (only) the script.src string is the raw value entered in the + // HTML source. Other browsers return the full resolved URL instead. + if ( path.indexOf( ':/' ) == -1 && path.slice( 0, 2 ) != '//' ) { + // Absolute path. + if ( path.indexOf( '/' ) === 0 ) + path = location.href.match( /^.*?:\/\/[^\/]*/ )[ 0 ] + path; + // Relative path. + else + path = location.href.match( /^[^\?]*\/(?:)/ )[ 0 ] + path; + } + + if ( !path ) + throw 'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.'; + + return path; + } )(), + + /** + * Gets the full URL for CKEditor resources. By default, URLs + * returned by this function contain a querystring parameter ("t") + * set to the {@link CKEDITOR#timestamp} value. + * + * It is possible to provide a custom implementation of this + * function by setting a global variable named `CKEDITOR_GETURL`. + * This global variable must be set **before** the editor script + * loading. If the custom implementation returns nothing (`==null`), the + * default implementation is used. + * + * // e.g. 'http://www.example.com/ckeditor/skins/default/editor.css?t=87dm' + * alert( CKEDITOR.getUrl( 'skins/default/editor.css' ) ); + * + * // e.g. 'http://www.example.com/skins/default/editor.css?t=87dm' + * alert( CKEDITOR.getUrl( '/skins/default/editor.css' ) ); + * + * // e.g. 'http://www.somesite.com/skins/default/editor.css?t=87dm' + * alert( CKEDITOR.getUrl( 'http://www.somesite.com/skins/default/editor.css' ) ); + * + * @param {String} resource The resource whose full URL we want to get. + * It may be a full, absolute, or relative URL. + * @returns {String} The full URL. + */ + getUrl: function( resource ) { + // If this is not a full or absolute path. + if ( resource.indexOf( ':/' ) == -1 && resource.indexOf( '/' ) !== 0 ) + resource = this.basePath + resource; + + // Add the timestamp, except for directories. + if ( this.timestamp && resource.charAt( resource.length - 1 ) != '/' && !( /[&?]t=/ ).test( resource ) ) + resource += ( resource.indexOf( '?' ) >= 0 ? '&' : '?' ) + 't=' + this.timestamp; + + return resource; + }, + + /** + * Specify a function to execute when the DOM is fully loaded. + * + * If called after the DOM has been initialized, the function passed in will + * be executed immediately. + * + * @method + * @todo + */ + domReady: ( function() { + // Based on the original jQuery code. + + var callbacks = []; + + function onReady() { + try { + // Cleanup functions for the document ready method + if ( document.addEventListener ) { + document.removeEventListener( 'DOMContentLoaded', onReady, false ); + executeCallbacks(); + } + // Make sure body exists, at least, in case IE gets a little overzealous. + else if ( document.attachEvent && document.readyState === 'complete' ) { + document.detachEvent( 'onreadystatechange', onReady ); + executeCallbacks(); + } + } catch ( er ) {} + } + + function executeCallbacks() { + var i; + while ( ( i = callbacks.shift() ) ) + i(); + } + + return function( fn ) { + callbacks.push( fn ); + + // Catch cases where this is called after the + // browser event has already occurred. + if ( document.readyState === 'complete' ) + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( onReady, 1 ); + + // Run below once on demand only. + if ( callbacks.length != 1 ) + return; + + // For IE>8, Firefox, Opera and Webkit. + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( 'DOMContentLoaded', onReady, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( 'load', onReady, false ); + + } + // If old IE event model is used + else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( 'onreadystatechange', onReady ); + + // A fallback to window.onload, that will always work + window.attachEvent( 'onload', onReady ); + + // If IE and not a frame + // continually check to see if the document is ready + // use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + var toplevel = false; + + try { + toplevel = !window.frameElement; + } catch ( e ) {} + + if ( document.documentElement.doScroll && toplevel ) { + function scrollCheck() { + try { + document.documentElement.doScroll( 'left' ); + } catch ( e ) { + setTimeout( scrollCheck, 1 ); + return; + } + onReady(); + } + scrollCheck(); + } + } + }; + + } )() + }; + + // Make it possible to override the "url" function with a custom + // implementation pointing to a global named CKEDITOR_GETURL. + var newGetUrl = window.CKEDITOR_GETURL; + if ( newGetUrl ) { + var originalGetUrl = CKEDITOR.getUrl; + CKEDITOR.getUrl = function( resource ) { + return newGetUrl.call( CKEDITOR, resource ) || originalGetUrl.call( CKEDITOR, resource ); + }; + } + + return CKEDITOR; + } )(); +} + +/** + * Function called upon loading a custom configuration file that can + * modify the editor instance configuration ({@link CKEDITOR.editor#config}). + * It is usually defined inside the custom configuration files that can + * include developer defined settings. + * + * // This is supposed to be placed in the config.js file. + * CKEDITOR.editorConfig = function( config ) { + * // Define changes to default configuration here. For example: + * config.language = 'fr'; + * config.uiColor = '#AADC6E'; + * }; + * + * @method editorConfig + * @param {CKEDITOR.config} config A configuration object containing the + * settings defined for a {@link CKEDITOR.editor} instance up to this + * function call. Note that not all settings may still be available. See + * [Configuration Loading Order](http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Setting_Configurations#Configuration_Loading_Order) + * for details. + */ + +// PACKAGER_RENAME( CKEDITOR ) diff --git a/scripts/ckeditor/core/ckeditor_basic.js b/scripts/ckeditor/core/ckeditor_basic.js new file mode 100755 index 00000000..efdb2456 --- /dev/null +++ b/scripts/ckeditor/core/ckeditor_basic.js @@ -0,0 +1,94 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Contains the second part of the {@link CKEDITOR} object + * definition, which defines the basic editor features to be available in + * the root ckeditor_basic.js file. + */ + +if ( CKEDITOR.status == 'unloaded' ) { + ( function() { + CKEDITOR.event.implementOn( CKEDITOR ); + + /** + * Forces the full CKEditor core code, in the case only the basic code has been + * loaded (`ckeditor_basic.js`). This method self-destroys (becomes undefined) in + * the first call or as soon as the full code is available. + * + * // Check if the full core code has been loaded and load it. + * if ( CKEDITOR.loadFullCore ) + * CKEDITOR.loadFullCore(); + * + * @member CKEDITOR + */ + CKEDITOR.loadFullCore = function() { + // If the basic code is not ready, just mark it to be loaded. + if ( CKEDITOR.status != 'basic_ready' ) { + CKEDITOR.loadFullCore._load = 1; + return; + } + + // Destroy this function. + delete CKEDITOR.loadFullCore; + + // Append the script to the head. + var script = document.createElement( 'script' ); + script.type = 'text/javascript'; + script.src = CKEDITOR.basePath + 'ckeditor.js'; + script.src = CKEDITOR.basePath + 'ckeditor_source.js'; // %REMOVE_LINE% + + document.getElementsByTagName( 'head' )[ 0 ].appendChild( script ); + }; + + /** + * The time to wait (in seconds) to load the full editor code after the + * page load, if the "ckeditor_basic" file is used. If set to zero, the + * editor is loaded on demand, as soon as an instance is created. + * + * This value must be set on the page before the page load completion. + * + * // Loads the full source after five seconds. + * CKEDITOR.loadFullCoreTimeout = 5; + * + * @property + * @member CKEDITOR + */ + CKEDITOR.loadFullCoreTimeout = 0; + + // Documented at ckeditor.js. + CKEDITOR.add = function( editor ) { + // For now, just put the editor in the pending list. It will be + // processed as soon as the full code gets loaded. + var pending = this._.pending || ( this._.pending = [] ); + pending.push( editor ); + }; + + ( function() { + var onload = function() { + var loadFullCore = CKEDITOR.loadFullCore, + loadFullCoreTimeout = CKEDITOR.loadFullCoreTimeout; + + if ( !loadFullCore ) + return; + + CKEDITOR.status = 'basic_ready'; + + if ( loadFullCore && loadFullCore._load ) + loadFullCore(); + else if ( loadFullCoreTimeout ) { + setTimeout( function() { + if ( CKEDITOR.loadFullCore ) + CKEDITOR.loadFullCore(); + }, loadFullCoreTimeout * 1000 ); + } + }; + + CKEDITOR.domReady( onload ); + } )(); + + CKEDITOR.status = 'basic_loaded'; + } )(); +} diff --git a/scripts/ckeditor/core/command.js b/scripts/ckeditor/core/command.js new file mode 100755 index 00000000..e9c98863 --- /dev/null +++ b/scripts/ckeditor/core/command.js @@ -0,0 +1,271 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * Represents a command that can be executed on an editor instance. + * + * var command = new CKEDITOR.command( editor, { + * exec: function( editor ) { + * alert( editor.document.getBody().getHtml() ); + * } + * } ); + * + * @class + * @mixins CKEDITOR.event + * @constructor Creates a command class instance. + * @param {CKEDITOR.editor} editor The editor instance this command will be + * related to. + * @param {CKEDITOR.commandDefinition} commandDefinition The command + * definition. + */ +CKEDITOR.command = function( editor, commandDefinition ) { + /** + * Lists UI items that are associated to this command. This list can be + * used to interact with the UI on command execution (by the execution code + * itself, for example). + * + * alert( 'Number of UI items associated to this command: ' + command.uiItems.length ); + */ + this.uiItems = []; + + /** + * Executes the command. + * + * command.exec(); // The command gets executed. + * + * @param {Object} [data] Any data to pass to the command. Depends on the + * command implementation and requirements. + * @returns {Boolean} A boolean indicating that the command has been successfully executed. + */ + this.exec = function( data ) { + if ( this.state == CKEDITOR.TRISTATE_DISABLED || !this.checkAllowed() ) + return false; + + if ( this.editorFocus ) // Give editor focus if necessary (#4355). + editor.focus(); + + if ( this.fire( 'exec' ) === false ) + return true; + + return ( commandDefinition.exec.call( this, editor, data ) !== false ); + }; + + /** + * Explicitly update the status of the command, by firing the {@link CKEDITOR.command#event-refresh} event, + * as well as invoke the {@link CKEDITOR.commandDefinition#refresh} method if defined, this method + * is to allow different parts of the editor code to contribute in command status resolution. + * + * @param {CKEDITOR.editor} editor The editor instance. + * @param {CKEDITOR.dom.elementPath} path + */ + this.refresh = function( editor, path ) { + // Do nothing is we're on read-only and this command doesn't support it. + // We don't need to disabled the command explicitely here, because this + // is already done by the "readOnly" event listener. + if ( !this.readOnly && editor.readOnly ) + return true; + + // Disable commands that are not allowed in the current selection path context. + if ( this.context && !path.isContextFor( this.context ) ) { + this.disable(); + return true; + } + + // Disable commands that are not allowed by the active filter. + if ( !this.checkAllowed( true ) ) { + this.disable(); + return true; + } + + // Make the "enabled" state a default for commands enabled from start. + if ( !this.startDisabled ) + this.enable(); + + // Disable commands which shouldn't be enabled in this mode. + if ( this.modes && !this.modes[ editor.mode ] ) + this.disable(); + + if ( this.fire( 'refresh', { editor: editor, path: path } ) === false ) + return true; + + return ( commandDefinition.refresh && commandDefinition.refresh.apply( this, arguments ) !== false ); + }; + + var allowed; + + /** + * Checks whether this command is allowed by the active allowed + * content filter ({@link CKEDITOR.editor#activeFilter}). This means + * that if command implements {@link CKEDITOR.feature} interface it will be tested + * by the {@link CKEDITOR.filter#checkFeature} method. + * + * @since 4.1 + * @param {Boolean} [noCache] Skip cache for example due to active filter change. Since CKEditor 4.2. + * @returns {Boolean} Whether this command is allowed. + */ + this.checkAllowed = function( noCache ) { + if ( !noCache && typeof allowed == 'boolean' ) + return allowed; + + return allowed = editor.activeFilter.checkFeature( this ); + }; + + CKEDITOR.tools.extend( this, commandDefinition, { + /** + * The editor modes within which the command can be executed. The + * execution will have no action if the current mode is not listed + * in this property. + * + * // Enable the command in both WYSIWYG and Source modes. + * command.modes = { wysiwyg:1,source:1 }; + * + * // Enable the command in Source mode only. + * command.modes = { source:1 }; + * + * @see CKEDITOR.editor#mode + */ + modes: { wysiwyg: 1 }, + + /** + * Indicates that the editor will get the focus before executing + * the command. + * + * // Do not force the editor to have focus when executing the command. + * command.editorFocus = false; + * + * @property {Boolean} [=true] + */ + editorFocus: 1, + + /** + * Indicates that this command is sensible to the selection context. + * If `true`, the {@link CKEDITOR.command#method-refresh} method will be + * called for this command on the {@link CKEDITOR.editor#event-selectionChange} event. + * + * @property {Boolean} [=false] + */ + contextSensitive: !!commandDefinition.context, + + /** + * Indicates the editor state. Possible values are: + * + * * {@link CKEDITOR#TRISTATE_DISABLED}: the command is + * disabled. It's execution will have no effect. Same as {@link #disable}. + * * {@link CKEDITOR#TRISTATE_ON}: the command is enabled + * and currently active in the editor (for context sensitive commands, for example). + * * {@link CKEDITOR#TRISTATE_OFF}: the command is enabled + * and currently inactive in the editor (for context sensitive commands, for example). + * + * Do not set this property directly, using the {@link #setState} method instead. + * + * if ( command.state == CKEDITOR.TRISTATE_DISABLED ) + * alert( 'This command is disabled' ); + * + * @property {Number} [=CKEDITOR.TRISTATE_DISABLED] + */ + state: CKEDITOR.TRISTATE_DISABLED + } ); + + // Call the CKEDITOR.event constructor to initialize this instance. + CKEDITOR.event.call( this ); +}; + +CKEDITOR.command.prototype = { + /** + * Enables the command for execution. The command state (see + * {@link CKEDITOR.command#property-state}) available before disabling it is restored. + * + * command.enable(); + * command.exec(); // Execute the command. + */ + enable: function() { + if ( this.state == CKEDITOR.TRISTATE_DISABLED && this.checkAllowed() ) + this.setState( ( !this.preserveState || ( typeof this.previousState == 'undefined' ) ) ? CKEDITOR.TRISTATE_OFF : this.previousState ); + }, + + /** + * Disables the command for execution. The command state (see + * {@link CKEDITOR.command#property-state}) will be set to {@link CKEDITOR#TRISTATE_DISABLED}. + * + * command.disable(); + * command.exec(); // "false" - Nothing happens. + */ + disable: function() { + this.setState( CKEDITOR.TRISTATE_DISABLED ); + }, + + /** + * Sets the command state. + * + * command.setState( CKEDITOR.TRISTATE_ON ); + * command.exec(); // Execute the command. + * command.setState( CKEDITOR.TRISTATE_DISABLED ); + * command.exec(); // 'false' - Nothing happens. + * command.setState( CKEDITOR.TRISTATE_OFF ); + * command.exec(); // Execute the command. + * + * @param {Number} newState The new state. See {@link #property-state}. + * @returns {Boolean} Returns `true` if the command state changed. + */ + setState: function( newState ) { + // Do nothing if there is no state change. + if ( this.state == newState ) + return false; + + if ( newState != CKEDITOR.TRISTATE_DISABLED && !this.checkAllowed() ) + return false; + + this.previousState = this.state; + + // Set the new state. + this.state = newState; + + // Fire the "state" event, so other parts of the code can react to the + // change. + this.fire( 'state' ); + + return true; + }, + + /** + * Toggles the on/off (active/inactive) state of the command. This is + * mainly used internally by context sensitive commands. + * + * command.toggleState(); + */ + toggleState: function() { + if ( this.state == CKEDITOR.TRISTATE_OFF ) + this.setState( CKEDITOR.TRISTATE_ON ); + else if ( this.state == CKEDITOR.TRISTATE_ON ) + this.setState( CKEDITOR.TRISTATE_OFF ); + } +}; + +CKEDITOR.event.implementOn( CKEDITOR.command.prototype ); + +/** + * Indicates the previous command state. + * + * alert( command.previousState ); + * + * @property {Number} previousState + * @see #state + */ + +/** + * Fired when the command state changes. + * + * command.on( 'state', function() { + * // Alerts the new state. + * alert( this.state ); + * } ); + * + * @event state + */ + + /** + * @event refresh + * @todo + */ diff --git a/scripts/ckeditor/core/commanddefinition.js b/scripts/ckeditor/core/commanddefinition.js new file mode 100755 index 00000000..18609bc0 --- /dev/null +++ b/scripts/ckeditor/core/commanddefinition.js @@ -0,0 +1,139 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the "virtual" {@link CKEDITOR.commandDefinition} class, + * which contains the defintion of a command. This file is for + * documentation purposes only. + */ + +/** + * Virtual class that illustrates the features of command objects to be + * passed to the {@link CKEDITOR.editor#addCommand} function. + * + * @class CKEDITOR.commandDefinition + * @abstract + */ + +/** + * The function to be fired when the commend is executed. + * + * editorInstance.addCommand( 'sample', { + * exec: function( editor ) { + * alert( 'Executing a command for the editor name "' + editor.name + '"!' ); + * } + * } ); + * + * @method exec + * @param {CKEDITOR.editor} editor The editor within which run the command. + * @param {Object} [data] Additional data to be used to execute the command. + * @returns {Boolean} Whether the command has been successfully executed. + * Defaults to `true`, if nothing is returned. + */ + +/** + * Whether the command need to be hooked into the redo/undo system. + * + * editorInstance.addCommand( 'alertName', { + * exec: function( editor ) { + * alert( editor.name ); + * }, + * canUndo: false // No support for undo/redo. + * } ); + * + * @property {Boolean} [canUndo=true] + */ + +/** + * Whether the command is asynchronous, which means that the + * {@link CKEDITOR.editor#event-afterCommandExec} event will be fired by the + * command itself manually, and that the return value of this command is not to + * be returned by the {@link #exec} function. + * + * editorInstance.addCommand( 'loadOptions', { + * exec: function( editor ) { + * // Asynchronous operation below. + * CKEDITOR.ajax.loadXml( 'data.xml', function() { + * editor.fire( 'afterCommandExec' ); + * } ); + * }, + * async: true // The command need some time to complete after exec function returns. + * } ); + * + * @property {Boolean} [async=false] + */ + +/** + * Whether the command should give focus to the editor before execution. + * + * editorInstance.addCommand( 'maximize', { + * exec: function( editor ) { + * // ... + * }, + * editorFocus: false // The command doesn't require focusing the editing document. + * } ); + * + * @property {Boolean} [editorFocus=true] + * @see CKEDITOR.command#editorFocus + */ + + +/** + * Whether the command state should be set to {@link CKEDITOR#TRISTATE_DISABLED} on startup. + * + * editorInstance.addCommand( 'unlink', { + * exec: function( editor ) { + * // ... + * }, + * startDisabled: true // Command is unavailable until selection is inside a link. + * } ); + * + * @property {Boolean} [startDisabled=false] + */ + +/** + * Indicates that this command is sensible to the selection context. + * If `true`, the {@link CKEDITOR.command#method-refresh} method will be + * called for this command on selection changes, with a single parameter + * representing the current elements path. + * + * @property {Boolean} [contextSensitive=true] + */ + +/** + * Defined by command definition a function to determinate the command state, it will be invoked + * when editor has it's `states` or `selection` changed. + * + * **Note:** The function provided must be calling {@link CKEDITOR.command#setState} in all circumstance, + * if it is intended to update the command state. + * + * @method refresh + * @param {CKEDITOR.editor} editor + * @param {CKEDITOR.dom.elementPath} path + */ + +/** + * Sets the element name used to reflect the command state on selection changes. + * If the selection is in a place where the element is not allowed, the command + * will be disabled. + * Setting this property overrides {@link #contextSensitive} to `true`. + * + * @property {Boolean} [context=true] + */ + +/** + * The editor modes within which the command can be executed. The execution + * will have no action if the current mode is not listed in this property. + * + * editorInstance.addCommand( 'link', { + * exec: function( editor ) { + * // ... + * }, + * modes: { wysiwyg:1 } // Command is available in wysiwyg mode only. + * } ); + * + * @property {Object} [modes={ wysiwyg:1 }] + * @see CKEDITOR.command#modes + */ diff --git a/scripts/ckeditor/core/config.js b/scripts/ckeditor/core/config.js new file mode 100755 index 00000000..c6a98949 --- /dev/null +++ b/scripts/ckeditor/core/config.js @@ -0,0 +1,380 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.config} object that stores the + * default configuration settings. + */ + +/** + * Used in conjunction with {@link CKEDITOR.config#enterMode} + * and {@link CKEDITOR.config#shiftEnterMode} configuration + * settings to make the editor produce `<p>` tags when + * using the *Enter* key. + * + * @readonly + * @property {Number} [=1] + * @member CKEDITOR + */ +CKEDITOR.ENTER_P = 1; + +/** + * Used in conjunction with {@link CKEDITOR.config#enterMode} + * and {@link CKEDITOR.config#shiftEnterMode} configuration + * settings to make the editor produce `<br>` tags when + * using the *Enter* key. + * + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ +CKEDITOR.ENTER_BR = 2; + +/** + * Used in conjunction with {@link CKEDITOR.config#enterMode} + * and {@link CKEDITOR.config#shiftEnterMode} configuration + * settings to make the editor produce `<div>` tags when + * using the *Enter* key. + * + * @readonly + * @property {Number} [=3] + * @member CKEDITOR + */ +CKEDITOR.ENTER_DIV = 3; + +/** + * Stores default configuration settings. Changes to this object are + * reflected in all editor instances, if not specified otherwise for a particular + * instance. + * + * @class + * @singleton + */ +CKEDITOR.config = { + /** + * The URL path for the custom configuration file to be loaded. If not + * overloaded with inline configuration, it defaults to the `config.js` + * file present in the root of the CKEditor installation directory. + * + * CKEditor will recursively load custom configuration files defined inside + * other custom configuration files. + * + * // Load a specific configuration file. + * CKEDITOR.replace( 'myfield', { customConfig: '/myconfig.js' } ); + * + * // Do not load any custom configuration file. + * CKEDITOR.replace( 'myfield', { customConfig: '' } ); + * + * @cfg {String} [="<CKEditor folder>/config.js"] + */ + customConfig: 'config.js', + + /** + * Whether the replaced element (usually a `<textarea>`) + * is to be updated automatically when posting the form containing the editor. + * + * @cfg + */ + autoUpdateElement: true, + + /** + * The user interface language localization to use. If left empty, the editor + * will automatically be localized to the user language. If the user language is not supported, + * the language specified in the {@link CKEDITOR.config#defaultLanguage} + * configuration setting is used. + * + * // Load the German interface. + * config.language = 'de'; + * + * @cfg + */ + language: '', + + /** + * The language to be used if the {@link CKEDITOR.config#language} + * setting is left empty and it is not possible to localize the editor to the user language. + * + * config.defaultLanguage = 'it'; + * + * @cfg + */ + defaultLanguage: 'en', + + /** + * The writing direction of the language used to create editor contents. + * Allowed values are: + * + * * `''` (empty string) - indicate content direction will be the same with either the editor + * UI direction or page element direction depending on the creators: + * * Themed UI: The same with user interface language direction; + * * Inline: The same with the editable element text direction; + * * `'ltr'` - for Left-To-Right language (like English); + * * `'rtl'` - for Right-To-Left languages (like Arabic). + * + * Example: + * + * config.contentsLangDirection = 'rtl'; + * + * @cfg + */ + contentsLangDirection: '', + + /** + * Sets the behavior of the *Enter* key. It also determines other behavior + * rules of the editor, like whether the `<br>` element is to be used + * as a paragraph separator when indenting text. + * The allowed values are the following constants that cause the behavior outlined below: + * + * * {@link CKEDITOR#ENTER_P} (1) – new `<p>` paragraphs are created; + * * {@link CKEDITOR#ENTER_BR} (2) – lines are broken with `<br>` elements; + * * {@link CKEDITOR#ENTER_DIV} (3) – new `<div>` blocks are created. + * + * **Note**: It is recommended to use the {@link CKEDITOR#ENTER_P} setting because of + * its semantic value and correctness. The editor is optimized for this setting. + * + * // Not recommended. + * config.enterMode = CKEDITOR.ENTER_BR; + * + * @cfg {Number} [=CKEDITOR.ENTER_P] + */ + enterMode: CKEDITOR.ENTER_P, + + /** + * Force the use of {@link CKEDITOR.config#enterMode} as line break regardless + * of the context. If, for example, {@link CKEDITOR.config#enterMode} is set + * to {@link CKEDITOR#ENTER_P}, pressing the *Enter* key inside a + * `<div>` element will create a new paragraph with `<p>` + * instead of a `<div>`. + * + * // Not recommended. + * config.forceEnterMode = true; + * + * @since 3.2.1 + * @cfg + */ + forceEnterMode: false, + + /** + * Similarly to the {@link CKEDITOR.config#enterMode} setting, it defines the behavior + * of the *Shift+Enter* key combination. + * + * The allowed values are the following constants the behavior outlined below: + * + * * {@link CKEDITOR#ENTER_P} (1) – new `<p>` paragraphs are created; + * * {@link CKEDITOR#ENTER_BR} (2) – lines are broken with `<br>` elements; + * * {@link CKEDITOR#ENTER_DIV} (3) – new `<div>` blocks are created. + * + * Example: + * + * config.shiftEnterMode = CKEDITOR.ENTER_P; + * + * @cfg {Number} [=CKEDITOR.ENTER_BR] + */ + shiftEnterMode: CKEDITOR.ENTER_BR, + + /** + * Sets the `DOCTYPE` to be used when loading the editor content as HTML. + * + * // Set the DOCTYPE to the HTML 4 (Quirks) mode. + * config.docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'; + * + * @cfg + */ + docType: '<!DOCTYPE html>', + + /** + * Sets the `id` attribute to be used on the `body` element + * of the editing area. This can be useful when you intend to reuse the original CSS + * file you are using on your live website and want to assign the editor the same ID + * as the section that will include the contents. In this way ID-specific CSS rules will + * be enabled. + * + * config.bodyId = 'contents_id'; + * + * @since 3.1 + * @cfg + */ + bodyId: '', + + /** + * Sets the `class` attribute to be used on the `body` element + * of the editing area. This can be useful when you intend to reuse the original CSS + * file you are using on your live website and want to assign the editor the same class + * as the section that will include the contents. In this way class-specific CSS rules will + * be enabled. + * + * config.bodyClass = 'contents'; + * + * **Note:** Editor needs to load stylesheets containing contents styles. You can either + * copy them to the `contents.css` file that editor loads by default or set the {@link #contentsCss} + * option. + * + * **Note:** This setting applies only to the classic editor (the one that uses `iframe`). + * + * @since 3.1 + * @cfg + */ + bodyClass: '', + + /** + * Indicates whether the contents to be edited are being input as a full HTML page. + * A full page includes the `<html>`, `<head>`, and `<body>` elements. + * The final output will also reflect this setting, including the + * `<body>` contents only if this setting is disabled. + * + * config.fullPage = true; + * + * @since 3.1 + * @cfg + */ + fullPage: false, + + /** + * The height of the editing area (that includes the editor content). This + * can be an integer, for pixel sizes, or any CSS-defined length unit. + * + * **Note:** Percent units (%) are not supported. + * + * config.height = 500; // 500 pixels. + * config.height = '25em'; // CSS length. + * config.height = '300px'; // CSS length. + * + * @cfg {Number/String} + */ + height: 200, + + /** + * Comma-separated list of plugins to be used in an editor instance. Note that + * the actual plugins that are to be loaded could still be affected by two other settings: + * {@link CKEDITOR.config#extraPlugins} and {@link CKEDITOR.config#removePlugins}. + * + * @cfg {String} [="<default list of plugins>"] + */ + plugins: '', // %REMOVE_LINE% + + /** + * A list of additional plugins to be loaded. This setting makes it easier + * to add new plugins without having to touch the {@link CKEDITOR.config#plugins} setting. + * + * **Note:** The most recommended way to + * [add CKEditor plugins](http://docs.ckeditor.com/#!/guide/dev_plugins) is through + * [CKEditor Builder](http://ckeditor.com/builder). + * + * config.extraPlugins = 'myplugin,anotherplugin'; + * + * @cfg + */ + extraPlugins: '', + + /** + * A list of plugins that must not be loaded. This setting makes it possible + * to avoid loading some plugins defined in the {@link CKEDITOR.config#plugins} + * setting, without having to touch it. + * + * **Note:** A plugin required by another plugin cannot be removed and will cause + * an error to be thrown. So for example if `contextmenu` is required by `tabletools`, + * it can only be removed if `tabletools` is not loaded. + * + * config.removePlugins = 'elementspath,save,font'; + * + * @cfg + */ + removePlugins: '', + + /** + * A list of regular expressions to be executed on input HTML, + * indicating HTML source code that when matched, must **not** be available in the WYSIWYG + * mode for editing. + * + * config.protectedSource.push( /<\?[\s\S]*?\?>/g ); // PHP code + * config.protectedSource.push( /<%[\s\S]*?%>/g ); // ASP code + * config.protectedSource.push( /(<asp:[^\>]+>[\s|\S]*?<\/asp:[^\>]+>)|(<asp:[^\>]+\/>)/gi ); // ASP.Net code + * + * @cfg + */ + protectedSource: [], + + /** + * The editor `tabindex` value. + * + * config.tabIndex = 1; + * + * @cfg + */ + tabIndex: 0, + + /** + * The editor UI outer width. This can be an integer, for pixel sizes, or + * any CSS-defined unit. + * + * Unlike the {@link CKEDITOR.config#height} setting, this + * one will set the outer width of the entire editor UI, not for the + * editing area only. + * + * config.width = 850; // 850 pixels wide. + * config.width = '75%'; // CSS unit. + * + * @cfg {String/Number} + */ + width: '', + + /** + * The base Z-index for floating dialog windows and popups. + * + * config.baseFloatZIndex = 2000; + * + * @cfg + */ + baseFloatZIndex: 10000, + + /** + * The keystrokes that are blocked by default as the browser implementation + * is buggy. These default keystrokes are handled by the editor. + * + * // Default setting. + * config.blockedKeystrokes = [ + * CKEDITOR.CTRL + 66, // CTRL+B + * CKEDITOR.CTRL + 73, // CTRL+I + * CKEDITOR.CTRL + 85 // CTRL+U + * ]; + * + * @cfg {Array} [blockedKeystrokes=see example] + */ + blockedKeystrokes: [ + CKEDITOR.CTRL + 66, // CTRL+B + CKEDITOR.CTRL + 73, // CTRL+I + CKEDITOR.CTRL + 85 // CTRL+U + ] +}; + +/** + * Indicates that some of the editor features, like alignment and text + * direction, should use the "computed value" of the feature to indicate its + * on/off state instead of using the "real value". + * + * If enabled in a Left-To-Right written document, the "Left Justify" + * alignment button will be shown as active, even if the alignment style is not + * explicitly applied to the current paragraph in the editor. + * + * config.useComputedState = false; + * + * @since 3.4 + * @cfg {Boolean} [useComputedState=true] + */ + +/** + * The base user interface color to be used by the editor. Not all skins are + * compatible with this setting. + * + * // Using a color code. + * config.uiColor = '#AADC6E'; + * + * // Using an HTML color name. + * config.uiColor = 'Gold'; + * + * @cfg {String} uiColor + */ + +// PACKAGER_RENAME( CKEDITOR.config ) diff --git a/scripts/ckeditor/core/creators/inline.js b/scripts/ckeditor/core/creators/inline.js new file mode 100755 index 00000000..8adef880 --- /dev/null +++ b/scripts/ckeditor/core/creators/inline.js @@ -0,0 +1,156 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +( function() { + /** @class CKEDITOR */ + + /** + * Turns a DOM element with the `contenteditable` attribute set to `true` into a + * CKEditor instance. Check {@link CKEDITOR.dtd#$editable} for a list of + * allowed element names. + * + * **Note:** If the DOM element for which inline editing is being enabled does not have + * the `contenteditable` attribute set to `true`, the editor will start in read-only mode. + * + * <div contenteditable="true" id="content">...</div> + * ... + * CKEDITOR.inline( 'content' ); + * + * It is also possible to create an inline editor from the `<textarea>` element. + * If you do so, an additional `<div>` element with editable content will be created + * directly after the `<textarea>` element and the `<textarea>` element will be hidden. + * + * @param {Object/String} element The DOM element or its ID. + * @param {Object} [instanceConfig] The specific configurations to apply to this editor instance. + * See {@link CKEDITOR.config}. + * @returns {CKEDITOR.editor} The editor instance created. + */ + CKEDITOR.inline = function( element, instanceConfig ) { + if ( !CKEDITOR.env.isCompatible ) + return null; + + element = CKEDITOR.dom.element.get( element ); + + // Avoid multiple inline editor instances on the same element. + if ( element.getEditor() ) + throw 'The editor instance "' + element.getEditor().name + '" is already attached to the provided element.'; + + var editor = new CKEDITOR.editor( instanceConfig, element, CKEDITOR.ELEMENT_MODE_INLINE ), + textarea = element.is( 'textarea' ) ? element : null; + + if ( textarea ) { + editor.setData( textarea.getValue(), null, true ); + + //Change element from textarea to div + element = CKEDITOR.dom.element.createFromHtml( + '<div contenteditable="' + !!editor.readOnly + '" class="cke_textarea_inline">' + + textarea.getValue() + + '</div>', + CKEDITOR.document ); + + element.insertAfter( textarea ); + textarea.hide(); + + // Attaching the concrete form. + if ( textarea.$.form ) + editor._attachToForm(); + } else { + // Initial editor data is simply loaded from the page element content to make + // data retrieval possible immediately after the editor creation. + editor.setData( element.getHtml(), null, true ); + } + + // Once the editor is loaded, start the UI. + editor.on( 'loaded', function() { + editor.fire( 'uiReady' ); + + // Enable editing on the element. + editor.editable( element ); + + // Editable itself is the outermost element. + editor.container = element; + + // Load and process editor data. + editor.setData( editor.getData( 1 ) ); + + // Clean on startup. + editor.resetDirty(); + + editor.fire( 'contentDom' ); + + // Inline editing defaults to "wysiwyg" mode, so plugins don't + // need to make special handling for this "mode-less" environment. + editor.mode = 'wysiwyg'; + editor.fire( 'mode' ); + + // The editor is completely loaded for interaction. + editor.status = 'ready'; + editor.fireOnce( 'instanceReady' ); + CKEDITOR.fire( 'instanceReady', null, editor ); + + // give priority to plugins that relay on editor#loaded for bootstrapping. + }, null, null, 10000 ); + + // Handle editor destroying. + editor.on( 'destroy', function() { + // Remove container from DOM if inline-textarea editor. + // Show <textarea> back again. + if ( textarea ) { + editor.container.clearCustomData(); + editor.container.remove(); + textarea.show(); + } + + editor.element.clearCustomData(); + + delete editor.element; + } ); + + return editor; + }; + + /** + * Calls {@link CKEDITOR#inline} for all page elements with + * the `contenteditable` attribute set to `true`. + * + */ + CKEDITOR.inlineAll = function() { + var el, data; + + for ( var name in CKEDITOR.dtd.$editable ) { + var elements = CKEDITOR.document.getElementsByTag( name ); + + for ( var i = 0, len = elements.count(); i < len; i++ ) { + el = elements.getItem( i ); + + if ( el.getAttribute( 'contenteditable' ) == 'true' ) { + // Fire the "inline" event, making it possible to customize + // the instance settings and eventually cancel the creation. + + data = { + element: el, + config: {} + }; + + if ( CKEDITOR.fire( 'inline', data ) !== false ) + CKEDITOR.inline( el, data.config ); + } + } + } + }; + + CKEDITOR.domReady( function() { + !CKEDITOR.disableAutoInline && CKEDITOR.inlineAll(); + } ); +} )(); + +/** + * Disables creating the inline editor automatically for elements with + * the `contenteditable` attribute set to `true`. + * + * CKEDITOR.disableAutoInline = true; + * + * @cfg {Boolean} [disableAutoInline=false] + */ diff --git a/scripts/ckeditor/core/creators/themedui.js b/scripts/ckeditor/core/creators/themedui.js new file mode 100755 index 00000000..c7bee7bd --- /dev/null +++ b/scripts/ckeditor/core/creators/themedui.js @@ -0,0 +1,488 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + + /** @class CKEDITOR */ + +/** + * The class name used to identify `<textarea>` elements to be replaced + * by CKEditor instances. Set it to empty/`null` to disable this feature. + * + * CKEDITOR.replaceClass = 'rich_editor'; + * + * @cfg {String} [replaceClass='ckeditor'] + */ +CKEDITOR.replaceClass = 'ckeditor'; + +( function() { + /** + * Replaces a `<textarea>` or a DOM element (`<div>`) with a CKEditor + * instance. For textareas, the initial value in the editor will be the + * textarea value. For DOM elements, their `innerHTML` will be used + * instead. We recommend using `<textarea>` and `<div>` elements only. + * + * <textarea id="myfield" name="myfield"></textarea> + * ... + * CKEDITOR.replace( 'myfield' ); + * + * var textarea = document.body.appendChild( document.createElement( 'textarea' ) ); + * CKEDITOR.replace( textarea ); + * + * @param {Object/String} element The DOM element (textarea), its ID, or name. + * @param {Object} [config] The specific configuration to apply to this + * editor instance. Configuration set here will override the global CKEditor settings + * (see {@link CKEDITOR.config}). + * @returns {CKEDITOR.editor} The editor instance created. + */ + CKEDITOR.replace = function( element, config ) { + return createInstance( element, config, null, CKEDITOR.ELEMENT_MODE_REPLACE ); + }; + + /** + * Creates a new editor instance at the end of a specific DOM element. + * + * <div id="editorSpace"></div> + * ... + * CKEDITOR.appendTo( 'editorSpace' ); + * + * @param {Object/String} element The DOM element, its ID, or name. + * @param {Object} [config] The specific configuration to apply to this + * editor instance. Configuration set here will override the global CKEditor settings + * (see {@link CKEDITOR.config}). + * @param {String} [data] Since 3.3. Initial value for the instance. + * @returns {CKEDITOR.editor} The editor instance created. + */ + CKEDITOR.appendTo = function( element, config, data ) + { + return createInstance( element, config, data, CKEDITOR.ELEMENT_MODE_APPENDTO ); + }; + + /** + * Replaces all `<textarea>` elements available in the document with + * editor instances. + * + * // Replace all <textarea> elements in the page. + * CKEDITOR.replaceAll(); + * + * // Replace all <textarea class="myClassName"> elements in the page. + * CKEDITOR.replaceAll( 'myClassName' ); + * + * // Selectively replace <textarea> elements, based on custom assertions. + * CKEDITOR.replaceAll( function( textarea, config ) { + * // An assertion function that needs to be evaluated for the <textarea> + * // to be replaced. It must explicitely return "false" to ignore a + * // specific <textarea>. + * // You can also customize the editor instance by having the function + * // modify the "config" parameter. + * } ); + * + * @param {String} [className] The `<textarea>` class name. + * @param {Function} [function] An assertion function that must return `true` for a `<textarea>` + * to be replaced with the editor. If the function returns `false`, the `<textarea>` element + * will not be replaced. + */ + CKEDITOR.replaceAll = function() { + var textareas = document.getElementsByTagName( 'textarea' ); + + for ( var i = 0; i < textareas.length; i++ ) { + var config = null, + textarea = textareas[ i ]; + + // The "name" and/or "id" attribute must exist. + if ( !textarea.name && !textarea.id ) + continue; + + if ( typeof arguments[ 0 ] == 'string' ) { + // The textarea class name could be passed as the function + // parameter. + + var classRegex = new RegExp( '(?:^|\\s)' + arguments[ 0 ] + '(?:$|\\s)' ); + + if ( !classRegex.test( textarea.className ) ) + continue; + } else if ( typeof arguments[ 0 ] == 'function' ) { + // An assertion function could be passed as the function parameter. + // It must explicitly return "false" to ignore a specific <textarea>. + config = {}; + if ( arguments[ 0 ]( textarea, config ) === false ) + continue; + } + + this.replace( textarea, config ); + } + }; + + /** @class CKEDITOR.editor */ + + /** + * Registers an editing mode. This function is to be used mainly by plugins. + * + * @param {String} mode The mode name. + * @param {Function} exec The function that performs the actual mode change. + */ + CKEDITOR.editor.prototype.addMode = function( mode, exec ) { + ( this._.modes || ( this._.modes = {} ) )[ mode ] = exec; + }; + + /** + * Changes the editing mode of this editor instance. + * + * **Note:** The mode switch could be asynchronous depending on the mode provider. + * Use the `callback` to hook subsequent code. + * + * // Switch to "source" view. + * CKEDITOR.instances.editor1.setMode( 'source' ); + * // Switch to "wysiwyg" view and be notified on completion. + * CKEDITOR.instances.editor1.setMode( 'wysiwyg', function() { alert( 'wysiwyg mode loaded!' ); } ); + * + * @param {String} [newMode] If not specified, the {@link CKEDITOR.config#startupMode} will be used. + * @param {Function} [callback] Optional callback function which is invoked once the mode switch has succeeded. + */ + CKEDITOR.editor.prototype.setMode = function( newMode, callback ) { + var editor = this; + + var modes = this._.modes; + + // Mode loading quickly fails. + if ( newMode == editor.mode || !modes || !modes[ newMode ] ) + return; + + editor.fire( 'beforeSetMode', newMode ); + + if ( editor.mode ) { + var isDirty = editor.checkDirty(), + previousModeData = editor._.previousModeData, + currentData, + unlockSnapshot = 0; + + editor.fire( 'beforeModeUnload' ); + + // Detach the current editable. While detaching editable will set + // cached editor's data (with internal setData call). We use this + // data below to avoid two getData() calls in a row. + editor.editable( 0 ); + + editor._.previousMode = editor.mode; + // Get cached data, which was set while detaching editable. + editor._.previousModeData = currentData = editor.getData( 1 ); + + // If data has not been modified in the mode which we are currently leaving, + // avoid making snapshot right after initializing new mode. + // http://dev.ckeditor.com/ticket/5217#comment:20 + // Tested by: + // 'test switch mode with unrecoreded, inner HTML specific content (boguses)' + // 'test switch mode with unrecoreded, inner HTML specific content (boguses) plus changes in source mode' + if ( editor.mode == 'source' && previousModeData == currentData ) { + // We need to make sure that unlockSnapshot will update the last snapshot + // (will not create new one) if lockSnapshot is not called on outdated snapshots stack. + // Additionally, forceUpdate prevents from making content image now, which is useless + // (because it equals editor data not inner HTML). + editor.fire( 'lockSnapshot', { forceUpdate: true } ); + unlockSnapshot = 1; + } + + // Clear up the mode space. + editor.ui.space( 'contents' ).setHtml( '' ); + + editor.mode = ''; + } else + editor._.previousModeData = editor.getData( 1 ); + + // Fire the mode handler. + this._.modes[ newMode ]( function() { + // Set the current mode. + editor.mode = newMode; + + if ( isDirty !== undefined ) + !isDirty && editor.resetDirty(); + + if ( unlockSnapshot ) + editor.fire( 'unlockSnapshot' ); + // Since snapshot made on dataReady (which normally catches changes done by setData) + // won't work because editor.mode was not set yet (it's set in this function), we need + // to make special snapshot for changes done in source mode here. + else if ( newMode == 'wysiwyg' ) + editor.fire( 'saveSnapshot' ); + + // Delay to avoid race conditions (setMode inside setMode). + setTimeout( function() { + editor.fire( 'mode' ); + callback && callback.call( editor ); + }, 0 ); + } ); + }; + + /** + * Resizes the editor interface. + * + * editor.resize( 900, 300 ); + * + * editor.resize( '100%', 450, true ); + * + * @param {Number/String} width The new width. It can be an integer denoting a value + * in pixels or a CSS size value with unit. + * @param {Number/String} height The new height. It can be an integer denoting a value + * in pixels or a CSS size value with unit. + * @param {Boolean} [isContentHeight] Indicates that the provided height is to + * be applied to the editor content area, and not to the entire editor + * interface. Defaults to `false`. + * @param {Boolean} [resizeInner] Indicates that it is the inner interface + * element that must be resized, not the outer element. The default theme + * defines the editor interface inside a pair of `<span>` elements + * (`<span><span>...</span></span>`). By default the first, + * outer `<span>` element receives the sizes. If this parameter is set to + * `true`, the second, inner `<span>` is resized instead. + */ + CKEDITOR.editor.prototype.resize = function( width, height, isContentHeight, resizeInner ) { + var container = this.container, + contents = this.ui.space( 'contents' ), + contentsFrame = CKEDITOR.env.webkit && this.document && this.document.getWindow().$.frameElement, + outer = resizeInner ? container.getChild( 1 ) : container; + + // Set as border box width. (#5353) + outer.setSize( 'width', width, true ); + + // WebKit needs to refresh the iframe size to avoid rendering issues. (1/2) (#8348) + contentsFrame && ( contentsFrame.style.width = '1%' ); + + // Get the height delta between the outer table and the content area. + // If we're setting the content area's height, then we don't need the delta. + var delta = isContentHeight ? 0 : ( outer.$.offsetHeight || 0 ) - ( contents.$.clientHeight || 0 ); + contents.setStyle( 'height', Math.max( height - delta, 0 ) + 'px' ); + + // WebKit needs to refresh the iframe size to avoid rendering issues. (2/2) (#8348) + contentsFrame && ( contentsFrame.style.width = '100%' ); + + // Emit a resize event. + this.fire( 'resize' ); + }; + + /** + * Gets the element that can be used to check the editor size. This method + * is mainly used by the `resize` plugin, which adds a UI handle that can be used + * to resize the editor. + * + * @param {Boolean} forContents Whether to return the "contents" part of the theme instead of the container. + * @returns {CKEDITOR.dom.element} The resizable element. + */ + CKEDITOR.editor.prototype.getResizable = function( forContents ) { + return forContents ? this.ui.space( 'contents' ) : this.container; + }; + + function createInstance( element, config, data, mode ) { + if ( !CKEDITOR.env.isCompatible ) + return null; + + element = CKEDITOR.dom.element.get( element ); + + // Avoid multiple inline editor instances on the same element. + if ( element.getEditor() ) + throw 'The editor instance "' + element.getEditor().name + '" is already attached to the provided element.'; + + // Create the editor instance. + var editor = new CKEDITOR.editor( config, element, mode ); + + if ( mode == CKEDITOR.ELEMENT_MODE_REPLACE ) { + // Do not replace the textarea right now, just hide it. The effective + // replacement will be done later in the editor creation lifecycle. + element.setStyle( 'visibility', 'hidden' ); + + // #8031 Remember if textarea was required and remove the attribute. + editor._.required = element.hasAttribute( 'required' ); + element.removeAttribute( 'required' ); + } + + data && editor.setData( data, null, true ); + + // Once the editor is loaded, start the UI. + editor.on( 'loaded', function() { + loadTheme( editor ); + + if ( mode == CKEDITOR.ELEMENT_MODE_REPLACE && editor.config.autoUpdateElement && element.$.form ) + editor._attachToForm(); + + editor.setMode( editor.config.startupMode, function() { + // Clean on startup. + editor.resetDirty(); + + // Editor is completely loaded for interaction. + editor.status = 'ready'; + editor.fireOnce( 'instanceReady' ); + CKEDITOR.fire( 'instanceReady', null, editor ); + } ); + } ); + + editor.on( 'destroy', destroy ); + return editor; + } + + function destroy() { + var editor = this, + container = editor.container, + element = editor.element; + + if ( container ) { + container.clearCustomData(); + container.remove(); + } + + if ( element ) { + element.clearCustomData(); + if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE ) { + element.show(); + if ( editor._.required ) + element.setAttribute( 'required', 'required' ); + } + delete editor.element; + } + } + + var themedTpl; + + function loadTheme( editor ) { + var name = editor.name, + element = editor.element, + elementMode = editor.elementMode; + + // Get the HTML for the predefined spaces. + var topHtml = editor.fire( 'uiSpace', { space: 'top', html: '' } ).html; + var bottomHtml = editor.fire( 'uiSpace', { space: 'bottom', html: '' } ).html; + + if ( !themedTpl ) { + themedTpl = CKEDITOR.addTemplate( 'maincontainer', '<{outerEl}' + + ' id="cke_{name}"' + + ' class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} ' + CKEDITOR.env.cssClass + '" ' + + ' dir="{langDir}"' + + ' lang="{langCode}"' + + ' role="application"' + + ' aria-labelledby="cke_{name}_arialbl">' + + '<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>' + + '<{outerEl} class="cke_inner cke_reset" role="presentation">' + + '{topHtml}' + + '<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>' + + '{bottomHtml}' + + '</{outerEl}>' + + '</{outerEl}>' ); + } + + var container = CKEDITOR.dom.element.createFromHtml( themedTpl.output( { + id: editor.id, + name: name, + langDir: editor.lang.dir, + langCode: editor.langCode, + voiceLabel: [ editor.lang.editor, editor.name ].join( ', ' ), + topHtml: topHtml ? '<span id="' + editor.ui.spaceId( 'top' ) + '" class="cke_top cke_reset_all" role="presentation" style="height:auto">' + topHtml + '</span>' : '', + contentId: editor.ui.spaceId( 'contents' ), + bottomHtml: bottomHtml ? '<span id="' + editor.ui.spaceId( 'bottom' ) + '" class="cke_bottom cke_reset_all" role="presentation">' + bottomHtml + '</span>' : '', + outerEl: CKEDITOR.env.ie ? 'span' : 'div' // #9571 + } ) ); + + if ( elementMode == CKEDITOR.ELEMENT_MODE_REPLACE ) { + element.hide(); + container.insertAfter( element ); + } else + element.append( container ); + + editor.container = container; + + // Make top and bottom spaces unelectable, but not content space, + // otherwise the editable area would be affected. + topHtml && editor.ui.space( 'top' ).unselectable(); + bottomHtml && editor.ui.space( 'bottom' ).unselectable(); + + var width = editor.config.width, height = editor.config.height; + if ( width ) + container.setStyle( 'width', CKEDITOR.tools.cssLength( width ) ); + + // The editor height is applied to the contents space. + if ( height ) + editor.ui.space( 'contents' ).setStyle( 'height', CKEDITOR.tools.cssLength( height ) ); + + // Disable browser context menu for editor's chrome. + container.disableContextMenu(); + + // Redirect the focus into editor for webkit. (#5713) + CKEDITOR.env.webkit && container.on( 'focus', function() { + editor.focus(); + } ); + + editor.fireOnce( 'uiReady' ); + } + + // Replace all textareas with the default class name. + CKEDITOR.domReady( function() { + CKEDITOR.replaceClass && CKEDITOR.replaceAll( CKEDITOR.replaceClass ); + } ); +} )(); + +/** + * The current editing mode. An editing mode basically provides + * different ways of editing or viewing the contents. + * + * alert( CKEDITOR.instances.editor1.mode ); // (e.g.) 'wysiwyg' + * + * @readonly + * @property {String} mode + */ + +/** + * The mode to load at the editor startup. It depends on the plugins + * loaded. By default, the `wysiwyg` and `source` modes are available. + * + * config.startupMode = 'source'; + * + * @cfg {String} [startupMode='wysiwyg'] + * @member CKEDITOR.config + */ +CKEDITOR.config.startupMode = 'wysiwyg'; + +/** + * Fired after the editor instance is resized through + * the {@link CKEDITOR.editor#method-resize CKEDITOR.resize} method. + * + * @event resize + * @param {CKEDITOR.editor} editor This editor instance. + */ + +/** + * Fired before changing the editing mode. See also + * {@link #beforeSetMode} and {@link #event-mode}. + * + * @event beforeModeUnload + * @param {CKEDITOR.editor} editor This editor instance. + */ + +/** + * Fired before the editor mode is set. See also + * {@link #event-mode} and {@link #beforeModeUnload}. + * + * @since 3.5.3 + * @event beforeSetMode + * @param {CKEDITOR.editor} editor This editor instance. + * @param {String} data The name of the mode which is about to be set. + */ + +/** + * Fired after setting the editing mode. See also {@link #beforeSetMode} and {@link #beforeModeUnload} + * + * @event mode + * @param {CKEDITOR.editor} editor This editor instance. + */ + +/** + * Fired when the editor (replacing a `<textarea>` which has a `required` attribute) is empty during form submission. + * + * This event replaces native required fields validation that the browsers cannot + * perform when CKEditor replaces `<textarea>` elements. + * + * You can cancel this event to prevent the page from submitting data. + * + * editor.on( 'required', function( evt ) { + * alert( 'Article content is required.' ); + * evt.cancel(); + * } ); + * + * @event required + * @param {CKEDITOR.editor} editor This editor instance. + */ diff --git a/scripts/ckeditor/core/dataprocessor.js b/scripts/ckeditor/core/dataprocessor.js new file mode 100755 index 00000000..f8b2a958 --- /dev/null +++ b/scripts/ckeditor/core/dataprocessor.js @@ -0,0 +1,70 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the "virtual" {@link CKEDITOR.dataProcessor} class, which + * defines the basic structure of data processor objects to be + * set to {@link CKEDITOR.editor.dataProcessor}. + */ + +/** + * If defined, points to the data processor which is responsible to translate + * and transform the editor data on input and output. + * Generaly it will point to an instance of {@link CKEDITOR.htmlDataProcessor}, + * which handles HTML data. The editor may also handle other data formats by + * using different data processors provided by specific plugins. + * + * @property {CKEDITOR.dataProcessor} dataProcessor + * @member CKEDITOR.editor + */ + +/** + * Represents a data processor, which is responsible to translate and + * transform the editor data on input and output. + * + * This class is here for documentation purposes only and is not really part of + * the API. It serves as the base ("interface") for data processors implementation. + * + * @class CKEDITOR.dataProcessor + * @abstract + */ + +/** + * Transforms input data into HTML to be loaded in the editor. + * While the editor is able to handle non HTML data (like BBCode), at runtime + * it can handle HTML data only. The role of the data processor is transforming + * the input data into HTML through this function. + * + * // Tranforming BBCode data, having a custom BBCode data processor. + * var data = 'This is [b]an example[/b].'; + * var html = editor.dataProcessor.toHtml( data ); // '<p>This is <b>an example</b>.</p>' + * + * @method toHtml + * @param {String} data The input data to be transformed. + * @param {String} [fixForBody] The tag name to be used if the data must be + * fixed because it is supposed to be loaded direcly into the `<body>` + * tag. This is generally not used by non-HTML data processors. + * @todo fixForBody type - compare to htmlDataProcessor. + */ + +/** + * Transforms HTML into data to be outputted by the editor, in the format + * expected by the data processor. + * + * While the editor is able to handle non HTML data (like BBCode), at runtime + * it can handle HTML data only. The role of the data processor is transforming + * the HTML data containined by the editor into a specific data format through + * this function. + * + * // Tranforming into BBCode data, having a custom BBCode data processor. + * var html = '<p>This is <b>an example</b>.</p>'; + * var data = editor.dataProcessor.toDataFormat( html ); // 'This is [b]an example[/b].' + * + * @method toDataFormat + * @param {String} html The HTML to be transformed. + * @param {String} fixForBody The tag name to be used if the output data is + * coming from `<body>` and may be eventually fixed for it. This is + * generally not used by non-HTML data processors. + */ diff --git a/scripts/ckeditor/core/dom.js b/scripts/ckeditor/core/dom.js new file mode 100755 index 00000000..9aef5bec --- /dev/null +++ b/scripts/ckeditor/core/dom.js @@ -0,0 +1,13 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.dom} object, which contains DOM + * manipulation objects and function. + */ + +CKEDITOR.dom = {}; + +// PACKAGER_RENAME( CKEDITOR.dom ) diff --git a/scripts/ckeditor/core/dom/comment.js b/scripts/ckeditor/core/dom/comment.js new file mode 100755 index 00000000..d772265b --- /dev/null +++ b/scripts/ckeditor/core/dom/comment.js @@ -0,0 +1,53 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.dom.comment} class, which represents + * a DOM comment node. + */ + +/** + * Represents a DOM comment node. + * + * var nativeNode = document.createComment( 'Example' ); + * var comment = new CKEDITOR.dom.comment( nativeNode ); + * + * var comment = new CKEDITOR.dom.comment( 'Example' ); + * + * @class + * @extends CKEDITOR.dom.node + * @constructor Creates a comment class instance. + * @param {Object/String} comment A native DOM comment node or a string containing + * the text to use to create a new comment node. + * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain + * the node in case of new node creation. Defaults to the current document. + */ +CKEDITOR.dom.comment = function( comment, ownerDocument ) { + if ( typeof comment == 'string' ) + comment = ( ownerDocument ? ownerDocument.$ : document ).createComment( comment ); + + CKEDITOR.dom.domObject.call( this, comment ); +}; + +CKEDITOR.dom.comment.prototype = new CKEDITOR.dom.node(); + +CKEDITOR.tools.extend( CKEDITOR.dom.comment.prototype, { + /** + * The node type. This is a constant value set to {@link CKEDITOR#NODE_COMMENT}. + * + * @readonly + * @property {Number} [=CKEDITOR.NODE_COMMENT] + */ + type: CKEDITOR.NODE_COMMENT, + + /** + * Gets the outer HTML of this comment. + * + * @returns {String} The HTML `<!-- comment value -->`. + */ + getOuterHtml: function() { + return '<!--' + this.$.nodeValue + '-->'; + } +} ); diff --git a/scripts/ckeditor/core/dom/document.js b/scripts/ckeditor/core/dom/document.js new file mode 100755 index 00000000..7645c194 --- /dev/null +++ b/scripts/ckeditor/core/dom/document.js @@ -0,0 +1,316 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.dom.document} class, which + * represents a DOM document. + */ + +/** + * Represents a DOM document. + * + * var document = new CKEDITOR.dom.document( document ); + * + * @class + * @extends CKEDITOR.dom.domObject + * @constructor Creates a document class instance. + * @param {Object} domDocument A native DOM document. + */ +CKEDITOR.dom.document = function( domDocument ) { + CKEDITOR.dom.domObject.call( this, domDocument ); +}; + +// PACKAGER_RENAME( CKEDITOR.dom.document ) + +CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject(); + +CKEDITOR.tools.extend( CKEDITOR.dom.document.prototype, { + /** + * The node type. This is a constant value set to {@link CKEDITOR#NODE_DOCUMENT}. + * + * @readonly + * @property {Number} [=CKEDITOR.NODE_DOCUMENT] + */ + type: CKEDITOR.NODE_DOCUMENT, + + /** + * Appends a CSS file to the document. + * + * CKEDITOR.document.appendStyleSheet( '/mystyles.css' ); + * + * @param {String} cssFileUrl The CSS file URL. + */ + appendStyleSheet: function( cssFileUrl ) { + if ( this.$.createStyleSheet ) + this.$.createStyleSheet( cssFileUrl ); + else { + var link = new CKEDITOR.dom.element( 'link' ); + link.setAttributes( { + rel: 'stylesheet', + type: 'text/css', + href: cssFileUrl + } ); + + this.getHead().append( link ); + } + }, + + /** + * Creates a CSS style sheet and inserts it into the document. + * + * @param cssStyleText {String} CSS style text. + * @returns {Object} The created DOM native style sheet object. + */ + appendStyleText: function( cssStyleText ) { + if ( this.$.createStyleSheet ) { + var styleSheet = this.$.createStyleSheet( "" ); + styleSheet.cssText = cssStyleText; + } else { + var style = new CKEDITOR.dom.element( 'style', this ); + style.append( new CKEDITOR.dom.text( cssStyleText, this ) ); + this.getHead().append( style ); + } + + return styleSheet || style.$.sheet; + }, + + /** + * Creates {@link CKEDITOR.dom.element} instance in this document. + * + * @returns {CKEDITOR.dom.element} + * @todo + */ + createElement: function( name, attribsAndStyles ) { + var element = new CKEDITOR.dom.element( name, this ); + + if ( attribsAndStyles ) { + if ( attribsAndStyles.attributes ) + element.setAttributes( attribsAndStyles.attributes ); + + if ( attribsAndStyles.styles ) + element.setStyles( attribsAndStyles.styles ); + } + + return element; + }, + + /** + * Creates {@link CKEDITOR.dom.text} instance in this document. + * + * @param {String} text Value of the text node. + * @returns {CKEDITOR.dom.element} + */ + createText: function( text ) { + return new CKEDITOR.dom.text( text, this ); + }, + + /** + * Moves the selection focus to this document's window. + */ + focus: function() { + this.getWindow().focus(); + }, + + /** + * Returns the element that is currently designated as the active element in the document. + * + * **Note:** Only one element can be active at a time in a document. + * An active element does not necessarily have focus, + * but an element with focus is always the active element in a document. + * + * @returns {CKEDITOR.dom.element} + */ + getActive: function() { + return new CKEDITOR.dom.element( this.$.activeElement ); + }, + + /** + * Gets an element based on its id. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * alert( element.getId() ); // 'myElement' + * + * @param {String} elementId The element id. + * @returns {CKEDITOR.dom.element} The element instance, or null if not found. + */ + getById: function( elementId ) { + var $ = this.$.getElementById( elementId ); + return $ ? new CKEDITOR.dom.element( $ ) : null; + }, + + /** + * Gets a node based on its address. See {@link CKEDITOR.dom.node#getAddress}. + * + * @param {Array} address + * @param {Boolean} [normalized=false] + */ + getByAddress: function( address, normalized ) { + var $ = this.$.documentElement; + + for ( var i = 0; $ && i < address.length; i++ ) { + var target = address[ i ]; + + if ( !normalized ) { + $ = $.childNodes[ target ]; + continue; + } + + var currentIndex = -1; + + for ( var j = 0; j < $.childNodes.length; j++ ) { + var candidate = $.childNodes[ j ]; + + if ( normalized === true && candidate.nodeType == 3 && candidate.previousSibling && candidate.previousSibling.nodeType == 3 ) + continue; + + currentIndex++; + + if ( currentIndex == target ) { + $ = candidate; + break; + } + } + } + + return $ ? new CKEDITOR.dom.node( $ ) : null; + }, + + /** + * Gets elements list based on given tag name. + * + * @param {String} tagName The element tag name. + * @returns {CKEDITOR.dom.nodeList} The nodes list. + */ + getElementsByTag: function( tagName, namespace ) { + if ( !( CKEDITOR.env.ie && !( document.documentMode > 8 ) ) && namespace ) + tagName = namespace + ':' + tagName; + return new CKEDITOR.dom.nodeList( this.$.getElementsByTagName( tagName ) ); + }, + + /** + * Gets the `<head>` element for this document. + * + * var element = CKEDITOR.document.getHead(); + * alert( element.getName() ); // 'head' + * + * @returns {CKEDITOR.dom.element} The `<head>` element. + */ + getHead: function() { + var head = this.$.getElementsByTagName( 'head' )[ 0 ]; + if ( !head ) + head = this.getDocumentElement().append( new CKEDITOR.dom.element( 'head' ), true ); + else + head = new CKEDITOR.dom.element( head ); + + return head; + }, + + /** + * Gets the `<body>` element for this document. + * + * var element = CKEDITOR.document.getBody(); + * alert( element.getName() ); // 'body' + * + * @returns {CKEDITOR.dom.element} The `<body>` element. + */ + getBody: function() { + return new CKEDITOR.dom.element( this.$.body ); + }, + + /** + * Gets the DOM document element for this document. + * + * @returns {CKEDITOR.dom.element} The DOM document element. + */ + getDocumentElement: function() { + return new CKEDITOR.dom.element( this.$.documentElement ); + }, + + /** + * Gets the window object that holds this document. + * + * @returns {CKEDITOR.dom.window} The window object. + */ + getWindow: function() { + return new CKEDITOR.dom.window( this.$.parentWindow || this.$.defaultView ); + }, + + /** + * Defines the document contents through document.write. Note that the + * previous document contents will be lost (cleaned). + * + * document.write( + * '<html>' + + * '<head><title>Sample Doc' + + * 'Document contents created by code' + + * '' + * ); + * + * @since 3.5 + * @param {String} html The HTML defining the document contents. + */ + write: function( html ) { + // Don't leave any history log in IE. (#5657) + this.$.open( 'text/html', 'replace' ); + + // Support for custom document.domain in IE. + // + // The script must be appended because if placed before the + // doctype, IE will go into quirks mode and mess with + // the editable, e.g. by changing its default height. + if ( CKEDITOR.env.ie ) + html = html.replace( /(?:^\s*]*?>)|^/i, '$&\n' ); + + this.$.write( html ); + this.$.close(); + }, + + /** + * Wrapper for `querySelectorAll`. Returns a list of elements within this document that match + * specified `selector`. + * + * **Note:** returned list is not a live collection (like a result of native `querySelectorAll`). + * + * @since 4.3 + * @param {String} selector + * @returns {CKEDITOR.dom.nodeList} + */ + find: function( selector ) { + return new CKEDITOR.dom.nodeList( this.$.querySelectorAll( selector ) ); + }, + + /** + * Wrapper for `querySelector`. Returns first element within this document that matches + * specified `selector`. + * + * @since 4.3 + * @param {String} selector + * @returns {CKEDITOR.dom.element} + */ + findOne: function( selector ) { + var el = this.$.querySelector( selector ); + + return el ? new CKEDITOR.dom.element( el ) : null; + }, + + /** + * IE8 only method. It returns document fragment which has all HTML5 elements enabled. + * + * @since 4.3 + * @private + * @returns DocumentFragment + */ + _getHtml5ShivFrag: function() { + var $frag = this.getCustomData( 'html5ShivFrag' ); + + if ( !$frag ) { + $frag = this.$.createDocumentFragment(); + CKEDITOR.tools.enableHtml5Elements( $frag, true ); + this.setCustomData( 'html5ShivFrag', $frag ); + } + + return $frag; + } +} ); diff --git a/scripts/ckeditor/core/dom/documentfragment.js b/scripts/ckeditor/core/dom/documentfragment.js new file mode 100755 index 00000000..c1af8992 --- /dev/null +++ b/scripts/ckeditor/core/dom/documentfragment.js @@ -0,0 +1,45 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * DocumentFragment is a "lightweight" or "minimal" Document object. It is + * commonly used to extract a portion of a document's tree or to create a new + * fragment of a document. Various operations may take DocumentFragment objects + * as arguments and results in all the child nodes of the DocumentFragment being + * moved to the child list of this node. + * + * @class + * @constructor Creates a document fragment class instance. + * @param {Object} nodeOrDoc + * @todo example and param doc + */ +CKEDITOR.dom.documentFragment = function( nodeOrDoc ) { + nodeOrDoc = nodeOrDoc || CKEDITOR.document; + + if ( nodeOrDoc.type == CKEDITOR.NODE_DOCUMENT ) + this.$ = nodeOrDoc.$.createDocumentFragment(); + else + this.$ = nodeOrDoc; +}; + +CKEDITOR.tools.extend( CKEDITOR.dom.documentFragment.prototype, CKEDITOR.dom.element.prototype, { + /** + * The node type. This is a constant value set to {@link CKEDITOR#NODE_DOCUMENT_FRAGMENT}. + * + * @readonly + * @property {Number} [=CKEDITOR.NODE_DOCUMENT_FRAGMENT] + */ + type: CKEDITOR.NODE_DOCUMENT_FRAGMENT, + + /** + * Inserts document fragment's contents after specified node. + * + * @param {CKEDITOR.dom.node} node + */ + insertAfterNode: function( node ) { + node = node.$; + node.parentNode.insertBefore( this.$, node.nextSibling ); + } +}, true, { 'append': 1, 'appendBogus': 1, 'getFirst': 1, 'getLast': 1, 'getParent': 1, 'getNext': 1, 'getPrevious': 1, 'appendTo': 1, 'moveChildren': 1, 'insertBefore': 1, 'insertAfterNode': 1, 'replace': 1, 'trim': 1, 'type': 1, 'ltrim': 1, 'rtrim': 1, 'getDocument': 1, 'getChildCount': 1, 'getChild': 1, 'getChildren': 1 } ); diff --git a/scripts/ckeditor/core/dom/domobject.js b/scripts/ckeditor/core/dom/domobject.js new file mode 100755 index 00000000..b0c7f369 --- /dev/null +++ b/scripts/ckeditor/core/dom/domobject.js @@ -0,0 +1,266 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.editor} class, which is the base + * for other classes representing DOM objects. + */ + +/** + * Represents a DOM object. This class is not intended to be used directly. It + * serves as the base class for other classes representing specific DOM + * objects. + * + * @class + * @mixins CKEDITOR.event + * @constructor Creates a domObject class instance. + * @param {Object} nativeDomObject A native DOM object. + */ +CKEDITOR.dom.domObject = function( nativeDomObject ) { + if ( nativeDomObject ) { + /** + * The native DOM object represented by this class instance. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * alert( element.$.nodeType ); // '1' + * + * @readonly + * @property {Object} + */ + this.$ = nativeDomObject; + } +}; + +CKEDITOR.dom.domObject.prototype = ( function() { + // Do not define other local variables here. We want to keep the native + // listener closures as clean as possible. + + var getNativeListener = function( domObject, eventName ) { + return function( domEvent ) { + // In FF, when reloading the page with the editor focused, it may + // throw an error because the CKEDITOR global is not anymore + // available. So, we check it here first. (#2923) + if ( typeof CKEDITOR != 'undefined' ) + domObject.fire( eventName, new CKEDITOR.dom.event( domEvent ) ); + }; + }; + + return { + + /** + * Get the private `_` object which is bound to the native + * DOM object using {@link #getCustomData}. + * + * var elementA = new CKEDITOR.dom.element( nativeElement ); + * elementA.getPrivate().value = 1; + * ... + * var elementB = new CKEDITOR.dom.element( nativeElement ); + * elementB.getPrivate().value; // 1 + * + * @returns {Object} The private object. + */ + getPrivate: function() { + var priv; + + // Get the main private object from the custom data. Create it if not defined. + if ( !( priv = this.getCustomData( '_' ) ) ) + this.setCustomData( '_', ( priv = {} ) ); + + return priv; + }, + + // Docs inherited from event. + on: function( eventName ) { + // We customize the "on" function here. The basic idea is that we'll have + // only one listener for a native event, which will then call all listeners + // set to the event. + + // Get the listeners holder object. + var nativeListeners = this.getCustomData( '_cke_nativeListeners' ); + + if ( !nativeListeners ) { + nativeListeners = {}; + this.setCustomData( '_cke_nativeListeners', nativeListeners ); + } + + // Check if we have a listener for that event. + if ( !nativeListeners[ eventName ] ) { + var listener = nativeListeners[ eventName ] = getNativeListener( this, eventName ); + + if ( this.$.addEventListener ) + this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture ); + else if ( this.$.attachEvent ) + this.$.attachEvent( 'on' + eventName, listener ); + } + + // Call the original implementation. + return CKEDITOR.event.prototype.on.apply( this, arguments ); + }, + + // Docs inherited from event. + removeListener: function( eventName ) { + // Call the original implementation. + CKEDITOR.event.prototype.removeListener.apply( this, arguments ); + + // If we don't have listeners for this event, clean the DOM up. + if ( !this.hasListeners( eventName ) ) { + var nativeListeners = this.getCustomData( '_cke_nativeListeners' ); + var listener = nativeListeners && nativeListeners[ eventName ]; + if ( listener ) { + if ( this.$.removeEventListener ) + this.$.removeEventListener( eventName, listener, false ); + else if ( this.$.detachEvent ) + this.$.detachEvent( 'on' + eventName, listener ); + + delete nativeListeners[ eventName ]; + } + } + }, + + /** + * Removes any listener set on this object. + * + * To avoid memory leaks we must assure that there are no + * references left after the object is no longer needed. + */ + removeAllListeners: function() { + var nativeListeners = this.getCustomData( '_cke_nativeListeners' ); + for ( var eventName in nativeListeners ) { + var listener = nativeListeners[ eventName ]; + if ( this.$.detachEvent ) + this.$.detachEvent( 'on' + eventName, listener ); + else if ( this.$.removeEventListener ) + this.$.removeEventListener( eventName, listener, false ); + + delete nativeListeners[ eventName ]; + } + + // Remove events from events object so fire() method will not call + // listeners (#11400). + CKEDITOR.event.prototype.removeAllListeners.call( this ); + } + }; +} )(); + +( function( domObjectProto ) { + var customData = {}; + + CKEDITOR.on( 'reset', function() { + customData = {}; + } ); + + /** + * Determines whether the specified object is equal to the current object. + * + * var doc = new CKEDITOR.dom.document( document ); + * alert( doc.equals( CKEDITOR.document ) ); // true + * alert( doc == CKEDITOR.document ); // false + * + * @param {Object} object The object to compare with the current object. + * @returns {Boolean} `true` if the object is equal. + */ + domObjectProto.equals = function( object ) { + // Try/Catch to avoid IE permission error when object is from different document. + try { + return ( object && object.$ === this.$ ); + } catch ( er ) { + return false; + } + }; + + /** + * Sets a data slot value for this object. These values are shared by all + * instances pointing to that same DOM object. + * + * **Note:** The created data slot is only guarantied to be available on this unique dom node, + * thus any wish to continue access it from other element clones (either created by + * clone node or from `innerHtml`) will fail, for such usage, please use + * {@link CKEDITOR.dom.element#setAttribute} instead. + * + * **Note**: This method does not work on text nodes prior to Internet Explorer 9. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * element.setCustomData( 'hasCustomData', true ); + * + * @param {String} key A key used to identify the data slot. + * @param {Object} value The value to set to the data slot. + * @returns {CKEDITOR.dom.domObject} This DOM object instance. + * @chainable + */ + domObjectProto.setCustomData = function( key, value ) { + var expandoNumber = this.getUniqueId(), + dataSlot = customData[ expandoNumber ] || ( customData[ expandoNumber ] = {} ); + + dataSlot[ key ] = value; + + return this; + }; + + /** + * Gets the value set to a data slot in this object. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * alert( element.getCustomData( 'hasCustomData' ) ); // e.g. 'true' + * alert( element.getCustomData( 'nonExistingKey' ) ); // null + * + * @param {String} key The key used to identify the data slot. + * @returns {Object} This value set to the data slot. + */ + domObjectProto.getCustomData = function( key ) { + var expandoNumber = this.$[ 'data-cke-expando' ], + dataSlot = expandoNumber && customData[ expandoNumber ]; + + return ( dataSlot && key in dataSlot ) ? dataSlot[ key ] : null; + }; + + /** + * Removes the value in data slot under given `key`. + * + * @param {String} key + * @returns {Object} Removed value or `null` if not found. + */ + domObjectProto.removeCustomData = function( key ) { + var expandoNumber = this.$[ 'data-cke-expando' ], + dataSlot = expandoNumber && customData[ expandoNumber ], + retval, hadKey; + + if ( dataSlot ) { + retval = dataSlot[ key ]; + hadKey = key in dataSlot; + delete dataSlot[ key ]; + } + + return hadKey ? retval : null; + }; + + /** + * Removes any data stored on this object. + * To avoid memory leaks we must assure that there are no + * references left after the object is no longer needed. + */ + domObjectProto.clearCustomData = function() { + // Clear all event listeners + this.removeAllListeners(); + + var expandoNumber = this.$[ 'data-cke-expando' ]; + expandoNumber && delete customData[ expandoNumber ]; + }; + + /** + * Gets an ID that can be used to identify this DOM object in + * the running session. + * + * **Note**: This method does not work on text nodes prior to Internet Explorer 9. + * + * @returns {Number} A unique ID. + */ + domObjectProto.getUniqueId = function() { + return this.$[ 'data-cke-expando' ] || ( this.$[ 'data-cke-expando' ] = CKEDITOR.tools.getNextNumber() ); + }; + + // Implement CKEDITOR.event. + CKEDITOR.event.implementOn( domObjectProto ); + +} )( CKEDITOR.dom.domObject.prototype ); diff --git a/scripts/ckeditor/core/dom/element.js b/scripts/ckeditor/core/dom/element.js new file mode 100755 index 00000000..a78d4c85 --- /dev/null +++ b/scripts/ckeditor/core/dom/element.js @@ -0,0 +1,2039 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the {@link CKEDITOR.dom.element} class, which + * represents a DOM element. + */ + +/** + * Represents a DOM element. + * + * // Create a new element. + * var element = new CKEDITOR.dom.element( 'span' ); + * + * // Create an element based on a native DOM element. + * var element = new CKEDITOR.dom.element( document.getElementById( 'myId' ) ); + * + * @class + * @extends CKEDITOR.dom.node + * @constructor Creates an element class instance. + * @param {Object/String} element A native DOM element or the element name for + * new elements. + * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain + * the element in case of element creation. + */ +CKEDITOR.dom.element = function( element, ownerDocument ) { + if ( typeof element == 'string' ) + element = ( ownerDocument ? ownerDocument.$ : document ).createElement( element ); + + // Call the base constructor (we must not call CKEDITOR.dom.node). + CKEDITOR.dom.domObject.call( this, element ); +}; + +// PACKAGER_RENAME( CKEDITOR.dom.element ) +/** + * The the {@link CKEDITOR.dom.element} representing and element. If the + * element is a native DOM element, it will be transformed into a valid + * CKEDITOR.dom.element object. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * alert( element == CKEDITOR.dom.element.get( element ) ); // true + * + * var element = document.getElementById( 'myElement' ); + * alert( CKEDITOR.dom.element.get( element ).getName() ); // (e.g.) 'p' + * + * @static + * @param {String/Object} element Element's id or name or native DOM element. + * @returns {CKEDITOR.dom.element} The transformed element. + */ +CKEDITOR.dom.element.get = function( element ) { + var el = typeof element == 'string' ? document.getElementById( element ) || document.getElementsByName( element )[ 0 ] : element; + + return el && ( el.$ ? el : new CKEDITOR.dom.element( el ) ); +}; + +CKEDITOR.dom.element.prototype = new CKEDITOR.dom.node(); + +/** + * Creates an instance of the {@link CKEDITOR.dom.element} class based on the + * HTML representation of an element. + * + * var element = CKEDITOR.dom.element.createFromHtml( 'My element' ); + * alert( element.getName() ); // 'strong' + * + * @static + * @param {String} html The element HTML. It should define only one element in + * the "root" level. The "root" element can have child nodes, but not siblings. + * @returns {CKEDITOR.dom.element} The element instance. + */ +CKEDITOR.dom.element.createFromHtml = function( html, ownerDocument ) { + var temp = new CKEDITOR.dom.element( 'div', ownerDocument ); + temp.setHtml( html ); + + // When returning the node, remove it from its parent to detach it. + return temp.getFirst().remove(); +}; + +/** + * @static + * @todo + */ +CKEDITOR.dom.element.setMarker = function( database, element, name, value ) { + var id = element.getCustomData( 'list_marker_id' ) || ( element.setCustomData( 'list_marker_id', CKEDITOR.tools.getNextNumber() ).getCustomData( 'list_marker_id' ) ), + markerNames = element.getCustomData( 'list_marker_names' ) || ( element.setCustomData( 'list_marker_names', {} ).getCustomData( 'list_marker_names' ) ); + database[ id ] = element; + markerNames[ name ] = 1; + + return element.setCustomData( name, value ); +}; + +/** + * @static + * @todo + */ +CKEDITOR.dom.element.clearAllMarkers = function( database ) { + for ( var i in database ) + CKEDITOR.dom.element.clearMarkers( database, database[ i ], 1 ); +}; + +/** + * @static + * @todo + */ +CKEDITOR.dom.element.clearMarkers = function( database, element, removeFromDatabase ) { + var names = element.getCustomData( 'list_marker_names' ), + id = element.getCustomData( 'list_marker_id' ); + for ( var i in names ) + element.removeCustomData( i ); + element.removeCustomData( 'list_marker_names' ); + if ( removeFromDatabase ) { + element.removeCustomData( 'list_marker_id' ); + delete database[ id ]; + } +}; +( function() { + +CKEDITOR.tools.extend( CKEDITOR.dom.element.prototype, { + /** + * The node type. This is a constant value set to {@link CKEDITOR#NODE_ELEMENT}. + * + * @readonly + * @property {Number} [=CKEDITOR.NODE_ELEMENT] + */ + type: CKEDITOR.NODE_ELEMENT, + + /** + * Adds a CSS class to the element. It appends the class to the + * already existing names. + * + * var element = new CKEDITOR.dom.element( 'div' ); + * element.addClass( 'classA' ); //
+ * element.addClass( 'classB' ); //
+ * element.addClass( 'classA' ); //
+ * + * @chainable + * @param {String} className The name of the class to be added. + */ + addClass: function( className ) { + var c = this.$.className; + if ( c ) { + var regex = new RegExp( '(?:^|\\s)' + className + '(?:\\s|$)', '' ); + if ( !regex.test( c ) ) + c += ' ' + className; + } + this.$.className = c || className; + + return this; + }, + + /** + * Removes a CSS class name from the elements classes. Other classes + * remain untouched. + * + * var element = new CKEDITOR.dom.element( 'div' ); + * element.addClass( 'classA' ); //
+ * element.addClass( 'classB' ); //
+ * element.removeClass( 'classA' ); //
+ * element.removeClass( 'classB' ); //
+ * + * @chainable + * @param {String} className The name of the class to remove. + */ + removeClass: function( className ) { + var c = this.getAttribute( 'class' ); + if ( c ) { + var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', 'i' ); + if ( regex.test( c ) ) { + c = c.replace( regex, '' ).replace( /^\s+/, '' ); + + if ( c ) + this.setAttribute( 'class', c ); + else + this.removeAttribute( 'class' ); + } + } + + return this; + }, + + /** + * Checks if element has class name. + * + * @param {String} className + * @returns {Boolean} + */ + hasClass: function( className ) { + var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' ); + return regex.test( this.getAttribute( 'class' ) ); + }, + + /** + * Append a node as a child of this element. + * + * var p = new CKEDITOR.dom.element( 'p' ); + * + * var strong = new CKEDITOR.dom.element( 'strong' ); + * p.append( strong ); + * + * var em = p.append( 'em' ); + * + * // Result: '

' + * + * @param {CKEDITOR.dom.node/String} node The node or element name to be appended. + * @param {Boolean} [toStart=false] Indicates that the element is to be appended at the start. + * @returns {CKEDITOR.dom.node} The appended node. + */ + append: function( node, toStart ) { + if ( typeof node == 'string' ) + node = this.getDocument().createElement( node ); + + if ( toStart ) + this.$.insertBefore( node.$, this.$.firstChild ); + else + this.$.appendChild( node.$ ); + + return node; + }, + + /** + * Append HTML as a child(ren) of this element. + * + * @param {String} html + */ + appendHtml: function( html ) { + if ( !this.$.childNodes.length ) + this.setHtml( html ); + else { + var temp = new CKEDITOR.dom.element( 'div', this.getDocument() ); + temp.setHtml( html ); + temp.moveChildren( this ); + } + }, + + /** + * Append text to this element. + * + * var p = new CKEDITOR.dom.element( 'p' ); + * p.appendText( 'This is' ); + * p.appendText( ' some text' ); + * + * // Result: '

This is some text

' + * + * @param {String} text The text to be appended. + * @returns {CKEDITOR.dom.node} The appended node. + */ + appendText: function( text ) { + if ( this.$.text != undefined ) + this.$.text += text; + else + this.append( new CKEDITOR.dom.text( text ) ); + }, + + /** + * Appends a `
` filler element to this element if the filler is not present already. + * By default filler is appended only if {@link CKEDITOR.env#needsBrFiller} is `true`, + * however when `force` is set to `true` filler will be appended regardless of the environment. + * + * @param {Boolean} [force] Append filler regardless of the environment. + */ + appendBogus: function( force ) { + if ( !force && !CKEDITOR.env.needsBrFiller ) + return; + + var lastChild = this.getLast(); + + // Ignore empty/spaces text. + while ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.rtrim( lastChild.getText() ) ) + lastChild = lastChild.getPrevious(); + if ( !lastChild || !lastChild.is || !lastChild.is( 'br' ) ) { + var bogus = this.getDocument().createElement( 'br' ); + + CKEDITOR.env.gecko && bogus.setAttribute( 'type', '_moz' ); + + this.append( bogus ); + } + }, + + /** + * Breaks one of the ancestor element in the element position, moving + * this element between the broken parts. + * + * // Before breaking: + * // This is some sample test text + * // If "element" is and "parent" is : + * // This is some sample test text + * element.breakParent( parent ); + * + * // Before breaking: + * // This is some sample test text + * // If "element" is and "parent" is : + * // This is some sample test text + * element.breakParent( parent ); + * + * @param {CKEDITOR.dom.element} parent The anscestor element to get broken. + */ + breakParent: function( parent ) { + var range = new CKEDITOR.dom.range( this.getDocument() ); + + // We'll be extracting part of this element, so let's use our + // range to get the correct piece. + range.setStartAfter( this ); + range.setEndAfter( parent ); + + // Extract it. + var docFrag = range.extractContents(); + + // Move the element outside the broken element. + range.insertNode( this.remove() ); + + // Re-insert the extracted piece after the element. + docFrag.insertAfterNode( this ); + }, + + /** + * Checks if this element contains given node. + * + * @method + * @param {CKEDITOR.dom.node} node + * @returns {Boolean} + */ + contains: CKEDITOR.env.ie || CKEDITOR.env.webkit ? + function( node ) { + var $ = this.$; + + return node.type != CKEDITOR.NODE_ELEMENT ? $.contains( node.getParent().$ ) : $ != node.$ && $.contains( node.$ ); + } : function( node ) { + return !!( this.$.compareDocumentPosition( node.$ ) & 16 ); + }, + + /** + * Moves the selection focus to this element. + * + * var element = CKEDITOR.document.getById( 'myTextarea' ); + * element.focus(); + * + * @method + * @param {Boolean} defer Whether to asynchronously defer the + * execution by 100 ms. + */ + focus: ( function() { + function exec() { + // IE throws error if the element is not visible. + try { + this.$.focus(); + } catch ( e ) {} + } + + return function( defer ) { + if ( defer ) + CKEDITOR.tools.setTimeout( exec, 100, this ); + else + exec.call( this ); + }; + } )(), + + /** + * Gets the inner HTML of this element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); + * alert( element.getHtml() ); // 'Example' + * + * @returns {String} The inner HTML of this element. + */ + getHtml: function() { + var retval = this.$.innerHTML; + // Strip tags in IE. (#3341). + return CKEDITOR.env.ie ? retval.replace( /<\?[^>]*>/g, '' ) : retval; + }, + + /** + * Gets the outer (inner plus tags) HTML of this element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); + * alert( element.getOuterHtml() ); // '
Example
' + * + * @returns {String} The outer HTML of this element. + */ + getOuterHtml: function() { + if ( this.$.outerHTML ) { + // IE includes the tag in the outerHTML of + // namespaced element. So, we must strip it here. (#3341) + return this.$.outerHTML.replace( /<\?[^>]*>/, '' ); + } + + var tmpDiv = this.$.ownerDocument.createElement( 'div' ); + tmpDiv.appendChild( this.$.cloneNode( true ) ); + return tmpDiv.innerHTML; + }, + + /** + * Retrieve the bounding rectangle of the current element, in pixels, + * relative to the upper-left corner of the browser's client area. + * + * @returns {Object} The dimensions of the DOM element including + * `left`, `top`, `right`, `bottom`, `width` and `height`. + */ + getClientRect: function() { + // http://help.dottoro.com/ljvmcrrn.php + var rect = CKEDITOR.tools.extend( {}, this.$.getBoundingClientRect() ); + + !rect.width && ( rect.width = rect.right - rect.left ); + !rect.height && ( rect.height = rect.bottom - rect.top ); + + return rect; + }, + + /** + * Sets the inner HTML of this element. + * + * var p = new CKEDITOR.dom.element( 'p' ); + * p.setHtml( 'Inner HTML' ); + * + * // Result: '

Inner HTML

' + * + * @method + * @param {String} html The HTML to be set for this element. + * @returns {String} The inserted HTML. + */ + setHtml: ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) ? + // old IEs throws error on HTML manipulation (through the "innerHTML" property) + // on the element which resides in an DTD invalid position, e.g.
+ // fortunately it can be worked around with DOM manipulation. + function( html ) { + try { + var $ = this.$; + + // Fix the case when setHtml is called on detached element. + // HTML5 shiv used for document in which this element was created + // won't affect that detached element. So get document fragment with + // all HTML5 elements enabled and set innerHTML while this element is appended to it. + if ( this.getParent() ) + return ( $.innerHTML = html ); + else { + var $frag = this.getDocument()._getHtml5ShivFrag(); + $frag.appendChild( $ ); + $.innerHTML = html; + $frag.removeChild( $ ); + + return html; + } + } + catch ( e ) { + this.$.innerHTML = ''; + + var temp = new CKEDITOR.dom.element( 'body', this.getDocument() ); + temp.$.innerHTML = html; + + var children = temp.getChildren(); + while ( children.count() ) + this.append( children.getItem( 0 ) ); + + return html; + } + } + : + function( html ) { + return ( this.$.innerHTML = html ); + }, + + /** + * Sets the element contents as plain text. + * + * var element = new CKEDITOR.dom.element( 'div' ); + * element.setText( 'A > B & C < D' ); + * alert( element.innerHTML ); // 'A > B & C < D' + * + * @param {String} text The text to be set. + * @returns {String} The inserted text. + */ + setText: ( function() { + var supportsTextContent = document.createElement( 'p' ); + supportsTextContent.innerHTML = 'x'; + supportsTextContent = supportsTextContent.textContent; + + return function( text ) { + this.$[ supportsTextContent ? 'textContent' : 'innerText' ] = text; + }; + } )(), + + /** + * Gets the value of an element attribute. + * + * var element = CKEDITOR.dom.element.createFromHtml( '' ); + * alert( element.getAttribute( 'type' ) ); // 'text' + * + * @method + * @param {String} name The attribute name. + * @returns {String} The attribute value or null if not defined. + */ + getAttribute: ( function() { + var standard = function( name ) { + return this.$.getAttribute( name, 2 ); + }; + + if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ) { + return function( name ) { + switch ( name ) { + case 'class': + name = 'className'; + break; + + case 'http-equiv': + name = 'httpEquiv'; + break; + + case 'name': + return this.$.name; + + case 'tabindex': + var tabIndex = standard.call( this, name ); + + // IE returns tabIndex=0 by default for all + // elements. For those elements, + // getAtrribute( 'tabindex', 2 ) returns 32768 + // instead. So, we must make this check to give a + // uniform result among all browsers. + if ( tabIndex !== 0 && this.$.tabIndex === 0 ) + tabIndex = null; + + return tabIndex; + break; + + case 'checked': + { + var attr = this.$.attributes.getNamedItem( name ), + attrValue = attr.specified ? attr.nodeValue // For value given by parser. + : this.$.checked; // For value created via DOM interface. + + return attrValue ? 'checked' : null; + } + + case 'hspace': + case 'value': + return this.$[ name ]; + + case 'style': + // IE does not return inline styles via getAttribute(). See #2947. + return this.$.style.cssText; + + case 'contenteditable': + case 'contentEditable': + return this.$.attributes.getNamedItem( 'contentEditable' ).specified ? this.$.getAttribute( 'contentEditable' ) : null; + } + + return standard.call( this, name ); + }; + } else + return standard; + } )(), + + /** + * Gets the nodes list containing all children of this element. + * + * @returns {CKEDITOR.dom.nodeList} + */ + getChildren: function() { + return new CKEDITOR.dom.nodeList( this.$.childNodes ); + }, + + /** + * Gets the current computed value of one of the element CSS style + * properties. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * alert( element.getComputedStyle( 'display' ) ); // 'inline' + * + * @method + * @param {String} propertyName The style property name. + * @returns {String} The property value. + */ + getComputedStyle: CKEDITOR.env.ie ? + function( propertyName ) { + return this.$.currentStyle[ CKEDITOR.tools.cssStyleToDomStyle( propertyName ) ]; + } : function( propertyName ) { + var style = this.getWindow().$.getComputedStyle( this.$, null ); + // Firefox may return null if we call the above on a hidden iframe. (#9117) + return style ? style.getPropertyValue( propertyName ) : ''; + }, + + /** + * Gets the DTD entries for this element. + * + * @returns {Object} An object containing the list of elements accepted + * by this element. + */ + getDtd: function() { + var dtd = CKEDITOR.dtd[ this.getName() ]; + + this.getDtd = function() { + return dtd; + }; + + return dtd; + }, + + /** + * Gets all this element's descendants having given tag name. + * + * @method + * @param {String} tagName + */ + getElementsByTag: CKEDITOR.dom.document.prototype.getElementsByTag, + + /** + * Gets the computed tabindex for this element. + * + * var element = CKEDITOR.document.getById( 'myDiv' ); + * alert( element.getTabIndex() ); // (e.g.) '-1' + * + * @method + * @returns {Number} The tabindex value. + */ + getTabIndex: CKEDITOR.env.ie ? + function() { + var tabIndex = this.$.tabIndex; + + // IE returns tabIndex=0 by default for all elements. In + // those cases we must check that the element really has + // the tabindex attribute set to zero, or it is one of + // those element that should have zero by default. + if ( tabIndex === 0 && !CKEDITOR.dtd.$tabIndex[ this.getName() ] && parseInt( this.getAttribute( 'tabindex' ), 10 ) !== 0 ) + tabIndex = -1; + + return tabIndex; + } : CKEDITOR.env.webkit ? + function() { + var tabIndex = this.$.tabIndex; + + // Safari returns "undefined" for elements that should not + // have tabindex (like a div). So, we must try to get it + // from the attribute. + // https://bugs.webkit.org/show_bug.cgi?id=20596 + if ( tabIndex == undefined ) { + tabIndex = parseInt( this.getAttribute( 'tabindex' ), 10 ); + + // If the element don't have the tabindex attribute, + // then we should return -1. + if ( isNaN( tabIndex ) ) + tabIndex = -1; + } + + return tabIndex; + } : function() { + return this.$.tabIndex; + }, + + /** + * Gets the text value of this element. + * + * Only in IE (which uses innerText), `
` will cause linebreaks, + * and sucessive whitespaces (including line breaks) will be reduced to + * a single space. This behavior is ok for us, for now. It may change + * in the future. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Sample text.
' ); + * alert( element.getText() ); // 'Sample text.' + * + * @returns {String} The text value. + */ + getText: function() { + return this.$.textContent || this.$.innerText || ''; + }, + + /** + * Gets the window object that contains this element. + * + * @returns {CKEDITOR.dom.window} The window object. + */ + getWindow: function() { + return this.getDocument().getWindow(); + }, + + /** + * Gets the value of the `id` attribute of this element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '

' ); + * alert( element.getId() ); // 'myId' + * + * @returns {String} The element id, or null if not available. + */ + getId: function() { + return this.$.id || null; + }, + + /** + * Gets the value of the `name` attribute of this element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '' ); + * alert( element.getNameAtt() ); // 'myName' + * + * @returns {String} The element name, or null if not available. + */ + getNameAtt: function() { + return this.$.name || null; + }, + + /** + * Gets the element name (tag name). The returned name is guaranteed to + * be always full lowercased. + * + * var element = new CKEDITOR.dom.element( 'span' ); + * alert( element.getName() ); // 'span' + * + * @returns {String} The element name. + */ + getName: function() { + // Cache the lowercased name inside a closure. + var nodeName = this.$.nodeName.toLowerCase(); + + if ( CKEDITOR.env.ie && !( document.documentMode > 8 ) ) { + var scopeName = this.$.scopeName; + if ( scopeName != 'HTML' ) + nodeName = scopeName.toLowerCase() + ':' + nodeName; + } + + return ( this.getName = function() { + return nodeName; + } )(); + }, + + /** + * Gets the value set to this element. This value is usually available + * for form field elements. + * + * @returns {String} The element value. + */ + getValue: function() { + return this.$.value; + }, + + /** + * Gets the first child node of this element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); + * var first = element.getFirst(); + * alert( first.getName() ); // 'b' + * + * @param {Function} evaluator Filtering the result node. + * @returns {CKEDITOR.dom.node} The first child node or null if not available. + */ + getFirst: function( evaluator ) { + var first = this.$.firstChild, + retval = first && new CKEDITOR.dom.node( first ); + if ( retval && evaluator && !evaluator( retval ) ) + retval = retval.getNext( evaluator ); + + return retval; + }, + + /** + * See {@link #getFirst}. + * + * @param {Function} evaluator Filtering the result node. + * @returns {CKEDITOR.dom.node} + */ + getLast: function( evaluator ) { + var last = this.$.lastChild, + retval = last && new CKEDITOR.dom.node( last ); + if ( retval && evaluator && !evaluator( retval ) ) + retval = retval.getPrevious( evaluator ); + + return retval; + }, + + /** + * Gets CSS style value. + * + * @param {String} name The CSS property name. + * @returns {String} Style value. + */ + getStyle: function( name ) { + return this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ]; + }, + + /** + * Checks if the element name matches the specified criteria. + * + * var element = new CKEDITOR.element( 'span' ); + * alert( element.is( 'span' ) ); // true + * alert( element.is( 'p', 'span' ) ); // true + * alert( element.is( 'p' ) ); // false + * alert( element.is( 'p', 'div' ) ); // false + * alert( element.is( { p:1,span:1 } ) ); // true + * + * @param {String.../Object} name One or more names to be checked, or a {@link CKEDITOR.dtd} object. + * @returns {Boolean} `true` if the element name matches any of the names. + */ + is: function() { + var name = this.getName(); + + // Check against the specified DTD liternal. + if ( typeof arguments[ 0 ] == 'object' ) + return !!arguments[ 0 ][ name ]; + + // Check for tag names + for ( var i = 0; i < arguments.length; i++ ) { + if ( arguments[ i ] == name ) + return true; + } + return false; + }, + + /** + * Decide whether one element is able to receive cursor. + * + * @param {Boolean} [textCursor=true] Only consider element that could receive text child. + */ + isEditable: function( textCursor ) { + var name = this.getName(); + + if ( this.isReadOnly() || this.getComputedStyle( 'display' ) == 'none' || + this.getComputedStyle( 'visibility' ) == 'hidden' || + CKEDITOR.dtd.$nonEditable[ name ] || + CKEDITOR.dtd.$empty[ name ] || + ( this.is( 'a' ) && + ( this.data( 'cke-saved-name' ) || this.hasAttribute( 'name' ) ) && + !this.getChildCount() + ) ) + { + return false; + } + + if ( textCursor !== false ) { + // Get the element DTD (defaults to span for unknown elements). + var dtd = CKEDITOR.dtd[ name ] || CKEDITOR.dtd.span; + // In the DTD # == text node. + return !!( dtd && dtd[ '#' ] ); + } + + return true; + }, + + /** + * Compare this element's inner html, tag name, attributes, etc. with other one. + * + * See [W3C's DOM Level 3 spec - node#isEqualNode](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isEqualNode) + * for more details. + * + * @param {CKEDITOR.dom.element} otherElement Element to compare. + * @returns {Boolean} + */ + isIdentical: function( otherElement ) { + // do shallow clones, but with IDs + var thisEl = this.clone( 0, 1 ), + otherEl = otherElement.clone( 0, 1 ); + + // Remove distractions. + thisEl.removeAttributes( [ '_moz_dirty', 'data-cke-expando', 'data-cke-saved-href', 'data-cke-saved-name' ] ); + otherEl.removeAttributes( [ '_moz_dirty', 'data-cke-expando', 'data-cke-saved-href', 'data-cke-saved-name' ] ); + + // Native comparison available. + if ( thisEl.$.isEqualNode ) { + // Styles order matters. + thisEl.$.style.cssText = CKEDITOR.tools.normalizeCssText( thisEl.$.style.cssText ); + otherEl.$.style.cssText = CKEDITOR.tools.normalizeCssText( otherEl.$.style.cssText ); + return thisEl.$.isEqualNode( otherEl.$ ); + } else { + thisEl = thisEl.getOuterHtml(); + otherEl = otherEl.getOuterHtml(); + + // Fix tiny difference between link href in older IEs. + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 && this.is( 'a' ) ) { + var parent = this.getParent(); + if ( parent.type == CKEDITOR.NODE_ELEMENT ) { + var el = parent.clone(); + el.setHtml( thisEl ), thisEl = el.getHtml(); + el.setHtml( otherEl ), otherEl = el.getHtml(); + } + } + + return thisEl == otherEl; + } + }, + + /** + * Checks if this element is visible. May not work if the element is + * child of an element with visibility set to `hidden`, but works well + * on the great majority of cases. + * + * @returns {Boolean} True if the element is visible. + */ + isVisible: function() { + var isVisible = ( this.$.offsetHeight || this.$.offsetWidth ) && this.getComputedStyle( 'visibility' ) != 'hidden', + elementWindow, elementWindowFrame; + + // Webkit and Opera report non-zero offsetHeight despite that + // element is inside an invisible iframe. (#4542) + if ( isVisible && CKEDITOR.env.webkit ) { + elementWindow = this.getWindow(); + + if ( !elementWindow.equals( CKEDITOR.document.getWindow() ) && ( elementWindowFrame = elementWindow.$.frameElement ) ) + isVisible = new CKEDITOR.dom.element( elementWindowFrame ).isVisible(); + + } + + return !!isVisible; + }, + + /** + * Whether it's an empty inline elements which has no visual impact when removed. + * + * @returns {Boolean} + */ + isEmptyInlineRemoveable: function() { + if ( !CKEDITOR.dtd.$removeEmpty[ this.getName() ] ) + return false; + + var children = this.getChildren(); + for ( var i = 0, count = children.count(); i < count; i++ ) { + var child = children.getItem( i ); + + if ( child.type == CKEDITOR.NODE_ELEMENT && child.data( 'cke-bookmark' ) ) + continue; + + if ( child.type == CKEDITOR.NODE_ELEMENT && !child.isEmptyInlineRemoveable() || child.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim( child.getText() ) ) + return false; + + } + return true; + }, + + /** + * Checks if the element has any defined attributes. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); + * alert( element.hasAttributes() ); // true + * + * var element = CKEDITOR.dom.element.createFromHtml( '
Example
' ); + * alert( element.hasAttributes() ); // false + * + * @method + * @returns {Boolean} True if the element has attributes. + */ + hasAttributes: CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ? + function() { + var attributes = this.$.attributes; + + for ( var i = 0; i < attributes.length; i++ ) { + var attribute = attributes[ i ]; + + switch ( attribute.nodeName ) { + case 'class': + // IE has a strange bug. If calling removeAttribute('className'), + // the attributes collection will still contain the "class" + // attribute, which will be marked as "specified", even if the + // outerHTML of the element is not displaying the class attribute. + // Note : I was not able to reproduce it outside the editor, + // but I've faced it while working on the TC of #1391. + if ( this.getAttribute( 'class' ) ) + return true; + + // Attributes to be ignored. + case 'data-cke-expando': + continue; + + /*jsl:fallthru*/ + + default: + if ( attribute.specified ) + return true; + } + } + + return false; + } : function() { + var attrs = this.$.attributes, + attrsNum = attrs.length; + + // The _moz_dirty attribute might get into the element after pasting (#5455) + var execludeAttrs = { 'data-cke-expando': 1, _moz_dirty: 1 }; + + return attrsNum > 0 && ( attrsNum > 2 || !execludeAttrs[ attrs[ 0 ].nodeName ] || ( attrsNum == 2 && !execludeAttrs[ attrs[ 1 ].nodeName ] ) ); + }, + + /** + * Checks if the specified attribute is defined for this element. + * + * @method + * @param {String} name The attribute name. + * @returns {Boolean} `true` if the specified attribute is defined. + */ + hasAttribute: ( function() { + function ieHasAttribute( name ) { + var $attr = this.$.attributes.getNamedItem( name ); + + if ( this.getName() == 'input' ) { + switch ( name ) { + case 'class': + return this.$.className.length > 0; + case 'checked': + return !!this.$.checked; + case 'value': + var type = this.getAttribute( 'type' ); + return type == 'checkbox' || type == 'radio' ? this.$.value != 'on' : !!this.$.value; + } + } + + if ( !$attr ) + return false; + + return $attr.specified; + } + + if ( CKEDITOR.env.ie ) { + if ( CKEDITOR.env.version < 8 ) { + return function( name ) { + // On IE < 8 the name attribute cannot be retrieved + // right after the element creation and setting the + // name with setAttribute. + if ( name == 'name' ) + return !!this.$.name; + + return ieHasAttribute.call( this, name ); + }; + } else { + return ieHasAttribute; + } + } else { + return function( name ) { + // On other browsers specified property is deprecated and return always true, + // but fortunately $.attributes contains only specified attributes. + return !!this.$.attributes.getNamedItem( name ); + }; + } + } )(), + + /** + * Hides this element (sets `display: none`). + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.hide(); + */ + hide: function() { + this.setStyle( 'display', 'none' ); + }, + + /** + * Moves this element's children to the target element. + * + * @param {CKEDITOR.dom.element} target + * @param {Boolean} [toStart=false] Insert moved children at the + * beginning of the target element. + */ + moveChildren: function( target, toStart ) { + var $ = this.$; + target = target.$; + + if ( $ == target ) + return; + + var child; + + if ( toStart ) { + while ( ( child = $.lastChild ) ) + target.insertBefore( $.removeChild( child ), target.firstChild ); + } else { + while ( ( child = $.firstChild ) ) + target.appendChild( $.removeChild( child ) ); + } + }, + + /** + * Merges sibling elements that are identical to this one. + * + * Identical child elements are also merged. For example: + * + * => + * + * @method + * @param {Boolean} [inlineOnly=true] Allow only inline elements to be merged. + */ + mergeSiblings: ( function() { + function mergeElements( element, sibling, isNext ) { + if ( sibling && sibling.type == CKEDITOR.NODE_ELEMENT ) { + // Jumping over bookmark nodes and empty inline elements, e.g. , + // queuing them to be moved later. (#5567) + var pendingNodes = []; + + while ( sibling.data( 'cke-bookmark' ) || sibling.isEmptyInlineRemoveable() ) { + pendingNodes.push( sibling ); + sibling = isNext ? sibling.getNext() : sibling.getPrevious(); + if ( !sibling || sibling.type != CKEDITOR.NODE_ELEMENT ) + return; + } + + if ( element.isIdentical( sibling ) ) { + // Save the last child to be checked too, to merge things like + // => + var innerSibling = isNext ? element.getLast() : element.getFirst(); + + // Move pending nodes first into the target element. + while ( pendingNodes.length ) + pendingNodes.shift().move( element, !isNext ); + + sibling.moveChildren( element, !isNext ); + sibling.remove(); + + // Now check the last inner child (see two comments above). + if ( innerSibling && innerSibling.type == CKEDITOR.NODE_ELEMENT ) + innerSibling.mergeSiblings(); + } + } + } + + return function( inlineOnly ) { + if ( !( inlineOnly === false || CKEDITOR.dtd.$removeEmpty[ this.getName() ] || this.is( 'a' ) ) ) // Merge empty links and anchors also. (#5567) + { + return; + } + + mergeElements( this, this.getNext(), true ); + mergeElements( this, this.getPrevious() ); + }; + } )(), + + /** + * Shows this element (displays it). + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.show(); + */ + show: function() { + this.setStyles( { + display: '', + visibility: '' + } ); + }, + + /** + * Sets the value of an element attribute. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.setAttribute( 'class', 'myClass' ); + * element.setAttribute( 'title', 'This is an example' ); + * + * @method + * @param {String} name The name of the attribute. + * @param {String} value The value to be set to the attribute. + * @returns {CKEDITOR.dom.element} This element instance. + */ + setAttribute: ( function() { + var standard = function( name, value ) { + this.$.setAttribute( name, value ); + return this; + }; + + if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ) { + return function( name, value ) { + if ( name == 'class' ) + this.$.className = value; + else if ( name == 'style' ) + this.$.style.cssText = value; + else if ( name == 'tabindex' ) // Case sensitive. + this.$.tabIndex = value; + else if ( name == 'checked' ) + this.$.checked = value; + else if ( name == 'contenteditable' ) + standard.call( this, 'contentEditable', value ); + else + standard.apply( this, arguments ); + return this; + }; + } else if ( CKEDITOR.env.ie8Compat && CKEDITOR.env.secure ) { + return function( name, value ) { + // IE8 throws error when setting src attribute to non-ssl value. (#7847) + if ( name == 'src' && value.match( /^http:\/\// ) ) + try { + standard.apply( this, arguments ); + } catch ( e ) {} else + standard.apply( this, arguments ); + return this; + }; + } else + return standard; + } )(), + + /** + * Sets the value of several element attributes. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.setAttributes( { + * 'class': 'myClass', + * title: 'This is an example' + * } ); + * + * @chainable + * @param {Object} attributesPairs An object containing the names and + * values of the attributes. + * @returns {CKEDITOR.dom.element} This element instance. + */ + setAttributes: function( attributesPairs ) { + for ( var name in attributesPairs ) + this.setAttribute( name, attributesPairs[ name ] ); + return this; + }, + + /** + * Sets the element value. This function is usually used with form + * field element. + * + * @chainable + * @param {String} value The element value. + * @returns {CKEDITOR.dom.element} This element instance. + */ + setValue: function( value ) { + this.$.value = value; + return this; + }, + + /** + * Removes an attribute from the element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
' ); + * element.removeAttribute( 'class' ); + * + * @method + * @param {String} name The attribute name. + */ + removeAttribute: ( function() { + var standard = function( name ) { + this.$.removeAttribute( name ); + }; + + if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks ) ) { + return function( name ) { + if ( name == 'class' ) + name = 'className'; + else if ( name == 'tabindex' ) + name = 'tabIndex'; + else if ( name == 'contenteditable' ) + name = 'contentEditable'; + standard.call( this, name ); + }; + } else + return standard; + } )(), + + /** + * Removes all element's attributes or just given ones. + * + * @param {Array} [attributes] The array with attributes names. + */ + removeAttributes: function( attributes ) { + if ( CKEDITOR.tools.isArray( attributes ) ) { + for ( var i = 0; i < attributes.length; i++ ) + this.removeAttribute( attributes[ i ] ); + } else { + for ( var attr in attributes ) + attributes.hasOwnProperty( attr ) && this.removeAttribute( attr ); + } + }, + + /** + * Removes a style from the element. + * + * var element = CKEDITOR.dom.element.createFromHtml( '
' ); + * element.removeStyle( 'display' ); + * + * @method + * @param {String} name The style name. + */ + removeStyle: function( name ) { + // Removes the specified property from the current style object. + var $ = this.$.style; + + // "removeProperty" need to be specific on the following styles. + if ( !$.removeProperty && ( name == 'border' || name == 'margin' || name == 'padding' ) ) { + var names = expandedRules( name ); + for ( var i = 0 ; i < names.length ; i++ ) + this.removeStyle( names[ i ] ); + return; + } + + $.removeProperty ? $.removeProperty( name ) : $.removeAttribute( CKEDITOR.tools.cssStyleToDomStyle( name ) ); + + // Eventually remove empty style attribute. + if ( !this.$.style.cssText ) + this.removeAttribute( 'style' ); + }, + + /** + * Sets the value of an element style. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.setStyle( 'background-color', '#ff0000' ); + * element.setStyle( 'margin-top', '10px' ); + * element.setStyle( 'float', 'right' ); + * + * @param {String} name The name of the style. The CSS naming notation + * must be used (e.g. `background-color`). + * @param {String} value The value to be set to the style. + * @returns {CKEDITOR.dom.element} This element instance. + */ + setStyle: function( name, value ) { + this.$.style[ CKEDITOR.tools.cssStyleToDomStyle( name ) ] = value; + return this; + }, + + /** + * Sets the value of several element styles. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.setStyles( { + * position: 'absolute', + * float: 'right' + * } ); + * + * @param {Object} stylesPairs An object containing the names and + * values of the styles. + * @returns {CKEDITOR.dom.element} This element instance. + */ + setStyles: function( stylesPairs ) { + for ( var name in stylesPairs ) + this.setStyle( name, stylesPairs[ name ] ); + return this; + }, + + /** + * Sets the opacity of an element. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.setOpacity( 0.75 ); + * + * @param {Number} opacity A number within the range `[0.0, 1.0]`. + */ + setOpacity: function( opacity ) { + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { + opacity = Math.round( opacity * 100 ); + this.setStyle( 'filter', opacity >= 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')' ); + } else + this.setStyle( 'opacity', opacity ); + }, + + /** + * Makes the element and its children unselectable. + * + * var element = CKEDITOR.document.getById( 'myElement' ); + * element.unselectable(); + * + * @method + */ + unselectable: function() { + // CSS unselectable. + this.setStyles( CKEDITOR.tools.cssVendorPrefix( 'user-select', 'none' ) ); + + // For IE/Opera which doesn't support for the above CSS style, + // the unselectable="on" attribute only specifies the selection + // process cannot start in the element itself, and it doesn't inherit. + if ( CKEDITOR.env.ie ) { + this.setAttribute( 'unselectable', 'on' ); + + var element, + elements = this.getElementsByTag( "*" ); + + for ( var i = 0, count = elements.count() ; i < count ; i++ ) { + element = elements.getItem( i ); + element.setAttribute( 'unselectable', 'on' ); + } + } + }, + + /** + * Gets closest positioned (`position != static`) ancestor. + * + * @returns {CKEDITOR.dom.element} Positioned ancestor or `null`. + */ + getPositionedAncestor: function() { + var current = this; + while ( current.getName() != 'html' ) { + if ( current.getComputedStyle( 'position' ) != 'static' ) + return current; + + current = current.getParent(); + } + return null; + }, + + /** + * Gets this element's position in document. + * + * @param {CKEDITOR.dom.document} [refDocument] + * @returns {Object} Element's position. + * @returns {Number} return.x + * @returns {Number} return.y + * @todo refDocument + */ + getDocumentPosition: function( refDocument ) { + var x = 0, + y = 0, + doc = this.getDocument(), + body = doc.getBody(), + quirks = doc.$.compatMode == 'BackCompat'; + + if ( document.documentElement[ "getBoundingClientRect" ] ) { + var box = this.$.getBoundingClientRect(), + $doc = doc.$, + $docElem = $doc.documentElement; + + var clientTop = $docElem.clientTop || body.$.clientTop || 0, + clientLeft = $docElem.clientLeft || body.$.clientLeft || 0, + needAdjustScrollAndBorders = true; + + // #3804: getBoundingClientRect() works differently on IE and non-IE + // browsers, regarding scroll positions. + // + // On IE, the top position of the element is always 0, no matter + // how much you scrolled down. + // + // On other browsers, the top position of the element is negative + // scrollTop. + if ( CKEDITOR.env.ie ) { + var inDocElem = doc.getDocumentElement().contains( this ), + inBody = doc.getBody().contains( this ); + + needAdjustScrollAndBorders = ( quirks && inBody ) || ( !quirks && inDocElem ); + } + + if ( needAdjustScrollAndBorders ) { + x = box.left + ( !quirks && $docElem.scrollLeft || body.$.scrollLeft ); + x -= clientLeft; + y = box.top + ( !quirks && $docElem.scrollTop || body.$.scrollTop ); + y -= clientTop; + } + } else { + var current = this, + previous = null, + offsetParent; + while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) ) { + x += current.$.offsetLeft - current.$.scrollLeft; + y += current.$.offsetTop - current.$.scrollTop; + + // Opera includes clientTop|Left into offsetTop|Left. + if ( !current.equals( this ) ) { + x += ( current.$.clientLeft || 0 ); + y += ( current.$.clientTop || 0 ); + } + + var scrollElement = previous; + while ( scrollElement && !scrollElement.equals( current ) ) { + x -= scrollElement.$.scrollLeft; + y -= scrollElement.$.scrollTop; + scrollElement = scrollElement.getParent(); + } + + previous = current; + current = ( offsetParent = current.$.offsetParent ) ? new CKEDITOR.dom.element( offsetParent ) : null; + } + } + + if ( refDocument ) { + var currentWindow = this.getWindow(), + refWindow = refDocument.getWindow(); + + if ( !currentWindow.equals( refWindow ) && currentWindow.$.frameElement ) { + var iframePosition = ( new CKEDITOR.dom.element( currentWindow.$.frameElement ) ).getDocumentPosition( refDocument ); + + x += iframePosition.x; + y += iframePosition.y; + } + } + + if ( !document.documentElement[ "getBoundingClientRect" ] ) { + // In Firefox, we'll endup one pixel before the element positions, + // so we must add it here. + if ( CKEDITOR.env.gecko && !quirks ) { + x += this.$.clientLeft ? 1 : 0; + y += this.$.clientTop ? 1 : 0; + } + } + + return { x: x, y: y }; + }, + + /** + * Make any page element visible inside the browser viewport. + * + * @param {Boolean} [alignToTop=false] + */ + scrollIntoView: function( alignToTop ) { + var parent = this.getParent(); + if ( !parent ) + return; + + // Scroll the element into parent container from the inner out. + do { + // Check ancestors that overflows. + var overflowed = + parent.$.clientWidth && parent.$.clientWidth < parent.$.scrollWidth || + parent.$.clientHeight && parent.$.clientHeight < parent.$.scrollHeight; + + // Skip body element, which will report wrong clientHeight when containing + // floated content. (#9523) + if ( overflowed && !parent.is( 'body' ) ) + this.scrollIntoParent( parent, alignToTop, 1 ); + + // Walk across the frame. + if ( parent.is( 'html' ) ) { + var win = parent.getWindow(); + + // Avoid security error. + try { + var iframe = win.$.frameElement; + iframe && ( parent = new CKEDITOR.dom.element( iframe ) ); + } catch ( er ) {} + } + } + while ( ( parent = parent.getParent() ) ); + }, + + /** + * Make any page element visible inside one of the ancestors by scrolling the parent. + * + * @param {CKEDITOR.dom.element/CKEDITOR.dom.window} parent The container to scroll into. + * @param {Boolean} [alignToTop] Align the element's top side with the container's + * when `true` is specified; align the bottom with viewport bottom when + * `false` is specified. Otherwise scroll on either side with the minimum + * amount to show the element. + * @param {Boolean} [hscroll] Whether horizontal overflow should be considered. + */ + scrollIntoParent: function( parent, alignToTop, hscroll ) { + !parent && ( parent = this.getWindow() ); + + var doc = parent.getDocument(); + var isQuirks = doc.$.compatMode == 'BackCompat'; + + // On window is scrolled while quirks scrolls . + if ( parent instanceof CKEDITOR.dom.window ) + parent = isQuirks ? doc.getBody() : doc.getDocumentElement(); + + // Scroll the parent by the specified amount. + function scrollBy( x, y ) { + // Webkit doesn't support "scrollTop/scrollLeft" + // on documentElement/body element. + if ( /body|html/.test( parent.getName() ) ) + parent.getWindow().$.scrollBy( x, y ); + else { + parent.$[ 'scrollLeft' ] += x; + parent.$[ 'scrollTop' ] += y; + } + } + + // Figure out the element position relative to the specified window. + function screenPos( element, refWin ) { + var pos = { x: 0, y: 0 }; + + if ( !( element.is( isQuirks ? 'body' : 'html' ) ) ) { + var box = element.$.getBoundingClientRect(); + pos.x = box.left, pos.y = box.top; + } + + var win = element.getWindow(); + if ( !win.equals( refWin ) ) { + var outerPos = screenPos( CKEDITOR.dom.element.get( win.$.frameElement ), refWin ); + pos.x += outerPos.x, pos.y += outerPos.y; + } + + return pos; + } + + // calculated margin size. + function margin( element, side ) { + return parseInt( element.getComputedStyle( 'margin-' + side ) || 0, 10 ) || 0; + } + + var win = parent.getWindow(); + + var thisPos = screenPos( this, win ), + parentPos = screenPos( parent, win ), + eh = this.$.offsetHeight, + ew = this.$.offsetWidth, + ch = parent.$.clientHeight, + cw = parent.$.clientWidth, + lt, br; + + // Left-top margins. + lt = { + x: thisPos.x - margin( this, 'left' ) - parentPos.x || 0, + y: thisPos.y - margin( this, 'top' ) - parentPos.y || 0 + }; + + // Bottom-right margins. + br = { + x: thisPos.x + ew + margin( this, 'right' ) - ( ( parentPos.x ) + cw ) || 0, + y: thisPos.y + eh + margin( this, 'bottom' ) - ( ( parentPos.y ) + ch ) || 0 + }; + + // 1. Do the specified alignment as much as possible; + // 2. Otherwise be smart to scroll only the minimum amount; + // 3. Never cut at the top; + // 4. DO NOT scroll when already visible. + if ( lt.y < 0 || br.y > 0 ) + scrollBy( 0, alignToTop === true ? lt.y : alignToTop === false ? br.y : lt.y < 0 ? lt.y : br.y ); + + if ( hscroll && ( lt.x < 0 || br.x > 0 ) ) + scrollBy( lt.x < 0 ? lt.x : br.x, 0 ); + }, + + /** + * Switch the `class` attribute to reflect one of the triple states of an + * element in one of {@link CKEDITOR#TRISTATE_ON}, {@link CKEDITOR#TRISTATE_OFF} + * or {@link CKEDITOR#TRISTATE_DISABLED}. + * + * link.setState( CKEDITOR.TRISTATE_ON ); + * // ... + * link.setState( CKEDITOR.TRISTATE_OFF ); + * // ... + * link.setState( CKEDITOR.TRISTATE_DISABLED ); + * // ... + * + * span.setState( CKEDITOR.TRISTATE_ON, 'cke_button' ); + * // ... + * + * @param {Number} state Indicate the element state. One of {@link CKEDITOR#TRISTATE_ON}, + * {@link CKEDITOR#TRISTATE_OFF}, {@link CKEDITOR#TRISTATE_DISABLED}. + * @param [base='cke'] The prefix apply to each of the state class name. + * @param [useAria=true] Whether toggle the ARIA state attributes besides of class name change. + */ + setState: function( state, base, useAria ) { + base = base || 'cke'; + + switch ( state ) { + case CKEDITOR.TRISTATE_ON: + this.addClass( base + '_on' ); + this.removeClass( base + '_off' ); + this.removeClass( base + '_disabled' ); + useAria && this.setAttribute( 'aria-pressed', true ); + useAria && this.removeAttribute( 'aria-disabled' ); + break; + + case CKEDITOR.TRISTATE_DISABLED: + this.addClass( base + '_disabled' ); + this.removeClass( base + '_off' ); + this.removeClass( base + '_on' ); + useAria && this.setAttribute( 'aria-disabled', true ); + useAria && this.removeAttribute( 'aria-pressed' ); + break; + + default: + this.addClass( base + '_off' ); + this.removeClass( base + '_on' ); + this.removeClass( base + '_disabled' ); + useAria && this.removeAttribute( 'aria-pressed' ); + useAria && this.removeAttribute( 'aria-disabled' ); + break; + } + }, + + /** + * Returns the inner document of this `' ); + + iframe.on( 'load', function( e ) { + e.removeListener(); + + var doc = iframe.getFrameDocument(); + doc.write( htmlToLoad ); + + editor.focusManager.add( doc.getBody() ); + + if ( CKEDITOR.env.air ) + onPasteFrameLoad.call( this, doc.getWindow().$ ); + }, dialog ); + + iframe.setCustomData( 'dialog', dialog ); + + var container = this.getElement(); + container.setHtml( '' ); + container.append( iframe ); + + // IE need a redirect on focus to make + // the cursor blinking inside iframe. (#5461) + if ( CKEDITOR.env.ie ) { + var focusGrabber = CKEDITOR.dom.element.createFromHtml( '' ); + focusGrabber.on( 'focus', function() { + // Since fixDomain is called in src attribute, + // IE needs some slight delay to correctly move focus. + setTimeout( function() { + iframe.$.contentWindow.focus(); + } ); + } ); + container.append( focusGrabber ); + + // Override focus handler on field. + this.focus = function() { + focusGrabber.focus(); + this.fire( 'focus' ); + }; + } + + this.getInputElement = function() { + return iframe; + }; + + // Force container to scale in IE. + if ( CKEDITOR.env.ie ) { + container.setStyle( 'display', 'block' ); + container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' ); + } + }, + commit: function( data ) { + var editor = this.getDialog().getParentEditor(), + body = this.getInputElement().getFrameDocument().getBody(), + bogus = body.getBogus(), + html; + bogus && bogus.remove(); + + // Saving the contents so changes until paste is complete will not take place (#7500) + html = body.getHtml(); + + // Opera needs some time to think about what has happened and what it should do now. + setTimeout( function() { + editor.fire( 'pasteDialogCommit', html ); + }, 0 ); + } + } + ] + } + ] + }; +} ); + +/** + * Internal event to pass paste dialog's data to the listeners. + * + * @private + * @event pasteDialogCommit + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + */ diff --git a/scripts/ckeditor/plugins/clipboard/icons/copy-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/copy-rtl.png new file mode 100755 index 00000000..ef724460 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/copy-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/copy.png b/scripts/ckeditor/plugins/clipboard/icons/copy.png new file mode 100755 index 00000000..ef724460 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/copy.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/cut-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/cut-rtl.png new file mode 100755 index 00000000..0b719653 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/cut-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/cut.png b/scripts/ckeditor/plugins/clipboard/icons/cut.png new file mode 100755 index 00000000..0b719653 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/cut.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy-rtl.png new file mode 100755 index 00000000..29026cc0 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy.png new file mode 100755 index 00000000..29026cc0 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/copy.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut-rtl.png new file mode 100755 index 00000000..bfec0cfb Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut.png new file mode 100755 index 00000000..bfec0cfb Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/cut.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste-rtl.png new file mode 100755 index 00000000..f18dac37 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste.png b/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste.png new file mode 100755 index 00000000..f18dac37 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/hidpi/paste.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/paste-rtl.png b/scripts/ckeditor/plugins/clipboard/icons/paste-rtl.png new file mode 100755 index 00000000..b2bfef20 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/paste-rtl.png differ diff --git a/scripts/ckeditor/plugins/clipboard/icons/paste.png b/scripts/ckeditor/plugins/clipboard/icons/paste.png new file mode 100755 index 00000000..b2bfef20 Binary files /dev/null and b/scripts/ckeditor/plugins/clipboard/icons/paste.png differ diff --git a/scripts/ckeditor/plugins/clipboard/lang/af.js b/scripts/ckeditor/plugins/clipboard/lang/af.js new file mode 100755 index 00000000..af598099 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/af.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'af', { + copy: 'Kopiëer', + copyError: 'U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).', + cut: 'Knip', + cutError: 'U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).', + paste: 'Plak', + pasteArea: 'Plak-area', + pasteMsg: 'Plak die teks in die volgende teks-area met die sleutelbordkombinasie (Ctrl/Cmd+V) en druk OK.', + securityMsg: 'Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.', + title: 'Byvoeg' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ar.js b/scripts/ckeditor/plugins/clipboard/lang/ar.js new file mode 100755 index 00000000..e66eb230 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ar.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ar', { + copy: 'نسخ', + copyError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).', + cut: 'قص', + cutError: 'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).', + paste: 'لصق', + pasteArea: 'منطقة اللصق', + pasteMsg: 'الصق داخل الصندوق بإستخدام زرائر (Ctrl/Cmd+V) في لوحة المفاتيح، ثم اضغط زر موافق.', + securityMsg: 'نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.', + title: 'لصق' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/bg.js b/scripts/ckeditor/plugins/clipboard/lang/bg.js new file mode 100755 index 00000000..5979d8ff --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/bg.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bg', { + copy: 'Копирай', + copyError: 'Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).', + cut: 'Отрежи', + cutError: 'Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).', + paste: 'Вмъкни', + pasteArea: 'Зона за вмъкване', + pasteMsg: 'Вмъкнете тук съдъжанието с клавиатуарата (Ctrl/Cmd+V) и натиснете OK.', + securityMsg: 'Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.', + title: 'Вмъкни' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/bn.js b/scripts/ckeditor/plugins/clipboard/lang/bn.js new file mode 100755 index 00000000..9788cace --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/bn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bn', { + copy: 'কপি', + copyError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।', + cut: 'কাট', + cutError: 'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।', + paste: 'পেস্ট', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (Ctrl/Cmd+V) পেস্ট করুন এবং OK চাপ দিন', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'পেস্ট' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/bs.js b/scripts/ckeditor/plugins/clipboard/lang/bs.js new file mode 100755 index 00000000..b9fffd08 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/bs.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'bs', { + copy: 'Kopiraj', + copyError: 'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).', + paste: 'Zalijepi', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Zalijepi' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ca.js b/scripts/ckeditor/plugins/clipboard/lang/ca.js new file mode 100755 index 00000000..ac37e5de --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ca', { + copy: 'Copiar', + copyError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).', + cut: 'Retallar', + cutError: 'La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).', + paste: 'Enganxar', + pasteArea: 'Àrea d\'enganxat', + pasteMsg: 'Si us plau, enganxi dins del següent camp utilitzant el teclat (Ctrl/Cmd+V) i premi OK.', + securityMsg: 'A causa de la configuració de seguretat del vostre navegador, l\'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.', + title: 'Enganxar' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/cs.js b/scripts/ckeditor/plugins/clipboard/lang/cs.js new file mode 100755 index 00000000..77d1bd09 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/cs.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'cs', { + copy: 'Kopírovat', + copyError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).', + cut: 'Vyjmout', + cutError: 'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).', + paste: 'Vložit', + pasteArea: 'Oblast vkládání', + pasteMsg: 'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (Ctrl/Cmd+V) a stiskněte OK.', + securityMsg: 'Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.', + title: 'Vložit' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/cy.js b/scripts/ckeditor/plugins/clipboard/lang/cy.js new file mode 100755 index 00000000..75981c79 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/cy.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'cy', { + copy: 'Copïo', + copyError: '\'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu\'r golygydd i gynnal \'gweithredoedd copïo\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).', + cut: 'Torri', + cutError: 'Nid yw gosodiadau diogelwch eich porwr yn caniatàu\'r golygydd i gynnal \'gweithredoedd torri\' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).', + paste: 'Gludo', + pasteArea: 'Ardal Gludo', + pasteMsg: 'Gludwch i mewn i\'r blwch canlynol gan ddefnyddio\'r bysellfwrdd (Ctrl/Cmd+V) a phwyso Iawn.', + securityMsg: 'Oherwydd gosodiadau diogelwch eich porwr, \'dyw\'r porwr ddim yn gallu ennill mynediad i\'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i\'r ffenestr hon.', + title: 'Gludo' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/da.js b/scripts/ckeditor/plugins/clipboard/lang/da.js new file mode 100755 index 00000000..832758ac --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/da.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'da', { + copy: 'Kopiér', + copyError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).', + cut: 'Klip', + cutError: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).', + paste: 'Indsæt', + pasteArea: 'Indsæt område', + pasteMsg: 'Indsæt i feltet herunder (Ctrl/Cmd+V) og klik på OK.', + securityMsg: 'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.

Du skal indsætte udklipsholderens indhold i dette vindue igen.', + title: 'Indsæt' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/de.js b/scripts/ckeditor/plugins/clipboard/lang/de.js new file mode 100755 index 00000000..4426d084 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/de.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'de', { + copy: 'Kopieren', + copyError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).', + cut: 'Ausschneiden', + cutError: 'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).', + paste: 'Einfügen', + pasteArea: 'Einfügebereich', + pasteMsg: 'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit Strg+V) ein und bestätigen Sie mit OK.', + securityMsg: 'Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.', + title: 'Einfügen' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/el.js b/scripts/ckeditor/plugins/clipboard/lang/el.js new file mode 100755 index 00000000..3d7116d4 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/el.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'el', { + copy: 'Αντιγραφή', + copyError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).', + cut: 'Αποκοπή', + cutError: 'Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).', + paste: 'Επικόλληση', + pasteArea: 'Περιοχή Επικόλλησης', + pasteMsg: 'Παρακαλώ επικολλήστε στο ακόλουθο κουτί χρησιμοποιώντας το πληκτρολόγιο (Ctrl/Cmd+V) και πατήστε OK.', + securityMsg: 'Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.', + title: 'Επικόλληση' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/en-au.js b/scripts/ckeditor/plugins/clipboard/lang/en-au.js new file mode 100755 index 00000000..501fe1e0 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/en-au.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-au', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/en-ca.js b/scripts/ckeditor/plugins/clipboard/lang/en-ca.js new file mode 100755 index 00000000..9ea55e18 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/en-ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-ca', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/en-gb.js b/scripts/ckeditor/plugins/clipboard/lang/en-gb.js new file mode 100755 index 00000000..e0d62349 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/en-gb.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en-gb', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/en.js b/scripts/ckeditor/plugins/clipboard/lang/en.js new file mode 100755 index 00000000..24c263ba --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/en.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'en', { + copy: 'Copy', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', + cut: 'Cut', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', + paste: 'Paste', + pasteArea: 'Paste Area', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', + title: 'Paste' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/eo.js b/scripts/ckeditor/plugins/clipboard/lang/eo.js new file mode 100755 index 00000000..8a983379 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/eo.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'eo', { + copy: 'Kopii', + copyError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).', + cut: 'Eltondi', + cutError: 'La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).', + paste: 'Interglui', + pasteArea: 'Intergluoareo', + pasteMsg: 'Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (Ctrl/Cmd+V) kaj premu OK', + securityMsg: 'Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poŝo. Bonvolu denove interglui la datenojn en tiun fenestron.', + title: 'Interglui' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/es.js b/scripts/ckeditor/plugins/clipboard/lang/es.js new file mode 100755 index 00000000..fad57908 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/es.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'es', { + copy: 'Copiar', + copyError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).', + paste: 'Pegar', + pasteArea: 'Zona de pegado', + pasteMsg: 'Por favor pegue dentro del cuadro utilizando el teclado (Ctrl/Cmd+V);\r\nluego presione Aceptar.', + securityMsg: 'Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.', + title: 'Pegar' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/et.js b/scripts/ckeditor/plugins/clipboard/lang/et.js new file mode 100755 index 00000000..09a4bcec --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/et.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'et', { + copy: 'Kopeeri', + copyError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).', + cut: 'Lõika', + cutError: 'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).', + paste: 'Aseta', + pasteArea: 'Asetamise ala', + pasteMsg: 'Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+V) ja vajuta seejärel OK.', + securityMsg: 'Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.', + title: 'Asetamine' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/eu.js b/scripts/ckeditor/plugins/clipboard/lang/eu.js new file mode 100755 index 00000000..037a21c7 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/eu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'eu', { + copy: 'Kopiatu', + copyError: 'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).', + cut: 'Ebaki', + cutError: 'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).', + paste: 'Itsatsi', + pasteArea: 'Itsasteko Area', + pasteMsg: 'Mesedez teklatua erabilita (Ctrl/Cmd+V) ondorego eremuan testua itsatsi eta OK sakatu.', + securityMsg: 'Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.', + title: 'Itsatsi' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/fa.js b/scripts/ckeditor/plugins/clipboard/lang/fa.js new file mode 100755 index 00000000..d894f686 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/fa.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fa', { + copy: 'رونوشت', + copyError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).', + cut: 'برش', + cutError: 'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).', + paste: 'چسباندن', + pasteArea: 'محل چسباندن', + pasteMsg: 'لطفا متن را با کلیدهای (Ctrl/Cmd+V) در این جعبهٴ متنی بچسبانید و پذیرش را بزنید.', + securityMsg: 'به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.', + title: 'چسباندن' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/fi.js b/scripts/ckeditor/plugins/clipboard/lang/fi.js new file mode 100755 index 00000000..9a068a32 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/fi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fi', { + copy: 'Kopioi', + copyError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).', + cut: 'Leikkaa', + cutError: 'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).', + paste: 'Liitä', + pasteArea: 'Leikealue', + pasteMsg: 'Liitä painamalla (Ctrl+V) ja painamalla OK.', + securityMsg: 'Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.', + title: 'Liitä' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/fo.js b/scripts/ckeditor/plugins/clipboard/lang/fo.js new file mode 100755 index 00000000..da436ea4 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/fo.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fo', { + copy: 'Avrita', + copyError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).', + cut: 'Kvett', + cutError: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).', + paste: 'Innrita', + pasteArea: 'Avritingarumráði', + pasteMsg: 'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (Ctrl/Cmd+V) og klikk á Góðtak.', + securityMsg: 'Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.', + title: 'Innrita' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/fr-ca.js b/scripts/ckeditor/plugins/clipboard/lang/fr-ca.js new file mode 100755 index 00000000..e4e483cf --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/fr-ca.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fr-ca', { + copy: 'Copier', + copyError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).', + cut: 'Couper', + cutError: 'Les paramètres de sécurité de votre navigateur empêchent l\'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).', + paste: 'Coller', + pasteArea: 'Coller la zone', + pasteMsg: 'Veuillez coller dans la zone ci-dessous en utilisant le clavier (Ctrl/Cmd+V) et appuyer sur OK.', + securityMsg: 'A cause des paramètres de sécurité de votre navigateur, l\'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.', + title: 'Coller' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/fr.js b/scripts/ckeditor/plugins/clipboard/lang/fr.js new file mode 100755 index 00000000..ed17f8e6 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/fr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'fr', { + copy: 'Copier', + copyError: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).', + cut: 'Couper', + cutError: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement l\'opération "couper". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).', + paste: 'Coller', + pasteArea: 'Coller la zone', + pasteMsg: 'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (Ctrl/Cmd+V) et cliquez sur OK.', + securityMsg: 'A cause des paramètres de sécurité de votre navigateur, l\'éditeur n\'est pas en mesure d\'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.', + title: 'Coller' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/gl.js b/scripts/ckeditor/plugins/clipboard/lang/gl.js new file mode 100755 index 00000000..cace10af --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/gl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'gl', { + copy: 'Copiar', + copyError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).', + paste: 'Pegar', + pasteArea: 'Zona de pegado', + pasteMsg: 'Pegue dentro do seguinte cadro usando o teclado (Ctrl/Cmd+V) e prema en Aceptar', + securityMsg: 'Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.', + title: 'Pegar' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/gu.js b/scripts/ckeditor/plugins/clipboard/lang/gu.js new file mode 100755 index 00000000..8bb5bcd2 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/gu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'gu', { + copy: 'નકલ', + copyError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।', + cut: 'કાપવું', + cutError: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.', + paste: 'પેસ્ટ', + pasteArea: 'પેસ્ટ કરવાની જગ્યા', + pasteMsg: 'Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો', + securityMsg: 'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.', + title: 'પેસ્ટ' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/he.js b/scripts/ckeditor/plugins/clipboard/lang/he.js new file mode 100755 index 00000000..99d06565 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/he.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'he', { + copy: 'העתקה', + copyError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).', + cut: 'גזירה', + cutError: 'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).', + paste: 'הדבקה', + pasteArea: 'איזור הדבקה', + pasteMsg: 'נא להדביק בתוך הקופסה באמצעות (Ctrl/Cmd+V) וללחוץ על אישור.', + securityMsg: 'עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.', + title: 'הדבקה' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/hi.js b/scripts/ckeditor/plugins/clipboard/lang/hi.js new file mode 100755 index 00000000..b3cb47b9 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/hi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hi', { + copy: 'कॉपी', + copyError: 'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।', + cut: 'कट', + cutError: 'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।', + paste: 'पेस्ट', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.', + securityMsg: 'आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.', + title: 'पेस्ट' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/hr.js b/scripts/ckeditor/plugins/clipboard/lang/hr.js new file mode 100755 index 00000000..eacaeb3e --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/hr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hr', { + copy: 'Kopiraj', + copyError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).', + paste: 'Zalijepi', + pasteArea: 'Prostor za ljepljenje', + pasteMsg: 'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (Ctrl/Cmd+V) i kliknite OK.', + securityMsg: 'Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.', + title: 'Zalijepi' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/hu.js b/scripts/ckeditor/plugins/clipboard/lang/hu.js new file mode 100755 index 00000000..50a9f2ce --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/hu.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'hu', { + copy: 'Másolás', + copyError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', + cut: 'Kivágás', + cutError: 'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).', + paste: 'Beillesztés', + pasteArea: 'Beszúrás mező', + pasteMsg: 'Másolja be az alábbi mezőbe a Ctrl/Cmd+V billentyűk lenyomásával, majd nyomjon Rendben-t.', + securityMsg: 'A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.', + title: 'Beillesztés' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/id.js b/scripts/ckeditor/plugins/clipboard/lang/id.js new file mode 100755 index 00000000..4cd777a1 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/id.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'id', { + copy: 'Salin', + copyError: 'Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)', + cut: 'Potong', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING + paste: 'Tempel', + pasteArea: 'Area Tempel', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Tempel' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/is.js b/scripts/ckeditor/plugins/clipboard/lang/is.js new file mode 100755 index 00000000..4f426a90 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/is.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'is', { + copy: 'Afrita', + copyError: 'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).', + cut: 'Klippa', + cutError: 'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).', + paste: 'Líma', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Límdu í svæðið hér að neðan og (Ctrl/Cmd+V) og smelltu á OK.', + securityMsg: 'Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.', + title: 'Líma' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/it.js b/scripts/ckeditor/plugins/clipboard/lang/it.js new file mode 100755 index 00000000..ae91498c --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/it.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'it', { + copy: 'Copia', + copyError: 'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).', + cut: 'Taglia', + cutError: 'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).', + paste: 'Incolla', + pasteArea: 'Incolla', + pasteMsg: 'Incolla il testo all\'interno dell\'area sottostante usando la scorciatoia di tastiere (Ctrl/Cmd+V) e premi OK.', + securityMsg: 'A causa delle impostazioni di sicurezza del browser,l\'editor non è in grado di accedere direttamente agli appunti. E\' pertanto necessario incollarli di nuovo in questa finestra.', + title: 'Incolla' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ja.js b/scripts/ckeditor/plugins/clipboard/lang/ja.js new file mode 100755 index 00000000..54091aff --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ja.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ja', { + copy: 'コピー', + copyError: 'ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。', + cut: '切り取り', + cutError: 'ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。', + paste: '貼り付け', + pasteArea: '貼り付け場所', + pasteMsg: 'キーボード(Ctrl/Cmd+V)を使用して、次の入力エリア内で貼り付けて、OKを押してください。', + securityMsg: 'ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。', + title: '貼り付け' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ka.js b/scripts/ckeditor/plugins/clipboard/lang/ka.js new file mode 100755 index 00000000..94f3d3d4 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ka.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ka', { + copy: 'ასლი', + copyError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).', + cut: 'ამოჭრა', + cutError: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).', + paste: 'ჩასმა', + pasteArea: 'ჩასმის არე', + pasteMsg: 'ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (Ctrl/Cmd+V) და დააჭირეთ OK-ს', + securityMsg: 'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.', + title: 'ჩასმა' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/km.js b/scripts/ckeditor/plugins/clipboard/lang/km.js new file mode 100755 index 00000000..c20f855a --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/km.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'km', { + copy: 'ចម្លង', + copyError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។', + cut: 'កាត់យក', + cutError: 'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះ​មិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។', + paste: 'បិទ​ភ្ជាប់', + pasteArea: 'តំបន់​បិទ​ភ្ជាប់', + pasteMsg: 'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី ​(Ctrl/Cmd+V) ហើយចុច OK ។', + securityMsg: 'ព្រោះតែ​ការកំណត់​សុវត្ថិភាព ប្រអប់សរសេរ​មិន​អាចចាប់​យកទិន្នន័យពីក្តារតម្បៀតខ្ទាស់​អ្នក​​ដោយផ្ទាល់​បានទេ។ អ្នក​ត្រូវចំលង​ដាក់វាម្តង​ទៀត ក្នុងផ្ទាំងនេះ។', + title: 'បិទ​ភ្ជាប់' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ko.js b/scripts/ckeditor/plugins/clipboard/lang/ko.js new file mode 100755 index 00000000..76d29433 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ko.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ko', { + copy: '복사하기', + copyError: '브라우저의 보안설정때문에 복사하기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+C).', + cut: '잘라내기', + cutError: '브라우저의 보안설정때문에 잘라내기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+X).', + paste: '붙여넣기', + pasteArea: '범위 붙여넣기', + pasteMsg: '키보드의 (Ctrl/Cmd+V) 를 이용해서 상자안에 붙여넣고 OK 를 누르세요.', + securityMsg: '브러우저 보안 설정으로 인해, 클립보드의 자료를 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.', + title: '붙여넣기' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ku.js b/scripts/ckeditor/plugins/clipboard/lang/ku.js new file mode 100755 index 00000000..ffe87c57 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ku.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ku', { + copy: 'لەبەرگرتنەوە', + copyError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).', + cut: 'بڕین', + cutError: 'پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).', + paste: 'لکاندن', + pasteArea: 'ناوچەی لکاندن', + pasteMsg: 'تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (Ctrl/Cmd+V) دووای کلیکی باشە بکە.', + securityMsg: 'بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.', + title: 'لکاندن' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/lt.js b/scripts/ckeditor/plugins/clipboard/lang/lt.js new file mode 100755 index 00000000..bd70e471 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/lt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'lt', { + copy: 'Kopijuoti', + copyError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).', + cut: 'Iškirpti', + cutError: 'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).', + paste: 'Įdėti', + pasteArea: 'Įkelti dalį', + pasteMsg: 'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (Ctrl/Cmd+V) ir paspauskite mygtuką OK.', + securityMsg: 'Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.', + title: 'Įdėti' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/lv.js b/scripts/ckeditor/plugins/clipboard/lang/lv.js new file mode 100755 index 00000000..40da76f6 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/lv.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'lv', { + copy: 'Kopēt', + copyError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.', + cut: 'Izgriezt', + cutError: 'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.', + paste: 'Ielīmēt', + pasteArea: 'Ielīmēšanas zona', + pasteMsg: 'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (Ctrl/Cmd+V) un apstipriniet ar Darīts!.', + securityMsg: 'Jūsu pārlūka drošības uzstādījumu dēļ, nav iespējams tieši piekļūt jūsu starpliktuvei. Jums jāielīmē atkārtoti šajā logā.', + title: 'Ievietot' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/mk.js b/scripts/ckeditor/plugins/clipboard/lang/mk.js new file mode 100755 index 00000000..bb8cafeb --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/mk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'mk', { + copy: 'Copy', // MISSING + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', // MISSING + cut: 'Cut', // MISSING + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING + paste: 'Paste', // MISSING + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Paste' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/mn.js b/scripts/ckeditor/plugins/clipboard/lang/mn.js new file mode 100755 index 00000000..4c39990f --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/mn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'mn', { + copy: 'Хуулах', + copyError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.', + cut: 'Хайчлах', + cutError: 'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.', + paste: 'Буулгах', + pasteArea: 'Paste Area', // MISSING + pasteMsg: '(Ctrl/Cmd+V) товчийг ашиглан paste хийнэ үү. Мөн OK дар.', + securityMsg: 'Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.', + title: 'Буулгах' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ms.js b/scripts/ckeditor/plugins/clipboard/lang/ms.js new file mode 100755 index 00000000..a0a37a6c --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ms.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ms', { + copy: 'Salin', + copyError: 'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).', + cut: 'Potong', + cutError: 'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).', + paste: 'Tampal', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Tampal' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/nb.js b/scripts/ckeditor/plugins/clipboard/lang/nb.js new file mode 100755 index 00000000..9c0d9333 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/nb.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'nb', { + copy: 'Kopier', + copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).', + cut: 'Klipp ut', + cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).', + paste: 'Lim inn', + pasteArea: 'Innlimingsområde', + pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.', + securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.', + title: 'Lim inn' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/nl.js b/scripts/ckeditor/plugins/clipboard/lang/nl.js new file mode 100755 index 00000000..adc08d56 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/nl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'nl', { + copy: 'Kopiëren', + copyError: 'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.', + cut: 'Knippen', + cutError: 'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.', + paste: 'Plakken', + pasteArea: 'Plakgebied', + pasteMsg: 'Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (Ctrl/Cmd+V) en klik op OK.', + securityMsg: 'Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.', + title: 'Plakken' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/no.js b/scripts/ckeditor/plugins/clipboard/lang/no.js new file mode 100755 index 00000000..7e3b815f --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/no.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'no', { + copy: 'Kopier', + copyError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).', + cut: 'Klipp ut', + cutError: 'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).', + paste: 'Lim inn', + pasteArea: 'Innlimingsområde', + pasteMsg: 'Vennligst lim inn i følgende boks med tastaturet (Ctrl/Cmd+V) og trykk OK.', + securityMsg: 'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.', + title: 'Lim inn' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/pl.js b/scripts/ckeditor/plugins/clipboard/lang/pl.js new file mode 100755 index 00000000..7ab465f5 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/pl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pl', { + copy: 'Kopiuj', + copyError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.', + cut: 'Wytnij', + cutError: 'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.', + paste: 'Wklej', + pasteArea: 'Obszar wklejania', + pasteMsg: 'Wklej tekst w poniższym polu, używając skrótu klawiaturowego (Ctrl/Cmd+V), i kliknij OK.', + securityMsg: 'Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.', + title: 'Wklej' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/pt-br.js b/scripts/ckeditor/plugins/clipboard/lang/pt-br.js new file mode 100755 index 00000000..15a323ed --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/pt-br.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pt-br', { + copy: 'Copiar', + copyError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).', + cut: 'Recortar', + cutError: 'As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).', + paste: 'Colar', + pasteArea: 'Área para Colar', + pasteMsg: 'Transfira o link usado na caixa usando o teclado com (Ctrl/Cmd+V) e OK.', + securityMsg: 'As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.', + title: 'Colar' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/pt.js b/scripts/ckeditor/plugins/clipboard/lang/pt.js new file mode 100755 index 00000000..cf4f5bc2 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/pt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'pt', { + copy: 'Copiar', + copyError: 'A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).', + cut: 'Cortar', + cutError: 'A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).', + paste: 'Colar', + pasteArea: 'Colar Área', + pasteMsg: 'Por favor, cole dentro da seguinte caixa usando o teclado (Ctrl/Cmd+V) e prima OK.', + securityMsg: 'Devido ás definições de segurança do teu browser, o editor não pode aceder ao clipboard diretamente. É necessário que voltes a colar as informações nesta janela.', + title: 'Colar' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ro.js b/scripts/ckeditor/plugins/clipboard/lang/ro.js new file mode 100755 index 00000000..0fb7a200 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ro.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ro', { + copy: 'Copiază', + copyError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).', + cut: 'Taie', + cutError: 'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).', + paste: 'Adaugă', + pasteArea: 'Suprafața de adăugare', + pasteMsg: 'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (Ctrl/Cmd+V) şi apăsaţi OK', + securityMsg: 'Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.', + title: 'Adaugă' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ru.js b/scripts/ckeditor/plugins/clipboard/lang/ru.js new file mode 100755 index 00000000..969a1b75 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ru.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ru', { + copy: 'Копировать', + copyError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).', + cut: 'Вырезать', + cutError: 'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).', + paste: 'Вставить', + pasteArea: 'Зона для вставки', + pasteMsg: 'Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (Ctrl/Cmd+V) и нажмите кнопку "OK".', + securityMsg: 'Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.', + title: 'Вставить' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/si.js b/scripts/ckeditor/plugins/clipboard/lang/si.js new file mode 100755 index 00000000..2ae74f59 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/si.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'si', { + copy: 'පිටපත් කරන්න', + copyError: 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).', // MISSING + cut: 'කපාගන්න', + cutError: 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).', // MISSING + paste: 'අලවන්න', + pasteArea: 'අලවන ප්‍රදේශ', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'අලවන්න' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sk.js b/scripts/ckeditor/plugins/clipboard/lang/sk.js new file mode 100755 index 00000000..05acd5da --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sk', { + copy: 'Kopírovať', + copyError: 'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).', + cut: 'Vystrihnúť', + cutError: 'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).', + paste: 'Vložiť', + pasteArea: 'Miesto pre vloženie', + pasteMsg: 'Prosím, vložte nasledovný rámček použitím klávesnice (Ctrl/Cmd+V) a stlačte OK.', + securityMsg: 'Kvôli vašim bezpečnostným nastaveniam prehliadača editor nie je schopný pristupovať k vašej schránke na kopírovanie priamo. Vložte to preto do tohto okna.', + title: 'Vložiť' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sl.js b/scripts/ckeditor/plugins/clipboard/lang/sl.js new file mode 100755 index 00000000..c2334e39 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sl.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sl', { + copy: 'Kopiraj', + copyError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).', + cut: 'Izreži', + cutError: 'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).', + paste: 'Prilepi', + pasteArea: 'Prilepi Prostor', + pasteMsg: 'Prosim prilepite v sleči okvir s pomočjo tipkovnice (Ctrl/Cmd+V) in pritisnite V redu.', + securityMsg: 'Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.', + title: 'Prilepi' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sq.js b/scripts/ckeditor/plugins/clipboard/lang/sq.js new file mode 100755 index 00000000..eaec33e1 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sq.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sq', { + copy: 'Kopjo', + copyError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).', + cut: 'Preje', + cutError: 'Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).', + paste: 'Hidhe', + pasteArea: 'Hapësira Hedhëse', + pasteMsg: 'Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (Ctrl/Cmd+V) dhe shtypni Mirë.', + securityMsg: 'Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.', + title: 'Hidhe' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sr-latn.js b/scripts/ckeditor/plugins/clipboard/lang/sr-latn.js new file mode 100755 index 00000000..30238b0e --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sr-latn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sr-latn', { + copy: 'Kopiraj', + copyError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).', + cut: 'Iseci', + cutError: 'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).', + paste: 'Zalepi', + pasteArea: 'Prostor za lepljenje', + pasteMsg: 'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (Ctrl/Cmd+V) i da pritisnete OK.', + securityMsg: 'Zbog sigurnosnih postavki vašeg pregledača, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite još jednom u ovom prozoru.', + title: 'Zalepi' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sr.js b/scripts/ckeditor/plugins/clipboard/lang/sr.js new file mode 100755 index 00000000..2a6d9604 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sr', { + copy: 'Копирај', + copyError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).', + cut: 'Исеци', + cutError: 'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).', + paste: 'Залепи', + pasteArea: 'Залепи зону', + pasteMsg: 'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (Ctrl/Cmd+V) и да притиснете OK.', + securityMsg: 'Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.', + title: 'Залепи' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/sv.js b/scripts/ckeditor/plugins/clipboard/lang/sv.js new file mode 100755 index 00000000..5b9489b6 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/sv.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'sv', { + copy: 'Kopiera', + copyError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.', + cut: 'Klipp ut', + cutError: 'Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.', + paste: 'Klistra in', + pasteArea: 'Paste Area', + pasteMsg: 'Var god och klistra in Er text i rutan nedan genom att använda (Ctrl/Cmd+V) klicka sen på OK.', + securityMsg: 'På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.', + title: 'Klistra in' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/th.js b/scripts/ckeditor/plugins/clipboard/lang/th.js new file mode 100755 index 00000000..111bf900 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/th.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'th', { + copy: 'สำเนา', + copyError: 'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).', + cut: 'ตัด', + cutError: 'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).', + paste: 'วาง', + pasteArea: 'Paste Area', // MISSING + pasteMsg: 'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (Ctrl/Cmd และ V)พร้อมๆกัน และกด OK.', + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'วาง' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/tr.js b/scripts/ckeditor/plugins/clipboard/lang/tr.js new file mode 100755 index 00000000..739bd50f --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/tr.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'tr', { + copy: 'Kopyala', + copyError: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.', + cut: 'Kes', + cutError: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.', + paste: 'Yapıştır', + pasteArea: 'Yapıştırma Alanı', + pasteMsg: 'Lütfen aşağıdaki kutunun içine yapıştırın. (Ctrl/Cmd+V) ve Tamam butonunu tıklayın.', + securityMsg: 'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..', + title: 'Yapıştır' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/tt.js b/scripts/ckeditor/plugins/clipboard/lang/tt.js new file mode 100755 index 00000000..50cdc82d --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/tt.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'tt', { + copy: 'Күчермәләү', + copyError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', + cut: 'Кисеп алу', + cutError: 'Браузерыгызның иминлек үзлекләре автоматик рәвештә күчермәләү үтәүне тыя. Тиз төймәләрне (Ctrl/Cmd+C) кулланыгыз.', + paste: 'Өстәү', + pasteArea: 'Өстәү мәйданы', + pasteMsg: 'Please paste inside the following box using the keyboard (Ctrl/Cmd+V) and hit OK', // MISSING + securityMsg: 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.', // MISSING + title: 'Өстәү' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/ug.js b/scripts/ckeditor/plugins/clipboard/lang/ug.js new file mode 100755 index 00000000..cbb3fea6 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/ug.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'ug', { + copy: 'نەشر ھوقۇقىغا ئىگە بەلگىسى', + copyError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ', + cut: 'كەس', + cutError: 'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ', + paste: 'چاپلا', + pasteArea: 'چاپلاش دائىرىسى', + pasteMsg: 'ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+V) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن جەزملەنى بېسىڭ', + securityMsg: 'توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.', + title: 'چاپلا' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/uk.js b/scripts/ckeditor/plugins/clipboard/lang/uk.js new file mode 100755 index 00000000..5013d3d6 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/uk.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'uk', { + copy: 'Копіювати', + copyError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).', + cut: 'Вирізати', + cutError: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)', + paste: 'Вставити', + pasteArea: 'Область вставки', + pasteMsg: 'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (Ctrl/Cmd+V), та натисніть OK.', + securityMsg: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.', + title: 'Вставити' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/vi.js b/scripts/ckeditor/plugins/clipboard/lang/vi.js new file mode 100755 index 00000000..8ba0e82b --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/vi.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'vi', { + copy: 'Sao chép', + copyError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).', + cut: 'Cắt', + cutError: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).', + paste: 'Dán', + pasteArea: 'Khu vực dán', + pasteMsg: 'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (Ctrl/Cmd+V) và nhấn vào nút Đồng ý.', + securityMsg: 'Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.', + title: 'Dán' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/zh-cn.js b/scripts/ckeditor/plugins/clipboard/lang/zh-cn.js new file mode 100755 index 00000000..7f676b63 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/zh-cn.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'zh-cn', { + copy: '复制', + copyError: '您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl/Cmd+C)来完成。', + cut: '剪切', + cutError: '您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl/Cmd+X)来完成。', + paste: '粘贴', + pasteArea: '粘贴区域', + pasteMsg: '请使用键盘快捷键(Ctrl/Cmd+V)把内容粘贴到下面的方框里,再按 确定', + securityMsg: '因为您的浏览器的安全设置原因,本编辑器不能直接访问您的剪贴板内容,你需要在本窗口重新粘贴一次。', + title: '粘贴' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/lang/zh.js b/scripts/ckeditor/plugins/clipboard/lang/zh.js new file mode 100755 index 00000000..c2175ec3 --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/lang/zh.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'clipboard', 'zh', { + copy: '複製', + copyError: '瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。', + cut: '剪下', + cutError: '瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。', + paste: '貼上', + pasteArea: '貼上區', + pasteMsg: '請使用鍵盤快捷鍵 (Ctrl/Cmd+V) 貼到下方區域中並按下「確定」。', + securityMsg: '因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。', + title: '貼上' +} ); diff --git a/scripts/ckeditor/plugins/clipboard/plugin.js b/scripts/ckeditor/plugins/clipboard/plugin.js new file mode 100755 index 00000000..fae5035f --- /dev/null +++ b/scripts/ckeditor/plugins/clipboard/plugin.js @@ -0,0 +1,1235 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @ignore + * File overview: Clipboard support. + */ + +// +// EXECUTION FLOWS: +// -- CTRL+C +// * browser's default behaviour +// -- CTRL+V +// * listen onKey (onkeydown) +// * simulate 'beforepaste' for non-IEs on editable +// * simulate 'paste' for Fx2/Opera on editable +// * listen 'onpaste' on editable ('onbeforepaste' for IE) +// * fire 'beforePaste' on editor +// * !canceled && getClipboardDataByPastebin +// * fire 'paste' on editor +// * !canceled && fire 'afterPaste' on editor +// -- CTRL+X +// * listen onKey (onkeydown) +// * fire 'saveSnapshot' on editor +// * browser's default behaviour +// * deferred second 'saveSnapshot' event +// -- Copy command +// * tryToCutCopy +// * execCommand +// * !success && alert +// -- Cut command +// * fixCut +// * tryToCutCopy +// * execCommand +// * !success && alert +// -- Paste command +// * fire 'paste' on editable ('beforepaste' for IE) +// * !canceled && execCommand 'paste' +// * !success && fire 'pasteDialog' on editor +// -- Paste from native context menu & menubar +// (Fx & Webkits are handled in 'paste' default listner. +// Opera cannot be handled at all because it doesn't fire any events +// Special treatment is needed for IE, for which is this part of doc) +// * listen 'onpaste' +// * cancel native event +// * fire 'beforePaste' on editor +// * !canceled && getClipboardDataByPastebin +// * execIECommand( 'paste' ) -> this fires another 'paste' event, so cancel it +// * fire 'paste' on editor +// * !canceled && fire 'afterPaste' on editor +// +// +// PASTE EVENT - PREPROCESSING: +// -- Possible dataValue types: auto, text, html. +// -- Possible dataValue contents: +// * text (possible \n\r) +// * htmlified text (text + br,div,p - no presentional markup & attrs - depends on browser) +// * html +// -- Possible flags: +// * htmlified - if true then content is a HTML even if no markup inside. This flag is set +// for content from editable pastebins, because they 'htmlify' pasted content. +// +// -- Type: auto: +// * content: htmlified text -> filter, unify text markup (brs, ps, divs), set type: text +// * content: html -> filter, set type: html +// -- Type: text: +// * content: htmlified text -> filter, unify text markup +// * content: html -> filter, strip presentional markup, unify text markup +// -- Type: html: +// * content: htmlified text -> filter, unify text markup +// * content: html -> filter +// +// -- Phases: +// * filtering (priorities 3-5) - e.g. pastefromword filters +// * content type sniffing (priority 6) +// * markup transformations for text (priority 6) +// + +'use strict'; + +( function() { + // Register the plugin. + CKEDITOR.plugins.add( 'clipboard', { + requires: 'dialog', + lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + icons: 'copy,copy-rtl,cut,cut-rtl,paste,paste-rtl', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + var textificationFilter; + + initClipboard( editor ); + + CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) ); + + editor.on( 'paste', function( evt ) { + var data = evt.data.dataValue, + blockElements = CKEDITOR.dtd.$block; + + // Filter webkit garbage. + if ( data.indexOf( 'Apple-' ) > -1 ) { + // Replace special webkit's   with simple space, because webkit + // produces them even for normal spaces. + data = data.replace( / <\/span>/gi, ' ' ); + + // Strip around white-spaces when not in forced 'html' content type. + // This spans are created only when pasting plain text into Webkit, + // but for safety reasons remove them always. + if ( evt.data.type != 'html' ) + data = data.replace( /]*>([^<]*)<\/span>/gi, function( all, spaces ) { + // Replace tabs with 4 spaces like Fx does. + return spaces.replace( /\t/g, '    ' ); + } ); + + // This br is produced only when copying & pasting HTML content. + if ( data.indexOf( '
' ) > -1 ) { + evt.data.startsWithEOL = 1; + evt.data.preSniffing = 'html'; // Mark as not text. + data = data.replace( /
/, '' ); + } + + // Remove all other classes. + data = data.replace( /(<[^>]+) class="Apple-[^"]*"/gi, '$1' ); + } + + // Strip editable that was copied from inside. (#9534) + if ( data.match( /^<[^<]+cke_(editable|contents)/i ) ) { + var tmp, + editable_wrapper, + wrapper = new CKEDITOR.dom.element( 'div' ); + + wrapper.setHtml( data ); + // Verify for sure and check for nested editor UI parts. (#9675) + while ( wrapper.getChildCount() == 1 && + ( tmp = wrapper.getFirst() ) && + tmp.type == CKEDITOR.NODE_ELEMENT && // Make sure first-child is element. + ( tmp.hasClass( 'cke_editable' ) || tmp.hasClass( 'cke_contents' ) ) ) { + wrapper = editable_wrapper = tmp; + } + + // If editable wrapper was found strip it and bogus
(added on FF). + if ( editable_wrapper ) + data = editable_wrapper.getHtml().replace( /
$/i, '' ); + } + + if ( CKEDITOR.env.ie ) { + //  

->

(br.cke-pasted-remove will be removed later) + data = data.replace( /^ (?: |\r\n)?<(\w+)/g, function( match, elementName ) { + if ( elementName.toLowerCase() in blockElements ) { + evt.data.preSniffing = 'html'; // Mark as not a text. + return '<' + elementName; + } + return match; + } ); + } else if ( CKEDITOR.env.webkit ) { + //


->


+ // We don't mark br, because this situation can happen for htmlified text too. + data = data.replace( /<\/(\w+)>

<\/div>$/, function( match, elementName ) { + if ( elementName in blockElements ) { + evt.data.endsWithEOL = 1; + return ''; + } + return match; + } ); + } else if ( CKEDITOR.env.gecko ) { + // Firefox adds bogus
when user pasted text followed by space(s). + data = data.replace( /(\s)
$/, '$1' ); + } + + evt.data.dataValue = data; + }, null, null, 3 ); + + editor.on( 'paste', function( evt ) { + var dataObj = evt.data, + type = dataObj.type, + data = dataObj.dataValue, + trueType, + // Default is 'html'. + defaultType = editor.config.clipboard_defaultContentType || 'html'; + + // If forced type is 'html' we don't need to know true data type. + if ( type == 'html' || dataObj.preSniffing == 'html' ) + trueType = 'html'; + else + trueType = recogniseContentType( data ); + + // Unify text markup. + if ( trueType == 'htmlifiedtext' ) + data = htmlifiedTextHtmlification( editor.config, data ); + // Strip presentional markup & unify text markup. + else if ( type == 'text' && trueType == 'html' ) { + // Init filter only if needed and cache it. + data = htmlTextification( editor.config, data, textificationFilter || ( textificationFilter = getTextificationFilter( editor ) ) ); + } + + if ( dataObj.startsWithEOL ) + data = '
' + data; + if ( dataObj.endsWithEOL ) + data += '
'; + + if ( type == 'auto' ) + type = ( trueType == 'html' || defaultType == 'html' ) ? 'html' : 'text'; + + dataObj.type = type; + dataObj.dataValue = data; + delete dataObj.preSniffing; + delete dataObj.startsWithEOL; + delete dataObj.endsWithEOL; + }, null, null, 6 ); + + // Inserts processed data into the editor at the end of the + // events chain. + editor.on( 'paste', function( evt ) { + var data = evt.data; + + editor.insertHtml( data.dataValue, data.type ); + + // Deferr 'afterPaste' so all other listeners for 'paste' will be fired first. + setTimeout( function() { + editor.fire( 'afterPaste' ); + }, 0 ); + }, null, null, 1000 ); + + editor.on( 'pasteDialog', function( evt ) { + // TODO it's possible that this setTimeout is not needed any more, + // because of changes introduced in the same commit as this comment. + // Editor.getClipboardData adds listner to the dialog's events which are + // fired after a while (not like 'showDialog'). + setTimeout( function() { + // Open default paste dialog. + editor.openDialog( 'paste', evt.data ); + }, 0 ); + } ); + } + } ); + + function initClipboard( editor ) { + var preventBeforePasteEvent = 0, + preventPasteEvent = 0, + inReadOnly = 0, + // Safari doesn't like 'beforepaste' event - it sometimes doesn't + // properly handles ctrl+c. Probably some race-condition between events. + // Chrome and Firefox works well with both events, so better to use 'paste' + // which will handle pasting from e.g. browsers' menu bars. + // IE7/8 doesn't like 'paste' event for which it's throwing random errors. + mainPasteEvent = CKEDITOR.env.ie ? 'beforepaste' : 'paste'; + + addListeners(); + addButtonsCommands(); + + /** + * Gets clipboard data by directly accessing the clipboard (IE only) or opening paste dialog. + * + * editor.getClipboardData( { title: 'Get my data' }, function( data ) { + * if ( data ) + * alert( data.type + ' ' + data.dataValue ); + * } ); + * + * @member CKEDITOR.editor + * @param {Object} options + * @param {String} [options.title] Title of paste dialog. + * @param {Function} callback Function that will be executed with `data.type` and `data.dataValue` + * or `null` if none of the capturing method succeeded. + */ + editor.getClipboardData = function( options, callback ) { + var beforePasteNotCanceled = false, + dataType = 'auto', + dialogCommited = false; + + // Options are optional - args shift. + if ( !callback ) { + callback = options; + options = null; + } + + // Listen with maximum priority to handle content before everyone else. + // This callback will handle paste event that will be fired if direct + // access to the clipboard succeed in IE. + editor.on( 'paste', onPaste, null, null, 0 ); + + // Listen at the end of listeners chain to see if event wasn't canceled + // and to retrieve modified data.type. + editor.on( 'beforePaste', onBeforePaste, null, null, 1000 ); + + // getClipboardDataDirectly() will fire 'beforePaste' synchronously, so we can + // check if it was canceled and if any listener modified data.type. + + // If command didn't succeed (only IE allows to access clipboard and only if + // user agrees) open and handle paste dialog. + if ( getClipboardDataDirectly() === false ) { + // Direct access to the clipboard wasn't successful so remove listener. + editor.removeListener( 'paste', onPaste ); + + // If beforePaste was canceled do not open dialog. + // Add listeners only if dialog really opened. 'pasteDialog' can be canceled. + if ( beforePasteNotCanceled && editor.fire( 'pasteDialog', onDialogOpen ) ) { + editor.on( 'pasteDialogCommit', onDialogCommit ); + + // 'dialogHide' will be fired after 'pasteDialogCommit'. + editor.on( 'dialogHide', function( evt ) { + evt.removeListener(); + evt.data.removeListener( 'pasteDialogCommit', onDialogCommit ); + + // Because Opera has to wait a while in pasteDialog we have to wait here. + setTimeout( function() { + // Notify even if user canceled dialog (clicked 'cancel', ESC, etc). + if ( !dialogCommited ) + callback( null ); + }, 10 ); + } ); + } else + callback( null ); + } + + function onPaste( evt ) { + evt.removeListener(); + evt.cancel(); + callback( evt.data ); + } + + function onBeforePaste( evt ) { + evt.removeListener(); + beforePasteNotCanceled = true; + dataType = evt.data.type; + } + + function onDialogCommit( evt ) { + evt.removeListener(); + // Cancel pasteDialogCommit so paste dialog won't automatically fire + // 'paste' evt by itself. + evt.cancel(); + dialogCommited = true; + callback( { type: dataType, dataValue: evt.data } ); + } + + function onDialogOpen() { + this.customTitle = ( options && options.title ); + } + }; + + function addButtonsCommands() { + addButtonCommand( 'Cut', 'cut', createCutCopyCmd( 'cut' ), 10, 1 ); + addButtonCommand( 'Copy', 'copy', createCutCopyCmd( 'copy' ), 20, 4 ); + addButtonCommand( 'Paste', 'paste', createPasteCmd(), 30, 8 ); + + function addButtonCommand( buttonName, commandName, command, toolbarOrder, ctxMenuOrder ) { + var lang = editor.lang.clipboard[ commandName ]; + + editor.addCommand( commandName, command ); + editor.ui.addButton && editor.ui.addButton( buttonName, { + label: lang, + command: commandName, + toolbar: 'clipboard,' + toolbarOrder + } ); + + // If the "menu" plugin is loaded, register the menu item. + if ( editor.addMenuItems ) { + editor.addMenuItem( commandName, { + label: lang, + command: commandName, + group: 'clipboard', + order: ctxMenuOrder + } ); + } + } + } + + function addListeners() { + editor.on( 'key', onKey ); + editor.on( 'contentDom', addListenersToEditable ); + + // For improved performance, we're checking the readOnly state on selectionChange instead of hooking a key event for that. + editor.on( 'selectionChange', function( evt ) { + inReadOnly = evt.data.selection.getRanges()[ 0 ].checkReadOnly(); + setToolbarStates(); + } ); + + // If the "contextmenu" plugin is loaded, register the listeners. + if ( editor.contextMenu ) { + editor.contextMenu.addListener( function( element, selection ) { + inReadOnly = selection.getRanges()[ 0 ].checkReadOnly(); + return { + cut: stateFromNamedCommand( 'cut' ), + copy: stateFromNamedCommand( 'copy' ), + paste: stateFromNamedCommand( 'paste' ) + }; + } ); + } + } + + // Add events listeners to editable. + function addListenersToEditable() { + var editable = editor.editable(); + + // We'll be catching all pasted content in one line, regardless of whether + // it's introduced by a document command execution (e.g. toolbar buttons) or + // user paste behaviors (e.g. CTRL+V). + editable.on( mainPasteEvent, function( evt ) { + if ( CKEDITOR.env.ie && preventBeforePasteEvent ) + return; + + // If you've just asked yourself why preventPasteEventNow() is not here, but + // in listener for CTRL+V and exec method of 'paste' command + // you've asked the same question we did. + // + // THE ANSWER: + // + // First thing to notice - this answer makes sense only for IE, + // because other browsers don't listen for 'paste' event. + // + // What would happen if we move preventPasteEventNow() here? + // For: + // * CTRL+V - IE fires 'beforepaste', so we prevent 'paste' and pasteDataFromClipboard(). OK. + // * editor.execCommand( 'paste' ) - we fire 'beforepaste', so we prevent + // 'paste' and pasteDataFromClipboard() and doc.execCommand( 'Paste' ). OK. + // * native context menu - IE fires 'beforepaste', so we prevent 'paste', but unfortunately + // on IE we fail with pasteDataFromClipboard() here, because of... we don't know why, but + // we just fail, so... we paste nothing. FAIL. + // * native menu bar - the same as for native context menu. + // + // But don't you know any way to distinguish first two cases from last two? + // Only one - special flag set in CTRL+V handler and exec method of 'paste' + // command. And that's what we did using preventPasteEventNow(). + + pasteDataFromClipboard( evt ); + } ); + + // It's not possible to clearly handle all four paste methods (ctrl+v, native menu bar + // native context menu, editor's command) in one 'paste/beforepaste' event in IE. + // + // For ctrl+v & editor's command it's easy to handle pasting in 'beforepaste' listener, + // so we do this. For another two methods it's better to use 'paste' event. + // + // 'paste' is always being fired after 'beforepaste' (except of weird one on opening native + // context menu), so for two methods handled in 'beforepaste' we're canceling 'paste' + // using preventPasteEvent state. + // + // 'paste' event in IE is being fired before getClipboardDataByPastebin executes its callback. + // + // QUESTION: Why didn't you handle all 4 paste methods in handler for 'paste'? + // Wouldn't this just be simpler? + // ANSWER: Then we would have to evt.data.preventDefault() only for native + // context menu and menu bar pastes. The same with execIECommand(). + // That would force us to mark CTRL+V and editor's paste command with + // special flag, other than preventPasteEvent. But we still would have to + // have preventPasteEvent for the second event fired by execIECommand. + // Code would be longer and not cleaner. + CKEDITOR.env.ie && editable.on( 'paste', function( evt ) { + if ( preventPasteEvent ) + return; + // Cancel next 'paste' event fired by execIECommand( 'paste' ) + // at the end of this callback. + preventPasteEventNow(); + + // Prevent native paste. + evt.data.preventDefault(); + + pasteDataFromClipboard( evt ); + + // Force IE to paste content into pastebin so pasteDataFromClipboard will work. + if ( !execIECommand( 'paste' ) ) + editor.openDialog( 'paste' ); + } ); + + // [IE] Dismiss the (wrong) 'beforepaste' event fired on context/toolbar menu open. (#7953) + if ( CKEDITOR.env.ie ) { + editable.on( 'contextmenu', preventBeforePasteEventNow, null, null, 0 ); + + editable.on( 'beforepaste', function( evt ) { + if ( evt.data && !evt.data.$.ctrlKey ) + preventBeforePasteEventNow(); + }, null, null, 0 ); + + } + + editable.on( 'beforecut', function() { + !preventBeforePasteEvent && fixCut( editor ); + } ); + + var mouseupTimeout; + + // Use editor.document instead of editable in non-IEs for observing mouseup + // since editable won't fire the event if selection process started within + // iframe and ended out of the editor (#9851). + editable.attachListener( CKEDITOR.env.ie ? editable : editor.document.getDocumentElement(), 'mouseup', function() { + mouseupTimeout = setTimeout( function() { + setToolbarStates(); + }, 0 ); + } ); + + // Make sure that deferred mouseup callback isn't executed after editor instance + // had been destroyed. This may happen when editor.destroy() is called in parallel + // with mouseup event (i.e. a button with onclick callback) (#10219). + editor.on( 'destroy', function() { + clearTimeout( mouseupTimeout ); + } ); + + editable.on( 'keyup', setToolbarStates ); + } + + // Create object representing Cut or Copy commands. + function createCutCopyCmd( type ) { + return { + type: type, + canUndo: type == 'cut', // We can't undo copy to clipboard. + startDisabled: true, + exec: function( data ) { + // Attempts to execute the Cut and Copy operations. + function tryToCutCopy( type ) { + if ( CKEDITOR.env.ie ) + return execIECommand( type ); + + // non-IEs part + try { + // Other browsers throw an error if the command is disabled. + return editor.document.$.execCommand( type, false, null ); + } catch ( e ) { + return false; + } + } + + this.type == 'cut' && fixCut(); + + var success = tryToCutCopy( this.type ); + + if ( !success ) + alert( editor.lang.clipboard[ this.type + 'Error' ] ); // Show cutError or copyError. + + return success; + } + }; + } + + function createPasteCmd() { + return { + // Snapshots are done manually by editable.insertXXX methods. + canUndo: false, + async: true, + + exec: function( editor, data ) { + var fire = function( data, withBeforePaste ) { + data && firePasteEvents( data.type, data.dataValue, !!withBeforePaste ); + + editor.fire( 'afterCommandExec', { + name: 'paste', + command: cmd, + returnValue: !!data + } ); + }, + cmd = this; + + // Check data precisely - don't open dialog on empty string. + if ( typeof data == 'string' ) + fire( { type: 'auto', dataValue: data }, 1 ); + else + editor.getClipboardData( fire ); + } + }; + } + + function preventPasteEventNow() { + preventPasteEvent = 1; + // For safety reason we should wait longer than 0/1ms. + // We don't know how long execution of quite complex getClipboardData will take + // and in for example 'paste' listner execCommand() (which fires 'paste') is called + // after getClipboardData finishes. + // Luckily, it's impossible to immediately fire another 'paste' event we want to handle, + // because we only handle there native context menu and menu bar. + setTimeout( function() { + preventPasteEvent = 0; + }, 100 ); + } + + function preventBeforePasteEventNow() { + preventBeforePasteEvent = 1; + setTimeout( function() { + preventBeforePasteEvent = 0; + }, 10 ); + } + + // Tries to execute any of the paste, cut or copy commands in IE. Returns a + // boolean indicating that the operation succeeded. + // @param {String} command *LOWER CASED* name of command ('paste', 'cut', 'copy'). + function execIECommand( command ) { + var doc = editor.document, + body = doc.getBody(), + enabled = false, + onExec = function() { + enabled = true; + }; + + // The following seems to be the only reliable way to detect that + // clipboard commands are enabled in IE. It will fire the + // onpaste/oncut/oncopy events only if the security settings allowed + // the command to execute. + body.on( command, onExec ); + + // IE7: document.execCommand has problem to paste into positioned element. + ( CKEDITOR.env.version > 7 ? doc.$ : doc.$.selection.createRange() )[ 'execCommand' ]( command ); + + body.removeListener( command, onExec ); + + return enabled; + } + + function firePasteEvents( type, data, withBeforePaste ) { + var eventData = { type: type }; + + if ( withBeforePaste ) { + // Fire 'beforePaste' event so clipboard flavor get customized + // by other plugins. + if ( editor.fire( 'beforePaste', eventData ) === false ) + return false; // Event canceled + } + + // The very last guard to make sure the paste has successfully happened. + // This check should be done after firing 'beforePaste' because for native paste + // 'beforePaste' is by default fired even for empty clipboard. + if ( !data ) + return false; + + // Reuse eventData.type because the default one could be changed by beforePaste listeners. + eventData.dataValue = data; + + return editor.fire( 'paste', eventData ); + } + + // Cutting off control type element in IE standards breaks the selection entirely. (#4881) + function fixCut() { + if ( !CKEDITOR.env.ie || CKEDITOR.env.quirks ) + return; + + var sel = editor.getSelection(), + control, range, dummy; + + if ( ( sel.getType() == CKEDITOR.SELECTION_ELEMENT ) && ( control = sel.getSelectedElement() ) ) { + range = sel.getRanges()[ 0 ]; + dummy = editor.document.createText( '' ); + dummy.insertBefore( control ); + range.setStartBefore( dummy ); + range.setEndAfter( control ); + sel.selectRanges( [ range ] ); + + // Clear up the fix if the paste wasn't succeeded. + setTimeout( function() { + // Element still online? + if ( control.getParent() ) { + dummy.remove(); + sel.selectElement( control ); + } + }, 0 ); + } + } + + // Allow to peek clipboard content by redirecting the + // pasting content into a temporary bin and grab the content of it. + function getClipboardDataByPastebin( evt, callback ) { + var doc = editor.document, + editable = editor.editable(), + cancel = function( evt ) { + evt.cancel(); + }, + blurListener; + + // Avoid recursions on 'paste' event or consequent paste too fast. (#5730) + if ( doc.getById( 'cke_pastebin' ) ) + return; + + var sel = editor.getSelection(); + var bms = sel.createBookmarks(); + + // #11384. On IE9+ we use native selectionchange (i.e. editor#selectionCheck) to cache the most + // recent selection which we then lock on editable blur. See selection.js for more info. + // selectionchange fired before getClipboardDataByPastebin() cached selection + // before creating bookmark (cached selection will be invalid, because bookmarks modified the DOM), + // so we need to fire selectionchange one more time, to store current seleciton. + // Selection will be locked when we focus pastebin. + if ( CKEDITOR.env.ie ) + sel.root.fire( 'selectionchange' ); + + // Create container to paste into. + // For rich content we prefer to use "body" since it holds + // the least possibility to be splitted by pasted content, while this may + // breaks the text selection on a frame-less editable, "div" would be + // the best one in that case. + // In another case on old IEs moving the selection into a "body" paste bin causes error panic. + // Body can't be also used for Opera which fills it with
+ // what is indistinguishable from pasted
(copying
in Opera isn't possible, + // but it can be copied from other browser). + var pastebin = new CKEDITOR.dom.element( + ( CKEDITOR.env.webkit || editable.is( 'body' ) ) && !CKEDITOR.env.ie ? 'body' : 'div', doc ); + + pastebin.setAttributes( { + id: 'cke_pastebin', + 'data-cke-temp': '1' + } ); + + var containerOffset = 0, + offsetParent, + win = doc.getWindow(); + + if ( CKEDITOR.env.webkit ) { + // It's better to paste close to the real paste destination, so inherited styles + // (which Webkits will try to compensate by styling span) differs less from the destination's one. + editable.append( pastebin ); + // Style pastebin like .cke_editable, to minimize differences between origin and destination. (#9754) + pastebin.addClass( 'cke_editable' ); + + // Compensate position of offsetParent. + if ( !editable.is( 'body' ) ) { + // We're not able to get offsetParent from pastebin (body element), so check whether + // its parent (editable) is positioned. + if ( editable.getComputedStyle( 'position' ) != 'static' ) + offsetParent = editable; + // And if not - safely get offsetParent from editable. + else + offsetParent = CKEDITOR.dom.element.get( editable.$.offsetParent ); + + containerOffset = offsetParent.getDocumentPosition().y; + } + } else { + // Opera and IE doesn't allow to append to html element. + editable.getAscendant( CKEDITOR.env.ie ? 'body' : 'html', 1 ).append( pastebin ); + } + + pastebin.setStyles( { + position: 'absolute', + // Position the bin at the top (+10 for safety) of viewport to avoid any subsequent document scroll. + top: ( win.getScrollPosition().y - containerOffset + 10 ) + 'px', + width: '1px', + // Caret has to fit in that height, otherwise browsers like Chrome & Opera will scroll window to show it. + // Set height equal to viewport's height - 20px (safety gaps), minimum 1px. + height: Math.max( 1, win.getViewPaneSize().height - 20 ) + 'px', + overflow: 'hidden', + // Reset styles that can mess up pastebin position. + margin: 0, + padding: 0 + } ); + + // Check if the paste bin now establishes new editing host. + var isEditingHost = pastebin.getParent().isReadOnly(); + + if ( isEditingHost ) { + // Hide the paste bin. + pastebin.setOpacity( 0 ); + // And make it editable. + pastebin.setAttribute( 'contenteditable', true ); + } + // Transparency is not enough since positioned non-editing host always shows + // resize handler, pull it off the screen instead. + else + pastebin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-1000px' ); + + editor.on( 'selectionChange', cancel, null, null, 0 ); + + // Webkit fill fire blur on editable when moving selection to + // pastebin (if body is used). Cancel it because it causes incorrect + // selection lock in case of inline editor (#10644). + // The same seems to apply to Firefox (#10787). + if ( CKEDITOR.env.webkit || CKEDITOR.env.gecko ) + blurListener = editable.once( 'blur', cancel, null, null, -100 ); + + // Temporarily move selection to the pastebin. + isEditingHost && pastebin.focus(); + var range = new CKEDITOR.dom.range( pastebin ); + range.selectNodeContents( pastebin ); + var selPastebin = range.select(); + + // If non-native paste is executed, IE will open security alert and blur editable. + // Editable will then lock selection inside itself and after accepting security alert + // this selection will be restored. We overwrite stored selection, so it's restored + // in pastebin. (#9552) + if ( CKEDITOR.env.ie ) { + blurListener = editable.once( 'blur', function( evt ) { + editor.lockSelection( selPastebin ); + } ); + } + + var scrollTop = CKEDITOR.document.getWindow().getScrollPosition().y; + + // Wait a while and grab the pasted contents. + setTimeout( function() { + // Restore main window's scroll position which could have been changed + // by browser in cases described in #9771. + if ( CKEDITOR.env.webkit ) + CKEDITOR.document.getBody().$.scrollTop = scrollTop; + + // Blur will be fired only on non-native paste. In other case manually remove listener. + blurListener && blurListener.removeListener(); + + // Restore properly the document focus. (#8849) + if ( CKEDITOR.env.ie ) + editable.focus(); + + // IE7: selection must go before removing pastebin. (#8691) + sel.selectBookmarks( bms ); + pastebin.remove(); + + // Grab the HTML contents. + // We need to look for a apple style wrapper on webkit it also adds + // a div wrapper if you copy/paste the body of the editor. + // Remove hidden div and restore selection. + var bogusSpan; + if ( CKEDITOR.env.webkit && ( bogusSpan = pastebin.getFirst() ) && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) ) + pastebin = bogusSpan; + + editor.removeListener( 'selectionChange', cancel ); + callback( pastebin.getHtml() ); + }, 0 ); + } + + // Try to get content directly from clipboard, without native event + // being fired before. In other words - synthetically get clipboard data + // if it's possible. + // mainPasteEvent will be fired, so if forced native paste: + // * worked, getClipboardDataByPastebin will grab it, + // * didn't work, pastebin will be empty and editor#paste won't be fired. + function getClipboardDataDirectly() { + if ( CKEDITOR.env.ie ) { + // Prevent IE from pasting at the begining of the document. + editor.focus(); + + // Command will be handled by 'beforepaste', but as + // execIECommand( 'paste' ) will fire also 'paste' event + // we're canceling it. + preventPasteEventNow(); + + // #9247: Lock focus to prevent IE from hiding toolbar for inline editor. + var focusManager = editor.focusManager; + focusManager.lock(); + + if ( editor.editable().fire( mainPasteEvent ) && !execIECommand( 'paste' ) ) { + focusManager.unlock(); + return false; + } + focusManager.unlock(); + } else { + try { + if ( editor.editable().fire( mainPasteEvent ) && !editor.document.$.execCommand( 'Paste', false, null ) ) + throw 0; + + } catch ( e ) { + return false; + } + } + + return true; + } + + // Listens for some clipboard related keystrokes, so they get customized. + // Needs to be bind to keydown event. + function onKey( event ) { + if ( editor.mode != 'wysiwyg' ) + return; + + switch ( event.data.keyCode ) { + // Paste + case CKEDITOR.CTRL + 86: // CTRL+V + case CKEDITOR.SHIFT + 45: // SHIFT+INS + var editable = editor.editable(); + + // Cancel 'paste' event because ctrl+v is for IE handled + // by 'beforepaste'. + preventPasteEventNow(); + + // Simulate 'beforepaste' event for all none-IEs. + !CKEDITOR.env.ie && editable.fire( 'beforepaste' ); + + return; + + // Cut + case CKEDITOR.CTRL + 88: // CTRL+X + case CKEDITOR.SHIFT + 46: // SHIFT+DEL + // Save Undo snapshot. + editor.fire( 'saveSnapshot' ); // Save before cut + setTimeout( function() { + editor.fire( 'saveSnapshot' ); // Save after cut + }, 50 ); // OSX is slow (#11416). + } + } + + function pasteDataFromClipboard( evt ) { + // Default type is 'auto', but can be changed by beforePaste listeners. + var eventData = { type: 'auto' }; + // Fire 'beforePaste' event so clipboard flavor get customized by other plugins. + // If 'beforePaste' is canceled continue executing getClipboardDataByPastebin and then do nothing + // (do not fire 'paste', 'afterPaste' events). This way we can grab all - synthetically + // and natively pasted content and prevent its insertion into editor + // after canceling 'beforePaste' event. + var beforePasteNotCanceled = editor.fire( 'beforePaste', eventData ); + + getClipboardDataByPastebin( evt, function( data ) { + // Clean up. + data = data.replace( /]+data-cke-bookmark[^<]*?<\/span>/ig, '' ); + + // Fire remaining events (without beforePaste) + beforePasteNotCanceled && firePasteEvents( eventData.type, data, 0, 1 ); + } ); + } + + function setToolbarStates() { + if ( editor.mode != 'wysiwyg' ) + return; + + var pasteState = stateFromNamedCommand( 'paste' ); + + editor.getCommand( 'cut' ).setState( stateFromNamedCommand( 'cut' ) ); + editor.getCommand( 'copy' ).setState( stateFromNamedCommand( 'copy' ) ); + editor.getCommand( 'paste' ).setState( pasteState ); + editor.fire( 'pasteState', pasteState ); + } + + function stateFromNamedCommand( command ) { + if ( inReadOnly && command in { paste: 1, cut: 1 } ) + return CKEDITOR.TRISTATE_DISABLED; + + if ( command == 'paste' ) + return CKEDITOR.TRISTATE_OFF; + + // Cut, copy - check if the selection is not empty. + var sel = editor.getSelection(), + ranges = sel.getRanges(), + selectionIsEmpty = sel.getType() == CKEDITOR.SELECTION_NONE || ( ranges.length == 1 && ranges[ 0 ].collapsed ); + + return selectionIsEmpty ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_OFF; + } + } + + // Returns: + // * 'htmlifiedtext' if content looks like transformed by browser from plain text. + // See clipboard/paste.html TCs for more info. + // * 'html' if it is not 'htmlifiedtext'. + function recogniseContentType( data ) { + if ( CKEDITOR.env.webkit ) { + // Plain text or (

and text inside
). + if ( !data.match( /^[^<]*$/g ) && !data.match( /^(
<\/div>|
[^<]*<\/div>)*$/gi ) ) + return 'html'; + } else if ( CKEDITOR.env.ie ) { + // Text and
or ( text and
in

- paragraphs can be separated by new \r\n ). + if ( !data.match( /^([^<]|)*$/gi ) && !data.match( /^(

([^<]|)*<\/p>|(\r\n))*$/gi ) ) + return 'html'; + } else if ( CKEDITOR.env.gecko ) { + // Text or
. + if ( !data.match( /^([^<]|)*$/gi ) ) + return 'html'; + } else + return 'html'; + + return 'htmlifiedtext'; + } + + // This function transforms what browsers produce when + // pasting plain text into editable element (see clipboard/paste.html TCs + // for more info) into correct HTML (similar to that produced by text2Html). + function htmlifiedTextHtmlification( config, data ) { + function repeatParagraphs( repeats ) { + // Repeat blocks floor((n+1)/2) times. + // Even number of repeats - add
at the beginning of last

. + return CKEDITOR.tools.repeat( '

', ~~ ( repeats / 2 ) ) + ( repeats % 2 == 1 ? '
' : '' ); + } + + // Replace adjacent white-spaces (EOLs too - Fx sometimes keeps them) with one space. + data = data.replace( /\s+/g, ' ' ) + // Remove spaces from between tags. + .replace( /> +<' ) + // Normalize XHTML syntax and upper cased
tags. + .replace( /
/gi, '
' ); + + // IE - lower cased tags. + data = data.replace( /<\/?[A-Z]+>/g, function( match ) { + return match.toLowerCase(); + } ); + + // Don't touch single lines (no ) - nothing to do here. + if ( data.match( /^[^<]$/ ) ) + return data; + + // Webkit. + if ( CKEDITOR.env.webkit && data.indexOf( '

' ) > -1 ) { + // One line break at the beginning - insert
+ data = data.replace( /^(
(
|)<\/div>)(?!$|(
(
|)<\/div>))/g, '
' ) + // Two or more - reduce number of new lines by one. + .replace( /^(
(
|)<\/div>){2}(?!$)/g, '
' ); + + // Two line breaks create one paragraph in Webkit. + if ( data.match( /
(
|)<\/div>/ ) ) { + data = '

' + data.replace( /(

(
|)<\/div>)+/g, function( match ) { + return repeatParagraphs( match.split( '
' ).length + 1 ); + } ) + '

'; + } + + // One line break create br. + data = data.replace( /<\/div>
/g, '
' ); + + // Remove remaining divs. + data = data.replace( /<\/?div>/g, '' ); + } + + // Opera and Firefox and enterMode != BR. + if ( CKEDITOR.env.gecko && config.enterMode != CKEDITOR.ENTER_BR ) { + // Remove bogus
- Fx generates two for one line break. + // For two line breaks it still produces two , but it's better to ignore this case than the first one. + if ( CKEDITOR.env.gecko ) + data = data.replace( /^

$/, '
' ); + + // This line satisfy edge case when for Opera we have two line breaks + //data = data.replace( /) + + if ( data.indexOf( '

' ) > -1 ) { + // Two line breaks create one paragraph, three - 2, four - 3, etc. + data = '

' + data.replace( /(
){2,}/g, function( match ) { + return repeatParagraphs( match.length / 4 ); + } ) + '

'; + } + } + + return switchEnterMode( config, data ); + } + + // Filter can be editor dependent. + function getTextificationFilter( editor ) { + var filter = new CKEDITOR.htmlParser.filter(); + + // Elements which creates vertical breaks (have vert margins) - took from HTML5 spec. + // http://dev.w3.org/html5/markup/Overview.html#toc + var replaceWithParaIf = { blockquote: 1, dl: 1, fieldset: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, ol: 1, p: 1, table: 1, ul: 1 }, + + // All names except of
. + stripInlineIf = CKEDITOR.tools.extend( { br: 0 }, CKEDITOR.dtd.$inline ), + + // What's finally allowed (cke:br will be removed later). + allowedIf = { p: 1, br: 1, 'cke:br': 1 }, + + knownIf = CKEDITOR.dtd, + + // All names that will be removed (with content). + removeIf = CKEDITOR.tools.extend( { area: 1, basefont: 1, embed: 1, iframe: 1, map: 1, object: 1, param: 1 }, CKEDITOR.dtd.$nonBodyContent, CKEDITOR.dtd.$cdata ); + + var flattenTableCell = function( element ) { + delete element.name; + element.add( new CKEDITOR.htmlParser.text( ' ' ) ); + }, + // Squash adjacent headers into one.

A

B

->

A
B

+ // Empty ones will be removed later. + squashHeader = function( element ) { + var next = element, + br, el; + + while ( ( next = next.next ) && next.name && next.name.match( /^h\d$/ ) ) { + // TODO shitty code - waitin' for htmlParse.element fix. + br = new CKEDITOR.htmlParser.element( 'cke:br' ); + br.isEmpty = true; + element.add( br ); + while ( ( el = next.children.shift() ) ) + element.add( el ); + } + }; + + filter.addRules( { + elements: { + h1: squashHeader, + h2: squashHeader, + h3: squashHeader, + h4: squashHeader, + h5: squashHeader, + h6: squashHeader, + + img: function( element ) { + var alt = CKEDITOR.tools.trim( element.attributes.alt || '' ), + txt = ' '; + + // Replace image with its alt if it doesn't look like an url or is empty. + if ( alt && !alt.match( /(^http|\.(jpe?g|gif|png))/i ) ) + txt = ' [' + alt + '] '; + + return new CKEDITOR.htmlParser.text( txt ); + }, + + td: flattenTableCell, + th: flattenTableCell, + + $: function( element ) { + var initialName = element.name, + br; + + // Remove entirely. + if ( removeIf[ initialName ] ) + return false; + + // Remove all attributes. + element.attributes = {}; + + // Pass brs. + if ( initialName == 'br' ) + return element; + + // Elements that we want to replace with paragraphs. + if ( replaceWithParaIf[ initialName ] ) + element.name = 'p'; + + // Elements that we want to strip (tags only, without the content). + else if ( stripInlineIf[ initialName ] ) + delete element.name; + + // Surround other known element with and strip tags. + else if ( knownIf[ initialName ] ) { + // TODO shitty code - waitin' for htmlParse.element fix. + br = new CKEDITOR.htmlParser.element( 'cke:br' ); + br.isEmpty = true; + + // Replace hrs (maybe sth else too?) with only one br. + if ( CKEDITOR.dtd.$empty[ initialName ] ) + return br; + + element.add( br, 0 ); + br = br.clone(); + br.isEmpty = true; + element.add( br ); + delete element.name; + } + + // Final cleanup - if we can still find some not allowed elements then strip their names. + if ( !allowedIf[ element.name ] ) + delete element.name; + + return element; + } + } + }, { + // Apply this filter to every element. + applyToAll: true + } ); + + return filter; + } + + function htmlTextification( config, data, filter ) { + var fragment = new CKEDITOR.htmlParser.fragment.fromHtml( data ), + writer = new CKEDITOR.htmlParser.basicWriter(); + + fragment.writeHtml( writer, filter ); + data = writer.getHtml(); + + // Cleanup cke:brs. + data = data.replace( /\s*(<\/?[a-z:]+ ?\/?>)\s*/g, '$1' ) // Remove spaces around tags. + .replace( /(){2,}/g, '' ) // Join multiple adjacent cke:brs + .replace( /()(<\/?p>|
)/g, '$2' ) // Strip cke:brs adjacent to original brs or ps. + .replace( /(<\/?p>|
)()/g, '$1' ) + .replace( /<(cke:)?br( \/)?>/g, '
' ) // Finally - rename cke:brs to brs and fix
to
. + .replace( /

<\/p>/g, '' ); // Remove empty paragraphs. + + // Fix nested ps. E.g.: + //

A

B

C

D

E

F

G + //

A

B

C

D

E

F

G + var nested = 0; + data = data.replace( /<\/?p>/g, function( match ) { + if ( match == '

' ) { + if ( ++nested > 1 ) + return '

'; + } else { + if ( --nested > 0 ) + return '

'; + } + + return match; + } ).replace( /

<\/p>/g, '' ); // Step before:

->

. Fix this here. + + return switchEnterMode( config, data ); + } + + function switchEnterMode( config, data ) { + if ( config.enterMode == CKEDITOR.ENTER_BR ) { + data = data.replace( /(<\/p>

)+/g, function( match ) { + return CKEDITOR.tools.repeat( '
', match.length / 7 * 2 ); + } ).replace( /<\/?p>/g, '' ); + } else if ( config.enterMode == CKEDITOR.ENTER_DIV ) + data = data.replace( /<(\/)?p>/g, '<$1div>' ); + + return data; + } +} )(); + +/** + * The default content type is used when pasted data cannot be clearly recognized as HTML or text. + * + * For example: `'foo'` may come from a plain text editor or a website. It isn't possible to recognize content + * type in this case, so default will be used. However, it's clear that `'example text'` is an HTML + * and its origin is webpage, email or other rich text editor. + * + * **Note:** If content type is text, then styles of context of paste are preserved. + * + * CKEDITOR.config.clipboard_defaultContentType = 'text'; + * + * @since 4.0 + * @cfg {'html'/'text'} [clipboard_defaultContentType='html'] + * @member CKEDITOR.config + */ + +/** + * Fired when a clipboard operation is about to be taken into the editor. + * Listeners can manipulate the data to be pasted before having it effectively + * inserted into the document. + * + * @since 3.1 + * @event paste + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param data + * @param {String} data.type Type of data in `data.dataValue`. Usually `html` or `text`, but for listeners + * with priority less than 6 it may be also `auto`, what means that content type hasn't been recognised yet + * (this will be done by content type sniffer that listens with priority 6). + * @param {String} data.dataValue HTML to be pasted. + */ + +/** + * Fired before the {@link #paste} event. Allows to preset data type. + * + * **Note:** This event is deprecated. Add a `0` priority listener for the + * {@link #paste} event instead. + * + * @deprecated + * @event beforePaste + * @member CKEDITOR.editor + */ + +/** + * Internal event to open the Paste dialog. + * + * @private + * @event pasteDialog + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}. + */ diff --git a/scripts/ckeditor/plugins/colorbutton/icons/bgcolor.png b/scripts/ckeditor/plugins/colorbutton/icons/bgcolor.png new file mode 100755 index 00000000..a313938d Binary files /dev/null and b/scripts/ckeditor/plugins/colorbutton/icons/bgcolor.png differ diff --git a/scripts/ckeditor/plugins/colorbutton/icons/hidpi/bgcolor.png b/scripts/ckeditor/plugins/colorbutton/icons/hidpi/bgcolor.png new file mode 100755 index 00000000..54b3e18c Binary files /dev/null and b/scripts/ckeditor/plugins/colorbutton/icons/hidpi/bgcolor.png differ diff --git a/scripts/ckeditor/plugins/colorbutton/icons/hidpi/textcolor.png b/scripts/ckeditor/plugins/colorbutton/icons/hidpi/textcolor.png new file mode 100755 index 00000000..8fc56bcb Binary files /dev/null and b/scripts/ckeditor/plugins/colorbutton/icons/hidpi/textcolor.png differ diff --git a/scripts/ckeditor/plugins/colorbutton/icons/textcolor.png b/scripts/ckeditor/plugins/colorbutton/icons/textcolor.png new file mode 100755 index 00000000..0d8e4590 Binary files /dev/null and b/scripts/ckeditor/plugins/colorbutton/icons/textcolor.png differ diff --git a/scripts/ckeditor/plugins/colorbutton/lang/af.js b/scripts/ckeditor/plugins/colorbutton/lang/af.js new file mode 100755 index 00000000..0c66d0a5 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/af.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'af', { + auto: 'Outomaties', + bgColorTitle: 'Agtergrondkleur', + colors: { + '000': 'Swart', + '800000': 'Meroen', + '8B4513': 'Sjokoladebruin', + '2F4F4F': 'Donkerleisteengrys', + '008080': 'Blougroen', + '000080': 'Vlootblou', + '4B0082': 'Indigo', + '696969': 'Donkergrys', + B22222: 'Rooibaksteen', + A52A2A: 'Bruin', + DAA520: 'Donkergeel', + '006400': 'Donkergroen', + '40E0D0': 'Turkoois', + '0000CD': 'Middelblou', + '800080': 'Pers', + '808080': 'Grys', + F00: 'Rooi', + FF8C00: 'Donkeroranje', + FFD700: 'Goud', + '008000': 'Groen', + '0FF': 'Siaan', + '00F': 'Blou', + EE82EE: 'Viooltjieblou', + A9A9A9: 'Donkergrys', + FFA07A: 'Ligsalm', + FFA500: 'Oranje', + FFFF00: 'Geel', + '00FF00': 'Lemmetjie', + AFEEEE: 'Ligturkoois', + ADD8E6: 'Ligblou', + DDA0DD: 'Pruim', + D3D3D3: 'Liggrys', + FFF0F5: 'Linne', + FAEBD7: 'Ivoor', + FFFFE0: 'Liggeel', + F0FFF0: 'Heuningdou', + F0FFFF: 'Asuur', + F0F8FF: 'Ligte hemelsblou', + E6E6FA: 'Laventel', + FFF: 'Wit' + }, + more: 'Meer Kleure...', + panelTitle: 'Kleure', + textColorTitle: 'Tekskleur' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ar.js b/scripts/ckeditor/plugins/colorbutton/lang/ar.js new file mode 100755 index 00000000..00737726 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ar.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ar', { + auto: 'تلقائي', + bgColorTitle: 'لون الخلفية', + colors: { + '000': 'أسود', + '800000': 'كستنائي', + '8B4513': 'بني فاتح', + '2F4F4F': 'رمادي أردوازي غامق', + '008080': 'أزرق مخضر', + '000080': 'أزرق داكن', + '4B0082': 'كحلي', + '696969': 'رمادي داكن', + B22222: 'طوبي', + A52A2A: 'بني', + DAA520: 'ذهبي داكن', + '006400': 'أخضر داكن', + '40E0D0': 'فيروزي', + '0000CD': 'أزرق متوسط', + '800080': 'بنفسجي غامق', + '808080': 'رمادي', + F00: 'أحمر', + FF8C00: 'برتقالي داكن', + FFD700: 'ذهبي', + '008000': 'أخضر', + '0FF': 'تركواز', + '00F': 'أزرق', + EE82EE: 'بنفسجي', + A9A9A9: 'رمادي شاحب', + FFA07A: 'برتقالي وردي', + FFA500: 'برتقالي', + FFFF00: 'أصفر', + '00FF00': 'ليموني', + AFEEEE: 'فيروزي شاحب', + ADD8E6: 'أزرق فاتح', + DDA0DD: 'بنفسجي فاتح', + D3D3D3: 'رمادي فاتح', + FFF0F5: 'وردي فاتح', + FAEBD7: 'أبيض عتيق', + FFFFE0: 'أصفر فاتح', + F0FFF0: 'أبيض مائل للأخضر', + F0FFFF: 'سماوي', + F0F8FF: 'لبني', + E6E6FA: 'أرجواني', + FFF: 'أبيض' + }, + more: 'ألوان إضافية...', + panelTitle: 'Colors', + textColorTitle: 'لون النص' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/bg.js b/scripts/ckeditor/plugins/colorbutton/lang/bg.js new file mode 100755 index 00000000..a26d1c4c --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/bg.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'bg', { + auto: 'Автоматично', + bgColorTitle: 'Фонов цвят', + colors: { + '000': 'Черно', + '800000': 'Кестеняво', + '8B4513': 'Светлокафяво', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Индиго', + '696969': 'Тъмно сиво', + B22222: 'Огнено червено', + A52A2A: 'Кафяво', + DAA520: 'Златисто', + '006400': 'Тъмно зелено', + '40E0D0': 'Тюркуазено', + '0000CD': 'Средно синьо', + '800080': 'Пурпурно', + '808080': 'Сиво', + F00: 'Червено', + FF8C00: 'Тъмно оранжево', + FFD700: 'Златно', + '008000': 'Зелено', + '0FF': 'Светло синьо', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Още цветове', + panelTitle: 'Цветове', + textColorTitle: 'Цвят на шрифт' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/bn.js b/scripts/ckeditor/plugins/colorbutton/lang/bn.js new file mode 100755 index 00000000..30ebb5b9 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/bn.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'bn', { + auto: 'অটোমেটিক', + bgColorTitle: 'বেকগ্রাউন্ড রং', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'আরও রং...', + panelTitle: 'Colors', + textColorTitle: 'টেক্স্ট রং' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/bs.js b/scripts/ckeditor/plugins/colorbutton/lang/bs.js new file mode 100755 index 00000000..2211687a --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/bs.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'bs', { + auto: 'Automatska', + bgColorTitle: 'Boja pozadine', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Više boja...', + panelTitle: 'Colors', + textColorTitle: 'Boja teksta' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ca.js b/scripts/ckeditor/plugins/colorbutton/lang/ca.js new file mode 100755 index 00000000..df1de45a --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ca.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ca', { + auto: 'Automàtic', + bgColorTitle: 'Color de Fons', + colors: { + '000': 'Negre', + '800000': 'Grana', + '8B4513': 'Marró sella', + '2F4F4F': 'Gris pissarra fosca', + '008080': 'Blau xarxet', + '000080': 'Blau marí', + '4B0082': 'Indi', + '696969': 'Gris Fosc', + B22222: 'Foc Maó', + A52A2A: 'Marró', + DAA520: 'Solidago', + '006400': 'Verd Fosc', + '40E0D0': 'Turquesa', + '0000CD': 'Blau 1/2', + '800080': 'Lila', + '808080': 'Gris', + F00: 'Vermell', + FF8C00: 'Taronja Fosc', + FFD700: 'Or', + '008000': 'Verd', + '0FF': 'Cian', + '00F': 'Blau', + EE82EE: 'Violat', + A9A9A9: 'Gris clar', + FFA07A: 'Salmó clar', + FFA500: 'Taronja', + FFFF00: 'Groc', + '00FF00': 'Verd Llima', + AFEEEE: 'Turquesa Pàl·lid', + ADD8E6: 'Blau Clar', + DDA0DD: 'Pruna', + D3D3D3: 'Gris Clar', + FFF0F5: 'Lavanda rosat', + FAEBD7: 'Blanc Antic', + FFFFE0: 'Groc Clar', + F0FFF0: 'Verd Pàl·lid', + F0FFFF: 'Atzur', + F0F8FF: 'Cian pàlid', + E6E6FA: 'Lavanda', + FFF: 'Blanc' + }, + more: 'Més Colors...', + panelTitle: 'Colors', + textColorTitle: 'Color del Text' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/cs.js b/scripts/ckeditor/plugins/colorbutton/lang/cs.js new file mode 100755 index 00000000..1ed796de --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/cs.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'cs', { + auto: 'Automaticky', + bgColorTitle: 'Barva pozadí', + colors: { + '000': 'Černá', + '800000': 'Kaštanová', + '8B4513': 'Sedlová hněď', + '2F4F4F': 'Tmavě bledě šedá', + '008080': 'Čírka', + '000080': 'Námořnická modř', + '4B0082': 'Inkoustová', + '696969': 'Tmavě šedá', + B22222: 'Pálená cihla', + A52A2A: 'Hnědá', + DAA520: 'Zlatý prut', + '006400': 'Tmavě zelená', + '40E0D0': 'Tyrkisová', + '0000CD': 'Středně modrá', + '800080': 'Purpurová', + '808080': 'Šedá', + F00: 'Červená', + FF8C00: 'Tmavě oranžová', + FFD700: 'Zlatá', + '008000': 'Zelená', + '0FF': 'Azurová', + '00F': 'Modrá', + EE82EE: 'Fialová', + A9A9A9: 'Kalně šedá', + FFA07A: 'Světle lososová', + FFA500: 'Oranžová', + FFFF00: 'Žlutá', + '00FF00': 'Limetková', + AFEEEE: 'Bledě tyrkisová', + ADD8E6: 'Světle modrá', + DDA0DD: 'Švestková', + D3D3D3: 'Světle šedá', + FFF0F5: 'Levandulově ruměnná', + FAEBD7: 'Antická bílá', + FFFFE0: 'Světle žlutá', + F0FFF0: 'Medová rosa', + F0FFFF: 'Azurová', + F0F8FF: 'Alenčina modrá', + E6E6FA: 'Levandulová', + FFF: 'Bílá' + }, + more: 'Více barev...', + panelTitle: 'Barvy', + textColorTitle: 'Barva textu' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/cy.js b/scripts/ckeditor/plugins/colorbutton/lang/cy.js new file mode 100755 index 00000000..d0e3dc2d --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/cy.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'cy', { + auto: 'Awtomatig', + bgColorTitle: 'Lliw Cefndir', + colors: { + '000': 'Du', + '800000': 'Marwn', + '8B4513': 'Brown Cyfrwy', + '2F4F4F': 'Llechen Tywyll', + '008080': 'Corhwyad', + '000080': 'Nefi', + '4B0082': 'Indigo', + '696969': 'Llwyd Tywyll', + B22222: 'Bric Tân', + A52A2A: 'Brown', + DAA520: 'Rhoden Aur', + '006400': 'Gwyrdd Tywyll', + '40E0D0': 'Gwyrddlas', + '0000CD': 'Glas Canolig', + '800080': 'Porffor', + '808080': 'Llwyd', + F00: 'Coch', + FF8C00: 'Oren Tywyll', + FFD700: 'Aur', + '008000': 'Gwyrdd', + '0FF': 'Cyan', + '00F': 'Glas', + EE82EE: 'Fioled', + A9A9A9: 'Llwyd Pwl', + FFA07A: 'Samwn Golau', + FFA500: 'Oren', + FFFF00: 'Melyn', + '00FF00': 'Leim', + AFEEEE: 'Gwyrddlas Golau', + ADD8E6: 'Glas Golau', + DDA0DD: 'Eirinen', + D3D3D3: 'Llwyd Golau', + FFF0F5: 'Gwrid Lafant', + FAEBD7: 'Gwyn Hynafol', + FFFFE0: 'Melyn Golau', + F0FFF0: 'Melwn Gwyrdd Golau', + F0FFFF: 'Aswr', + F0F8FF: 'Glas Alys', + E6E6FA: 'Lafant', + FFF: 'Gwyn' + }, + more: 'Mwy o Liwiau...', + panelTitle: 'Lliwiau', + textColorTitle: 'Lliw Testun' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/da.js b/scripts/ckeditor/plugins/colorbutton/lang/da.js new file mode 100755 index 00000000..7dafba67 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/da.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'da', { + auto: 'Automatisk', + bgColorTitle: 'Baggrundsfarve', + colors: { + '000': 'Sort', + '800000': 'Mørkerød', + '8B4513': 'Mørk orange', + '2F4F4F': 'Dark Slate Grå', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Mørkegrå', + B22222: 'Scarlet / Rød', + A52A2A: 'Brun', + DAA520: 'Guld', + '006400': 'Mørkegrøn', + '40E0D0': 'Tyrkis', + '0000CD': 'Mellemblå', + '800080': 'Lilla', + '808080': 'Grå', + F00: 'Rød', + FF8C00: 'Mørk orange', + FFD700: 'Guld', + '008000': 'Grøn', + '0FF': 'Cyan', + '00F': 'Blå', + EE82EE: 'Violet', + A9A9A9: 'Matgrå', + FFA07A: 'Laksefarve', + FFA500: 'Orange', + FFFF00: 'Gul', + '00FF00': 'Lime', + AFEEEE: 'Mat tyrkis', + ADD8E6: 'Lyseblå', + DDA0DD: 'Plum', + D3D3D3: 'Lysegrå', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antikhvid', + FFFFE0: 'Lysegul', + F0FFF0: 'Gul / Beige', + F0FFFF: 'Himmeblå', + F0F8FF: 'Alice blue', + E6E6FA: 'Lavendel', + FFF: 'Hvid' + }, + more: 'Flere farver...', + panelTitle: 'Farver', + textColorTitle: 'Tekstfarve' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/de.js b/scripts/ckeditor/plugins/colorbutton/lang/de.js new file mode 100755 index 00000000..1adeed59 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/de.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'de', { + auto: 'Automatisch', + bgColorTitle: 'Hintergrundfarbe', + colors: { + '000': 'Schwarz', + '800000': 'Kastanienbraun', + '8B4513': 'Braun', + '2F4F4F': 'Dunkles Schiefergrau', + '008080': 'Blaugrün', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dunkelgrau', + B22222: 'Ziegelrot', + A52A2A: 'Braun', + DAA520: 'Goldgelb', + '006400': 'Dunkelgrün', + '40E0D0': 'Türkis', + '0000CD': 'Medium Blau', + '800080': 'Lila', + '808080': 'Grau', + F00: 'Rot', + FF8C00: 'Dunkelorange', + FFD700: 'Gold', + '008000': 'Grün', + '0FF': 'Cyan', + '00F': 'Blau', + EE82EE: 'Hellviolett', + A9A9A9: 'Dunkelgrau', + FFA07A: 'Helles Lachsrosa', + FFA500: 'Orange', + FFFF00: 'Gelb', + '00FF00': 'Lime', + AFEEEE: 'Blaß-Türkis', + ADD8E6: 'Hellblau', + DDA0DD: 'Pflaumenblau', + D3D3D3: 'Hellgrau', + FFF0F5: 'Lavendel', + FAEBD7: 'Antik Weiß', + FFFFE0: 'Hellgelb', + F0FFF0: 'Honigtau', + F0FFFF: 'Azurblau', + F0F8FF: 'Alice Blau', + E6E6FA: 'Lavendel', + FFF: 'Weiß' + }, + more: 'Weitere Farben...', + panelTitle: 'Farben', + textColorTitle: 'Textfarbe' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/el.js b/scripts/ckeditor/plugins/colorbutton/lang/el.js new file mode 100755 index 00000000..284b300b --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/el.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'el', { + auto: 'Αυτόματα', + bgColorTitle: 'Χρώμα Φόντου', + colors: { + '000': 'Μαύρο', + '800000': 'Καστανέρυθρο', + '8B4513': 'Saddle Brown', // MISSING + '2F4F4F': 'Dark Slate Gray', // MISSING + '008080': 'Βαθυκύανο', + '000080': 'Μπλε μαρέν', + '4B0082': 'Ινδικό', + '696969': 'Σκούρο Γκρι', + B22222: 'Ανοικτό Κόκκινο', + A52A2A: 'Καφέ', + DAA520: 'Golden Rod', // MISSING + '006400': 'Σκούρο Πράσινο', + '40E0D0': 'Τυρκουάζ', + '0000CD': 'Medium Blue', // MISSING + '800080': 'Μοβ', + '808080': 'Γκρι', + F00: 'Κόκκινο', + FF8C00: 'Σκούρο Πορτοκαλί', + FFD700: 'Χρυσαφί', + '008000': 'Πράσινο', + '0FF': 'Κυανό', + '00F': 'Μπλε', + EE82EE: 'Μενεξεδί', + A9A9A9: 'Ποντικί', + FFA07A: 'Ανοικτό Σομόν', + FFA500: 'Πορτοκαλί', + FFFF00: 'Κίτρινο', + '00FF00': 'Μοσχολέμονο', + AFEEEE: 'Pale Turquoise', // MISSING + ADD8E6: 'Γαλάζιο', + DDA0DD: 'Plum', // MISSING + D3D3D3: 'Ανοικτό Γκρι', + FFF0F5: 'Lavender Blush', // MISSING + FAEBD7: 'Antique White', // MISSING + FFFFE0: 'Ανοικτό Κίτρινο', + F0FFF0: 'Honeydew', // MISSING + F0FFFF: 'Γαλανό', + F0F8FF: 'Alice Blue', // MISSING + E6E6FA: 'Ελαφρός Ιώδες', + FFF: 'Λευκό' + }, + more: 'Περισσότερα Χρώματα...', + panelTitle: 'Χρώματα', + textColorTitle: 'Χρώμα Κειμένου' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/en-au.js b/scripts/ckeditor/plugins/colorbutton/lang/en-au.js new file mode 100755 index 00000000..69f4e88b --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/en-au.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'en-au', { + auto: 'Automatic', + bgColorTitle: 'Background Colour', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'More Colours...', + panelTitle: 'Colors', + textColorTitle: 'Text Colour' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/en-ca.js b/scripts/ckeditor/plugins/colorbutton/lang/en-ca.js new file mode 100755 index 00000000..9b5d8089 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/en-ca.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'en-ca', { + auto: 'Automatic', + bgColorTitle: 'Background Colour', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'More Colours...', + panelTitle: 'Colors', + textColorTitle: 'Text Colour' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/en-gb.js b/scripts/ckeditor/plugins/colorbutton/lang/en-gb.js new file mode 100755 index 00000000..174922dd --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/en-gb.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'en-gb', { + auto: 'Automatic', + bgColorTitle: 'Background Colour', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Grey', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Grey', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Grey', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Grey', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'More Colours...', + panelTitle: 'Colours', + textColorTitle: 'Text Colour' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/en.js b/scripts/ckeditor/plugins/colorbutton/lang/en.js new file mode 100755 index 00000000..3118ec86 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/en.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'en', { + auto: 'Automatic', + bgColorTitle: 'Background Color', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'More Colors...', + panelTitle: 'Colors', + textColorTitle: 'Text Color' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/eo.js b/scripts/ckeditor/plugins/colorbutton/lang/eo.js new file mode 100755 index 00000000..2041ae79 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/eo.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'eo', { + auto: 'Aŭtomata', + bgColorTitle: 'Fona Koloro', + colors: { + '000': 'Nigra', + '800000': 'Kaŝtankolora', + '8B4513': 'Mezbruna', + '2F4F4F': 'Ardezgriza', + '008080': 'Marĉanaskolora', + '000080': 'Maristblua', + '4B0082': 'Indigokolora', + '696969': 'Malhelgriza', + B22222: 'Brikruĝa', + A52A2A: 'Bruna', + DAA520: 'Senbrilorkolora', + '006400': 'Malhelverda', + '40E0D0': 'Turkisblua', + '0000CD': 'Reĝblua', + '800080': 'Purpura', + '808080': 'Griza', + F00: 'Ruĝa', + FF8C00: 'Malheloranĝkolora', + FFD700: 'Orkolora', + '008000': 'Verda', + '0FF': 'Verdblua', + '00F': 'Blua', + EE82EE: 'Viola', + A9A9A9: 'Mezgriza', + FFA07A: 'Salmokolora', + FFA500: 'Oranĝkolora', + FFFF00: 'Flava', + '00FF00': 'Limetkolora', + AFEEEE: 'Helturkiskolora', + ADD8E6: 'Helblua', + DDA0DD: 'Prunkolora', + D3D3D3: 'Helgriza', + FFF0F5: 'Lavendkolora vangoŝminko', + FAEBD7: 'Antikvablanka', + FFFFE0: 'Helflava', + F0FFF0: 'Vintromelonkolora', + F0FFFF: 'Lazura', + F0F8FF: 'Aliceblua', + E6E6FA: 'Lavendkolora', + FFF: 'Blanka' + }, + more: 'Pli da Koloroj...', + panelTitle: 'Koloroj', + textColorTitle: 'Teksta Koloro' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/es.js b/scripts/ckeditor/plugins/colorbutton/lang/es.js new file mode 100755 index 00000000..2437713f --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/es.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'es', { + auto: 'Automático', + bgColorTitle: 'Color de Fondo', + colors: { + '000': 'Negro', + '800000': 'Marrón oscuro', + '8B4513': 'Marrón tierra', + '2F4F4F': 'Pizarra Oscuro', + '008080': 'Azul verdoso', + '000080': 'Azul marino', + '4B0082': 'Añil', + '696969': 'Gris oscuro', + B22222: 'Ladrillo', + A52A2A: 'Marrón', + DAA520: 'Oro oscuro', + '006400': 'Verde oscuro', + '40E0D0': 'Turquesa', + '0000CD': 'Azul medio-oscuro', + '800080': 'Púrpura', + '808080': 'Gris', + F00: 'Rojo', + FF8C00: 'Naranja oscuro', + FFD700: 'Oro', + '008000': 'Verde', + '0FF': 'Cian', + '00F': 'Azul', + EE82EE: 'Violeta', + A9A9A9: 'Gris medio', + FFA07A: 'Salmón claro', + FFA500: 'Naranja', + FFFF00: 'Amarillo', + '00FF00': 'Lima', + AFEEEE: 'Turquesa claro', + ADD8E6: 'Azul claro', + DDA0DD: 'Violeta claro', + D3D3D3: 'Gris claro', + FFF0F5: 'Lavanda rojizo', + FAEBD7: 'Blanco antiguo', + FFFFE0: 'Amarillo claro', + F0FFF0: 'Miel', + F0FFFF: 'Azul celeste', + F0F8FF: 'Azul pálido', + E6E6FA: 'Lavanda', + FFF: 'Blanco' + }, + more: 'Más Colores...', + panelTitle: 'Colores', + textColorTitle: 'Color de Texto' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/et.js b/scripts/ckeditor/plugins/colorbutton/lang/et.js new file mode 100755 index 00000000..a7492f4c --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/et.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'et', { + auto: 'Automaatne', + bgColorTitle: 'Tausta värv', + colors: { + '000': 'Must', + '800000': 'Kastanpruun', + '8B4513': 'Sadulapruun', + '2F4F4F': 'Tume paehall', + '008080': 'Sinakasroheline', + '000080': 'Meresinine', + '4B0082': 'Indigosinine', + '696969': 'Tumehall', + B22222: 'Šamottkivi', + A52A2A: 'Pruun', + DAA520: 'Kuldkollane', + '006400': 'Tumeroheline', + '40E0D0': 'Türkiissinine', + '0000CD': 'Keskmine sinine', + '800080': 'Lilla', + '808080': 'Hall', + F00: 'Punanae', + FF8C00: 'Tumeoranž', + FFD700: 'Kuldne', + '008000': 'Roheline', + '0FF': 'Tsüaniidsinine', + '00F': 'Sinine', + EE82EE: 'Violetne', + A9A9A9: 'Tuhm hall', + FFA07A: 'Hele lõhe', + FFA500: 'Oranž', + FFFF00: 'Kollane', + '00FF00': 'Lubja hall', + AFEEEE: 'Kahvatu türkiis', + ADD8E6: 'Helesinine', + DDA0DD: 'Ploomililla', + D3D3D3: 'Helehall', + FFF0F5: 'Lavendlipunane', + FAEBD7: 'Antiikvalge', + FFFFE0: 'Helekollane', + F0FFF0: 'Meloniroheline', + F0FFFF: 'Taevasinine', + F0F8FF: 'Beebisinine', + E6E6FA: 'Lavendel', + FFF: 'Valge' + }, + more: 'Rohkem värve...', + panelTitle: 'Värvid', + textColorTitle: 'Teksti värv' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/eu.js b/scripts/ckeditor/plugins/colorbutton/lang/eu.js new file mode 100755 index 00000000..afeec68f --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/eu.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'eu', { + auto: 'Automatikoa', + bgColorTitle: 'Atzeko kolorea', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Kolore gehiago...', + panelTitle: 'Colors', + textColorTitle: 'Testu Kolorea' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/fa.js b/scripts/ckeditor/plugins/colorbutton/lang/fa.js new file mode 100755 index 00000000..ed7c7687 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/fa.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'fa', { + auto: 'خودکار', + bgColorTitle: 'رنگ پس​زمینه', + colors: { + '000': 'سیاه', + '800000': 'خرمایی', + '8B4513': 'قهوه​ای شکلاتی', + '2F4F4F': 'ارغوانی مایل به خاکستری', + '008080': 'آبی مایل به خاکستری', + '000080': 'آبی سیر', + '4B0082': 'نیلی', + '696969': 'خاکستری تیره', + B22222: 'آتش آجری', + A52A2A: 'قهوه​ای', + DAA520: 'میله​ی طلایی', + '006400': 'سبز تیره', + '40E0D0': 'فیروزه​ای', + '0000CD': 'آبی روشن', + '800080': 'ارغوانی', + '808080': 'خاکستری', + F00: 'قرمز', + FF8C00: 'نارنجی پررنگ', + FFD700: 'طلایی', + '008000': 'سبز', + '0FF': 'آبی مایل به سبز', + '00F': 'آبی', + EE82EE: 'بنفش', + A9A9A9: 'خاکستری مات', + FFA07A: 'صورتی کدر روشن', + FFA500: 'نارنجی', + FFFF00: 'زرد', + '00FF00': 'فسفری', + AFEEEE: 'فیروزه​ای رنگ پریده', + ADD8E6: 'آبی کمرنگ', + DDA0DD: 'آلویی', + D3D3D3: 'خاکستری روشن', + FFF0F5: 'بنفش کمرنگ', + FAEBD7: 'عتیقه سفید', + FFFFE0: 'زرد روشن', + F0FFF0: 'عسلی', + F0FFFF: 'لاجوردی', + F0F8FF: 'آبی براق', + E6E6FA: 'بنفش کمرنگ', + FFF: 'سفید' + }, + more: 'رنگ​های بیشتر...', + panelTitle: 'رنگها', + textColorTitle: 'رنگ متن' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/fi.js b/scripts/ckeditor/plugins/colorbutton/lang/fi.js new file mode 100755 index 00000000..6fcf72ba --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/fi.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'fi', { + auto: 'Automaattinen', + bgColorTitle: 'Taustaväri', + colors: { + '000': 'Musta', + '800000': 'Kastanjanruskea', + '8B4513': 'Satulanruskea', + '2F4F4F': 'Tumma liuskekivenharmaa', + '008080': 'Sinivihreä', + '000080': 'Laivastonsininen', + '4B0082': 'Indigonsininen', + '696969': 'Tummanharmaa', + B22222: 'Tiili', + A52A2A: 'Ruskea', + DAA520: 'Kultapiisku', + '006400': 'Tummanvihreä', + '40E0D0': 'Turkoosi', + '0000CD': 'Keskisininen', + '800080': 'Purppura', + '808080': 'Harmaa', + F00: 'Punainen', + FF8C00: 'Tumma oranssi', + FFD700: 'Kulta', + '008000': 'Vihreä', + '0FF': 'Syaani', + '00F': 'Sininen', + EE82EE: 'Violetti', + A9A9A9: 'Tummanharmaa', + FFA07A: 'Vaaleanlohenpunainen', + FFA500: 'Oranssi', + FFFF00: 'Keltainen', + '00FF00': 'Limetin vihreä', + AFEEEE: 'Haalea turkoosi', + ADD8E6: 'Vaaleansininen', + DDA0DD: 'Luumu', + D3D3D3: 'Vaaleanharmaa', + FFF0F5: 'Laventelinpunainen', + FAEBD7: 'Antiikinvalkoinen', + FFFFE0: 'Vaaleankeltainen', + F0FFF0: 'Hunajameloni', + F0FFFF: 'Asurinsininen', + F0F8FF: 'Alice Blue -sininen', + E6E6FA: 'Lavanteli', + FFF: 'Valkoinen' + }, + more: 'Lisää värejä...', + panelTitle: 'Värit', + textColorTitle: 'Tekstiväri' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/fo.js b/scripts/ckeditor/plugins/colorbutton/lang/fo.js new file mode 100755 index 00000000..2a344681 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/fo.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'fo', { + auto: 'Automatiskt', + bgColorTitle: 'Bakgrundslitur', + colors: { + '000': 'Svart', + '800000': 'Maroon', + '8B4513': 'Saðilsbrúnt', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Myrkagrátt', + B22222: 'Fire Brick', + A52A2A: 'Brúnt', + DAA520: 'Gullstavur', + '006400': 'Myrkagrønt', + '40E0D0': 'Turquoise', + '0000CD': 'Meðal blátt', + '800080': 'Purple', + '808080': 'Grátt', + F00: 'Reytt', + FF8C00: 'Myrkt appelsingult', + FFD700: 'Gull', + '008000': 'Grønt', + '0FF': 'Cyan', + '00F': 'Blátt', + EE82EE: 'Violet', + A9A9A9: 'Døkt grátt', + FFA07A: 'Ljósur laksur', + FFA500: 'Appelsingult', + FFFF00: 'Gult', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Ljósablátt', + DDA0DD: 'Plum', + D3D3D3: 'Ljósagrátt', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Klassiskt hvítt', + FFFFE0: 'Ljósagult', + F0FFF0: 'Hunangsdøggur', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blátt', + E6E6FA: 'Lavender', + FFF: 'Hvítt' + }, + more: 'Fleiri litir...', + panelTitle: 'Litir', + textColorTitle: 'Tekstlitur' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/fr-ca.js b/scripts/ckeditor/plugins/colorbutton/lang/fr-ca.js new file mode 100755 index 00000000..87ffd44a --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/fr-ca.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'fr-ca', { + auto: 'Automatique', + bgColorTitle: 'Couleur de fond', + colors: { + '000': 'Noir', + '800000': 'Marron', + '8B4513': 'Brun foncé', + '2F4F4F': 'Gris ardoise foncé', + '008080': 'Sarcelle', + '000080': 'Marine', + '4B0082': 'Indigo', + '696969': 'Gris foncé', + B22222: 'Rouge brique', + A52A2A: 'Brun', + DAA520: 'Doré', + '006400': 'Vert foncé', + '40E0D0': 'Turquoise', + '0000CD': 'Bleu', + '800080': 'Mauve', + '808080': 'Gris', + F00: 'Rouge', + FF8C00: 'Orange foncé', + FFD700: 'Or', + '008000': 'Vert', + '0FF': 'Cyan', + '00F': 'Bleu', + EE82EE: 'Violet', + A9A9A9: 'Gris pâle', + FFA07A: 'Saumon clair', + FFA500: 'Orange', + FFFF00: 'Jaune', + '00FF00': 'Vert lime', + AFEEEE: 'Turquoise pâle', + ADD8E6: 'Bleu pâle', + DDA0DD: 'Prune', + D3D3D3: 'Gris pâle', + FFF0F5: 'Bleu lavande', + FAEBD7: 'Blanc antique', + FFFFE0: 'Jaune pâle', + F0FFF0: 'Miel doré', + F0FFFF: 'Azure', + F0F8FF: 'Bleu alice', + E6E6FA: 'Lavande', + FFF: 'Blanc' + }, + more: 'Plus de couleurs...', + panelTitle: 'Couleurs', + textColorTitle: 'Couleur de texte' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/fr.js b/scripts/ckeditor/plugins/colorbutton/lang/fr.js new file mode 100755 index 00000000..0da76ab1 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/fr.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'fr', { + auto: 'Automatique', + bgColorTitle: 'Couleur d\'arrière plan', + colors: { + '000': 'Noir', + '800000': 'Marron', + '8B4513': 'Brun moyen', + '2F4F4F': 'Vert sombre', + '008080': 'Canard', + '000080': 'Bleu marine', + '4B0082': 'Indigo', + '696969': 'Gris foncé', + B22222: 'Rouge brique', + A52A2A: 'Brun', + DAA520: 'Or terni', + '006400': 'Vert foncé', + '40E0D0': 'Turquoise', + '0000CD': 'Bleu royal', + '800080': 'Pourpre', + '808080': 'Gris', + F00: 'Rouge', + FF8C00: 'Orange foncé', + FFD700: 'Or', + '008000': 'Vert', + '0FF': 'Cyan', + '00F': 'Bleu', + EE82EE: 'Violet', + A9A9A9: 'Gris moyen', + FFA07A: 'Saumon', + FFA500: 'Orange', + FFFF00: 'Jaune', + '00FF00': 'Lime', + AFEEEE: 'Turquoise clair', + ADD8E6: 'Bleu clair', + DDA0DD: 'Prune', + D3D3D3: 'Gris clair', + FFF0F5: 'Fard Lavande', + FAEBD7: 'Blanc antique', + FFFFE0: 'Jaune clair', + F0FFF0: 'Honeydew', + F0FFFF: 'Azur', + F0F8FF: 'Bleu Alice', + E6E6FA: 'Lavande', + FFF: 'Blanc' + }, + more: 'Plus de couleurs...', + panelTitle: 'Couleurs', + textColorTitle: 'Couleur de texte' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/gl.js b/scripts/ckeditor/plugins/colorbutton/lang/gl.js new file mode 100755 index 00000000..a0138860 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/gl.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'gl', { + auto: 'Automático', + bgColorTitle: 'Cor do fondo', + colors: { + '000': 'Negro', + '800000': 'Marrón escuro', + '8B4513': 'Ocre', + '2F4F4F': 'Pizarra escuro', + '008080': 'Verde azulado', + '000080': 'Azul mariño', + '4B0082': 'Índigo', + '696969': 'Gris escuro', + B22222: 'Ladrillo', + A52A2A: 'Marrón', + DAA520: 'Dourado escuro', + '006400': 'Verde escuro', + '40E0D0': 'Turquesa', + '0000CD': 'Azul medio', + '800080': 'Púrpura', + '808080': 'Gris', + F00: 'Vermello', + FF8C00: 'Laranxa escuro', + FFD700: 'Dourado', + '008000': 'Verde', + '0FF': 'Cian', + '00F': 'Azul', + EE82EE: 'Violeta', + A9A9A9: 'Gris medio', + FFA07A: 'Salmón claro', + FFA500: 'Laranxa', + FFFF00: 'Amarelo', + '00FF00': 'Lima', + AFEEEE: 'Turquesa pálido', + ADD8E6: 'Azul claro', + DDA0DD: 'Violeta pálido', + D3D3D3: 'Verde claro', + FFF0F5: 'Lavanda vermello', + FAEBD7: 'Branco antigo', + FFFFE0: 'Amarelo claro', + F0FFF0: 'Mel', + F0FFFF: 'Azul celeste', + F0F8FF: 'Azul pálido', + E6E6FA: 'Lavanda', + FFF: 'Branco' + }, + more: 'Máis cores...', + panelTitle: 'Cores', + textColorTitle: 'Cor do texto' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/gu.js b/scripts/ckeditor/plugins/colorbutton/lang/gu.js new file mode 100755 index 00000000..f5b8b3a0 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/gu.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'gu', { + auto: 'સ્વચાલિત', + bgColorTitle: 'બૅકગ્રાઉન્ડ રંગ,', + colors: { + '000': 'કાળો', + '800000': 'મરુન', + '8B4513': 'છીક', + '2F4F4F': 'ડાર્ક સ્લેટ ગ્રે ', + '008080': 'ટીલ', + '000080': 'નેવી', + '4B0082': 'જામલી', + '696969': 'ડાર્ક ગ્રે', + B22222: 'ઈટ', + A52A2A: 'બ્રાઉન', + DAA520: 'ગોલ્ડન રોડ', + '006400': 'ડાર્ક લીલો', + '40E0D0': 'ટ્રકોઈસ', + '0000CD': 'મધ્યમ વાદળી', + '800080': 'પર્પલ', + '808080': 'ગ્રે', + F00: 'લાલ', + FF8C00: 'ડાર્ક ઓરંજ', + FFD700: 'ગોલ્ડ', + '008000': 'ગ્રીન', + '0FF': 'સાયન', + '00F': 'વાદળી', + EE82EE: 'વાયોલેટ', + A9A9A9: 'ડીમ ', + FFA07A: 'લાઈટ સાલમન', + FFA500: 'ઓરંજ', + FFFF00: 'પીળો', + '00FF00': 'લાઈમ', + AFEEEE: 'પેલ કોઈસ', + ADD8E6: 'લાઈટ બ્લુ', + DDA0DD: 'પલ્મ', + D3D3D3: 'લાઈટ ગ્રે', + FFF0F5: 'લવંડર ', + FAEBD7: 'એન્ટીક સફેદ', + FFFFE0: 'લાઈટ પીળો', + F0FFF0: 'હનીડઉય', + F0FFFF: 'અઝુરે', + F0F8FF: 'એલીસ બ્લુ', + E6E6FA: 'લવંડર', + FFF: 'સફેદ' + }, + more: 'ઔર રંગ...', + panelTitle: 'રંગ', + textColorTitle: 'શબ્દનો રંગ' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/he.js b/scripts/ckeditor/plugins/colorbutton/lang/he.js new file mode 100755 index 00000000..d2d39c7c --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/he.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'he', { + auto: 'אוטומטי', + bgColorTitle: 'צבע רקע', + colors: { + '000': 'שחור', + '800000': 'סגול כהה', + '8B4513': 'חום בהיר', + '2F4F4F': 'אפור צפחה', + '008080': 'כחול-ירוק', + '000080': 'כחול-סגול', + '4B0082': 'אינדיגו', + '696969': 'אפור מעומעם', + B22222: 'אדום-חום', + A52A2A: 'חום', + DAA520: 'כתום זהב', + '006400': 'ירוק כהה', + '40E0D0': 'טורקיז', + '0000CD': 'כחול בינוני', + '800080': 'סגול', + '808080': 'אפור', + F00: 'אדום', + FF8C00: 'כתום כהה', + FFD700: 'זהב', + '008000': 'ירוק', + '0FF': 'ציאן', + '00F': 'כחול', + EE82EE: 'סגלגל', + A9A9A9: 'אפור כהה', + FFA07A: 'כתום-וורוד', + FFA500: 'כתום', + FFFF00: 'צהוב', + '00FF00': 'ליים', + AFEEEE: 'טורקיז בהיר', + ADD8E6: 'כחול בהיר', + DDA0DD: 'שזיף', + D3D3D3: 'אפור בהיר', + FFF0F5: 'לבנדר מסמיק', + FAEBD7: 'לבן עתיק', + FFFFE0: 'צהוב בהיר', + F0FFF0: 'טל דבש', + F0FFFF: 'תכלת', + F0F8FF: 'כחול טיפת מים', + E6E6FA: 'לבנדר', + FFF: 'לבן' + }, + more: 'צבעים נוספים...', + panelTitle: 'צבעים', + textColorTitle: 'צבע טקסט' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/hi.js b/scripts/ckeditor/plugins/colorbutton/lang/hi.js new file mode 100755 index 00000000..b470e23f --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/hi.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'hi', { + auto: 'स्वचालित', + bgColorTitle: 'बैक्ग्राउन्ड रंग', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'और रंग...', + panelTitle: 'Colors', + textColorTitle: 'टेक्स्ट रंग' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/hr.js b/scripts/ckeditor/plugins/colorbutton/lang/hr.js new file mode 100755 index 00000000..41e430ef --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/hr.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'hr', { + auto: 'Automatski', + bgColorTitle: 'Boja pozadine', + colors: { + '000': 'Crna', + '800000': 'Kesten', + '8B4513': 'Smeđa', + '2F4F4F': 'Tamno siva', + '008080': 'Teal', + '000080': 'Mornarska', + '4B0082': 'Indigo', + '696969': 'Tamno siva', + B22222: 'Vatrena cigla', + A52A2A: 'Smeđa', + DAA520: 'Zlatna', + '006400': 'Tamno zelena', + '40E0D0': 'Tirkizna', + '0000CD': 'Srednje plava', + '800080': 'Ljubičasta', + '808080': 'Siva', + F00: 'Crvena', + FF8C00: 'Tamno naranđasta', + FFD700: 'Zlatna', + '008000': 'Zelena', + '0FF': 'Cijan', + '00F': 'Plava', + EE82EE: 'Ljubičasta', + A9A9A9: 'Mutno siva', + FFA07A: 'Svijetli losos', + FFA500: 'Naranđasto', + FFFF00: 'Žuto', + '00FF00': 'Limun', + AFEEEE: 'Blijedo tirkizna', + ADD8E6: 'Svijetlo plava', + DDA0DD: 'Šljiva', + D3D3D3: 'Svijetlo siva', + FFF0F5: 'Lavanda rumeno', + FAEBD7: 'Antikno bijela', + FFFFE0: 'Svijetlo žuta', + F0FFF0: 'Med', + F0FFFF: 'Azurna', + F0F8FF: 'Alice plava', + E6E6FA: 'Lavanda', + FFF: 'Bijela' + }, + more: 'Više boja...', + panelTitle: 'Boje', + textColorTitle: 'Boja teksta' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/hu.js b/scripts/ckeditor/plugins/colorbutton/lang/hu.js new file mode 100755 index 00000000..c02f196b --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/hu.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'hu', { + auto: 'Automatikus', + bgColorTitle: 'Háttérszín', + colors: { + '000': 'Fekete', + '800000': 'Bordó', + '8B4513': 'Barna', + '2F4F4F': 'Sötét türkiz', + '008080': 'Türkiz', + '000080': 'Király kék', + '4B0082': 'Indigó kék', + '696969': 'Szürke', + B22222: 'Tégla vörös', + A52A2A: 'Vörös', + DAA520: 'Arany sárga', + '006400': 'Sötét zöld', + '40E0D0': 'Türkiz', + '0000CD': 'Kék', + '800080': 'Lila', + '808080': 'Szürke', + F00: 'Piros', + FF8C00: 'Sötét narancs', + FFD700: 'Arany', + '008000': 'Zöld', + '0FF': 'Türkiz', + '00F': 'Kék', + EE82EE: 'Rózsaszín', + A9A9A9: 'Sötét szürke', + FFA07A: 'Lazac', + FFA500: 'Narancs', + FFFF00: 'Citromsárga', + '00FF00': 'Neon zöld', + AFEEEE: 'Világos türkiz', + ADD8E6: 'Világos kék', + DDA0DD: 'Világos lila', + D3D3D3: 'Világos szürke', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Törtfehér', + FFFFE0: 'Világos sárga', + F0FFF0: 'Menta', + F0FFFF: 'Azúr kék', + F0F8FF: 'Halvány kék', + E6E6FA: 'Lavender', + FFF: 'Fehér' + }, + more: 'További színek...', + panelTitle: 'Színek', + textColorTitle: 'Betűszín' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/id.js b/scripts/ckeditor/plugins/colorbutton/lang/id.js new file mode 100755 index 00000000..f017a40a --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/id.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'id', { + auto: 'Automatic', // MISSING + bgColorTitle: 'Warna Latar Belakang', + colors: { + '000': 'Black', // MISSING + '800000': 'Maroon', // MISSING + '8B4513': 'Saddle Brown', // MISSING + '2F4F4F': 'Dark Slate Gray', // MISSING + '008080': 'Teal', // MISSING + '000080': 'Navy', // MISSING + '4B0082': 'Indigo', // MISSING + '696969': 'Dark Gray', // MISSING + B22222: 'Fire Brick', // MISSING + A52A2A: 'Brown', // MISSING + DAA520: 'Golden Rod', // MISSING + '006400': 'Dark Green', // MISSING + '40E0D0': 'Turquoise', // MISSING + '0000CD': 'Medium Blue', // MISSING + '800080': 'Purple', // MISSING + '808080': 'Gray', // MISSING + F00: 'Red', // MISSING + FF8C00: 'Dark Orange', // MISSING + FFD700: 'Gold', // MISSING + '008000': 'Green', // MISSING + '0FF': 'Cyan', // MISSING + '00F': 'Blue', // MISSING + EE82EE: 'Violet', // MISSING + A9A9A9: 'Dim Gray', // MISSING + FFA07A: 'Light Salmon', // MISSING + FFA500: 'Orange', // MISSING + FFFF00: 'Yellow', // MISSING + '00FF00': 'Lime', // MISSING + AFEEEE: 'Pale Turquoise', // MISSING + ADD8E6: 'Light Blue', // MISSING + DDA0DD: 'Plum', // MISSING + D3D3D3: 'Light Grey', // MISSING + FFF0F5: 'Lavender Blush', // MISSING + FAEBD7: 'Antique White', // MISSING + FFFFE0: 'Light Yellow', // MISSING + F0FFF0: 'Honeydew', // MISSING + F0FFFF: 'Azure', // MISSING + F0F8FF: 'Alice Blue', // MISSING + E6E6FA: 'Lavender', // MISSING + FFF: 'White' // MISSING + }, + more: 'More Colors...', // MISSING + panelTitle: 'Warna', + textColorTitle: 'Text Color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/is.js b/scripts/ckeditor/plugins/colorbutton/lang/is.js new file mode 100755 index 00000000..9c5ad7f3 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/is.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'is', { + auto: 'Sjálfval', + bgColorTitle: 'Bakgrunnslitur', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Fleiri liti...', + panelTitle: 'Colors', + textColorTitle: 'Litur texta' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/it.js b/scripts/ckeditor/plugins/colorbutton/lang/it.js new file mode 100755 index 00000000..43753e78 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/it.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'it', { + auto: 'Automatico', + bgColorTitle: 'Colore sfondo', + colors: { + '000': 'Nero', + '800000': 'Marrone Castagna', + '8B4513': 'Marrone Cuoio', + '2F4F4F': 'Grigio Fumo di Londra', + '008080': 'Acquamarina', + '000080': 'Blu Oceano', + '4B0082': 'Indigo', + '696969': 'Grigio Scuro', + B22222: 'Giallo Fiamma', + A52A2A: 'Marrone', + DAA520: 'Giallo Mimosa', + '006400': 'Verde Scuro', + '40E0D0': 'Turchese', + '0000CD': 'Blue Scuro', + '800080': 'Viola', + '808080': 'Grigio', + F00: 'Rosso', + FF8C00: 'Arancio Scuro', + FFD700: 'Oro', + '008000': 'Verde', + '0FF': 'Ciano', + '00F': 'Blu', + EE82EE: 'Violetto', + A9A9A9: 'Grigio Scuro', + FFA07A: 'Salmone', + FFA500: 'Arancio', + FFFF00: 'Giallo', + '00FF00': 'Lime', + AFEEEE: 'Turchese Chiaro', + ADD8E6: 'Blu Chiaro', + DDA0DD: 'Rosso Ciliegia', + D3D3D3: 'Grigio Chiaro', + FFF0F5: 'Lavanda Chiara', + FAEBD7: 'Bianco Antico', + FFFFE0: 'Giallo Chiaro', + F0FFF0: 'Verde Mela', + F0FFFF: 'Azzurro', + F0F8FF: 'Celeste', + E6E6FA: 'Lavanda', + FFF: 'Bianco' + }, + more: 'Altri colori...', + panelTitle: 'Colori', + textColorTitle: 'Colore testo' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ja.js b/scripts/ckeditor/plugins/colorbutton/lang/ja.js new file mode 100755 index 00000000..b0a0b032 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ja.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ja', { + auto: '自動', + bgColorTitle: '背景色', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'その他の色...', + panelTitle: '色', + textColorTitle: '文字色' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ka.js b/scripts/ckeditor/plugins/colorbutton/lang/ka.js new file mode 100755 index 00000000..6761c2f9 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ka.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ka', { + auto: 'ავტომატური', + bgColorTitle: 'ფონის ფერი', + colors: { + '000': 'შავი', + '800000': 'მუქი შინდისფერი', + '8B4513': 'ყავისფერი', + '2F4F4F': 'მოლურჯო ნაცრისფერი', + '008080': 'ჩამქრალი ლურჯი', + '000080': 'მუქი ლურჯი', + '4B0082': 'იასამნისფერი', + '696969': 'მუქი ნაცრისფერი', + B22222: 'აგურისფერი', + A52A2A: 'მუქი ყავისფერი', + DAA520: 'მოყვითალო', + '006400': 'მუქი მწვანე', + '40E0D0': 'ცისფერი', + '0000CD': 'ზომიერად ლურჯი', + '800080': 'იისფერი', + '808080': 'ნაცრისფერი', + F00: 'წითელი', + FF8C00: 'მუქი სტაფილოსფერი', + FFD700: 'ოქროსფერი', + '008000': 'მწვანე', + '0FF': 'ღია ცისფერი', + '00F': 'ლურჯი', + EE82EE: 'იისფერი', + A9A9A9: 'ბაცი ნაცრისფერი', + FFA07A: 'ჩამქრალი ვარდისფერი', + FFA500: 'სტაფილოსფერი', + FFFF00: 'ყვითელი', + '00FF00': 'ლურჯი', + AFEEEE: 'ცისფერი', + ADD8E6: 'ღია ლურჯი', + DDA0DD: 'ღია იისფერი', + D3D3D3: 'ღია ნაცრისფერი', + FFF0F5: 'ღია ვარდისფერი', + FAEBD7: 'ღია ყავისფერი', + FFFFE0: 'ნათელი ყვითელი', + F0FFF0: 'ღია მწვანე', + F0FFFF: 'ღია ცისფერი 2', + F0F8FF: 'ღია ცისფერი 3', + E6E6FA: 'ღია იისფერი 2', + FFF: 'თეთრი' + }, + more: 'მეტი ფერი...', + panelTitle: 'ფერები', + textColorTitle: 'ტექსტის ფერი' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/km.js b/scripts/ckeditor/plugins/colorbutton/lang/km.js new file mode 100755 index 00000000..084a68dc --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/km.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'km', { + auto: 'ស្វ័យប្រវត្តិ', + bgColorTitle: 'ពណ៌ផ្ទៃខាងក្រោយ', + colors: { + '000': 'ខ្មៅ', + '800000': 'ត្នោត​ចាស់', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'ខៀវ​ចាស់', + '4B0082': 'ធ្លះ', + '696969': 'ប្រផេះ​ក្រាស់', + B22222: 'Fire Brick', + A52A2A: 'ត្នោត', + DAA520: 'Golden Rod', + '006400': 'បៃតង​ចាស់', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'ប្រផេះ', + F00: 'ក្រហម', + FF8C00: 'ទឹក​ក្រូច​ចាស់', + FFD700: 'មាស', + '008000': 'បៃតង', + '0FF': 'Cyan', + '00F': 'ខៀវ', + EE82EE: 'ស្វាយ', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'ទឹក​ក្រូច', + FFFF00: 'លឿង', + '00FF00': 'ក្រូច​ឆ្មារ', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'លឿង​ស្ដើង', + F0FFF0: 'Honeydew', + F0FFFF: 'ផ្ទៃមេឃ', + F0F8FF: 'Alice Blue', + E6E6FA: 'ឡាវិនដឺ', + FFF: 'ស' + }, + more: 'ពណ៌​ផ្សេង​ទៀត..', + panelTitle: 'ពណ៌', + textColorTitle: 'ពណ៌អក្សរ' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ko.js b/scripts/ckeditor/plugins/colorbutton/lang/ko.js new file mode 100755 index 00000000..4f75867f --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ko.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ko', { + auto: '기본색상', + bgColorTitle: '배경 색상', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: '색상선택...', + panelTitle: 'Colors', + textColorTitle: '글자 색상' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ku.js b/scripts/ckeditor/plugins/colorbutton/lang/ku.js new file mode 100755 index 00000000..86b42ed6 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ku.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ku', { + auto: 'خۆکار', + bgColorTitle: 'ڕەنگی پاشبنەما', + colors: { + '000': 'ڕەش', + '800000': 'سۆرو ماڕوونی', + '8B4513': 'ماڕوونی', + '2F4F4F': 'سەوزی تاریك', + '008080': 'سەوز و شین', + '000080': 'شینی تۆخ', + '4B0082': 'مۆری تۆخ', + '696969': 'ڕەساسی تۆخ', + B22222: 'سۆری تۆخ', + A52A2A: 'قاوەیی', + DAA520: 'قاوەیی بریسکەدار', + '006400': 'سەوزی تۆخ', + '40E0D0': 'شینی ناتۆخی بریسکەدار', + '0000CD': 'شینی مامناوەند', + '800080': 'پەمبەیی', + '808080': 'ڕەساسی', + F00: 'سۆر', + FF8C00: 'نارەنجی تۆخ', + FFD700: 'زەرد', + '008000': 'سەوز', + '0FF': 'شینی ئاسمانی', + '00F': 'شین', + EE82EE: 'پەمەیی', + A9A9A9: 'ڕەساسی ناتۆخ', + FFA07A: 'نارەنجی ناتۆخ', + FFA500: 'نارەنجی', + FFFF00: 'زەرد', + '00FF00': 'سەوز', + AFEEEE: 'شینی ناتۆخ', + ADD8E6: 'شینی زۆر ناتۆخ', + DDA0DD: 'پەمەیی ناتۆخ', + D3D3D3: 'ڕەساسی بریسکەدار', + FFF0F5: 'جەرگی زۆر ناتۆخ', + FAEBD7: 'جەرگی ناتۆخ', + FFFFE0: 'سپی ناتۆخ', + F0FFF0: 'هەنگوینی ناتۆخ', + F0FFFF: 'شینێکی زۆر ناتۆخ', + F0F8FF: 'شینێکی ئاسمانی زۆر ناتۆخ', + E6E6FA: 'شیری', + FFF: 'سپی' + }, + more: 'ڕەنگی زیاتر...', + panelTitle: 'ڕەنگەکان', + textColorTitle: 'ڕەنگی دەق' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/lt.js b/scripts/ckeditor/plugins/colorbutton/lang/lt.js new file mode 100755 index 00000000..72fa2ff7 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/lt.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'lt', { + auto: 'Automatinis', + bgColorTitle: 'Fono spalva', + colors: { + '000': 'Juoda', + '800000': 'Kaštoninė', + '8B4513': 'Tamsiai ruda', + '2F4F4F': 'Pilka tamsaus šiferio', + '008080': 'Teal', + '000080': 'Karinis', + '4B0082': 'Indigo', + '696969': 'Tamsiai pilka', + B22222: 'Ugnies', + A52A2A: 'Ruda', + DAA520: 'Aukso', + '006400': 'Tamsiai žalia', + '40E0D0': 'Turquoise', + '0000CD': 'Vidutinė mėlyna', + '800080': 'Violetinė', + '808080': 'Pilka', + F00: 'Raudona', + FF8C00: 'Tamsiai oranžinė', + FFD700: 'Auksinė', + '008000': 'Žalia', + '0FF': 'Žydra', + '00F': 'Mėlyna', + EE82EE: 'Violetinė', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Oranžinė', + FFFF00: 'Geltona', + '00FF00': 'Citrinų', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Šviesiai mėlyna', + DDA0DD: 'Plum', + D3D3D3: 'Šviesiai pilka', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Šviesiai geltona', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'Balta' + }, + more: 'Daugiau spalvų...', + panelTitle: 'Spalva', + textColorTitle: 'Teksto spalva' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/lv.js b/scripts/ckeditor/plugins/colorbutton/lang/lv.js new file mode 100755 index 00000000..e2e1304e --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/lv.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'lv', { + auto: 'Automātiska', + bgColorTitle: 'Fona krāsa', + colors: { + '000': 'Melns', + '800000': 'Sarkanbrūns', + '8B4513': 'Sedlu brūns', + '2F4F4F': 'Tumšas tāfeles pelēks', + '008080': 'Zili-zaļš', + '000080': 'Jūras', + '4B0082': 'Indigo', + '696969': 'Tumši pelēks', + B22222: 'Ķieģeļsarkans', + A52A2A: 'Brūns', + DAA520: 'Zelta', + '006400': 'Tumši zaļš', + '40E0D0': 'Tirkīzs', + '0000CD': 'Vidēji zils', + '800080': 'Purpurs', + '808080': 'Pelēks', + F00: 'Sarkans', + FF8C00: 'Tumši oranžs', + FFD700: 'Zelta', + '008000': 'Zaļš', + '0FF': 'Tumšzils', + '00F': 'Zils', + EE82EE: 'Violets', + A9A9A9: 'Pelēks', + FFA07A: 'Gaiši laškrāsas', + FFA500: 'Oranžs', + FFFF00: 'Dzeltens', + '00FF00': 'Laima', + AFEEEE: 'Gaiši tirkīza', + ADD8E6: 'Gaiši zils', + DDA0DD: 'Plūmju', + D3D3D3: 'Gaiši pelēks', + FFF0F5: 'Lavandas sārts', + FAEBD7: 'Antīki balts', + FFFFE0: 'Gaiši dzeltens', + F0FFF0: 'Meduspile', + F0FFFF: 'Debesszils', + F0F8FF: 'Alises zils', + E6E6FA: 'Lavanda', + FFF: 'Balts' + }, + more: 'Plašāka palete...', + panelTitle: 'Krāsa', + textColorTitle: 'Teksta krāsa' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/mk.js b/scripts/ckeditor/plugins/colorbutton/lang/mk.js new file mode 100755 index 00000000..82415c88 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/mk.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'mk', { + auto: 'Automatic', // MISSING + bgColorTitle: 'Background Color', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'More Colors...', // MISSING + panelTitle: 'Colors', + textColorTitle: 'Text Color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/mn.js b/scripts/ckeditor/plugins/colorbutton/lang/mn.js new file mode 100755 index 00000000..0d0aa81c --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/mn.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'mn', { + auto: 'Автоматаар', + bgColorTitle: 'Дэвсгэр өнгө', + colors: { + '000': 'Хар', + '800000': 'Хүрэн', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Саарал', + F00: 'Улаан', + FF8C00: 'Dark Orange', + FFD700: 'Алт', + '008000': 'Ногоон', + '0FF': 'Цэнхэр', + '00F': 'Хөх', + EE82EE: 'Ягаан', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Улбар шар', + FFFF00: 'Шар', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Цайвар саарал', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'Цагаан' + }, + more: 'Нэмэлт өнгөнүүд...', + panelTitle: 'Өнгөнүүд', + textColorTitle: 'Бичвэрийн өнгө' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ms.js b/scripts/ckeditor/plugins/colorbutton/lang/ms.js new file mode 100755 index 00000000..85cae5a5 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ms.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ms', { + auto: 'Otomatik', + bgColorTitle: 'Warna Latarbelakang', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Warna lain-lain...', + panelTitle: 'Colors', + textColorTitle: 'Warna Text' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/nb.js b/scripts/ckeditor/plugins/colorbutton/lang/nb.js new file mode 100755 index 00000000..c7ea2929 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/nb.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'nb', { + auto: 'Automatisk', + bgColorTitle: 'Bakgrunnsfarge', + colors: { + '000': 'Svart', + '800000': 'Rødbrun', + '8B4513': 'Salbrun', + '2F4F4F': 'Grønnsvart', + '008080': 'Blågrønn', + '000080': 'Marineblått', + '4B0082': 'Indigo', + '696969': 'Mørk grå', + B22222: 'Mørkerød', + A52A2A: 'Brun', + DAA520: 'Lys brun', + '006400': 'Mørk grønn', + '40E0D0': 'Turkis', + '0000CD': 'Medium blå', + '800080': 'Purpur', + '808080': 'Grå', + F00: 'Rød', + FF8C00: 'Mørk oransje', + FFD700: 'Gull', + '008000': 'Grønn', + '0FF': 'Cyan', + '00F': 'Blå', + EE82EE: 'Fiolett', + A9A9A9: 'Svak grå', + FFA07A: 'Rosa-oransje', + FFA500: 'Oransje', + FFFF00: 'Gul', + '00FF00': 'Lime', + AFEEEE: 'Svak turkis', + ADD8E6: 'Lys Blå', + DDA0DD: 'Plomme', + D3D3D3: 'Lys grå', + FFF0F5: 'Svak lavendelrosa', + FAEBD7: 'Antikk-hvit', + FFFFE0: 'Lys gul', + F0FFF0: 'Honningmelon', + F0FFFF: 'Svakt asurblått', + F0F8FF: 'Svak cyan', + E6E6FA: 'Lavendel', + FFF: 'Hvit' + }, + more: 'Flere farger...', + panelTitle: 'Farger', + textColorTitle: 'Tekstfarge' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/nl.js b/scripts/ckeditor/plugins/colorbutton/lang/nl.js new file mode 100755 index 00000000..0ef9a1cc --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/nl.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'nl', { + auto: 'Automatisch', + bgColorTitle: 'Achtergrondkleur', + colors: { + '000': 'Zwart', + '800000': 'Kastanjebruin', + '8B4513': 'Chocoladebruin', + '2F4F4F': 'Donkerleigrijs', + '008080': 'Blauwgroen', + '000080': 'Marine', + '4B0082': 'Indigo', + '696969': 'Donkergrijs', + B22222: 'Baksteen', + A52A2A: 'Bruin', + DAA520: 'Donkergeel', + '006400': 'Donkergroen', + '40E0D0': 'Turquoise', + '0000CD': 'Middenblauw', + '800080': 'Paars', + '808080': 'Grijs', + F00: 'Rood', + FF8C00: 'Donkeroranje', + FFD700: 'Goud', + '008000': 'Groen', + '0FF': 'Cyaan', + '00F': 'Blauw', + EE82EE: 'Violet', + A9A9A9: 'Donkergrijs', + FFA07A: 'Lichtzalm', + FFA500: 'Oranje', + FFFF00: 'Geel', + '00FF00': 'Felgroen', + AFEEEE: 'Lichtturquoise', + ADD8E6: 'Lichtblauw', + DDA0DD: 'Pruim', + D3D3D3: 'Lichtgrijs', + FFF0F5: 'Linnen', + FAEBD7: 'Ivoor', + FFFFE0: 'Lichtgeel', + F0FFF0: 'Honingdauw', + F0FFFF: 'Azuur', + F0F8FF: 'Licht hemelsblauw', + E6E6FA: 'Lavendel', + FFF: 'Wit' + }, + more: 'Meer kleuren...', + panelTitle: 'Kleuren', + textColorTitle: 'Tekstkleur' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/no.js b/scripts/ckeditor/plugins/colorbutton/lang/no.js new file mode 100755 index 00000000..1778df46 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/no.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'no', { + auto: 'Automatisk', + bgColorTitle: 'Bakgrunnsfarge', + colors: { + '000': 'Svart', + '800000': 'Rødbrun', + '8B4513': 'Salbrun', + '2F4F4F': 'Grønnsvart', + '008080': 'Blågrønn', + '000080': 'Marineblått', + '4B0082': 'Indigo', + '696969': 'Mørk grå', + B22222: 'Mørkerød', + A52A2A: 'Brun', + DAA520: 'Lys brun', + '006400': 'Mørk grønn', + '40E0D0': 'Turkis', + '0000CD': 'Medium blå', + '800080': 'Purpur', + '808080': 'Grå', + F00: 'Rød', + FF8C00: 'Mørk oransje', + FFD700: 'Gull', + '008000': 'Grønn', + '0FF': 'Cyan', + '00F': 'Blå', + EE82EE: 'Fiolett', + A9A9A9: 'Svak grå', + FFA07A: 'Rosa-oransje', + FFA500: 'Oransje', + FFFF00: 'Gul', + '00FF00': 'Lime', + AFEEEE: 'Svak turkis', + ADD8E6: 'Lys Blå', + DDA0DD: 'Plomme', + D3D3D3: 'Lys grå', + FFF0F5: 'Svak lavendelrosa', + FAEBD7: 'Antikk-hvit', + FFFFE0: 'Lys gul', + F0FFF0: 'Honningmelon', + F0FFFF: 'Svakt asurblått', + F0F8FF: 'Svak cyan', + E6E6FA: 'Lavendel', + FFF: 'Hvit' + }, + more: 'Flere farger...', + panelTitle: 'Farger', + textColorTitle: 'Tekstfarge' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/pl.js b/scripts/ckeditor/plugins/colorbutton/lang/pl.js new file mode 100755 index 00000000..61123a84 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/pl.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'pl', { + auto: 'Automatycznie', + bgColorTitle: 'Kolor tła', + colors: { + '000': 'Czarny', + '800000': 'Kasztanowy', + '8B4513': 'Czekoladowy', + '2F4F4F': 'Ciemnografitowy', + '008080': 'Morski', + '000080': 'Granatowy', + '4B0082': 'Indygo', + '696969': 'Ciemnoszary', + B22222: 'Czerwień żelazowa', + A52A2A: 'Brązowy', + DAA520: 'Ciemnozłoty', + '006400': 'Ciemnozielony', + '40E0D0': 'Turkusowy', + '0000CD': 'Ciemnoniebieski', + '800080': 'Purpurowy', + '808080': 'Szary', + F00: 'Czerwony', + FF8C00: 'Ciemnopomarańczowy', + FFD700: 'Złoty', + '008000': 'Zielony', + '0FF': 'Cyjan', + '00F': 'Niebieski', + EE82EE: 'Fioletowy', + A9A9A9: 'Przygaszony szary', + FFA07A: 'Łososiowy', + FFA500: 'Pomarańczowy', + FFFF00: 'Żółty', + '00FF00': 'Limonkowy', + AFEEEE: 'Bladoturkusowy', + ADD8E6: 'Jasnoniebieski', + DDA0DD: 'Śliwkowy', + D3D3D3: 'Jasnoszary', + FFF0F5: 'Jasnolawendowy', + FAEBD7: 'Kremowobiały', + FFFFE0: 'Jasnożółty', + F0FFF0: 'Bladozielony', + F0FFFF: 'Jasnolazurowy', + F0F8FF: 'Jasnobłękitny', + E6E6FA: 'Lawendowy', + FFF: 'Biały' + }, + more: 'Więcej kolorów...', + panelTitle: 'Kolory', + textColorTitle: 'Kolor tekstu' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/pt-br.js b/scripts/ckeditor/plugins/colorbutton/lang/pt-br.js new file mode 100755 index 00000000..c04c32e4 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/pt-br.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'pt-br', { + auto: 'Automático', + bgColorTitle: 'Cor do Plano de Fundo', + colors: { + '000': 'Preto', + '800000': 'Foquete', + '8B4513': 'Marrom 1', + '2F4F4F': 'Cinza 1', + '008080': 'Cerceta', + '000080': 'Azul Marinho', + '4B0082': 'Índigo', + '696969': 'Cinza 2', + B22222: 'Tijolo de Fogo', + A52A2A: 'Marrom 2', + DAA520: 'Vara Dourada', + '006400': 'Verde Escuro', + '40E0D0': 'Turquesa', + '0000CD': 'Azul Médio', + '800080': 'Roxo', + '808080': 'Cinza 3', + F00: 'Vermelho', + FF8C00: 'Laranja Escuro', + FFD700: 'Dourado', + '008000': 'Verde', + '0FF': 'Ciano', + '00F': 'Azul', + EE82EE: 'Violeta', + A9A9A9: 'Cinza Escuro', + FFA07A: 'Salmão Claro', + FFA500: 'Laranja', + FFFF00: 'Amarelo', + '00FF00': 'Lima', + AFEEEE: 'Turquesa Pálido', + ADD8E6: 'Azul Claro', + DDA0DD: 'Ameixa', + D3D3D3: 'Cinza Claro', + FFF0F5: 'Lavanda 1', + FAEBD7: 'Branco Antiguidade', + FFFFE0: 'Amarelo Claro', + F0FFF0: 'Orvalho', + F0FFFF: 'Azure', + F0F8FF: 'Azul Alice', + E6E6FA: 'Lavanda 2', + FFF: 'Branco' + }, + more: 'Mais Cores...', + panelTitle: 'Cores', + textColorTitle: 'Cor do Texto' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/pt.js b/scripts/ckeditor/plugins/colorbutton/lang/pt.js new file mode 100755 index 00000000..a1148e07 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/pt.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'pt', { + auto: 'Automático', + bgColorTitle: 'Cor de Fundo', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Mais Cores...', + panelTitle: 'Colors', + textColorTitle: 'Cor do Texto' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ro.js b/scripts/ckeditor/plugins/colorbutton/lang/ro.js new file mode 100755 index 00000000..83b2acab --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ro.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ro', { + auto: 'Automatic', + bgColorTitle: 'Coloarea fundalului', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Mai multe culori...', + panelTitle: 'Colors', + textColorTitle: 'Culoarea textului' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ru.js b/scripts/ckeditor/plugins/colorbutton/lang/ru.js new file mode 100755 index 00000000..7e023abd --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ru.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ru', { + auto: 'Автоматически', + bgColorTitle: 'Цвет фона', + colors: { + '000': 'Чёрный', + '800000': 'Бордовый', + '8B4513': 'Кожано-коричневый', + '2F4F4F': 'Темный синевато-серый', + '008080': 'Сине-зелёный', + '000080': 'Тёмно-синий', + '4B0082': 'Индиго', + '696969': 'Тёмно-серый', + B22222: 'Кирпичный', + A52A2A: 'Коричневый', + DAA520: 'Золотисто-берёзовый', + '006400': 'Темно-зелёный', + '40E0D0': 'Бирюзовый', + '0000CD': 'Умеренно синий', + '800080': 'Пурпурный', + '808080': 'Серый', + F00: 'Красный', + FF8C00: 'Темно-оранжевый', + FFD700: 'Золотистый', + '008000': 'Зелёный', + '0FF': 'Васильковый', + '00F': 'Синий', + EE82EE: 'Фиолетовый', + A9A9A9: 'Тускло-серый', + FFA07A: 'Светло-лососевый', + FFA500: 'Оранжевый', + FFFF00: 'Жёлтый', + '00FF00': 'Лайма', + AFEEEE: 'Бледно-синий', + ADD8E6: 'Свелто-голубой', + DDA0DD: 'Сливовый', + D3D3D3: 'Светло-серый', + FFF0F5: 'Розово-лавандовый', + FAEBD7: 'Античный белый', + FFFFE0: 'Светло-жёлтый', + F0FFF0: 'Медвяной росы', + F0FFFF: 'Лазурный', + F0F8FF: 'Бледно-голубой', + E6E6FA: 'Лавандовый', + FFF: 'Белый' + }, + more: 'Ещё цвета...', + panelTitle: 'Цвета', + textColorTitle: 'Цвет текста' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/si.js b/scripts/ckeditor/plugins/colorbutton/lang/si.js new file mode 100755 index 00000000..c897679c --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/si.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'si', { + auto: 'Automatic', // MISSING + bgColorTitle: 'පසුබිම් වර්ණය', + colors: { + '000': 'Black', // MISSING + '800000': 'Maroon', // MISSING + '8B4513': 'Saddle Brown', // MISSING + '2F4F4F': 'Dark Slate Gray', // MISSING + '008080': 'Teal', // MISSING + '000080': 'Navy', // MISSING + '4B0082': 'Indigo', // MISSING + '696969': 'Dark Gray', // MISSING + B22222: 'Fire Brick', // MISSING + A52A2A: 'Brown', // MISSING + DAA520: 'Golden Rod', // MISSING + '006400': 'Dark Green', // MISSING + '40E0D0': 'Turquoise', // MISSING + '0000CD': 'Medium Blue', // MISSING + '800080': 'Purple', // MISSING + '808080': 'Gray', // MISSING + F00: 'Red', // MISSING + FF8C00: 'Dark Orange', // MISSING + FFD700: 'Gold', // MISSING + '008000': 'Green', // MISSING + '0FF': 'Cyan', // MISSING + '00F': 'Blue', // MISSING + EE82EE: 'Violet', // MISSING + A9A9A9: 'Dim Gray', // MISSING + FFA07A: 'Light Salmon', // MISSING + FFA500: 'Orange', // MISSING + FFFF00: 'Yellow', // MISSING + '00FF00': 'Lime', // MISSING + AFEEEE: 'Pale Turquoise', // MISSING + ADD8E6: 'Light Blue', // MISSING + DDA0DD: 'Plum', // MISSING + D3D3D3: 'Light Grey', // MISSING + FFF0F5: 'Lavender Blush', // MISSING + FAEBD7: 'Antique White', // MISSING + FFFFE0: 'Light Yellow', // MISSING + F0FFF0: 'Honeydew', // MISSING + F0FFFF: 'Azure', // MISSING + F0F8FF: 'Alice Blue', // MISSING + E6E6FA: 'Lavender', // MISSING + FFF: 'White' // MISSING + }, + more: 'More Colors...', // MISSING + panelTitle: 'වර්ණය', + textColorTitle: 'අක්ෂර වර්ණ' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sk.js b/scripts/ckeditor/plugins/colorbutton/lang/sk.js new file mode 100755 index 00000000..aabda1f6 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sk.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sk', { + auto: 'Automaticky', + bgColorTitle: 'Farba pozadia', + colors: { + '000': 'Čierna', + '800000': 'Maroon', + '8B4513': 'Sedlová hnedá', + '2F4F4F': 'Tmavo bridlicovo sivá', + '008080': 'Modrozelená', + '000080': 'Tmavomodrá', + '4B0082': 'Indigo', + '696969': 'Tmavá sivá', + B22222: 'Ohňová tehlová', + A52A2A: 'Hnedá', + DAA520: 'Zlatobyľ', + '006400': 'Tmavá zelená', + '40E0D0': 'Tyrkysová', + '0000CD': 'Stredná modrá', + '800080': 'Purpurová', + '808080': 'Sivá', + F00: 'Červená', + FF8C00: 'Tmavá oranžová', + FFD700: 'Zlatá', + '008000': 'Zelená', + '0FF': 'Azúrová', + '00F': 'Modrá', + EE82EE: 'Fialová', + A9A9A9: 'Tmavá sivá', + FFA07A: 'Svetlo lososová', + FFA500: 'Oranžová', + FFFF00: 'Žltá', + '00FF00': 'Vápenná', + AFEEEE: 'Svetlo tyrkysová', + ADD8E6: 'Svetlo modrá', + DDA0DD: 'Slivková', + D3D3D3: 'Svetlo sivá', + FFF0F5: 'Levanduľovo červená', + FAEBD7: 'Antická biela', + FFFFE0: 'Svetlo žltá', + F0FFF0: 'Medová', + F0FFFF: 'Azúrová', + F0F8FF: 'Alicovo modrá', + E6E6FA: 'Levanduľová', + FFF: 'Biela' + }, + more: 'Viac farieb...', + panelTitle: 'Farby', + textColorTitle: 'Farba textu' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sl.js b/scripts/ckeditor/plugins/colorbutton/lang/sl.js new file mode 100755 index 00000000..6397c7a6 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sl.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sl', { + auto: 'Samodejno', + bgColorTitle: 'Barva ozadja', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Več barv...', + panelTitle: 'Colors', + textColorTitle: 'Barva besedila' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sq.js b/scripts/ckeditor/plugins/colorbutton/lang/sq.js new file mode 100755 index 00000000..dbe5f992 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sq.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sq', { + auto: 'Automatik', + bgColorTitle: 'Ngjyra e Prapavijës', + colors: { + '000': 'E zezë', + '800000': 'Ngjyrë gështenjë', + '8B4513': 'Ngjyrë Shale Kafe', + '2F4F4F': 'Ngjyrë Gri të errët ardëz', + '008080': 'Ngjyrë bajukë', + '000080': 'Ngjyrë Marine', + '4B0082': 'Indigo', + '696969': 'Gri e Errët', + B22222: 'Tullë në Flakë', + A52A2A: 'Ngjytë Kafe', + DAA520: 'Shkop i Artë', + '006400': 'E Gjelbër e Errët', + '40E0D0': 'Ngjyrë e Bruztë', + '0000CD': 'E Kaltër e Mesme', + '800080': 'Vjollcë', + '808080': 'Gri', + F00: 'E Kuqe', + FF8C00: 'E Portokalltë e Errët', + FFD700: 'Ngjyrë Ari', + '008000': 'E Gjelbërt', + '0FF': 'Cyan', + '00F': 'E Kaltër', + EE82EE: 'Vjollcë', + A9A9A9: 'Gri e Zbehtë', + FFA07A: 'Salmon i Ndritur', + FFA500: 'E Portokalltë', + FFFF00: 'E Verdhë', + '00FF00': 'Ngjyrë Gëlqere', + AFEEEE: 'Ngjyrë e Bruztë e Zbehtë', + ADD8E6: 'E Kaltër e Ndritur', + DDA0DD: 'Ngjyrë Llokumi', + D3D3D3: 'Gri e Ndritur', + FFF0F5: 'Ngjyrë Purpur e Skuqur', + FAEBD7: 'E Bardhë Antike', + FFFFE0: 'E verdhë e Ndritur', + F0FFF0: 'Ngjyrë Nektari', + F0FFFF: 'Ngjyrë Qielli', + F0F8FF: 'E Kaltër Alice', + E6E6FA: 'Ngjyrë Purpur e Zbetë', + FFF: 'E bardhë' + }, + more: 'Më Shumë Ngjyra...', + panelTitle: 'Ngjyrat', + textColorTitle: 'Ngjyra e Tekstit' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sr-latn.js b/scripts/ckeditor/plugins/colorbutton/lang/sr-latn.js new file mode 100755 index 00000000..146bc6c7 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sr-latn.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sr-latn', { + auto: 'Automatski', + bgColorTitle: 'Boja pozadine', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Više boja...', + panelTitle: 'Colors', + textColorTitle: 'Boja teksta' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sr.js b/scripts/ckeditor/plugins/colorbutton/lang/sr.js new file mode 100755 index 00000000..f9c0f7ce --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sr.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sr', { + auto: 'Аутоматски', + bgColorTitle: 'Боја позадине', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'Више боја...', + panelTitle: 'Colors', + textColorTitle: 'Боја текста' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/sv.js b/scripts/ckeditor/plugins/colorbutton/lang/sv.js new file mode 100755 index 00000000..2275f5f3 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/sv.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'sv', { + auto: 'Automatisk', + bgColorTitle: 'Bakgrundsfärg', + colors: { + '000': 'Svart', + '800000': 'Rödbrun', + '8B4513': 'Mörkbrun', + '2F4F4F': 'Skiffergrå', + '008080': 'Kricka', + '000080': 'Marinblå', + '4B0082': 'Indigo', + '696969': 'Mörkgrå', + B22222: 'Tegelsten', + A52A2A: 'Brun', + DAA520: 'Mörk guld', + '006400': 'Mörkgrön', + '40E0D0': 'Turkos', + '0000CD': 'Medium blå', + '800080': 'Lila', + '808080': 'Grå', + F00: 'Röd', + FF8C00: 'Mörkorange', + FFD700: 'Guld', + '008000': 'Grön', + '0FF': 'Turkos', + '00F': 'Blå', + EE82EE: 'Violett', + A9A9A9: 'Matt grå', + FFA07A: 'Laxrosa', + FFA500: 'Orange', + FFFF00: 'Gul', + '00FF00': 'Lime', + AFEEEE: 'Ljusturkos', + ADD8E6: 'Ljusblå', + DDA0DD: 'Plommon', + D3D3D3: 'Ljusgrå', + FFF0F5: 'Ljus lavendel', + FAEBD7: 'Antikvit', + FFFFE0: 'Ljusgul', + F0FFF0: 'Honungsdagg', + F0FFFF: 'Azurblå', + F0F8FF: 'Aliceblå', + E6E6FA: 'Lavendel', + FFF: 'Vit' + }, + more: 'Fler färger...', + panelTitle: 'Färger', + textColorTitle: 'Textfärg' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/th.js b/scripts/ckeditor/plugins/colorbutton/lang/th.js new file mode 100755 index 00000000..5a0ab166 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/th.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'th', { + auto: 'สีอัตโนมัติ', + bgColorTitle: 'สีพื้นหลัง', + colors: { + '000': 'Black', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Brown', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Gray', + F00: 'Red', + FF8C00: 'Dark Orange', + FFD700: 'Gold', + '008000': 'Green', + '0FF': 'Cyan', + '00F': 'Blue', + EE82EE: 'Violet', + A9A9A9: 'Dim Gray', + FFA07A: 'Light Salmon', + FFA500: 'Orange', + FFFF00: 'Yellow', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'White' + }, + more: 'เลือกสีอื่นๆ...', + panelTitle: 'Colors', + textColorTitle: 'สีตัวอักษร' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/tr.js b/scripts/ckeditor/plugins/colorbutton/lang/tr.js new file mode 100755 index 00000000..d32363c2 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/tr.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'tr', { + auto: 'Otomatik', + bgColorTitle: 'Arka Renk', + colors: { + '000': 'Siyah', + '800000': 'Kestane', + '8B4513': 'Koyu Kahverengi', + '2F4F4F': 'Koyu Kurşuni Gri', + '008080': 'Teal', + '000080': 'Mavi', + '4B0082': 'Çivit Mavisi', + '696969': 'Silik Gri', + B22222: 'Ateş Tuğlası', + A52A2A: 'Kahverengi', + DAA520: 'Altun Sırık', + '006400': 'Koyu Yeşil', + '40E0D0': 'Turkuaz', + '0000CD': 'Orta Mavi', + '800080': 'Pembe', + '808080': 'Gri', + F00: 'Kırmızı', + FF8C00: 'Koyu Portakal', + FFD700: 'Altın', + '008000': 'Yeşil', + '0FF': 'Ciyan', + '00F': 'Mavi', + EE82EE: 'Menekşe', + A9A9A9: 'Koyu Gri', + FFA07A: 'Açık Sarımsı', + FFA500: 'Portakal', + FFFF00: 'Sarı', + '00FF00': 'Açık Yeşil', + AFEEEE: 'Sönük Turkuaz', + ADD8E6: 'Açık Mavi', + DDA0DD: 'Mor', + D3D3D3: 'Açık Gri', + FFF0F5: 'Eflatun Pembe', + FAEBD7: 'Antik Beyaz', + FFFFE0: 'Açık Sarı', + F0FFF0: 'Balsarısı', + F0FFFF: 'Gök Mavisi', + F0F8FF: 'Reha Mavi', + E6E6FA: 'Eflatun', + FFF: 'Beyaz' + }, + more: 'Diğer renkler...', + panelTitle: 'Renkler', + textColorTitle: 'Yazı Rengi' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/tt.js b/scripts/ckeditor/plugins/colorbutton/lang/tt.js new file mode 100755 index 00000000..40806438 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/tt.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'tt', { + auto: 'Автоматик', + bgColorTitle: 'Фон төсе', + colors: { + '000': 'Кара', + '800000': 'Бордо', + '8B4513': 'Дарчин', + '2F4F4F': 'Аспид соры', + '008080': 'Күкле-яшелле', + '000080': 'Куе күк', + '4B0082': 'Индиго', + '696969': 'Куе соры', + B22222: 'Кармин', + A52A2A: 'Чия кызыл', + DAA520: 'Алтын каен', + '006400': 'Үлән', + '40E0D0': 'Фирәзә', + '0000CD': 'Фарсы күк', + '800080': 'Шәмәхә', + '808080': 'Соры', + F00: 'Кызыл', + FF8C00: 'Кабак', + FFD700: 'Алтын', + '008000': 'Яшел', + '0FF': 'Ачык зәңгәр', + '00F': 'Зәңгәр', + EE82EE: 'Миләүшә', + A9A9A9: 'Ачык соры', + FFA07A: 'Кызгылт сары алсу', + FFA500: 'Кызгылт сары', + FFFF00: 'Сары', + '00FF00': 'Лайм', + AFEEEE: 'Тонык күк', + ADD8E6: 'Тонык күкбаш', + DDA0DD: 'Аксыл шәмәхә', + D3D3D3: 'Ачык соры', + FFF0F5: 'Ал ала миләүшә', + FAEBD7: 'Җитен', + FFFFE0: 'Ачык сары', + F0FFF0: 'Аксыл көрән', + F0FFFF: 'Ап-ак', + F0F8FF: 'Аксыл зәңгәр диңгез', + E6E6FA: 'Ала миләүшә', + FFF: 'Ак' + }, + more: 'Башка төсләр', + panelTitle: 'Төсләр', + textColorTitle: 'Текст төсе' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/ug.js b/scripts/ckeditor/plugins/colorbutton/lang/ug.js new file mode 100755 index 00000000..5c33474e --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/ug.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'ug', { + auto: 'ئۆزلۈكىدىن', + bgColorTitle: 'تەگلىك رەڭگى', + colors: { + '000': 'قارا', + '800000': 'قىزغۇچ سېرىق', + '8B4513': 'توق قوڭۇر', + '2F4F4F': 'قارامتۇل يېشىل', + '008080': 'كۆكۈش يېشىل', + '000080': 'قارامتۇل كۆك', + '4B0082': 'كۆكۈش كۈلرەڭ', + '696969': 'قارامتۇل كۈلرەڭ', + B22222: 'خىش قىزىل', + A52A2A: 'قوڭۇر', + DAA520: 'ئالتۇن سېرىق', + '006400': 'توق يېشىل', + '40E0D0': 'كۆكۈچ يېشىل', + '0000CD': 'ئوتتۇراھال كۆك', + '800080': 'بىنەپشە', + '808080': 'كۈلرەڭ', + F00: 'قىزىل', + FF8C00: 'توق قىزغۇچ سېرىق', + FFD700: 'ئالتۇن', + '008000': 'يېشىل', + '0FF': 'يېشىل كۆك', + '00F': 'كۆك', + EE82EE: 'قىزغۇچ بىنەپشە', + A9A9A9: 'توق كۈلرەڭ', + FFA07A: 'كاۋا چېچىكى سېرىق', + FFA500: 'قىزغۇچ سېرىق', + FFFF00: 'سېرىق', + '00FF00': 'Lime', + AFEEEE: 'سۇس ھاۋا رەڭ', + ADD8E6: 'ئوچۇق كۆك', + DDA0DD: 'قىزغۇچ بىنەپشە', + D3D3D3: 'سۇس كۆكۈچ كۈلرەڭ', + FFF0F5: 'سۇس قىزغۇچ بىنەپشە', + FAEBD7: 'Antique White', + FFFFE0: 'سۇس سېرىق', + F0FFF0: 'Honeydew', + F0FFFF: 'ئاسمان كۆكى', + F0F8FF: 'سۇس كۆك', + E6E6FA: 'سۇس بىنەپشە', + FFF: 'ئاق' + }, + more: 'باشقا رەڭ', + panelTitle: 'رەڭ', + textColorTitle: 'تېكىست رەڭگى' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/uk.js b/scripts/ckeditor/plugins/colorbutton/lang/uk.js new file mode 100755 index 00000000..af8990a6 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/uk.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'uk', { + auto: 'Авто', + bgColorTitle: 'Колір фону', + colors: { + '000': 'Чорний', + '800000': 'Бордовий', + '8B4513': 'Коричневий', + '2F4F4F': 'Темний сіро-зелений', + '008080': 'Морської хвилі', + '000080': 'Сливовий', + '4B0082': 'Індиго', + '696969': 'Темносірий', + B22222: 'Темночервоний', + A52A2A: 'Каштановий', + DAA520: 'Бежевий', + '006400': 'Темнозелений', + '40E0D0': 'Бірюзовий', + '0000CD': 'Темносиній', + '800080': 'Пурпурний', + '808080': 'Сірий', + F00: 'Червоний', + FF8C00: 'Темнооранжевий', + FFD700: 'Жовтий', + '008000': 'Зелений', + '0FF': 'Синьо-зелений', + '00F': 'Синій', + EE82EE: 'Фіолетовий', + A9A9A9: 'Світлосірий', + FFA07A: 'Рожевий', + FFA500: 'Оранжевий', + FFFF00: 'Яскравожовтий', + '00FF00': 'Салатовий', + AFEEEE: 'Світлобірюзовий', + ADD8E6: 'Блакитний', + DDA0DD: 'Світлофіолетовий', + D3D3D3: 'Сріблястий', + FFF0F5: 'Світлорожевий', + FAEBD7: 'Світлооранжевий', + FFFFE0: 'Світложовтий', + F0FFF0: 'Світлозелений', + F0FFFF: 'Світлий синьо-зелений', + F0F8FF: 'Світлоблакитний', + E6E6FA: 'Лавандовий', + FFF: 'Білий' + }, + more: 'Кольори...', + panelTitle: 'Кольори', + textColorTitle: 'Колір тексту' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/vi.js b/scripts/ckeditor/plugins/colorbutton/lang/vi.js new file mode 100755 index 00000000..95661b02 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/vi.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'vi', { + auto: 'Tự động', + bgColorTitle: 'Màu nền', + colors: { + '000': 'Đen', + '800000': 'Maroon', + '8B4513': 'Saddle Brown', + '2F4F4F': 'Dark Slate Gray', + '008080': 'Teal', + '000080': 'Navy', + '4B0082': 'Indigo', + '696969': 'Dark Gray', + B22222: 'Fire Brick', + A52A2A: 'Nâu', + DAA520: 'Golden Rod', + '006400': 'Dark Green', + '40E0D0': 'Turquoise', + '0000CD': 'Medium Blue', + '800080': 'Purple', + '808080': 'Xám', + F00: 'Đỏ', + FF8C00: 'Dark Orange', + FFD700: 'Vàng', + '008000': 'Xanh lá cây', + '0FF': 'Cyan', + '00F': 'Xanh da trời', + EE82EE: 'Tím', + A9A9A9: 'Xám tối', + FFA07A: 'Light Salmon', + FFA500: 'Màu cam', + FFFF00: 'Vàng', + '00FF00': 'Lime', + AFEEEE: 'Pale Turquoise', + ADD8E6: 'Light Blue', + DDA0DD: 'Plum', + D3D3D3: 'Light Grey', + FFF0F5: 'Lavender Blush', + FAEBD7: 'Antique White', + FFFFE0: 'Light Yellow', + F0FFF0: 'Honeydew', + F0FFFF: 'Azure', + F0F8FF: 'Alice Blue', + E6E6FA: 'Lavender', + FFF: 'Trắng' + }, + more: 'Màu khác...', + panelTitle: 'Màu sắc', + textColorTitle: 'Màu chữ' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/zh-cn.js b/scripts/ckeditor/plugins/colorbutton/lang/zh-cn.js new file mode 100755 index 00000000..4e6a7720 --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/zh-cn.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'zh-cn', { + auto: '自动', + bgColorTitle: '背景颜色', + colors: { + '000': '黑', + '800000': '褐红', + '8B4513': '深褐', + '2F4F4F': '墨绿', + '008080': '绿松石', + '000080': '海军蓝', + '4B0082': '靛蓝', + '696969': '暗灰', + B22222: '砖红', + A52A2A: '褐', + DAA520: '金黄', + '006400': '深绿', + '40E0D0': '蓝绿', + '0000CD': '中蓝', + '800080': '紫', + '808080': '灰', + F00: '红', + FF8C00: '深橙', + FFD700: '金', + '008000': '绿', + '0FF': '青', + '00F': '蓝', + EE82EE: '紫罗兰', + A9A9A9: '深灰', + FFA07A: '亮橙', + FFA500: '橙', + FFFF00: '黄', + '00FF00': '水绿', + AFEEEE: '粉蓝', + ADD8E6: '亮蓝', + DDA0DD: '梅红', + D3D3D3: '淡灰', + FFF0F5: '淡紫红', + FAEBD7: '古董白', + FFFFE0: '淡黄', + F0FFF0: '蜜白', + F0FFFF: '天蓝', + F0F8FF: '淡蓝', + E6E6FA: '淡紫', + FFF: '白' + }, + more: '其它颜色...', + panelTitle: '颜色', + textColorTitle: '文本颜色' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/lang/zh.js b/scripts/ckeditor/plugins/colorbutton/lang/zh.js new file mode 100755 index 00000000..5a287adf --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/lang/zh.js @@ -0,0 +1,53 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colorbutton', 'zh', { + auto: '自動', + bgColorTitle: '背景顏色', + colors: { + '000': '黑色', + '800000': '栗色', + '8B4513': '鞍褐色', + '2F4F4F': '暗瓦灰色', + '008080': '水壓色', + '000080': '丈青澀', + '4B0082': '靛青', + '696969': '深灰色', + B22222: '磚紅色', + A52A2A: '褐色', + DAA520: '金黃色', + '006400': '深綠色', + '40E0D0': '青綠色', + '0000CD': '藍色', + '800080': '紫色', + '808080': '灰色', + F00: '紅色', + FF8C00: '深橘色', + FFD700: '金色', + '008000': '綠色', + '0FF': '藍綠色', + '00F': '藍色', + EE82EE: '紫色', + A9A9A9: '暗灰色', + FFA07A: '亮鮭紅', + FFA500: '橘色', + FFFF00: '黃色', + '00FF00': '鮮綠色', + AFEEEE: '綠松色', + ADD8E6: '淺藍色', + DDA0DD: '枚紅色', + D3D3D3: '淺灰色', + FFF0F5: '淺紫色', + FAEBD7: '骨董白', + FFFFE0: '淺黃色', + F0FFF0: '蜜瓜綠', + F0FFFF: '天藍色', + F0F8FF: '愛麗斯蘭', + E6E6FA: '淺紫色', + FFF: '白色' + }, + more: '更多顏色', + panelTitle: '顏色', + textColorTitle: '文字顏色' +} ); diff --git a/scripts/ckeditor/plugins/colorbutton/plugin.js b/scripts/ckeditor/plugins/colorbutton/plugin.js new file mode 100755 index 00000000..3c28deca --- /dev/null +++ b/scripts/ckeditor/plugins/colorbutton/plugin.js @@ -0,0 +1,286 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The "colorbutton" plugin that makes it possible to assign + * text and background colors to editor contents. + * + */ +CKEDITOR.plugins.add( 'colorbutton', { + requires: 'panelbutton,floatpanel', + lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + icons: 'bgcolor,textcolor', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + init: function( editor ) { + var config = editor.config, + lang = editor.lang.colorbutton; + + var clickFn; + + if ( !CKEDITOR.env.hc ) { + addButton( 'TextColor', 'fore', lang.textColorTitle, 10 ); + addButton( 'BGColor', 'back', lang.bgColorTitle, 20 ); + } + + function addButton( name, type, title, order ) { + var style = new CKEDITOR.style( config[ 'colorButton_' + type + 'Style' ] ), + colorBoxId = CKEDITOR.tools.getNextId() + '_colorBox'; + + editor.ui.add( name, CKEDITOR.UI_PANELBUTTON, { + label: title, + title: title, + modes: { wysiwyg: 1 }, + editorFocus: 0, + toolbar: 'colors,' + order, + allowedContent: style, + requiredContent: style, + + panel: { + css: CKEDITOR.skin.getPath( 'editor' ), + attributes: { role: 'listbox', 'aria-label': lang.panelTitle } + }, + + onBlock: function( panel, block ) { + block.autoSize = true; + block.element.addClass( 'cke_colorblock' ); + block.element.setHtml( renderColors( panel, type, colorBoxId ) ); + // The block should not have scrollbars (#5933, #6056) + block.element.getDocument().getBody().setStyle( 'overflow', 'hidden' ); + + CKEDITOR.ui.fire( 'ready', this ); + + var keys = block.keys; + var rtl = editor.lang.dir == 'rtl'; + keys[ rtl ? 37 : 39 ] = 'next'; // ARROW-RIGHT + keys[ 40 ] = 'next'; // ARROW-DOWN + keys[ 9 ] = 'next'; // TAB + keys[ rtl ? 39 : 37 ] = 'prev'; // ARROW-LEFT + keys[ 38 ] = 'prev'; // ARROW-UP + keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB + keys[ 32 ] = 'click'; // SPACE + }, + + refresh: function() { + if ( !editor.activeFilter.check( style ) ) + this.setState( CKEDITOR.TRISTATE_DISABLED ); + }, + + // The automatic colorbox should represent the real color (#6010) + onOpen: function() { + + var selection = editor.getSelection(), + block = selection && selection.getStartElement(), + path = editor.elementPath( block ), + color; + + if ( !path ) + return; + + // Find the closest block element. + block = path.block || path.blockLimit || editor.document.getBody(); + + // The background color might be transparent. In that case, look up the color in the DOM tree. + do { + color = block && block.getComputedStyle( type == 'back' ? 'background-color' : 'color' ) || 'transparent'; + } + while ( type == 'back' && color == 'transparent' && block && ( block = block.getParent() ) ); + + // The box should never be transparent. + if ( !color || color == 'transparent' ) + color = '#ffffff'; + + this._.panel._.iframe.getFrameDocument().getById( colorBoxId ).setStyle( 'background-color', color ); + + return color; + } + } ); + } + + + function renderColors( panel, type, colorBoxId ) { + var output = [], + colors = config.colorButton_colors.split( ',' ); + + var clickFn = CKEDITOR.tools.addFunction( function( color, type ) { + if ( color == '?' ) { + var applyColorStyle = arguments.callee; + + function onColorDialogClose( evt ) { + this.removeListener( 'ok', onColorDialogClose ); + this.removeListener( 'cancel', onColorDialogClose ); + + evt.name == 'ok' && applyColorStyle( this.getContentElement( 'picker', 'selectedColor' ).getValue(), type ); + } + + editor.openDialog( 'colordialog', function() { + this.on( 'ok', onColorDialogClose ); + this.on( 'cancel', onColorDialogClose ); + } ); + + return; + } + + editor.focus(); + + panel.hide(); + + editor.fire( 'saveSnapshot' ); + + // Clean up any conflicting style within the range. + editor.removeStyle( new CKEDITOR.style( config[ 'colorButton_' + type + 'Style' ], { color: 'inherit' } ) ); + + if ( color ) { + var colorStyle = config[ 'colorButton_' + type + 'Style' ]; + + colorStyle.childRule = type == 'back' ? + function( element ) { + // It's better to apply background color as the innermost style. (#3599) + // Except for "unstylable elements". (#6103) + return isUnstylable( element ); + } : function( element ) { + // Fore color style must be applied inside links instead of around it. (#4772,#6908) + return !( element.is( 'a' ) || element.getElementsByTag( 'a' ).count() ) || isUnstylable( element ); + }; + + editor.applyStyle( new CKEDITOR.style( colorStyle, { color: color } ) ); + } + + editor.fire( 'saveSnapshot' ); + } ); + + // Render the "Automatic" button. + output.push( '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '' + + '', lang.auto, '
' + + '
' + + '' ); + + // Render the color boxes. + for ( var i = 0; i < colors.length; i++ ) { + if ( ( i % 8 ) === 0 ) + output.push( '' ); + + var parts = colors[ i ].split( '/' ), + colorName = parts[ 0 ], + colorCode = parts[ 1 ] || colorName; + + // The data can be only a color code (without #) or colorName + color code + // If only a color code is provided, then the colorName is the color with the hash + // Convert the color from RGB to RRGGBB for better compatibility with IE and . See #5676 + if ( !parts[ 1 ] ) + colorName = '#' + colorName.replace( /^(.)(.)(.)$/, '$1$1$2$2$3$3' ); + + var colorLabel = editor.lang.colorbutton.colors[ colorCode ] || colorCode; + output.push( '' ); + } + + // Render the "More Colors" button. + if ( editor.plugins.colordialog && config.colorButton_enableMore === undefined || config.colorButton_enableMore ) { + output.push( '' + + '' + + '' ); // tr is later in the code. + } + + output.push( '
' + + '' + + '' + + '' + + '
' + + '', lang.more, '' + + '
' ); + + return output.join( '' ); + } + + function isUnstylable( ele ) { + return ( ele.getAttribute( 'contentEditable' ) == 'false' ) || ele.getAttribute( 'data-nostyle' ); + } + } +} ); + +/** + * Whether to enable the **More Colors*** button in the color selectors. + * + * config.colorButton_enableMore = false; + * + * @cfg {Boolean} [colorButton_enableMore=true] + * @member CKEDITOR.config + */ + +/** + * Defines the colors to be displayed in the color selectors. This is a string + * containing hexadecimal notation for HTML colors, without the `'#'` prefix. + * + * **Since 3.3:** A color name may optionally be defined by prefixing the entries with + * a name and the slash character. For example, `'FontColor1/FF9900'` will be + * displayed as the color `#FF9900` in the selector, but will be output as `'FontColor1'`. + * + * // Brazil colors only. + * config.colorButton_colors = '00923E,F8C100,28166F'; + * + * config.colorButton_colors = 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00'; + * + * @cfg {String} [colorButton_colors=see source] + * @member CKEDITOR.config + */ +CKEDITOR.config.colorButton_colors = '000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,' + + 'B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,' + + 'F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,' + + 'FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,' + + 'FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF'; + +/** + * Stores the style definition that applies the text foreground color. + * + * // This is actually the default value. + * config.colorButton_foreStyle = { + * element: 'span', + * styles: { color: '#(color)' } + * }; + * + * @cfg [colorButton_foreStyle=see source] + * @member CKEDITOR.config + */ +CKEDITOR.config.colorButton_foreStyle = { + element: 'span', + styles: { 'color': '#(color)' }, + overrides: [ { + element: 'font', attributes: { 'color': null } + } ] +}; + +/** + * Stores the style definition that applies the text background color. + * + * // This is actually the default value. + * config.colorButton_backStyle = { + * element: 'span', + * styles: { 'background-color': '#(color)' } + * }; + * + * @cfg [colorButton_backStyle=see source] + * @member CKEDITOR.config + */ +CKEDITOR.config.colorButton_backStyle = { + element: 'span', + styles: { 'background-color': '#(color)' } +}; diff --git a/scripts/ckeditor/plugins/colordialog/dialogs/colordialog.js b/scripts/ckeditor/plugins/colordialog/dialogs/colordialog.js new file mode 100755 index 00000000..738c892a --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/dialogs/colordialog.js @@ -0,0 +1,337 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'colordialog', function( editor ) { + // Define some shorthands. + var $el = CKEDITOR.dom.element, + $doc = CKEDITOR.document, + lang = editor.lang.colordialog; + + // Reference the dialog. + var dialog; + + var spacer = { + type: 'html', + html: ' ' + }; + + var selected; + + function clearSelected() { + $doc.getById( selHiColorId ).removeStyle( 'background-color' ); + dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' ); + selected && selected.removeAttribute( 'aria-selected' ); + selected = null; + } + + function updateSelected( evt ) { + var target = evt.data.getTarget(), + color; + + if ( target.getName() == 'td' && ( color = target.getChild( 0 ).getHtml() ) ) { + selected = target; + selected.setAttribute( 'aria-selected', true ); + dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color ); + } + } + + // Basing black-white decision off of luma scheme using the Rec. 709 version + function whiteOrBlack( color ) { + color = color.replace( /^#/, '' ); + for ( var i = 0, rgb = []; i <= 2; i++ ) + rgb[ i ] = parseInt( color.substr( i * 2, 2 ), 16 ); + var luma = ( 0.2126 * rgb[ 0 ] ) + ( 0.7152 * rgb[ 1 ] ) + ( 0.0722 * rgb[ 2 ] ); + return '#' + ( luma >= 165 ? '000' : 'fff' ); + } + + // Distinguish focused and hover states. + var focused, hovered; + + // Apply highlight style. + function updateHighlight( event ) { + // Convert to event. + !event.name && ( event = new CKEDITOR.event( event ) ); + + var isFocus = !( /mouse/ ).test( event.name ), + target = event.data.getTarget(), + color; + + if ( target.getName() == 'td' && ( color = target.getChild( 0 ).getHtml() ) ) { + removeHighlight( event ); + + isFocus ? focused = target : hovered = target; + + // Apply outline style to show focus. + if ( isFocus ) { + target.setStyle( 'border-color', whiteOrBlack( color ) ); + target.setStyle( 'border-style', 'dotted' ); + } + + $doc.getById( hicolorId ).setStyle( 'background-color', color ); + $doc.getById( hicolorTextId ).setHtml( color ); + } + } + + function clearHighlight() { + var color = focused.getChild( 0 ).getHtml(); + focused.setStyle( 'border-color', color ); + focused.setStyle( 'border-style', 'solid' ); + $doc.getById( hicolorId ).removeStyle( 'background-color' ); + $doc.getById( hicolorTextId ).setHtml( ' ' ); + focused = null; + } + + // Remove previously focused style. + function removeHighlight( event ) { + var isFocus = !( /mouse/ ).test( event.name ), + target = isFocus && focused; + + if ( target ) { + var color = target.getChild( 0 ).getHtml(); + target.setStyle( 'border-color', color ); + target.setStyle( 'border-style', 'solid' ); + } + + if ( !( focused || hovered ) ) { + $doc.getById( hicolorId ).removeStyle( 'background-color' ); + $doc.getById( hicolorTextId ).setHtml( ' ' ); + } + } + + function onKeyStrokes( evt ) { + var domEvt = evt.data; + + var element = domEvt.getTarget(); + var relative, nodeToMove; + var keystroke = domEvt.getKeystroke(), + rtl = editor.lang.dir == 'rtl'; + + switch ( keystroke ) { + // UP-ARROW + case 38: + // relative is TR + if ( ( relative = element.getParent().getPrevious() ) ) { + nodeToMove = relative.getChild( [ element.getIndex() ] ); + nodeToMove.focus(); + } + domEvt.preventDefault(); + break; + // DOWN-ARROW + case 40: + // relative is TR + if ( ( relative = element.getParent().getNext() ) ) { + nodeToMove = relative.getChild( [ element.getIndex() ] ); + if ( nodeToMove && nodeToMove.type == 1 ) + nodeToMove.focus(); + + } + domEvt.preventDefault(); + break; + + // SPACE + // ENTER + case 32: + case 13: + updateSelected( evt ); + domEvt.preventDefault(); + break; + + // RIGHT-ARROW + case rtl ? 37 : 39: + // relative is TD + if ( ( nodeToMove = element.getNext() ) ) { + if ( nodeToMove.type == 1 ) { + nodeToMove.focus(); + domEvt.preventDefault( true ); + } + } + // relative is TR + else if ( ( relative = element.getParent().getNext() ) ) { + nodeToMove = relative.getChild( [ 0 ] ); + if ( nodeToMove && nodeToMove.type == 1 ) { + nodeToMove.focus(); + domEvt.preventDefault( true ); + } + } + break; + + // LEFT-ARROW + case rtl ? 39 : 37: + // relative is TD + if ( ( nodeToMove = element.getPrevious() ) ) { + nodeToMove.focus(); + domEvt.preventDefault( true ); + } + // relative is TR + else if ( ( relative = element.getParent().getPrevious() ) ) { + nodeToMove = relative.getLast(); + nodeToMove.focus(); + domEvt.preventDefault( true ); + } + break; + default: + // Do not stop not handled events. + return; + } + } + + function createColorTable() { + table = CKEDITOR.dom.element.createFromHtml( '' + + '' + + '
' + lang.options + '
' ); + + table.on( 'mouseover', updateHighlight ); + table.on( 'mouseout', removeHighlight ); + + // Create the base colors array. + var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ]; + + // This function combines two ranges of three values from the color array into a row. + function appendColorRow( rangeA, rangeB ) { + for ( var i = rangeA; i < rangeA + 3; i++ ) { + var row = new $el( table.$.insertRow( -1 ) ); + row.setAttribute( 'role', 'row' ); + + for ( var j = rangeB; j < rangeB + 3; j++ ) { + for ( var n = 0; n < 6; n++ ) { + appendColorCell( row.$, '#' + aColors[ j ] + aColors[ n ] + aColors[ i ] ); + } + } + } + } + + // This function create a single color cell in the color table. + function appendColorCell( targetRow, color ) { + var cell = new $el( targetRow.insertCell( -1 ) ); + cell.setAttribute( 'class', 'ColorCell' ); + cell.setAttribute( 'tabIndex', -1 ); + cell.setAttribute( 'role', 'gridcell' ); + + cell.on( 'keydown', onKeyStrokes ); + cell.on( 'click', updateSelected ); + cell.on( 'focus', updateHighlight ); + cell.on( 'blur', removeHighlight ); + + cell.setStyle( 'background-color', color ); + cell.setStyle( 'border', '1px solid ' + color ); + + cell.setStyle( 'width', '14px' ); + cell.setStyle( 'height', '14px' ); + + var colorLabel = numbering( 'color_table_cell' ); + cell.setAttribute( 'aria-labelledby', colorLabel ); + cell.append( CKEDITOR.dom.element.createFromHtml( '' + color + '', CKEDITOR.document ) ); + } + + appendColorRow( 0, 0 ); + appendColorRow( 3, 0 ); + appendColorRow( 0, 3 ); + appendColorRow( 3, 3 ); + + // Create the last row. + var oRow = new $el( table.$.insertRow( -1 ) ); + oRow.setAttribute( 'role', 'row' ); + + // Create the gray scale colors cells. + for ( var n = 0; n < 6; n++ ) { + appendColorCell( oRow.$, '#' + aColors[ n ] + aColors[ n ] + aColors[ n ] ); + } + + // Fill the row with black cells. + for ( var i = 0; i < 12; i++ ) { + appendColorCell( oRow.$, '#000000' ); + } + } + + var numbering = function( id ) { + return CKEDITOR.tools.getNextId() + '_' + id; + }, + hicolorId = numbering( 'hicolor' ), + hicolorTextId = numbering( 'hicolortext' ), + selHiColorId = numbering( 'selhicolor' ), + table; + + createColorTable(); + + return { + title: lang.title, + minWidth: 360, + minHeight: 220, + onLoad: function() { + // Update reference. + dialog = this; + }, + onHide: function() { + clearSelected(); + clearHighlight(); + }, + contents: [ + { + id: 'picker', + label: lang.title, + accessKey: 'I', + elements: [ + { + type: 'hbox', + padding: 0, + widths: [ '70%', '10%', '30%' ], + children: [ + { + type: 'html', + html: '

', + onLoad: function() { + CKEDITOR.document.getById( this.domId ).append( table ); + }, + focus: function() { + // Restore the previously focused cell, + // otherwise put the initial focus on the first table cell. + ( focused || this.getElement().getElementsByTag( 'td' ).getItem( 0 ) ).focus(); + } + }, + spacer, + { + type: 'vbox', + padding: 0, + widths: [ '70%', '5%', '25%' ], + children: [ + { + type: 'html', + html: '' + lang.highlight + '\ +
\ +
 
' + lang.selected + '\ +
' + }, + { + type: 'text', + label: lang.selected, + labelStyle: 'display:none', + id: 'selectedColor', + style: 'width: 76px;margin-top:4px', + onChange: function() { + // Try to update color preview with new value. If fails, then set it no none. + try { + $doc.getById( selHiColorId ).setStyle( 'background-color', this.getValue() ); + } catch ( e ) { + clearSelected(); + } + } + }, + spacer, + { + type: 'button', + id: 'clear', + label: lang.clear, + onClick: clearSelected + } + ] + } + ] + } + ] + } + ] + }; +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/af.js b/scripts/ckeditor/plugins/colordialog/lang/af.js new file mode 100755 index 00000000..af983473 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/af.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'af', { + clear: 'Herstel', + highlight: 'Aktief', + options: 'Kleuropsies', + selected: 'Geselekteer', + title: 'Kies kleur' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ar.js b/scripts/ckeditor/plugins/colordialog/lang/ar.js new file mode 100755 index 00000000..a68bd309 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ar.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ar', { + clear: 'مسح', + highlight: 'تحديد', + options: 'اختيارات الألوان', + selected: 'اللون المختار', + title: 'اختر اللون' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/bg.js b/scripts/ckeditor/plugins/colordialog/lang/bg.js new file mode 100755 index 00000000..04ff0458 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/bg.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'bg', { + clear: 'Изчистване', + highlight: 'Осветяване', + options: 'Цветови опции', + selected: 'Изберете цвят', + title: 'Изберете цвят' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/bn.js b/scripts/ckeditor/plugins/colordialog/lang/bn.js new file mode 100755 index 00000000..3601f50c --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/bn.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'bn', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/bs.js b/scripts/ckeditor/plugins/colordialog/lang/bs.js new file mode 100755 index 00000000..c48ed1a4 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/bs.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'bs', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ca.js b/scripts/ckeditor/plugins/colordialog/lang/ca.js new file mode 100755 index 00000000..c2e13aec --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ca.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ca', { + clear: 'Neteja', + highlight: 'Destacat', + options: 'Opcions del color', + selected: 'Color Seleccionat', + title: 'Seleccioni el color' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/cs.js b/scripts/ckeditor/plugins/colordialog/lang/cs.js new file mode 100755 index 00000000..2550687d --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/cs.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'cs', { + clear: 'Vyčistit', + highlight: 'Zvýraznit', + options: 'Nastavení barvy', + selected: 'Vybráno', + title: 'Výběr barvy' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/cy.js b/scripts/ckeditor/plugins/colordialog/lang/cy.js new file mode 100755 index 00000000..aeb17f73 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/cy.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'cy', { + clear: 'Clirio', + highlight: 'Uwcholeuo', + options: 'Opsiynau Lliw', + selected: 'Lliw a Ddewiswyd', + title: 'Dewis lliw' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/da.js b/scripts/ckeditor/plugins/colordialog/lang/da.js new file mode 100755 index 00000000..32770117 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/da.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'da', { + clear: 'Nulstil', + highlight: 'Markér', + options: 'Farvemuligheder', + selected: 'Valgt farve', + title: 'Vælg farve' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/de.js b/scripts/ckeditor/plugins/colordialog/lang/de.js new file mode 100755 index 00000000..a25f0a86 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/de.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'de', { + clear: 'Entfernen', + highlight: 'Hervorheben', + options: 'Farbeoptionen', + selected: 'Ausgewählte Farbe', + title: 'Farbe wählen' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/el.js b/scripts/ckeditor/plugins/colordialog/lang/el.js new file mode 100755 index 00000000..d0295a6f --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/el.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'el', { + clear: 'Εκκαθάριση', + highlight: 'Σήμανση', + options: 'Επιλογές Χρωμάτων', + selected: 'Επιλεγμένο Χρώμα', + title: 'Επιλογή χρώματος' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/en-au.js b/scripts/ckeditor/plugins/colordialog/lang/en-au.js new file mode 100755 index 00000000..6d10df2b --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/en-au.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'en-au', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/en-ca.js b/scripts/ckeditor/plugins/colordialog/lang/en-ca.js new file mode 100755 index 00000000..a4ba6be4 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/en-ca.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'en-ca', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/en-gb.js b/scripts/ckeditor/plugins/colordialog/lang/en-gb.js new file mode 100755 index 00000000..072ad181 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/en-gb.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'en-gb', { + clear: 'Clear', + highlight: 'Highlight', + options: 'Colour Options', + selected: 'Selected Colour', + title: 'Select colour' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/en.js b/scripts/ckeditor/plugins/colordialog/lang/en.js new file mode 100755 index 00000000..b47fdf44 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/en.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'en', { + clear: 'Clear', + highlight: 'Highlight', + options: 'Color Options', + selected: 'Selected Color', + title: 'Select color' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/eo.js b/scripts/ckeditor/plugins/colordialog/lang/eo.js new file mode 100755 index 00000000..7b811e3d --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/eo.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'eo', { + clear: 'Forigi', + highlight: 'Detaloj', + options: 'Opcioj pri koloroj', + selected: 'Selektita koloro', + title: 'Selekti koloron' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/es.js b/scripts/ckeditor/plugins/colordialog/lang/es.js new file mode 100755 index 00000000..5992762a --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/es.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'es', { + clear: 'Borrar', + highlight: 'Muestra', + options: 'Opciones de colores', + selected: 'Elegido', + title: 'Elegir color' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/et.js b/scripts/ckeditor/plugins/colordialog/lang/et.js new file mode 100755 index 00000000..4d65cb44 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/et.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'et', { + clear: 'Eemalda', + highlight: 'Näidis', + options: 'Värvi valikud', + selected: 'Valitud värv', + title: 'Värvi valimine' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/eu.js b/scripts/ckeditor/plugins/colordialog/lang/eu.js new file mode 100755 index 00000000..ef7d239c --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/eu.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'eu', { + clear: 'Garbitu', + highlight: 'Nabarmendu', + options: 'Kolore Aukerak', + selected: 'Hautatutako Kolorea', + title: 'Kolorea Hautatu' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/fa.js b/scripts/ckeditor/plugins/colordialog/lang/fa.js new file mode 100755 index 00000000..abbdbbe7 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/fa.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'fa', { + clear: 'پاک کردن', + highlight: 'متمایز', + options: 'گزینه​های رنگ', + selected: 'رنگ انتخاب شده', + title: 'انتخاب رنگ' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/fi.js b/scripts/ckeditor/plugins/colordialog/lang/fi.js new file mode 100755 index 00000000..415f4cdf --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/fi.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'fi', { + clear: 'Poista', + highlight: 'Korostus', + options: 'Värin ominaisuudet', + selected: 'Valittu', + title: 'Valitse väri' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/fo.js b/scripts/ckeditor/plugins/colordialog/lang/fo.js new file mode 100755 index 00000000..3096e5c3 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/fo.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'fo', { + clear: 'Strika', + highlight: 'Framheva', + options: 'Litmøguleikar', + selected: 'Valdur litur', + title: 'Vel lit' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/fr-ca.js b/scripts/ckeditor/plugins/colordialog/lang/fr-ca.js new file mode 100755 index 00000000..c5aa6dff --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/fr-ca.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'fr-ca', { + clear: 'Effacer', + highlight: 'Surligner', + options: 'Options de couleur', + selected: 'Couleur sélectionnée', + title: 'Choisir une couleur' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/fr.js b/scripts/ckeditor/plugins/colordialog/lang/fr.js new file mode 100755 index 00000000..67e0f88d --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/fr.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'fr', { + clear: 'Effacer', + highlight: 'Détails', + options: 'Option des couleurs', + selected: 'Couleur choisie', + title: 'Choisir une couleur' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/gl.js b/scripts/ckeditor/plugins/colordialog/lang/gl.js new file mode 100755 index 00000000..141d7793 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/gl.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'gl', { + clear: 'Limpar', + highlight: 'Resaltar', + options: 'Opcións de cor', + selected: 'Cor seleccionado', + title: 'Seleccione unha cor' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/gu.js b/scripts/ckeditor/plugins/colordialog/lang/gu.js new file mode 100755 index 00000000..34470618 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/gu.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'gu', { + clear: 'સાફ કરવું', + highlight: 'હાઈઈટ', + options: 'રંગના વિકલ્પ', + selected: 'પસંદ કરેલો રંગ', + title: 'રંગ પસંદ કરો' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/he.js b/scripts/ckeditor/plugins/colordialog/lang/he.js new file mode 100755 index 00000000..0d49c68a --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/he.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'he', { + clear: 'ניקוי', + highlight: 'סימון', + options: 'אפשרויות צבע', + selected: 'בחירה', + title: 'בחירת צבע' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/hi.js b/scripts/ckeditor/plugins/colordialog/lang/hi.js new file mode 100755 index 00000000..9175c5c0 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/hi.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'hi', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/hr.js b/scripts/ckeditor/plugins/colordialog/lang/hr.js new file mode 100755 index 00000000..ed7e8f32 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/hr.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'hr', { + clear: 'Očisti', + highlight: 'Istaknuto', + options: 'Opcije boje', + selected: 'Odabrana boja', + title: 'Odaberi boju' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/hu.js b/scripts/ckeditor/plugins/colordialog/lang/hu.js new file mode 100755 index 00000000..b79b4adc --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/hu.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'hu', { + clear: 'Ürítés', + highlight: 'Nagyítás', + options: 'Szín opciók', + selected: 'Kiválasztott', + title: 'Válasszon színt' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/is.js b/scripts/ckeditor/plugins/colordialog/lang/is.js new file mode 100755 index 00000000..b49697fe --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/is.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'is', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/it.js b/scripts/ckeditor/plugins/colordialog/lang/it.js new file mode 100755 index 00000000..7ae3db2c --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/it.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'it', { + clear: 'cancella', + highlight: 'Evidenzia', + options: 'Opzioni colore', + selected: 'Seleziona il colore', + title: 'Selezionare il colore' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ja.js b/scripts/ckeditor/plugins/colordialog/lang/ja.js new file mode 100755 index 00000000..5276031d --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ja.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ja', { + clear: 'クリア', + highlight: 'ハイライト', + options: 'カラーオプション', + selected: '選択された色', + title: '色選択' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ka.js b/scripts/ckeditor/plugins/colordialog/lang/ka.js new file mode 100755 index 00000000..a0bfb86c --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ka.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ka', { + clear: 'გასუფთავება', + highlight: 'ჩვენება', + options: 'ფერის პარამეტრები', + selected: 'არჩეული ფერი', + title: 'ფერის შეცვლა' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/km.js b/scripts/ckeditor/plugins/colordialog/lang/km.js new file mode 100755 index 00000000..0c7f06e8 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/km.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'km', { + clear: 'សម្អាត', + highlight: 'បន្លិច​ពណ៌', + options: 'ជម្រើស​ពណ៌', + selected: 'ពណ៌​ដែល​បាន​រើស', + title: 'រើស​ពណ៌' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ko.js b/scripts/ckeditor/plugins/colordialog/lang/ko.js new file mode 100755 index 00000000..12f8e5e0 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ko.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ko', { + clear: '제거', + highlight: '하이라이트', + options: '색상 옵션', + selected: '색상 선택됨', + title: '색상 선택' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ku.js b/scripts/ckeditor/plugins/colordialog/lang/ku.js new file mode 100755 index 00000000..d63bfc04 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ku.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ku', { + clear: 'پاکیکەوە', + highlight: 'نیشانکردن', + options: 'هەڵبژاردەی ڕەنگەکان', + selected: 'ڕەنگی هەڵبژێردراو', + title: 'هەڵبژاردنی ڕەنگ' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/lt.js b/scripts/ckeditor/plugins/colordialog/lang/lt.js new file mode 100755 index 00000000..02c9a7dd --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/lt.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'lt', { + clear: 'Išvalyti', + highlight: 'Paryškinti', + options: 'Spalvos nustatymai', + selected: 'Pasirinkta spalva', + title: 'Pasirinkite spalvą' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/lv.js b/scripts/ckeditor/plugins/colordialog/lang/lv.js new file mode 100755 index 00000000..57e252a5 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/lv.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'lv', { + clear: 'Notīrīt', + highlight: 'Paraugs', + options: 'Krāsas uzstādījumi', + selected: 'Izvēlētā krāsa', + title: 'Izvēlies krāsu' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/mk.js b/scripts/ckeditor/plugins/colordialog/lang/mk.js new file mode 100755 index 00000000..85da1cb2 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/mk.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'mk', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/mn.js b/scripts/ckeditor/plugins/colordialog/lang/mn.js new file mode 100755 index 00000000..52890dc2 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/mn.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'mn', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ms.js b/scripts/ckeditor/plugins/colordialog/lang/ms.js new file mode 100755 index 00000000..11389927 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ms.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ms', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/nb.js b/scripts/ckeditor/plugins/colordialog/lang/nb.js new file mode 100755 index 00000000..e115f1e5 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/nb.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'nb', { + clear: 'Tøm', + highlight: 'Merk', + options: 'Alternativer for farge', + selected: 'Valgt', + title: 'Velg farge' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/nl.js b/scripts/ckeditor/plugins/colordialog/lang/nl.js new file mode 100755 index 00000000..5009bbfe --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/nl.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'nl', { + clear: 'Wissen', + highlight: 'Actief', + options: 'Kleuropties', + selected: 'Geselecteerde kleur', + title: 'Selecteer kleur' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/no.js b/scripts/ckeditor/plugins/colordialog/lang/no.js new file mode 100755 index 00000000..cbd7d3b1 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/no.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'no', { + clear: 'Tøm', + highlight: 'Merk', + options: 'Alternativer for farge', + selected: 'Valgt', + title: 'Velg farge' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/pl.js b/scripts/ckeditor/plugins/colordialog/lang/pl.js new file mode 100755 index 00000000..04684aaa --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/pl.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'pl', { + clear: 'Wyczyść', + highlight: 'Zaznacz', + options: 'Opcje koloru', + selected: 'Wybrany', + title: 'Wybierz kolor' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/pt-br.js b/scripts/ckeditor/plugins/colordialog/lang/pt-br.js new file mode 100755 index 00000000..24539b9d --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/pt-br.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'pt-br', { + clear: 'Limpar', + highlight: 'Grifar', + options: 'Opções de Cor', + selected: 'Cor Selecionada', + title: 'Selecione uma Cor' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/pt.js b/scripts/ckeditor/plugins/colordialog/lang/pt.js new file mode 100755 index 00000000..785bec71 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/pt.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'pt', { + clear: 'Limpar', + highlight: 'Realçar', + options: 'Opções da Cor', + selected: 'Cor Selecionada', + title: 'Selecionar Cor' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ro.js b/scripts/ckeditor/plugins/colordialog/lang/ro.js new file mode 100755 index 00000000..80d0b868 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ro.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ro', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ru.js b/scripts/ckeditor/plugins/colordialog/lang/ru.js new file mode 100755 index 00000000..65a7b50f --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ru.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ru', { + clear: 'Очистить', + highlight: 'Под курсором', + options: 'Настройки цвета', + selected: 'Выбранный цвет', + title: 'Выберите цвет' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/si.js b/scripts/ckeditor/plugins/colordialog/lang/si.js new file mode 100755 index 00000000..6a2a468b --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/si.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'si', { + clear: 'පැහැදිලි', + highlight: 'මතුකර පෙන්වන්න', + options: 'වර්ණ විකල්ප', + selected: 'තෙරු වර්ණ', + title: 'වර්ණ තෝරන්න' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sk.js b/scripts/ckeditor/plugins/colordialog/lang/sk.js new file mode 100755 index 00000000..db2eb22a --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sk.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sk', { + clear: 'Vyčistiť', + highlight: 'Zvýrazniť', + options: 'Možnosti farby', + selected: 'Vybraná farba', + title: 'Vyberte farbu' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sl.js b/scripts/ckeditor/plugins/colordialog/lang/sl.js new file mode 100755 index 00000000..ce2a5efc --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sl.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sl', { + clear: 'Počisti', + highlight: 'Poudarjeno', + options: 'Barvne Možnosti', + selected: 'Izbrano', + title: 'Izberi barvo' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sq.js b/scripts/ckeditor/plugins/colordialog/lang/sq.js new file mode 100755 index 00000000..93d7ca55 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sq.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sq', { + clear: 'Pastro', + highlight: 'Thekso', + options: 'Përzgjedhjet e Ngjyrave', + selected: 'Ngjyra e Përzgjedhur', + title: 'Përzgjidh një ngjyrë' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sr-latn.js b/scripts/ckeditor/plugins/colordialog/lang/sr-latn.js new file mode 100755 index 00000000..20c49de9 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sr-latn.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sr-latn', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sr.js b/scripts/ckeditor/plugins/colordialog/lang/sr.js new file mode 100755 index 00000000..794bbbbd --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sr.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sr', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/sv.js b/scripts/ckeditor/plugins/colordialog/lang/sv.js new file mode 100755 index 00000000..01d7136b --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/sv.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'sv', { + clear: 'Rensa', + highlight: 'Markera', + options: 'Färgalternativ', + selected: 'Vald färg', + title: 'Välj färg' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/th.js b/scripts/ckeditor/plugins/colordialog/lang/th.js new file mode 100755 index 00000000..b1839f50 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/th.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'th', { + clear: 'Clear', // MISSING + highlight: 'Highlight', // MISSING + options: 'Color Options', // MISSING + selected: 'Selected Color', // MISSING + title: 'Select color' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/tr.js b/scripts/ckeditor/plugins/colordialog/lang/tr.js new file mode 100755 index 00000000..81e70268 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/tr.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'tr', { + clear: 'Temizle', + highlight: 'İşaretle', + options: 'Renk Seçenekleri', + selected: 'Seçilmiş', + title: 'Renk seç' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/tt.js b/scripts/ckeditor/plugins/colordialog/lang/tt.js new file mode 100755 index 00000000..a6e9a345 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/tt.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'tt', { + clear: 'Бушату', + highlight: 'Билгеләү', + options: 'Төс көйләүләре', + selected: 'Сайланган төсләр', + title: 'Төс сайлау' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/ug.js b/scripts/ckeditor/plugins/colordialog/lang/ug.js new file mode 100755 index 00000000..5c322922 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/ug.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'ug', { + clear: 'تازىلا', + highlight: 'يورۇت', + options: 'رەڭ تاللانمىسى', + selected: 'رەڭ تاللاڭ', + title: 'رەڭ تاللاڭ' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/uk.js b/scripts/ckeditor/plugins/colordialog/lang/uk.js new file mode 100755 index 00000000..063d9c16 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/uk.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'uk', { + clear: 'Очистити', + highlight: 'Колір, на який вказує курсор', + options: 'Опції кольорів', + selected: 'Обраний колір', + title: 'Обрати колір' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/vi.js b/scripts/ckeditor/plugins/colordialog/lang/vi.js new file mode 100755 index 00000000..01264977 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/vi.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'vi', { + clear: 'Xóa bỏ', + highlight: 'Màu chọn', + options: 'Tùy chọn màu', + selected: 'Màu đã chọn', + title: 'Chọn màu' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/zh-cn.js b/scripts/ckeditor/plugins/colordialog/lang/zh-cn.js new file mode 100755 index 00000000..4677a5c8 --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/zh-cn.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'zh-cn', { + clear: '清除', + highlight: '高亮', + options: '颜色选项', + selected: '选择颜色', + title: '选择颜色' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/lang/zh.js b/scripts/ckeditor/plugins/colordialog/lang/zh.js new file mode 100755 index 00000000..049329ce --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/lang/zh.js @@ -0,0 +1,11 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'colordialog', 'zh', { + clear: '清除', + highlight: '高亮', + options: '色彩選項', + selected: '選取的色彩', + title: '選取色彩' +} ); diff --git a/scripts/ckeditor/plugins/colordialog/plugin.js b/scripts/ckeditor/plugins/colordialog/plugin.js new file mode 100755 index 00000000..34274fbb --- /dev/null +++ b/scripts/ckeditor/plugins/colordialog/plugin.js @@ -0,0 +1,69 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.colordialog = { + requires: 'dialog', + lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + init: function( editor ) { + var cmd = new CKEDITOR.dialogCommand( 'colordialog' ); + cmd.editorFocus = false; + + editor.addCommand( 'colordialog', cmd ); + + CKEDITOR.dialog.add( 'colordialog', this.path + 'dialogs/colordialog.js' ); + + /** + * Open up color dialog and to receive the selected color. + * + * @param {Function} callback The callback when color dialog is closed + * @param {String} callback.color The color value received if selected on the dialog. + * @param [scope] The scope in which the callback will be bound. + * @member CKEDITOR.editor + */ + editor.getColorFromDialog = function( callback, scope ) { + var onClose = function( evt ) { + releaseHandlers( this ); + var color = evt.name == 'ok' ? this.getValueOf( 'picker', 'selectedColor' ) : null; + callback.call( scope, color ); + }; + var releaseHandlers = function( dialog ) { + dialog.removeListener( 'ok', onClose ); + dialog.removeListener( 'cancel', onClose ); + }; + var bindToDialog = function( dialog ) { + dialog.on( 'ok', onClose ); + dialog.on( 'cancel', onClose ); + }; + + editor.execCommand( 'colordialog' ); + + if ( editor._.storedDialogs && editor._.storedDialogs.colordialog ) + bindToDialog( editor._.storedDialogs.colordialog ); + else { + CKEDITOR.on( 'dialogDefinition', function( e ) { + if ( e.data.name != 'colordialog' ) + return; + + var definition = e.data.definition; + + e.removeListener(); + definition.onLoad = CKEDITOR.tools.override( definition.onLoad, + function( orginal ) { + return function() { + bindToDialog( this ); + definition.onLoad = orginal; + if ( typeof orginal == 'function' ) + orginal.call( this ); + }; + } ); + } ); + } + }; + + + } +}; + +CKEDITOR.plugins.add( 'colordialog', CKEDITOR.plugins.colordialog ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/af.js b/scripts/ckeditor/plugins/contextmenu/lang/af.js new file mode 100755 index 00000000..35633514 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/af.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'af', { + options: 'Konteks Spyskaart-opsies' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ar.js b/scripts/ckeditor/plugins/contextmenu/lang/ar.js new file mode 100755 index 00000000..62311fc4 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ar.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ar', { + options: 'خصائص قائمة السياق' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/bg.js b/scripts/ckeditor/plugins/contextmenu/lang/bg.js new file mode 100755 index 00000000..ae0ceb0a --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/bg.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bg', { + options: 'Опции на контекстното меню' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/bn.js b/scripts/ckeditor/plugins/contextmenu/lang/bn.js new file mode 100755 index 00000000..0c7dd357 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/bn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/bs.js b/scripts/ckeditor/plugins/contextmenu/lang/bs.js new file mode 100755 index 00000000..38e2aef5 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/bs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'bs', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ca.js b/scripts/ckeditor/plugins/contextmenu/lang/ca.js new file mode 100755 index 00000000..ed986085 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ca', { + options: 'Opcions del menú contextual' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/cs.js b/scripts/ckeditor/plugins/contextmenu/lang/cs.js new file mode 100755 index 00000000..95692de7 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/cs.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'cs', { + options: 'Nastavení kontextové nabídky' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/cy.js b/scripts/ckeditor/plugins/contextmenu/lang/cy.js new file mode 100755 index 00000000..5e0da0fe --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/cy.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'cy', { + options: 'Opsiynau Dewislen Cyd-destun' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/da.js b/scripts/ckeditor/plugins/contextmenu/lang/da.js new file mode 100755 index 00000000..d6abf2e2 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/da.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'da', { + options: 'Muligheder for hjælpemenu' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/de.js b/scripts/ckeditor/plugins/contextmenu/lang/de.js new file mode 100755 index 00000000..e99dc995 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/de.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'de', { + options: 'Kontextmenü Optionen' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/el.js b/scripts/ckeditor/plugins/contextmenu/lang/el.js new file mode 100755 index 00000000..392a45eb --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/el.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'el', { + options: 'Επιλογές Αναδυόμενου Μενού' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/en-au.js b/scripts/ckeditor/plugins/contextmenu/lang/en-au.js new file mode 100755 index 00000000..6a1ca8a2 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/en-au.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-au', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/en-ca.js b/scripts/ckeditor/plugins/contextmenu/lang/en-ca.js new file mode 100755 index 00000000..1fcbdfbd --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/en-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-ca', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/en-gb.js b/scripts/ckeditor/plugins/contextmenu/lang/en-gb.js new file mode 100755 index 00000000..aab3a770 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/en-gb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en-gb', { + options: 'Context Menu Options' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/en.js b/scripts/ckeditor/plugins/contextmenu/lang/en.js new file mode 100755 index 00000000..da42b758 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/en.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'en', { + options: 'Context Menu Options' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/eo.js b/scripts/ckeditor/plugins/contextmenu/lang/eo.js new file mode 100755 index 00000000..3182026c --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/eo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'eo', { + options: 'Opcioj de Kunteksta Menuo' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/es.js b/scripts/ckeditor/plugins/contextmenu/lang/es.js new file mode 100755 index 00000000..f7212f6c --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/es.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'es', { + options: 'Opciones del menú contextual' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/et.js b/scripts/ckeditor/plugins/contextmenu/lang/et.js new file mode 100755 index 00000000..6fa3bf23 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/et.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'et', { + options: 'Kontekstimenüü valikud' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/eu.js b/scripts/ckeditor/plugins/contextmenu/lang/eu.js new file mode 100755 index 00000000..932ed2f5 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/eu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'eu', { + options: 'Testuingurko Menuaren Aukerak' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/fa.js b/scripts/ckeditor/plugins/contextmenu/lang/fa.js new file mode 100755 index 00000000..686e63e9 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/fa.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fa', { + options: 'گزینه​های منوی زمینه' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/fi.js b/scripts/ckeditor/plugins/contextmenu/lang/fi.js new file mode 100755 index 00000000..82806e47 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/fi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fi', { + options: 'Pikavalikon ominaisuudet' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/fo.js b/scripts/ckeditor/plugins/contextmenu/lang/fo.js new file mode 100755 index 00000000..9cfd8bd5 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/fo.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fo', { + options: 'Context Menu Options' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/fr-ca.js b/scripts/ckeditor/plugins/contextmenu/lang/fr-ca.js new file mode 100755 index 00000000..399748f3 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/fr-ca.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fr-ca', { + options: 'Options du menu contextuel' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/fr.js b/scripts/ckeditor/plugins/contextmenu/lang/fr.js new file mode 100755 index 00000000..8360eaca --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/fr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'fr', { + options: 'Options du menu contextuel' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/gl.js b/scripts/ckeditor/plugins/contextmenu/lang/gl.js new file mode 100755 index 00000000..8aa09c32 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/gl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'gl', { + options: 'Opcións do menú contextual' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/gu.js b/scripts/ckeditor/plugins/contextmenu/lang/gu.js new file mode 100755 index 00000000..e8b1fa8d --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/gu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'gu', { + options: 'કોન્તેક્ષ્ત્ મેનુના વિકલ્પો' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/he.js b/scripts/ckeditor/plugins/contextmenu/lang/he.js new file mode 100755 index 00000000..6f4a0a3e --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/he.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'he', { + options: 'אפשרויות תפריט ההקשר' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/hi.js b/scripts/ckeditor/plugins/contextmenu/lang/hi.js new file mode 100755 index 00000000..38a54f4a --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/hi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hi', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/hr.js b/scripts/ckeditor/plugins/contextmenu/lang/hr.js new file mode 100755 index 00000000..11d3d9d8 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/hr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hr', { + options: 'Opcije izbornika' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/hu.js b/scripts/ckeditor/plugins/contextmenu/lang/hu.js new file mode 100755 index 00000000..b96c1627 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/hu.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'hu', { + options: 'Helyi menü opciók' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/id.js b/scripts/ckeditor/plugins/contextmenu/lang/id.js new file mode 100755 index 00000000..817c718c --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/id.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'id', { + options: 'Opsi Konteks Pilihan' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/is.js b/scripts/ckeditor/plugins/contextmenu/lang/is.js new file mode 100755 index 00000000..ab5b9e7e --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/is.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'is', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/it.js b/scripts/ckeditor/plugins/contextmenu/lang/it.js new file mode 100755 index 00000000..58475804 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/it.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'it', { + options: 'Opzioni del menù contestuale' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ja.js b/scripts/ckeditor/plugins/contextmenu/lang/ja.js new file mode 100755 index 00000000..428caefa --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ja.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ja', { + options: 'コンテキストメニューオプション' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ka.js b/scripts/ckeditor/plugins/contextmenu/lang/ka.js new file mode 100755 index 00000000..44f859ff --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ka.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ka', { + options: 'კონტექსტური მენიუს პარამეტრები' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/km.js b/scripts/ckeditor/plugins/contextmenu/lang/km.js new file mode 100755 index 00000000..a61ec6f7 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/km.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'km', { + options: 'ជម្រើស​ម៉ឺនុយ​បរិបទ' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ko.js b/scripts/ckeditor/plugins/contextmenu/lang/ko.js new file mode 100755 index 00000000..d20281ac --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ko.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ko', { + options: '컨텍스트 메뉴 옵션' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ku.js b/scripts/ckeditor/plugins/contextmenu/lang/ku.js new file mode 100755 index 00000000..d5f4b28f --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ku.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ku', { + options: 'هەڵبژاردەی لیستەی کلیکی دەستی ڕاست' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/lt.js b/scripts/ckeditor/plugins/contextmenu/lang/lt.js new file mode 100755 index 00000000..5584169d --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/lt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'lt', { + options: 'Kontekstinio meniu parametrai' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/lv.js b/scripts/ckeditor/plugins/contextmenu/lang/lv.js new file mode 100755 index 00000000..a2ec78ac --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/lv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'lv', { + options: 'Uznirstošās izvēlnes uzstādījumi' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/mk.js b/scripts/ckeditor/plugins/contextmenu/lang/mk.js new file mode 100755 index 00000000..b7d4f82e --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/mk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'mk', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/mn.js b/scripts/ckeditor/plugins/contextmenu/lang/mn.js new file mode 100755 index 00000000..7c9303e1 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/mn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'mn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ms.js b/scripts/ckeditor/plugins/contextmenu/lang/ms.js new file mode 100755 index 00000000..37afeb5f --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ms.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ms', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/nb.js b/scripts/ckeditor/plugins/contextmenu/lang/nb.js new file mode 100755 index 00000000..0c5797b8 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/nb.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'nb', { + options: 'Alternativer for høyreklikkmeny' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/nl.js b/scripts/ckeditor/plugins/contextmenu/lang/nl.js new file mode 100755 index 00000000..43aa679c --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/nl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'nl', { + options: 'Contextmenu opties' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/no.js b/scripts/ckeditor/plugins/contextmenu/lang/no.js new file mode 100755 index 00000000..96d02c58 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/no.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'no', { + options: 'Alternativer for høyreklikkmeny' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/pl.js b/scripts/ckeditor/plugins/contextmenu/lang/pl.js new file mode 100755 index 00000000..dfb51cd3 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/pl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pl', { + options: 'Opcje menu kontekstowego' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/pt-br.js b/scripts/ckeditor/plugins/contextmenu/lang/pt-br.js new file mode 100755 index 00000000..d28c764a --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/pt-br.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pt-br', { + options: 'Opções Menu de Contexto' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/pt.js b/scripts/ckeditor/plugins/contextmenu/lang/pt.js new file mode 100755 index 00000000..90ad6ee8 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/pt.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'pt', { + options: 'Menu de opções de contexto' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ro.js b/scripts/ckeditor/plugins/contextmenu/lang/ro.js new file mode 100755 index 00000000..264a84fb --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ro.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ro', { + options: 'Opțiuni Meniu Contextual' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ru.js b/scripts/ckeditor/plugins/contextmenu/lang/ru.js new file mode 100755 index 00000000..7703c8a2 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ru.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ru', { + options: 'Параметры контекстного меню' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/si.js b/scripts/ckeditor/plugins/contextmenu/lang/si.js new file mode 100755 index 00000000..1731099a --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/si.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'si', { + options: 'අනතර්ග ලේඛණ විකල්ප' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sk.js b/scripts/ckeditor/plugins/contextmenu/lang/sk.js new file mode 100755 index 00000000..c8df781c --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sk', { + options: 'Možnosti kontextového menu' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sl.js b/scripts/ckeditor/plugins/contextmenu/lang/sl.js new file mode 100755 index 00000000..3bc5261e --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sl.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sl', { + options: 'Možnosti Kontekstnega Menija' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sq.js b/scripts/ckeditor/plugins/contextmenu/lang/sq.js new file mode 100755 index 00000000..3ddf46f7 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sq.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sq', { + options: 'Mundësitë e Menysë së Kontekstit' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sr-latn.js b/scripts/ckeditor/plugins/contextmenu/lang/sr-latn.js new file mode 100755 index 00000000..4afee2b3 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sr-latn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sr-latn', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sr.js b/scripts/ckeditor/plugins/contextmenu/lang/sr.js new file mode 100755 index 00000000..fb7f0d82 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sr', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/sv.js b/scripts/ckeditor/plugins/contextmenu/lang/sv.js new file mode 100755 index 00000000..fb94a7fa --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/sv.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'sv', { + options: 'Context Menu Options' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/th.js b/scripts/ckeditor/plugins/contextmenu/lang/th.js new file mode 100755 index 00000000..d18524d1 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/th.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'th', { + options: 'Context Menu Options' // MISSING +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/tr.js b/scripts/ckeditor/plugins/contextmenu/lang/tr.js new file mode 100755 index 00000000..3c755588 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/tr.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'tr', { + options: 'İçerik Menüsü Seçenekleri' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/ug.js b/scripts/ckeditor/plugins/contextmenu/lang/ug.js new file mode 100755 index 00000000..652c1305 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/ug.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'ug', { + options: 'قىسقا يول تىزىملىك تاللانمىسى' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/uk.js b/scripts/ckeditor/plugins/contextmenu/lang/uk.js new file mode 100755 index 00000000..316d858f --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/uk.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'uk', { + options: 'Опції контекстного меню' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/vi.js b/scripts/ckeditor/plugins/contextmenu/lang/vi.js new file mode 100755 index 00000000..f6264d14 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/vi.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'vi', { + options: 'Tùy chọn menu bổ xung' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/zh-cn.js b/scripts/ckeditor/plugins/contextmenu/lang/zh-cn.js new file mode 100755 index 00000000..b5943e00 --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/zh-cn.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'zh-cn', { + options: '快捷菜单选项' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/lang/zh.js b/scripts/ckeditor/plugins/contextmenu/lang/zh.js new file mode 100755 index 00000000..b92e49ef --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/lang/zh.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang( 'contextmenu', 'zh', { + options: '內容功能表選項' +} ); diff --git a/scripts/ckeditor/plugins/contextmenu/plugin.js b/scripts/ckeditor/plugins/contextmenu/plugin.js new file mode 100755 index 00000000..57c384bc --- /dev/null +++ b/scripts/ckeditor/plugins/contextmenu/plugin.js @@ -0,0 +1,156 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'contextmenu', { + requires: 'menu', + lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + + // Make sure the base class (CKEDITOR.menu) is loaded before it (#3318). + onLoad: function() { + /** + * Class replacing the non-configurable native context menu with configurable CKEditor's equivalent. + * + * @class + * @extends CKEDITOR.menu + */ + CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass( { + base: CKEDITOR.menu, + + /** + * Creates the CKEDITOR.plugins.contextMenu class instance. + * + * @constructor + * @param {CKEDITOR.editor} editor + */ + $: function( editor ) { + this.base.call( this, editor, { + panel: { + className: 'cke_menu_panel', + attributes: { + 'aria-label': editor.lang.contextmenu.options + } + } + } ); + }, + + proto: { + /** + * Starts watching on native context menu triggers (option key, right click) on given element. + * + * @param {CKEDITOR.dom.element} element + * @param {Boolean} [nativeContextMenuOnCtrl] Whether to open native context menu if + * *Ctrl* key is hold on opening the context menu. See {@link CKEDITOR.config#browserContextMenuOnCtrl}. + */ + addTarget: function( element, nativeContextMenuOnCtrl ) { + element.on( 'contextmenu', function( event ) { + var domEvent = event.data, + isCtrlKeyDown = + // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event, + // which make this property unreliable. (#4826) + ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) ); + + if ( nativeContextMenuOnCtrl && isCtrlKeyDown ) + return; + + // Cancel the browser context menu. + domEvent.preventDefault(); + + // Fix selection when non-editable element in Webkit/Blink (Mac) (#11306). + if ( CKEDITOR.env.mac && CKEDITOR.env.webkit ) { + var editor = this.editor, + contentEditableParent = new CKEDITOR.dom.elementPath( domEvent.getTarget(), editor.editable() ).contains( function( el ) { + // Return when non-editable or nested editable element is found. + return el.hasAttribute( 'contenteditable' ); + }, true ); // Exclude editor's editable. + + // Fake selection for non-editables only (to exclude nested editables). + if ( contentEditableParent && contentEditableParent.getAttribute( 'contenteditable' ) == 'false' ) + editor.getSelection().fake( contentEditableParent ); + } + + var doc = domEvent.getTarget().getDocument(), + offsetParent = domEvent.getTarget().getDocument().getDocumentElement(), + fromFrame = !doc.equals( CKEDITOR.document ), + scroll = doc.getWindow().getScrollPosition(), + offsetX = fromFrame ? domEvent.$.clientX : domEvent.$.pageX || scroll.x + domEvent.$.clientX, + offsetY = fromFrame ? domEvent.$.clientY : domEvent.$.pageY || scroll.y + domEvent.$.clientY; + + CKEDITOR.tools.setTimeout( function() { + this.open( offsetParent, null, offsetX, offsetY ); + + // IE needs a short while to allow selection change before opening menu. (#7908) + }, CKEDITOR.env.ie ? 200 : 0, this ); + }, this ); + + if ( CKEDITOR.env.webkit ) { + var holdCtrlKey, + onKeyDown = function( event ) { + holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey; + }, + resetOnKeyUp = function() { + holdCtrlKey = 0; + }; + + element.on( 'keydown', onKeyDown ); + element.on( 'keyup', resetOnKeyUp ); + element.on( 'contextmenu', resetOnKeyUp ); + } + }, + + /** + * Opens context menu in given location. See the {@link CKEDITOR.menu#show} method. + * + * @param {CKEDITOR.dom.element} offsetParent + * @param {Number} [corner] + * @param {Number} [offsetX] + * @param {Number} [offsetY] + */ + open: function( offsetParent, corner, offsetX, offsetY ) { + this.editor.focus(); + offsetParent = offsetParent || CKEDITOR.document.getDocumentElement(); + + // #9362: Force selection check to update commands' states in the new context. + this.editor.selectionChange( 1 ); + + this.show( offsetParent, corner, offsetX, offsetY ); + } + } + } ); + }, + + beforeInit: function( editor ) { + /** + * @readonly + * @property {CKEDITOR.plugins.contextMenu} contextMenu + * @member CKEDITOR.editor + */ + var contextMenu = editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor ); + + editor.on( 'contentDom', function() { + contextMenu.addTarget( editor.editable(), editor.config.browserContextMenuOnCtrl !== false ); + } ); + + editor.addCommand( 'contextMenu', { + exec: function() { + editor.contextMenu.open( editor.document.getBody() ); + } + } ); + + editor.setKeystroke( CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ); + editor.setKeystroke( CKEDITOR.CTRL + CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ); + } +} ); + +/** + * Whether to show the browser native context menu when the *Ctrl* or + * *Meta* (Mac) key is pressed on opening the context menu with the + * right mouse button click or the *Menu* key. + * + * config.browserContextMenuOnCtrl = false; + * + * @since 3.0.2 + * @cfg {Boolean} [browserContextMenuOnCtrl=true] + * @member CKEDITOR.config + */ diff --git a/scripts/ckeditor/plugins/dialog/dialogDefinition.js b/scripts/ckeditor/plugins/dialog/dialogDefinition.js new file mode 100755 index 00000000..9d51fcf0 --- /dev/null +++ b/scripts/ckeditor/plugins/dialog/dialogDefinition.js @@ -0,0 +1,1006 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview Defines the "virtual" dialog, dialog content and dialog button + * definition classes. + */ + +/** + * The definition of a dialog window. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialogs. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * CKEDITOR.dialog.add( 'testOnly', function( editor ) { + * return { + * title: 'Test Dialog', + * resizable: CKEDITOR.DIALOG_RESIZE_BOTH, + * minWidth: 500, + * minHeight: 400, + * contents: [ + * { + * id: 'tab1', + * label: 'First Tab', + * title: 'First Tab Title', + * accessKey: 'Q', + * elements: [ + * { + * type: 'text', + * label: 'Test Text 1', + * id: 'testText1', + * 'default': 'hello world!' + * } + * ] + * } + * ] + * }; + * } ); + * + * @class CKEDITOR.dialog.definition + */ + +/** + * The dialog title, displayed in the dialog's header. Required. + * + * @property {String} title + */ + +/** + * How the dialog can be resized, must be one of the four contents defined below. + * + * * {@link CKEDITOR#DIALOG_RESIZE_NONE} + * * {@link CKEDITOR#DIALOG_RESIZE_WIDTH} + * * {@link CKEDITOR#DIALOG_RESIZE_HEIGHT} + * * {@link CKEDITOR#DIALOG_RESIZE_BOTH} + * + * @property {Number} [resizable=CKEDITOR.DIALOG_RESIZE_NONE] + */ + +/** + * The minimum width of the dialog, in pixels. + * + * @property {Number} [minWidth=600] + */ + +/** + * The minimum height of the dialog, in pixels. + * + * @property {Number} [minHeight=400] + */ + + +/** + * The initial width of the dialog, in pixels. + * + * @since 3.5.3 + * @property {Number} [width=CKEDITOR.dialog.definition#minWidth] + */ + +/** + * The initial height of the dialog, in pixels. + * + * @since 3.5.3 + * @property {Number} [height=CKEDITOR.dialog.definition.minHeight] + */ + +/** + * The buttons in the dialog, defined as an array of + * {@link CKEDITOR.dialog.definition.button} objects. + * + * @property {Array} [buttons=[ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]] + */ + +/** + * The contents in the dialog, defined as an array of + * {@link CKEDITOR.dialog.definition.content} objects. Required. + * + * @property {Array} contents + */ + +/** + * The function to execute when OK is pressed. + * + * @property {Function} onOk + */ + +/** + * The function to execute when Cancel is pressed. + * + * @property {Function} onCancel + */ + +/** + * The function to execute when the dialog is displayed for the first time. + * + * @property {Function} onLoad + */ + +/** + * The function to execute when the dialog is loaded (executed every time the dialog is opened). + * + * @property {Function} onShow + */ + +/** + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog content pages. + * + * @class CKEDITOR.dialog.definition.content. + */ + +/** + * The id of the content page. + * + * @property {String} id + */ + +/** + * The tab label of the content page. + * + * @property {String} label + */ + +/** + * The popup message of the tab label. + * + * @property {String} title + */ + +/** + * The CTRL hotkey for switching to the tab. + * + * contentDefinition.accessKey = 'Q'; // Switch to this page when CTRL-Q is pressed. + * + * @property {String} accessKey + */ + +/** + * The UI elements contained in this content page, defined as an array of + * {@link CKEDITOR.dialog.definition.uiElement} objects. + * + * @property {Array} elements + */ + +/** + * The definition of user interface element (textarea, radio etc). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog UI elements. + * + * @class CKEDITOR.dialog.definition.uiElement + * @see CKEDITOR.ui.dialog.uiElement + */ + +/** + * The id of the UI element. + * + * @property {String} id + */ + +/** + * The type of the UI element. Required. + * + * @property {String} type + */ + +/** + * The popup label of the UI element. + * + * @property {String} title + */ + +/** + * The content that needs to be allowed to enable this UI element. + * All formats accepted by {@link CKEDITOR.filter#check} may be used. + * + * When all UI elements in a tab are disabled, this tab will be disabled automatically. + * + * @property {String/Object/CKEDITOR.style} requiredContent + */ + +/** + * CSS class names to append to the UI element. + * + * @property {String} className + */ + +/** + * Inline CSS classes to append to the UI element. + * + * @property {String} style + */ + +/** + * Horizontal alignment (in container) of the UI element. + * + * @property {String} align + */ + +/** + * Function to execute the first time the UI element is displayed. + * + * @property {Function} onLoad + */ + +/** + * Function to execute whenever the UI element's parent dialog is displayed. + * + * @property {Function} onShow + */ + +/** + * Function to execute whenever the UI element's parent dialog is closed. + * + * @property {Function} onHide + */ + +/** + * Function to execute whenever the UI element's parent + * dialog's {@link CKEDITOR.dialog#setupContent} method is executed. + * It usually takes care of the respective UI element as a standalone element. + * + * @property {Function} setup + */ + +/** + * Function to execute whenever the UI element's parent + * dialog's {@link CKEDITOR.dialog#commitContent} method is executed. + * It usually takes care of the respective UI element as a standalone element. + * + * @property {Function} commit + */ + +// ----- hbox ----------------------------------------------------------------- + +/** + * Horizontal layout box for dialog UI elements, auto-expends to available width of container. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create horizontal layouts. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.hbox} object and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'hbox', + * widths: [ '25%', '25%', '50%' ], + * children: [ + * { + * type: 'text', + * id: 'id1', + * width: '40px', + * }, + * { + * type: 'text', + * id: 'id2', + * width: '40px', + * }, + * { + * type: 'text', + * id: 'id3' + * } + * ] + * } + * + * @class CKEDITOR.dialog.definition.hbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * + * @property {Array} children + */ + +/** + * (Optional) The widths of child cells. + * + * @property {Array} widths + */ + +/** + * (Optional) The height of the layout. + * + * @property {Number} height + */ + +/** + * The CSS styles to apply to this element. + * + * @property {String} styles + */ + +/** + * (Optional) The padding width inside child cells. Example: 0, 1. + * + * @property {Number} padding + */ + +/** + * (Optional) The alignment of the whole layout. Example: center, top. + * + * @property {String} align + */ + +// ----- vbox ----------------------------------------------------------------- + +/** + * Vertical layout box for dialog UI elements. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create vertical layouts. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.vbox} object and can + * be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'vbox', + * align: 'right', + * width: '200px', + * children: [ + * { + * type: 'text', + * id: 'age', + * label: 'Age' + * }, + * { + * type: 'text', + * id: 'sex', + * label: 'Sex' + * }, + * { + * type: 'text', + * id: 'nationality', + * label: 'Nationality' + * } + * ] + * } + * + * @class CKEDITOR.dialog.definition.vbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * + * @property {Array} children + */ + +/** + * (Optional) The width of the layout. + * + * @property {Array} width + */ + +/** + * (Optional) The heights of individual cells. + * + * @property {Number} heights + */ + +/** + * The CSS styles to apply to this element. + * + * @property {String} styles + */ + +/** + * (Optional) The padding width inside child cells. Example: 0, 1. + * + * @property {Number} padding + */ + +/** + * (Optional) The alignment of the whole layout. Example: center, top. + * + * @property {String} align + */ + +/** + * (Optional) Whether the layout should expand vertically to fill its container. + * + * @property {Boolean} expand + */ + +// ----- labeled element ------------------------------------------------------ + +/** + * The definition of labeled user interface element (textarea, textInput etc). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create dialog UI elements. + * + * @class CKEDITOR.dialog.definition.labeledElement + * @extends CKEDITOR.dialog.definition.uiElement + * @see CKEDITOR.ui.dialog.labeledElement + */ + +/** + * The label of the UI element. + * + * { + * type: 'text', + * label: 'My Label' + * } + * + * @property {String} label + */ + +/** + * (Optional) Specify the layout of the label. Set to `'horizontal'` for horizontal layout. + * The default layout is vertical. + * + * { + * type: 'text', + * label: 'My Label', + * labelLayout: 'horizontal' + * } + * + * @property {String} labelLayout + */ + +/** + * (Optional) Applies only to horizontal layouts: a two elements array of lengths to specify the widths of the + * label and the content element. See also {@link CKEDITOR.dialog.definition.labeledElement#labelLayout}. + * + * { + * type: 'text', + * label: 'My Label', + * labelLayout: 'horizontal', + * widths: [100, 200] + * } + * + * @property {Array} widths + */ + +/** + * Specify the inline style of the uiElement label. + * + * { + * type: 'text', + * label: 'My Label', + * labelStyle: 'color: red' + * } + * + * @property {String} labelStyle + */ + + +/** + * Specify the inline style of the input element. + * + * { + * type: 'text', + * label: 'My Label', + * inputStyle: 'text-align: center' + * } + * + * @since 3.6.1 + * @property {String} inputStyle + */ + +/** + * Specify the inline style of the input element container. + * + * { + * type: 'text', + * label: 'My Label', + * controlStyle: 'width: 3em' + * } + * + * @since 3.6.1 + * @property {String} controlStyle + */ + +// ----- button --------------------------------------------------------------- + +/** + * The definition of a button. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.button} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'button', + * id: 'buttonId', + * label: 'Click me', + * title: 'My title', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.button + * alert( 'Clicked: ' + this.id ); + * } + * } + * + * @class CKEDITOR.dialog.definition.button + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * Whether the button is disabled. + * + * @property {Boolean} disabled + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +// ----- checkbox ------ +/** + * The definition of a checkbox element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create groups of checkbox buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.checkbox} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'checkbox', + * id: 'agree', + * label: 'I agree', + * 'default': 'checked', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.checkbox + * alert( 'Checked: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.checkbox + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +/** + * The default state. + * + * @property {String} [default='' (unchecked)] + */ + +// ----- file ----------------------------------------------------------------- + +/** + * The definition of a file upload input. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create file upload elements. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.file} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'file', + * id: 'upload', + * label: 'Select file from your computer', + * size: 38 + * }, + * { + * type: 'fileButton', + * id: 'fileId', + * label: 'Upload file', + * 'for': [ 'tab1', 'upload' ], + * filebrowser: { + * onSelect: function( fileUrl, data ) { + * alert( 'Successfully uploaded: ' + fileUrl ); + * } + * } + * } + * + * @class CKEDITOR.dialog.definition.file + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * (Optional) The action attribute of the form element associated with this file upload input. + * If empty, CKEditor will use path to server connector for currently opened folder. + * + * @property {String} action + */ + +/** + * The size of the UI element. + * + * @property {Number} size + */ + +// ----- fileButton ----------------------------------------------------------- + +/** + * The definition of a button for submitting the file in a file upload input. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create a button for submitting the file in a file upload input. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.fileButton} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * @class CKEDITOR.dialog.definition.fileButton + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The label of the UI element. + * + * @property {String} label + */ + +/** + * The instruction for CKEditor how to deal with file upload. + * By default, the file and fileButton elements will not work "as expected" if this attribute is not set. + * + * // Update field with id 'txtUrl' in the 'tab1' tab when file is uploaded. + * filebrowser: 'tab1:txtUrl' + * + * // Call custom onSelect function when file is successfully uploaded. + * filebrowser: { + * onSelect: function( fileUrl, data ) { + * alert( 'Successfully uploaded: ' + fileUrl ); + * } + * } + * + * @property {String} filebrowser/Object + */ + +/** + * An array that contains pageId and elementId of the file upload input element for which this button is created. + * + * [ pageId, elementId ] + * + * @property {String} for + */ + +// ----- html ----------------------------------------------------------------- + +/** + * The definition of a raw HTML element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create elements made from raw HTML code. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.html} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * To access HTML elements use {@link CKEDITOR.dom.document#getById}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example 1: + * { + * type: 'html', + * html: '

This is some sample HTML content.

' + * } + * + * // Example 2: + * // Complete sample with document.getById() call when the "Ok" button is clicked. + * var dialogDefinition = { + * title: 'Sample dialog', + * minWidth: 300, + * minHeight: 200, + * onOk: function() { + * // "this" is now a CKEDITOR.dialog object. + * var document = this.getElement().getDocument(); + * // document = CKEDITOR.dom.document + * var element = document.getById( 'myDiv' ); + * if ( element ) + * alert( element.getHtml() ); + * }, + * contents: [ + * { + * id: 'tab1', + * label: '', + * title: '', + * elements: [ + * { + * type: 'html', + * html: '
Sample text.
Another div.
' + * } + * ] + * } + * ], + * buttons: [ CKEDITOR.dialog.cancelButton, CKEDITOR.dialog.okButton ] + * }; + * + * @class CKEDITOR.dialog.definition.html + * @extends CKEDITOR.dialog.definition.uiElement + */ + +/** + * (Required) HTML code of this element. + * + * @property {String} html + */ + +// ----- radio ---------------------------------------------------------------- + +/** + * The definition of a radio group. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create groups of radio buttons. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.radio} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'radio', + * id: 'country', + * label: 'Which country is bigger', + * items: [ [ 'France', 'FR' ], [ 'Germany', 'DE' ] ], + * style: 'color: green', + * 'default': 'DE', + * onClick: function() { + * // this = CKEDITOR.ui.dialog.radio + * alert( 'Current value: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.radio + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. + * If `'Value'` is missing, then the value would be assumed to be the same as the description. + * + * @property {Array} items + */ + +// ----- selectElement -------------------------------------------------------- + +/** + * The definition of a select element. + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create select elements. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.select} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * // Example: + * { + * type: 'select', + * id: 'sport', + * label: 'Select your favourite sport', + * items: [ [ 'Basketball' ], [ 'Baseball' ], [ 'Hockey' ], [ 'Football' ] ], + * 'default': 'Football', + * onChange: function( api ) { + * // this = CKEDITOR.ui.dialog.select + * alert( 'Current value: ' + this.getValue() ); + * } + * } + * + * @class CKEDITOR.dialog.definition.select + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * An array of options. Each option is a 1- or 2-item array of format `[ 'Description', 'Value' ]`. + * If `'Value'` is missing, then the value would be assumed to be the same as the description. + * + * @property {Array} items + */ + +/** + * (Optional) Set this to true if you'd like to have a multiple-choice select box. + * + * @property {Boolean} [multiple=false] + */ + +/** + * (Optional) The number of items to display in the select box. + * + * @property {Number} size + */ + +// ----- textInput ------------------------------------------------------------ + +/** + * The definition of a text field (single line). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create text fields. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textInput} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * + * // There is no constructor for this class, the user just has to define an + * // object with the appropriate properties. + * + * { + * type: 'text', + * id: 'name', + * label: 'Your name', + * 'default': '', + * validate: function() { + * if ( !this.getValue() ) { + * api.openMsgDialog( '', 'Name cannot be empty.' ); + * return false; + * } + * } + * } + * + * @class CKEDITOR.dialog.definition.textInput + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The default value. + * + * @property {String} default + */ + +/** + * (Optional) The maximum length. + * + * @property {Number} maxLength + */ + +/** + * (Optional) The size of the input field. + * + * @property {Number} size + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +// ----- textarea ------------------------------------------------------------- + +/** + * The definition of a text field (multiple lines). + * + * This class is not really part of the API. It just illustrates the properties + * that developers can use to define and create textarea. + * + * Once the dialog is opened, the created element becomes a {@link CKEDITOR.ui.dialog.textarea} object + * and can be accessed with {@link CKEDITOR.dialog#getContentElement}. + * + * For a complete example of dialog definition, please check {@link CKEDITOR.dialog#add}. + * +* // There is no constructor for this class, the user just has to define an +* // object with the appropriate properties. +* +* // Example: +* { +* type: 'textarea', +* id: 'message', +* label: 'Your comment', +* 'default': '', +* validate: function() { +* if ( this.getValue().length < 5 ) { +* api.openMsgDialog( 'The comment is too short.' ); +* return false; +* } +* } +* } + * + * @class CKEDITOR.dialog.definition.textarea + * @extends CKEDITOR.dialog.definition.labeledElement + */ + +/** + * The number of rows. + * + * @property {Number} rows + */ + +/** + * The number of columns. + * + * @property {Number} cols + */ + +/** + * (Optional) The validation function. + * + * @property {Function} validate + */ + +/** + * The default value. + * + * @property {String} default + */ diff --git a/scripts/ckeditor/plugins/dialog/plugin.js b/scripts/ckeditor/plugins/dialog/plugin.js new file mode 100755 index 00000000..1d0753db --- /dev/null +++ b/scripts/ckeditor/plugins/dialog/plugin.js @@ -0,0 +1,3254 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The floating dialog plugin. + */ + +/** + * No resize for this dialog. + * + * @readonly + * @property {Number} [=0] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_NONE = 0; + +/** + * Only allow horizontal resizing for this dialog, disable vertical resizing. + * + * @readonly + * @property {Number} [=1] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_WIDTH = 1; + +/** + * Only allow vertical resizing for this dialog, disable horizontal resizing. + * + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_HEIGHT = 2; + +/** + * Allow the dialog to be resized in both directions. + * + * @readonly + * @property {Number} [=3] + * @member CKEDITOR + */ +CKEDITOR.DIALOG_RESIZE_BOTH = 3; + +( function() { + var cssLength = CKEDITOR.tools.cssLength; + + function isTabVisible( tabId ) { + return !!this._.tabs[ tabId ][ 0 ].$.offsetHeight; + } + + function getPreviousVisibleTab() { + var tabId = this._.currentTabId, + length = this._.tabIdList.length, + tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ) + length; + + for ( var i = tabIndex - 1; i > tabIndex - length; i-- ) { + if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) + return this._.tabIdList[ i % length ]; + } + + return null; + } + + function getNextVisibleTab() { + var tabId = this._.currentTabId, + length = this._.tabIdList.length, + tabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, tabId ); + + for ( var i = tabIndex + 1; i < tabIndex + length; i++ ) { + if ( isTabVisible.call( this, this._.tabIdList[ i % length ] ) ) + return this._.tabIdList[ i % length ]; + } + + return null; + } + + + function clearOrRecoverTextInputValue( container, isRecover ) { + var inputs = container.$.getElementsByTagName( 'input' ); + for ( var i = 0, length = inputs.length; i < length; i++ ) { + var item = new CKEDITOR.dom.element( inputs[ i ] ); + + if ( item.getAttribute( 'type' ).toLowerCase() == 'text' ) { + if ( isRecover ) { + item.setAttribute( 'value', item.getCustomData( 'fake_value' ) || '' ); + item.removeCustomData( 'fake_value' ); + } else { + item.setCustomData( 'fake_value', item.getAttribute( 'value' ) ); + item.setAttribute( 'value', '' ); + } + } + } + } + + // Handle dialog element validation state UI changes. + function handleFieldValidated( isValid, msg ) { + var input = this.getInputElement(); + if ( input ) + isValid ? input.removeAttribute( 'aria-invalid' ) : input.setAttribute( 'aria-invalid', true ); + + if ( !isValid ) { + if ( this.select ) + this.select(); + else + this.focus(); + } + + msg && alert( msg ); + + this.fire( 'validated', { valid: isValid, msg: msg } ); + } + + function resetField() { + var input = this.getInputElement(); + input && input.removeAttribute( 'aria-invalid' ); + } + + var templateSource = ''; + + function buildDialog( editor ) { + var element = CKEDITOR.dom.element.createFromHtml( CKEDITOR.addTemplate( 'dialog', templateSource ).output( { + id: CKEDITOR.tools.getNextNumber(), + editorId: editor.id, + langDir: editor.lang.dir, + langCode: editor.langCode, + editorDialogClass: 'cke_editor_' + editor.name.replace( /\./g, '\\.' ) + '_dialog', + closeTitle: editor.lang.common.close, + hidpi: CKEDITOR.env.hidpi ? 'cke_hidpi' : '' + } ) ); + + // TODO: Change this to getById(), so it'll support custom templates. + var body = element.getChild( [ 0, 0, 0, 0, 0 ] ), + title = body.getChild( 0 ), + close = body.getChild( 1 ); + + // IFrame shim for dialog that masks activeX in IE. (#7619) + if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks ) { + var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', + iframe = CKEDITOR.dom.element.createFromHtml( '' ); + iframe.appendTo( body.getParent() ); + } + + // Make the Title and Close Button unselectable. + title.unselectable(); + close.unselectable(); + + return { + element: element, + parts: { + dialog: element.getChild( 0 ), + title: title, + close: close, + tabs: body.getChild( 2 ), + contents: body.getChild( [ 3, 0, 0, 0 ] ), + footer: body.getChild( [ 3, 0, 1, 0 ] ) + } + }; + } + + /** + * This is the base class for runtime dialog objects. An instance of this + * class represents a single named dialog for a single editor instance. + * + * var dialogObj = new CKEDITOR.dialog( editor, 'smiley' ); + * + * @class + * @constructor Creates a dialog class instance. + * @param {Object} editor The editor which created the dialog. + * @param {String} dialogName The dialog's registered name. + */ + CKEDITOR.dialog = function( editor, dialogName ) { + // Load the dialog definition. + var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ], + defaultDefinition = CKEDITOR.tools.clone( defaultDialogDefinition ), + buttonsOrder = editor.config.dialog_buttonsOrder || 'OS', + dir = editor.lang.dir, + tabsToRemove = {}, + i, processed, stopPropagation; + + if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (#4750) + ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) ) + defaultDefinition.buttons.reverse(); + + + // Completes the definition with the default values. + definition = CKEDITOR.tools.extend( definition( editor ), defaultDefinition ); + + // Clone a functionally independent copy for this dialog. + definition = CKEDITOR.tools.clone( definition ); + + // Create a complex definition object, extending it with the API + // functions. + definition = new definitionObject( this, definition ); + + var doc = CKEDITOR.document; + + var themeBuilt = buildDialog( editor ); + + // Initialize some basic parameters. + this._ = { + editor: editor, + element: themeBuilt.element, + name: dialogName, + contentSize: { width: 0, height: 0 }, + size: { width: 0, height: 0 }, + contents: {}, + buttons: {}, + accessKeyMap: {}, + + // Initialize the tab and page map. + tabs: {}, + tabIdList: [], + currentTabId: null, + currentTabIndex: null, + pageCount: 0, + lastTab: null, + tabBarMode: false, + + // Initialize the tab order array for input widgets. + focusList: [], + currentFocusIndex: 0, + hasFocus: false + }; + + this.parts = themeBuilt.parts; + + CKEDITOR.tools.setTimeout( function() { + editor.fire( 'ariaWidget', this.parts.contents ); + }, 0, this ); + + // Set the startup styles for the dialog, avoiding it enlarging the + // page size on the dialog creation. + var startStyles = { + position: CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed', + top: 0, + visibility: 'hidden' + }; + + startStyles[ dir == 'rtl' ? 'right' : 'left' ] = 0; + this.parts.dialog.setStyles( startStyles ); + + + // Call the CKEDITOR.event constructor to initialize this instance. + CKEDITOR.event.call( this ); + + // Fire the "dialogDefinition" event, making it possible to customize + // the dialog definition. + this.definition = definition = CKEDITOR.fire( 'dialogDefinition', { + name: dialogName, + definition: definition + }, editor ).definition; + + // Cache tabs that should be removed. + if ( !( 'removeDialogTabs' in editor._ ) && editor.config.removeDialogTabs ) { + var removeContents = editor.config.removeDialogTabs.split( ';' ); + + for ( i = 0; i < removeContents.length; i++ ) { + var parts = removeContents[ i ].split( ':' ); + if ( parts.length == 2 ) { + var removeDialogName = parts[ 0 ]; + if ( !tabsToRemove[ removeDialogName ] ) + tabsToRemove[ removeDialogName ] = []; + tabsToRemove[ removeDialogName ].push( parts[ 1 ] ); + } + } + editor._.removeDialogTabs = tabsToRemove; + } + + // Remove tabs of this dialog. + if ( editor._.removeDialogTabs && ( tabsToRemove = editor._.removeDialogTabs[ dialogName ] ) ) { + for ( i = 0; i < tabsToRemove.length; i++ ) + definition.removeContents( tabsToRemove[ i ] ); + } + + // Initialize load, show, hide, ok and cancel events. + if ( definition.onLoad ) + this.on( 'load', definition.onLoad ); + + if ( definition.onShow ) + this.on( 'show', definition.onShow ); + + if ( definition.onHide ) + this.on( 'hide', definition.onHide ); + + if ( definition.onOk ) { + this.on( 'ok', function( evt ) { + // Dialog confirm might probably introduce content changes (#5415). + editor.fire( 'saveSnapshot' ); + setTimeout( function() { + editor.fire( 'saveSnapshot' ); + }, 0 ); + if ( definition.onOk.call( this, evt ) === false ) + evt.data.hide = false; + } ); + } + + if ( definition.onCancel ) { + this.on( 'cancel', function( evt ) { + if ( definition.onCancel.call( this, evt ) === false ) + evt.data.hide = false; + } ); + } + + var me = this; + + // Iterates over all items inside all content in the dialog, calling a + // function for each of them. + var iterContents = function( func ) { + var contents = me._.contents, + stop = false; + + for ( var i in contents ) { + for ( var j in contents[ i ] ) { + stop = func.call( this, contents[ i ][ j ] ); + if ( stop ) + return; + } + } + }; + + this.on( 'ok', function( evt ) { + iterContents( function( item ) { + if ( item.validate ) { + var retval = item.validate( this ), + invalid = typeof( retval ) == 'string' || retval === false; + + if ( invalid ) { + evt.data.hide = false; + evt.stop(); + } + + handleFieldValidated.call( item, !invalid, typeof retval == 'string' ? retval : undefined ); + return invalid; + } + } ); + }, this, null, 0 ); + + this.on( 'cancel', function( evt ) { + iterContents( function( item ) { + if ( item.isChanged() ) { + if ( !editor.config.dialog_noConfirmCancel && !confirm( editor.lang.common.confirmCancel ) ) + evt.data.hide = false; + return true; + } + } ); + }, this, null, 0 ); + + this.parts.close.on( 'click', function( evt ) { + if ( this.fire( 'cancel', { hide: true } ).hide !== false ) + this.hide(); + evt.data.preventDefault(); + }, this ); + + // Sort focus list according to tab order definitions. + function setupFocus() { + var focusList = me._.focusList; + focusList.sort( function( a, b ) { + // Mimics browser tab order logics; + if ( a.tabIndex != b.tabIndex ) + return b.tabIndex - a.tabIndex; + // Sort is not stable in some browsers, + // fall-back the comparator to 'focusIndex'; + else + return a.focusIndex - b.focusIndex; + } ); + + var size = focusList.length; + for ( var i = 0; i < size; i++ ) + focusList[ i ].focusIndex = i; + } + + function changeFocus( offset ) { + var focusList = me._.focusList; + offset = offset || 0; + + if ( focusList.length < 1 ) + return; + + var current = me._.currentFocusIndex; + + // Trigger the 'blur' event of any input element before anything, + // since certain UI updates may depend on it. + try { + focusList[ current ].getInputElement().$.blur(); + } catch ( e ) {} + + var startIndex = ( current + offset + focusList.length ) % focusList.length, + currentIndex = startIndex; + while ( offset && !focusList[ currentIndex ].isFocusable() ) { + currentIndex = ( currentIndex + offset + focusList.length ) % focusList.length; + if ( currentIndex == startIndex ) + break; + } + + focusList[ currentIndex ].focus(); + + // Select whole field content. + if ( focusList[ currentIndex ].type == 'text' ) + focusList[ currentIndex ].select(); + } + + this.changeFocus = changeFocus; + + + function keydownHandler( evt ) { + // If I'm not the top dialog, ignore. + if ( me != CKEDITOR.dialog._.currentTop ) + return; + + var keystroke = evt.data.getKeystroke(), + rtl = editor.lang.dir == 'rtl', + button; + + processed = stopPropagation = 0; + + if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 ) { + var shiftPressed = ( keystroke == CKEDITOR.SHIFT + 9 ); + + // Handling Tab and Shift-Tab. + if ( me._.tabBarMode ) { + // Change tabs. + var nextId = shiftPressed ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me ); + me.selectPage( nextId ); + me._.tabs[ nextId ][ 0 ].focus(); + } else { + // Change the focus of inputs. + changeFocus( shiftPressed ? -1 : 1 ); + } + + processed = 1; + } else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode && me.getPageCount() > 1 ) { + // Alt-F10 puts focus into the current tab item in the tab bar. + me._.tabBarMode = true; + me._.tabs[ me._.currentTabId ][ 0 ].focus(); + processed = 1; + } else if ( ( keystroke == 37 || keystroke == 39 ) && me._.tabBarMode ) { + // Arrow keys - used for changing tabs. + nextId = ( keystroke == ( rtl ? 39 : 37 ) ? getPreviousVisibleTab.call( me ) : getNextVisibleTab.call( me ) ); + me.selectPage( nextId ); + me._.tabs[ nextId ][ 0 ].focus(); + processed = 1; + } else if ( ( keystroke == 13 || keystroke == 32 ) && me._.tabBarMode ) { + this.selectPage( this._.currentTabId ); + this._.tabBarMode = false; + this._.currentFocusIndex = -1; + changeFocus( 1 ); + processed = 1; + } + // If user presses enter key in a text box, it implies clicking OK for the dialog. + else if ( keystroke == 13 /*ENTER*/ ) { + // Don't do that for a target that handles ENTER. + var target = evt.data.getTarget(); + if ( !target.is( 'a', 'button', 'select', 'textarea' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) ) { + button = this.getButton( 'ok' ); + button && CKEDITOR.tools.setTimeout( button.click, 0, button ); + processed = 1; + } + stopPropagation = 1; // Always block the propagation (#4269) + } else if ( keystroke == 27 /*ESC*/ ) { + button = this.getButton( 'cancel' ); + + // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog. + if ( button ) + CKEDITOR.tools.setTimeout( button.click, 0, button ); + else { + if ( this.fire( 'cancel', { hide: true } ).hide !== false ) + this.hide(); + } + stopPropagation = 1; // Always block the propagation (#4269) + } else + return; + + keypressHandler( evt ); + } + + function keypressHandler( evt ) { + if ( processed ) + evt.data.preventDefault( 1 ); + else if ( stopPropagation ) + evt.data.stopPropagation(); + } + + var dialogElement = this._.element; + + editor.focusManager.add( dialogElement, 1 ); + + // Add the dialog keyboard handlers. + this.on( 'show', function() { + dialogElement.on( 'keydown', keydownHandler, this ); + + // Some browsers instead, don't cancel key events in the keydown, but in the + // keypress. So we must do a longer trip in those cases. (#4531,#8985) + if ( CKEDITOR.env.gecko ) + dialogElement.on( 'keypress', keypressHandler, this ); + + } ); + this.on( 'hide', function() { + dialogElement.removeListener( 'keydown', keydownHandler ); + if ( CKEDITOR.env.gecko ) + dialogElement.removeListener( 'keypress', keypressHandler ); + + // Reset fields state when closing dialog. + iterContents( function( item ) { + resetField.apply( item ); + } ); + } ); + this.on( 'iframeAdded', function( evt ) { + var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document ); + doc.on( 'keydown', keydownHandler, this, null, 0 ); + } ); + + // Auto-focus logic in dialog. + this.on( 'show', function() { + // Setup tabIndex on showing the dialog instead of on loading + // to allow dynamic tab order happen in dialog definition. + setupFocus(); + + if ( editor.config.dialog_startupFocusTab && me._.pageCount > 1 ) { + me._.tabBarMode = true; + me._.tabs[ me._.currentTabId ][ 0 ].focus(); + } else if ( !this._.hasFocus ) { + this._.currentFocusIndex = -1; + + // Decide where to put the initial focus. + if ( definition.onFocus ) { + var initialFocus = definition.onFocus.call( this ); + // Focus the field that the user specified. + initialFocus && initialFocus.focus(); + } + // Focus the first field in layout order. + else + changeFocus( 1 ); + } + }, this, null, 0xffffffff ); + + // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (#2661). + // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken. + if ( CKEDITOR.env.ie6Compat ) { + this.on( 'load', function( evt ) { + var outer = this.getElement(), + inner = outer.getFirst(); + inner.remove(); + inner.appendTo( outer ); + }, this ); + } + + initDragAndDrop( this ); + initResizeHandles( this ); + + // Insert the title. + ( new CKEDITOR.dom.text( definition.title, CKEDITOR.document ) ).appendTo( this.parts.title ); + + // Insert the tabs and contents. + for ( i = 0; i < definition.contents.length; i++ ) { + var page = definition.contents[ i ]; + page && this.addPage( page ); + } + + this.parts[ 'tabs' ].on( 'click', function( evt ) { + var target = evt.data.getTarget(); + // If we aren't inside a tab, bail out. + if ( target.hasClass( 'cke_dialog_tab' ) ) { + // Get the ID of the tab, without the 'cke_' prefix and the unique number suffix. + var id = target.$.id; + this.selectPage( id.substring( 4, id.lastIndexOf( '_' ) ) ); + + if ( this._.tabBarMode ) { + this._.tabBarMode = false; + this._.currentFocusIndex = -1; + changeFocus( 1 ); + } + evt.data.preventDefault(); + } + }, this ); + + // Insert buttons. + var buttonsHtml = [], + buttons = CKEDITOR.dialog._.uiElementBuilders.hbox.build( this, { + type: 'hbox', + className: 'cke_dialog_footer_buttons', + widths: [], + children: definition.buttons + }, buttonsHtml ).getChild(); + this.parts.footer.setHtml( buttonsHtml.join( '' ) ); + + for ( i = 0; i < buttons.length; i++ ) + this._.buttons[ buttons[ i ].id ] = buttons[ i ]; + }; + + // Focusable interface. Use it via dialog.addFocusable. + function Focusable( dialog, element, index ) { + this.element = element; + this.focusIndex = index; + // TODO: support tabIndex for focusables. + this.tabIndex = 0; + this.isFocusable = function() { + return !element.getAttribute( 'disabled' ) && element.isVisible(); + }; + this.focus = function() { + dialog._.currentFocusIndex = this.focusIndex; + this.element.focus(); + }; + // Bind events + element.on( 'keydown', function( e ) { + if ( e.data.getKeystroke() in { 32: 1, 13: 1 } ) + this.fire( 'click' ); + } ); + element.on( 'focus', function() { + this.fire( 'mouseover' ); + } ); + element.on( 'blur', function() { + this.fire( 'mouseout' ); + } ); + } + + // Re-layout the dialog on window resize. + function resizeWithWindow( dialog ) { + var win = CKEDITOR.document.getWindow(); + function resizeHandler() { dialog.layout(); } + win.on( 'resize', resizeHandler ); + dialog.on( 'hide', function() { win.removeListener( 'resize', resizeHandler ); } ); + } + + CKEDITOR.dialog.prototype = { + destroy: function() { + this.hide(); + this._.element.remove(); + }, + + /** + * Resizes the dialog. + * + * dialogObj.resize( 800, 640 ); + * + * @method + * @param {Number} width The width of the dialog in pixels. + * @param {Number} height The height of the dialog in pixels. + */ + resize: ( function() { + return function( width, height ) { + if ( this._.contentSize && this._.contentSize.width == width && this._.contentSize.height == height ) + return; + + CKEDITOR.dialog.fire( 'resize', { + dialog: this, + width: width, + height: height + }, this._.editor ); + + this.fire( 'resize', { + width: width, + height: height + }, this._.editor ); + + var contents = this.parts.contents; + contents.setStyles( { + width: width + 'px', + height: height + 'px' + } ); + + // Update dialog position when dimension get changed in RTL. + if ( this._.editor.lang.dir == 'rtl' && this._.position ) + this._.position.x = CKEDITOR.document.getWindow().getViewPaneSize().width - this._.contentSize.width - parseInt( this._.element.getFirst().getStyle( 'right' ), 10 ); + + this._.contentSize = { width: width, height: height }; + }; + } )(), + + /** + * Gets the current size of the dialog in pixels. + * + * var width = dialogObj.getSize().width; + * + * @returns {Object} + * @returns {Number} return.width + * @returns {Number} return.height + */ + getSize: function() { + var element = this._.element.getFirst(); + return { width: element.$.offsetWidth || 0, height: element.$.offsetHeight || 0 }; + }, + + /** + * Moves the dialog to an `(x, y)` coordinate relative to the window. + * + * dialogObj.move( 10, 40 ); + * + * @method + * @param {Number} x The target x-coordinate. + * @param {Number} y The target y-coordinate. + * @param {Boolean} save Flag indicate whether the dialog position should be remembered on next open up. + */ + move: function( x, y, save ) { + + // The dialog may be fixed positioned or absolute positioned. Ask the + // browser what is the current situation first. + var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl'; + var isFixed = element.getComputedStyle( 'position' ) == 'fixed'; + + // (#8888) In some cases of a very small viewport, dialog is incorrectly + // positioned in IE7. It also happens that it remains sticky and user cannot + // scroll down/up to reveal dialog's content below/above the viewport; this is + // cumbersome. + // The only way to fix this is to move mouse out of the browser and + // go back to see that dialog position is automagically fixed. No events, + // no style change - pure magic. This is a IE7 rendering issue, which can be + // fixed with dummy style redraw on each move. + if ( CKEDITOR.env.ie ) + element.setStyle( 'zoom', '100%' ); + + if ( isFixed && this._.position && this._.position.x == x && this._.position.y == y ) + return; + + // Save the current position. + this._.position = { x: x, y: y }; + + // If not fixed positioned, add scroll position to the coordinates. + if ( !isFixed ) { + var scrollPosition = CKEDITOR.document.getWindow().getScrollPosition(); + x += scrollPosition.x; + y += scrollPosition.y; + } + + // Translate coordinate for RTL. + if ( rtl ) { + var dialogSize = this.getSize(), viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(); + x = viewPaneSize.width - dialogSize.width - x; + } + + var styles = { 'top': ( y > 0 ? y : 0 ) + 'px' }; + styles[ rtl ? 'right' : 'left' ] = ( x > 0 ? x : 0 ) + 'px'; + + element.setStyles( styles ); + + save && ( this._.moved = 1 ); + }, + + /** + * Gets the dialog's position in the window. + * + * var dialogX = dialogObj.getPosition().x; + * + * @returns {Object} + * @returns {Number} return.x + * @returns {Number} return.y + */ + getPosition: function() { + return CKEDITOR.tools.extend( {}, this._.position ); + }, + + /** + * Shows the dialog box. + * + * dialogObj.show(); + */ + show: function() { + // Insert the dialog's element to the root document. + var element = this._.element; + var definition = this.definition; + if ( !( element.getParent() && element.getParent().equals( CKEDITOR.document.getBody() ) ) ) + element.appendTo( CKEDITOR.document.getBody() ); + else + element.setStyle( 'display', 'block' ); + + // First, set the dialog to an appropriate size. + this.resize( this._.contentSize && this._.contentSize.width || definition.width || definition.minWidth, this._.contentSize && this._.contentSize.height || definition.height || definition.minHeight ); + + // Reset all inputs back to their default value. + this.reset(); + + // Select the first tab by default. + this.selectPage( this.definition.contents[ 0 ].id ); + + // Set z-index. + if ( CKEDITOR.dialog._.currentZIndex === null ) + CKEDITOR.dialog._.currentZIndex = this._.editor.config.baseFloatZIndex; + this._.element.getFirst().setStyle( 'z-index', CKEDITOR.dialog._.currentZIndex += 10 ); + + // Maintain the dialog ordering and dialog cover. + if ( CKEDITOR.dialog._.currentTop === null ) { + CKEDITOR.dialog._.currentTop = this; + this._.parentDialog = null; + showCover( this._.editor ); + + } else { + this._.parentDialog = CKEDITOR.dialog._.currentTop; + var parentElement = this._.parentDialog.getElement().getFirst(); + parentElement.$.style.zIndex -= Math.floor( this._.editor.config.baseFloatZIndex / 2 ); + CKEDITOR.dialog._.currentTop = this; + } + + element.on( 'keydown', accessKeyDownHandler ); + element.on( 'keyup', accessKeyUpHandler ); + + // Reset the hasFocus state. + this._.hasFocus = false; + + for ( var i in definition.contents ) { + if ( !definition.contents[ i ] ) + continue; + + var content = definition.contents[ i ], + tab = this._.tabs[ content.id ], + requiredContent = content.requiredContent, + enableElements = 0; + + if ( !tab ) + continue; + + for ( var j in this._.contents[ content.id ] ) { + var elem = this._.contents[ content.id ][ j ]; + + if ( elem.type == 'hbox' || elem.type == 'vbox' || !elem.getInputElement() ) + continue; + + if ( elem.requiredContent && !this._.editor.activeFilter.check( elem.requiredContent ) ) + elem.disable(); + else { + elem.enable(); + enableElements++; + } + } + + if ( !enableElements || ( requiredContent && !this._.editor.activeFilter.check( requiredContent ) ) ) + tab[ 0 ].addClass( 'cke_dialog_tab_disabled' ); + else + tab[ 0 ].removeClass( 'cke_dialog_tab_disabled' ); + } + + CKEDITOR.tools.setTimeout( function() { + this.layout(); + resizeWithWindow( this ); + + this.parts.dialog.setStyle( 'visibility', '' ); + + // Execute onLoad for the first show. + this.fireOnce( 'load', {} ); + CKEDITOR.ui.fire( 'ready', this ); + + this.fire( 'show', {} ); + this._.editor.fire( 'dialogShow', this ); + + if ( !this._.parentDialog ) + this._.editor.focusManager.lock(); + + // Save the initial values of the dialog. + this.foreach( function( contentObj ) { + contentObj.setInitValue && contentObj.setInitValue(); + } ); + + }, 100, this ); + }, + + /** + * Rearrange the dialog to its previous position or the middle of the window. + * + * @since 3.5 + */ + layout: function() { + var el = this.parts.dialog; + var dialogSize = this.getSize(); + var win = CKEDITOR.document.getWindow(), + viewSize = win.getViewPaneSize(); + + var posX = ( viewSize.width - dialogSize.width ) / 2, + posY = ( viewSize.height - dialogSize.height ) / 2; + + // Switch to absolute position when viewport is smaller than dialog size. + if ( !CKEDITOR.env.ie6Compat ) { + if ( dialogSize.height + ( posY > 0 ? posY : 0 ) > viewSize.height || + dialogSize.width + ( posX > 0 ? posX : 0 ) > viewSize.width ) + el.setStyle( 'position', 'absolute' ); + else + el.setStyle( 'position', 'fixed' ); + } + + this.move( this._.moved ? this._.position.x : posX, + this._.moved ? this._.position.y : posY ); + }, + + /** + * Executes a function for each UI element. + * + * @param {Function} fn Function to execute for each UI element. + * @returns {CKEDITOR.dialog} The current dialog object. + */ + foreach: function( fn ) { + for ( var i in this._.contents ) { + for ( var j in this._.contents[ i ] ) + fn.call( this, this._.contents[ i ][ j ] ); + } + return this; + }, + + /** + * Resets all input values in the dialog. + * + * dialogObj.reset(); + * + * @method + * @chainable + */ + reset: ( function() { + var fn = function( widget ) { + if ( widget.reset ) + widget.reset( 1 ); + }; + return function() { + this.foreach( fn ); + return this; + }; + } )(), + + + /** + * Calls the {@link CKEDITOR.dialog.definition.uiElement#setup} method of each + * of the UI elements, with the arguments passed through it. + * It is usually being called when the dialog is opened, to put the initial value inside the field. + * + * dialogObj.setupContent(); + * + * var timestamp = ( new Date() ).valueOf(); + * dialogObj.setupContent( timestamp ); + */ + setupContent: function() { + var args = arguments; + this.foreach( function( widget ) { + if ( widget.setup ) + widget.setup.apply( widget, args ); + } ); + }, + + /** + * Calls the {@link CKEDITOR.dialog.definition.uiElement#commit} method of each + * of the UI elements, with the arguments passed through it. + * It is usually being called when the user confirms the dialog, to process the values. + * + * dialogObj.commitContent(); + * + * var timestamp = ( new Date() ).valueOf(); + * dialogObj.commitContent( timestamp ); + */ + commitContent: function() { + var args = arguments; + this.foreach( function( widget ) { + // Make sure IE triggers "change" event on last focused input before closing the dialog. (#7915) + if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex ) + widget.getInputElement().$.blur(); + + if ( widget.commit ) + widget.commit.apply( widget, args ); + } ); + }, + + /** + * Hides the dialog box. + * + * dialogObj.hide(); + */ + hide: function() { + if ( !this.parts.dialog.isVisible() ) + return; + + this.fire( 'hide', {} ); + this._.editor.fire( 'dialogHide', this ); + // Reset the tab page. + this.selectPage( this._.tabIdList[ 0 ] ); + var element = this._.element; + element.setStyle( 'display', 'none' ); + this.parts.dialog.setStyle( 'visibility', 'hidden' ); + // Unregister all access keys associated with this dialog. + unregisterAccessKey( this ); + + // Close any child(top) dialogs first. + while ( CKEDITOR.dialog._.currentTop != this ) + CKEDITOR.dialog._.currentTop.hide(); + + // Maintain dialog ordering and remove cover if needed. + if ( !this._.parentDialog ) + hideCover( this._.editor ); + else { + var parentElement = this._.parentDialog.getElement().getFirst(); + parentElement.setStyle( 'z-index', parseInt( parentElement.$.style.zIndex, 10 ) + Math.floor( this._.editor.config.baseFloatZIndex / 2 ) ); + } + CKEDITOR.dialog._.currentTop = this._.parentDialog; + + // Deduct or clear the z-index. + if ( !this._.parentDialog ) { + CKEDITOR.dialog._.currentZIndex = null; + + // Remove access key handlers. + element.removeListener( 'keydown', accessKeyDownHandler ); + element.removeListener( 'keyup', accessKeyUpHandler ); + + var editor = this._.editor; + editor.focus(); + + // Give a while before unlock, waiting for focus to return to the editable. (#172) + setTimeout( function() { editor.focusManager.unlock(); }, 0 ); + + } else + CKEDITOR.dialog._.currentZIndex -= 10; + + delete this._.parentDialog; + // Reset the initial values of the dialog. + this.foreach( function( contentObj ) { + contentObj.resetInitValue && contentObj.resetInitValue(); + } ); + }, + + /** + * Adds a tabbed page into the dialog. + * + * @param {Object} contents Content definition. + */ + addPage: function( contents ) { + if ( contents.requiredContent && !this._.editor.filter.check( contents.requiredContent ) ) + return; + + var pageHtml = [], + titleHtml = contents.label ? ' title="' + CKEDITOR.tools.htmlEncode( contents.label ) + '"' : '', + elements = contents.elements, + vbox = CKEDITOR.dialog._.uiElementBuilders.vbox.build( this, { + type: 'vbox', + className: 'cke_dialog_page_contents', + children: contents.elements, + expand: !!contents.expand, + padding: contents.padding, + style: contents.style || 'width: 100%;' + }, pageHtml ); + + var contentMap = this._.contents[ contents.id ] = {}, + cursor, + children = vbox.getChild(), + enabledFields = 0; + + while ( ( cursor = children.shift() ) ) { + // Count all allowed fields. + if ( !cursor.notAllowed && cursor.type != 'hbox' && cursor.type != 'vbox' ) + enabledFields++; + + contentMap[ cursor.id ] = cursor; + if ( typeof( cursor.getChild ) == 'function' ) + children.push.apply( children, cursor.getChild() ); + } + + // If all fields are disabled (because they are not allowed) hide this tab. + if ( !enabledFields ) + contents.hidden = true; + + // Create the HTML for the tab and the content block. + var page = CKEDITOR.dom.element.createFromHtml( pageHtml.join( '' ) ); + page.setAttribute( 'role', 'tabpanel' ); + + var env = CKEDITOR.env; + var tabId = 'cke_' + contents.id + '_' + CKEDITOR.tools.getNextNumber(), + tab = CKEDITOR.dom.element.createFromHtml( [ + ' 0 ? ' cke_last' : 'cke_first' ), + titleHtml, + ( !!contents.hidden ? ' style="display:none"' : '' ), + ' id="', tabId, '"', + env.gecko && !env.hc ? '' : ' href="javascript:void(0)"', + ' tabIndex="-1"', + ' hidefocus="true"', + ' role="tab">', + contents.label, + '' + ].join( '' ) ); + + page.setAttribute( 'aria-labelledby', tabId ); + + // Take records for the tabs and elements created. + this._.tabs[ contents.id ] = [ tab, page ]; + this._.tabIdList.push( contents.id ); + !contents.hidden && this._.pageCount++; + this._.lastTab = tab; + this.updateStyle(); + + // Attach the DOM nodes. + + page.setAttribute( 'name', contents.id ); + page.appendTo( this.parts.contents ); + + tab.unselectable(); + this.parts.tabs.append( tab ); + + // Add access key handlers if access key is defined. + if ( contents.accessKey ) { + registerAccessKey( this, this, 'CTRL+' + contents.accessKey, tabAccessKeyDown, tabAccessKeyUp ); + this._.accessKeyMap[ 'CTRL+' + contents.accessKey ] = contents.id; + } + }, + + /** + * Activates a tab page in the dialog by its id. + * + * dialogObj.selectPage( 'tab_1' ); + * + * @param {String} id The id of the dialog tab to be activated. + */ + selectPage: function( id ) { + if ( this._.currentTabId == id ) + return; + + if ( this._.tabs[ id ][ 0 ].hasClass( 'cke_dialog_tab_disabled' ) ) + return; + + // If event was canceled - do nothing. + if ( this.fire( 'selectPage', { page: id, currentPage: this._.currentTabId } ) === false ) + return; + + // Hide the non-selected tabs and pages. + for ( var i in this._.tabs ) { + var tab = this._.tabs[ i ][ 0 ], + page = this._.tabs[ i ][ 1 ]; + if ( i != id ) { + tab.removeClass( 'cke_dialog_tab_selected' ); + page.hide(); + } + page.setAttribute( 'aria-hidden', i != id ); + } + + var selected = this._.tabs[ id ]; + selected[ 0 ].addClass( 'cke_dialog_tab_selected' ); + + // [IE] an invisible input[type='text'] will enlarge it's width + // if it's value is long when it shows, so we clear it's value + // before it shows and then recover it (#5649) + if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) { + clearOrRecoverTextInputValue( selected[ 1 ] ); + selected[ 1 ].show(); + setTimeout( function() { + clearOrRecoverTextInputValue( selected[ 1 ], 1 ); + }, 0 ); + } else + selected[ 1 ].show(); + + this._.currentTabId = id; + this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id ); + }, + + /** + * Dialog state-specific style updates. + */ + updateStyle: function() { + // If only a single page shown, a different style is used in the central pane. + this.parts.dialog[ ( this._.pageCount === 1 ? 'add' : 'remove' ) + 'Class' ]( 'cke_single_page' ); + }, + + /** + * Hides a page's tab away from the dialog. + * + * dialog.hidePage( 'tab_3' ); + * + * @param {String} id The page's Id. + */ + hidePage: function( id ) { + var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; + if ( !tab || this._.pageCount == 1 || !tab.isVisible() ) + return; + // Switch to other tab first when we're hiding the active tab. + else if ( id == this._.currentTabId ) + this.selectPage( getPreviousVisibleTab.call( this ) ); + + tab.hide(); + this._.pageCount--; + this.updateStyle(); + }, + + /** + * Unhides a page's tab. + * + * dialog.showPage( 'tab_2' ); + * + * @param {String} id The page's Id. + */ + showPage: function( id ) { + var tab = this._.tabs[ id ] && this._.tabs[ id ][ 0 ]; + if ( !tab ) + return; + tab.show(); + this._.pageCount++; + this.updateStyle(); + }, + + /** + * Gets the root DOM element of the dialog. + * + * var dialogElement = dialogObj.getElement().getFirst(); + * dialogElement.setStyle( 'padding', '5px' ); + * + * @returns {CKEDITOR.dom.element} The `` element containing this dialog. + */ + getElement: function() { + return this._.element; + }, + + /** + * Gets the name of the dialog. + * + * var dialogName = dialogObj.getName(); + * + * @returns {String} The name of this dialog. + */ + getName: function() { + return this._.name; + }, + + /** + * Gets a dialog UI element object from a dialog page. + * + * dialogObj.getContentElement( 'tabId', 'elementId' ).setValue( 'Example' ); + * + * @param {String} pageId id of dialog page. + * @param {String} elementId id of UI element. + * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element. + */ + getContentElement: function( pageId, elementId ) { + var page = this._.contents[ pageId ]; + return page && page[ elementId ]; + }, + + /** + * Gets the value of a dialog UI element. + * + * alert( dialogObj.getValueOf( 'tabId', 'elementId' ) ); + * + * @param {String} pageId id of dialog page. + * @param {String} elementId id of UI element. + * @returns {Object} The value of the UI element. + */ + getValueOf: function( pageId, elementId ) { + return this.getContentElement( pageId, elementId ).getValue(); + }, + + /** + * Sets the value of a dialog UI element. + * + * dialogObj.setValueOf( 'tabId', 'elementId', 'Example' ); + * + * @param {String} pageId id of the dialog page. + * @param {String} elementId id of the UI element. + * @param {Object} value The new value of the UI element. + */ + setValueOf: function( pageId, elementId, value ) { + return this.getContentElement( pageId, elementId ).setValue( value ); + }, + + /** + * Gets the UI element of a button in the dialog's button row. + * + * @returns {CKEDITOR.ui.dialog.button} The button object. + * + * @param {String} id The id of the button. + */ + getButton: function( id ) { + return this._.buttons[ id ]; + }, + + /** + * Simulates a click to a dialog button in the dialog's button row. + * + * @returns The return value of the dialog's `click` event. + * + * @param {String} id The id of the button. + */ + click: function( id ) { + return this._.buttons[ id ].click(); + }, + + /** + * Disables a dialog button. + * + * @param {String} id The id of the button. + */ + disableButton: function( id ) { + return this._.buttons[ id ].disable(); + }, + + /** + * Enables a dialog button. + * + * @param {String} id The id of the button. + */ + enableButton: function( id ) { + return this._.buttons[ id ].enable(); + }, + + /** + * Gets the number of pages in the dialog. + * + * @returns {Number} Page count. + */ + getPageCount: function() { + return this._.pageCount; + }, + + /** + * Gets the editor instance which opened this dialog. + * + * @returns {CKEDITOR.editor} Parent editor instances. + */ + getParentEditor: function() { + return this._.editor; + }, + + /** + * Gets the element that was selected when opening the dialog, if any. + * + * @returns {CKEDITOR.dom.element} The element that was selected, or `null`. + */ + getSelectedElement: function() { + return this.getParentEditor().getSelection().getSelectedElement(); + }, + + /** + * Adds element to dialog's focusable list. + * + * @param {CKEDITOR.dom.element} element + * @param {Number} [index] + */ + addFocusable: function( element, index ) { + if ( typeof index == 'undefined' ) { + index = this._.focusList.length; + this._.focusList.push( new Focusable( this, element, index ) ); + } else { + this._.focusList.splice( index, 0, new Focusable( this, element, index ) ); + for ( var i = index + 1; i < this._.focusList.length; i++ ) + this._.focusList[ i ].focusIndex++; + } + } + }; + + CKEDITOR.tools.extend( CKEDITOR.dialog, { + /** + * Registers a dialog. + * + * // Full sample plugin, which does not only register a dialog window but also adds an item to the context menu. + * // To open the dialog window, choose "Open dialog" in the context menu. + * CKEDITOR.plugins.add( 'myplugin', { + * init: function( editor ) { + * editor.addCommand( 'mydialog',new CKEDITOR.dialogCommand( 'mydialog' ) ); + * + * if ( editor.contextMenu ) { + * editor.addMenuGroup( 'mygroup', 10 ); + * editor.addMenuItem( 'My Dialog', { + * label: 'Open dialog', + * command: 'mydialog', + * group: 'mygroup' + * } ); + * editor.contextMenu.addListener( function( element ) { + * return { 'My Dialog': CKEDITOR.TRISTATE_OFF }; + * } ); + * } + * + * CKEDITOR.dialog.add( 'mydialog', function( api ) { + * // CKEDITOR.dialog.definition + * var dialogDefinition = { + * title: 'Sample dialog', + * minWidth: 390, + * minHeight: 130, + * contents: [ + * { + * id: 'tab1', + * label: 'Label', + * title: 'Title', + * expand: true, + * padding: 0, + * elements: [ + * { + * type: 'html', + * html: '

This is some sample HTML content.

' + * }, + * { + * type: 'textarea', + * id: 'textareaId', + * rows: 4, + * cols: 40 + * } + * ] + * } + * ], + * buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ], + * onOk: function() { + * // "this" is now a CKEDITOR.dialog object. + * // Accessing dialog elements: + * var textareaObj = this.getContentElement( 'tab1', 'textareaId' ); + * alert( "You have entered: " + textareaObj.getValue() ); + * } + * }; + * + * return dialogDefinition; + * } ); + * } + * } ); + * + * CKEDITOR.replace( 'editor1', { extraPlugins: 'myplugin' } ); + * + * @static + * @param {String} name The dialog's name. + * @param {Function/String} dialogDefinition + * A function returning the dialog's definition, or the URL to the `.js` file holding the function. + * The function should accept an argument `editor` which is the current editor instance, and + * return an object conforming to {@link CKEDITOR.dialog.definition}. + * @see CKEDITOR.dialog.definition + */ + add: function( name, dialogDefinition ) { + // Avoid path registration from multiple instances override definition. + if ( !this._.dialogDefinitions[ name ] || typeof dialogDefinition == 'function' ) + this._.dialogDefinitions[ name ] = dialogDefinition; + }, + + /** + * @static + * @todo + */ + exists: function( name ) { + return !!this._.dialogDefinitions[ name ]; + }, + + /** + * @static + * @todo + */ + getCurrent: function() { + return CKEDITOR.dialog._.currentTop; + }, + + /** + * Check whether tab wasn't removed by {@link CKEDITOR.config#removeDialogTabs}. + * + * @since 4.1 + * @static + * @param {CKEDITOR.editor} editor + * @param {String} dialogName + * @param {String} tabName + * @returns {Boolean} + */ + isTabEnabled: function( editor, dialogName, tabName ) { + var cfg = editor.config.removeDialogTabs; + + return !( cfg && cfg.match( new RegExp( '(?:^|;)' + dialogName + ':' + tabName + '(?:$|;)', 'i' ) ) ); + }, + + /** + * The default OK button for dialogs. Fires the `ok` event and closes the dialog if the event succeeds. + * + * @static + * @method + */ + okButton: ( function() { + var retval = function( editor, override ) { + override = override || {}; + return CKEDITOR.tools.extend( { + id: 'ok', + type: 'button', + label: editor.lang.common.ok, + 'class': 'cke_dialog_ui_button_ok', + onClick: function( evt ) { + var dialog = evt.data.dialog; + if ( dialog.fire( 'ok', { hide: true } ).hide !== false ) + dialog.hide(); + } + }, override, true ); + }; + retval.type = 'button'; + retval.override = function( override ) { + return CKEDITOR.tools.extend( function( editor ) { + return retval( editor, override ); + }, { type: 'button' }, true ); + }; + return retval; + } )(), + + /** + * The default cancel button for dialogs. Fires the `cancel` event and + * closes the dialog if no UI element value changed. + * + * @static + * @method + */ + cancelButton: ( function() { + var retval = function( editor, override ) { + override = override || {}; + return CKEDITOR.tools.extend( { + id: 'cancel', + type: 'button', + label: editor.lang.common.cancel, + 'class': 'cke_dialog_ui_button_cancel', + onClick: function( evt ) { + var dialog = evt.data.dialog; + if ( dialog.fire( 'cancel', { hide: true } ).hide !== false ) + dialog.hide(); + } + }, override, true ); + }; + retval.type = 'button'; + retval.override = function( override ) { + return CKEDITOR.tools.extend( function( editor ) { + return retval( editor, override ); + }, { type: 'button' }, true ); + }; + return retval; + } )(), + + /** + * Registers a dialog UI element. + * + * @static + * @param {String} typeName The name of the UI element. + * @param {Function} builder The function to build the UI element. + */ + addUIElement: function( typeName, builder ) { + this._.uiElementBuilders[ typeName ] = builder; + } + } ); + + CKEDITOR.dialog._ = { + uiElementBuilders: {}, + + dialogDefinitions: {}, + + currentTop: null, + + currentZIndex: null + }; + + // "Inherit" (copy actually) from CKEDITOR.event. + CKEDITOR.event.implementOn( CKEDITOR.dialog ); + CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype ); + + var defaultDialogDefinition = { + resizable: CKEDITOR.DIALOG_RESIZE_BOTH, + minWidth: 600, + minHeight: 400, + buttons: [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ] + }; + + // Tool function used to return an item from an array based on its id + // property. + var getById = function( array, id, recurse ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == id ) + return item; + if ( recurse && item[ recurse ] ) { + var retval = getById( item[ recurse ], id, recurse ); + if ( retval ) + return retval; + } + } + return null; + }; + + // Tool function used to add an item into an array. + var addById = function( array, newItem, nextSiblingId, recurse, nullIfNotFound ) { + if ( nextSiblingId ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == nextSiblingId ) { + array.splice( i, 0, newItem ); + return newItem; + } + + if ( recurse && item[ recurse ] ) { + var retval = addById( item[ recurse ], newItem, nextSiblingId, recurse, true ); + if ( retval ) + return retval; + } + } + + if ( nullIfNotFound ) + return null; + } + + array.push( newItem ); + return newItem; + }; + + // Tool function used to remove an item from an array based on its id. + var removeById = function( array, id, recurse ) { + for ( var i = 0, item; + ( item = array[ i ] ); i++ ) { + if ( item.id == id ) + return array.splice( i, 1 ); + if ( recurse && item[ recurse ] ) { + var retval = removeById( item[ recurse ], id, recurse ); + if ( retval ) + return retval; + } + } + return null; + }; + + /** + * This class is not really part of the API. It is the `definition` property value + * passed to `dialogDefinition` event handlers. + * + * CKEDITOR.on( 'dialogDefinition', function( evt ) { + * var definition = evt.data.definition; + * var content = definition.getContents( 'page1' ); + * // ... + * } ); + * + * @private + * @class CKEDITOR.dialog.definitionObject + * @extends CKEDITOR.dialog.definition + * @constructor Creates a definitionObject class instance. + */ + var definitionObject = function( dialog, dialogDefinition ) { + // TODO : Check if needed. + this.dialog = dialog; + + // Transform the contents entries in contentObjects. + var contents = dialogDefinition.contents; + for ( var i = 0, content; + ( content = contents[ i ] ); i++ ) + contents[ i ] = content && new contentObject( dialog, content ); + + CKEDITOR.tools.extend( this, dialogDefinition ); + }; + + definitionObject.prototype = { + /** + * Gets a content definition. + * + * @param {String} id The id of the content definition. + * @returns {CKEDITOR.dialog.definition.content} The content definition matching id. + */ + getContents: function( id ) { + return getById( this.contents, id ); + }, + + /** + * Gets a button definition. + * + * @param {String} id The id of the button definition. + * @returns {CKEDITOR.dialog.definition.button} The button definition matching id. + */ + getButton: function( id ) { + return getById( this.buttons, id ); + }, + + /** + * Adds a content definition object under this dialog definition. + * + * @param {CKEDITOR.dialog.definition.content} contentDefinition The + * content definition. + * @param {String} [nextSiblingId] The id of an existing content + * definition which the new content definition will be inserted + * before. Omit if the new content definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.content} The inserted content definition. + */ + addContents: function( contentDefinition, nextSiblingId ) { + return addById( this.contents, contentDefinition, nextSiblingId ); + }, + + /** + * Adds a button definition object under this dialog definition. + * + * @param {CKEDITOR.dialog.definition.button} buttonDefinition The + * button definition. + * @param {String} [nextSiblingId] The id of an existing button + * definition which the new button definition will be inserted + * before. Omit if the new button definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.button} The inserted button definition. + */ + addButton: function( buttonDefinition, nextSiblingId ) { + return addById( this.buttons, buttonDefinition, nextSiblingId ); + }, + + /** + * Removes a content definition from this dialog definition. + * + * @param {String} id The id of the content definition to be removed. + * @returns {CKEDITOR.dialog.definition.content} The removed content definition. + */ + removeContents: function( id ) { + removeById( this.contents, id ); + }, + + /** + * Removes a button definition from the dialog definition. + * + * @param {String} id The id of the button definition to be removed. + * @returns {CKEDITOR.dialog.definition.button} The removed button definition. + */ + removeButton: function( id ) { + removeById( this.buttons, id ); + } + }; + + /** + * This class is not really part of the API. It is the template of the + * objects representing content pages inside the + * CKEDITOR.dialog.definitionObject. + * + * CKEDITOR.on( 'dialogDefinition', function( evt ) { + * var definition = evt.data.definition; + * var content = definition.getContents( 'page1' ); + * content.remove( 'textInput1' ); + * // ... + * } ); + * + * @private + * @class CKEDITOR.dialog.definition.contentObject + * @constructor Creates a contentObject class instance. + */ + function contentObject( dialog, contentDefinition ) { + this._ = { + dialog: dialog + }; + + CKEDITOR.tools.extend( this, contentDefinition ); + } + + contentObject.prototype = { + /** + * Gets a UI element definition under the content definition. + * + * @param {String} id The id of the UI element definition. + * @returns {CKEDITOR.dialog.definition.uiElement} + */ + get: function( id ) { + return getById( this.elements, id, 'children' ); + }, + + /** + * Adds a UI element definition to the content definition. + * + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition The + * UI elemnet definition to be added. + * @param {String} nextSiblingId The id of an existing UI element + * definition which the new UI element definition will be inserted + * before. Omit if the new button definition is to be inserted as + * the last item. + * @returns {CKEDITOR.dialog.definition.uiElement} The element definition inserted. + */ + add: function( elementDefinition, nextSiblingId ) { + return addById( this.elements, elementDefinition, nextSiblingId, 'children' ); + }, + + /** + * Removes a UI element definition from the content definition. + * + * @param {String} id The id of the UI element definition to be removed. + * @returns {CKEDITOR.dialog.definition.uiElement} The element definition removed. + */ + remove: function( id ) { + removeById( this.elements, id, 'children' ); + } + }; + + function initDragAndDrop( dialog ) { + var lastCoords = null, + abstractDialogCoords = null, + element = dialog.getElement().getFirst(), + editor = dialog.getParentEditor(), + magnetDistance = editor.config.dialog_magnetDistance, + margins = CKEDITOR.skin.margins || [ 0, 0, 0, 0 ]; + + if ( typeof magnetDistance == 'undefined' ) + magnetDistance = 20; + + function mouseMoveHandler( evt ) { + var dialogSize = dialog.getSize(), + viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(), + x = evt.data.$.screenX, + y = evt.data.$.screenY, + dx = x - lastCoords.x, + dy = y - lastCoords.y, + realX, realY; + + lastCoords = { x: x, y: y }; + abstractDialogCoords.x += dx; + abstractDialogCoords.y += dy; + + if ( abstractDialogCoords.x + margins[ 3 ] < magnetDistance ) + realX = -margins[ 3 ]; + else if ( abstractDialogCoords.x - margins[ 1 ] > viewPaneSize.width - dialogSize.width - magnetDistance ) + realX = viewPaneSize.width - dialogSize.width + ( editor.lang.dir == 'rtl' ? 0 : margins[ 1 ] ); + else + realX = abstractDialogCoords.x; + + if ( abstractDialogCoords.y + margins[ 0 ] < magnetDistance ) + realY = -margins[ 0 ]; + else if ( abstractDialogCoords.y - margins[ 2 ] > viewPaneSize.height - dialogSize.height - magnetDistance ) + realY = viewPaneSize.height - dialogSize.height + margins[ 2 ]; + else + realY = abstractDialogCoords.y; + + dialog.move( realX, realY, 1 ); + + evt.data.preventDefault(); + } + + function mouseUpHandler( evt ) { + CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.removeListener( 'mousemove', mouseMoveHandler ); + coverDoc.removeListener( 'mouseup', mouseUpHandler ); + } + } + + dialog.parts.title.on( 'mousedown', function( evt ) { + lastCoords = { x: evt.data.$.screenX, y: evt.data.$.screenY }; + + CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.on( 'mouseup', mouseUpHandler ); + abstractDialogCoords = dialog.getPosition(); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.on( 'mousemove', mouseMoveHandler ); + coverDoc.on( 'mouseup', mouseUpHandler ); + } + + evt.data.preventDefault(); + }, dialog ); + } + + function initResizeHandles( dialog ) { + var def = dialog.definition, + resizable = def.resizable; + + if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE ) + return; + + var editor = dialog.getParentEditor(); + var wrapperWidth, wrapperHeight, viewSize, origin, startSize, dialogCover; + + var mouseDownFn = CKEDITOR.tools.addFunction( function( $event ) { + startSize = dialog.getSize(); + + var content = dialog.parts.contents, + iframeDialog = content.$.getElementsByTagName( 'iframe' ).length; + + // Shim to help capturing "mousemove" over iframe. + if ( iframeDialog ) { + dialogCover = CKEDITOR.dom.element.createFromHtml( '
' ); + content.append( dialogCover ); + } + + // Calculate the offset between content and chrome size. + wrapperHeight = startSize.height - dialog.parts.contents.getSize( 'height', !( CKEDITOR.env.gecko || CKEDITOR.env.ie && CKEDITOR.env.quirks ) ); + wrapperWidth = startSize.width - dialog.parts.contents.getSize( 'width', 1 ); + + origin = { x: $event.screenX, y: $event.screenY }; + + viewSize = CKEDITOR.document.getWindow().getViewPaneSize(); + + CKEDITOR.document.on( 'mousemove', mouseMoveHandler ); + CKEDITOR.document.on( 'mouseup', mouseUpHandler ); + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.on( 'mousemove', mouseMoveHandler ); + coverDoc.on( 'mouseup', mouseUpHandler ); + } + + $event.preventDefault && $event.preventDefault(); + } ); + + // Prepend the grip to the dialog. + dialog.on( 'load', function() { + var direction = ''; + if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH ) + direction = ' cke_resizer_horizontal'; + else if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT ) + direction = ' cke_resizer_vertical'; + var resizer = CKEDITOR.dom.element.createFromHtml( + '' + + // BLACK LOWER RIGHT TRIANGLE (ltr) + // BLACK LOWER LEFT TRIANGLE (rtl) + ( editor.lang.dir == 'ltr' ? '\u25E2' : '\u25E3' ) + + '
' ); + dialog.parts.footer.append( resizer, 1 ); + } ); + editor.on( 'destroy', function() { + CKEDITOR.tools.removeFunction( mouseDownFn ); + } ); + + function mouseMoveHandler( evt ) { + var rtl = editor.lang.dir == 'rtl', + dx = ( evt.data.$.screenX - origin.x ) * ( rtl ? -1 : 1 ), + dy = evt.data.$.screenY - origin.y, + width = startSize.width, + height = startSize.height, + internalWidth = width + dx * ( dialog._.moved ? 1 : 2 ), + internalHeight = height + dy * ( dialog._.moved ? 1 : 2 ), + element = dialog._.element.getFirst(), + right = rtl && element.getComputedStyle( 'right' ), + position = dialog.getPosition(); + + if ( position.y + internalHeight > viewSize.height ) + internalHeight = viewSize.height - position.y; + + if ( ( rtl ? right : position.x ) + internalWidth > viewSize.width ) + internalWidth = viewSize.width - ( rtl ? right : position.x ); + + // Make sure the dialog will not be resized to the wrong side when it's in the leftmost position for RTL. + if ( ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) ) + width = Math.max( def.minWidth || 0, internalWidth - wrapperWidth ); + + if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) + height = Math.max( def.minHeight || 0, internalHeight - wrapperHeight ); + + dialog.resize( width, height ); + + if ( !dialog._.moved ) + dialog.layout(); + + evt.data.preventDefault(); + } + + function mouseUpHandler() { + CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler ); + CKEDITOR.document.removeListener( 'mousemove', mouseMoveHandler ); + + if ( dialogCover ) { + dialogCover.remove(); + dialogCover = null; + } + + if ( CKEDITOR.env.ie6Compat ) { + var coverDoc = currentCover.getChild( 0 ).getFrameDocument(); + coverDoc.removeListener( 'mouseup', mouseUpHandler ); + coverDoc.removeListener( 'mousemove', mouseMoveHandler ); + } + } + } + + var resizeCover; + // Caching resuable covers and allowing only one cover + // on screen. + var covers = {}, + currentCover; + + function cancelEvent( ev ) { + ev.data.preventDefault( 1 ); + } + + function showCover( editor ) { + var win = CKEDITOR.document.getWindow(); + var config = editor.config, + backgroundColorStyle = config.dialog_backgroundCoverColor || 'white', + backgroundCoverOpacity = config.dialog_backgroundCoverOpacity, + baseFloatZIndex = config.baseFloatZIndex, + coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ), + coverElement = covers[ coverKey ]; + + if ( !coverElement ) { + var html = [ + '
' + ]; + + if ( CKEDITOR.env.ie6Compat ) { + // Support for custom document.domain in IE. + var iframeHtml = ''; + + html.push( '' + + '' ); + } + + html.push( '
' ); + + coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) ); + coverElement.setOpacity( backgroundCoverOpacity != undefined ? backgroundCoverOpacity : 0.5 ); + + coverElement.on( 'keydown', cancelEvent ); + coverElement.on( 'keypress', cancelEvent ); + coverElement.on( 'keyup', cancelEvent ); + + coverElement.appendTo( CKEDITOR.document.getBody() ); + covers[ coverKey ] = coverElement; + } else + coverElement.show(); + + // Makes the dialog cover a focus holder as well. + editor.focusManager.add( coverElement ); + + currentCover = coverElement; + var resizeFunc = function() { + var size = win.getViewPaneSize(); + coverElement.setStyles( { + width: size.width + 'px', + height: size.height + 'px' + } ); + }; + + var scrollFunc = function() { + var pos = win.getScrollPosition(), + cursor = CKEDITOR.dialog._.currentTop; + coverElement.setStyles( { + left: pos.x + 'px', + top: pos.y + 'px' + } ); + + if ( cursor ) { + do { + var dialogPos = cursor.getPosition(); + cursor.move( dialogPos.x, dialogPos.y ); + } while ( ( cursor = cursor._.parentDialog ) ); + } + }; + + resizeCover = resizeFunc; + win.on( 'resize', resizeFunc ); + resizeFunc(); + // Using Safari/Mac, focus must be kept where it is (#7027) + if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) ) + coverElement.focus(); + + if ( CKEDITOR.env.ie6Compat ) { + // IE BUG: win.$.onscroll assignment doesn't work.. it must be window.onscroll. + // So we need to invent a really funny way to make it work. + var myScrollHandler = function() { + scrollFunc(); + arguments.callee.prevScrollHandler.apply( this, arguments ); + }; + win.$.setTimeout( function() { + myScrollHandler.prevScrollHandler = window.onscroll || + function() {}; + window.onscroll = myScrollHandler; + }, 0 ); + scrollFunc(); + } + } + + function hideCover( editor ) { + if ( !currentCover ) + return; + + editor.focusManager.remove( currentCover ); + var win = CKEDITOR.document.getWindow(); + currentCover.hide(); + win.removeListener( 'resize', resizeCover ); + + if ( CKEDITOR.env.ie6Compat ) { + win.$.setTimeout( function() { + var prevScrollHandler = window.onscroll && window.onscroll.prevScrollHandler; + window.onscroll = prevScrollHandler || null; + }, 0 ); + } + resizeCover = null; + } + + function removeCovers() { + for ( var coverId in covers ) + covers[ coverId ].remove(); + covers = {}; + } + + var accessKeyProcessors = {}; + + var accessKeyDownHandler = function( evt ) { + var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, + alt = evt.data.$.altKey, + shift = evt.data.$.shiftKey, + key = String.fromCharCode( evt.data.$.keyCode ), + keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; + + if ( !keyProcessor || !keyProcessor.length ) + return; + + keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; + keyProcessor.keydown && keyProcessor.keydown.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); + evt.data.preventDefault(); + }; + + var accessKeyUpHandler = function( evt ) { + var ctrl = evt.data.$.ctrlKey || evt.data.$.metaKey, + alt = evt.data.$.altKey, + shift = evt.data.$.shiftKey, + key = String.fromCharCode( evt.data.$.keyCode ), + keyProcessor = accessKeyProcessors[ ( ctrl ? 'CTRL+' : '' ) + ( alt ? 'ALT+' : '' ) + ( shift ? 'SHIFT+' : '' ) + key ]; + + if ( !keyProcessor || !keyProcessor.length ) + return; + + keyProcessor = keyProcessor[ keyProcessor.length - 1 ]; + if ( keyProcessor.keyup ) { + keyProcessor.keyup.call( keyProcessor.uiElement, keyProcessor.dialog, keyProcessor.key ); + evt.data.preventDefault(); + } + }; + + var registerAccessKey = function( uiElement, dialog, key, downFunc, upFunc ) { + var procList = accessKeyProcessors[ key ] || ( accessKeyProcessors[ key ] = [] ); + procList.push( { + uiElement: uiElement, + dialog: dialog, + key: key, + keyup: upFunc || uiElement.accessKeyUp, + keydown: downFunc || uiElement.accessKeyDown + } ); + }; + + var unregisterAccessKey = function( obj ) { + for ( var i in accessKeyProcessors ) { + var list = accessKeyProcessors[ i ]; + for ( var j = list.length - 1; j >= 0; j-- ) { + if ( list[ j ].dialog == obj || list[ j ].uiElement == obj ) + list.splice( j, 1 ); + } + if ( list.length === 0 ) + delete accessKeyProcessors[ i ]; + } + }; + + var tabAccessKeyUp = function( dialog, key ) { + if ( dialog._.accessKeyMap[ key ] ) + dialog.selectPage( dialog._.accessKeyMap[ key ] ); + }; + + var tabAccessKeyDown = function( dialog, key ) {}; + + ( function() { + CKEDITOR.ui.dialog = { + /** + * The base class of all dialog UI elements. + * + * @class CKEDITOR.ui.dialog.uiElement + * @constructor Creates a uiElement class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element + * definition. + * + * Accepted fields: + * + * * `id` (Required) The id of the UI element. See {@link CKEDITOR.dialog#getContentElement}. + * * `type` (Required) The type of the UI element. The + * value to this field specifies which UI element class will be used to + * generate the final widget. + * * `title` (Optional) The popup tooltip for the UI + * element. + * * `hidden` (Optional) A flag that tells if the element + * should be initially visible. + * * `className` (Optional) Additional CSS class names + * to add to the UI element. Separated by space. + * * `style` (Optional) Additional CSS inline styles + * to add to the UI element. A semicolon (;) is required after the last + * style declaration. + * * `accessKey` (Optional) The alphanumeric access key + * for this element. Access keys are automatically prefixed by CTRL. + * * `on*` (Optional) Any UI element definition field that + * starts with `on` followed immediately by a capital letter and + * probably more letters is an event handler. Event handlers may be further + * divided into registered event handlers and DOM event handlers. Please + * refer to {@link CKEDITOR.ui.dialog.uiElement#registerEvents} and + * {@link CKEDITOR.ui.dialog.uiElement#eventProcessors} for more information. + * + * @param {Array} htmlList + * List of HTML code to be added to the dialog's content area. + * @param {Function/String} [nodeNameArg='div'] + * A function returning a string, or a simple string for the node name for + * the root DOM node. + * @param {Function/Object} [stylesArg={}] + * A function returning an object, or a simple object for CSS styles applied + * to the DOM node. + * @param {Function/Object} [attributesArg={}] + * A fucntion returning an object, or a simple object for attributes applied + * to the DOM node. + * @param {Function/String} [contentsArg=''] + * A function returning a string, or a simple string for the HTML code inside + * the root DOM node. Default is empty string. + */ + uiElement: function( dialog, elementDefinition, htmlList, nodeNameArg, stylesArg, attributesArg, contentsArg ) { + if ( arguments.length < 4 ) + return; + + var nodeName = ( nodeNameArg.call ? nodeNameArg( elementDefinition ) : nodeNameArg ) || 'div', + html = [ '<', nodeName, ' ' ], + styles = ( stylesArg && stylesArg.call ? stylesArg( elementDefinition ) : stylesArg ) || {}, + attributes = ( attributesArg && attributesArg.call ? attributesArg( elementDefinition ) : attributesArg ) || {}, + innerHTML = ( contentsArg && contentsArg.call ? contentsArg.call( this, dialog, elementDefinition ) : contentsArg ) || '', + domId = this.domId = attributes.id || CKEDITOR.tools.getNextId() + '_uiElement', + id = this.id = elementDefinition.id, + i; + + if ( elementDefinition.requiredContent && !dialog.getParentEditor().filter.check( elementDefinition.requiredContent ) ) { + styles.display = 'none'; + this.notAllowed = true; + } + + // Set the id, a unique id is required for getElement() to work. + attributes.id = domId; + + // Set the type and definition CSS class names. + var classes = {}; + if ( elementDefinition.type ) + classes[ 'cke_dialog_ui_' + elementDefinition.type ] = 1; + if ( elementDefinition.className ) + classes[ elementDefinition.className ] = 1; + if ( elementDefinition.disabled ) + classes[ 'cke_disabled' ] = 1; + + var attributeClasses = ( attributes[ 'class' ] && attributes[ 'class' ].split ) ? attributes[ 'class' ].split( ' ' ) : []; + for ( i = 0; i < attributeClasses.length; i++ ) { + if ( attributeClasses[ i ] ) + classes[ attributeClasses[ i ] ] = 1; + } + var finalClasses = []; + for ( i in classes ) + finalClasses.push( i ); + attributes[ 'class' ] = finalClasses.join( ' ' ); + + // Set the popup tooltop. + if ( elementDefinition.title ) + attributes.title = elementDefinition.title; + + // Write the inline CSS styles. + var styleStr = ( elementDefinition.style || '' ).split( ';' ); + + // Element alignment support. + if ( elementDefinition.align ) { + var align = elementDefinition.align; + styles[ 'margin-left' ] = align == 'left' ? 0 : 'auto'; + styles[ 'margin-right' ] = align == 'right' ? 0 : 'auto'; + } + + for ( i in styles ) + styleStr.push( i + ':' + styles[ i ] ); + if ( elementDefinition.hidden ) + styleStr.push( 'display:none' ); + for ( i = styleStr.length - 1; i >= 0; i-- ) { + if ( styleStr[ i ] === '' ) + styleStr.splice( i, 1 ); + } + if ( styleStr.length > 0 ) + attributes.style = ( attributes.style ? ( attributes.style + '; ' ) : '' ) + styleStr.join( '; ' ); + + // Write the attributes. + for ( i in attributes ) + html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[ i ] ) + '" ' ); + + // Write the content HTML. + html.push( '>', innerHTML, '' ); + + // Add contents to the parent HTML array. + htmlList.push( html.join( '' ) ); + + ( this._ || ( this._ = {} ) ).dialog = dialog; + + // Override isChanged if it is defined in element definition. + if ( typeof( elementDefinition.isChanged ) == 'boolean' ) + this.isChanged = function() { + return elementDefinition.isChanged; + }; + if ( typeof( elementDefinition.isChanged ) == 'function' ) + this.isChanged = elementDefinition.isChanged; + + // Overload 'get(set)Value' on definition. + if ( typeof( elementDefinition.setValue ) == 'function' ) { + this.setValue = CKEDITOR.tools.override( this.setValue, function( org ) { + return function( val ) { + org.call( this, elementDefinition.setValue.call( this, val ) ); + }; + } ); + } + + if ( typeof( elementDefinition.getValue ) == 'function' ) { + this.getValue = CKEDITOR.tools.override( this.getValue, function( org ) { + return function() { + return elementDefinition.getValue.call( this, org.call( this ) ); + }; + } ); + } + + // Add events. + CKEDITOR.event.implementOn( this ); + + this.registerEvents( elementDefinition ); + if ( this.accessKeyUp && this.accessKeyDown && elementDefinition.accessKey ) + registerAccessKey( this, dialog, 'CTRL+' + elementDefinition.accessKey ); + + var me = this; + dialog.on( 'load', function() { + var input = me.getInputElement(); + if ( input ) { + var focusClass = me.type in { 'checkbox': 1, 'ratio': 1 } && CKEDITOR.env.ie && CKEDITOR.env.version < 8 ? 'cke_dialog_ui_focused' : ''; + input.on( 'focus', function() { + dialog._.tabBarMode = false; + dialog._.hasFocus = true; + me.fire( 'focus' ); + focusClass && this.addClass( focusClass ); + + } ); + + input.on( 'blur', function() { + me.fire( 'blur' ); + focusClass && this.removeClass( focusClass ); + } ); + } + } ); + + // Completes this object with everything we have in the + // definition. + CKEDITOR.tools.extend( this, elementDefinition ); + + // Register the object as a tab focus if it can be included. + if ( this.keyboardFocusable ) { + this.tabIndex = elementDefinition.tabIndex || 0; + + this.focusIndex = dialog._.focusList.push( this ) - 1; + this.on( 'focus', function() { + dialog._.currentFocusIndex = me.focusIndex; + } ); + } + }, + + /** + * Horizontal layout box for dialog UI elements, auto-expends to available width of container. + * + * @class CKEDITOR.ui.dialog.hbox + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a hbox class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {Array} childObjList + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * @param {Array} childHtmlList + * Array of HTML code that correspond to the HTML output of all the + * objects in childObjList. + * @param {Array} htmlList + * Array of HTML code that this element will output to. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `widths` (Optional) The widths of child cells. + * * `height` (Optional) The height of the layout. + * * `padding` (Optional) The padding width inside child cells. + * * `align` (Optional) The alignment of the whole layout. + */ + hbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { + if ( arguments.length < 4 ) + return; + + this._ || ( this._ = {} ); + + var children = this._.children = childObjList, + widths = elementDefinition && elementDefinition.widths || null, + height = elementDefinition && elementDefinition.height || null, + styles = {}, + i; + /** @ignore */ + var innerHTML = function() { + var html = [ '' ]; + for ( i = 0; i < childHtmlList.length; i++ ) { + var className = 'cke_dialog_ui_hbox_child', + styles = []; + if ( i === 0 ) + className = 'cke_dialog_ui_hbox_first'; + if ( i == childHtmlList.length - 1 ) + className = 'cke_dialog_ui_hbox_last'; + html.push( ' 0 ) + html.push( 'style="' + styles.join( '; ' ) + '" ' ); + html.push( '>', childHtmlList[ i ], '' ); + } + html.push( '' ); + return html.join( '' ); + }; + + var attribs = { role: 'presentation' }; + elementDefinition && elementDefinition.align && ( attribs.align = elementDefinition.align ); + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'hbox' }, htmlList, 'table', styles, attribs, innerHTML ); + }, + + /** + * Vertical layout box for dialog UI elements. + * + * @class CKEDITOR.ui.dialog.vbox + * @extends CKEDITOR.ui.dialog.hbox + * @constructor Creates a vbox class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog object. + * @param {Array} childObjList + * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this container. + * @param {Array} childHtmlList + * Array of HTML code that correspond to the HTML output of all the + * objects in childObjList. + * @param {Array} htmlList Array of HTML code that this element will output to. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `width` (Optional) The width of the layout. + * * `heights` (Optional) The heights of individual cells. + * * `align` (Optional) The alignment of the layout. + * * `padding` (Optional) The padding width inside child cells. + * * `expand` (Optional) Whether the layout should expand + * vertically to fill its container. + */ + vbox: function( dialog, childObjList, childHtmlList, htmlList, elementDefinition ) { + if ( arguments.length < 3 ) + return; + + this._ || ( this._ = {} ); + + var children = this._.children = childObjList, + width = elementDefinition && elementDefinition.width || null, + heights = elementDefinition && elementDefinition.heights || null; + /** @ignore */ + var innerHTML = function() { + var html = [ '' ); + for ( var i = 0; i < childHtmlList.length; i++ ) { + var styles = []; + html.push( '' ); + } + html.push( '
0 ) + html.push( 'style="', styles.join( '; ' ), '" ' ); + html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[ i ], '
' ); + return html.join( '' ); + }; + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition || { type: 'vbox' }, htmlList, 'div', null, { role: 'presentation' }, innerHTML ); + } + }; + } )(); + + /** @class CKEDITOR.ui.dialog.uiElement */ + CKEDITOR.ui.dialog.uiElement.prototype = { + /** + * Gets the root DOM element of this dialog UI object. + * + * uiElement.getElement().hide(); + * + * @returns {CKEDITOR.dom.element} Root DOM element of UI object. + */ + getElement: function() { + return CKEDITOR.document.getById( this.domId ); + }, + + /** + * Gets the DOM element that the user inputs values. + * + * This function is used by {@link #setValue}, {@link #getValue} and {@link #focus}. It should + * be overrided in child classes where the input element isn't the root + * element. + * + * var rawValue = textInput.getInputElement().$.value; + * + * @returns {CKEDITOR.dom.element} The element where the user input values. + */ + getInputElement: function() { + return this.getElement(); + }, + + /** + * Gets the parent dialog object containing this UI element. + * + * var dialog = uiElement.getDialog(); + * + * @returns {CKEDITOR.dialog} Parent dialog object. + */ + getDialog: function() { + return this._.dialog; + }, + + /** + * Sets the value of this dialog UI object. + * + * uiElement.setValue( 'Dingo' ); + * + * @chainable + * @param {Object} value The new value. + * @param {Boolean} noChangeEvent Internal commit, to supress `change` event on this element. + */ + setValue: function( value, noChangeEvent ) { + this.getInputElement().setValue( value ); + !noChangeEvent && this.fire( 'change', { value: value } ); + return this; + }, + + /** + * Gets the current value of this dialog UI object. + * + * var myValue = uiElement.getValue(); + * + * @returns {Object} The current value. + */ + getValue: function() { + return this.getInputElement().getValue(); + }, + + /** + * Tells whether the UI object's value has changed. + * + * if ( uiElement.isChanged() ) + * confirm( 'Value changed! Continue?' ); + * + * @returns {Boolean} `true` if changed, `false` if not changed. + */ + isChanged: function() { + // Override in input classes. + return false; + }, + + /** + * Selects the parent tab of this element. Usually called by focus() or overridden focus() methods. + * + * focus : function() { + * this.selectParentTab(); + * // do something else. + * } + * + * @chainable + */ + selectParentTab: function() { + var element = this.getInputElement(), + cursor = element, + tabId; + while ( ( cursor = cursor.getParent() ) && cursor.$.className.search( 'cke_dialog_page_contents' ) == -1 ) { + /*jsl:pass*/ + } + + // Some widgets don't have parent tabs (e.g. OK and Cancel buttons). + if ( !cursor ) + return this; + + tabId = cursor.getAttribute( 'name' ); + // Avoid duplicate select. + if ( this._.dialog._.currentTabId != tabId ) + this._.dialog.selectPage( tabId ); + return this; + }, + + /** + * Puts the focus to the UI object. Switches tabs if the UI object isn't in the active tab page. + * + * uiElement.focus(); + * + * @chainable + */ + focus: function() { + this.selectParentTab().getInputElement().focus(); + return this; + }, + + /** + * Registers the `on*` event handlers defined in the element definition. + * + * The default behavior of this function is: + * + * 1. If the on* event is defined in the class's eventProcesors list, + * then the registration is delegated to the corresponding function + * in the eventProcessors list. + * 2. If the on* event is not defined in the eventProcessors list, then + * register the event handler under the corresponding DOM event of + * the UI element's input DOM element (as defined by the return value + * of {@link #getInputElement}). + * + * This function is only called at UI element instantiation, but can + * be overridded in child classes if they require more flexibility. + * + * @chainable + * @param {CKEDITOR.dialog.definition.uiElement} definition The UI element + * definition. + */ + registerEvents: function( definition ) { + var regex = /^on([A-Z]\w+)/, + match; + + var registerDomEvent = function( uiElement, dialog, eventName, func ) { + dialog.on( 'load', function() { + uiElement.getInputElement().on( eventName, func, uiElement ); + } ); + }; + + for ( var i in definition ) { + if ( !( match = i.match( regex ) ) ) + continue; + if ( this.eventProcessors[ i ] ) + this.eventProcessors[ i ].call( this, this._.dialog, definition[ i ] ); + else + registerDomEvent( this, this._.dialog, match[ 1 ].toLowerCase(), definition[ i ] ); + } + + return this; + }, + + /** + * The event processor list used by + * {@link CKEDITOR.ui.dialog.uiElement#getInputElement} at UI element + * instantiation. The default list defines three `on*` events: + * + * 1. `onLoad` - Called when the element's parent dialog opens for the + * first time. + * 2. `onShow` - Called whenever the element's parent dialog opens. + * 3. `onHide` - Called whenever the element's parent dialog closes. + * + * // This connects the 'click' event in CKEDITOR.ui.dialog.button to onClick + * // handlers in the UI element's definitions. + * CKEDITOR.ui.dialog.button.eventProcessors = CKEDITOR.tools.extend( {}, + * CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, + * { onClick : function( dialog, func ) { this.on( 'click', func ); } }, + * true + * ); + * + * @property {Object} + */ + eventProcessors: { + onLoad: function( dialog, func ) { + dialog.on( 'load', func, this ); + }, + + onShow: function( dialog, func ) { + dialog.on( 'show', func, this ); + }, + + onHide: function( dialog, func ) { + dialog.on( 'hide', func, this ); + } + }, + + /** + * The default handler for a UI element's access key down event, which + * tries to put focus to the UI element. + * + * Can be overridded in child classes for more sophisticaed behavior. + * + * @param {CKEDITOR.dialog} dialog The parent dialog object. + * @param {String} key The key combination pressed. Since access keys + * are defined to always include the `CTRL` key, its value should always + * include a `'CTRL+'` prefix. + */ + accessKeyDown: function( dialog, key ) { + this.focus(); + }, + + /** + * The default handler for a UI element's access key up event, which + * does nothing. + * + * Can be overridded in child classes for more sophisticated behavior. + * + * @param {CKEDITOR.dialog} dialog The parent dialog object. + * @param {String} key The key combination pressed. Since access keys + * are defined to always include the `CTRL` key, its value should always + * include a `'CTRL+'` prefix. + */ + accessKeyUp: function( dialog, key ) {}, + + /** + * Disables a UI element. + */ + disable: function() { + var element = this.getElement(), + input = this.getInputElement(); + input.setAttribute( 'disabled', 'true' ); + element.addClass( 'cke_disabled' ); + }, + + /** + * Enables a UI element. + */ + enable: function() { + var element = this.getElement(), + input = this.getInputElement(); + input.removeAttribute( 'disabled' ); + element.removeClass( 'cke_disabled' ); + }, + + /** + * Determines whether an UI element is enabled or not. + * + * @returns {Boolean} Whether the UI element is enabled. + */ + isEnabled: function() { + return !this.getElement().hasClass( 'cke_disabled' ); + }, + + /** + * Determines whether an UI element is visible or not. + * + * @returns {Boolean} Whether the UI element is visible. + */ + isVisible: function() { + return this.getInputElement().isVisible(); + }, + + /** + * Determines whether an UI element is focus-able or not. + * Focus-able is defined as being both visible and enabled. + * + * @returns {Boolean} Whether the UI element can be focused. + */ + isFocusable: function() { + if ( !this.isEnabled() || !this.isVisible() ) + return false; + return true; + } + }; + + /** @class CKEDITOR.ui.dialog.hbox */ + CKEDITOR.ui.dialog.hbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement, { + /** + * Gets a child UI element inside this container. + * + * var checkbox = hbox.getChild( [0,1] ); + * checkbox.setValue( true ); + * + * @param {Array/Number} indices An array or a single number to indicate the child's + * position in the container's descendant tree. Omit to get all the children in an array. + * @returns {Array/CKEDITOR.ui.dialog.uiElement} Array of all UI elements in the container + * if no argument given, or the specified UI element if indices is given. + */ + getChild: function( indices ) { + // If no arguments, return a clone of the children array. + if ( arguments.length < 1 ) + return this._.children.concat(); + + // If indices isn't array, make it one. + if ( !indices.splice ) + indices = [ indices ]; + + // Retrieve the child element according to tree position. + if ( indices.length < 2 ) + return this._.children[ indices[ 0 ] ]; + else + return ( this._.children[ indices[ 0 ] ] && this._.children[ indices[ 0 ] ].getChild ) ? this._.children[ indices[ 0 ] ].getChild( indices.slice( 1, indices.length ) ) : null; + } + }, true ); + + CKEDITOR.ui.dialog.vbox.prototype = new CKEDITOR.ui.dialog.hbox(); + + ( function() { + var commonBuilder = { + build: function( dialog, elementDefinition, output ) { + var children = elementDefinition.children, + child, + childHtmlList = [], + childObjList = []; + for ( var i = 0; + ( i < children.length && ( child = children[ i ] ) ); i++ ) { + var childHtml = []; + childHtmlList.push( childHtml ); + childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); + } + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); + } + }; + + CKEDITOR.dialog.addUIElement( 'hbox', commonBuilder ); + CKEDITOR.dialog.addUIElement( 'vbox', commonBuilder ); + } )(); + + /** + * Generic dialog command. It opens a specific dialog when executed. + * + * // Register the "link" command, which opens the "link" dialog. + * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) ); + * + * @class + * @constructor Creates a dialogCommand class instance. + * @extends CKEDITOR.commandDefinition + * @param {String} dialogName The name of the dialog to open when executing + * this command. + * @param {Object} [ext] Additional command definition's properties. + */ + CKEDITOR.dialogCommand = function( dialogName, ext ) { + this.dialogName = dialogName; + CKEDITOR.tools.extend( this, ext, true ); + }; + + CKEDITOR.dialogCommand.prototype = { + exec: function( editor ) { + editor.openDialog( this.dialogName ); + }, + + // Dialog commands just open a dialog ui, thus require no undo logic, + // undo support should dedicate to specific dialog implementation. + canUndo: false, + + editorFocus: 1 + }; + + ( function() { + var notEmptyRegex = /^([a]|[^a])+$/, + integerRegex = /^\d*$/, + numberRegex = /^\d*(?:\.\d+)?$/, + htmlLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/, + cssLengthRegex = /^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i, + inlineStyleRegex = /^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/; + + CKEDITOR.VALIDATE_OR = 1; + CKEDITOR.VALIDATE_AND = 2; + + CKEDITOR.dialog.validate = { + functions: function() { + var args = arguments; + return function() { + /** + * It's important for validate functions to be able to accept the value + * as argument in addition to this.getValue(), so that it is possible to + * combine validate functions together to make more sophisticated + * validators. + */ + var value = this && this.getValue ? this.getValue() : args[ 0 ]; + + var msg = undefined, + relation = CKEDITOR.VALIDATE_AND, + functions = [], + i; + + for ( i = 0; i < args.length; i++ ) { + if ( typeof( args[ i ] ) == 'function' ) + functions.push( args[ i ] ); + else + break; + } + + if ( i < args.length && typeof( args[ i ] ) == 'string' ) { + msg = args[ i ]; + i++; + } + + if ( i < args.length && typeof( args[ i ] ) == 'number' ) + relation = args[ i ]; + + var passed = ( relation == CKEDITOR.VALIDATE_AND ? true : false ); + for ( i = 0; i < functions.length; i++ ) { + if ( relation == CKEDITOR.VALIDATE_AND ) + passed = passed && functions[ i ]( value ); + else + passed = passed || functions[ i ]( value ); + } + + return !passed ? msg : true; + }; + }, + + regex: function( regex, msg ) { + /* + * Can be greatly shortened by deriving from functions validator if code size + * turns out to be more important than performance. + */ + return function() { + var value = this && this.getValue ? this.getValue() : arguments[ 0 ]; + return !regex.test( value ) ? msg : true; + }; + }, + + notEmpty: function( msg ) { + return this.regex( notEmptyRegex, msg ); + }, + + integer: function( msg ) { + return this.regex( integerRegex, msg ); + }, + + 'number': function( msg ) { + return this.regex( numberRegex, msg ); + }, + + 'cssLength': function( msg ) { + return this.functions( function( val ) { + return cssLengthRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + 'htmlLength': function( msg ) { + return this.functions( function( val ) { + return htmlLengthRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + 'inlineStyle': function( msg ) { + return this.functions( function( val ) { + return inlineStyleRegex.test( CKEDITOR.tools.trim( val ) ); + }, msg ); + }, + + equals: function( value, msg ) { + return this.functions( function( val ) { + return val == value; + }, msg ); + }, + + notEqual: function( value, msg ) { + return this.functions( function( val ) { + return val != value; + }, msg ); + } + }; + + CKEDITOR.on( 'instanceDestroyed', function( evt ) { + // Remove dialog cover on last instance destroy. + if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) ) { + var currentTopDialog; + while ( ( currentTopDialog = CKEDITOR.dialog._.currentTop ) ) + currentTopDialog.hide(); + removeCovers(); + } + + var dialogs = evt.editor._.storedDialogs; + for ( var name in dialogs ) + dialogs[ name ].destroy(); + + } ); + + } )(); + + // Extend the CKEDITOR.editor class with dialog specific functions. + CKEDITOR.tools.extend( CKEDITOR.editor.prototype, { + /** + * Loads and opens a registered dialog. + * + * CKEDITOR.instances.editor1.openDialog( 'smiley' ); + * + * @member CKEDITOR.editor + * @param {String} dialogName The registered name of the dialog. + * @param {Function} callback The function to be invoked after dialog instance created. + * @returns {CKEDITOR.dialog} The dialog object corresponding to the dialog displayed. + * `null` if the dialog name is not registered. + * @see CKEDITOR.dialog#add + */ + openDialog: function( dialogName, callback ) { + var dialog = null, dialogDefinitions = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; + + if ( CKEDITOR.dialog._.currentTop === null ) + showCover( this ); + + // If the dialogDefinition is already loaded, open it immediately. + if ( typeof dialogDefinitions == 'function' ) { + var storedDialogs = this._.storedDialogs || ( this._.storedDialogs = {} ); + + dialog = storedDialogs[ dialogName ] || ( storedDialogs[ dialogName ] = new CKEDITOR.dialog( this, dialogName ) ); + + callback && callback.call( dialog, dialog ); + dialog.show(); + + } else if ( dialogDefinitions == 'failed' ) { + hideCover( this ); + throw new Error( '[CKEDITOR.dialog.openDialog] Dialog "' + dialogName + '" failed when loading definition.' ); + } else if ( typeof dialogDefinitions == 'string' ) { + + CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( dialogDefinitions ), + function() { + var dialogDefinition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ]; + // In case of plugin error, mark it as loading failed. + if ( typeof dialogDefinition != 'function' ) + CKEDITOR.dialog._.dialogDefinitions[ dialogName ] = 'failed'; + + this.openDialog( dialogName, callback ); + }, this, 0, 1 ); + } + + CKEDITOR.skin.loadPart( 'dialog' ); + + return dialog; + } + } ); +} )(); + +CKEDITOR.plugins.add( 'dialog', { + requires: 'dialogui', + init: function( editor ) { + editor.on( 'doubleclick', function( evt ) { + if ( evt.data.dialog ) + editor.openDialog( evt.data.dialog ); + }, null, null, 999 ); + } +} ); + +// Dialog related configurations. + +/** + * The color of the dialog background cover. It should be a valid CSS color string. + * + * config.dialog_backgroundCoverColor = 'rgb(255, 254, 253)'; + * + * @cfg {String} [dialog_backgroundCoverColor='white'] + * @member CKEDITOR.config + */ + +/** + * The opacity of the dialog background cover. It should be a number within the + * range `[0.0, 1.0]`. + * + * config.dialog_backgroundCoverOpacity = 0.7; + * + * @cfg {Number} [dialog_backgroundCoverOpacity=0.5] + * @member CKEDITOR.config + */ + +/** + * If the dialog has more than one tab, put focus into the first tab as soon as dialog is opened. + * + * config.dialog_startupFocusTab = true; + * + * @cfg {Boolean} [dialog_startupFocusTab=false] + * @member CKEDITOR.config + */ + +/** + * The distance of magnetic borders used in moving and resizing dialogs, + * measured in pixels. + * + * config.dialog_magnetDistance = 30; + * + * @cfg {Number} [dialog_magnetDistance=20] + * @member CKEDITOR.config + */ + +/** + * The guideline to follow when generating the dialog buttons. There are 3 possible options: + * + * * `'OS'` - the buttons will be displayed in the default order of the user's OS; + * * `'ltr'` - for Left-To-Right order; + * * `'rtl'` - for Right-To-Left order. + * + * Example: + * + * config.dialog_buttonsOrder = 'rtl'; + * + * @since 3.5 + * @cfg {String} [dialog_buttonsOrder='OS'] + * @member CKEDITOR.config + */ + +/** + * The dialog contents to removed. It's a string composed by dialog name and tab name with a colon between them. + * + * Separate each pair with semicolon (see example). + * + * **Note:** All names are case-sensitive. + * + * **Note:** Be cautious when specifying dialog tabs that are mandatory, + * like `'info'`, dialog functionality might be broken because of this! + * + * config.removeDialogTabs = 'flash:advanced;image:Link'; + * + * @since 3.5 + * @cfg {String} [removeDialogTabs=''] + * @member CKEDITOR.config + */ + +/** + * Tells if user should not be asked to confirm close, if any dialog field was modified. + * By default it is set to `false` meaning that the confirmation dialog will be shown. + * + * config.dialog_noConfirmCancel = true; + * + * @since 4.3 + * @cfg {Boolean} [dialog_noConfirmCancel=false] + * @member CKEDITOR.config + */ + +/** + * Fired when a dialog definition is about to be used to create a dialog into + * an editor instance. This event makes it possible to customize the definition + * before creating it. + * + * Note that this event is called only the first time a specific dialog is + * opened. Successive openings will use the cached dialog, and this event will + * not get fired. + * + * @event dialogDefinition + * @member CKEDITOR + * @param {CKEDITOR.dialog.definition} data The dialog defination that + * is being loaded. + * @param {CKEDITOR.editor} editor The editor instance that will use the dialog. + */ + +/** + * Fired when a tab is going to be selected in a dialog. + * + * @event selectPage + * @member CKEDITOR.dialog + * @param data + * @param {String} data.page The id of the page that it's gonna be selected. + * @param {String} data.currentPage The id of the current page. + */ + +/** + * Fired when the user tries to dismiss a dialog. + * + * @event cancel + * @member CKEDITOR.dialog + * @param data + * @param {Boolean} data.hide Whether the event should proceed or not. + */ + +/** + * Fired when the user tries to confirm a dialog. + * + * @event ok + * @member CKEDITOR.dialog + * @param data + * @param {Boolean} data.hide Whether the event should proceed or not. + */ + +/** + * Fired when a dialog is shown. + * + * @event show + * @member CKEDITOR.dialog + */ + +/** + * Fired when a dialog is shown. + * + * @event dialogShow + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {CKEDITOR.dialog} data The opened dialog instance. + */ + +/** + * Fired when a dialog is hidden. + * + * @event hide + * @member CKEDITOR.dialog + */ + +/** + * Fired when a dialog is hidden. + * + * @event dialogHide + * @member CKEDITOR.editor + * @param {CKEDITOR.editor} editor This editor instance. + * @param {CKEDITOR.dialog} data The hidden dialog instance. + */ + +/** + * Fired when a dialog is being resized. The event is fired on + * both the {@link CKEDITOR.dialog} object and the dialog instance + * since 3.5.3, previously it's available only in the global object. + * + * @static + * @event resize + * @member CKEDITOR.dialog + * @param data + * @param {CKEDITOR.dialog} data.dialog The dialog being resized (if + * it's fired on the dialog itself, this parameter isn't sent). + * @param {String} data.skin The skin name. + * @param {Number} data.width The new width. + * @param {Number} data.height The new height. + */ + +/** + * Fired when a dialog is being resized. The event is fired on + * both the {@link CKEDITOR.dialog} object and the dialog instance + * since 3.5.3, previously it's available only in the global object. + * + * @since 3.5 + * @event resize + * @member CKEDITOR.dialog + * @param data + * @param {Number} data.width The new width. + * @param {Number} data.height The new height. + */ diff --git a/scripts/ckeditor/plugins/dialog/samples/assets/my_dialog.js b/scripts/ckeditor/plugins/dialog/samples/assets/my_dialog.js new file mode 100755 index 00000000..89ab058a --- /dev/null +++ b/scripts/ckeditor/plugins/dialog/samples/assets/my_dialog.js @@ -0,0 +1,49 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'myDialog', function( editor ) { + return { + title: 'My Dialog', + minWidth: 400, + minHeight: 200, + contents: [ + { + id: 'tab1', + label: 'First Tab', + title: 'First Tab', + elements: [ + { + id: 'input1', + type: 'text', + label: 'Text Field' + }, + { + id: 'select1', + type: 'select', + label: 'Select Field', + items: [ + [ 'option1', 'value1' ], + [ 'option2', 'value2' ] + ] + } + ] + }, + { + id: 'tab2', + label: 'Second Tab', + title: 'Second Tab', + elements: [ + { + id: 'button1', + type: 'button', + label: 'Button Field' + } + ] + } + ] + }; +} ); + +// %LEAVE_UNMINIFIED% %REMOVE_LINE% diff --git a/scripts/ckeditor/plugins/dialog/samples/dialog.html b/scripts/ckeditor/plugins/dialog/samples/dialog.html new file mode 100755 index 00000000..df09d25b --- /dev/null +++ b/scripts/ckeditor/plugins/dialog/samples/dialog.html @@ -0,0 +1,187 @@ + + + + + + Using API to Customize Dialog Windows — CKEditor Sample + + + + + + + + + +

+ CKEditor Samples » Using CKEditor Dialog API +

+
+

+ This sample shows how to use the + CKEditor Dialog API + to customize CKEditor dialog windows without changing the original editor code. + The following customizations are being done in the example below: +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+

A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

+
    +
  1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
  2. +
  3. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.
  4. +
+ + +

The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

+
    +
  1. Adding dialog tab – Add new tab "My Tab" to dialog window.
  2. +
  3. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
  4. +
  5. Adding dialog window fields – Add "My Custom Field" to the dialog window.
  6. +
  7. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
  8. +
  9. Setting default values for dialog window fields – Set default value of "Text Field" text field.
  10. +
  11. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
  12. +
+ + + + + diff --git a/scripts/ckeditor/plugins/dialog/timestamp/icons/timestamp.png b/scripts/ckeditor/plugins/dialog/timestamp/icons/timestamp.png new file mode 100755 index 00000000..e2672c20 Binary files /dev/null and b/scripts/ckeditor/plugins/dialog/timestamp/icons/timestamp.png differ diff --git a/scripts/ckeditor/plugins/dialog/timestamp/plugin.js b/scripts/ckeditor/plugins/dialog/timestamp/plugin.js new file mode 100755 index 00000000..6c1f2aa4 --- /dev/null +++ b/scripts/ckeditor/plugins/dialog/timestamp/plugin.js @@ -0,0 +1,36 @@ +/** + * Basic sample plugin inserting current date and time into CKEditor editing area. + * + * Created out of the CKEditor Plugin SDK: + * http://docs.ckeditor.com/#!/guide/plugin_sdk_intro + */ + +// Register the plugin within the editor. +CKEDITOR.plugins.add( 'timestamp', { + + // Register the icons. They must match command names. + icons: 'timestamp', + + // The plugin initialization logic goes inside this method. + init: function( editor ) { + + // Define an editor command that inserts a timestamp. + editor.addCommand( 'insertTimestamp', { + + // Define the function that will be fired when the command is executed. + exec: function( editor ) { + var now = new Date(); + + // Insert the timestamp into the document. + editor.insertHtml( 'The current date and time is: ' + now.toString() + '.' ); + } + }); + + // Create the toolbar button that executes the above command. + editor.ui.addButton( 'Timestamp', { + label: 'Insert Timestamp', + command: 'insertTimestamp', + toolbar: 'insert' + }); + } +}); \ No newline at end of file diff --git a/scripts/ckeditor/plugins/dialogadvtab/plugin.js b/scripts/ckeditor/plugins/dialogadvtab/plugin.js new file mode 100755 index 00000000..329b9342 --- /dev/null +++ b/scripts/ckeditor/plugins/dialogadvtab/plugin.js @@ -0,0 +1,200 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +( function() { + + function setupAdvParams( element ) { + var attrName = this.att; + + var value = element && element.hasAttribute( attrName ) && element.getAttribute( attrName ) || ''; + + if ( value !== undefined ) + this.setValue( value ); + } + + function commitAdvParams() { + // Dialogs may use different parameters in the commit list, so, by + // definition, we take the first CKEDITOR.dom.element available. + var element; + + for ( var i = 0; i < arguments.length; i++ ) { + if ( arguments[ i ] instanceof CKEDITOR.dom.element ) { + element = arguments[ i ]; + break; + } + } + + if ( element ) { + var attrName = this.att, + value = this.getValue(); + + if ( value ) + element.setAttribute( attrName, value ); + else + element.removeAttribute( attrName, value ); + } + } + + var defaultTabConfig = { id: 1, dir: 1, classes: 1, styles: 1 }; + + CKEDITOR.plugins.add( 'dialogadvtab', { + requires : 'dialog', + + // Returns allowed content rule for the content created by this plugin. + allowedContent: function( tabConfig ) { + if ( !tabConfig ) + tabConfig = defaultTabConfig; + + var allowedAttrs = []; + if ( tabConfig.id ) + allowedAttrs.push( 'id' ); + if ( tabConfig.dir ) + allowedAttrs.push( 'dir' ); + + var allowed = ''; + + if ( allowedAttrs.length ) + allowed += '[' + allowedAttrs.join( ',' ) + ']'; + + if ( tabConfig.classes ) + allowed += '(*)'; + if ( tabConfig.styles ) + allowed += '{*}'; + + return allowed; + }, + + // @param tabConfig + // id, dir, classes, styles + createAdvancedTab: function( editor, tabConfig, element ) { + if ( !tabConfig ) + tabConfig = defaultTabConfig; + + var lang = editor.lang.common; + + var result = { + id: 'advanced', + label: lang.advancedTab, + title: lang.advancedTab, + elements: [ + { + type: 'vbox', + padding: 1, + children: [] + } + ] + }; + + var contents = []; + + if ( tabConfig.id || tabConfig.dir ) { + if ( tabConfig.id ) { + contents.push( { + id: 'advId', + att: 'id', + type: 'text', + requiredContent: element ? element + '[id]' : null, + label: lang.id, + setup: setupAdvParams, + commit: commitAdvParams + } ); + } + + if ( tabConfig.dir ) { + contents.push( { + id: 'advLangDir', + att: 'dir', + type: 'select', + requiredContent: element ? element + '[dir]' : null, + label: lang.langDir, + 'default': '', + style: 'width:100%', + items: [ + [ lang.notSet, '' ], + [ lang.langDirLTR, 'ltr' ], + [ lang.langDirRTL, 'rtl' ] + ], + setup: setupAdvParams, + commit: commitAdvParams + } ); + } + + result.elements[ 0 ].children.push( { + type: 'hbox', + widths: [ '50%', '50%' ], + children: [].concat( contents ) + } ); + } + + if ( tabConfig.styles || tabConfig.classes ) { + contents = []; + + if ( tabConfig.styles ) { + contents.push( { + id: 'advStyles', + att: 'style', + type: 'text', + requiredContent: element ? element + '{cke-xyz}' : null, + label: lang.styles, + 'default': '', + + validate: CKEDITOR.dialog.validate.inlineStyle( lang.invalidInlineStyle ), + onChange: function() {}, + + getStyle: function( name, defaultValue ) { + var match = this.getValue().match( new RegExp( '(?:^|;)\\s*' + name + '\\s*:\\s*([^;]*)', 'i' ) ); + return match ? match[ 1 ] : defaultValue; + }, + + updateStyle: function( name, value ) { + var styles = this.getValue(); + + var tmp = editor.document.createElement( 'span' ); + tmp.setAttribute( 'style', styles ); + tmp.setStyle( name, value ); + styles = CKEDITOR.tools.normalizeCssText( tmp.getAttribute( 'style' ) ); + + this.setValue( styles, 1 ); + }, + + setup: setupAdvParams, + + commit: commitAdvParams + + } ); + } + + if ( tabConfig.classes ) { + contents.push( { + type: 'hbox', + widths: [ '45%', '55%' ], + children: [ + { + id: 'advCSSClasses', + att: 'class', + type: 'text', + requiredContent: element ? element + '(cke-xyz)' : null, + label: lang.cssClasses, + 'default': '', + setup: setupAdvParams, + commit: commitAdvParams + + } + ] + } ); + } + + result.elements[ 0 ].children.push( { + type: 'hbox', + widths: [ '50%', '50%' ], + children: [].concat( contents ) + } ); + } + + return result; + } + } ); + +} )(); diff --git a/scripts/ckeditor/plugins/dialogui/plugin.js b/scripts/ckeditor/plugins/dialogui/plugin.js new file mode 100755 index 00000000..91ea255f --- /dev/null +++ b/scripts/ckeditor/plugins/dialogui/plugin.js @@ -0,0 +1,1426 @@ +/** + * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview The Dialog User Interface plugin. + */ + +CKEDITOR.plugins.add( 'dialogui', { + onLoad: function() { + + var initPrivateObject = function( elementDefinition ) { + this._ || ( this._ = {} ); + this._[ 'default' ] = this._.initValue = elementDefinition[ 'default' ] || ''; + this._.required = elementDefinition[ 'required' ] || false; + var args = [ this._ ]; + for ( var i = 1; i < arguments.length; i++ ) + args.push( arguments[ i ] ); + args.push( true ); + CKEDITOR.tools.extend.apply( CKEDITOR.tools, args ); + return this._; + }, + textBuilder = { + build: function( dialog, elementDefinition, output ) { + return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output ); + } + }, + commonBuilder = { + build: function( dialog, elementDefinition, output ) { + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, elementDefinition, output ); + } + }, + containerBuilder = { + build: function( dialog, elementDefinition, output ) { + var children = elementDefinition.children, + child, + childHtmlList = [], + childObjList = []; + for ( var i = 0; + ( i < children.length && ( child = children[ i ] ) ); i++ ) { + var childHtml = []; + childHtmlList.push( childHtml ); + childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); + } + return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); + } + }, + commonPrototype = { + isChanged: function() { + return this.getValue() != this.getInitValue(); + }, + + reset: function( noChangeEvent ) { + this.setValue( this.getInitValue(), noChangeEvent ); + }, + + setInitValue: function() { + this._.initValue = this.getValue(); + }, + + resetInitValue: function() { + this._.initValue = this._[ 'default' ]; + }, + + getInitValue: function() { + return this._.initValue; + } + }, + commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { + onChange: function( dialog, func ) { + if ( !this._.domOnChangeRegistered ) { + dialog.on( 'load', function() { + this.getInputElement().on( 'change', function() { + // Make sure 'onchange' doesn't get fired after dialog closed. (#5719) + if ( !dialog.parts.dialog.isVisible() ) + return; + + this.fire( 'change', { value: this.getValue() } ); + }, this ); + }, this ); + this._.domOnChangeRegistered = true; + } + + this.on( 'change', func ); + } + }, true ), + eventRegex = /^on([A-Z]\w+)/, + cleanInnerDefinition = function( def ) { + // An inner UI element should not have the parent's type, title or events. + for ( var i in def ) { + if ( eventRegex.test( i ) || i == 'title' || i == 'type' ) + delete def[ i ]; + } + return def; + }; + + CKEDITOR.tools.extend( CKEDITOR.ui.dialog, { + /** + * Base class for all dialog window elements with a textual label on the left. + * + * @class CKEDITOR.ui.dialog.labeledElement + * @extends CKEDITOR.ui.dialog.uiElement + * @constructor Creates a labeledElement class instance. + * @param {CKEDITOR.dialog} dialog Parent dialog window object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * * `label` (Required) The label string. + * * `labelLayout` (Optional) Put 'horizontal' here if the + * label element is to be laid out horizontally. Otherwise a vertical + * layout will be used. + * * `widths` (Optional) This applies only to horizontal + * layouts — a two-element array of lengths to specify the widths of the + * label and the content element. + * * `role` (Optional) Value for the `role` attribute. + * * `includeLabel` (Optional) If set to `true`, the `aria-labelledby` attribute + * will be included. + * + * @param {Array} htmlList The list of HTML code to output to. + * @param {Function} contentHtml + * A function returning the HTML code string to be added inside the content + * cell. + */ + labeledElement: function( dialog, elementDefinition, htmlList, contentHtml ) { + if ( arguments.length < 4 ) + return; + + var _ = initPrivateObject.call( this, elementDefinition ); + _.labelId = CKEDITOR.tools.getNextId() + '_label'; + var children = this._.children = []; + + var innerHTML = function() { + var html = [], + requiredClass = elementDefinition.required ? ' cke_required' : ''; + if ( elementDefinition.labelLayout != 'horizontal' ) { + html.push( + '', + '' ); + } else { + var hboxDefinition = { + type: 'hbox', + widths: elementDefinition.widths, + padding: 0, + children: [ + { + type: 'html', + html: '