tinymce-rails 4.0.7 → 4.0.8

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.
@@ -1,4 +1,4 @@
1
- // 4.0.7 (2013-10-02)
1
+ // 4.0.8 (2013-10-10)
2
2
 
3
3
  /**
4
4
  * Compiled inline version. (Library mode)
@@ -202,6 +202,12 @@ define("tinymce/html/Styles", [], function() {
202
202
  function compress(prefix, suffix) {
203
203
  var top, right, bottom, left;
204
204
 
205
+ // IE 11 will produce a border-image: none when getting the style attribute from <p style="border: 1px solid red"></p>
206
+ // So lets asume it shouldn't be there
207
+ if (styles['border-image'] === 'none') {
208
+ delete styles['border-image'];
209
+ }
210
+
205
211
  // Get values and check it it needs compressing
206
212
  top = styles[prefix + '-top' + suffix];
207
213
  if (!top) {
@@ -628,9 +634,9 @@ define("tinymce/dom/EventUtils", [], function() {
628
634
  * @param {String} id Expando id value to look for.
629
635
  */
630
636
  function executeHandlers(evt, id) {
631
- var callbackList, i, l, callback;
637
+ var callbackList, i, l, callback, container = events[id];
632
638
 
633
- callbackList = events[id][evt.type];
639
+ callbackList = container && container[evt.type];
634
640
  if (callbackList) {
635
641
  for (i = 0, l = callbackList.length; i < l; i++) {
636
642
  callback = callbackList[i];
@@ -13634,8 +13640,9 @@ define("tinymce/Formatter", [
13634
13640
 
13635
13641
  // Move selection to text node
13636
13642
  selection.setCursorLocation(node, 1);
13643
+
13637
13644
  // If the formatNode is empty, we can remove it safely.
13638
- if(dom.isEmpty(formatNode)) {
13645
+ if (dom.isEmpty(formatNode)) {
13639
13646
  dom.remove(formatNode);
13640
13647
  }
13641
13648
  }
@@ -14690,6 +14697,10 @@ define("tinymce/EnterKey", [
14690
14697
  }
14691
14698
 
14692
14699
  dom.setAttrib(newBlock, 'id', ''); // Remove ID since it needs to be document unique
14700
+
14701
+ // Allow custom handling of new blocks
14702
+ editor.fire('NewBlock', { newBlock: newBlock });
14703
+
14693
14704
  undoManager.add();
14694
14705
  }
14695
14706
 
@@ -16878,7 +16889,19 @@ define("tinymce/ui/DomUtils", [
16878
16889
  },
16879
16890
 
16880
16891
  getSize: function(elm) {
16881
- return DOMUtils.DOM.getSize(elm);
16892
+ var width, height;
16893
+
16894
+ if (elm.getBoundingClientRect) {
16895
+ var rect = elm.getBoundingClientRect();
16896
+
16897
+ width = Math.max(rect.width || (rect.right - rect.left), elm.offsetWidth);
16898
+ height = Math.max(rect.height || (rect.bottom - rect.bottom), elm.offsetHeight);
16899
+ } else {
16900
+ width = elm.offsetWidth;
16901
+ height = elm.offsetHeight;
16902
+ }
16903
+
16904
+ return {width: width, height: height};
16882
16905
  },
16883
16906
 
16884
16907
  getPos: function(elm, root) {
@@ -16970,6 +16993,10 @@ define("tinymce/ui/Control", [
16970
16993
  controlIdLookup: {}
16971
16994
  },
16972
16995
 
16996
+ isRtl: function() {
16997
+ return Control.rtl;
16998
+ },
16999
+
16973
17000
  /**
16974
17001
  * Class/id prefix to use for all controls.
16975
17002
  *
@@ -17173,7 +17200,7 @@ define("tinymce/ui/Control", [
17173
17200
  }
17174
17201
 
17175
17202
  function getSide(name) {
17176
- var val = parseInt(getStyle(name), 10);
17203
+ var val = parseFloat(getStyle(name), 10);
17177
17204
 
17178
17205
  return isNaN(val) ? 0 : val;
17179
17206
  }
@@ -17197,18 +17224,19 @@ define("tinymce/ui/Control", [
17197
17224
  initLayoutRect: function() {
17198
17225
  var self = this, settings = self.settings, borderBox, layoutRect;
17199
17226
  var elm = self.getEl(), width, height, minWidth, minHeight, autoResize;
17200
- var startMinWidth, startMinHeight;
17227
+ var startMinWidth, startMinHeight, initialSize;
17201
17228
 
17202
- // Measure boxes
17229
+ // Measure the current element
17203
17230
  borderBox = self._borderBox = self._borderBox || self.measureBox(elm, 'border');
17204
17231
  self._paddingBox = self._paddingBox || self.measureBox(elm, 'padding');
17205
17232
  self._marginBox = self._marginBox || self.measureBox(elm, 'margin');
17233
+ initialSize = DomUtils.getSize(elm);
17206
17234
 
17207
17235
  // Setup minWidth/minHeight and width/height
17208
17236
  startMinWidth = settings.minWidth;
17209
17237
  startMinHeight = settings.minHeight;
17210
- minWidth = startMinWidth || elm.offsetWidth;
17211
- minHeight = startMinHeight || elm.offsetHeight;
17238
+ minWidth = startMinWidth || initialSize.width;
17239
+ minHeight = startMinHeight || initialSize.height;
17212
17240
  width = settings.width;
17213
17241
  height = settings.height;
17214
17242
  autoResize = settings.autoResize;
@@ -17626,6 +17654,17 @@ define("tinymce/ui/Control", [
17626
17654
  return args;
17627
17655
  },
17628
17656
 
17657
+ /**
17658
+ * Returns true/false if the specified event has any listeners.
17659
+ *
17660
+ * @method hasEventListeners
17661
+ * @param {String} name Name of the event to check for.
17662
+ * @return {Boolean} True/false state if the event has listeners.
17663
+ */
17664
+ hasEventListeners: function(name) {
17665
+ return name in this._bindings;
17666
+ },
17667
+
17629
17668
  /**
17630
17669
  * Returns a control collection with all parent controls.
17631
17670
  *
@@ -18434,7 +18473,7 @@ define("tinymce/ui/Control", [
18434
18473
  */
18435
18474
  // title: function(value) {} -- Generated
18436
18475
  });
18437
- window.elementIdCache = elementIdCache;
18476
+
18438
18477
  return Control;
18439
18478
  });
18440
18479
 
@@ -18600,6 +18639,10 @@ define("tinymce/ui/Container", [
18600
18639
  self._fixed = settings.fixed;
18601
18640
  self._items = new Collection();
18602
18641
 
18642
+ if (self.isRtl()) {
18643
+ self.addClass('rtl');
18644
+ }
18645
+
18603
18646
  self.addClass('container');
18604
18647
  self.addClass('container-body', 'body');
18605
18648
 
@@ -19391,7 +19434,7 @@ define("tinymce/ui/Movable", [
19391
19434
  "use strict";
19392
19435
 
19393
19436
  function calculateRelativePosition(ctrl, targetElm, rel) {
19394
- var ctrlElm, pos, x, y, selfW, selfH, targetW, targetH, viewport;
19437
+ var ctrlElm, pos, x, y, selfW, selfH, targetW, targetH, viewport, size;
19395
19438
 
19396
19439
  viewport = DomUtils.getViewPort();
19397
19440
 
@@ -19407,12 +19450,14 @@ define("tinymce/ui/Movable", [
19407
19450
 
19408
19451
  // Get size of self
19409
19452
  ctrlElm = ctrl.getEl();
19410
- selfW = ctrlElm.offsetWidth;
19411
- selfH = ctrlElm.offsetHeight;
19453
+ size = DomUtils.getSize(ctrlElm);
19454
+ selfW = size.width;
19455
+ selfH = size.height;
19412
19456
 
19413
19457
  // Get size of target
19414
- targetW = targetElm.offsetWidth;
19415
- targetH = targetElm.offsetHeight;
19458
+ size = DomUtils.getSize(targetElm);
19459
+ targetW = size.width;
19460
+ targetH = size.height;
19416
19461
 
19417
19462
  // Parse align string
19418
19463
  rel = (rel || '').split('');
@@ -19869,7 +19914,7 @@ define("tinymce/ui/FloatPanel", [
19869
19914
 
19870
19915
  if (settings.popover) {
19871
19916
  self._preBodyHtml = '<div class="' + self.classPrefix + 'arrow"></div>';
19872
- self.addClass('popover').addClass('bottom').addClass('start');
19917
+ self.addClass('popover').addClass('bottom').addClass(self.isRtl() ? 'end' : 'start');
19873
19918
  }
19874
19919
  },
19875
19920
 
@@ -20401,6 +20446,10 @@ define("tinymce/ui/Window", [
20401
20446
 
20402
20447
  self._super(settings);
20403
20448
 
20449
+ if (self.isRtl()) {
20450
+ self.addClass('rtl');
20451
+ }
20452
+
20404
20453
  self.addClass('window');
20405
20454
  self._fixed = true;
20406
20455
 
@@ -20412,7 +20461,7 @@ define("tinymce/ui/Window", [
20412
20461
  spacing: 3,
20413
20462
  padding: 10,
20414
20463
  align: 'center',
20415
- pack: 'end',
20464
+ pack: self.isRtl() ? 'start' : 'end',
20416
20465
  defaults: {
20417
20466
  type: 'button'
20418
20467
  },
@@ -20491,8 +20540,12 @@ define("tinymce/ui/Window", [
20491
20540
  // Reserve vertical space for title
20492
20541
  if (self.settings.title && !self._fullscreen) {
20493
20542
  headEl = self.getEl('head');
20494
- layoutRect.headerW = headEl.offsetWidth;
20495
- layoutRect.headerH = headEl.offsetHeight;
20543
+
20544
+ var size = DomUtils.getSize(headEl);
20545
+
20546
+ layoutRect.headerW = size.width;
20547
+ layoutRect.headerH = size.height;
20548
+
20496
20549
  deltaH += layoutRect.headerH;
20497
20550
  }
20498
20551
 
@@ -22107,6 +22160,7 @@ define("tinymce/util/Quirks", [
22107
22160
  if (e.target.nodeName == 'HTML') {
22108
22161
  editor.execCommand('SelectAll');
22109
22162
  editor.selection.collapse(true);
22163
+ editor.nodeChanged();
22110
22164
  }
22111
22165
  });
22112
22166
  }
@@ -22995,6 +23049,7 @@ define("tinymce/Editor", [
22995
23049
  var self = this, settings = self.settings, elm = self.getElement();
22996
23050
  var w, h, minHeight, n, o, url, bodyId, bodyClass, re, i, initializedPlugins = [];
22997
23051
 
23052
+ self.rtl = this.editorManager.i18n.rtl;
22998
23053
  self.editorManager.add(self);
22999
23054
 
23000
23055
  settings.aria_label = settings.aria_label || DOM.getAttrib(elm, 'aria-label', self.getLang('aria.rich_text_area'));
@@ -24270,8 +24325,17 @@ define("tinymce/Editor", [
24270
24325
  // Move selection to start of body if it's a after init setContent call
24271
24326
  // This prevents IE 7/8 from moving focus to empty editors
24272
24327
  if (!args.initial) {
24273
- self.selection.select(body, true);
24274
- self.selection.collapse(true);
24328
+ var dom = self.dom, selection = self.selection;
24329
+
24330
+ // IE can't have the caret inside <body><p>|</p></body> unless we do some magic
24331
+ if (ie < 11 && dom.isBlock(body.firstChild) && dom.isEmpty(body.firstChild)) {
24332
+ body.firstChild.appendChild(dom.doc.createTextNode('\u00a0'));
24333
+ selection.select(body.firstChild, true);
24334
+ dom.remove(body.firstChild.lastChild);
24335
+ } else {
24336
+ selection.select(body, true);
24337
+ selection.collapse(true);
24338
+ }
24275
24339
  }
24276
24340
 
24277
24341
  return args.content;
@@ -24581,6 +24645,10 @@ define("tinymce/Editor", [
24581
24645
  bindNative: function(name) {
24582
24646
  var self = this;
24583
24647
 
24648
+ if (self.settings.readonly) {
24649
+ return;
24650
+ }
24651
+
24584
24652
  if (self.initialized) {
24585
24653
  self.dom.bind(getEventTarget(self, name), name, function(e) {
24586
24654
  self.fire(name, e);
@@ -24725,6 +24793,14 @@ define("tinymce/util/I18n", [], function() {
24725
24793
  var data = {};
24726
24794
 
24727
24795
  return {
24796
+ /**
24797
+ * Property gets set to true if a RTL language pack was loaded.
24798
+ *
24799
+ * @property rtl
24800
+ * @type {Boolean}
24801
+ */
24802
+ rtl: false,
24803
+
24728
24804
  /**
24729
24805
  * Adds translations for a specific language code.
24730
24806
  *
@@ -24736,6 +24812,8 @@ define("tinymce/util/I18n", [], function() {
24736
24812
  for (var name in items) {
24737
24813
  data[name] = items[name];
24738
24814
  }
24815
+
24816
+ this.rtl = this.rtl || data._dir === 'rtl';
24739
24817
  },
24740
24818
 
24741
24819
  /**
@@ -25027,7 +25105,7 @@ define("tinymce/EditorManager", [
25027
25105
  * @property minorVersion
25028
25106
  * @type String
25029
25107
  */
25030
- minorVersion : '0.7',
25108
+ minorVersion : '0.8',
25031
25109
 
25032
25110
  /**
25033
25111
  * Release date of TinyMCE build.
@@ -25035,7 +25113,7 @@ define("tinymce/EditorManager", [
25035
25113
  * @property releaseDate
25036
25114
  * @type String
25037
25115
  */
25038
- releaseDate: '2013-10-02',
25116
+ releaseDate: '2013-10-10',
25039
25117
 
25040
25118
  /**
25041
25119
  * Collection of editor instances.
@@ -26792,7 +26870,7 @@ define("tinymce/ui/Button", [
26792
26870
  '<div id="' + id + '" class="' + self.classes() + '" tabindex="-1">' +
26793
26871
  '<button role="presentation" type="button" tabindex="-1">' +
26794
26872
  (icon ? '<i class="' + icon + '"' + image + '></i>' : '') +
26795
- (self._text ? (icon ? ' ' : '') + self.encode(self._text) : '') +
26873
+ (self._text ? (icon ? '\u00a0' : '') + self.encode(self._text) : '') +
26796
26874
  '</button>' +
26797
26875
  '</div>'
26798
26876
  );
@@ -27046,7 +27124,7 @@ define("tinymce/ui/PanelButton", [
27046
27124
  self.panel.show();
27047
27125
  }
27048
27126
 
27049
- self.panel.moveRel(self.getEl(), settings.popoverAlign || ['bc-tl', 'bc-tc']);
27127
+ self.panel.moveRel(self.getEl(), settings.popoverAlign || (self.isRtl() ? ['bc-tr', 'bc-tc'] : ['bc-tl', 'bc-tc']));
27050
27128
  },
27051
27129
 
27052
27130
  /**
@@ -27250,8 +27328,8 @@ define("tinymce/ui/ComboBox", [
27250
27328
  e.preventDefault();
27251
27329
  self.fire('change');
27252
27330
 
27253
- if (ctrl.submit) {
27254
- ctrl.submit();
27331
+ if (ctrl.hasEventListeners('submit') && ctrl.toJSON) {
27332
+ ctrl.fire('submit', {data: ctrl.toJSON()});
27255
27333
  return false;
27256
27334
  }
27257
27335
  });
@@ -27355,7 +27433,7 @@ define("tinymce/ui/ComboBox", [
27355
27433
  var width, lineHeight;
27356
27434
 
27357
27435
  if (openElm) {
27358
- width = rect.w - openElm.offsetWidth - 10;
27436
+ width = rect.w - DomUtils.getSize(openElm).width - 10;
27359
27437
  } else {
27360
27438
  width = rect.w - 10;
27361
27439
  }
@@ -27452,19 +27530,15 @@ define("tinymce/ui/ComboBox", [
27452
27530
  *
27453
27531
  * @-x-less Path.less
27454
27532
  * @class tinymce.ui.Path
27455
- * @extends tinymce.ui.Control
27533
+ * @extends tinymce.ui.Widget
27456
27534
  */
27457
27535
  define("tinymce/ui/Path", [
27458
- "tinymce/ui/Control",
27536
+ "tinymce/ui/Widget",
27459
27537
  "tinymce/ui/KeyboardNavigation"
27460
- ], function(Control, KeyboardNavigation) {
27538
+ ], function(Widget, KeyboardNavigation) {
27461
27539
  "use strict";
27462
27540
 
27463
- return Control.extend({
27464
- Defaults: {
27465
- delimiter: "\u00BB"
27466
- },
27467
-
27541
+ return Widget.extend({
27468
27542
  /**
27469
27543
  * Constructs a instance with the specified settings.
27470
27544
  *
@@ -27475,6 +27549,10 @@ define("tinymce/ui/Path", [
27475
27549
  init: function(settings) {
27476
27550
  var self = this;
27477
27551
 
27552
+ if (!settings.delimiter) {
27553
+ settings.delimiter = '\u00BB';
27554
+ }
27555
+
27478
27556
  self._super(settings);
27479
27557
  self.addClass('path');
27480
27558
  self.canFocus = true;
@@ -27558,7 +27636,7 @@ define("tinymce/ui/Path", [
27558
27636
  var self = this;
27559
27637
 
27560
27638
  return (
27561
- '<div id="' + self._id + '" class="' + self.classPrefix + 'path">' +
27639
+ '<div id="' + self._id + '" class="' + self.classes() + '">' +
27562
27640
  self._getPathHtml() +
27563
27641
  '</div>'
27564
27642
  );
@@ -27763,7 +27841,12 @@ define("tinymce/ui/Form", [
27763
27841
  flex: 1,
27764
27842
  padding: 20,
27765
27843
  labelGap: 30,
27766
- spacing: 10
27844
+ spacing: 10,
27845
+ callbacks: {
27846
+ submit: function() {
27847
+ this.submit();
27848
+ }
27849
+ }
27767
27850
  },
27768
27851
 
27769
27852
  /**
@@ -28088,9 +28171,9 @@ define("tinymce/ui/FlexLayout", [
28088
28171
  contLayoutRect = container.layoutRect();
28089
28172
  contPaddingBox = container._paddingBox;
28090
28173
  contSettings = container.settings;
28091
- direction = contSettings.direction;
28174
+ direction = container.isRtl() ? (contSettings.direction || 'row-reversed') : contSettings.direction;
28092
28175
  align = contSettings.align;
28093
- pack = contSettings.pack;
28176
+ pack = container.isRtl() ? (contSettings.pack || 'end') : contSettings.pack;
28094
28177
  spacing = contSettings.spacing || 0;
28095
28178
 
28096
28179
  if (direction == "row-reversed" || direction == "column-reverse") {
@@ -28366,6 +28449,10 @@ define("tinymce/ui/FormatControls", [
28366
28449
  var each = Tools.each;
28367
28450
 
28368
28451
  EditorManager.on('AddEditor', function(e) {
28452
+ if (e.editor.rtl) {
28453
+ Control.rtl = true;
28454
+ }
28455
+
28369
28456
  registerControls(e.editor);
28370
28457
  });
28371
28458
 
@@ -29313,8 +29400,9 @@ define("tinymce/ui/Iframe", [
29313
29400
  * @extends tinymce.ui.Widget
29314
29401
  */
29315
29402
  define("tinymce/ui/Label", [
29316
- "tinymce/ui/Widget"
29317
- ], function(Widget) {
29403
+ "tinymce/ui/Widget",
29404
+ "tinymce/ui/DomUtils"
29405
+ ], function(Widget, DomUtils) {
29318
29406
  "use strict";
29319
29407
 
29320
29408
  return Widget.extend({
@@ -29354,40 +29442,21 @@ define("tinymce/ui/Label", [
29354
29442
  var self = this, layoutRect = self._super();
29355
29443
 
29356
29444
  if (self.settings.multiline) {
29445
+ var size = DomUtils.getSize(self.getEl());
29446
+
29357
29447
  // Check if the text fits within maxW if not then try word wrapping it
29358
- if (self.getEl().offsetWidth > layoutRect.maxW) {
29448
+ if (size.width > layoutRect.maxW) {
29359
29449
  layoutRect.minW = layoutRect.maxW;
29360
29450
  self.addClass('multiline');
29361
29451
  }
29362
29452
 
29363
29453
  self.getEl().style.width = layoutRect.minW + 'px';
29364
- layoutRect.startMinH = layoutRect.h = layoutRect.minH = Math.min(layoutRect.maxH, self.getEl().offsetHeight);
29454
+ layoutRect.startMinH = layoutRect.h = layoutRect.minH = Math.min(layoutRect.maxH, DomUtils.getSize(self.getEl()).height);
29365
29455
  }
29366
29456
 
29367
29457
  return layoutRect;
29368
29458
  },
29369
29459
 
29370
- /**
29371
- * Sets/gets the disabled state on the control.
29372
- *
29373
- * @method disabled
29374
- * @param {Boolean} state Value to set to control.
29375
- * @return {Boolean/tinymce.ui.Label} Current control on a set operation or current state on a get.
29376
- */
29377
- disabled: function(state) {
29378
- var self = this, undef;
29379
-
29380
- if (state !== undef) {
29381
- self.toggleClass('label-disabled', state);
29382
-
29383
- if (self._rendered) {
29384
- self.getEl()[0].className = self.classes();
29385
- }
29386
- }
29387
-
29388
- return self._super(state);
29389
- },
29390
-
29391
29460
  /**
29392
29461
  * Repaints the control after a layout operation.
29393
29462
  *
@@ -29643,7 +29712,7 @@ define("tinymce/ui/MenuButton", [
29643
29712
 
29644
29713
  self.menu.show();
29645
29714
  self.menu.layoutRect({w: self.layoutRect().w});
29646
- self.menu.moveRel(self.getEl(), ['bl-tl', 'tl-bl']);
29715
+ self.menu.moveRel(self.getEl(), self.isRtl() ? ['br-tr', 'tr-br'] : ['bl-tl', 'tl-bl']);
29647
29716
  },
29648
29717
 
29649
29718
  /**
@@ -29691,7 +29760,7 @@ define("tinymce/ui/MenuButton", [
29691
29760
  '<div id="' + id + '" class="' + self.classes() + '" tabindex="-1">' +
29692
29761
  '<button id="' + id + '-open" role="presentation" type="button" tabindex="-1">' +
29693
29762
  (icon ? '<i class="' + icon + '"></i>' : '') +
29694
- '<span>' + (self._text ? (icon ? ' ' : '') + self.encode(self._text) : '') + '</span>' +
29763
+ '<span>' + (self._text ? (icon ? '\u00a0' : '') + self.encode(self._text) : '') + '</span>' +
29695
29764
  ' <i class="' + prefix + 'caret"></i>' +
29696
29765
  '</button>' +
29697
29766
  '</div>'
@@ -30066,7 +30135,11 @@ define("tinymce/ui/MenuItem", [
30066
30135
 
30067
30136
  menu.addClass('menu-sub');
30068
30137
 
30069
- var rel = menu.testMoveRel(self.getEl(), ['tr-tl', 'br-bl', 'tl-tr', 'bl-br']);
30138
+ var rel = menu.testMoveRel(
30139
+ self.getEl(),
30140
+ self.isRtl() ? ['tl-tr', 'bl-br', 'tr-tl', 'br-bl'] : ['tr-tl', 'br-bl', 'tl-tr', 'bl-br']
30141
+ );
30142
+
30070
30143
  menu.moveRel(self.getEl(), rel);
30071
30144
 
30072
30145
  rel = 'menu-sub-' + rel;
@@ -30497,10 +30570,8 @@ define("tinymce/ui/Spacer", [
30497
30570
  */
30498
30571
  define("tinymce/ui/SplitButton", [
30499
30572
  "tinymce/ui/MenuButton",
30500
- "tinymce/dom/DOMUtils"
30573
+ "tinymce/ui/DomUtils"
30501
30574
  ], function(MenuButton, DomUtils) {
30502
- var DOM = DomUtils.DOM;
30503
-
30504
30575
  return MenuButton.extend({
30505
30576
  Defaults: {
30506
30577
  classes: "widget btn splitbtn",
@@ -30520,12 +30591,12 @@ define("tinymce/ui/SplitButton", [
30520
30591
  mainButtonElm = elm.firstChild;
30521
30592
  menuButtonElm = elm.lastChild;
30522
30593
 
30523
- DOM.css(mainButtonElm, {
30524
- width: rect.w - menuButtonElm.offsetWidth,
30594
+ DomUtils.css(mainButtonElm, {
30595
+ width: rect.w - DomUtils.getSize(menuButtonElm).width,
30525
30596
  height: rect.h - 2
30526
30597
  });
30527
30598
 
30528
- DOM.css(menuButtonElm, {
30599
+ DomUtils.css(menuButtonElm, {
30529
30600
  height: rect.h - 2
30530
30601
  });
30531
30602
 
@@ -30546,7 +30617,7 @@ define("tinymce/ui/SplitButton", [
30546
30617
  activeMenu: function(state) {
30547
30618
  var self = this;
30548
30619
 
30549
- DOM.toggleClass(self.getEl().lastChild, self.classPrefix + 'active', state);
30620
+ DomUtils.toggleClass(self.getEl().lastChild, self.classPrefix + 'active', state);
30550
30621
  },
30551
30622
 
30552
30623
  /**
@@ -30567,7 +30638,7 @@ define("tinymce/ui/SplitButton", [
30567
30638
  '</button>' +
30568
30639
  '<button type="button" class="' + prefix + 'open" hidefocus tabindex="-1">' +
30569
30640
  //(icon ? '<i class="' + icon + '"></i>' : '') +
30570
- (self._menuBtnText ? (icon ? ' ' : '') + self._menuBtnText : '') +
30641
+ (self._menuBtnText ? (icon ? '\u00a0' : '') + self._menuBtnText : '') +
30571
30642
  ' <i class="' + prefix + 'caret"></i>' +
30572
30643
  '</button>' +
30573
30644
  '</div>'
@@ -30583,9 +30654,19 @@ define("tinymce/ui/SplitButton", [
30583
30654
  var self = this, onClickHandler = self.settings.onclick;
30584
30655
 
30585
30656
  self.on('click', function(e) {
30586
- if (e.control == this && !DOM.getParent(e.target, '.' + this.classPrefix + 'open')) {
30587
- e.stopImmediatePropagation();
30588
- onClickHandler.call(this, e);
30657
+ var node = e.target;
30658
+
30659
+ if (e.control == this) {
30660
+ // Find clicks that is on the main button
30661
+ while (node) {
30662
+ if (node.nodeName == 'BUTTON' && node.className.indexOf('open') == -1) {
30663
+ e.stopImmediatePropagation();
30664
+ onClickHandler.call(this, e);
30665
+ return;
30666
+ }
30667
+
30668
+ node = node.parentNode;
30669
+ }
30589
30670
  }
30590
30671
  });
30591
30672
 
@@ -30761,7 +30842,7 @@ define("tinymce/ui/TabPanel", [
30761
30842
  initLayoutRect: function() {
30762
30843
  var self = this, rect, minW, minH;
30763
30844
 
30764
- minW = self.getEl('head').offsetWidth;
30845
+ minW = DomUtils.getSize(self.getEl('head')).width;
30765
30846
  minW = minW < 0 ? 0 : minW;
30766
30847
  minH = 0;
30767
30848
  self.items().each(function(item, i) {
@@ -30786,13 +30867,13 @@ define("tinymce/ui/TabPanel", [
30786
30867
  });
30787
30868
  });
30788
30869
 
30789
- var headH = self.getEl('head').offsetHeight;
30870
+ var headH = DomUtils.getSize(self.getEl('head')).height;
30790
30871
 
30791
30872
  self.settings.minWidth = minW;
30792
30873
  self.settings.minHeight = minH + headH;
30793
30874
 
30794
30875
  rect = self._super();
30795
- rect.deltaH += self.getEl('head').offsetHeight;
30876
+ rect.deltaH += headH;
30796
30877
  rect.innerH = rect.h - rect.deltaH;
30797
30878
 
30798
30879
  return rect;
@@ -30852,8 +30933,8 @@ define("tinymce/ui/TextBox", [
30852
30933
  self.parents().reverse().each(function(ctrl) {
30853
30934
  e.preventDefault();
30854
30935
 
30855
- if (ctrl.submit) {
30856
- ctrl.submit();
30936
+ if (ctrl.hasEventListeners('submit') && ctrl.toJSON) {
30937
+ ctrl.fire('submit', {data: ctrl.toJSON()});
30857
30938
  return false;
30858
30939
  }
30859
30940
  });