tinymce-rails 4.0.7 → 4.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  });