diff --git a/addons/website/static/lib/ckeditor.sharedspace/plugin.js b/addons/website/static/lib/ckeditor.sharedspace/plugin.js
new file mode 100644
index 00000000000..ae8ddc79eb4
--- /dev/null
+++ b/addons/website/static/lib/ckeditor.sharedspace/plugin.js
@@ -0,0 +1,124 @@
+/**
+ * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+(function() {
+
+ 'use strict';
+
+ var containerTpl = CKEDITOR.addTemplate( 'sharedcontainer', '
' );
+
+ CKEDITOR.plugins.add( 'sharedspace', {
+ afterInit: function( editor ) {
+ var spaces = editor.config.sharedSpaces;
+
+ if ( spaces ) {
+ for ( var spaceName in spaces ) {
+ create( editor, spaceName, spaces[ spaceName ] );
+ }
+ }
+ }
+ });
+
+ function create( editor, spaceName, targetId ) {
+ var target = CKEDITOR.document.getById( targetId ),
+ innerHtml, space;
+
+ if ( target ) {
+ // Have other plugins filling the space.
+ innerHtml = editor.fire( 'uiSpace', { space: spaceName, html: '' } ).html;
+
+ if ( innerHtml ) {
+ // Block the uiSpace handling by others (e.g. themed-ui).
+ editor.on( 'uiSpace', function( ev ) {
+ if ( ev.data.space == spaceName )
+ ev.cancel();
+ }, null, null, 1 ); // Hi-priority
+
+ // Inject the space into the target.
+ space = target.append( CKEDITOR.dom.element.createFromHtml( containerTpl.output({
+ id: editor.id,
+ name: editor.name,
+ langDir: editor.lang.dir,
+ langCode: editor.langCode,
+ space: spaceName,
+ spaceId: editor.ui.spaceId( spaceName ),
+ content: innerHtml
+ })));
+
+ // Only the first container starts visible. Others get hidden.
+ if ( target.getCustomData( 'cke_hasshared' ) )
+ space.hide();
+ else
+ target.setCustomData( 'cke_hasshared', 1 );
+
+ // There's no need for the space to be selectable.
+ space.unselectable();
+
+ // Prevent clicking on non-buttons area of the space from blurring editor.
+ space.on( 'mousedown', function( evt ) {
+ evt = evt.data;
+ if ( !evt.getTarget().hasAscendant( 'a', 1 ) )
+ evt.preventDefault();
+ });
+
+ // Register this UI space to the focus manager.
+ editor.focusManager.add( space, 1 );
+
+ // When the editor gets focus, show the space container, hiding others.
+ editor.on( 'focus', function() {
+ for ( var i = 0, sibling, children = target.getChildren(); ( sibling = children.getItem( i ) ); i++ ) {
+ if ( sibling.type == CKEDITOR.NODE_ELEMENT &&
+ !sibling.equals( space ) &&
+ sibling.hasClass( 'cke_shared' ) ) {
+ sibling.hide();
+ }
+ }
+
+ space.show();
+ });
+
+ editor.on( 'destroy', function() {
+ space.remove();
+ });
+ }
+ }
+ }
+})();
+
+/**
+ * Makes it possible to place some of the editor UI blocks, like the toolbar
+ * and the elements path, into any element in the page.
+ *
+ * The elements used to hold the UI blocks can be shared among several editor
+ * instances. In that case, only the blocks of the active editor instance will
+ * display.
+ *
+ * // Place the toolbar inside the element with ID "someElementId" and the
+ * // elements path into the element with ID "anotherId".
+ * config.sharedSpaces = {
+ * top: 'someElementId',
+ * bottom: 'anotherId'
+ * };
+ *
+ * // Place the toolbar inside the element with ID "someElementId". The
+ * // elements path will remain attached to the editor UI.
+ * config.sharedSpaces = {
+ * top: 'someElementId'
+ * };
+ *
+ * @cfg {Object} [sharedSpaces]
+ * @member CKEDITOR.config
+ */