activeadmin-ckeditor 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. data/.DS_Store +0 -0
  2. data/app/.DS_Store +0 -0
  3. data/app/assets/.DS_Store +0 -0
  4. data/app/assets/javascripts/.DS_Store +0 -0
  5. data/app/assets/javascripts/ckeditor/config.js +118 -0
  6. data/app/assets/stylesheets/.DS_Store +0 -0
  7. data/app/assets/stylesheets/activeadmin-ckeditor.css.sass +3 -0
  8. data/app/assets/stylesheets/ckeditor/.DS_Store +0 -0
  9. data/app/assets/stylesheets/ckeditor/plugins/.DS_Store +0 -0
  10. data/app/assets/stylesheets/ckeditor/plugins/autogrow/plugin.js +187 -0
  11. data/app/assets/stylesheets/ckeditor/plugins/autogrow/samples/autogrow.html +99 -0
  12. data/app/assets/stylesheets/ckeditor/plugins/floating-tools/README.md +20 -0
  13. data/app/assets/stylesheets/ckeditor/plugins/floating-tools/plugin.js +582 -0
  14. data/app/assets/stylesheets/ckeditor/plugins/imagepaste/docs/install.html +64 -0
  15. data/app/assets/stylesheets/ckeditor/plugins/imagepaste/docs/styles.css +59 -0
  16. data/app/assets/stylesheets/ckeditor/plugins/imagepaste/plugin.js +82 -0
  17. data/app/assets/stylesheets/ckeditor/plugins/stylesheetparser/plugin.js +152 -0
  18. data/app/assets/stylesheets/ckeditor/plugins/stylesheetparser/samples/assets/sample.css +70 -0
  19. data/app/assets/stylesheets/ckeditor/plugins/stylesheetparser/samples/stylesheetparser.html +82 -0
  20. data/app/assets/stylesheets/ckeditor/plugins/texttransform/LICENSE.md +28 -0
  21. data/app/assets/stylesheets/ckeditor/plugins/texttransform/README.md +55 -0
  22. data/app/assets/stylesheets/ckeditor/plugins/texttransform/images/transformCapitalize.png +0 -0
  23. data/app/assets/stylesheets/ckeditor/plugins/texttransform/images/transformSwitcher.png +0 -0
  24. data/app/assets/stylesheets/ckeditor/plugins/texttransform/images/transformToLower.png +0 -0
  25. data/app/assets/stylesheets/ckeditor/plugins/texttransform/images/transformToUpper.png +0 -0
  26. data/app/assets/stylesheets/ckeditor/plugins/texttransform/lang/en.js +17 -0
  27. data/app/assets/stylesheets/ckeditor/plugins/texttransform/lang/tr.js +41 -0
  28. data/app/assets/stylesheets/ckeditor/plugins/texttransform/plugin.js +151 -0
  29. data/app/assets/stylesheets/ckeditor/plugins/youtube/images/icon.png +0 -0
  30. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/de.js +21 -0
  31. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/en.js +21 -0
  32. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/fr.js +21 -0
  33. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/hu.js +21 -0
  34. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/it.js +21 -0
  35. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/ja.js +21 -0
  36. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/pt.js +21 -0
  37. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/ru.js +21 -0
  38. data/app/assets/stylesheets/ckeditor/plugins/youtube/lang/tr.js +21 -0
  39. data/app/assets/stylesheets/ckeditor/plugins/youtube/plugin.js +321 -0
  40. data/app/assets/stylesheets/ckeditor/skins/.DS_Store +0 -0
  41. data/app/assets/stylesheets/ckeditor/skins/moono/dev/icons16.png +0 -0
  42. data/app/assets/stylesheets/ckeditor/skins/moono/dev/icons16.svg +2106 -0
  43. data/app/assets/stylesheets/ckeditor/skins/moono/dev/icons32.png +0 -0
  44. data/app/assets/stylesheets/ckeditor/skins/moono/dev/icons32.svg +2442 -0
  45. data/app/assets/stylesheets/ckeditor/skins/moono/dev/locations.json +139 -0
  46. data/app/assets/stylesheets/ckeditor/skins/moono/dialog.css.scss +7 -0
  47. data/app/assets/stylesheets/ckeditor/skins/moono/dialog_ie.css.scss +7 -0
  48. data/app/assets/stylesheets/ckeditor/skins/moono/dialog_ie7.css.scss +7 -0
  49. data/app/assets/stylesheets/ckeditor/skins/moono/dialog_ie8.css.scss +8 -0
  50. data/app/assets/stylesheets/ckeditor/skins/moono/dialog_iequirks.css.scss +8 -0
  51. data/app/assets/stylesheets/ckeditor/skins/moono/dialog_opera.css.scss +8 -0
  52. data/app/assets/stylesheets/ckeditor/skins/moono/editor.css.scss +8 -0
  53. data/app/assets/stylesheets/ckeditor/skins/moono/editor_gecko.css.scss +8 -0
  54. data/app/assets/stylesheets/ckeditor/skins/moono/editor_ie.css.scss +8 -0
  55. data/app/assets/stylesheets/ckeditor/skins/moono/editor_ie7.css.scss +8 -0
  56. data/app/assets/stylesheets/ckeditor/skins/moono/editor_ie8.css.scss +8 -0
  57. data/app/assets/stylesheets/ckeditor/skins/moono/editor_iequirks.css.scss +8 -0
  58. data/app/assets/stylesheets/ckeditor/skins/moono/images/arrow.png +0 -0
  59. data/app/assets/stylesheets/ckeditor/skins/moono/images/close.png +0 -0
  60. data/app/assets/stylesheets/ckeditor/skins/moono/images/hidpi/close.png +0 -0
  61. data/app/assets/stylesheets/ckeditor/skins/moono/images/hidpi/lock-open.png +0 -0
  62. data/app/assets/stylesheets/ckeditor/skins/moono/images/hidpi/lock.png +0 -0
  63. data/app/assets/stylesheets/ckeditor/skins/moono/images/hidpi/refresh.png +0 -0
  64. data/app/assets/stylesheets/ckeditor/skins/moono/images/lock-open.png +0 -0
  65. data/app/assets/stylesheets/ckeditor/skins/moono/images/lock.png +0 -0
  66. data/app/assets/stylesheets/ckeditor/skins/moono/images/refresh.png +0 -0
  67. data/app/assets/stylesheets/ckeditor/skins/moono/readme.md +51 -0
  68. data/app/assets/stylesheets/ckeditor/skins/moono/skin.js +10 -0
  69. data/lib/.DS_Store +0 -0
  70. data/lib/activeadmin-ckeditor.rb +3 -3
  71. data/lib/activeadmin-ckeditor/engine.rb +9 -0
  72. data/lib/activeadmin-ckeditor/version.rb +1 -1
  73. data/lib/generators/.DS_Store +0 -0
  74. data/lib/generators/activeadmin/.DS_Store +0 -0
  75. data/lib/generators/activeadmin/ckeditor/install_generator.rb +19 -0
  76. metadata +74 -1
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Floating-Tools
3
+ * Author: Philipp Stracker (2013)
4
+ * Project page: http://stracker-phil.github.com/Floating-Tools/
5
+ */
6
+ (function() {
7
+
8
+ var floatingtools = function() {
9
+ this.dom = null; // the main toolbar-object
10
+ this.toolbars = [];
11
+ this.is_visible = false;
12
+
13
+ this.hide_on_blur = true; //!TODO: Make this an configuration option
14
+
15
+ this.toolbarsize = false;
16
+ this.editoroffset = false;
17
+ this.mousepos = {x:0, y:0};
18
+ };
19
+
20
+
21
+
22
+
23
+ CKEDITOR.plugins.add( 'floating-tools', {
24
+ requires: 'toolbar',
25
+
26
+
27
+ init: function( editor ) {
28
+
29
+
30
+ /**
31
+ * Create the UI elements required by this plugin
32
+ * UI is the floating toolbar
33
+ * Many parts of this function are taken from the toolbar plugin
34
+ */
35
+ editor.on( 'uiSpace', function( event ) {
36
+ // Create toolbar only once...
37
+ event.removeListener();
38
+
39
+ editor.floatingtools = new floatingtools();
40
+
41
+ var labelId = CKEDITOR.tools.getNextId();
42
+
43
+ var output = [
44
+ // Did not find a nicer way to include the CSS required for the toolbar...
45
+ '<style>',
46
+ '.pos-relative {position:relative}',
47
+ '.cke_floatingtools{',
48
+ 'position:absolute;',
49
+ 'left:0;',
50
+ 'top:-500px;',
51
+ 'padding: 5px 0 0 6px;',
52
+ 'border:1px solid #b1b1b1;',
53
+ 'border-radius:3px;',
54
+ 'box-shadow: 0 1px 10px rgba(0,0,0,0.3);',
55
+ 'transition:opacity .1s;-o-transition:opacity .1s;-moz-transition:opacity .1s;-webkit-transition:opacity .1s;',
56
+ '}',
57
+ '</style>',
58
+ '<span id="', labelId, '" class="cke_voice_label">', editor.lang.toolbar.toolbars, '</span>',
59
+ '<span id="' + editor.ui.spaceId( 'floatingtools' ) + '" class="cke_floatingtools cke_top" role="group" aria-labelledby="', labelId, '" onmousedown="return false;">' ];
60
+
61
+ var groupStarted, pendingSeparator;
62
+ var toolbars = editor.floatingtools.toolbars,
63
+ toolbar = getFloatingToolbarConfig( editor );
64
+
65
+
66
+ // Build the toolbar
67
+ for ( var r = 0; r < toolbar.length; r++ ) {
68
+ var toolbarId,
69
+ toolbarObj = 0,
70
+ toolbarName,
71
+ row = toolbar[ r ],
72
+ items;
73
+
74
+ // It's better to check if the row object is really
75
+ // available because it's a common mistake to leave
76
+ // an extra comma in the toolbar definition
77
+ // settings, which leads on the editor not loading
78
+ // at all in IE. (#3983)
79
+ if ( !row )
80
+ continue;
81
+
82
+ if ( groupStarted ) {
83
+ output.push( '</span>' );
84
+ groupStarted = 0;
85
+ pendingSeparator = 0;
86
+ }
87
+
88
+ if ( row === '/' ) {
89
+ output.push( '<span class="cke_toolbar_break"></span>' );
90
+ continue;
91
+ }
92
+
93
+ items = row.items || row;
94
+
95
+ // Create all items defined for this toolbar.
96
+ for ( var i = 0; i < items.length; i++ ) {
97
+ var item = items[ i ],
98
+ canGroup;
99
+
100
+ if ( item ) {
101
+ if ( item.type == CKEDITOR.UI_SEPARATOR ) {
102
+ // Do not add the separator immediately. Just save
103
+ // it be included if we already have something in
104
+ // the toolbar and if a new item is to be added (later).
105
+ pendingSeparator = groupStarted && item;
106
+ continue;
107
+ }
108
+
109
+ canGroup = item.canGroup !== false;
110
+
111
+ // Initialize the toolbar first, if needed.
112
+ if ( !toolbarObj ) {
113
+ // Create the basic toolbar object.
114
+ toolbarId = CKEDITOR.tools.getNextId();
115
+ toolbarObj = { id: toolbarId, items: [] };
116
+ toolbarName = row.name && ( editor.lang.toolbar.toolbarGroups[ row.name ] || row.name );
117
+
118
+ // Output the toolbar opener.
119
+ output.push( '<span id="', toolbarId, '" class="cke_toolbar"', ( toolbarName ? ' aria-labelledby="' + toolbarId + '_label"' : '' ), ' role="toolbar">' );
120
+
121
+ // If a toolbar name is available, send the voice label.
122
+ toolbarName && output.push( '<span id="', toolbarId, '_label" class="cke_voice_label">', toolbarName, '</span>' );
123
+
124
+ output.push( '<span class="cke_toolbar_start"></span>' );
125
+
126
+ // Add the toolbar to the "editor.toolbox.toolbars"
127
+ // array.
128
+ var index = toolbars.push( toolbarObj ) - 1;
129
+
130
+ // Create the next/previous reference.
131
+ if ( index > 0 ) {
132
+ toolbarObj.previous = toolbars[ index - 1 ];
133
+ toolbarObj.previous.next = toolbarObj;
134
+ }
135
+ }
136
+
137
+ if ( canGroup ) {
138
+ if ( !groupStarted ) {
139
+ output.push( '<span class="cke_toolgroup" role="presentation">' );
140
+ groupStarted = 1;
141
+ }
142
+ } else if ( groupStarted ) {
143
+ output.push( '</span>' );
144
+ groupStarted = 0;
145
+ }
146
+
147
+ function addItem( item ) {
148
+ var itemObj = item.render( editor, output );
149
+ index = toolbarObj.items.push( itemObj ) - 1;
150
+
151
+ if ( index > 0 ) {
152
+ itemObj.previous = toolbarObj.items[ index - 1 ];
153
+ itemObj.previous.next = itemObj;
154
+ }
155
+
156
+ itemObj.toolbar = toolbarObj;
157
+
158
+ // No need for keyboard handlers, the toolbar is only accessibly by mouse
159
+ /*
160
+ itemObj.onkey = itemKeystroke;
161
+
162
+ // Fix for #3052:
163
+ // Prevent JAWS from focusing the toolbar after document load.
164
+ itemObj.onfocus = function() {
165
+ if ( !editor.toolbox.focusCommandExecuted )
166
+ editor.focus();
167
+ };
168
+ */
169
+ }
170
+
171
+ if ( pendingSeparator ) {
172
+ addItem( pendingSeparator );
173
+ pendingSeparator = 0;
174
+ }
175
+
176
+ addItem( item );
177
+
178
+ }
179
+ }
180
+
181
+ if ( groupStarted ) {
182
+ output.push( '</span>' );
183
+ groupStarted = 0;
184
+ pendingSeparator = 0;
185
+ }
186
+
187
+ if ( toolbarObj )
188
+ output.push( '<span class="cke_toolbar_end"></span></span>' );
189
+
190
+ }
191
+
192
+
193
+ output.push( '</span>' );
194
+ event.data.html += output.join( '' );
195
+ });
196
+
197
+
198
+
199
+ /**
200
+ * Do the magic: Attach eventhandlers to see if text is selected
201
+ * When text is selected then show the floating toolbar, else hide it
202
+ */
203
+ editor.on('contentDom', function( event ) {
204
+
205
+ unfocus_toolbar();
206
+
207
+ /**
208
+ * Attach an eventhandler to the mouse-up event
209
+ */
210
+ editor.document.on('mouseup', function( mouse_event ) {
211
+ // When user right-clicks, ctrl-clicks, etc. then do not show the toolbar
212
+ data = mouse_event.data.$;
213
+ if (data.button !== 0 || data.ctrlKey || data.altKey || data.shiftKey) return true;
214
+
215
+ // When the user clears the selection by single-clicking in the editor then this event is fired before the selection is removed
216
+ // So we add a short delay to give the browser a chance to remove the selection before we do anything
217
+ setTimeout( function() {
218
+ if (is_text_selected()) {
219
+ // Save the current mouse-position
220
+ set_mousepos (mouse_event.data.$);
221
+ // when there is text selected after mouse-up: show the toolbar
222
+ editor.execCommand('showFloatingTools');
223
+ } else {
224
+ // when no text is selected then hide the toolbar
225
+ editor.execCommand('hideFloatingTools');
226
+ }
227
+ }, 100);
228
+ });
229
+
230
+
231
+ /**
232
+ * On keypress we will always hide the toolbar
233
+ * The toolbar is only accessible via mouse
234
+ */
235
+ editor.document.on('keyup', function( key_event ) {
236
+ editor.execCommand('hideFloatingTools');
237
+ });
238
+
239
+
240
+ /**
241
+ * On blur hide the toolbar (editor looses focus)
242
+ */
243
+ editor.on('blur', function( e ) {
244
+ if (editor.floatingtools.hide_on_blur) {
245
+ hide_toolbar();
246
+ }
247
+ });
248
+
249
+
250
+ /**
251
+ * Attach the mouse-over event to the toolbar.
252
+ * When cursor is above the toolbar then set opacity to 1
253
+ */
254
+ toolbar = get_element();
255
+ toolbar.on('mouseover', function( mouse_event ) {
256
+ focus_toolbar();
257
+ });
258
+
259
+
260
+ /**
261
+ * When the mouse moves out of the toolbar then make it transparent again
262
+ */
263
+ toolbar.on('mouseout', function( mouse_event ) {
264
+ unfocus_toolbar();
265
+ })
266
+
267
+ editor.container.addClass('pos-relative');
268
+ console.log(editor.container);
269
+ });
270
+
271
+
272
+
273
+ /**
274
+ * Display the floating toolbar
275
+ */
276
+ editor.addCommand( 'showFloatingTools', {
277
+ exec : function( editor ) {
278
+ if (is_text_selected()) {
279
+ toolbar = get_element();
280
+ unfocus_toolbar();
281
+ toolbar.show();
282
+
283
+ // Get the size of the toolbar
284
+ size = get_toolbar_size()
285
+ // Get the offset of the editor
286
+ offset = get_editor_offset();
287
+ // Get the mouse position
288
+ pos = get_mousepos();
289
+
290
+ // Calculate the position for the toolbar
291
+ toolpos = calculate_position(pos, size, offset);
292
+
293
+ toolbar.setStyles({
294
+ 'left' : toolpos.x + 'px',
295
+ 'top' : toolpos.y + 'px'
296
+ });
297
+ editor.floatingtools.is_visible = true;
298
+ }
299
+ }
300
+ });
301
+
302
+
303
+ /**
304
+ * Hide the floating toolbar
305
+ */
306
+ editor.addCommand( 'hideFloatingTools', {
307
+ exec : function( editor ) {
308
+ hide_toolbar();
309
+ }
310
+ });
311
+
312
+
313
+ /**
314
+ * ===== Behind the scenes. Getters, setters, calculation, etc.
315
+ */
316
+
317
+
318
+ hide_toolbar = function() {
319
+ if (false != editor.floatingtools.is_visible) {
320
+ toolbar = get_element();
321
+ toolbar.hide();
322
+ editor.floatingtools.is_visible = false;
323
+ }
324
+ }
325
+
326
+
327
+ /**
328
+ * Store the current mouse-position, so we can position the toolbar near the cursor
329
+ */
330
+ set_mousepos = function(data) {
331
+ editor.floatingtools.mousepos = {
332
+ left: data.clientX,
333
+ top: data.clientY
334
+ };
335
+ }
336
+
337
+
338
+
339
+ /**
340
+ * Store the current mouse-position, so we can position the toolbar near the cursor
341
+ */
342
+ get_mousepos = function() {
343
+ return editor.floatingtools.mousepos;
344
+ }
345
+
346
+
347
+ /**
348
+ * Returns the main toolbar-object (the parent of all items in the floating-toolbar)
349
+ */
350
+ get_element = function() {
351
+ if (! editor.floatingtools.dom) {
352
+ var dom_id = editor.ui.spaceId( 'floatingtools' );
353
+ editor.floatingtools.dom = CKEDITOR.document.getById( dom_id );
354
+ }
355
+ return editor.floatingtools.dom;
356
+ }
357
+
358
+
359
+
360
+ /**
361
+ * Returns the offset of the editor area (effectively the height of the top-toolbar)
362
+ */
363
+ get_editor_offset = function() {
364
+ if (! editor.floatingtools.editoroffset) {
365
+ var editor_id = editor.ui.spaceId( 'contents' );
366
+ var obj = CKEDITOR.document.getById( editor_id );
367
+ editor.floatingtools.editoroffset = {
368
+ left: obj.$.offsetLeft,
369
+ top: obj.$.offsetTop,
370
+ width: obj.$.offsetWidth,
371
+ height: obj.$.offsetHeight
372
+ };
373
+ }
374
+ return editor.floatingtools.editoroffset;
375
+ }
376
+
377
+
378
+ /**
379
+ * Calculates the position for the toolbar
380
+ */
381
+ calculate_position = function(pos, toolbar_size, offset) {
382
+ toolpos = {
383
+ x: pos.left + offset.left - (toolbar_size.width/2),
384
+ y: pos.top + offset.top - (toolbar_size.height + 20)
385
+ }
386
+
387
+ // make sure toolbar does not extend out of the left CKEditor border
388
+ if (toolpos.x < offset.left + 2) toolpos.x = offset.left + 2;
389
+
390
+ // make sure toolbar does not extend out of the right CKEditor border
391
+ if (pos.left + (toolbar_size.width/2) >= offset.left + offset.width-2 )
392
+ toolpos.x = offset.left + offset.width - toolbar_size.width - 2;
393
+
394
+ // Make sure toolbar does no go into the top toolbar area
395
+ if (toolpos.y < offset.top) toolpos.y = offset.top;
396
+
397
+ // make sure toolbar does not cover the mouse-cursor when text in the top line is selected
398
+ if (offset.top+pos.top > toolpos.y
399
+ && offset.top+pos.top < toolpos.y+toolbar_size.height)
400
+ toolpos.y = offset.top + pos.top + 24; // display toolbar below the cursor
401
+
402
+ return toolpos;
403
+ }
404
+
405
+
406
+ /**
407
+ * Returns the size of the floating toolbar
408
+ */
409
+ get_toolbar_size = function() {
410
+ if (! editor.floatingtools.toolbarsize) {
411
+ var obj = get_element();
412
+ editor.floatingtools.toolbarsize = {
413
+ width: obj.$.offsetWidth,
414
+ height: obj.$.offsetHeight
415
+ };
416
+ }
417
+ return editor.floatingtools.toolbarsize;
418
+ }
419
+
420
+
421
+ /**
422
+ * Check if text is selected.
423
+ * Retrns true when there is at least 1 character selected in the editor
424
+ */
425
+ is_text_selected = function () {
426
+ var text = editor.getSelection().getSelectedText();
427
+ return text != '';
428
+ }
429
+
430
+
431
+ /**
432
+ * Make the toolbar opaque
433
+ */
434
+ focus_toolbar = function() {
435
+ obj = get_element();
436
+ obj.setOpacity(1);
437
+ }
438
+
439
+
440
+ /**
441
+ * Make the toolbar transparent
442
+ */
443
+ unfocus_toolbar = function() {
444
+ obj = get_element();
445
+ obj.setOpacity(0.25);
446
+ },
447
+
448
+
449
+ /**
450
+ * Get the plugin configuration.
451
+ * Kidnapped from the toolbar-plugin...
452
+ */
453
+ getFloatingToolbarConfig = function( editor ) {
454
+ var removeButtons = editor.config.removeButtons;
455
+
456
+ removeButtons = removeButtons && removeButtons.split( ',' );
457
+
458
+ function buildToolbarConfig() {
459
+ // Take the base for the new toolbar, which is basically a toolbar
460
+ // definition without items.
461
+ var toolbar = getPrivateFloatingToolbarGroups( editor );
462
+ return populateToolbarConfig( toolbar );
463
+
464
+ }
465
+
466
+ // Returns an object containing all toolbar groups used by ui items.
467
+ function getItemDefinedGroups() {
468
+ var groups = {},
469
+ itemName, item, itemToolbar, group, order;
470
+
471
+ for ( itemName in editor.ui.items ) {
472
+ item = editor.ui.items[ itemName ];
473
+ itemToolbar = item.toolbar || 'others';
474
+ if ( itemToolbar ) {
475
+ // Break the toolbar property into its parts: "group_name[,order]".
476
+ itemToolbar = itemToolbar.split( ',' );
477
+ group = itemToolbar[ 0 ];
478
+ order = parseInt( itemToolbar[ 1 ] || -1, 10 );
479
+
480
+ // Initialize the group, if necessary.
481
+ groups[ group ] || ( groups[ group ] = [] );
482
+
483
+ // Push the data used to build the toolbar later.
484
+ groups[ group ].push( { name: itemName, order: order} );
485
+ }
486
+ }
487
+
488
+ // Put the items in the right order.
489
+ for ( group in groups ) {
490
+ groups[ group ] = groups[ group ].sort( function( a, b ) {
491
+ return a.order == b.order ? 0 :
492
+ b.order < 0 ? -1 :
493
+ a.order < 0 ? 1 :
494
+ a.order < b.order ? -1 :
495
+ 1;
496
+ });
497
+ }
498
+
499
+ return groups;
500
+ }
501
+
502
+ function fillGroup( toolbarGroup, uiItems ) {
503
+ if ( uiItems.length ) {
504
+ if ( toolbarGroup.items )
505
+ toolbarGroup.items.push( editor.ui.create( '-' ) );
506
+ else
507
+ toolbarGroup.items = [];
508
+
509
+ var item, name;
510
+ while ( ( item = uiItems.shift() ) ) {
511
+ name = typeof item == 'string' ? item : item.name;
512
+
513
+ // Ignore items that are configured to be removed.
514
+ if ( !removeButtons || CKEDITOR.tools.indexOf( removeButtons, name ) == -1 ) {
515
+ item = editor.ui.create( name );
516
+
517
+ if ( !item )
518
+ continue;
519
+
520
+ if ( !editor.addFeature( item ) )
521
+ continue;
522
+
523
+ toolbarGroup.items.push( item );
524
+ }
525
+ }
526
+ }
527
+ }
528
+
529
+ function populateToolbarConfig( config ) {
530
+ var toolbar = [],
531
+ i, group, newGroup;
532
+
533
+ for ( i = 0; i < config.length; ++i ) {
534
+ group = config[ i ];
535
+ newGroup = {};
536
+
537
+ if ( group == '/' )
538
+ toolbar.push( group );
539
+ else if ( CKEDITOR.tools.isArray( group) ) {
540
+ fillGroup( newGroup, CKEDITOR.tools.clone( group ) );
541
+ toolbar.push( newGroup );
542
+ }
543
+ else if ( group.items ) {
544
+ fillGroup( newGroup, CKEDITOR.tools.clone( group.items ) );
545
+ newGroup.name = group.name;
546
+ toolbar.push( newGroup);
547
+ }
548
+ }
549
+
550
+ return toolbar;
551
+ }
552
+
553
+ var toolbar = editor.config.floatingtools;
554
+
555
+ // If it is a string, return the relative "toolbar_name" config.
556
+ if ( typeof toolbar == 'string' )
557
+ toolbar = editor.config[ 'floatingtools_' + toolbar ];
558
+
559
+ return ( editor.toolbar = toolbar ? populateToolbarConfig( toolbar ) : buildToolbarConfig() );
560
+ },
561
+
562
+
563
+ /**
564
+ * Return the default toolbar configuration.
565
+ */
566
+ getPrivateFloatingToolbarGroups = function( editor ) {
567
+ return editor._.floatingToolsGroups || ( editor._.floatingToolsGroups = [
568
+ { name: 'styles', items: [ 'Font','FontSize' ]},
569
+ { name: 'format', items: [ 'Bold','Italic' ]},
570
+ { name: 'paragraph', items: [ 'JustifyCenter','Outdent','Indent','NumberedList','BulletedList' ]}
571
+ ]);
572
+ }
573
+
574
+ }
575
+
576
+ } );
577
+
578
+
579
+ })();
580
+
581
+
582
+