tinymce-rails 4.1.2 → 4.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/source/tinymce/tinymce.jquery.js +293 -175
- data/app/assets/source/tinymce/tinymce.js +293 -175
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/nonbreaking/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +10 -10
- data/vendor/assets/javascripts/tinymce/tinymce.js +11 -11
- metadata +3 -2
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.1.
|
1
|
+
// 4.1.3 (2014-07-29)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -428,6 +428,7 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
428
428
|
events[id][name] = callbackList = [{func: callback, scope: scope}];
|
429
429
|
callbackList.fakeName = fakeName;
|
430
430
|
callbackList.capture = capture;
|
431
|
+
//callbackList.callback = callback;
|
431
432
|
|
432
433
|
// Add the nativeHandler to the callback list so that we can later unbind it
|
433
434
|
callbackList.nativeHandler = nativeHandler;
|
@@ -3465,7 +3466,7 @@ define("tinymce/dom/DomQuery", [
|
|
3465
3466
|
'readonly': 'readOnly'
|
3466
3467
|
};
|
3467
3468
|
var cssFix = {
|
3468
|
-
float: 'cssFloat'
|
3469
|
+
'float': 'cssFloat'
|
3469
3470
|
};
|
3470
3471
|
|
3471
3472
|
var attrHooks = {}, cssHooks = {};
|
@@ -4793,7 +4794,7 @@ define("tinymce/dom/DomQuery", [
|
|
4793
4794
|
DomQuery.overrideDefaults = function(callback) {
|
4794
4795
|
var defaults;
|
4795
4796
|
|
4796
|
-
function
|
4797
|
+
function sub(selector, context) {
|
4797
4798
|
defaults = defaults || callback();
|
4798
4799
|
|
4799
4800
|
if (arguments.length === 0) {
|
@@ -4804,12 +4805,12 @@ define("tinymce/dom/DomQuery", [
|
|
4804
4805
|
context = defaults.context;
|
4805
4806
|
}
|
4806
4807
|
|
4807
|
-
return new
|
4808
|
+
return new sub.fn.init(selector, context);
|
4808
4809
|
}
|
4809
4810
|
|
4810
|
-
DomQuery.extend(
|
4811
|
+
DomQuery.extend(sub, this);
|
4811
4812
|
|
4812
|
-
return
|
4813
|
+
return sub;
|
4813
4814
|
};
|
4814
4815
|
|
4815
4816
|
function appendHooks(targetHooks, prop, hooks) {
|
@@ -4868,7 +4869,9 @@ define("tinymce/dom/DomQuery", [
|
|
4868
4869
|
}
|
4869
4870
|
|
4870
4871
|
if (Env.ie && Env.ie < 9) {
|
4871
|
-
|
4872
|
+
/*jshint sub:true */
|
4873
|
+
/*eslint dot-notation: 0*/
|
4874
|
+
cssFix['float'] = 'styleFloat';
|
4872
4875
|
|
4873
4876
|
appendHooks(cssHooks, 'set', {
|
4874
4877
|
opacity: function(elm, value) {
|
@@ -7319,6 +7322,10 @@ define("tinymce/dom/DOMUtils", [
|
|
7319
7322
|
elm = self.$$(elm);
|
7320
7323
|
originalValue = elm.attr(name);
|
7321
7324
|
|
7325
|
+
if (!elm.length) {
|
7326
|
+
return;
|
7327
|
+
}
|
7328
|
+
|
7322
7329
|
hook = self.attrHooks[name];
|
7323
7330
|
if (hook && hook.set) {
|
7324
7331
|
hook.set(elm, value, name);
|
@@ -7372,11 +7379,14 @@ define("tinymce/dom/DOMUtils", [
|
|
7372
7379
|
|
7373
7380
|
elm = self.$$(elm);
|
7374
7381
|
|
7375
|
-
|
7376
|
-
|
7377
|
-
|
7378
|
-
|
7379
|
-
|
7382
|
+
if (elm.length) {
|
7383
|
+
hook = self.attrHooks[name];
|
7384
|
+
|
7385
|
+
if (hook && hook.get) {
|
7386
|
+
value = hook.get(elm, name);
|
7387
|
+
} else {
|
7388
|
+
value = elm.attr(name);
|
7389
|
+
}
|
7380
7390
|
}
|
7381
7391
|
|
7382
7392
|
if (typeof value == 'undefined') {
|
@@ -7395,21 +7405,22 @@ define("tinymce/dom/DOMUtils", [
|
|
7395
7405
|
* @return {object} Absolute position of the specified element object with x, y fields.
|
7396
7406
|
*/
|
7397
7407
|
getPos: function(elm, rootElm) {
|
7398
|
-
var self = this, x = 0, y = 0, offsetParent, doc = self.doc, pos;
|
7408
|
+
var self = this, x = 0, y = 0, offsetParent, doc = self.doc, body = doc.body, pos;
|
7399
7409
|
|
7400
7410
|
elm = self.get(elm);
|
7401
|
-
rootElm = rootElm ||
|
7411
|
+
rootElm = rootElm || body;
|
7402
7412
|
|
7403
7413
|
if (elm) {
|
7404
7414
|
// Use getBoundingClientRect if it exists since it's faster than looping offset nodes
|
7405
|
-
if
|
7415
|
+
// Fallback to offsetParent calculations if the body isn't static better since it stops at the body root
|
7416
|
+
if (rootElm === body && elm.getBoundingClientRect && $(body).css('position') === 'static') {
|
7406
7417
|
pos = elm.getBoundingClientRect();
|
7407
|
-
rootElm = self.boxModel ? doc.documentElement :
|
7418
|
+
rootElm = self.boxModel ? doc.documentElement : body;
|
7408
7419
|
|
7409
7420
|
// Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit
|
7410
7421
|
// Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position
|
7411
|
-
x = pos.left + (doc.documentElement.scrollLeft ||
|
7412
|
-
y = pos.top + (doc.documentElement.scrollTop ||
|
7422
|
+
x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - rootElm.clientLeft;
|
7423
|
+
y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - rootElm.clientTop;
|
7413
7424
|
|
7414
7425
|
return {x: x, y: y};
|
7415
7426
|
}
|
@@ -9480,7 +9491,7 @@ define("tinymce/NodeChange", [
|
|
9480
9491
|
|
9481
9492
|
// Gecko doesn't support the "selectionchange" event
|
9482
9493
|
if (!('onselectionchange' in editor.getDoc())) {
|
9483
|
-
editor.on('NodeChange Click MouseUp KeyUp', function(e) {
|
9494
|
+
editor.on('NodeChange Click MouseUp KeyUp Focus', function(e) {
|
9484
9495
|
var nativeRng, fakeRng;
|
9485
9496
|
|
9486
9497
|
// Since DOM Ranges mutate on modification
|
@@ -9510,7 +9521,7 @@ define("tinymce/NodeChange", [
|
|
9510
9521
|
});
|
9511
9522
|
|
9512
9523
|
editor.on('SelectionChange', function() {
|
9513
|
-
var startElm = editor.selection.getStart();
|
9524
|
+
var startElm = editor.selection.getStart(true);
|
9514
9525
|
|
9515
9526
|
// Selection change might fire when focus is lost so check if the start is still within the body
|
9516
9527
|
if (!isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
|
@@ -9518,6 +9529,13 @@ define("tinymce/NodeChange", [
|
|
9518
9529
|
}
|
9519
9530
|
});
|
9520
9531
|
|
9532
|
+
// Fire an extra nodeChange on mouseup for compatibility reasons
|
9533
|
+
editor.on('MouseUp', function(e) {
|
9534
|
+
if (!e.isDefaultPrevented()) {
|
9535
|
+
editor.nodeChanged();
|
9536
|
+
}
|
9537
|
+
});
|
9538
|
+
|
9521
9539
|
/**
|
9522
9540
|
* Distpaches out a onNodeChange event to all observers. This method should be called when you
|
9523
9541
|
* need to update the UI states or element path etc.
|
@@ -10088,7 +10106,7 @@ define("tinymce/html/Node", [], function() {
|
|
10088
10106
|
define("tinymce/html/Schema", [
|
10089
10107
|
"tinymce/util/Tools"
|
10090
10108
|
], function(Tools) {
|
10091
|
-
var mapCache = {};
|
10109
|
+
var mapCache = {}, dummyObj = {};
|
10092
10110
|
var makeMap = Tools.makeMap, each = Tools.each, extend = Tools.extend, explode = Tools.explode, inArray = Tools.inArray;
|
10093
10111
|
|
10094
10112
|
function split(items, delim) {
|
@@ -10109,11 +10127,11 @@ define("tinymce/html/Schema", [
|
|
10109
10127
|
function add(name, attributes, children) {
|
10110
10128
|
var ni, i, attributesOrder, args = arguments;
|
10111
10129
|
|
10112
|
-
function arrayToMap(array) {
|
10130
|
+
function arrayToMap(array, obj) {
|
10113
10131
|
var map = {}, i, l;
|
10114
10132
|
|
10115
10133
|
for (i = 0, l = array.length; i < l; i++) {
|
10116
|
-
map[array[i]] = {};
|
10134
|
+
map[array[i]] = obj || {};
|
10117
10135
|
}
|
10118
10136
|
|
10119
10137
|
return map;
|
@@ -10142,7 +10160,7 @@ define("tinymce/html/Schema", [
|
|
10142
10160
|
schema[name[ni]] = {
|
10143
10161
|
attributes: arrayToMap(attributesOrder),
|
10144
10162
|
attributesOrder: attributesOrder,
|
10145
|
-
children: arrayToMap(children)
|
10163
|
+
children: arrayToMap(children, dummyObj)
|
10146
10164
|
};
|
10147
10165
|
}
|
10148
10166
|
}
|
@@ -13865,6 +13883,7 @@ define("tinymce/dom/ControlSelection", [
|
|
13865
13883
|
}
|
13866
13884
|
|
13867
13885
|
editor.fire('ObjectResized', {target: selectedElm, width: width, height: height});
|
13886
|
+
dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
|
13868
13887
|
editor.nodeChanged();
|
13869
13888
|
}
|
13870
13889
|
|
@@ -14012,7 +14031,7 @@ define("tinymce/dom/ControlSelection", [
|
|
14012
14031
|
}
|
14013
14032
|
|
14014
14033
|
function updateResizeRect(e) {
|
14015
|
-
var controlElm;
|
14034
|
+
var startElm, controlElm;
|
14016
14035
|
|
14017
14036
|
function isChildOrEqual(node, parent) {
|
14018
14037
|
if (node) {
|
@@ -14034,9 +14053,10 @@ define("tinymce/dom/ControlSelection", [
|
|
14034
14053
|
|
14035
14054
|
if (isChildOrEqual(controlElm, rootElement)) {
|
14036
14055
|
disableGeckoResize();
|
14056
|
+
startElm = selection.getStart(true);
|
14037
14057
|
|
14038
|
-
if (isChildOrEqual(
|
14039
|
-
if (!isIE || (controlElm !=
|
14058
|
+
if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
|
14059
|
+
if (!isIE || (controlElm != startElm && startElm.nodeName !== 'IMG')) {
|
14040
14060
|
showResizeRect(controlElm);
|
14041
14061
|
return;
|
14042
14062
|
}
|
@@ -14196,7 +14216,7 @@ define("tinymce/dom/ControlSelection", [
|
|
14196
14216
|
}
|
14197
14217
|
}
|
14198
14218
|
|
14199
|
-
editor.on('nodechange
|
14219
|
+
editor.on('nodechange ResizeEditor', updateResizeRect);
|
14200
14220
|
|
14201
14221
|
// Update resize rect while typing in a table
|
14202
14222
|
editor.on('keydown keyup', function(e) {
|
@@ -14868,9 +14888,10 @@ define("tinymce/dom/Selection", [
|
|
14868
14888
|
* node the parent element will be returned.
|
14869
14889
|
*
|
14870
14890
|
* @method getStart
|
14891
|
+
* @param {Boolean} real Optional state to get the real parent when the selection is collapsed not the closest element.
|
14871
14892
|
* @return {Element} Start element of selection range.
|
14872
14893
|
*/
|
14873
|
-
getStart: function() {
|
14894
|
+
getStart: function(real) {
|
14874
14895
|
var self = this, rng = self.getRng(), startElement, parentElement, checkRng, node;
|
14875
14896
|
|
14876
14897
|
if (rng.duplicate || rng.item) {
|
@@ -14902,7 +14923,9 @@ define("tinymce/dom/Selection", [
|
|
14902
14923
|
startElement = rng.startContainer;
|
14903
14924
|
|
14904
14925
|
if (startElement.nodeType == 1 && startElement.hasChildNodes()) {
|
14905
|
-
|
14926
|
+
if (!real || !rng.collapsed) {
|
14927
|
+
startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)];
|
14928
|
+
}
|
14906
14929
|
}
|
14907
14930
|
|
14908
14931
|
if (startElement && startElement.nodeType == 3) {
|
@@ -14918,9 +14941,10 @@ define("tinymce/dom/Selection", [
|
|
14918
14941
|
* node the parent element will be returned.
|
14919
14942
|
*
|
14920
14943
|
* @method getEnd
|
14944
|
+
* @param {Boolean} real Optional state to get the real parent when the selection is collapsed not the closest element.
|
14921
14945
|
* @return {Element} End element of selection range.
|
14922
14946
|
*/
|
14923
|
-
getEnd: function() {
|
14947
|
+
getEnd: function(real) {
|
14924
14948
|
var self = this, rng = self.getRng(), endElement, endOffset;
|
14925
14949
|
|
14926
14950
|
if (rng.duplicate || rng.item) {
|
@@ -14945,7 +14969,9 @@ define("tinymce/dom/Selection", [
|
|
14945
14969
|
endOffset = rng.endOffset;
|
14946
14970
|
|
14947
14971
|
if (endElement.nodeType == 1 && endElement.hasChildNodes()) {
|
14948
|
-
|
14972
|
+
if (!real || !rng.collapsed) {
|
14973
|
+
endElement = endElement.childNodes[endOffset > 0 ? endOffset - 1 : endOffset];
|
14974
|
+
}
|
14949
14975
|
}
|
14950
14976
|
|
14951
14977
|
if (endElement && endElement.nodeType == 3) {
|
@@ -15537,8 +15563,8 @@ define("tinymce/dom/Selection", [
|
|
15537
15563
|
return;
|
15538
15564
|
}
|
15539
15565
|
|
15540
|
-
// BR/IMG/INPUT elements
|
15541
|
-
if (nonEmptyElementsMap[node.nodeName]) {
|
15566
|
+
// BR/IMG/INPUT elements but not table cells
|
15567
|
+
if (nonEmptyElementsMap[node.nodeName] && !/^(TD|TH)$/.test(node.nodeName)) {
|
15542
15568
|
if (start) {
|
15543
15569
|
rng.setStartBefore(node);
|
15544
15570
|
} else {
|
@@ -15994,8 +16020,8 @@ define("tinymce/Formatter", [
|
|
15994
16020
|
{inline: 'strike', remove: 'all'}
|
15995
16021
|
],
|
15996
16022
|
|
15997
|
-
forecolor: {inline: 'span', styles: {color: '%value'},
|
15998
|
-
hilitecolor: {inline: 'span', styles: {backgroundColor: '%value'},
|
16023
|
+
forecolor: {inline: 'span', styles: {color: '%value'}, links: true, remove_similar: true},
|
16024
|
+
hilitecolor: {inline: 'span', styles: {backgroundColor: '%value'}, links: true, remove_similar: true},
|
15999
16025
|
fontname: {inline: 'span', styles: {fontFamily: '%value'}},
|
16000
16026
|
fontsize: {inline: 'span', styles: {fontSize: '%value'}},
|
16001
16027
|
fontsize_class: {inline: 'span', attributes: {'class': '%value'}},
|
@@ -16331,22 +16357,12 @@ define("tinymce/Formatter", [
|
|
16331
16357
|
each(nodes, process);
|
16332
16358
|
});
|
16333
16359
|
|
16334
|
-
//
|
16335
|
-
if (format.
|
16360
|
+
// Apply formats to links as well to get the color of the underline to change as well
|
16361
|
+
if (format.links === true) {
|
16336
16362
|
each(newWrappers, function(node) {
|
16337
16363
|
function process(node) {
|
16338
|
-
var i, currentWrapElm, children;
|
16339
|
-
|
16340
16364
|
if (node.nodeName === 'A') {
|
16341
|
-
|
16342
|
-
newWrappers.push(currentWrapElm);
|
16343
|
-
|
16344
|
-
children = grep(node.childNodes);
|
16345
|
-
for (i = 0; i < children.length; i++) {
|
16346
|
-
currentWrapElm.appendChild(children[i]);
|
16347
|
-
}
|
16348
|
-
|
16349
|
-
node.appendChild(currentWrapElm);
|
16365
|
+
setElementFormat(node, format);
|
16350
16366
|
}
|
16351
16367
|
|
16352
16368
|
each(grep(node.childNodes), process);
|
@@ -16416,24 +16432,10 @@ define("tinymce/Formatter", [
|
|
16416
16432
|
// this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span>
|
16417
16433
|
// will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span>
|
16418
16434
|
each(dom.select(format.inline, node), function(child) {
|
16419
|
-
var parent;
|
16420
|
-
|
16421
16435
|
if (isBookmarkNode(child)) {
|
16422
16436
|
return;
|
16423
16437
|
}
|
16424
16438
|
|
16425
|
-
// When wrap_links is set to false we don't want
|
16426
|
-
// to remove the format on children within links
|
16427
|
-
if (format.wrap_links === false) {
|
16428
|
-
parent = child.parentNode;
|
16429
|
-
|
16430
|
-
do {
|
16431
|
-
if (parent.nodeName === 'A') {
|
16432
|
-
return;
|
16433
|
-
}
|
16434
|
-
} while ((parent = parent.parentNode));
|
16435
|
-
}
|
16436
|
-
|
16437
16439
|
removeFormat(format, vars, child, format.exact ? child : null);
|
16438
16440
|
});
|
16439
16441
|
});
|
@@ -16975,7 +16977,7 @@ define("tinymce/Formatter", [
|
|
16975
16977
|
|
16976
16978
|
// Ignore bogus nodes like the <a> tag created by moveStart()
|
16977
16979
|
parents = Tools.grep(parents, function(node) {
|
16978
|
-
return !node.getAttribute('data-mce-bogus');
|
16980
|
+
return node.nodeType == 1 && !node.getAttribute('data-mce-bogus');
|
16979
16981
|
});
|
16980
16982
|
|
16981
16983
|
// Check for new formats
|
@@ -17055,8 +17057,8 @@ define("tinymce/Formatter", [
|
|
17055
17057
|
// Initialize
|
17056
17058
|
defaultFormats();
|
17057
17059
|
addKeyboardShortcuts();
|
17058
|
-
ed.on('BeforeGetContent', function() {
|
17059
|
-
if (markCaretContainersBogus) {
|
17060
|
+
ed.on('BeforeGetContent', function(e) {
|
17061
|
+
if (markCaretContainersBogus && e.format != 'raw') {
|
17060
17062
|
markCaretContainersBogus();
|
17061
17063
|
}
|
17062
17064
|
});
|
@@ -17546,6 +17548,10 @@ define("tinymce/Formatter", [
|
|
17546
17548
|
};
|
17547
17549
|
}
|
17548
17550
|
|
17551
|
+
function isColorFormatAndAnchor(node, format) {
|
17552
|
+
return format.links && node.tagName == 'A';
|
17553
|
+
}
|
17554
|
+
|
17549
17555
|
/**
|
17550
17556
|
* Removes the specified format for the specified node. It will also remove the node if it doesn't have
|
17551
17557
|
* any attributes if the format specifies it to do so.
|
@@ -17561,7 +17567,7 @@ define("tinymce/Formatter", [
|
|
17561
17567
|
var i, attrs, stylesModified;
|
17562
17568
|
|
17563
17569
|
// Check if node matches format
|
17564
|
-
if (!matchName(node, format)) {
|
17570
|
+
if (!matchName(node, format) && !isColorFormatAndAnchor(node, format)) {
|
17565
17571
|
return FALSE;
|
17566
17572
|
}
|
17567
17573
|
|
@@ -20774,7 +20780,7 @@ define("tinymce/util/EventDispatcher", [
|
|
20774
20780
|
"focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange " +
|
20775
20781
|
"mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover " +
|
20776
20782
|
"draggesture dragdrop drop drag submit " +
|
20777
|
-
"compositionstart compositionend compositionupdate",
|
20783
|
+
"compositionstart compositionend compositionupdate touchstart touchend",
|
20778
20784
|
' '
|
20779
20785
|
);
|
20780
20786
|
|
@@ -21968,7 +21974,6 @@ define("tinymce/ui/Control", [
|
|
21968
21974
|
], function(Class, Tools, EventDispatcher, Collection, DomUtils) {
|
21969
21975
|
"use strict";
|
21970
21976
|
|
21971
|
-
var elementIdCache = {};
|
21972
21977
|
var hasMouseWheelEventSupport = "onmousewheel" in document;
|
21973
21978
|
var hasWheelEventSupport = false;
|
21974
21979
|
var classPrefix = "mce-";
|
@@ -21998,7 +22003,6 @@ define("tinymce/ui/Control", [
|
|
21998
22003
|
|
21999
22004
|
var Control = Class.extend({
|
22000
22005
|
Statics: {
|
22001
|
-
elementIdCache: elementIdCache,
|
22002
22006
|
classPrefix: classPrefix
|
22003
22007
|
},
|
22004
22008
|
|
@@ -22041,6 +22045,7 @@ define("tinymce/ui/Control", [
|
|
22041
22045
|
self._text = self._name = '';
|
22042
22046
|
self._width = self._height = 0;
|
22043
22047
|
self._aria = {role: settings.role};
|
22048
|
+
this._elmCache = {};
|
22044
22049
|
|
22045
22050
|
// Setup classes
|
22046
22051
|
classes = settings.classes;
|
@@ -22782,15 +22787,16 @@ define("tinymce/ui/Control", [
|
|
22782
22787
|
*
|
22783
22788
|
* @method getEl
|
22784
22789
|
* @param {String} [suffix] Suffix to get element by.
|
22785
|
-
* @param {Boolean} [dropCache] True if the cache for the element should be dropped.
|
22786
22790
|
* @return {Element} HTML DOM element for the current control or it's children.
|
22787
22791
|
*/
|
22788
|
-
getEl: function(suffix
|
22789
|
-
var
|
22792
|
+
getEl: function(suffix) {
|
22793
|
+
var id = suffix ? this._id + '-' + suffix : this._id;
|
22790
22794
|
|
22791
|
-
|
22795
|
+
if (!this._elmCache[id]) {
|
22796
|
+
this._elmCache[id] = DomUtils.get(id);
|
22797
|
+
}
|
22792
22798
|
|
22793
|
-
return
|
22799
|
+
return this._elmCache[id];
|
22794
22800
|
},
|
22795
22801
|
|
22796
22802
|
/**
|
@@ -23001,16 +23007,7 @@ define("tinymce/ui/Control", [
|
|
23001
23007
|
delete lookup[self._id];
|
23002
23008
|
}
|
23003
23009
|
|
23004
|
-
delete elementIdCache[self._id];
|
23005
|
-
|
23006
23010
|
if (elm && elm.parentNode) {
|
23007
|
-
var nodes = elm.getElementsByTagName('*');
|
23008
|
-
|
23009
|
-
i = nodes.length;
|
23010
|
-
while (i--) {
|
23011
|
-
delete elementIdCache[nodes[i].id];
|
23012
|
-
}
|
23013
|
-
|
23014
23011
|
elm.parentNode.removeChild(elm);
|
23015
23012
|
}
|
23016
23013
|
|
@@ -25163,8 +25160,15 @@ define("tinymce/ui/FloatPanel", [
|
|
25163
25160
|
|
25164
25161
|
function bindWindowResizeHandler() {
|
25165
25162
|
if (!windowResizeHandler) {
|
25163
|
+
var docElm = document.documentElement, clientWidth = docElm.clientWidth, clientHeight = docElm.clientHeight;
|
25164
|
+
|
25166
25165
|
windowResizeHandler = function() {
|
25167
|
-
|
25166
|
+
// Workaround for #7065 IE 7 fires resize events event though the window wasn't resized
|
25167
|
+
if (!document.all || clientWidth != docElm.clientWidth || clientHeight != docElm.clientHeight) {
|
25168
|
+
clientWidth = docElm.clientWidth;
|
25169
|
+
clientHeight = docElm.clientHeight;
|
25170
|
+
FloatPanel.hideAll();
|
25171
|
+
}
|
25168
25172
|
};
|
25169
25173
|
|
25170
25174
|
DomUtils.on(window, 'resize', windowResizeHandler);
|
@@ -26110,6 +26114,14 @@ define("tinymce/WindowManager", [
|
|
26110
26114
|
|
26111
26115
|
self.windows = windows;
|
26112
26116
|
|
26117
|
+
editor.on('remove', function() {
|
26118
|
+
var i = windows.length;
|
26119
|
+
|
26120
|
+
while (i--) {
|
26121
|
+
windows[i].close();
|
26122
|
+
}
|
26123
|
+
});
|
26124
|
+
|
26113
26125
|
/**
|
26114
26126
|
* Opens a new window.
|
26115
26127
|
*
|
@@ -26436,7 +26448,7 @@ define("tinymce/util/Quirks", [
|
|
26436
26448
|
|
26437
26449
|
// Make sure all elements has a data-mce-style attribute
|
26438
26450
|
if (!elm.hasAttribute('data-mce-style') && elm.hasAttribute('style')) {
|
26439
|
-
editor.dom.setAttrib(elm, 'style',
|
26451
|
+
editor.dom.setAttrib(elm, 'style', editor.dom.getAttrib(elm, 'style'));
|
26440
26452
|
}
|
26441
26453
|
});
|
26442
26454
|
|
@@ -26858,35 +26870,6 @@ define("tinymce/util/Quirks", [
|
|
26858
26870
|
});
|
26859
26871
|
}
|
26860
26872
|
|
26861
|
-
/**
|
26862
|
-
* Fire a nodeChanged when the selection is changed on WebKit this fixes selection issues on iOS5. It only fires the nodeChange
|
26863
|
-
* event every 50ms since it would other wise update the UI when you type and it hogs the CPU.
|
26864
|
-
*/
|
26865
|
-
function selectionChangeNodeChanged() {
|
26866
|
-
var lastRng, selectionTimer;
|
26867
|
-
|
26868
|
-
editor.on('selectionchange', function() {
|
26869
|
-
if (selectionTimer) {
|
26870
|
-
clearTimeout(selectionTimer);
|
26871
|
-
selectionTimer = 0;
|
26872
|
-
}
|
26873
|
-
|
26874
|
-
selectionTimer = window.setTimeout(function() {
|
26875
|
-
if (editor.removed) {
|
26876
|
-
return;
|
26877
|
-
}
|
26878
|
-
|
26879
|
-
var rng = selection.getRng();
|
26880
|
-
|
26881
|
-
// Compare the ranges to see if it was a real change or not
|
26882
|
-
if (!lastRng || !RangeUtils.compareRanges(rng, lastRng)) {
|
26883
|
-
editor.nodeChanged();
|
26884
|
-
lastRng = rng;
|
26885
|
-
}
|
26886
|
-
}, 50);
|
26887
|
-
});
|
26888
|
-
}
|
26889
|
-
|
26890
26873
|
/**
|
26891
26874
|
* Screen readers on IE needs to have the role application set on the body.
|
26892
26875
|
*/
|
@@ -27413,6 +27396,53 @@ define("tinymce/util/Quirks", [
|
|
27413
27396
|
editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
|
27414
27397
|
}
|
27415
27398
|
|
27399
|
+
/**
|
27400
|
+
* iOS Safari and possible other browsers have a bug where it won't fire
|
27401
|
+
* a click event when a contentEditable is focused. This function fakes click events
|
27402
|
+
* by using touchstart/touchend and measuring the time and distance travelled.
|
27403
|
+
*/
|
27404
|
+
function touchClickEvent() {
|
27405
|
+
editor.on('touchstart', function(e) {
|
27406
|
+
var elm, time, startTouch, changedTouches;
|
27407
|
+
|
27408
|
+
elm = e.target;
|
27409
|
+
time = new Date().getTime();
|
27410
|
+
changedTouches = e.changedTouches;
|
27411
|
+
|
27412
|
+
if (!changedTouches || changedTouches.length > 1) {
|
27413
|
+
return;
|
27414
|
+
}
|
27415
|
+
|
27416
|
+
startTouch = changedTouches[0];
|
27417
|
+
|
27418
|
+
editor.once('touchend', function(e) {
|
27419
|
+
var endTouch = e.changedTouches[0], args;
|
27420
|
+
|
27421
|
+
if (new Date().getTime() - time > 500) {
|
27422
|
+
return;
|
27423
|
+
}
|
27424
|
+
|
27425
|
+
if (Math.abs(startTouch.clientX - endTouch.clientX) > 5) {
|
27426
|
+
return;
|
27427
|
+
}
|
27428
|
+
|
27429
|
+
if (Math.abs(startTouch.clientY - endTouch.clientY) > 5) {
|
27430
|
+
return;
|
27431
|
+
}
|
27432
|
+
|
27433
|
+
args = {
|
27434
|
+
target: elm
|
27435
|
+
};
|
27436
|
+
|
27437
|
+
each('pageX pageY clientX clientY screenX screenY'.split(' '), function(key) {
|
27438
|
+
args[key] = endTouch[key];
|
27439
|
+
});
|
27440
|
+
|
27441
|
+
args = editor.fire('click', args);
|
27442
|
+
});
|
27443
|
+
});
|
27444
|
+
}
|
27445
|
+
|
27416
27446
|
/**
|
27417
27447
|
* WebKit has a bug where it will allow forms to be submitted if they are inside a contentEditable element.
|
27418
27448
|
* For example this: <form><button></form>
|
@@ -27459,10 +27489,10 @@ define("tinymce/util/Quirks", [
|
|
27459
27489
|
blockFormSubmitInsideEditor();
|
27460
27490
|
disableBackspaceIntoATable();
|
27461
27491
|
removeAppleInterchangeBrs();
|
27492
|
+
touchClickEvent();
|
27462
27493
|
|
27463
27494
|
// iOS
|
27464
27495
|
if (Env.iOS) {
|
27465
|
-
selectionChangeNodeChanged();
|
27466
27496
|
restoreFocusOnKeyDown();
|
27467
27497
|
bodyHeight();
|
27468
27498
|
tapLinksAndImages();
|
@@ -27664,8 +27694,18 @@ define("tinymce/EditorObservable", [
|
|
27664
27694
|
"tinymce/dom/DOMUtils",
|
27665
27695
|
"tinymce/util/Tools"
|
27666
27696
|
], function(Observable, DOMUtils, Tools) {
|
27667
|
-
var DOM = DOMUtils.DOM;
|
27697
|
+
var DOM = DOMUtils.DOM, customEventRootDelegates;
|
27668
27698
|
|
27699
|
+
/**
|
27700
|
+
* Returns the event target so for the specified event. Some events fire
|
27701
|
+
* only on document, some fire on documentElement etc. This also handles the
|
27702
|
+
* custom event root setting where it returns that element instead of the body.
|
27703
|
+
*
|
27704
|
+
* @private
|
27705
|
+
* @param {tinymce.Editor} editor Editor instance to get event target from.
|
27706
|
+
* @param {String} eventName Name of the event for example "click".
|
27707
|
+
* @return {Element/Document} HTML Element or document target to bind on.
|
27708
|
+
*/
|
27669
27709
|
function getEventTarget(editor, eventName) {
|
27670
27710
|
if (eventName == 'selectionchange') {
|
27671
27711
|
return editor.getDoc();
|
@@ -27674,62 +27714,96 @@ define("tinymce/EditorObservable", [
|
|
27674
27714
|
// Need to bind mousedown/mouseup etc to document not body in iframe mode
|
27675
27715
|
// Since the user might click on the HTML element not the BODY
|
27676
27716
|
if (!editor.inline && /^mouse|click|contextmenu|drop|dragover|dragend/.test(eventName)) {
|
27677
|
-
return editor.getDoc();
|
27717
|
+
return editor.getDoc().documentElement;
|
27718
|
+
}
|
27719
|
+
|
27720
|
+
// Bind to event root instead of body if it's defined
|
27721
|
+
if (editor.settings.event_root) {
|
27722
|
+
if (!editor.eventRoot) {
|
27723
|
+
editor.eventRoot = DOM.select(editor.settings.event_root)[0];
|
27724
|
+
}
|
27725
|
+
|
27726
|
+
return editor.eventRoot;
|
27678
27727
|
}
|
27679
27728
|
|
27680
27729
|
return editor.getBody();
|
27681
27730
|
}
|
27682
27731
|
|
27683
|
-
|
27684
|
-
|
27685
|
-
|
27732
|
+
/**
|
27733
|
+
* Binds a event delegate for the specified name this delegate will fire
|
27734
|
+
* the event to the editor dispatcher.
|
27735
|
+
*
|
27736
|
+
* @private
|
27737
|
+
* @param {tinymce.Editor} editor Editor instance to get event target from.
|
27738
|
+
* @param {String} eventName Name of the event for example "click".
|
27739
|
+
*/
|
27740
|
+
function bindEventDelegate(editor, eventName) {
|
27741
|
+
var eventRootElm = getEventTarget(editor, eventName), delegate;
|
27742
|
+
|
27743
|
+
if (!editor.delegates) {
|
27744
|
+
editor.delegates = {};
|
27745
|
+
}
|
27686
27746
|
|
27687
|
-
if (
|
27688
|
-
|
27689
|
-
|
27747
|
+
if (editor.delegates[eventName]) {
|
27748
|
+
return;
|
27749
|
+
}
|
27690
27750
|
|
27691
|
-
|
27692
|
-
|
27693
|
-
|
27694
|
-
|
27751
|
+
if (editor.settings.event_root) {
|
27752
|
+
if (!customEventRootDelegates) {
|
27753
|
+
customEventRootDelegates = {};
|
27754
|
+
editor.editorManager.on('removeEditor', function() {
|
27755
|
+
var name;
|
27756
|
+
|
27757
|
+
if (!editor.editorManager.activeEditor) {
|
27758
|
+
if (customEventRootDelegates) {
|
27759
|
+
for (name in customEventRootDelegates) {
|
27760
|
+
editor.dom.unbind(getEventTarget(editor, name));
|
27761
|
+
}
|
27762
|
+
|
27763
|
+
customEventRootDelegates = null;
|
27764
|
+
}
|
27695
27765
|
}
|
27696
27766
|
});
|
27697
27767
|
}
|
27698
27768
|
|
27699
|
-
if (
|
27769
|
+
if (customEventRootDelegates[eventName]) {
|
27700
27770
|
return;
|
27701
27771
|
}
|
27702
27772
|
|
27703
|
-
|
27704
|
-
|
27705
|
-
editorManager.eventRootElm = eventRootElm;
|
27706
|
-
}
|
27707
|
-
|
27708
|
-
editorManager.rootEvents[name] = true;
|
27709
|
-
|
27710
|
-
DOM.bind(eventRootElm, name, function(e) {
|
27711
|
-
var target = e.target, editors = editorManager.editors, i = editors.length;
|
27773
|
+
delegate = function(e) {
|
27774
|
+
var target = e.target, editors = editor.editorManager.editors, i = editors.length;
|
27712
27775
|
|
27713
27776
|
while (i--) {
|
27714
27777
|
var body = editors[i].getBody();
|
27715
27778
|
|
27716
27779
|
if (body === target || DOM.isChildOf(target, body)) {
|
27717
27780
|
if (!editors[i].hidden) {
|
27718
|
-
editors[i].fire(
|
27781
|
+
editors[i].fire(eventName, e);
|
27719
27782
|
}
|
27720
27783
|
}
|
27721
27784
|
}
|
27722
|
-
}
|
27785
|
+
};
|
27786
|
+
|
27787
|
+
customEventRootDelegates[eventName] = delegate;
|
27788
|
+
DOM.bind(eventRootElm, eventName, delegate);
|
27723
27789
|
} else {
|
27724
|
-
|
27790
|
+
delegate = function(e) {
|
27725
27791
|
if (!editor.hidden) {
|
27726
|
-
editor.fire(
|
27792
|
+
editor.fire(eventName, e);
|
27727
27793
|
}
|
27728
|
-
}
|
27794
|
+
};
|
27795
|
+
|
27796
|
+
DOM.bind(eventRootElm, eventName, delegate);
|
27797
|
+
editor.delegates[eventName] = delegate;
|
27729
27798
|
}
|
27730
27799
|
}
|
27731
27800
|
|
27732
27801
|
var EditorObservable = {
|
27802
|
+
/**
|
27803
|
+
* Bind any pending event delegates. This gets executed after the target body/document is created.
|
27804
|
+
*
|
27805
|
+
* @private
|
27806
|
+
*/
|
27733
27807
|
bindPendingEventDelegates: function() {
|
27734
27808
|
var self = this;
|
27735
27809
|
|
@@ -27738,6 +27812,12 @@ define("tinymce/EditorObservable", [
|
|
27738
27812
|
});
|
27739
27813
|
},
|
27740
27814
|
|
27815
|
+
/**
|
27816
|
+
* Toggles a native event on/off this is called by the EventDispatcher when
|
27817
|
+
* the first native event handler is added and when the last native event handler is removed.
|
27818
|
+
*
|
27819
|
+
* @private
|
27820
|
+
*/
|
27741
27821
|
toggleNativeEvent: function(name, state) {
|
27742
27822
|
var self = this;
|
27743
27823
|
|
@@ -27761,8 +27841,35 @@ define("tinymce/EditorObservable", [
|
|
27761
27841
|
}
|
27762
27842
|
}
|
27763
27843
|
} else if (self.initialized) {
|
27764
|
-
self.dom.unbind(getEventTarget(self, name), name);
|
27844
|
+
self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
|
27845
|
+
delete self.delegates[name];
|
27846
|
+
}
|
27847
|
+
},
|
27848
|
+
|
27849
|
+
/**
|
27850
|
+
* Unbinds all native event handlers that means delegates, custom events bound using the Events API etc.
|
27851
|
+
*
|
27852
|
+
* @private
|
27853
|
+
*/
|
27854
|
+
unbindAllNativeEvents: function() {
|
27855
|
+
var self = this, name;
|
27856
|
+
|
27857
|
+
if (self.delegates) {
|
27858
|
+
for (name in self.delegates) {
|
27859
|
+
self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
|
27860
|
+
}
|
27861
|
+
|
27862
|
+
delete self.delegates;
|
27863
|
+
}
|
27864
|
+
|
27865
|
+
if (!self.inline) {
|
27866
|
+
self.getBody().onload = null;
|
27867
|
+
self.dom.unbind(self.getWin());
|
27868
|
+
self.dom.unbind(self.getDoc());
|
27765
27869
|
}
|
27870
|
+
|
27871
|
+
self.dom.unbind(self.getBody());
|
27872
|
+
self.dom.unbind(self.getContainer());
|
27766
27873
|
}
|
27767
27874
|
};
|
27768
27875
|
|
@@ -28569,6 +28676,9 @@ define("tinymce/Editor", [
|
|
28569
28676
|
|
28570
28677
|
DOM.setAttrib("src", url || 'javascript:""');
|
28571
28678
|
|
28679
|
+
self.contentAreaContainer = o.iframeContainer;
|
28680
|
+
self.iframeElement = ifr;
|
28681
|
+
|
28572
28682
|
n = DOM.add(o.iframeContainer, ifr);
|
28573
28683
|
|
28574
28684
|
// Try accessing the document this will fail on IE when document.domain is set to the same as location.hostname
|
@@ -28581,9 +28691,6 @@ define("tinymce/Editor", [
|
|
28581
28691
|
}
|
28582
28692
|
}
|
28583
28693
|
|
28584
|
-
self.contentAreaContainer = o.iframeContainer;
|
28585
|
-
self.iframeElement = ifr;
|
28586
|
-
|
28587
28694
|
if (o.editorContainer) {
|
28588
28695
|
DOM.get(o.editorContainer).style.display = self.orgDisplay;
|
28589
28696
|
self.hidden = DOM.isHidden(o.editorContainer);
|
@@ -28894,12 +29001,15 @@ define("tinymce/Editor", [
|
|
28894
29001
|
// Handle auto focus
|
28895
29002
|
if (settings.auto_focus) {
|
28896
29003
|
setTimeout(function() {
|
28897
|
-
var
|
29004
|
+
var editor;
|
29005
|
+
|
29006
|
+
if (settings.auto_focus === true) {
|
29007
|
+
editor = self;
|
29008
|
+
} else {
|
29009
|
+
editor = self.editorManager.get(settings.auto_focus);
|
29010
|
+
}
|
28898
29011
|
|
28899
|
-
|
28900
|
-
ed.selection.collapse(1);
|
28901
|
-
ed.getBody().focus();
|
28902
|
-
ed.getWin().focus();
|
29012
|
+
editor.focus();
|
28903
29013
|
}, 100);
|
28904
29014
|
}
|
28905
29015
|
|
@@ -29942,6 +30052,7 @@ define("tinymce/Editor", [
|
|
29942
30052
|
if (!self.removed) {
|
29943
30053
|
self.save();
|
29944
30054
|
self.removed = 1;
|
30055
|
+
self.unbindAllNativeEvents();
|
29945
30056
|
|
29946
30057
|
// Remove any hidden input
|
29947
30058
|
if (self.hasHiddenInput) {
|
@@ -29957,21 +30068,12 @@ define("tinymce/Editor", [
|
|
29957
30068
|
|
29958
30069
|
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
29959
30070
|
self.getBody().onload = null; // Prevent #6816
|
29960
|
-
|
29961
|
-
// Don't clear the window or document if content editable
|
29962
|
-
// is enabled since other instances might still be present
|
29963
|
-
Event.unbind(self.getWin());
|
29964
|
-
Event.unbind(self.getDoc());
|
29965
30071
|
}
|
29966
30072
|
|
29967
|
-
var elm = self.getContainer();
|
29968
|
-
Event.unbind(self.getBody());
|
29969
|
-
Event.unbind(elm);
|
29970
|
-
|
29971
30073
|
self.fire('remove');
|
29972
30074
|
|
29973
30075
|
self.editorManager.remove(self);
|
29974
|
-
DOM.remove(
|
30076
|
+
DOM.remove(self.getContainer());
|
29975
30077
|
self.destroy();
|
29976
30078
|
}
|
29977
30079
|
},
|
@@ -29999,14 +30101,6 @@ define("tinymce/Editor", [
|
|
29999
30101
|
return;
|
30000
30102
|
}
|
30001
30103
|
|
30002
|
-
// We must unbind on Gecko since it would otherwise produce the pesky "attempt
|
30003
|
-
// to run compile-and-go script on a cleared scope" message
|
30004
|
-
if (automatic && isGecko) {
|
30005
|
-
Event.unbind(self.getDoc());
|
30006
|
-
Event.unbind(self.getWin());
|
30007
|
-
Event.unbind(self.getBody());
|
30008
|
-
}
|
30009
|
-
|
30010
30104
|
if (!automatic) {
|
30011
30105
|
self.editorManager.off('beforeunload', self._beforeUnload);
|
30012
30106
|
|
@@ -30489,6 +30583,7 @@ define("tinymce/EditorManager", [
|
|
30489
30583
|
// User has manually destroyed the editor lets clean up the mess
|
30490
30584
|
if (editor && !(editor.getContainer() || editor.getBody()).parentNode) {
|
30491
30585
|
removeEditorFromList(editor);
|
30586
|
+
editor.unbindAllNativeEvents();
|
30492
30587
|
editor.destroy(true);
|
30493
30588
|
editor = null;
|
30494
30589
|
}
|
@@ -30519,7 +30614,7 @@ define("tinymce/EditorManager", [
|
|
30519
30614
|
* @property minorVersion
|
30520
30615
|
* @type String
|
30521
30616
|
*/
|
30522
|
-
minorVersion: '1.
|
30617
|
+
minorVersion: '1.3',
|
30523
30618
|
|
30524
30619
|
/**
|
30525
30620
|
* Release date of TinyMCE build.
|
@@ -30527,7 +30622,7 @@ define("tinymce/EditorManager", [
|
|
30527
30622
|
* @property releaseDate
|
30528
30623
|
* @type String
|
30529
30624
|
*/
|
30530
|
-
releaseDate: '2014-07-
|
30625
|
+
releaseDate: '2014-07-29',
|
30531
30626
|
|
30532
30627
|
/**
|
30533
30628
|
* Collection of editor instances.
|
@@ -31146,6 +31241,7 @@ define("tinymce/LegacyInput", [
|
|
31146
31241
|
/**
|
31147
31242
|
* This class enables you to send XMLHTTPRequests cross browser.
|
31148
31243
|
* @class tinymce.util.XHR
|
31244
|
+
* @mixes tinymce.util.Observable
|
31149
31245
|
* @static
|
31150
31246
|
* @example
|
31151
31247
|
* // Sends a low level Ajax request
|
@@ -31155,9 +31251,17 @@ define("tinymce/LegacyInput", [
|
|
31155
31251
|
* console.debug(text);
|
31156
31252
|
* }
|
31157
31253
|
* });
|
31254
|
+
*
|
31255
|
+
* // Add custom header to XHR request
|
31256
|
+
* tinymce.util.XHR.on('beforeSend', function(e) {
|
31257
|
+
* e.xhr.setRequestHeader('X-Requested-With', 'Something');
|
31258
|
+
* });
|
31158
31259
|
*/
|
31159
|
-
define("tinymce/util/XHR", [
|
31160
|
-
|
31260
|
+
define("tinymce/util/XHR", [
|
31261
|
+
"tinymce/util/Observable",
|
31262
|
+
"tinymce/util/Tools"
|
31263
|
+
], function(Observable, Tools) {
|
31264
|
+
var XHR = {
|
31161
31265
|
/**
|
31162
31266
|
* Sends a XMLHTTPRequest.
|
31163
31267
|
* Consult the Wiki for details on what settings this method takes.
|
@@ -31201,12 +31305,14 @@ define("tinymce/util/XHR", [], function() {
|
|
31201
31305
|
if (settings.crossDomain) {
|
31202
31306
|
xhr.withCredentials = true;
|
31203
31307
|
}
|
31308
|
+
|
31204
31309
|
if (settings.content_type) {
|
31205
31310
|
xhr.setRequestHeader('Content-Type', settings.content_type);
|
31206
31311
|
}
|
31207
31312
|
|
31208
31313
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
31209
31314
|
|
31315
|
+
xhr = XHR.fire('beforeSend', {xhr: xhr, settings: settings}).xhr;
|
31210
31316
|
xhr.send(settings.data);
|
31211
31317
|
|
31212
31318
|
// Syncronous request
|
@@ -31219,6 +31325,10 @@ define("tinymce/util/XHR", [], function() {
|
|
31219
31325
|
}
|
31220
31326
|
}
|
31221
31327
|
};
|
31328
|
+
|
31329
|
+
Tools.extend(XHR, Observable);
|
31330
|
+
|
31331
|
+
return XHR;
|
31222
31332
|
});
|
31223
31333
|
|
31224
31334
|
// Included from: js/tinymce/classes/util/JSON.js
|
@@ -33085,6 +33195,15 @@ define("tinymce/ui/PanelButton", [
|
|
33085
33195
|
});
|
33086
33196
|
|
33087
33197
|
return self._super();
|
33198
|
+
},
|
33199
|
+
|
33200
|
+
remove: function() {
|
33201
|
+
if (this.panel) {
|
33202
|
+
this.panel.remove();
|
33203
|
+
this.panel = null;
|
33204
|
+
}
|
33205
|
+
|
33206
|
+
return this._super();
|
33088
33207
|
}
|
33089
33208
|
});
|
33090
33209
|
});
|
@@ -34871,7 +34990,6 @@ define("tinymce/ui/FormatControls", [
|
|
34871
34990
|
paste: ['Paste', 'Paste'],
|
34872
34991
|
help: ['Help', 'mceHelp'],
|
34873
34992
|
selectall: ['Select all', 'SelectAll'],
|
34874
|
-
hr: ['Insert horizontal rule', 'InsertHorizontalRule'],
|
34875
34993
|
removeformat: ['Clear formatting', 'RemoveFormat'],
|
34876
34994
|
visualaid: ['Visual aids', 'mceToggleVisualAid'],
|
34877
34995
|
newdocument: ['New document', 'mceNewDocument']
|