tinymce-rails 4.0.18 → 4.0.19

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/app/assets/source/tinymce/tinymce.jquery.js +466 -420
  4. data/app/assets/source/tinymce/tinymce.js +480 -427
  5. data/lib/tinymce/rails/version.rb +2 -2
  6. data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
  7. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
  8. data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
  9. data/vendor/assets/javascripts/tinymce/plugins/bbcode/plugin.js +1 -1
  10. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
  11. data/vendor/assets/javascripts/tinymce/plugins/example/plugin.js +1 -1
  12. data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.js +1 -1
  14. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
  15. data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
  16. data/vendor/assets/javascripts/tinymce/plugins/layer/plugin.js +1 -1
  17. data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +1 -1
  18. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
  19. data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +1 -1
  20. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
  21. data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
  22. data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
  23. data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
  24. data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
  25. data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
  26. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
  27. data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +1 -1
  28. data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
  29. data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
  30. data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +10 -10
  31. data/vendor/assets/javascripts/tinymce/tinymce.js +10 -10
  32. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc76d15cb308bd2bd3049465567309d610fb41c8
4
- data.tar.gz: ad5066e1a07e21a58a743f7cb9cb727cc457eddc
3
+ metadata.gz: c73958992ac308c2e36adddb53bb830bead67c09
4
+ data.tar.gz: 6d61070d761174a06d0ef391ddab7497e1281948
5
5
  SHA512:
6
- metadata.gz: 8a14c473f3cda6614e645c187aea824862fd0e4b453ae5807c9e68a56278d0a407db30cda1b0c96f72fd550219a27f7981a3b07b7ccf2163641ae60871c18016
7
- data.tar.gz: 0375faf8fcaa13ca3aa673b53c83bea23c1d5cf8b2cc13e34b8c82936948dcc171b990288297cfa9eaf74230686b3ae4b713c504695dd1386b6e0213797bba37
6
+ metadata.gz: 000443eccfbe9cb6afdc44936f10e2e8c6d603a5577363913ea0d45d858219721f8a0a049d29d817dcba4a95d72d852dc25e2d76d2df438f42abeef29a93d882
7
+ data.tar.gz: 58a671d81776ee23a9987db2f7d84c16897952ed4a5595ac36e63a1d0a9a66726365f9bfcf484ffa56e12b132bb1f7e0cac4f67046599e140774746ef5e958ec
data/README.md CHANGED
@@ -107,6 +107,16 @@ Using the `tinymce` helper and global configuration file is entirely optional. T
107
107
  </script>
108
108
 
109
109
 
110
+ Asset Compilation
111
+ -----------------
112
+
113
+ If you are including TinyMCE via `application.js` or using the `tinymce_assets` helper, the TinyMCE assets will be automatically precompiled when you run `rake assets:precompile`.
114
+
115
+ However if you wish to include `tinymce-jquery.js` independently, you will need to add it to the precompile list in `config/environments/production.rb`:
116
+
117
+ config.assets.precompile << "tinymce-jquery.js"
118
+
119
+
110
120
  Custom Plugins & Skins
111
121
  ----------------------
112
122
 
@@ -1,4 +1,4 @@
1
- // 4.0.18 (2014-02-27)
1
+ // 4.0.19 (2014-03-11)
2
2
 
3
3
  /**
4
4
  * Compiled inline version. (Library mode)
@@ -141,6 +141,7 @@ define("tinymce/dom/Sizzle", [], function() {
141
141
  define("tinymce/html/Styles", [], function() {
142
142
  return function(settings, schema) {
143
143
  /*jshint maxlen:255 */
144
+ /*eslint max-len:0 */
144
145
  var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,
145
146
  urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,
146
147
  styleRegExp = /\s*([^:]+):\s*([^;]+);?/g,
@@ -447,6 +448,7 @@ define("tinymce/html/Styles", [], function() {
447
448
  */
448
449
 
449
450
  /*jshint loopfunc:true*/
451
+ /*eslint no-loop-func:0 */
450
452
 
451
453
  define("tinymce/dom/EventUtils", [], function() {
452
454
  "use strict";
@@ -1099,9 +1101,10 @@ define("tinymce/util/Tools", [], function() {
1099
1101
  * @return {String} New string with removed whitespace.
1100
1102
  */
1101
1103
  var whiteSpaceRegExp = /^\s*|\s*$/g;
1102
- var trim = function(str) {
1104
+
1105
+ function trim(str) {
1103
1106
  return (str === null || str === undefined) ? '' : ("" + str).replace(whiteSpaceRegExp, '');
1104
- };
1107
+ }
1105
1108
 
1106
1109
  /**
1107
1110
  * Returns true/false if the object is an array or not.
@@ -1211,7 +1214,7 @@ define("tinymce/util/Tools", [], function() {
1211
1214
 
1212
1215
  if (o.length !== undefined) {
1213
1216
  // Indexed arrays, needed for Safari
1214
- for (n=0, l = o.length; n < l; n++) {
1217
+ for (n = 0, l = o.length; n < l; n++) {
1215
1218
  if (cb.call(s, o[n], n, o) === false) {
1216
1219
  return 0;
1217
1220
  }
@@ -1320,14 +1323,14 @@ define("tinymce/util/Tools", [], function() {
1320
1323
  * });
1321
1324
  */
1322
1325
  function create(s, p, root) {
1323
- var t = this, sp, ns, cn, scn, c, de = 0;
1326
+ var self = this, sp, ns, cn, scn, c, de = 0;
1324
1327
 
1325
1328
  // Parse : <prefix> <class>:<super class>
1326
1329
  s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);
1327
1330
  cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name
1328
1331
 
1329
1332
  // Create namespace for new class
1330
- ns = t.createNS(s[3].replace(/\.\w+$/, ''), root);
1333
+ ns = self.createNS(s[3].replace(/\.\w+$/, ''), root);
1331
1334
 
1332
1335
  // Class already exists
1333
1336
  if (ns[cn]) {
@@ -1353,11 +1356,11 @@ define("tinymce/util/Tools", [], function() {
1353
1356
 
1354
1357
  // Add constructor and methods
1355
1358
  ns[cn] = p[cn];
1356
- t.extend(ns[cn].prototype, p);
1359
+ self.extend(ns[cn].prototype, p);
1357
1360
 
1358
1361
  // Extend
1359
1362
  if (s[5]) {
1360
- sp = t.resolve(s[5]).prototype;
1363
+ sp = self.resolve(s[5]).prototype;
1361
1364
  scn = s[5].match(/\.(\w+)$/i)[1]; // Class name
1362
1365
 
1363
1366
  // Extend constructor
@@ -1377,12 +1380,12 @@ define("tinymce/util/Tools", [], function() {
1377
1380
  ns[cn].prototype[cn] = ns[cn];
1378
1381
 
1379
1382
  // Add super methods
1380
- t.each(sp, function(f, n) {
1383
+ self.each(sp, function(f, n) {
1381
1384
  ns[cn].prototype[n] = sp[n];
1382
1385
  });
1383
1386
 
1384
1387
  // Add overridden methods
1385
- t.each(p, function(f, n) {
1388
+ self.each(p, function(f, n) {
1386
1389
  // Extend methods if needed
1387
1390
  if (sp[n]) {
1388
1391
  ns[cn].prototype[n] = function() {
@@ -1399,7 +1402,7 @@ define("tinymce/util/Tools", [], function() {
1399
1402
 
1400
1403
  // Add static methods
1401
1404
  /*jshint sub:true*/
1402
- t.each(p['static'], function(f, n) {
1405
+ self.each(p['static'], function(f, n) {
1403
1406
  ns[cn][n] = f;
1404
1407
  });
1405
1408
  }
@@ -1499,7 +1502,7 @@ define("tinymce/util/Tools", [], function() {
1499
1502
  o = o || window;
1500
1503
 
1501
1504
  n = n.split('.');
1502
- for (i=0; i<n.length; i++) {
1505
+ for (i = 0; i < n.length; i++) {
1503
1506
  v = n[i];
1504
1507
 
1505
1508
  if (!o[v]) {
@@ -1594,7 +1597,7 @@ define("tinymce/dom/Range", [
1594
1597
  ], function(Tools) {
1595
1598
  // Range constructor
1596
1599
  function Range(dom) {
1597
- var t = this,
1600
+ var self = this,
1598
1601
  doc = dom.doc,
1599
1602
  EXTRACT = 0,
1600
1603
  CLONE = 1,
@@ -1638,14 +1641,14 @@ define("tinymce/dom/Range", [
1638
1641
 
1639
1642
  function collapse(ts) {
1640
1643
  if (ts) {
1641
- t[END_CONTAINER] = t[START_CONTAINER];
1642
- t[END_OFFSET] = t[START_OFFSET];
1644
+ self[END_CONTAINER] = self[START_CONTAINER];
1645
+ self[END_OFFSET] = self[START_OFFSET];
1643
1646
  } else {
1644
- t[START_CONTAINER] = t[END_CONTAINER];
1645
- t[START_OFFSET] = t[END_OFFSET];
1647
+ self[START_CONTAINER] = self[END_CONTAINER];
1648
+ self[START_OFFSET] = self[END_OFFSET];
1646
1649
  }
1647
1650
 
1648
- t.collapsed = TRUE;
1651
+ self.collapsed = TRUE;
1649
1652
  }
1650
1653
 
1651
1654
  function selectNode(n) {
@@ -1659,7 +1662,7 @@ define("tinymce/dom/Range", [
1659
1662
  }
1660
1663
 
1661
1664
  function compareBoundaryPoints(h, r) {
1662
- var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET],
1665
+ var sc = self[START_CONTAINER], so = self[START_OFFSET], ec = self[END_CONTAINER], eo = self[END_OFFSET],
1663
1666
  rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset;
1664
1667
 
1665
1668
  // Check START_TO_START
@@ -1731,21 +1734,21 @@ define("tinymce/dom/Range", [
1731
1734
  }
1732
1735
 
1733
1736
  function surroundContents(n) {
1734
- var f = t.extractContents();
1737
+ var f = self.extractContents();
1735
1738
 
1736
- t.insertNode(n);
1739
+ self.insertNode(n);
1737
1740
  n.appendChild(f);
1738
- t.selectNode(n);
1741
+ self.selectNode(n);
1739
1742
  }
1740
1743
 
1741
1744
  function cloneRange() {
1742
1745
  return extend(new Range(dom), {
1743
- startContainer: t[START_CONTAINER],
1744
- startOffset: t[START_OFFSET],
1745
- endContainer: t[END_CONTAINER],
1746
- endOffset: t[END_OFFSET],
1747
- collapsed: t.collapsed,
1748
- commonAncestorContainer: t.commonAncestorContainer
1746
+ startContainer: self[START_CONTAINER],
1747
+ startOffset: self[START_OFFSET],
1748
+ endContainer: self[END_CONTAINER],
1749
+ endOffset: self[END_OFFSET],
1750
+ collapsed: self.collapsed,
1751
+ commonAncestorContainer: self.commonAncestorContainer
1749
1752
  });
1750
1753
  }
1751
1754
 
@@ -1776,7 +1779,7 @@ define("tinymce/dom/Range", [
1776
1779
  }
1777
1780
 
1778
1781
  function _isCollapsed() {
1779
- return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]);
1782
+ return (self[START_CONTAINER] == self[END_CONTAINER] && self[START_OFFSET] == self[END_OFFSET]);
1780
1783
  }
1781
1784
 
1782
1785
  function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) {
@@ -1892,23 +1895,23 @@ define("tinymce/dom/Range", [
1892
1895
  var ec, sc;
1893
1896
 
1894
1897
  if (st) {
1895
- t[START_CONTAINER] = n;
1896
- t[START_OFFSET] = o;
1898
+ self[START_CONTAINER] = n;
1899
+ self[START_OFFSET] = o;
1897
1900
  } else {
1898
- t[END_CONTAINER] = n;
1899
- t[END_OFFSET] = o;
1901
+ self[END_CONTAINER] = n;
1902
+ self[END_OFFSET] = o;
1900
1903
  }
1901
1904
 
1902
1905
  // If one boundary-point of a Range is set to have a root container
1903
1906
  // other than the current one for the Range, the Range is collapsed to
1904
1907
  // the new position. This enforces the restriction that both boundary-
1905
1908
  // points of a Range must have the same root container.
1906
- ec = t[END_CONTAINER];
1909
+ ec = self[END_CONTAINER];
1907
1910
  while (ec.parentNode) {
1908
1911
  ec = ec.parentNode;
1909
1912
  }
1910
1913
 
1911
- sc = t[START_CONTAINER];
1914
+ sc = self[START_CONTAINER];
1912
1915
  while (sc.parentNode) {
1913
1916
  sc = sc.parentNode;
1914
1917
  }
@@ -1918,34 +1921,34 @@ define("tinymce/dom/Range", [
1918
1921
  // end position. To enforce this restriction, if the start is set to
1919
1922
  // be at a position after the end, the Range is collapsed to that
1920
1923
  // position.
1921
- if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) {
1922
- t.collapse(st);
1924
+ if (_compareBoundaryPoints(self[START_CONTAINER], self[START_OFFSET], self[END_CONTAINER], self[END_OFFSET]) > 0) {
1925
+ self.collapse(st);
1923
1926
  }
1924
1927
  } else {
1925
- t.collapse(st);
1928
+ self.collapse(st);
1926
1929
  }
1927
1930
 
1928
- t.collapsed = _isCollapsed();
1929
- t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]);
1931
+ self.collapsed = _isCollapsed();
1932
+ self.commonAncestorContainer = dom.findCommonAncestor(self[START_CONTAINER], self[END_CONTAINER]);
1930
1933
  }
1931
1934
 
1932
1935
  function _traverse(how) {
1933
1936
  var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep;
1934
1937
 
1935
- if (t[START_CONTAINER] == t[END_CONTAINER]) {
1938
+ if (self[START_CONTAINER] == self[END_CONTAINER]) {
1936
1939
  return _traverseSameContainer(how);
1937
1940
  }
1938
1941
 
1939
- for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
1940
- if (p == t[START_CONTAINER]) {
1942
+ for (c = self[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
1943
+ if (p == self[START_CONTAINER]) {
1941
1944
  return _traverseCommonStartContainer(c, how);
1942
1945
  }
1943
1946
 
1944
1947
  ++endContainerDepth;
1945
1948
  }
1946
1949
 
1947
- for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
1948
- if (p == t[END_CONTAINER]) {
1950
+ for (c = self[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
1951
+ if (p == self[END_CONTAINER]) {
1949
1952
  return _traverseCommonEndContainer(c, how);
1950
1953
  }
1951
1954
 
@@ -1954,13 +1957,13 @@ define("tinymce/dom/Range", [
1954
1957
 
1955
1958
  depthDiff = startContainerDepth - endContainerDepth;
1956
1959
 
1957
- startNode = t[START_CONTAINER];
1960
+ startNode = self[START_CONTAINER];
1958
1961
  while (depthDiff > 0) {
1959
1962
  startNode = startNode.parentNode;
1960
1963
  depthDiff--;
1961
1964
  }
1962
1965
 
1963
- endNode = t[END_CONTAINER];
1966
+ endNode = self[END_CONTAINER];
1964
1967
  while (depthDiff < 0) {
1965
1968
  endNode = endNode.parentNode;
1966
1969
  depthDiff++;
@@ -1983,21 +1986,21 @@ define("tinymce/dom/Range", [
1983
1986
  }
1984
1987
 
1985
1988
  // If selection is empty, just return the fragment
1986
- if (t[START_OFFSET] == t[END_OFFSET]) {
1989
+ if (self[START_OFFSET] == self[END_OFFSET]) {
1987
1990
  return frag;
1988
1991
  }
1989
1992
 
1990
1993
  // Text node needs special case handling
1991
- if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) {
1994
+ if (self[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) {
1992
1995
  // get the substring
1993
- s = t[START_CONTAINER].nodeValue;
1994
- sub = s.substring(t[START_OFFSET], t[END_OFFSET]);
1996
+ s = self[START_CONTAINER].nodeValue;
1997
+ sub = s.substring(self[START_OFFSET], self[END_OFFSET]);
1995
1998
 
1996
1999
  // set the original text node to its new value
1997
2000
  if (how != CLONE) {
1998
- n = t[START_CONTAINER];
1999
- start = t[START_OFFSET];
2000
- len = t[END_OFFSET] - t[START_OFFSET];
2001
+ n = self[START_CONTAINER];
2002
+ start = self[START_OFFSET];
2003
+ len = self[END_OFFSET] - self[START_OFFSET];
2001
2004
 
2002
2005
  if (start === 0 && len >= n.nodeValue.length - 1) {
2003
2006
  n.parentNode.removeChild(n);
@@ -2006,7 +2009,7 @@ define("tinymce/dom/Range", [
2006
2009
  }
2007
2010
 
2008
2011
  // Nothing is partially selected, so collapse to start point
2009
- t.collapse(TRUE);
2012
+ self.collapse(TRUE);
2010
2013
  }
2011
2014
 
2012
2015
  if (how == DELETE) {
@@ -2021,8 +2024,8 @@ define("tinymce/dom/Range", [
2021
2024
  }
2022
2025
 
2023
2026
  // Copy nodes between the start/end offsets.
2024
- n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]);
2025
- cnt = t[END_OFFSET] - t[START_OFFSET];
2027
+ n = _getSelectedNode(self[START_CONTAINER], self[START_OFFSET]);
2028
+ cnt = self[END_OFFSET] - self[START_OFFSET];
2026
2029
 
2027
2030
  while (n && cnt > 0) {
2028
2031
  sibling = n.nextSibling;
@@ -2038,7 +2041,7 @@ define("tinymce/dom/Range", [
2038
2041
 
2039
2042
  // Nothing is partially selected, so collapse to start point
2040
2043
  if (how != CLONE) {
2041
- t.collapse(TRUE);
2044
+ self.collapse(TRUE);
2042
2045
  }
2043
2046
 
2044
2047
  return frag;
@@ -2058,14 +2061,14 @@ define("tinymce/dom/Range", [
2058
2061
  }
2059
2062
 
2060
2063
  endIdx = nodeIndex(endAncestor);
2061
- cnt = endIdx - t[START_OFFSET];
2064
+ cnt = endIdx - self[START_OFFSET];
2062
2065
 
2063
2066
  if (cnt <= 0) {
2064
2067
  // Collapse to just before the endAncestor, which
2065
2068
  // is partially selected.
2066
2069
  if (how != CLONE) {
2067
- t.setEndBefore(endAncestor);
2068
- t.collapse(FALSE);
2070
+ self.setEndBefore(endAncestor);
2071
+ self.collapse(FALSE);
2069
2072
  }
2070
2073
 
2071
2074
  return frag;
@@ -2087,8 +2090,8 @@ define("tinymce/dom/Range", [
2087
2090
  // Collapse to just before the endAncestor, which
2088
2091
  // is partially selected.
2089
2092
  if (how != CLONE) {
2090
- t.setEndBefore(endAncestor);
2091
- t.collapse(FALSE);
2093
+ self.setEndBefore(endAncestor);
2094
+ self.collapse(FALSE);
2092
2095
  }
2093
2096
 
2094
2097
  return frag;
@@ -2109,7 +2112,7 @@ define("tinymce/dom/Range", [
2109
2112
  startIdx = nodeIndex(startAncestor);
2110
2113
  ++startIdx; // Because we already traversed it
2111
2114
 
2112
- cnt = t[END_OFFSET] - startIdx;
2115
+ cnt = self[END_OFFSET] - startIdx;
2113
2116
  n = startAncestor.nextSibling;
2114
2117
  while (n && cnt > 0) {
2115
2118
  sibling = n.nextSibling;
@@ -2124,15 +2127,15 @@ define("tinymce/dom/Range", [
2124
2127
  }
2125
2128
 
2126
2129
  if (how != CLONE) {
2127
- t.setStartAfter(startAncestor);
2128
- t.collapse(TRUE);
2130
+ self.setStartAfter(startAncestor);
2131
+ self.collapse(TRUE);
2129
2132
  }
2130
2133
 
2131
2134
  return frag;
2132
2135
  }
2133
2136
 
2134
2137
  function _traverseCommonAncestors(startAncestor, endAncestor, how) {
2135
- var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling;
2138
+ var n, frag, startOffset, endOffset, cnt, sibling, nextSibling;
2136
2139
 
2137
2140
  if (how != DELETE) {
2138
2141
  frag = createDocumentFragment();
@@ -2143,7 +2146,6 @@ define("tinymce/dom/Range", [
2143
2146
  frag.appendChild(n);
2144
2147
  }
2145
2148
 
2146
- commonParent = startAncestor.parentNode;
2147
2149
  startOffset = nodeIndex(startAncestor);
2148
2150
  endOffset = nodeIndex(endAncestor);
2149
2151
  ++startOffset;
@@ -2170,16 +2172,16 @@ define("tinymce/dom/Range", [
2170
2172
  }
2171
2173
 
2172
2174
  if (how != CLONE) {
2173
- t.setStartAfter(startAncestor);
2174
- t.collapse(TRUE);
2175
+ self.setStartAfter(startAncestor);
2176
+ self.collapse(TRUE);
2175
2177
  }
2176
2178
 
2177
2179
  return frag;
2178
2180
  }
2179
2181
 
2180
2182
  function _traverseRightBoundary(root, how) {
2181
- var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent;
2182
- var prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER];
2183
+ var next = _getSelectedNode(self[END_CONTAINER], self[END_OFFSET] - 1), parent, clonedParent;
2184
+ var prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != self[END_CONTAINER];
2183
2185
 
2184
2186
  if (next == root) {
2185
2187
  return _traverseNode(next, isFullySelected, FALSE, how);
@@ -2219,7 +2221,7 @@ define("tinymce/dom/Range", [
2219
2221
  }
2220
2222
 
2221
2223
  function _traverseLeftBoundary(root, how) {
2222
- var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER];
2224
+ var next = _getSelectedNode(self[START_CONTAINER], self[START_OFFSET]), isFullySelected = next != self[START_CONTAINER];
2223
2225
  var parent, clonedParent, nextSibling, clonedChild, clonedGrandParent;
2224
2226
 
2225
2227
  if (next == root) {
@@ -2270,11 +2272,11 @@ define("tinymce/dom/Range", [
2270
2272
  txtValue = n.nodeValue;
2271
2273
 
2272
2274
  if (isLeft) {
2273
- offset = t[START_OFFSET];
2275
+ offset = self[START_OFFSET];
2274
2276
  newNodeValue = txtValue.substring(offset);
2275
2277
  oldNodeValue = txtValue.substring(0, offset);
2276
2278
  } else {
2277
- offset = t[END_OFFSET];
2279
+ offset = self[END_OFFSET];
2278
2280
  newNodeValue = txtValue.substring(0, offset);
2279
2281
  oldNodeValue = txtValue.substring(offset);
2280
2282
  }
@@ -2312,7 +2314,7 @@ define("tinymce/dom/Range", [
2312
2314
  return dom.create('body', null, cloneContents()).outerText;
2313
2315
  }
2314
2316
 
2315
- extend(t, {
2317
+ extend(self, {
2316
2318
  // Inital states
2317
2319
  startContainer: doc,
2318
2320
  startOffset: 0,
@@ -2347,7 +2349,7 @@ define("tinymce/dom/Range", [
2347
2349
  toStringIE: toStringIE
2348
2350
  });
2349
2351
 
2350
- return t;
2352
+ return self;
2351
2353
  }
2352
2354
 
2353
2355
  // Older IE versions doesn't let you override toString by it's constructor so we have to stick it in the prototype
@@ -2371,6 +2373,7 @@ define("tinymce/dom/Range", [
2371
2373
  */
2372
2374
 
2373
2375
  /*jshint bitwise:false */
2376
+ /*eslint no-bitwise:0 */
2374
2377
 
2375
2378
  /**
2376
2379
  * Entity encoder class.
@@ -2763,190 +2766,190 @@ define("tinymce/Env", [], function() {
2763
2766
 
2764
2767
  // Included from: js/tinymce/classes/dom/StyleSheetLoader.js
2765
2768
 
2766
- /**
2767
- * StyleSheetLoader.js
2768
- *
2769
- * Copyright, Moxiecode Systems AB
2770
- * Released under LGPL License.
2771
- *
2772
- * License: http://www.tinymce.com/license
2773
- * Contributing: http://www.tinymce.com/contributing
2774
- */
2775
-
2776
- /**
2777
- * This class handles loading of external stylesheets and fires events when these are loaded.
2778
- *
2779
- * @class tinymce.dom.StyleSheetLoader
2780
- * @private
2781
- */
2782
- define("tinymce/dom/StyleSheetLoader", [], function() {
2783
- "use strict";
2784
-
2785
- return function(document, settings) {
2786
- var idCount = 0, loadedStates = {}, maxLoadTime;
2787
-
2788
- settings = settings || {};
2789
- maxLoadTime = settings.maxLoadTime || 5000;
2790
-
2791
- function appendToHead(node) {
2792
- document.getElementsByTagName('head')[0].appendChild(node);
2793
- }
2794
-
2795
- /**
2796
- * Loads the specified css style sheet file and call the loadedCallback once it's finished loading.
2797
- *
2798
- * @method load
2799
- * @param {String} url Url to be loaded.
2800
- * @param {Function} loadedCallback Callback to be executed when loaded.
2801
- * @param {Function} errorCallback Callback to be executed when failed loading.
2802
- */
2803
- function load(url, loadedCallback, errorCallback) {
2804
- var link, style, startTime, state;
2805
-
2806
- function passed() {
2807
- var callbacks = state.passed, i = callbacks.length;
2808
-
2809
- while (i--) {
2810
- callbacks[i]();
2811
- }
2812
-
2813
- state.status = 2;
2814
- state.passed = [];
2815
- state.failed = [];
2816
- }
2817
-
2818
- function failed() {
2819
- var callbacks = state.failed, i = callbacks.length;
2820
-
2821
- while (i--) {
2822
- callbacks[i]();
2823
- }
2824
-
2825
- state.status = 3;
2826
- state.passed = [];
2827
- state.failed = [];
2828
- }
2829
-
2830
- // Sniffs for older WebKit versions that have the link.onload but a broken one
2831
- function isOldWebKit() {
2832
- var webKitChunks = navigator.userAgent.match(/WebKit\/(\d*)/);
2833
- return !!(webKitChunks && webKitChunks[1] < 536);
2834
- }
2835
-
2836
- // Calls the waitCallback until the test returns true or the timeout occurs
2837
- function wait(testCallback, waitCallback) {
2838
- if (!testCallback()) {
2839
- // Wait for timeout
2840
- if ((new Date().getTime()) - startTime < maxLoadTime) {
2841
- window.setTimeout(waitCallback, 0);
2842
- } else {
2843
- failed();
2844
- }
2845
- }
2846
- }
2847
-
2848
- // Workaround for WebKit that doesn't properly support the onload event for link elements
2849
- // Or WebKit that fires the onload event before the StyleSheet is added to the document
2850
- function waitForWebKitLinkLoaded() {
2851
- wait(function() {
2852
- var styleSheets = document.styleSheets, styleSheet, i = styleSheets.length, owner;
2853
-
2854
- while (i--) {
2855
- styleSheet = styleSheets[i];
2856
- owner = styleSheet.ownerNode ? styleSheet.ownerNode : styleSheet.owningElement;
2857
- if (owner && owner.id === link.id) {
2858
- passed();
2859
- return true;
2860
- }
2861
- }
2862
- }, waitForWebKitLinkLoaded);
2863
- }
2864
-
2865
- // Workaround for older Geckos that doesn't have any onload event for StyleSheets
2866
- function waitForGeckoLinkLoaded() {
2867
- wait(function() {
2868
- try {
2869
- // Accessing the cssRules will throw an exception until the CSS file is loaded
2870
- var cssRules = style.sheet.cssRules;
2871
- passed();
2872
- return !!cssRules;
2873
- } catch (ex) {
2874
- // Ignore
2875
- }
2876
- }, waitForGeckoLinkLoaded);
2877
- }
2878
-
2879
- if (!loadedStates[url]) {
2880
- state = {
2881
- passed: [],
2882
- failed: []
2883
- };
2884
-
2885
- loadedStates[url] = state;
2886
- } else {
2887
- state = loadedStates[url];
2888
- }
2889
-
2890
- if (loadedCallback) {
2891
- state.passed.push(loadedCallback);
2892
- }
2893
-
2894
- if (errorCallback) {
2895
- state.failed.push(errorCallback);
2896
- }
2897
-
2898
- // Is loading wait for it to pass
2899
- if (state.status == 1) {
2900
- return;
2901
- }
2902
-
2903
- // Has finished loading and was success
2904
- if (state.status == 2) {
2905
- passed();
2906
- return;
2907
- }
2908
-
2909
- // Has finished loading and was a failure
2910
- if (state.status == 3) {
2911
- failed();
2912
- return;
2913
- }
2914
-
2915
- // Start loading
2916
- state.status = 1;
2917
- link = document.createElement('link');
2918
- link.rel = 'stylesheet';
2919
- link.type = 'text/css';
2920
- link.id = 'u' + (idCount++);
2921
- link.async = false;
2922
- link.defer = false;
2923
- startTime = new Date().getTime();
2924
-
2925
- // Feature detect onload on link element and sniff older webkits since it has an broken onload event
2926
- if ("onload" in link && !isOldWebKit()) {
2927
- link.onload = waitForWebKitLinkLoaded;
2928
- link.onerror = failed;
2929
- } else {
2930
- // Sniff for old Firefox that doesn't support the onload event on link elements
2931
- // TODO: Remove this in the future when everyone uses modern browsers
2932
- if (navigator.userAgent.indexOf("Firefox") > 0) {
2933
- style = document.createElement('style');
2934
- style.textContent = '@import "' + url + '"';
2935
- waitForGeckoLinkLoaded();
2936
- appendToHead(style);
2937
- return;
2938
- } else {
2939
- // Use the id owner on older webkits
2940
- waitForWebKitLinkLoaded();
2941
- }
2942
- }
2943
-
2944
- appendToHead(link);
2945
- link.href = url;
2946
- }
2947
-
2948
- this.load = load;
2949
- };
2769
+ /**
2770
+ * StyleSheetLoader.js
2771
+ *
2772
+ * Copyright, Moxiecode Systems AB
2773
+ * Released under LGPL License.
2774
+ *
2775
+ * License: http://www.tinymce.com/license
2776
+ * Contributing: http://www.tinymce.com/contributing
2777
+ */
2778
+
2779
+ /**
2780
+ * This class handles loading of external stylesheets and fires events when these are loaded.
2781
+ *
2782
+ * @class tinymce.dom.StyleSheetLoader
2783
+ * @private
2784
+ */
2785
+ define("tinymce/dom/StyleSheetLoader", [], function() {
2786
+ "use strict";
2787
+
2788
+ return function(document, settings) {
2789
+ var idCount = 0, loadedStates = {}, maxLoadTime;
2790
+
2791
+ settings = settings || {};
2792
+ maxLoadTime = settings.maxLoadTime || 5000;
2793
+
2794
+ function appendToHead(node) {
2795
+ document.getElementsByTagName('head')[0].appendChild(node);
2796
+ }
2797
+
2798
+ /**
2799
+ * Loads the specified css style sheet file and call the loadedCallback once it's finished loading.
2800
+ *
2801
+ * @method load
2802
+ * @param {String} url Url to be loaded.
2803
+ * @param {Function} loadedCallback Callback to be executed when loaded.
2804
+ * @param {Function} errorCallback Callback to be executed when failed loading.
2805
+ */
2806
+ function load(url, loadedCallback, errorCallback) {
2807
+ var link, style, startTime, state;
2808
+
2809
+ function passed() {
2810
+ var callbacks = state.passed, i = callbacks.length;
2811
+
2812
+ while (i--) {
2813
+ callbacks[i]();
2814
+ }
2815
+
2816
+ state.status = 2;
2817
+ state.passed = [];
2818
+ state.failed = [];
2819
+ }
2820
+
2821
+ function failed() {
2822
+ var callbacks = state.failed, i = callbacks.length;
2823
+
2824
+ while (i--) {
2825
+ callbacks[i]();
2826
+ }
2827
+
2828
+ state.status = 3;
2829
+ state.passed = [];
2830
+ state.failed = [];
2831
+ }
2832
+
2833
+ // Sniffs for older WebKit versions that have the link.onload but a broken one
2834
+ function isOldWebKit() {
2835
+ var webKitChunks = navigator.userAgent.match(/WebKit\/(\d*)/);
2836
+ return !!(webKitChunks && webKitChunks[1] < 536);
2837
+ }
2838
+
2839
+ // Calls the waitCallback until the test returns true or the timeout occurs
2840
+ function wait(testCallback, waitCallback) {
2841
+ if (!testCallback()) {
2842
+ // Wait for timeout
2843
+ if ((new Date().getTime()) - startTime < maxLoadTime) {
2844
+ window.setTimeout(waitCallback, 0);
2845
+ } else {
2846
+ failed();
2847
+ }
2848
+ }
2849
+ }
2850
+
2851
+ // Workaround for WebKit that doesn't properly support the onload event for link elements
2852
+ // Or WebKit that fires the onload event before the StyleSheet is added to the document
2853
+ function waitForWebKitLinkLoaded() {
2854
+ wait(function() {
2855
+ var styleSheets = document.styleSheets, styleSheet, i = styleSheets.length, owner;
2856
+
2857
+ while (i--) {
2858
+ styleSheet = styleSheets[i];
2859
+ owner = styleSheet.ownerNode ? styleSheet.ownerNode : styleSheet.owningElement;
2860
+ if (owner && owner.id === link.id) {
2861
+ passed();
2862
+ return true;
2863
+ }
2864
+ }
2865
+ }, waitForWebKitLinkLoaded);
2866
+ }
2867
+
2868
+ // Workaround for older Geckos that doesn't have any onload event for StyleSheets
2869
+ function waitForGeckoLinkLoaded() {
2870
+ wait(function() {
2871
+ try {
2872
+ // Accessing the cssRules will throw an exception until the CSS file is loaded
2873
+ var cssRules = style.sheet.cssRules;
2874
+ passed();
2875
+ return !!cssRules;
2876
+ } catch (ex) {
2877
+ // Ignore
2878
+ }
2879
+ }, waitForGeckoLinkLoaded);
2880
+ }
2881
+
2882
+ if (!loadedStates[url]) {
2883
+ state = {
2884
+ passed: [],
2885
+ failed: []
2886
+ };
2887
+
2888
+ loadedStates[url] = state;
2889
+ } else {
2890
+ state = loadedStates[url];
2891
+ }
2892
+
2893
+ if (loadedCallback) {
2894
+ state.passed.push(loadedCallback);
2895
+ }
2896
+
2897
+ if (errorCallback) {
2898
+ state.failed.push(errorCallback);
2899
+ }
2900
+
2901
+ // Is loading wait for it to pass
2902
+ if (state.status == 1) {
2903
+ return;
2904
+ }
2905
+
2906
+ // Has finished loading and was success
2907
+ if (state.status == 2) {
2908
+ passed();
2909
+ return;
2910
+ }
2911
+
2912
+ // Has finished loading and was a failure
2913
+ if (state.status == 3) {
2914
+ failed();
2915
+ return;
2916
+ }
2917
+
2918
+ // Start loading
2919
+ state.status = 1;
2920
+ link = document.createElement('link');
2921
+ link.rel = 'stylesheet';
2922
+ link.type = 'text/css';
2923
+ link.id = 'u' + (idCount++);
2924
+ link.async = false;
2925
+ link.defer = false;
2926
+ startTime = new Date().getTime();
2927
+
2928
+ // Feature detect onload on link element and sniff older webkits since it has an broken onload event
2929
+ if ("onload" in link && !isOldWebKit()) {
2930
+ link.onload = waitForWebKitLinkLoaded;
2931
+ link.onerror = failed;
2932
+ } else {
2933
+ // Sniff for old Firefox that doesn't support the onload event on link elements
2934
+ // TODO: Remove this in the future when everyone uses modern browsers
2935
+ if (navigator.userAgent.indexOf("Firefox") > 0) {
2936
+ style = document.createElement('style');
2937
+ style.textContent = '@import "' + url + '"';
2938
+ waitForGeckoLinkLoaded();
2939
+ appendToHead(style);
2940
+ return;
2941
+ } else {
2942
+ // Use the id owner on older webkits
2943
+ waitForWebKitLinkLoaded();
2944
+ }
2945
+ }
2946
+
2947
+ appendToHead(link);
2948
+ link.href = url;
2949
+ }
2950
+
2951
+ this.load = load;
2952
+ };
2950
2953
  });
2951
2954
 
2952
2955
  // Included from: js/tinymce/classes/dom/DOMUtils.js
@@ -3699,7 +3702,7 @@ define("tinymce/dom/DOMUtils", [
3699
3702
  * tinymce.dom.setAttrib('mydiv', 'class', 'myclass');
3700
3703
  */
3701
3704
  setAttrib: function(e, n, v) {
3702
- var t = this;
3705
+ var self = this;
3703
3706
 
3704
3707
  // What's the point
3705
3708
  if (!e || !n) {
@@ -3707,14 +3710,14 @@ define("tinymce/dom/DOMUtils", [
3707
3710
  }
3708
3711
 
3709
3712
  return this.run(e, function(e) {
3710
- var s = t.settings;
3713
+ var s = self.settings;
3711
3714
  var originalValue = e.getAttribute(n);
3712
3715
  if (v !== null) {
3713
3716
  switch (n) {
3714
3717
  case "style":
3715
3718
  if (!is(v, 'string')) {
3716
3719
  each(v, function(v, n) {
3717
- t.setStyle(e, n, v);
3720
+ self.setStyle(e, n, v);
3718
3721
  });
3719
3722
 
3720
3723
  return;
@@ -3740,10 +3743,10 @@ define("tinymce/dom/DOMUtils", [
3740
3743
  case "href":
3741
3744
  if (s.keep_values) {
3742
3745
  if (s.url_converter) {
3743
- v = s.url_converter.call(s.url_converter_scope || t, v, n, e);
3746
+ v = s.url_converter.call(s.url_converter_scope || self, v, n, e);
3744
3747
  }
3745
3748
 
3746
- t.setAttrib(e, 'data-mce-' + n, v, 2);
3749
+ self.setAttrib(e, 'data-mce-' + n, v, 2);
3747
3750
  }
3748
3751
 
3749
3752
  break;
@@ -4312,7 +4315,7 @@ define("tinymce/dom/DOMUtils", [
4312
4315
  newElement.innerHTML = '<br />' + html;
4313
4316
 
4314
4317
  // Add all children from div to target
4315
- each (grep(newElement.childNodes), function(node, i) {
4318
+ each(grep(newElement.childNodes), function(node, i) {
4316
4319
  // Skip br element
4317
4320
  if (i && element.canHaveHTML) {
4318
4321
  element.appendChild(node);
@@ -4724,10 +4727,10 @@ define("tinymce/dom/DOMUtils", [
4724
4727
  * @return {Number} Index of the specified node.
4725
4728
  */
4726
4729
  nodeIndex: function(node, normalized) {
4727
- var idx = 0, lastNodeType, lastNode, nodeType;
4730
+ var idx = 0, lastNodeType, nodeType;
4728
4731
 
4729
4732
  if (node) {
4730
- for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) {
4733
+ for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {
4731
4734
  nodeType = node.nodeType;
4732
4735
 
4733
4736
  // Normalize text nodes
@@ -5109,6 +5112,8 @@ define("tinymce/dom/ScriptLoader", [
5109
5112
  }
5110
5113
 
5111
5114
  function error() {
5115
+ /*eslint no-console:0 */
5116
+
5112
5117
  // Report the error so it's easier for people to spot loading errors
5113
5118
  if (typeof(console) !== "undefined" && console.log) {
5114
5119
  console.log("Failed to load: " + url);
@@ -5421,10 +5426,10 @@ define("tinymce/AddOnManager", [
5421
5426
  * Loads an add-on from a specific url.
5422
5427
  *
5423
5428
  * @method load
5424
- * @param {String} n Short name of the add-on that gets loaded.
5425
- * @param {String} u URL to the add-on that will get loaded.
5426
- * @param {function} cb Optional callback to execute ones the add-on is loaded.
5427
- * @param {Object} s Optional scope to execute the callback in.
5429
+ * @param {String} name Short name of the add-on that gets loaded.
5430
+ * @param {String} addOnUrl URL to the add-on that will get loaded.
5431
+ * @param {function} callback Optional callback to execute ones the add-on is loaded.
5432
+ * @param {Object} scope Optional scope to execute the callback in.
5428
5433
  * @example
5429
5434
  * // Loads a plugin from an external URL
5430
5435
  * tinymce.PluginManager.load('myplugin', '/some/dir/someplugin/plugin.js');
@@ -5435,45 +5440,45 @@ define("tinymce/AddOnManager", [
5435
5440
  * plugins: '-myplugin' // Don't try to load it again
5436
5441
  * });
5437
5442
  */
5438
- load: function(n, u, cb, s) {
5439
- var t = this, url = u;
5443
+ load: function(name, addOnUrl, callback, scope) {
5444
+ var self = this, url = addOnUrl;
5440
5445
 
5441
5446
  function loadDependencies() {
5442
- var dependencies = t.dependencies(n);
5447
+ var dependencies = self.dependencies(name);
5443
5448
 
5444
5449
  each(dependencies, function(dep) {
5445
- var newUrl = t.createUrl(u, dep);
5450
+ var newUrl = self.createUrl(addOnUrl, dep);
5446
5451
 
5447
- t.load(newUrl.resource, newUrl, undefined, undefined);
5452
+ self.load(newUrl.resource, newUrl, undefined, undefined);
5448
5453
  });
5449
5454
 
5450
- if (cb) {
5451
- if (s) {
5452
- cb.call(s);
5455
+ if (callback) {
5456
+ if (scope) {
5457
+ callback.call(scope);
5453
5458
  } else {
5454
- cb.call(ScriptLoader);
5459
+ callback.call(ScriptLoader);
5455
5460
  }
5456
5461
  }
5457
5462
  }
5458
5463
 
5459
- if (t.urls[n]) {
5464
+ if (self.urls[name]) {
5460
5465
  return;
5461
5466
  }
5462
5467
 
5463
- if (typeof u === "object") {
5464
- url = u.prefix + u.resource + u.suffix;
5468
+ if (typeof addOnUrl === "object") {
5469
+ url = addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;
5465
5470
  }
5466
5471
 
5467
5472
  if (url.indexOf('/') !== 0 && url.indexOf('://') == -1) {
5468
5473
  url = AddOnManager.baseURL + '/' + url;
5469
5474
  }
5470
5475
 
5471
- t.urls[n] = url.substring(0, url.lastIndexOf('/'));
5476
+ self.urls[name] = url.substring(0, url.lastIndexOf('/'));
5472
5477
 
5473
- if (t.lookup[n]) {
5478
+ if (self.lookup[name]) {
5474
5479
  loadDependencies();
5475
5480
  } else {
5476
- ScriptLoader.ScriptLoader.add(url, loadDependencies, s);
5481
+ ScriptLoader.ScriptLoader.add(url, loadDependencies, scope);
5477
5482
  }
5478
5483
  }
5479
5484
  };
@@ -6087,7 +6092,7 @@ define("tinymce/html/Schema", [
6087
6092
  * @return {Object} Schema lookup table.
6088
6093
  */
6089
6094
  function compileSchema(type) {
6090
- var schema = {}, globalAttributes, eventAttributes, blockContent;
6095
+ var schema = {}, globalAttributes, blockContent;
6091
6096
  var phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;
6092
6097
 
6093
6098
  function add(name, attributes, children) {
@@ -6155,13 +6160,13 @@ define("tinymce/html/Schema", [
6155
6160
  globalAttributes = split("id accesskey class dir lang style tabindex title");
6156
6161
 
6157
6162
  // Event attributes can be opt-in/opt-out
6158
- eventAttributes = split("onabort onblur oncancel oncanplay oncanplaythrough onchange onclick onclose oncontextmenu oncuechange " +
6163
+ /*eventAttributes = split("onabort onblur oncancel oncanplay oncanplaythrough onchange onclick onclose oncontextmenu oncuechange " +
6159
6164
  "ondblclick ondrag ondragend ondragenter ondragleave ondragover ondragstart ondrop ondurationchange onemptied onended " +
6160
6165
  "onerror onfocus oninput oninvalid onkeydown onkeypress onkeyup onload onloadeddata onloadedmetadata onloadstart " +
6161
6166
  "onmousedown onmousemove onmouseout onmouseover onmouseup onmousewheel onpause onplay onplaying onprogress onratechange " +
6162
6167
  "onreset onscroll onseeked onseeking onseeking onselect onshow onstalled onsubmit onsuspend ontimeupdate onvolumechange " +
6163
6168
  "onwaiting"
6164
- );
6169
+ );*/
6165
6170
 
6166
6171
  // Block content elements
6167
6172
  blockContent = split(
@@ -6988,6 +6993,8 @@ define("tinymce/html/Schema", [
6988
6993
  * Contributing: http://www.tinymce.com/contributing
6989
6994
  */
6990
6995
 
6996
+ /*eslint max-depth:[2, 9] */
6997
+
6991
6998
  /**
6992
6999
  * This class parses HTML code using pure JavaScript and executes various events for each item it finds. It will
6993
7000
  * always execute the events in the right order for tag soup code like <b><p></b></p>. It will also remove elements
@@ -7044,7 +7051,9 @@ define("tinymce/html/SaxParser", [
7044
7051
  * @param {tinymce.html.Schema} schema HTML Schema class to use when parsing.
7045
7052
  */
7046
7053
  return function(settings, schema) {
7047
- var self = this, noop = function() {};
7054
+ var self = this;
7055
+
7056
+ function noop() {}
7048
7057
 
7049
7058
  settings = settings || {};
7050
7059
  self.schema = schema = schema || new Schema();
@@ -8652,6 +8661,7 @@ define("tinymce/dom/Serializer", [
8652
8661
 
8653
8662
  function trim(value) {
8654
8663
  /*jshint maxlen:255 */
8664
+ /*eslint max-len:0 */
8655
8665
  return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n')
8656
8666
  .replace(/^[\r\n]*|[\r\n]*$/g, '')
8657
8667
  .replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi, '')
@@ -9523,19 +9533,21 @@ define("tinymce/dom/ControlSelection", [
9523
9533
  );
9524
9534
 
9525
9535
  function isResizable(elm) {
9526
- if (editor.settings.object_resizing === false) {
9536
+ var selector = editor.settings.object_resizing;
9537
+
9538
+ if (selector === false || Env.iOS) {
9527
9539
  return false;
9528
9540
  }
9529
9541
 
9530
- if (!/TABLE|IMG|DIV/.test(elm.nodeName)) {
9531
- return false;
9542
+ if (typeof selector != 'string') {
9543
+ selector = 'table,img,div';
9532
9544
  }
9533
9545
 
9534
9546
  if (elm.getAttribute('data-mce-resize') === 'false') {
9535
9547
  return false;
9536
9548
  }
9537
9549
 
9538
- return true;
9550
+ return editor.dom.is(elm, selector);
9539
9551
  }
9540
9552
 
9541
9553
  function resizeGhostElement(e) {
@@ -9905,6 +9917,14 @@ define("tinymce/dom/ControlSelection", [
9905
9917
  editor.dom.bind(editor.getBody(), 'mscontrolselect', function(e) {
9906
9918
  if (/^(TABLE|IMG|HR)$/.test(e.target.nodeName)) {
9907
9919
  e.preventDefault();
9920
+
9921
+ // This moves the selection from being a control selection to a text like selection like in WebKit #6753
9922
+ // TODO: Fix this the day IE works like other browsers without this nasty native ugly control selections.
9923
+ if (e.target.tagName == 'IMG') {
9924
+ window.setTimeout(function() {
9925
+ editor.selection.select(e.target);
9926
+ }, 0);
9927
+ }
9908
9928
  }
9909
9929
  });
9910
9930
  }
@@ -10770,7 +10790,7 @@ define("tinymce/dom/Selection", [
10770
10790
  * tinymce.activeEditor.selection.moveToBookmark(bm);
10771
10791
  */
10772
10792
  getBookmark: function(type, normalized) {
10773
- var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, chr = '&#xFEFF;', styles;
10793
+ var self = this, dom = self.dom, rng, rng2, id, collapsed, name, element, chr = '&#xFEFF;', styles;
10774
10794
 
10775
10795
  function findIndex(name, element) {
10776
10796
  var index = 0;
@@ -10808,7 +10828,7 @@ define("tinymce/dom/Selection", [
10808
10828
  }
10809
10829
 
10810
10830
  function getLocation() {
10811
- var rng = t.getRng(true), root = dom.getRoot(), bookmark = {};
10831
+ var rng = self.getRng(true), root = dom.getRoot(), bookmark = {};
10812
10832
 
10813
10833
  function getPoint(rng, start) {
10814
10834
  var container = rng[start ? 'startContainer' : 'endContainer'],
@@ -10830,11 +10850,11 @@ define("tinymce/dom/Selection", [
10830
10850
  offset = Math.max(0, childNodes.length - 1);
10831
10851
  }
10832
10852
 
10833
- point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after);
10853
+ point.push(self.dom.nodeIndex(childNodes[offset], normalized) + after);
10834
10854
  }
10835
10855
 
10836
10856
  for (; container && container != root; container = container.parentNode) {
10837
- point.push(t.dom.nodeIndex(container, normalized));
10857
+ point.push(self.dom.nodeIndex(container, normalized));
10838
10858
  }
10839
10859
 
10840
10860
  return point;
@@ -10842,7 +10862,7 @@ define("tinymce/dom/Selection", [
10842
10862
 
10843
10863
  bookmark.start = getPoint(rng, true);
10844
10864
 
10845
- if (!t.isCollapsed()) {
10865
+ if (!self.isCollapsed()) {
10846
10866
  bookmark.end = getPoint(rng);
10847
10867
  }
10848
10868
 
@@ -10850,15 +10870,15 @@ define("tinymce/dom/Selection", [
10850
10870
  }
10851
10871
 
10852
10872
  if (type == 2) {
10853
- element = t.getNode();
10873
+ element = self.getNode();
10854
10874
  name = element ? element.nodeName : null;
10855
10875
 
10856
10876
  if (name == 'IMG') {
10857
10877
  return {name: name, index: findIndex(name, element)};
10858
10878
  }
10859
10879
 
10860
- if (t.tridentSel) {
10861
- return t.tridentSel.getBookmark(type);
10880
+ if (self.tridentSel) {
10881
+ return self.tridentSel.getBookmark(type);
10862
10882
  }
10863
10883
 
10864
10884
  return getLocation();
@@ -10866,12 +10886,12 @@ define("tinymce/dom/Selection", [
10866
10886
 
10867
10887
  // Handle simple range
10868
10888
  if (type) {
10869
- return {rng: t.getRng()};
10889
+ return {rng: self.getRng()};
10870
10890
  }
10871
10891
 
10872
- rng = t.getRng();
10892
+ rng = self.getRng();
10873
10893
  id = dom.uniqueId();
10874
- collapsed = t.isCollapsed();
10894
+ collapsed = self.isCollapsed();
10875
10895
  styles = 'overflow:hidden;line-height:0px';
10876
10896
 
10877
10897
  // Explorer method
@@ -10910,7 +10930,7 @@ define("tinymce/dom/Selection", [
10910
10930
  return {name: name, index: findIndex(name, element)};
10911
10931
  }
10912
10932
  } else {
10913
- element = t.getNode();
10933
+ element = self.getNode();
10914
10934
  name = element.nodeName;
10915
10935
  if (name == 'IMG') {
10916
10936
  return {name: name, index: findIndex(name, element)};
@@ -10930,7 +10950,7 @@ define("tinymce/dom/Selection", [
10930
10950
  rng.insertNode(dom.create('span', {'data-mce-type': "bookmark", id: id + '_start', style: styles}, chr));
10931
10951
  }
10932
10952
 
10933
- t.moveToBookmark({id: id, keep: 1});
10953
+ self.moveToBookmark({id: id, keep: 1});
10934
10954
 
10935
10955
  return {id: id};
10936
10956
  },
@@ -10951,7 +10971,7 @@ define("tinymce/dom/Selection", [
10951
10971
  * tinymce.activeEditor.selection.moveToBookmark(bm);
10952
10972
  */
10953
10973
  moveToBookmark: function(bookmark) {
10954
- var t = this, dom = t.dom, rng, root, startContainer, endContainer, startOffset, endOffset;
10974
+ var self = this, dom = self.dom, rng, root, startContainer, endContainer, startOffset, endOffset;
10955
10975
 
10956
10976
  function setEndPoint(start) {
10957
10977
  var point = bookmark[start ? 'start' : 'end'], i, node, offset, children;
@@ -11071,12 +11091,12 @@ define("tinymce/dom/Selection", [
11071
11091
  rng = dom.createRng();
11072
11092
  root = dom.getRoot();
11073
11093
 
11074
- if (t.tridentSel) {
11075
- return t.tridentSel.moveToBookmark(bookmark);
11094
+ if (self.tridentSel) {
11095
+ return self.tridentSel.moveToBookmark(bookmark);
11076
11096
  }
11077
11097
 
11078
11098
  if (setEndPoint(true) && setEndPoint()) {
11079
- t.setRng(rng);
11099
+ self.setRng(rng);
11080
11100
  }
11081
11101
  } else if (bookmark.id) {
11082
11102
  // Restore start/end points
@@ -11087,12 +11107,12 @@ define("tinymce/dom/Selection", [
11087
11107
  rng = dom.createRng();
11088
11108
  rng.setStart(addBogus(startContainer), startOffset);
11089
11109
  rng.setEnd(addBogus(endContainer), endOffset);
11090
- t.setRng(rng);
11110
+ self.setRng(rng);
11091
11111
  }
11092
11112
  } else if (bookmark.name) {
11093
- t.select(dom.select(bookmark.name)[bookmark.index]);
11113
+ self.select(dom.select(bookmark.name)[bookmark.index]);
11094
11114
  } else if (bookmark.rng) {
11095
- t.setRng(bookmark.rng);
11115
+ self.setRng(bookmark.rng);
11096
11116
  }
11097
11117
  }
11098
11118
  },
@@ -13063,7 +13083,8 @@ define("tinymce/Formatter", [
13063
13083
  }
13064
13084
  }
13065
13085
 
13066
- for (;;) {
13086
+ /*eslint no-constant-condition:0 */
13087
+ while (true) {
13067
13088
  // Stop expanding on block elements
13068
13089
  if (!format[0].block_expand && isBlock(parent)) {
13069
13090
  return parent;
@@ -14142,7 +14163,7 @@ define("tinymce/UndoManager", [
14142
14163
  ].join('|'), 'gi');
14143
14164
 
14144
14165
  return function(editor) {
14145
- var self, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, lock;
14166
+ var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, lock;
14146
14167
 
14147
14168
  // Returns a trimmed version of the current editor contents
14148
14169
  function getContent() {
@@ -16050,6 +16071,7 @@ define("tinymce/util/URI", [
16050
16071
  url = url.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something
16051
16072
 
16052
16073
  /*jshint maxlen: 255 */
16074
+ /*eslint max-len: 0 */
16053
16075
  url = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url);
16054
16076
 
16055
16077
  each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) {
@@ -16383,16 +16405,14 @@ define("tinymce/util/Class", [
16383
16405
 
16384
16406
  // Provides classical inheritance, based on code made by John Resig
16385
16407
  Class.extend = extendClass = function(prop) {
16386
- var Self = this, _super = Self.prototype, prototype, name, member;
16408
+ var self = this, _super = self.prototype, prototype, name, member;
16387
16409
 
16388
16410
  // The dummy class constructor
16389
16411
  function Class() {
16390
- var i, mixins, mixin, self;
16412
+ var i, mixins, mixin, self = this;
16391
16413
 
16392
16414
  // All construction is actually done in the init method
16393
16415
  if (!initializing) {
16394
- self = this;
16395
-
16396
16416
  // Run class constuctor
16397
16417
  if (self.init) {
16398
16418
  self.init.apply(self, arguments);
@@ -16434,7 +16454,7 @@ define("tinymce/util/Class", [
16434
16454
  // Instantiate a base class (but only create the instance,
16435
16455
  // don't run the init constructor)
16436
16456
  initializing = true;
16437
- prototype = new Self();
16457
+ prototype = new self();
16438
16458
  initializing = false;
16439
16459
 
16440
16460
  // Add mixins
@@ -16532,6 +16552,8 @@ define("tinymce/util/Class", [
16532
16552
  * Contributing: http://www.tinymce.com/contributing
16533
16553
  */
16534
16554
 
16555
+ /*eslint no-nested-ternary:0 */
16556
+
16535
16557
  /**
16536
16558
  * Selector engine, enables you to select controls by using CSS like expressions.
16537
16559
  * We currently only support basic CSS expressions to reduce the size of the core
@@ -16596,6 +16618,7 @@ define("tinymce/ui/Selector", [
16596
16618
  var expression = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i;
16597
16619
 
16598
16620
  /*jshint maxlen:255 */
16621
+ /*eslint max-len:0 */
16599
16622
  var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
16600
16623
  whiteSpace = /^\s*|\s*$/g,
16601
16624
  Collection;
@@ -17432,6 +17455,8 @@ define("tinymce/ui/DomUtils", [
17432
17455
  * Contributing: http://www.tinymce.com/contributing
17433
17456
  */
17434
17457
 
17458
+ /*eslint consistent-this:0 */
17459
+
17435
17460
  /**
17436
17461
  * This is the base class for all controls and containers. All UI control instances inherit
17437
17462
  * from this one as it has the base logic needed by all of them.
@@ -18143,10 +18168,10 @@ define("tinymce/ui/Control", [
18143
18168
  * @return {tinymce.ui.Collection} Collection with all parent controls.
18144
18169
  */
18145
18170
  parents: function(selector) {
18146
- var ctrl = this, parents = new Collection();
18171
+ var self = this, ctrl, parents = new Collection();
18147
18172
 
18148
18173
  // Add each parent to collection
18149
- for (ctrl = ctrl.parent(); ctrl; ctrl = ctrl.parent()) {
18174
+ for (ctrl = self.parent(); ctrl; ctrl = ctrl.parent()) {
18150
18175
  parents.add(ctrl);
18151
18176
  }
18152
18177
 
@@ -18791,10 +18816,10 @@ define("tinymce/ui/Control", [
18791
18816
  e.preventDefault();
18792
18817
 
18793
18818
  if (e.type == "mousewheel") {
18794
- e.deltaY = - 1/40 * e.wheelDelta;
18819
+ e.deltaY = -1 / 40 * e.wheelDelta;
18795
18820
 
18796
18821
  if (e.wheelDeltaX) {
18797
- e.deltaX = -1/40 * e.wheelDeltaX;
18822
+ e.deltaX = -1 / 40 * e.wheelDeltaX;
18798
18823
  }
18799
18824
  } else {
18800
18825
  e.deltaX = 0;
@@ -19862,7 +19887,7 @@ define("tinymce/ui/Container", [
19862
19887
 
19863
19888
  return (
19864
19889
  '<div id="' + self._id + '" class="' + self.classes() + '"' + (role ? ' role="' + this.settings.role + '"' : '') + '>' +
19865
- '<div id="' + self._id + '-body" class="' + self.classes('body') + '">'+
19890
+ '<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
19866
19891
  (self.settings.html || '') + layout.renderHtml(self) +
19867
19892
  '</div>' +
19868
19893
  '</div>'
@@ -19953,13 +19978,13 @@ define("tinymce/ui/Container", [
19953
19978
  * @return {tinymce.ui.Container} Current container instance.
19954
19979
  */
19955
19980
  reflow: function() {
19956
- var i, items;
19981
+ var i;
19957
19982
 
19958
19983
  if (this.visible()) {
19959
19984
  Control.repaintControls = [];
19960
19985
  Control.repaintControls.map = {};
19961
19986
 
19962
- items = this.recalc();
19987
+ this.recalc();
19963
19988
  i = Control.repaintControls.length;
19964
19989
 
19965
19990
  while (i--) {
@@ -21884,7 +21909,7 @@ define("tinymce/util/Quirks", [
21884
21909
  * fix seemed like a huge task. I hope we can remove this before the year 2030.
21885
21910
  */
21886
21911
  function cleanupStylesWhenDeleting() {
21887
- var doc = editor.getDoc();
21912
+ var doc = editor.getDoc(), urlPrefix = 'data:text/mce-internal,';
21888
21913
 
21889
21914
  if (!window.MutationObserver) {
21890
21915
  return;
@@ -21999,14 +22024,20 @@ define("tinymce/util/Quirks", [
21999
22024
  });
22000
22025
 
22001
22026
  editor.on('dragstart', function(e) {
22002
- e.dataTransfer.setData('mce-internal', editor.selection.getContent());
22027
+ // Safari doesn't support custom dataTransfer items so we can only use URL and Text
22028
+ e.dataTransfer.setData('URL', 'data:text/mce-internal,' + escape(editor.selection.getContent()));
22003
22029
  });
22004
22030
 
22005
22031
  editor.on('drop', function(e) {
22006
22032
  if (!isDefaultPrevented(e)) {
22007
- var internalContent = e.dataTransfer.getData('mce-internal');
22033
+ var internalContent = e.dataTransfer.getData('URL');
22008
22034
 
22009
- if (internalContent && doc.caretRangeFromPoint) {
22035
+ if (!internalContent || internalContent.indexOf(urlPrefix) == -1 || !doc.caretRangeFromPoint) {
22036
+ return;
22037
+ }
22038
+
22039
+ internalContent = unescape(internalContent.substr(urlPrefix.length));
22040
+ if (doc.caretRangeFromPoint) {
22010
22041
  e.preventDefault();
22011
22042
  customDelete();
22012
22043
  editor.selection.setRng(doc.caretRangeFromPoint(e.x, e.y));
@@ -22792,16 +22823,20 @@ define("tinymce/util/Quirks", [
22792
22823
 
22793
22824
  /**
22794
22825
  * IE 11 has a fantastic bug where it will produce two trailing BR elements to iframe bodies when
22795
- * the iframe is hidden by display: none. This workaround solves this by switching
22796
- * on designMode on the whole document.
22826
+ * the iframe is hidden by display: none on a parent container. The DOM is actually out of sync
22827
+ * with innerHTML in this case. It's like IE adds shadow DOM BR elements that appears on innerHTML
22828
+ * but not as the lastChild of the body. However is we add a BR element to the body then remove it
22829
+ * it doesn't seem to add these BR elements makes sence right?!
22797
22830
  *
22798
- * Example this: <body>text</body> becomes <body>text<br><br></body>
22831
+ * Example of what happens: <body>text</body> becomes <body>text<br><br></body>
22799
22832
  */
22800
22833
  function doubleTrailingBrElements() {
22801
22834
  if (!editor.inline) {
22802
- editor.on('init', function() {
22803
- editor.getDoc().designMode = 'on';
22804
- });
22835
+ editor.on('focus blur', function() {
22836
+ var br = editor.dom.create('br');
22837
+ editor.getBody().appendChild(br);
22838
+ br.parentNode.removeChild(br);
22839
+ }, true);
22805
22840
  }
22806
22841
  }
22807
22842
 
@@ -22913,6 +22948,10 @@ define("tinymce/util/Observable", [
22913
22948
  fire: function(name, args, bubble) {
22914
22949
  var self = this, handlers, i, l, callback, parent;
22915
22950
 
22951
+ if (self.removed) {
22952
+ return;
22953
+ }
22954
+
22916
22955
  name = name.toLowerCase();
22917
22956
  args = args || {};
22918
22957
  args.type = name;
@@ -22986,13 +23025,14 @@ define("tinymce/util/Observable", [
22986
23025
  * @method on
22987
23026
  * @param {String} name Event name or space separated list of events to bind.
22988
23027
  * @param {callback} callback Callback to be executed when the event occurs.
23028
+ * @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
22989
23029
  * @return {Object} Current class instance.
22990
23030
  * @example
22991
23031
  * instance.on('event', function(e) {
22992
23032
  * // Callback logic
22993
23033
  * });
22994
23034
  */
22995
- on: function(name, callback) {
23035
+ on: function(name, callback, prepend) {
22996
23036
  var self = this, bindings, handlers, names, i;
22997
23037
 
22998
23038
  if (callback === false) {
@@ -23020,7 +23060,11 @@ define("tinymce/util/Observable", [
23020
23060
  }
23021
23061
  }
23022
23062
 
23023
- handlers.push(callback);
23063
+ if (prepend) {
23064
+ handlers.unshift(callback);
23065
+ } else {
23066
+ handlers.push(callback);
23067
+ }
23024
23068
  }
23025
23069
  }
23026
23070
 
@@ -23693,7 +23737,7 @@ define("tinymce/Editor", [
23693
23737
  */
23694
23738
  init: function() {
23695
23739
  var self = this, settings = self.settings, elm = self.getElement();
23696
- var w, h, minHeight, n, o, url, bodyId, bodyClass, re, i, initializedPlugins = [];
23740
+ var w, h, minHeight, n, o, Theme, url, bodyId, bodyClass, re, i, initializedPlugins = [];
23697
23741
 
23698
23742
  self.rtl = this.editorManager.i18n.rtl;
23699
23743
  self.editorManager.add(self);
@@ -23712,8 +23756,8 @@ define("tinymce/Editor", [
23712
23756
  if (settings.theme) {
23713
23757
  if (typeof settings.theme != "function") {
23714
23758
  settings.theme = settings.theme.replace(/-/, '');
23715
- o = ThemeManager.get(settings.theme);
23716
- self.theme = new o(self, ThemeManager.urls[settings.theme]);
23759
+ Theme = ThemeManager.get(settings.theme);
23760
+ self.theme = new Theme(self, ThemeManager.urls[settings.theme]);
23717
23761
 
23718
23762
  if (self.theme.init) {
23719
23763
  self.theme.init(self, ThemeManager.urls[settings.theme] || self.documentBaseUrl.replace(/\/$/, ''));
@@ -23724,21 +23768,21 @@ define("tinymce/Editor", [
23724
23768
  }
23725
23769
 
23726
23770
  function initPlugin(plugin) {
23727
- var constr = PluginManager.get(plugin), url, pluginInstance;
23771
+ var Plugin = PluginManager.get(plugin), pluginUrl, pluginInstance;
23728
23772
 
23729
- url = PluginManager.urls[plugin] || self.documentBaseUrl.replace(/\/$/, '');
23773
+ pluginUrl = PluginManager.urls[plugin] || self.documentBaseUrl.replace(/\/$/, '');
23730
23774
  plugin = trim(plugin);
23731
- if (constr && inArray(initializedPlugins, plugin) === -1) {
23775
+ if (Plugin && inArray(initializedPlugins, plugin) === -1) {
23732
23776
  each(PluginManager.dependencies(plugin), function(dep){
23733
23777
  initPlugin(dep);
23734
23778
  });
23735
23779
 
23736
- pluginInstance = new constr(self, url);
23780
+ pluginInstance = new Plugin(self, pluginUrl);
23737
23781
 
23738
23782
  self.plugins[plugin] = pluginInstance;
23739
23783
 
23740
23784
  if (pluginInstance.init) {
23741
- pluginInstance.init(self, url);
23785
+ pluginInstance.init(self, pluginUrl);
23742
23786
  initializedPlugins.push(plugin);
23743
23787
  }
23744
23788
  }
@@ -23758,11 +23802,11 @@ define("tinymce/Editor", [
23758
23802
  re = /^[0-9\.]+(|px)$/i;
23759
23803
 
23760
23804
  if (re.test('' + w)) {
23761
- w = Math.max(parseInt(w, 10) + (o.deltaWidth || 0), 100);
23805
+ w = Math.max(parseInt(w, 10), 100);
23762
23806
  }
23763
23807
 
23764
23808
  if (re.test('' + h)) {
23765
- h = Math.max(parseInt(h, 10) + (o.deltaHeight || 0), minHeight);
23809
+ h = Math.max(parseInt(h, 10), minHeight);
23766
23810
  }
23767
23811
 
23768
23812
  // Render UI
@@ -23862,7 +23906,8 @@ define("tinymce/Editor", [
23862
23906
  self.iframeHTML += '</head><body id="' + bodyId + '" class="mce-content-body ' + bodyClass + '" ' +
23863
23907
  'onload="window.parent.tinymce.get(\'' + self.id + '\').fire(\'load\');"><br></body></html>';
23864
23908
 
23865
- var domainRelaxUrl = 'javascript:(function(){'+
23909
+ /*eslint no-script-url:0 */
23910
+ var domainRelaxUrl = 'javascript:(function(){' +
23866
23911
  'document.open();document.domain="' + document.domain + '";' +
23867
23912
  'var ed = window.parent.tinymce.get("' + self.id + '");document.write(ed.iframeHTML);' +
23868
23913
  'document.close();ed.initContentBody(true);})()';
@@ -23940,12 +23985,12 @@ define("tinymce/Editor", [
23940
23985
 
23941
23986
  if (settings.content_editable) {
23942
23987
  self.on('remove', function() {
23943
- var body = this.getBody();
23988
+ var bodyEl = this.getBody();
23944
23989
 
23945
- DOM.removeClass(body, 'mce-content-body');
23946
- DOM.removeClass(body, 'mce-edit-focus');
23947
- DOM.setAttrib(body, 'tabIndex', null);
23948
- DOM.setAttrib(body, 'contentEditable', null);
23990
+ DOM.removeClass(bodyEl, 'mce-content-body');
23991
+ DOM.removeClass(bodyEl, 'mce-edit-focus');
23992
+ DOM.setAttrib(bodyEl, 'tabIndex', null);
23993
+ DOM.setAttrib(bodyEl, 'contentEditable', null);
23949
23994
  });
23950
23995
 
23951
23996
  DOM.addClass(targetElm, 'mce-content-body');
@@ -24405,7 +24450,7 @@ define("tinymce/Editor", [
24405
24450
  var self = this, selection = self.selection, node, parents, root;
24406
24451
 
24407
24452
  // Fix for bug #1896577 it seems that this can not be fired while the editor is loading
24408
- if (self.initialized && !self.settings.disable_nodechange) {
24453
+ if (self.initialized && !self.settings.disable_nodechange && !self.settings.readonly) {
24409
24454
  // Get start node
24410
24455
  root = self.getBody();
24411
24456
  node = selection.getStart() || root;
@@ -24937,7 +24982,7 @@ define("tinymce/Editor", [
24937
24982
  // Padd with bogus BR elements on modern browsers and IE 7 and 8 since they don't render empty P tags properly
24938
24983
  content = ie && ie < 11 ? '' : '<br data-mce-bogus="1">';
24939
24984
  content = self.dom.createHTML(forcedRootBlockName, self.settings.forced_root_block_attrs, content);
24940
- } else if (!ie || ie < 11) {
24985
+ } else if (!ie) {
24941
24986
  // We need to add a BR when forced_root_block is disabled on non IE browsers to place the caret
24942
24987
  content = '<br data-mce-bogus="1">';
24943
24988
  }
@@ -25236,6 +25281,8 @@ define("tinymce/Editor", [
25236
25281
  var self = this;
25237
25282
 
25238
25283
  if (!self.removed) {
25284
+ self.fire('remove');
25285
+ self.off();
25239
25286
  self.removed = 1; // Cancels post remove event execution
25240
25287
 
25241
25288
  // Remove any hidden input
@@ -25243,12 +25290,6 @@ define("tinymce/Editor", [
25243
25290
  DOM.remove(self.getElement().nextSibling);
25244
25291
  }
25245
25292
 
25246
- // Fixed bug where IE has a blinking cursor left from the editor
25247
- var doc = self.getDoc();
25248
- if (ie && doc && !self.inline) {
25249
- doc.execCommand('SelectAll');
25250
- }
25251
-
25252
25293
  // We must save before we hide so Safari doesn't crash
25253
25294
  self.save();
25254
25295
 
@@ -25265,8 +25306,6 @@ define("tinymce/Editor", [
25265
25306
  Event.unbind(self.getBody());
25266
25307
  Event.unbind(elm);
25267
25308
 
25268
- self.fire('remove');
25269
-
25270
25309
  self.editorManager.remove(self);
25271
25310
  DOM.remove(elm);
25272
25311
  self.destroy();
@@ -25355,7 +25394,7 @@ define("tinymce/Editor", [
25355
25394
  DOM.unbind(form, 'submit reset', self.formEventDelegate);
25356
25395
  }
25357
25396
 
25358
- self.contentAreaContainer = self.formElement = self.container = null;
25397
+ self.contentAreaContainer = self.formElement = self.container = self.editorContainer = null;
25359
25398
  self.settings.content_element = self.bodyElement = self.contentDocument = self.contentWindow = null;
25360
25399
 
25361
25400
  if (self.selection) {
@@ -25508,6 +25547,8 @@ define("tinymce/FocusManager", [
25508
25547
  "tinymce/dom/DOMUtils",
25509
25548
  "tinymce/Env"
25510
25549
  ], function(DOMUtils, Env) {
25550
+ var selectionChangeHandler, documentFocusInHandler, DOM = DOMUtils.DOM;
25551
+
25511
25552
  /**
25512
25553
  * Constructs a new focus manager instance.
25513
25554
  *
@@ -25555,7 +25596,7 @@ define("tinymce/FocusManager", [
25555
25596
  }
25556
25597
 
25557
25598
  function isUIElement(elm) {
25558
- return !!DOMUtils.DOM.getParent(elm, FocusManager.isEditorUIElement);
25599
+ return !!DOM.getParent(elm, FocusManager.isEditorUIElement);
25559
25600
  }
25560
25601
 
25561
25602
  function isNodeInBodyOfEditor(node, editor) {
@@ -25571,7 +25612,7 @@ define("tinymce/FocusManager", [
25571
25612
  }
25572
25613
 
25573
25614
  function registerEvents(e) {
25574
- var editor = e.editor, selectionChangeHandler;
25615
+ var editor = e.editor;
25575
25616
 
25576
25617
  editor.on('init', function() {
25577
25618
  // On IE take selection snapshot onbeforedeactivate
@@ -25611,25 +25652,22 @@ define("tinymce/FocusManager", [
25611
25652
  });
25612
25653
 
25613
25654
  // Handles the issue with WebKit not retaining selection within inline document
25614
- // If the user releases the mouse out side the body while selecting a nodeChange won't
25615
- // fire and there for the selection snapshot won't be stored
25616
- // TODO: Optimize this since we only need to bind these on the active editor
25617
- if (Env.webkit) {
25655
+ // If the user releases the mouse out side the body since a mouse up event wont occur on the body
25656
+ if (Env.webkit && !selectionChangeHandler) {
25618
25657
  selectionChangeHandler = function() {
25619
- var rng = editor.selection.getRng();
25658
+ var activeEditor = editorManager.activeEditor;
25659
+
25660
+ if (activeEditor && activeEditor.selection) {
25661
+ var rng = activeEditor.selection.getRng();
25620
25662
 
25621
- // Store when it's non collapsed
25622
- if (!rng.collapsed) {
25623
- editor.lastRng = rng;
25663
+ // Store when it's non collapsed
25664
+ if (rng && !rng.collapsed) {
25665
+ editor.lastRng = rng;
25666
+ }
25624
25667
  }
25625
25668
  };
25626
25669
 
25627
- // Bind selection handler
25628
- DOMUtils.DOM.bind(document, 'selectionchange', selectionChangeHandler);
25629
-
25630
- editor.on('remove', function() {
25631
- DOMUtils.DOM.unbind(document, 'selectionchange', selectionChangeHandler);
25632
- });
25670
+ DOM.bind(document, 'selectionchange', selectionChangeHandler);
25633
25671
  }
25634
25672
  }
25635
25673
  });
@@ -25681,28 +25719,41 @@ define("tinymce/FocusManager", [
25681
25719
  }
25682
25720
  }, 0);
25683
25721
  });
25684
- }
25685
25722
 
25686
- // Check if focus is moved to an element outside the active editor by checking if the target node
25687
- // isn't within the body of the activeEditor nor a UI element such as a dialog child control
25688
- DOMUtils.DOM.bind(document, 'focusin', function(e) {
25689
- var activeEditor = editorManager.activeEditor;
25723
+ if (!documentFocusInHandler) {
25724
+ documentFocusInHandler = function(e) {
25725
+ var activeEditor = editorManager.activeEditor;
25690
25726
 
25691
- if (activeEditor && e.target.ownerDocument == document) {
25692
- // Check to make sure we have a valid selection
25693
- if (activeEditor.selection) {
25694
- activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.lastRng);
25695
- }
25727
+ if (activeEditor && e.target.ownerDocument == document) {
25728
+ // Check to make sure we have a valid selection
25729
+ if (activeEditor.selection) {
25730
+ activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.lastRng);
25731
+ }
25696
25732
 
25697
- // Fire a blur event if the element isn't a UI element
25698
- if (!isUIElement(e.target) && editorManager.focusedEditor == activeEditor) {
25699
- activeEditor.fire('blur', {focusedEditor: null});
25700
- editorManager.focusedEditor = null;
25701
- }
25733
+ // Fire a blur event if the element isn't a UI element
25734
+ if (!isUIElement(e.target) && editorManager.focusedEditor == activeEditor) {
25735
+ activeEditor.fire('blur', {focusedEditor: null});
25736
+ editorManager.focusedEditor = null;
25737
+ }
25738
+ }
25739
+ };
25740
+
25741
+ // Check if focus is moved to an element outside the active editor by checking if the target node
25742
+ // isn't within the body of the activeEditor nor a UI element such as a dialog child control
25743
+ DOM.bind(document, 'focusin', documentFocusInHandler);
25702
25744
  }
25703
- });
25745
+ }
25746
+
25747
+ function unregisterDocumentEvents() {
25748
+ if (!editorManager.activeEditor) {
25749
+ DOM.unbind(document, 'selectionchange', selectionChangeHandler);
25750
+ DOM.unbind(document, 'focusin', documentFocusInHandler);
25751
+ selectionChangeHandler = documentFocusInHandler = null;
25752
+ }
25753
+ }
25704
25754
 
25705
25755
  editorManager.on('AddEditor', registerEvents);
25756
+ editorManager.on('RemoveEditor', unregisterDocumentEvents);
25706
25757
  }
25707
25758
 
25708
25759
  /**
@@ -25770,7 +25821,7 @@ define("tinymce/EditorManager", [
25770
25821
  * @property minorVersion
25771
25822
  * @type String
25772
25823
  */
25773
- minorVersion : '0.18',
25824
+ minorVersion : '0.19',
25774
25825
 
25775
25826
  /**
25776
25827
  * Release date of TinyMCE build.
@@ -25778,7 +25829,7 @@ define("tinymce/EditorManager", [
25778
25829
  * @property releaseDate
25779
25830
  * @type String
25780
25831
  */
25781
- releaseDate: '2014-02-27',
25832
+ releaseDate: '2014-03-11',
25782
25833
 
25783
25834
  /**
25784
25835
  * Collection of editor instances.
@@ -26518,7 +26569,7 @@ define("tinymce/util/JSON", [], function() {
26518
26569
 
26519
26570
  if (t == 'object') {
26520
26571
  if (o.hasOwnProperty && Object.prototype.toString.call(o) === '[object Array]') {
26521
- for (i=0, v = '['; i<o.length; i++) {
26572
+ for (i = 0, v = '['; i < o.length; i++) {
26522
26573
  v += (i > 0 ? ',' : '') + serialize(o[i], quote);
26523
26574
  }
26524
26575
 
@@ -26530,7 +26581,7 @@ define("tinymce/util/JSON", [], function() {
26530
26581
  for (name in o) {
26531
26582
  if (o.hasOwnProperty(name)) {
26532
26583
  v += typeof o[name] != 'function' ? (v.length > 1 ? ',' + quote : quote) + name +
26533
- quote +':' + serialize(o[name], quote) : '';
26584
+ quote + ':' + serialize(o[name], quote) : '';
26534
26585
  }
26535
26586
  }
26536
26587
 
@@ -27658,8 +27709,8 @@ define("tinymce/ui/ButtonGroup", [
27658
27709
  layout.preRender(self);
27659
27710
 
27660
27711
  return (
27661
- '<div id="' + self._id + '" class="' + self.classes() + '">'+
27662
- '<div id="' + self._id + '-body">'+
27712
+ '<div id="' + self._id + '" class="' + self.classes() + '">' +
27713
+ '<div id="' + self._id + '-body">' +
27663
27714
  (self.settings.html || '') + layout.renderHtml(self) +
27664
27715
  '</div>' +
27665
27716
  '</div>'
@@ -27783,7 +27834,7 @@ define("tinymce/ui/Checkbox", [
27783
27834
  return (
27784
27835
  '<div id="' + id + '" class="' + self.classes() + '" unselectable="on" aria-labelledby="' + id + '-al" tabindex="-1">' +
27785
27836
  '<i class="' + prefix + 'ico ' + prefix + 'i-checkbox"></i>' +
27786
- '<span id="' + id +'-al" class="' + prefix + 'label">' + self.encode(self._text) + '</span>' +
27837
+ '<span id="' + id + '-al" class="' + prefix + 'label">' + self.encode(self._text) + '</span>' +
27787
27838
  '</div>'
27788
27839
  );
27789
27840
  }
@@ -28471,9 +28522,9 @@ define("tinymce/ui/Path", [
28471
28522
 
28472
28523
  for (i = 0, l = parts.length; i < l; i++) {
28473
28524
  html += (
28474
- (i > 0 ? '<div class="'+ prefix + 'divider" aria-hidden="true"> ' + self.settings.delimiter + ' </div>' : '') +
28525
+ (i > 0 ? '<div class="' + prefix + 'divider" aria-hidden="true"> ' + self.settings.delimiter + ' </div>' : '') +
28475
28526
  '<div role="button" class="' + prefix + 'path-item' + (i == l - 1 ? ' ' + prefix + 'last' : '') + '" data-index="' +
28476
- i + '" tabindex="-1" id="' + self._id + '-' + i +'" aria-level="' + i + '">' + parts[i].name + '</div>'
28527
+ i + '" tabindex="-1" id="' + self._id + '-' + i + '" aria-level="' + i + '">' + parts[i].name + '</div>'
28477
28528
  );
28478
28529
  }
28479
28530
 
@@ -28996,8 +29047,8 @@ define("tinymce/ui/FlexLayout", [
28996
29047
  // A ton of variables, needs to be in the same scope for performance
28997
29048
  var i, l, items, contLayoutRect, contPaddingBox, contSettings, align, pack, spacing, totalFlex, availableSpace, direction;
28998
29049
  var ctrl, ctrlLayoutRect, ctrlSettings, flex, maxSizeItems = [], size, maxSize, ratio, rect, pos, maxAlignEndPos;
28999
- var sizeName, minSizeName, posName, maxSizeName, beforeName, innerSizeName, afterName, deltaSizeName, contentSizeName;
29000
- var alignAxisName, alignInnerSizeName, alignSizeName, alignMinSizeName, alignMaxSizeName, alignBeforeName, alignAfterName;
29050
+ var sizeName, minSizeName, posName, maxSizeName, beforeName, innerSizeName, deltaSizeName, contentSizeName;
29051
+ var alignAxisName, alignInnerSizeName, alignSizeName, alignMinSizeName, alignBeforeName, alignAfterName;
29001
29052
  var alignDeltaSizeName, alignContentSizeName;
29002
29053
  var max = Math.max, min = Math.min;
29003
29054
 
@@ -29024,7 +29075,6 @@ define("tinymce/ui/FlexLayout", [
29024
29075
  maxSizeName = "maxH";
29025
29076
  innerSizeName = "innerH";
29026
29077
  beforeName = 'top';
29027
- afterName = 'bottom';
29028
29078
  deltaSizeName = "deltaH";
29029
29079
  contentSizeName = "contentH";
29030
29080
 
@@ -29033,7 +29083,6 @@ define("tinymce/ui/FlexLayout", [
29033
29083
  alignAxisName = "x";
29034
29084
  alignInnerSizeName = "innerW";
29035
29085
  alignMinSizeName = "minW";
29036
- alignMaxSizeName = "maxW";
29037
29086
  alignAfterName = "right";
29038
29087
  alignDeltaSizeName = "deltaW";
29039
29088
  alignContentSizeName = "contentW";
@@ -29044,7 +29093,6 @@ define("tinymce/ui/FlexLayout", [
29044
29093
  maxSizeName = "maxW";
29045
29094
  innerSizeName = "innerW";
29046
29095
  beforeName = 'left';
29047
- afterName = 'right';
29048
29096
  deltaSizeName = "deltaW";
29049
29097
  contentSizeName = "contentW";
29050
29098
 
@@ -29053,7 +29101,6 @@ define("tinymce/ui/FlexLayout", [
29053
29101
  alignAxisName = "y";
29054
29102
  alignInnerSizeName = "innerH";
29055
29103
  alignMinSizeName = "minH";
29056
- alignMaxSizeName = "maxH";
29057
29104
  alignAfterName = "bottom";
29058
29105
  alignDeltaSizeName = "deltaH";
29059
29106
  alignContentSizeName = "contentH";
@@ -29951,7 +29998,7 @@ define("tinymce/ui/GridLayout", [
29951
29998
  recalc: function(container) {
29952
29999
  var settings = container.settings, rows, cols, items, contLayoutRect, width, height, rect,
29953
30000
  ctrlLayoutRect, ctrl, x, y, posX, posY, ctrlSettings, contPaddingBox, align, spacingH, spacingV, alignH, alignV, maxX, maxY,
29954
- colWidths = [], rowHeights = [], ctrlMinWidth, ctrlMinHeight, alignX, alignY, availableWidth, availableHeight;
30001
+ colWidths = [], rowHeights = [], ctrlMinWidth, ctrlMinHeight, availableWidth, availableHeight;
29955
30002
 
29956
30003
  // Get layout settings
29957
30004
  settings = container.settings;
@@ -30101,7 +30148,6 @@ define("tinymce/ui/GridLayout", [
30101
30148
  ctrlSettings = ctrl.settings;
30102
30149
  ctrlLayoutRect = ctrl.layoutRect();
30103
30150
  width = Math.max(colWidths[x], ctrlLayoutRect.startMinWidth);
30104
- alignX = alignY = 0;
30105
30151
  ctrlLayoutRect.x = posX;
30106
30152
  ctrlLayoutRect.y = posY;
30107
30153
 
@@ -30346,7 +30392,7 @@ define("tinymce/ui/Label", [
30346
30392
  var self = this, forId = self.settings.forId;
30347
30393
 
30348
30394
  return (
30349
- '<label id="' + self._id + '" class="' + self.classes() + '"' + (forId ? ' for="' + forId +'"' : '') + '>' +
30395
+ '<label id="' + self._id + '" class="' + self.classes() + '"' + (forId ? ' for="' + forId + '"' : '') + '>' +
30350
30396
  self.encode(self._text) +
30351
30397
  '</label>'
30352
30398
  );
@@ -31664,7 +31710,7 @@ define("tinymce/ui/TabPanel", [
31664
31710
  ctrl.aria('labelledby', id);
31665
31711
 
31666
31712
  tabsHtml += (
31667
- '<div id="' + id + '" class="' + prefix + 'tab" '+
31713
+ '<div id="' + id + '" class="' + prefix + 'tab" ' +
31668
31714
  'unselectable="on" role="tab" aria-controls="' + ctrl._id + '" aria-selected="false" tabIndex="-1">' +
31669
31715
  self.encode(ctrl.settings.title) +
31670
31716
  '</div>'