diff options
Diffstat (limited to 'wp-includes/js/tinymce/themes/inlite/theme.js')
-rw-r--r-- | wp-includes/js/tinymce/themes/inlite/theme.js | 9792 |
1 files changed, 9792 insertions, 0 deletions
diff --git a/wp-includes/js/tinymce/themes/inlite/theme.js b/wp-includes/js/tinymce/themes/inlite/theme.js new file mode 100644 index 0000000..675db3f --- /dev/null +++ b/wp-includes/js/tinymce/themes/inlite/theme.js @@ -0,0 +1,9792 @@ +(function () { +var inlite = (function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.ThemeManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var flatten = function (arr) { + return arr.reduce(function (results, item) { + return Array.isArray(item) ? results.concat(flatten(item)) : results.concat(item); + }, []); + }; + var DeepFlatten = { flatten: flatten }; + + var result = function (id, rect) { + return { + id: id, + rect: rect + }; + }; + var match = function (editor, matchers) { + for (var i = 0; i < matchers.length; i++) { + var f = matchers[i]; + var result_1 = f(editor); + if (result_1) { + return result_1; + } + } + return null; + }; + var Matcher = { + match: match, + result: result + }; + + var fromClientRect = function (clientRect) { + return { + x: clientRect.left, + y: clientRect.top, + w: clientRect.width, + h: clientRect.height + }; + }; + var toClientRect = function (geomRect) { + return { + left: geomRect.x, + top: geomRect.y, + width: geomRect.w, + height: geomRect.h, + right: geomRect.x + geomRect.w, + bottom: geomRect.y + geomRect.h + }; + }; + var Convert = { + fromClientRect: fromClientRect, + toClientRect: toClientRect + }; + + var toAbsolute = function (rect) { + var vp = global$2.DOM.getViewPort(); + return { + x: rect.x + vp.x, + y: rect.y + vp.y, + w: rect.w, + h: rect.h + }; + }; + var measureElement = function (elm) { + var clientRect = elm.getBoundingClientRect(); + return toAbsolute({ + x: clientRect.left, + y: clientRect.top, + w: Math.max(elm.clientWidth, elm.offsetWidth), + h: Math.max(elm.clientHeight, elm.offsetHeight) + }); + }; + var getElementRect = function (editor, elm) { + return measureElement(elm); + }; + var getPageAreaRect = function (editor) { + return measureElement(editor.getElement().ownerDocument.body); + }; + var getContentAreaRect = function (editor) { + return measureElement(editor.getContentAreaContainer() || editor.getBody()); + }; + var getSelectionRect = function (editor) { + var clientRect = editor.selection.getBoundingClientRect(); + return clientRect ? toAbsolute(Convert.fromClientRect(clientRect)) : null; + }; + var Measure = { + getElementRect: getElementRect, + getPageAreaRect: getPageAreaRect, + getContentAreaRect: getContentAreaRect, + getSelectionRect: getSelectionRect + }; + + var element = function (element, predicateIds) { + return function (editor) { + for (var i = 0; i < predicateIds.length; i++) { + if (predicateIds[i].predicate(element)) { + var result = Matcher.result(predicateIds[i].id, Measure.getElementRect(editor, element)); + return result; + } + } + return null; + }; + }; + var parent = function (elements, predicateIds) { + return function (editor) { + for (var i = 0; i < elements.length; i++) { + for (var x = 0; x < predicateIds.length; x++) { + if (predicateIds[x].predicate(elements[i])) { + return Matcher.result(predicateIds[x].id, Measure.getElementRect(editor, elements[i])); + } + } + } + return null; + }; + }; + var ElementMatcher = { + element: element, + parent: parent + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var create = function (id, predicate) { + return { + id: id, + predicate: predicate + }; + }; + var fromContextToolbars = function (toolbars) { + return global$4.map(toolbars, function (toolbar) { + return create(toolbar.id, toolbar.predicate); + }); + }; + var PredicateId = { + create: create, + fromContextToolbars: fromContextToolbars + }; + + var textSelection = function (id) { + return function (editor) { + if (!editor.selection.isCollapsed()) { + var result = Matcher.result(id, Measure.getSelectionRect(editor)); + return result; + } + return null; + }; + }; + var emptyTextBlock = function (elements, id) { + return function (editor) { + var i; + var textBlockElementsMap = editor.schema.getTextBlockElements(); + for (i = 0; i < elements.length; i++) { + if (elements[i].nodeName === 'TABLE') { + return null; + } + } + for (i = 0; i < elements.length; i++) { + if (elements[i].nodeName in textBlockElementsMap) { + if (editor.dom.isEmpty(elements[i])) { + return Matcher.result(id, Measure.getSelectionRect(editor)); + } + return null; + } + } + return null; + }; + }; + var SelectionMatcher = { + textSelection: textSelection, + emptyTextBlock: emptyTextBlock + }; + + var fireSkinLoaded = function (editor) { + editor.fire('SkinLoaded'); + }; + var fireBeforeRenderUI = function (editor) { + return editor.fire('BeforeRenderUI'); + }; + var Events = { + fireSkinLoaded: fireSkinLoaded, + fireBeforeRenderUI: fireBeforeRenderUI + }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var isType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isArray = function (value) { + return Array.isArray(value); + }; + var isNull = function (value) { + return value === null; + }; + var isObject = function (predicate) { + return function (value) { + return !isNull(value) && !isArray(value) && predicate(value); + }; + }; + var isString = function (value) { + return isType('string')(value); + }; + var isNumber = function (value) { + return isType('number')(value); + }; + var isFunction = function (value) { + return isType('function')(value); + }; + var isBoolean = function (value) { + return isType('boolean')(value); + }; + var Type = { + isString: isString, + isNumber: isNumber, + isBoolean: isBoolean, + isFunction: isFunction, + isObject: isObject(isType('object')), + isNull: isNull, + isArray: isArray + }; + + var validDefaultOrDie = function (value, predicate) { + if (predicate(value)) { + return true; + } + throw new Error('Default value doesn\'t match requested type.'); + }; + var getByTypeOr = function (predicate) { + return function (editor, name, defaultValue) { + var settings = editor.settings; + validDefaultOrDie(defaultValue, predicate); + return name in settings && predicate(settings[name]) ? settings[name] : defaultValue; + }; + }; + var splitNoEmpty = function (str, delim) { + return str.split(delim).filter(function (item) { + return item.length > 0; + }); + }; + var itemsToArray = function (value, defaultValue) { + var stringToItemsArray = function (value) { + return typeof value === 'string' ? splitNoEmpty(value, /[ ,]/) : value; + }; + var boolToItemsArray = function (value, defaultValue) { + return value === false ? [] : defaultValue; + }; + if (Type.isArray(value)) { + return value; + } else if (Type.isString(value)) { + return stringToItemsArray(value); + } else if (Type.isBoolean(value)) { + return boolToItemsArray(value, defaultValue); + } + return defaultValue; + }; + var getToolbarItemsOr = function (predicate) { + return function (editor, name, defaultValue) { + var value = name in editor.settings ? editor.settings[name] : defaultValue; + validDefaultOrDie(defaultValue, predicate); + return itemsToArray(value, defaultValue); + }; + }; + var EditorSettings = { + getStringOr: getByTypeOr(Type.isString), + getBoolOr: getByTypeOr(Type.isBoolean), + getNumberOr: getByTypeOr(Type.isNumber), + getHandlerOr: getByTypeOr(Type.isFunction), + getToolbarItemsOr: getToolbarItemsOr(Type.isArray) + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.geom.Rect'); + + var result$1 = function (rect, position) { + return { + rect: rect, + position: position + }; + }; + var moveTo = function (rect, toRect) { + return { + x: toRect.x, + y: toRect.y, + w: rect.w, + h: rect.h + }; + }; + var calcByPositions = function (testPositions1, testPositions2, targetRect, contentAreaRect, panelRect) { + var relPos, relRect, outputPanelRect; + var paddedContentRect = { + x: contentAreaRect.x, + y: contentAreaRect.y, + w: contentAreaRect.w + (contentAreaRect.w < panelRect.w + targetRect.w ? panelRect.w : 0), + h: contentAreaRect.h + (contentAreaRect.h < panelRect.h + targetRect.h ? panelRect.h : 0) + }; + relPos = global$6.findBestRelativePosition(panelRect, targetRect, paddedContentRect, testPositions1); + targetRect = global$6.clamp(targetRect, paddedContentRect); + if (relPos) { + relRect = global$6.relativePosition(panelRect, targetRect, relPos); + outputPanelRect = moveTo(panelRect, relRect); + return result$1(outputPanelRect, relPos); + } + targetRect = global$6.intersect(paddedContentRect, targetRect); + if (targetRect) { + relPos = global$6.findBestRelativePosition(panelRect, targetRect, paddedContentRect, testPositions2); + if (relPos) { + relRect = global$6.relativePosition(panelRect, targetRect, relPos); + outputPanelRect = moveTo(panelRect, relRect); + return result$1(outputPanelRect, relPos); + } + outputPanelRect = moveTo(panelRect, targetRect); + return result$1(outputPanelRect, relPos); + } + return null; + }; + var calcInsert = function (targetRect, contentAreaRect, panelRect) { + return calcByPositions([ + 'cr-cl', + 'cl-cr' + ], [ + 'bc-tc', + 'bl-tl', + 'br-tr' + ], targetRect, contentAreaRect, panelRect); + }; + var calc = function (targetRect, contentAreaRect, panelRect) { + return calcByPositions([ + 'tc-bc', + 'bc-tc', + 'tl-bl', + 'bl-tl', + 'tr-br', + 'br-tr', + 'cr-cl', + 'cl-cr' + ], [ + 'bc-tc', + 'bl-tl', + 'br-tr', + 'cr-cl' + ], targetRect, contentAreaRect, panelRect); + }; + var userConstrain = function (handler, targetRect, contentAreaRect, panelRect) { + var userConstrainedPanelRect; + if (typeof handler === 'function') { + userConstrainedPanelRect = handler({ + elementRect: Convert.toClientRect(targetRect), + contentAreaRect: Convert.toClientRect(contentAreaRect), + panelRect: Convert.toClientRect(panelRect) + }); + return Convert.fromClientRect(userConstrainedPanelRect); + } + return panelRect; + }; + var defaultHandler = function (rects) { + return rects.panelRect; + }; + var Layout = { + calcInsert: calcInsert, + calc: calc, + userConstrain: userConstrain, + defaultHandler: defaultHandler + }; + + var toAbsoluteUrl = function (editor, url) { + return editor.documentBaseURI.toAbsolute(url); + }; + var urlFromName = function (name) { + var prefix = global$5.baseURL + '/skins/'; + return name ? prefix + name : prefix + 'lightgray'; + }; + var getTextSelectionToolbarItems = function (editor) { + return EditorSettings.getToolbarItemsOr(editor, 'selection_toolbar', [ + 'bold', + 'italic', + '|', + 'quicklink', + 'h2', + 'h3', + 'blockquote' + ]); + }; + var getInsertToolbarItems = function (editor) { + return EditorSettings.getToolbarItemsOr(editor, 'insert_toolbar', [ + 'quickimage', + 'quicktable' + ]); + }; + var getPositionHandler = function (editor) { + return EditorSettings.getHandlerOr(editor, 'inline_toolbar_position_handler', Layout.defaultHandler); + }; + var getSkinUrl = function (editor) { + var settings = editor.settings; + return settings.skin_url ? toAbsoluteUrl(editor, settings.skin_url) : urlFromName(settings.skin); + }; + var isSkinDisabled = function (editor) { + return editor.settings.skin === false; + }; + var Settings = { + getTextSelectionToolbarItems: getTextSelectionToolbarItems, + getInsertToolbarItems: getInsertToolbarItems, + getPositionHandler: getPositionHandler, + getSkinUrl: getSkinUrl, + isSkinDisabled: isSkinDisabled + }; + + var fireSkinLoaded$1 = function (editor, callback) { + var done = function () { + editor._skinLoaded = true; + Events.fireSkinLoaded(editor); + callback(); + }; + if (editor.initialized) { + done(); + } else { + editor.on('init', done); + } + }; + var load = function (editor, callback) { + var skinUrl = Settings.getSkinUrl(editor); + var done = function () { + fireSkinLoaded$1(editor, callback); + }; + if (Settings.isSkinDisabled(editor)) { + done(); + } else { + global$2.DOM.styleSheetLoader.load(skinUrl + '/skin.min.css', done); + editor.contentCSS.push(skinUrl + '/content.inline.min.css'); + } + }; + var SkinLoader = { load: load }; + + var getSelectionElements = function (editor) { + var node = editor.selection.getNode(); + var elms = editor.dom.getParents(node, '*'); + return elms; + }; + var createToolbar = function (editor, selector, id, items) { + var selectorPredicate = function (elm) { + return editor.dom.is(elm, selector); + }; + return { + predicate: selectorPredicate, + id: id, + items: items + }; + }; + var getToolbars = function (editor) { + var contextToolbars = editor.contextToolbars; + return DeepFlatten.flatten([ + contextToolbars ? contextToolbars : [], + createToolbar(editor, 'img', 'image', 'alignleft aligncenter alignright') + ]); + }; + var findMatchResult = function (editor, toolbars) { + var result, elements, contextToolbarsPredicateIds; + elements = getSelectionElements(editor); + contextToolbarsPredicateIds = PredicateId.fromContextToolbars(toolbars); + result = Matcher.match(editor, [ + ElementMatcher.element(elements[0], contextToolbarsPredicateIds), + SelectionMatcher.textSelection('text'), + SelectionMatcher.emptyTextBlock(elements, 'insert'), + ElementMatcher.parent(elements, contextToolbarsPredicateIds) + ]); + return result && result.rect ? result : null; + }; + var editorHasFocus = function (editor) { + return domGlobals.document.activeElement === editor.getBody(); + }; + var togglePanel = function (editor, panel) { + var toggle = function () { + var toolbars = getToolbars(editor); + var result = findMatchResult(editor, toolbars); + if (result) { + panel.show(editor, result.id, result.rect, toolbars); + } else { + panel.hide(); + } + }; + return function () { + if (!editor.removed && editorHasFocus(editor)) { + toggle(); + } + }; + }; + var repositionPanel = function (editor, panel) { + return function () { + var toolbars = getToolbars(editor); + var result = findMatchResult(editor, toolbars); + if (result) { + panel.reposition(editor, result.id, result.rect); + } + }; + }; + var ignoreWhenFormIsVisible = function (editor, panel, f) { + return function () { + if (!editor.removed && !panel.inForm()) { + f(); + } + }; + }; + var bindContextualToolbarsEvents = function (editor, panel) { + var throttledTogglePanel = global$3.throttle(togglePanel(editor, panel), 0); + var throttledTogglePanelWhenNotInForm = global$3.throttle(ignoreWhenFormIsVisible(editor, panel, togglePanel(editor, panel)), 0); + var reposition = repositionPanel(editor, panel); + editor.on('blur hide ObjectResizeStart', panel.hide); + editor.on('click', throttledTogglePanel); + editor.on('nodeChange mouseup', throttledTogglePanelWhenNotInForm); + editor.on('ResizeEditor keyup', throttledTogglePanel); + editor.on('ResizeWindow', reposition); + global$2.DOM.bind(global$1.container, 'scroll', reposition); + editor.on('remove', function () { + global$2.DOM.unbind(global$1.container, 'scroll', reposition); + panel.remove(); + }); + editor.shortcuts.add('Alt+F10,F10', '', panel.focus); + }; + var overrideLinkShortcut = function (editor, panel) { + editor.shortcuts.remove('meta+k'); + editor.shortcuts.add('meta+k', '', function () { + var toolbars = getToolbars(editor); + var result = Matcher.match(editor, [SelectionMatcher.textSelection('quicklink')]); + if (result) { + panel.show(editor, result.id, result.rect, toolbars); + } + }); + }; + var renderInlineUI = function (editor, panel) { + SkinLoader.load(editor, function () { + bindContextualToolbarsEvents(editor, panel); + overrideLinkShortcut(editor, panel); + }); + return {}; + }; + var fail = function (message) { + throw new Error(message); + }; + var renderUI = function (editor, panel) { + return editor.inline ? renderInlineUI(editor, panel) : fail('inlite theme only supports inline mode.'); + }; + var Render = { renderUI: renderUI }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + if (Object.freeze) { + Object.freeze(me); + } + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + if (x === null) { + return 'null'; + } + var t = typeof x; + if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } + if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } + return t; + }; + var isType$1 = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray$1 = isType$1('array'); + var isFunction$1 = isType$1('function'); + var isNumber$1 = isType$1('number'); + + var nativeSlice = Array.prototype.slice; + var nativeIndexOf = Array.prototype.indexOf; + var nativePush = Array.prototype.push; + var rawIndexOf = function (ts, t) { + return nativeIndexOf.call(ts, t); + }; + var indexOf = function (xs, x) { + var r = rawIndexOf(xs, x); + return r === -1 ? Option.none() : Option.some(r); + }; + var exists = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return true; + } + } + return false; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var find = function (xs, pred) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } + } + return Option.none(); + }; + var flatten$1 = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray$1(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var from$1 = isFunction$1(Array.from) ? Array.from : function (x) { + return nativeSlice.call(x); + }; + + var count = 0; + var funcs = { + id: function () { + return 'mceu_' + count++; + }, + create: function (name, attrs, children) { + var elm = domGlobals.document.createElement(name); + global$2.DOM.setAttribs(elm, attrs); + if (typeof children === 'string') { + elm.innerHTML = children; + } else { + global$4.each(children, function (child) { + if (child.nodeType) { + elm.appendChild(child); + } + }); + } + return elm; + }, + createFragment: function (html) { + return global$2.DOM.createFragment(html); + }, + getWindowSize: function () { + return global$2.DOM.getViewPort(); + }, + getSize: function (elm) { + var width, height; + if (elm.getBoundingClientRect) { + var rect = elm.getBoundingClientRect(); + width = Math.max(rect.width || rect.right - rect.left, elm.offsetWidth); + height = Math.max(rect.height || rect.bottom - rect.bottom, elm.offsetHeight); + } else { + width = elm.offsetWidth; + height = elm.offsetHeight; + } + return { + width: width, + height: height + }; + }, + getPos: function (elm, root) { + return global$2.DOM.getPos(elm, root || funcs.getContainer()); + }, + getContainer: function () { + return global$1.container ? global$1.container : domGlobals.document.body; + }, + getViewPort: function (win) { + return global$2.DOM.getViewPort(win); + }, + get: function (id) { + return domGlobals.document.getElementById(id); + }, + addClass: function (elm, cls) { + return global$2.DOM.addClass(elm, cls); + }, + removeClass: function (elm, cls) { + return global$2.DOM.removeClass(elm, cls); + }, + hasClass: function (elm, cls) { + return global$2.DOM.hasClass(elm, cls); + }, + toggleClass: function (elm, cls, state) { + return global$2.DOM.toggleClass(elm, cls, state); + }, + css: function (elm, name, value) { + return global$2.DOM.setStyle(elm, name, value); + }, + getRuntimeStyle: function (elm, name) { + return global$2.DOM.getStyle(elm, name, true); + }, + on: function (target, name, callback, scope) { + return global$2.DOM.bind(target, name, callback, scope); + }, + off: function (target, name, callback) { + return global$2.DOM.unbind(target, name, callback); + }, + fire: function (target, name, args) { + return global$2.DOM.fire(target, name, args); + }, + innerHtml: function (elm, html) { + global$2.DOM.setHTML(elm, html); + } + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.util.Class'); + + var global$9 = tinymce.util.Tools.resolve('tinymce.util.EventDispatcher'); + + var BoxUtils = { + parseBox: function (value) { + var len; + var radix = 10; + if (!value) { + return; + } + if (typeof value === 'number') { + value = value || 0; + return { + top: value, + left: value, + bottom: value, + right: value + }; + } + value = value.split(' '); + len = value.length; + if (len === 1) { + value[1] = value[2] = value[3] = value[0]; + } else if (len === 2) { + value[2] = value[0]; + value[3] = value[1]; + } else if (len === 3) { + value[3] = value[1]; + } + return { + top: parseInt(value[0], radix) || 0, + right: parseInt(value[1], radix) || 0, + bottom: parseInt(value[2], radix) || 0, + left: parseInt(value[3], radix) || 0 + }; + }, + measureBox: function (elm, prefix) { + function getStyle(name) { + var defaultView = elm.ownerDocument.defaultView; + if (defaultView) { + var computedStyle = defaultView.getComputedStyle(elm, null); + if (computedStyle) { + name = name.replace(/[A-Z]/g, function (a) { + return '-' + a; + }); + return computedStyle.getPropertyValue(name); + } else { + return null; + } + } + return elm.currentStyle[name]; + } + function getSide(name) { + var val = parseFloat(getStyle(name)); + return isNaN(val) ? 0 : val; + } + return { + top: getSide(prefix + 'TopWidth'), + right: getSide(prefix + 'RightWidth'), + bottom: getSide(prefix + 'BottomWidth'), + left: getSide(prefix + 'LeftWidth') + }; + } + }; + + function noop$1() { + } + function ClassList(onchange) { + this.cls = []; + this.cls._map = {}; + this.onchange = onchange || noop$1; + this.prefix = ''; + } + global$4.extend(ClassList.prototype, { + add: function (cls) { + if (cls && !this.contains(cls)) { + this.cls._map[cls] = true; + this.cls.push(cls); + this._change(); + } + return this; + }, + remove: function (cls) { + if (this.contains(cls)) { + var i = void 0; + for (i = 0; i < this.cls.length; i++) { + if (this.cls[i] === cls) { + break; + } + } + this.cls.splice(i, 1); + delete this.cls._map[cls]; + this._change(); + } + return this; + }, + toggle: function (cls, state) { + var curState = this.contains(cls); + if (curState !== state) { + if (curState) { + this.remove(cls); + } else { + this.add(cls); + } + this._change(); + } + return this; + }, + contains: function (cls) { + return !!this.cls._map[cls]; + }, + _change: function () { + delete this.clsValue; + this.onchange.call(this); + } + }); + ClassList.prototype.toString = function () { + var value; + if (this.clsValue) { + return this.clsValue; + } + value = ''; + for (var i = 0; i < this.cls.length; i++) { + if (i > 0) { + value += ' '; + } + value += this.prefix + this.cls[i]; + } + return value; + }; + + function unique(array) { + var uniqueItems = []; + var i = array.length, item; + while (i--) { + item = array[i]; + if (!item.__checked) { + uniqueItems.push(item); + item.__checked = 1; + } + } + i = uniqueItems.length; + while (i--) { + delete uniqueItems[i].__checked; + } + return uniqueItems; + } + var expression = /^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i; + var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g; + var whiteSpace = /^\s*|\s*$/g; + var Collection; + var Selector = global$8.extend({ + init: function (selector) { + var match = this.match; + function compileNameFilter(name) { + if (name) { + name = name.toLowerCase(); + return function (item) { + return name === '*' || item.type === name; + }; + } + } + function compileIdFilter(id) { + if (id) { + return function (item) { + return item._name === id; + }; + } + } + function compileClassesFilter(classes) { + if (classes) { + classes = classes.split('.'); + return function (item) { + var i = classes.length; + while (i--) { + if (!item.classes.contains(classes[i])) { + return false; + } + } + return true; + }; + } + } + function compileAttrFilter(name, cmp, check) { + if (name) { + return function (item) { + var value = item[name] ? item[name]() : ''; + return !cmp ? !!check : cmp === '=' ? value === check : cmp === '*=' ? value.indexOf(check) >= 0 : cmp === '~=' ? (' ' + value + ' ').indexOf(' ' + check + ' ') >= 0 : cmp === '!=' ? value !== check : cmp === '^=' ? value.indexOf(check) === 0 : cmp === '$=' ? value.substr(value.length - check.length) === check : false; + }; + } + } + function compilePsuedoFilter(name) { + var notSelectors; + if (name) { + name = /(?:not\((.+)\))|(.+)/i.exec(name); + if (!name[1]) { + name = name[2]; + return function (item, index, length) { + return name === 'first' ? index === 0 : name === 'last' ? index === length - 1 : name === 'even' ? index % 2 === 0 : name === 'odd' ? index % 2 === 1 : item[name] ? item[name]() : false; + }; + } + notSelectors = parseChunks(name[1], []); + return function (item) { + return !match(item, notSelectors); + }; + } + } + function compile(selector, filters, direct) { + var parts; + function add(filter) { + if (filter) { + filters.push(filter); + } + } + parts = expression.exec(selector.replace(whiteSpace, '')); + add(compileNameFilter(parts[1])); + add(compileIdFilter(parts[2])); + add(compileClassesFilter(parts[3])); + add(compileAttrFilter(parts[4], parts[5], parts[6])); + add(compilePsuedoFilter(parts[7])); + filters.pseudo = !!parts[7]; + filters.direct = direct; + return filters; + } + function parseChunks(selector, selectors) { + var parts = []; + var extra, matches, i; + do { + chunker.exec(''); + matches = chunker.exec(selector); + if (matches) { + selector = matches[3]; + parts.push(matches[1]); + if (matches[2]) { + extra = matches[3]; + break; + } + } + } while (matches); + if (extra) { + parseChunks(extra, selectors); + } + selector = []; + for (i = 0; i < parts.length; i++) { + if (parts[i] !== '>') { + selector.push(compile(parts[i], [], parts[i - 1] === '>')); + } + } + selectors.push(selector); + return selectors; + } + this._selectors = parseChunks(selector, []); + }, + match: function (control, selectors) { + var i, l, si, sl, selector, fi, fl, filters, index, length, siblings, count, item; + selectors = selectors || this._selectors; + for (i = 0, l = selectors.length; i < l; i++) { + selector = selectors[i]; + sl = selector.length; + item = control; + count = 0; + for (si = sl - 1; si >= 0; si--) { + filters = selector[si]; + while (item) { + if (filters.pseudo) { + siblings = item.parent().items(); + index = length = siblings.length; + while (index--) { + if (siblings[index] === item) { + break; + } + } + } + for (fi = 0, fl = filters.length; fi < fl; fi++) { + if (!filters[fi](item, index, length)) { + fi = fl + 1; + break; + } + } + if (fi === fl) { + count++; + break; + } else { + if (si === sl - 1) { + break; + } + } + item = item.parent(); + } + } + if (count === sl) { + return true; + } + } + return false; + }, + find: function (container) { + var matches = [], i, l; + var selectors = this._selectors; + function collect(items, selector, index) { + var i, l, fi, fl, item; + var filters = selector[index]; + for (i = 0, l = items.length; i < l; i++) { + item = items[i]; + for (fi = 0, fl = filters.length; fi < fl; fi++) { + if (!filters[fi](item, i, l)) { + fi = fl + 1; + break; + } + } + if (fi === fl) { + if (index === selector.length - 1) { + matches.push(item); + } else { + if (item.items) { + collect(item.items(), selector, index + 1); + } + } + } else if (filters.direct) { + return; + } + if (item.items) { + collect(item.items(), selector, index); + } + } + } + if (container.items) { + for (i = 0, l = selectors.length; i < l; i++) { + collect(container.items(), selectors[i], 0); + } + if (l > 1) { + matches = unique(matches); + } + } + if (!Collection) { + Collection = Selector.Collection; + } + return new Collection(matches); + } + }); + + var Collection$1, proto; + var push = Array.prototype.push, slice = Array.prototype.slice; + proto = { + length: 0, + init: function (items) { + if (items) { + this.add(items); + } + }, + add: function (items) { + var self = this; + if (!global$4.isArray(items)) { + if (items instanceof Collection$1) { + self.add(items.toArray()); + } else { + push.call(self, items); + } + } else { + push.apply(self, items); + } + return self; + }, + set: function (items) { + var self = this; + var len = self.length; + var i; + self.length = 0; + self.add(items); + for (i = self.length; i < len; i++) { + delete self[i]; + } + return self; + }, + filter: function (selector) { + var self = this; + var i, l; + var matches = []; + var item, match; + if (typeof selector === 'string') { + selector = new Selector(selector); + match = function (item) { + return selector.match(item); + }; + } else { + match = selector; + } + for (i = 0, l = self.length; i < l; i++) { + item = self[i]; + if (match(item)) { + matches.push(item); + } + } + return new Collection$1(matches); + }, + slice: function () { + return new Collection$1(slice.apply(this, arguments)); + }, + eq: function (index) { + return index === -1 ? this.slice(index) : this.slice(index, +index + 1); + }, + each: function (callback) { + global$4.each(this, callback); + return this; + }, + toArray: function () { + return global$4.toArray(this); + }, + indexOf: function (ctrl) { + var self = this; + var i = self.length; + while (i--) { + if (self[i] === ctrl) { + break; + } + } + return i; + }, + reverse: function () { + return new Collection$1(global$4.toArray(this).reverse()); + }, + hasClass: function (cls) { + return this[0] ? this[0].classes.contains(cls) : false; + }, + prop: function (name, value) { + var self = this; + var item; + if (value !== undefined) { + self.each(function (item) { + if (item[name]) { + item[name](value); + } + }); + return self; + } + item = self[0]; + if (item && item[name]) { + return item[name](); + } + }, + exec: function (name) { + var self = this, args = global$4.toArray(arguments).slice(1); + self.each(function (item) { + if (item[name]) { + item[name].apply(item, args); + } + }); + return self; + }, + remove: function () { + var i = this.length; + while (i--) { + this[i].remove(); + } + return this; + }, + addClass: function (cls) { + return this.each(function (item) { + item.classes.add(cls); + }); + }, + removeClass: function (cls) { + return this.each(function (item) { + item.classes.remove(cls); + }); + } + }; + global$4.each('fire on off show hide append prepend before after reflow'.split(' '), function (name) { + proto[name] = function () { + var args = global$4.toArray(arguments); + this.each(function (ctrl) { + if (name in ctrl) { + ctrl[name].apply(ctrl, args); + } + }); + return this; + }; + }); + global$4.each('text name disabled active selected checked visible parent value data'.split(' '), function (name) { + proto[name] = function (value) { + return this.prop(name, value); + }; + }); + Collection$1 = global$8.extend(proto); + Selector.Collection = Collection$1; + var Collection$2 = Collection$1; + + var Binding = function (settings) { + this.create = settings.create; + }; + Binding.create = function (model, name) { + return new Binding({ + create: function (otherModel, otherName) { + var bindings; + var fromSelfToOther = function (e) { + otherModel.set(otherName, e.value); + }; + var fromOtherToSelf = function (e) { + model.set(name, e.value); + }; + otherModel.on('change:' + otherName, fromOtherToSelf); + model.on('change:' + name, fromSelfToOther); + bindings = otherModel._bindings; + if (!bindings) { + bindings = otherModel._bindings = []; + otherModel.on('destroy', function () { + var i = bindings.length; + while (i--) { + bindings[i](); + } + }); + } + bindings.push(function () { + model.off('change:' + name, fromSelfToOther); + }); + return model.get(name); + } + }); + }; + + var global$a = tinymce.util.Tools.resolve('tinymce.util.Observable'); + + function isNode(node) { + return node.nodeType > 0; + } + function isEqual(a, b) { + var k, checked; + if (a === b) { + return true; + } + if (a === null || b === null) { + return a === b; + } + if (typeof a !== 'object' || typeof b !== 'object') { + return a === b; + } + if (global$4.isArray(b)) { + if (a.length !== b.length) { + return false; + } + k = a.length; + while (k--) { + if (!isEqual(a[k], b[k])) { + return false; + } + } + } + if (isNode(a) || isNode(b)) { + return a === b; + } + checked = {}; + for (k in b) { + if (!isEqual(a[k], b[k])) { + return false; + } + checked[k] = true; + } + for (k in a) { + if (!checked[k] && !isEqual(a[k], b[k])) { + return false; + } + } + return true; + } + var ObservableObject = global$8.extend({ + Mixins: [global$a], + init: function (data) { + var name, value; + data = data || {}; + for (name in data) { + value = data[name]; + if (value instanceof Binding) { + data[name] = value.create(this, name); + } + } + this.data = data; + }, + set: function (name, value) { + var key, args; + var oldValue = this.data[name]; + if (value instanceof Binding) { + value = value.create(this, name); + } + if (typeof name === 'object') { + for (key in name) { + this.set(key, name[key]); + } + return this; + } + if (!isEqual(oldValue, value)) { + this.data[name] = value; + args = { + target: this, + name: name, + value: value, + oldValue: oldValue + }; + this.fire('change:' + name, args); + this.fire('change', args); + } + return this; + }, + get: function (name) { + return this.data[name]; + }, + has: function (name) { + return name in this.data; + }, + bind: function (name) { + return Binding.create(this, name); + }, + destroy: function () { + this.fire('destroy'); + } + }); + + var dirtyCtrls = {}, animationFrameRequested; + var ReflowQueue = { + add: function (ctrl) { + var parent = ctrl.parent(); + if (parent) { + if (!parent._layout || parent._layout.isNative()) { + return; + } + if (!dirtyCtrls[parent._id]) { + dirtyCtrls[parent._id] = parent; + } + if (!animationFrameRequested) { + animationFrameRequested = true; + global$3.requestAnimationFrame(function () { + var id, ctrl; + animationFrameRequested = false; + for (id in dirtyCtrls) { + ctrl = dirtyCtrls[id]; + if (ctrl.state.get('rendered')) { + ctrl.reflow(); + } + } + dirtyCtrls = {}; + }, domGlobals.document.body); + } + } + }, + remove: function (ctrl) { + if (dirtyCtrls[ctrl._id]) { + delete dirtyCtrls[ctrl._id]; + } + } + }; + + var getUiContainerDelta = function (ctrl) { + var uiContainer = getUiContainer(ctrl); + if (uiContainer && global$2.DOM.getStyle(uiContainer, 'position', true) !== 'static') { + var containerPos = global$2.DOM.getPos(uiContainer); + var dx = uiContainer.scrollLeft - containerPos.x; + var dy = uiContainer.scrollTop - containerPos.y; + return Option.some({ + x: dx, + y: dy + }); + } else { + return Option.none(); + } + }; + var setUiContainer = function (editor, ctrl) { + var uiContainer = global$2.DOM.select(editor.settings.ui_container)[0]; + ctrl.getRoot().uiContainer = uiContainer; + }; + var getUiContainer = function (ctrl) { + return ctrl ? ctrl.getRoot().uiContainer : null; + }; + var inheritUiContainer = function (fromCtrl, toCtrl) { + return toCtrl.uiContainer = getUiContainer(fromCtrl); + }; + var UiContainer = { + getUiContainerDelta: getUiContainerDelta, + setUiContainer: setUiContainer, + getUiContainer: getUiContainer, + inheritUiContainer: inheritUiContainer + }; + + var hasMouseWheelEventSupport = 'onmousewheel' in domGlobals.document; + var hasWheelEventSupport = false; + var classPrefix = 'mce-'; + var Control, idCounter = 0; + var proto$1 = { + Statics: { classPrefix: classPrefix }, + isRtl: function () { + return Control.rtl; + }, + classPrefix: classPrefix, + init: function (settings) { + var self = this; + var classes, defaultClasses; + function applyClasses(classes) { + var i; + classes = classes.split(' '); + for (i = 0; i < classes.length; i++) { + self.classes.add(classes[i]); + } + } + self.settings = settings = global$4.extend({}, self.Defaults, settings); + self._id = settings.id || 'mceu_' + idCounter++; + self._aria = { role: settings.role }; + self._elmCache = {}; + self.$ = global$7; + self.state = new ObservableObject({ + visible: true, + active: false, + disabled: false, + value: '' + }); + self.data = new ObservableObject(settings.data); + self.classes = new ClassList(function () { + if (self.state.get('rendered')) { + self.getEl().className = this.toString(); + } + }); + self.classes.prefix = self.classPrefix; + classes = settings.classes; + if (classes) { + if (self.Defaults) { + defaultClasses = self.Defaults.classes; + if (defaultClasses && classes !== defaultClasses) { + applyClasses(defaultClasses); + } + } + applyClasses(classes); + } + global$4.each('title text name visible disabled active value'.split(' '), function (name) { + if (name in settings) { + self[name](settings[name]); + } + }); + self.on('click', function () { + if (self.disabled()) { + return false; + } + }); + self.settings = settings; + self.borderBox = BoxUtils.parseBox(settings.border); + self.paddingBox = BoxUtils.parseBox(settings.padding); + self.marginBox = BoxUtils.parseBox(settings.margin); + if (settings.hidden) { + self.hide(); + } + }, + Properties: 'parent,name', + getContainerElm: function () { + var uiContainer = UiContainer.getUiContainer(this); + return uiContainer ? uiContainer : funcs.getContainer(); + }, + getParentCtrl: function (elm) { + var ctrl; + var lookup = this.getRoot().controlIdLookup; + while (elm && lookup) { + ctrl = lookup[elm.id]; + if (ctrl) { + break; + } + elm = elm.parentNode; + } + return ctrl; + }, + initLayoutRect: function () { + var self = this; + var settings = self.settings; + var borderBox, layoutRect; + var elm = self.getEl(); + var width, height, minWidth, minHeight, autoResize; + var startMinWidth, startMinHeight, initialSize; + borderBox = self.borderBox = self.borderBox || BoxUtils.measureBox(elm, 'border'); + self.paddingBox = self.paddingBox || BoxUtils.measureBox(elm, 'padding'); + self.marginBox = self.marginBox || BoxUtils.measureBox(elm, 'margin'); + initialSize = funcs.getSize(elm); + startMinWidth = settings.minWidth; + startMinHeight = settings.minHeight; + minWidth = startMinWidth || initialSize.width; + minHeight = startMinHeight || initialSize.height; + width = settings.width; + height = settings.height; + autoResize = settings.autoResize; + autoResize = typeof autoResize !== 'undefined' ? autoResize : !width && !height; + width = width || minWidth; + height = height || minHeight; + var deltaW = borderBox.left + borderBox.right; + var deltaH = borderBox.top + borderBox.bottom; + var maxW = settings.maxWidth || 65535; + var maxH = settings.maxHeight || 65535; + self._layoutRect = layoutRect = { + x: settings.x || 0, + y: settings.y || 0, + w: width, + h: height, + deltaW: deltaW, + deltaH: deltaH, + contentW: width - deltaW, + contentH: height - deltaH, + innerW: width - deltaW, + innerH: height - deltaH, + startMinWidth: startMinWidth || 0, + startMinHeight: startMinHeight || 0, + minW: Math.min(minWidth, maxW), + minH: Math.min(minHeight, maxH), + maxW: maxW, + maxH: maxH, + autoResize: autoResize, + scrollW: 0 + }; + self._lastLayoutRect = {}; + return layoutRect; + }, + layoutRect: function (newRect) { + var self = this; + var curRect = self._layoutRect, lastLayoutRect, size, deltaWidth, deltaHeight, repaintControls; + if (!curRect) { + curRect = self.initLayoutRect(); + } + if (newRect) { + deltaWidth = curRect.deltaW; + deltaHeight = curRect.deltaH; + if (newRect.x !== undefined) { + curRect.x = newRect.x; + } + if (newRect.y !== undefined) { + curRect.y = newRect.y; + } + if (newRect.minW !== undefined) { + curRect.minW = newRect.minW; + } + if (newRect.minH !== undefined) { + curRect.minH = newRect.minH; + } + size = newRect.w; + if (size !== undefined) { + size = size < curRect.minW ? curRect.minW : size; + size = size > curRect.maxW ? curRect.maxW : size; + curRect.w = size; + curRect.innerW = size - deltaWidth; + } + size = newRect.h; + if (size !== undefined) { + size = size < curRect.minH ? curRect.minH : size; + size = size > curRect.maxH ? curRect.maxH : size; + curRect.h = size; + curRect.innerH = size - deltaHeight; + } + size = newRect.innerW; + if (size !== undefined) { + size = size < curRect.minW - deltaWidth ? curRect.minW - deltaWidth : size; + size = size > curRect.maxW - deltaWidth ? curRect.maxW - deltaWidth : size; + curRect.innerW = size; + curRect.w = size + deltaWidth; + } + size = newRect.innerH; + if (size !== undefined) { + size = size < curRect.minH - deltaHeight ? curRect.minH - deltaHeight : size; + size = size > curRect.maxH - deltaHeight ? curRect.maxH - deltaHeight : size; + curRect.innerH = size; + curRect.h = size + deltaHeight; + } + if (newRect.contentW !== undefined) { + curRect.contentW = newRect.contentW; + } + if (newRect.contentH !== undefined) { + curRect.contentH = newRect.contentH; + } + lastLayoutRect = self._lastLayoutRect; + if (lastLayoutRect.x !== curRect.x || lastLayoutRect.y !== curRect.y || lastLayoutRect.w !== curRect.w || lastLayoutRect.h !== curRect.h) { + repaintControls = Control.repaintControls; + if (repaintControls) { + if (repaintControls.map && !repaintControls.map[self._id]) { + repaintControls.push(self); + repaintControls.map[self._id] = true; + } + } + lastLayoutRect.x = curRect.x; + lastLayoutRect.y = curRect.y; + lastLayoutRect.w = curRect.w; + lastLayoutRect.h = curRect.h; + } + return self; + } + return curRect; + }, + repaint: function () { + var self = this; + var style, bodyStyle, bodyElm, rect, borderBox; + var borderW, borderH, lastRepaintRect, round, value; + round = !domGlobals.document.createRange ? Math.round : function (value) { + return value; + }; + style = self.getEl().style; + rect = self._layoutRect; + lastRepaintRect = self._lastRepaintRect || {}; + borderBox = self.borderBox; + borderW = borderBox.left + borderBox.right; + borderH = borderBox.top + borderBox.bottom; + if (rect.x !== lastRepaintRect.x) { + style.left = round(rect.x) + 'px'; + lastRepaintRect.x = rect.x; + } + if (rect.y !== lastRepaintRect.y) { + style.top = round(rect.y) + 'px'; + lastRepaintRect.y = rect.y; + } + if (rect.w !== lastRepaintRect.w) { + value = round(rect.w - borderW); + style.width = (value >= 0 ? value : 0) + 'px'; + lastRepaintRect.w = rect.w; + } + if (rect.h !== lastRepaintRect.h) { + value = round(rect.h - borderH); + style.height = (value >= 0 ? value : 0) + 'px'; + lastRepaintRect.h = rect.h; + } + if (self._hasBody && rect.innerW !== lastRepaintRect.innerW) { + value = round(rect.innerW); + bodyElm = self.getEl('body'); + if (bodyElm) { + bodyStyle = bodyElm.style; + bodyStyle.width = (value >= 0 ? value : 0) + 'px'; + } + lastRepaintRect.innerW = rect.innerW; + } + if (self._hasBody && rect.innerH !== lastRepaintRect.innerH) { + value = round(rect.innerH); + bodyElm = bodyElm || self.getEl('body'); + if (bodyElm) { + bodyStyle = bodyStyle || bodyElm.style; + bodyStyle.height = (value >= 0 ? value : 0) + 'px'; + } + lastRepaintRect.innerH = rect.innerH; + } + self._lastRepaintRect = lastRepaintRect; + self.fire('repaint', {}, false); + }, + updateLayoutRect: function () { + var self = this; + self.parent()._lastRect = null; + funcs.css(self.getEl(), { + width: '', + height: '' + }); + self._layoutRect = self._lastRepaintRect = self._lastLayoutRect = null; + self.initLayoutRect(); + }, + on: function (name, callback) { + var self = this; + function resolveCallbackName(name) { + var callback, scope; + if (typeof name !== 'string') { + return name; + } + return function (e) { + if (!callback) { + self.parentsAndSelf().each(function (ctrl) { + var callbacks = ctrl.settings.callbacks; + if (callbacks && (callback = callbacks[name])) { + scope = ctrl; + return false; + } + }); + } + if (!callback) { + e.action = name; + this.fire('execute', e); + return; + } + return callback.call(scope, e); + }; + } + getEventDispatcher(self).on(name, resolveCallbackName(callback)); + return self; + }, + off: function (name, callback) { + getEventDispatcher(this).off(name, callback); + return this; + }, + fire: function (name, args, bubble) { + var self = this; + args = args || {}; + if (!args.control) { + args.control = self; + } + args = getEventDispatcher(self).fire(name, args); + if (bubble !== false && self.parent) { + var parent = self.parent(); + while (parent && !args.isPropagationStopped()) { + parent.fire(name, args, false); + parent = parent.parent(); + } + } + return args; + }, + hasEventListeners: function (name) { + return getEventDispatcher(this).has(name); + }, + parents: function (selector) { + var self = this; + var ctrl, parents = new Collection$2(); + for (ctrl = self.parent(); ctrl; ctrl = ctrl.parent()) { + parents.add(ctrl); + } + if (selector) { + parents = parents.filter(selector); + } + return parents; + }, + parentsAndSelf: function (selector) { + return new Collection$2(this).add(this.parents(selector)); + }, + next: function () { + var parentControls = this.parent().items(); + return parentControls[parentControls.indexOf(this) + 1]; + }, + prev: function () { + var parentControls = this.parent().items(); + return parentControls[parentControls.indexOf(this) - 1]; + }, + innerHtml: function (html) { + this.$el.html(html); + return this; + }, + getEl: function (suffix) { + var id = suffix ? this._id + '-' + suffix : this._id; + if (!this._elmCache[id]) { + this._elmCache[id] = global$7('#' + id)[0]; + } + return this._elmCache[id]; + }, + show: function () { + return this.visible(true); + }, + hide: function () { + return this.visible(false); + }, + focus: function () { + try { + this.getEl().focus(); + } catch (ex) { + } + return this; + }, + blur: function () { + this.getEl().blur(); + return this; + }, + aria: function (name, value) { + var self = this, elm = self.getEl(self.ariaTarget); + if (typeof value === 'undefined') { + return self._aria[name]; + } + self._aria[name] = value; + if (self.state.get('rendered')) { + elm.setAttribute(name === 'role' ? name : 'aria-' + name, value); + } + return self; + }, + encode: function (text, translate) { + if (translate !== false) { + text = this.translate(text); + } + return (text || '').replace(/[&<>"]/g, function (match) { + return '&#' + match.charCodeAt(0) + ';'; + }); + }, + translate: function (text) { + return Control.translate ? Control.translate(text) : text; + }, + before: function (items) { + var self = this, parent = self.parent(); + if (parent) { + parent.insert(items, parent.items().indexOf(self), true); + } + return self; + }, + after: function (items) { + var self = this, parent = self.parent(); + if (parent) { + parent.insert(items, parent.items().indexOf(self)); + } + return self; + }, + remove: function () { + var self = this; + var elm = self.getEl(); + var parent = self.parent(); + var newItems, i; + if (self.items) { + var controls = self.items().toArray(); + i = controls.length; + while (i--) { + controls[i].remove(); + } + } + if (parent && parent.items) { + newItems = []; + parent.items().each(function (item) { + if (item !== self) { + newItems.push(item); + } + }); + parent.items().set(newItems); + parent._lastRect = null; + } + if (self._eventsRoot && self._eventsRoot === self) { + global$7(elm).off(); + } + var lookup = self.getRoot().controlIdLookup; + if (lookup) { + delete lookup[self._id]; + } + if (elm && elm.parentNode) { + elm.parentNode.removeChild(elm); + } + self.state.set('rendered', false); + self.state.destroy(); + self.fire('remove'); + return self; + }, + renderBefore: function (elm) { + global$7(elm).before(this.renderHtml()); + this.postRender(); + return this; + }, + renderTo: function (elm) { + global$7(elm || this.getContainerElm()).append(this.renderHtml()); + this.postRender(); + return this; + }, + preRender: function () { + }, + render: function () { + }, + renderHtml: function () { + return '<div id="' + this._id + '" class="' + this.classes + '"></div>'; + }, + postRender: function () { + var self = this; + var settings = self.settings; + var elm, box, parent, name, parentEventsRoot; + self.$el = global$7(self.getEl()); + self.state.set('rendered', true); + for (name in settings) { + if (name.indexOf('on') === 0) { + self.on(name.substr(2), settings[name]); + } + } + if (self._eventsRoot) { + for (parent = self.parent(); !parentEventsRoot && parent; parent = parent.parent()) { + parentEventsRoot = parent._eventsRoot; + } + if (parentEventsRoot) { + for (name in parentEventsRoot._nativeEvents) { + self._nativeEvents[name] = true; + } + } + } + bindPendingEvents(self); + if (settings.style) { + elm = self.getEl(); + if (elm) { + elm.setAttribute('style', settings.style); + elm.style.cssText = settings.style; + } + } + if (self.settings.border) { + box = self.borderBox; + self.$el.css({ + 'border-top-width': box.top, + 'border-right-width': box.right, + 'border-bottom-width': box.bottom, + 'border-left-width': box.left + }); + } + var root = self.getRoot(); + if (!root.controlIdLookup) { + root.controlIdLookup = {}; + } + root.controlIdLookup[self._id] = self; + for (var key in self._aria) { + self.aria(key, self._aria[key]); + } + if (self.state.get('visible') === false) { + self.getEl().style.display = 'none'; + } + self.bindStates(); + self.state.on('change:visible', function (e) { + var state = e.value; + var parentCtrl; + if (self.state.get('rendered')) { + self.getEl().style.display = state === false ? 'none' : ''; + self.getEl().getBoundingClientRect(); + } + parentCtrl = self.parent(); + if (parentCtrl) { + parentCtrl._lastRect = null; + } + self.fire(state ? 'show' : 'hide'); + ReflowQueue.add(self); + }); + self.fire('postrender', {}, false); + }, + bindStates: function () { + }, + scrollIntoView: function (align) { + function getOffset(elm, rootElm) { + var x, y, parent = elm; + x = y = 0; + while (parent && parent !== rootElm && parent.nodeType) { + x += parent.offsetLeft || 0; + y += parent.offsetTop || 0; + parent = parent.offsetParent; + } + return { + x: x, + y: y + }; + } + var elm = this.getEl(), parentElm = elm.parentNode; + var x, y, width, height, parentWidth, parentHeight; + var pos = getOffset(elm, parentElm); + x = pos.x; + y = pos.y; + width = elm.offsetWidth; + height = elm.offsetHeight; + parentWidth = parentElm.clientWidth; + parentHeight = parentElm.clientHeight; + if (align === 'end') { + x -= parentWidth - width; + y -= parentHeight - height; + } else if (align === 'center') { + x -= parentWidth / 2 - width / 2; + y -= parentHeight / 2 - height / 2; + } + parentElm.scrollLeft = x; + parentElm.scrollTop = y; + return this; + }, + getRoot: function () { + var ctrl = this, rootControl; + var parents = []; + while (ctrl) { + if (ctrl.rootControl) { + rootControl = ctrl.rootControl; + break; + } + parents.push(ctrl); + rootControl = ctrl; + ctrl = ctrl.parent(); + } + if (!rootControl) { + rootControl = this; + } + var i = parents.length; + while (i--) { + parents[i].rootControl = rootControl; + } + return rootControl; + }, + reflow: function () { + ReflowQueue.remove(this); + var parent = this.parent(); + if (parent && parent._layout && !parent._layout.isNative()) { + parent.reflow(); + } + return this; + } + }; + global$4.each('text title visible disabled active value'.split(' '), function (name) { + proto$1[name] = function (value) { + if (arguments.length === 0) { + return this.state.get(name); + } + if (typeof value !== 'undefined') { + this.state.set(name, value); + } + return this; + }; + }); + Control = global$8.extend(proto$1); + function getEventDispatcher(obj) { + if (!obj._eventDispatcher) { + obj._eventDispatcher = new global$9({ + scope: obj, + toggleEvent: function (name, state) { + if (state && global$9.isNative(name)) { + if (!obj._nativeEvents) { + obj._nativeEvents = {}; + } + obj._nativeEvents[name] = true; + if (obj.state.get('rendered')) { + bindPendingEvents(obj); + } + } + } + }); + } + return obj._eventDispatcher; + } + function bindPendingEvents(eventCtrl) { + var i, l, parents, eventRootCtrl, nativeEvents, name; + function delegate(e) { + var control = eventCtrl.getParentCtrl(e.target); + if (control) { + control.fire(e.type, e); + } + } + function mouseLeaveHandler() { + var ctrl = eventRootCtrl._lastHoverCtrl; + if (ctrl) { + ctrl.fire('mouseleave', { target: ctrl.getEl() }); + ctrl.parents().each(function (ctrl) { + ctrl.fire('mouseleave', { target: ctrl.getEl() }); + }); + eventRootCtrl._lastHoverCtrl = null; + } + } + function mouseEnterHandler(e) { + var ctrl = eventCtrl.getParentCtrl(e.target), lastCtrl = eventRootCtrl._lastHoverCtrl, idx = 0, i, parents, lastParents; + if (ctrl !== lastCtrl) { + eventRootCtrl._lastHoverCtrl = ctrl; + parents = ctrl.parents().toArray().reverse(); + parents.push(ctrl); + if (lastCtrl) { + lastParents = lastCtrl.parents().toArray().reverse(); + lastParents.push(lastCtrl); + for (idx = 0; idx < lastParents.length; idx++) { + if (parents[idx] !== lastParents[idx]) { + break; + } + } + for (i = lastParents.length - 1; i >= idx; i--) { + lastCtrl = lastParents[i]; + lastCtrl.fire('mouseleave', { target: lastCtrl.getEl() }); + } + } + for (i = idx; i < parents.length; i++) { + ctrl = parents[i]; + ctrl.fire('mouseenter', { target: ctrl.getEl() }); + } + } + } + function fixWheelEvent(e) { + e.preventDefault(); + if (e.type === 'mousewheel') { + e.deltaY = -1 / 40 * e.wheelDelta; + if (e.wheelDeltaX) { + e.deltaX = -1 / 40 * e.wheelDeltaX; + } + } else { + e.deltaX = 0; + e.deltaY = e.detail; + } + e = eventCtrl.fire('wheel', e); + } + nativeEvents = eventCtrl._nativeEvents; + if (nativeEvents) { + parents = eventCtrl.parents().toArray(); + parents.unshift(eventCtrl); + for (i = 0, l = parents.length; !eventRootCtrl && i < l; i++) { + eventRootCtrl = parents[i]._eventsRoot; + } + if (!eventRootCtrl) { + eventRootCtrl = parents[parents.length - 1] || eventCtrl; + } + eventCtrl._eventsRoot = eventRootCtrl; + for (l = i, i = 0; i < l; i++) { + parents[i]._eventsRoot = eventRootCtrl; + } + var eventRootDelegates = eventRootCtrl._delegates; + if (!eventRootDelegates) { + eventRootDelegates = eventRootCtrl._delegates = {}; + } + for (name in nativeEvents) { + if (!nativeEvents) { + return false; + } + if (name === 'wheel' && !hasWheelEventSupport) { + if (hasMouseWheelEventSupport) { + global$7(eventCtrl.getEl()).on('mousewheel', fixWheelEvent); + } else { + global$7(eventCtrl.getEl()).on('DOMMouseScroll', fixWheelEvent); + } + continue; + } + if (name === 'mouseenter' || name === 'mouseleave') { + if (!eventRootCtrl._hasMouseEnter) { + global$7(eventRootCtrl.getEl()).on('mouseleave', mouseLeaveHandler).on('mouseover', mouseEnterHandler); + eventRootCtrl._hasMouseEnter = 1; + } + } else if (!eventRootDelegates[name]) { + global$7(eventRootCtrl.getEl()).on(name, delegate); + eventRootDelegates[name] = true; + } + nativeEvents[name] = false; + } + } + } + var Control$1 = Control; + + var isStatic = function (elm) { + return funcs.getRuntimeStyle(elm, 'position') === 'static'; + }; + var isFixed = function (ctrl) { + return ctrl.state.get('fixed'); + }; + function calculateRelativePosition(ctrl, targetElm, rel) { + var ctrlElm, pos, x, y, selfW, selfH, targetW, targetH, viewport, size; + viewport = getWindowViewPort(); + pos = funcs.getPos(targetElm, UiContainer.getUiContainer(ctrl)); + x = pos.x; + y = pos.y; + if (isFixed(ctrl) && isStatic(domGlobals.document.body)) { + x -= viewport.x; + y -= viewport.y; + } + ctrlElm = ctrl.getEl(); + size = funcs.getSize(ctrlElm); + selfW = size.width; + selfH = size.height; + size = funcs.getSize(targetElm); + targetW = size.width; + targetH = size.height; + rel = (rel || '').split(''); + if (rel[0] === 'b') { + y += targetH; + } + if (rel[1] === 'r') { + x += targetW; + } + if (rel[0] === 'c') { + y += Math.round(targetH / 2); + } + if (rel[1] === 'c') { + x += Math.round(targetW / 2); + } + if (rel[3] === 'b') { + y -= selfH; + } + if (rel[4] === 'r') { + x -= selfW; + } + if (rel[3] === 'c') { + y -= Math.round(selfH / 2); + } + if (rel[4] === 'c') { + x -= Math.round(selfW / 2); + } + return { + x: x, + y: y, + w: selfW, + h: selfH + }; + } + var getUiContainerViewPort = function (customUiContainer) { + return { + x: 0, + y: 0, + w: customUiContainer.scrollWidth - 1, + h: customUiContainer.scrollHeight - 1 + }; + }; + var getWindowViewPort = function () { + var win = domGlobals.window; + var x = Math.max(win.pageXOffset, domGlobals.document.body.scrollLeft, domGlobals.document.documentElement.scrollLeft); + var y = Math.max(win.pageYOffset, domGlobals.document.body.scrollTop, domGlobals.document.documentElement.scrollTop); + var w = win.innerWidth || domGlobals.document.documentElement.clientWidth; + var h = win.innerHeight || domGlobals.document.documentElement.clientHeight; + return { + x: x, + y: y, + w: w, + h: h + }; + }; + var getViewPortRect = function (ctrl) { + var customUiContainer = UiContainer.getUiContainer(ctrl); + return customUiContainer && !isFixed(ctrl) ? getUiContainerViewPort(customUiContainer) : getWindowViewPort(); + }; + var Movable = { + testMoveRel: function (elm, rels) { + var viewPortRect = getViewPortRect(this); + for (var i = 0; i < rels.length; i++) { + var pos = calculateRelativePosition(this, elm, rels[i]); + if (isFixed(this)) { + if (pos.x > 0 && pos.x + pos.w < viewPortRect.w && pos.y > 0 && pos.y + pos.h < viewPortRect.h) { + return rels[i]; + } + } else { + if (pos.x > viewPortRect.x && pos.x + pos.w < viewPortRect.w + viewPortRect.x && pos.y > viewPortRect.y && pos.y + pos.h < viewPortRect.h + viewPortRect.y) { + return rels[i]; + } + } + } + return rels[0]; + }, + moveRel: function (elm, rel) { + if (typeof rel !== 'string') { + rel = this.testMoveRel(elm, rel); + } + var pos = calculateRelativePosition(this, elm, rel); + return this.moveTo(pos.x, pos.y); + }, + moveBy: function (dx, dy) { + var self = this, rect = self.layoutRect(); + self.moveTo(rect.x + dx, rect.y + dy); + return self; + }, + moveTo: function (x, y) { + var self = this; + function constrain(value, max, size) { + if (value < 0) { + return 0; + } + if (value + size > max) { + value = max - size; + return value < 0 ? 0 : value; + } + return value; + } + if (self.settings.constrainToViewport) { + var viewPortRect = getViewPortRect(this); + var layoutRect = self.layoutRect(); + x = constrain(x, viewPortRect.w + viewPortRect.x, layoutRect.w); + y = constrain(y, viewPortRect.h + viewPortRect.y, layoutRect.h); + } + var uiContainer = UiContainer.getUiContainer(self); + if (uiContainer && isStatic(uiContainer) && !isFixed(self)) { + x -= uiContainer.scrollLeft; + y -= uiContainer.scrollTop; + } + if (uiContainer) { + x += 1; + y += 1; + } + if (self.state.get('rendered')) { + self.layoutRect({ + x: x, + y: y + }).repaint(); + } else { + self.settings.x = x; + self.settings.y = y; + } + self.fire('move', { + x: x, + y: y + }); + return self; + } + }; + + var Tooltip = Control$1.extend({ + Mixins: [Movable], + Defaults: { classes: 'widget tooltip tooltip-n' }, + renderHtml: function () { + var self = this, prefix = self.classPrefix; + return '<div id="' + self._id + '" class="' + self.classes + '" role="presentation">' + '<div class="' + prefix + 'tooltip-arrow"></div>' + '<div class="' + prefix + 'tooltip-inner">' + self.encode(self.state.get('text')) + '</div>' + '</div>'; + }, + bindStates: function () { + var self = this; + self.state.on('change:text', function (e) { + self.getEl().lastChild.innerHTML = self.encode(e.value); + }); + return self._super(); + }, + repaint: function () { + var self = this; + var style, rect; + style = self.getEl().style; + rect = self._layoutRect; + style.left = rect.x + 'px'; + style.top = rect.y + 'px'; + style.zIndex = 65535 + 65535; + } + }); + + var Widget = Control$1.extend({ + init: function (settings) { + var self = this; + self._super(settings); + settings = self.settings; + self.canFocus = true; + if (settings.tooltip && Widget.tooltips !== false) { + self.on('mouseenter', function (e) { + var tooltip = self.tooltip().moveTo(-65535); + if (e.control === self) { + var rel = tooltip.text(settings.tooltip).show().testMoveRel(self.getEl(), [ + 'bc-tc', + 'bc-tl', + 'bc-tr' + ]); + tooltip.classes.toggle('tooltip-n', rel === 'bc-tc'); + tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl'); + tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr'); + tooltip.moveRel(self.getEl(), rel); + } else { + tooltip.hide(); + } + }); + self.on('mouseleave mousedown click', function () { + self.tooltip().remove(); + self._tooltip = null; + }); + } + self.aria('label', settings.ariaLabel || settings.tooltip); + }, + tooltip: function () { + if (!this._tooltip) { + this._tooltip = new Tooltip({ type: 'tooltip' }); + UiContainer.inheritUiContainer(this, this._tooltip); + this._tooltip.renderTo(); + } + return this._tooltip; + }, + postRender: function () { + var self = this, settings = self.settings; + self._super(); + if (!self.parent() && (settings.width || settings.height)) { + self.initLayoutRect(); + self.repaint(); + } + if (settings.autofocus) { + self.focus(); + } + }, + bindStates: function () { + var self = this; + function disable(state) { + self.aria('disabled', state); + self.classes.toggle('disabled', state); + } + function active(state) { + self.aria('pressed', state); + self.classes.toggle('active', state); + } + self.state.on('change:disabled', function (e) { + disable(e.value); + }); + self.state.on('change:active', function (e) { + active(e.value); + }); + if (self.state.get('disabled')) { + disable(true); + } + if (self.state.get('active')) { + active(true); + } + return self._super(); + }, + remove: function () { + this._super(); + if (this._tooltip) { + this._tooltip.remove(); + this._tooltip = null; + } + } + }); + + var Progress = Widget.extend({ + Defaults: { value: 0 }, + init: function (settings) { + var self = this; + self._super(settings); + self.classes.add('progress'); + if (!self.settings.filter) { + self.settings.filter = function (value) { + return Math.round(value); + }; + } + }, + renderHtml: function () { + var self = this, id = self._id, prefix = this.classPrefix; + return '<div id="' + id + '" class="' + self.classes + '">' + '<div class="' + prefix + 'bar-container">' + '<div class="' + prefix + 'bar"></div>' + '</div>' + '<div class="' + prefix + 'text">0%</div>' + '</div>'; + }, + postRender: function () { + var self = this; + self._super(); + self.value(self.settings.value); + return self; + }, + bindStates: function () { + var self = this; + function setValue(value) { + value = self.settings.filter(value); + self.getEl().lastChild.innerHTML = value + '%'; + self.getEl().firstChild.firstChild.style.width = value + '%'; + } + self.state.on('change:value', function (e) { + setValue(e.value); + }); + setValue(self.state.get('value')); + return self._super(); + } + }); + + var updateLiveRegion = function (ctx, text) { + ctx.getEl().lastChild.textContent = text + (ctx.progressBar ? ' ' + ctx.progressBar.value() + '%' : ''); + }; + var Notification = Control$1.extend({ + Mixins: [Movable], + Defaults: { classes: 'widget notification' }, + init: function (settings) { + var self = this; + self._super(settings); + self.maxWidth = settings.maxWidth; + if (settings.text) { + self.text(settings.text); + } + if (settings.icon) { + self.icon = settings.icon; + } + if (settings.color) { + self.color = settings.color; + } + if (settings.type) { + self.classes.add('notification-' + settings.type); + } + if (settings.timeout && (settings.timeout < 0 || settings.timeout > 0) && !settings.closeButton) { + self.closeButton = false; + } else { + self.classes.add('has-close'); + self.closeButton = true; + } + if (settings.progressBar) { + self.progressBar = new Progress(); + } + self.on('click', function (e) { + if (e.target.className.indexOf(self.classPrefix + 'close') !== -1) { + self.close(); + } + }); + }, + renderHtml: function () { + var self = this; + var prefix = self.classPrefix; + var icon = '', closeButton = '', progressBar = '', notificationStyle = ''; + if (self.icon) { + icon = '<i class="' + prefix + 'ico' + ' ' + prefix + 'i-' + self.icon + '"></i>'; + } + notificationStyle = ' style="max-width: ' + self.maxWidth + 'px;' + (self.color ? 'background-color: ' + self.color + ';"' : '"'); + if (self.closeButton) { + closeButton = '<button type="button" class="' + prefix + 'close" aria-hidden="true">\xD7</button>'; + } + if (self.progressBar) { + progressBar = self.progressBar.renderHtml(); + } + return '<div id="' + self._id + '" class="' + self.classes + '"' + notificationStyle + ' role="presentation">' + icon + '<div class="' + prefix + 'notification-inner">' + self.state.get('text') + '</div>' + progressBar + closeButton + '<div style="clip: rect(1px, 1px, 1px, 1px);height: 1px;overflow: hidden;position: absolute;width: 1px;"' + ' aria-live="assertive" aria-relevant="additions" aria-atomic="true"></div>' + '</div>'; + }, + postRender: function () { + var self = this; + global$3.setTimeout(function () { + self.$el.addClass(self.classPrefix + 'in'); + updateLiveRegion(self, self.state.get('text')); + }, 100); + return self._super(); + }, + bindStates: function () { + var self = this; + self.state.on('change:text', function (e) { + self.getEl().firstChild.innerHTML = e.value; + updateLiveRegion(self, e.value); + }); + if (self.progressBar) { + self.progressBar.bindStates(); + self.progressBar.state.on('change:value', function (e) { + updateLiveRegion(self, self.state.get('text')); + }); + } + return self._super(); + }, + close: function () { + var self = this; + if (!self.fire('close').isDefaultPrevented()) { + self.remove(); + } + return self; + }, + repaint: function () { + var self = this; + var style, rect; + style = self.getEl().style; + rect = self._layoutRect; + style.left = rect.x + 'px'; + style.top = rect.y + 'px'; + style.zIndex = 65535 - 1; + } + }); + + function NotificationManagerImpl (editor) { + var getEditorContainer = function (editor) { + return editor.inline ? editor.getElement() : editor.getContentAreaContainer(); + }; + var getContainerWidth = function () { + var container = getEditorContainer(editor); + return funcs.getSize(container).width; + }; + var prePositionNotifications = function (notifications) { + each(notifications, function (notification) { + notification.moveTo(0, 0); + }); + }; + var positionNotifications = function (notifications) { + if (notifications.length > 0) { + var firstItem = notifications.slice(0, 1)[0]; + var container = getEditorContainer(editor); + firstItem.moveRel(container, 'tc-tc'); + each(notifications, function (notification, index) { + if (index > 0) { + notification.moveRel(notifications[index - 1].getEl(), 'bc-tc'); + } + }); + } + }; + var reposition = function (notifications) { + prePositionNotifications(notifications); + positionNotifications(notifications); + }; + var open = function (args, closeCallback) { + var extendedArgs = global$4.extend(args, { maxWidth: getContainerWidth() }); + var notif = new Notification(extendedArgs); + notif.args = extendedArgs; + if (extendedArgs.timeout > 0) { + notif.timer = setTimeout(function () { + notif.close(); + closeCallback(); + }, extendedArgs.timeout); + } + notif.on('close', function () { + closeCallback(); + }); + notif.renderTo(); + return notif; + }; + var close = function (notification) { + notification.close(); + }; + var getArgs = function (notification) { + return notification.args; + }; + return { + open: open, + close: close, + reposition: reposition, + getArgs: getArgs + }; + } + + function getDocumentSize(doc) { + var documentElement, body, scrollWidth, clientWidth; + var offsetWidth, scrollHeight, clientHeight, offsetHeight; + var max = Math.max; + documentElement = doc.documentElement; + body = doc.body; + scrollWidth = max(documentElement.scrollWidth, body.scrollWidth); + clientWidth = max(documentElement.clientWidth, body.clientWidth); + offsetWidth = max(documentElement.offsetWidth, body.offsetWidth); + scrollHeight = max(documentElement.scrollHeight, body.scrollHeight); + clientHeight = max(documentElement.clientHeight, body.clientHeight); + offsetHeight = max(documentElement.offsetHeight, body.offsetHeight); + return { + width: scrollWidth < offsetWidth ? clientWidth : scrollWidth, + height: scrollHeight < offsetHeight ? clientHeight : scrollHeight + }; + } + function updateWithTouchData(e) { + var keys, i; + if (e.changedTouches) { + keys = 'screenX screenY pageX pageY clientX clientY'.split(' '); + for (i = 0; i < keys.length; i++) { + e[keys[i]] = e.changedTouches[0][keys[i]]; + } + } + } + function DragHelper (id, settings) { + var $eventOverlay; + var doc = settings.document || domGlobals.document; + var downButton; + var start, stop, drag, startX, startY; + settings = settings || {}; + var handleElement = doc.getElementById(settings.handle || id); + start = function (e) { + var docSize = getDocumentSize(doc); + var handleElm, cursor; + updateWithTouchData(e); + e.preventDefault(); + downButton = e.button; + handleElm = handleElement; + startX = e.screenX; + startY = e.screenY; + if (domGlobals.window.getComputedStyle) { + cursor = domGlobals.window.getComputedStyle(handleElm, null).getPropertyValue('cursor'); + } else { + cursor = handleElm.runtimeStyle.cursor; + } + $eventOverlay = global$7('<div></div>').css({ + position: 'absolute', + top: 0, + left: 0, + width: docSize.width, + height: docSize.height, + zIndex: 2147483647, + opacity: 0.0001, + cursor: cursor + }).appendTo(doc.body); + global$7(doc).on('mousemove touchmove', drag).on('mouseup touchend', stop); + settings.start(e); + }; + drag = function (e) { + updateWithTouchData(e); + if (e.button !== downButton) { + return stop(e); + } + e.deltaX = e.screenX - startX; + e.deltaY = e.screenY - startY; + e.preventDefault(); + settings.drag(e); + }; + stop = function (e) { + updateWithTouchData(e); + global$7(doc).off('mousemove touchmove', drag).off('mouseup touchend', stop); + $eventOverlay.remove(); + if (settings.stop) { + settings.stop(e); + } + }; + this.destroy = function () { + global$7(handleElement).off(); + }; + global$7(handleElement).on('mousedown touchstart', start); + } + + var global$b = tinymce.util.Tools.resolve('tinymce.ui.Factory'); + + var hasTabstopData = function (elm) { + return elm.getAttribute('data-mce-tabstop') ? true : false; + }; + function KeyboardNavigation (settings) { + var root = settings.root; + var focusedElement, focusedControl; + function isElement(node) { + return node && node.nodeType === 1; + } + try { + focusedElement = domGlobals.document.activeElement; + } catch (ex) { + focusedElement = domGlobals.document.body; + } + focusedControl = root.getParentCtrl(focusedElement); + function getRole(elm) { + elm = elm || focusedElement; + if (isElement(elm)) { + return elm.getAttribute('role'); + } + return null; + } + function getParentRole(elm) { + var role, parent = elm || focusedElement; + while (parent = parent.parentNode) { + if (role = getRole(parent)) { + return role; + } + } + } + function getAriaProp(name) { + var elm = focusedElement; + if (isElement(elm)) { + return elm.getAttribute('aria-' + name); + } + } + function isTextInputElement(elm) { + var tagName = elm.tagName.toUpperCase(); + return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT'; + } + function canFocus(elm) { + if (isTextInputElement(elm) && !elm.hidden) { + return true; + } + if (hasTabstopData(elm)) { + return true; + } + if (/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(getRole(elm))) { + return true; + } + return false; + } + function getFocusElements(elm) { + var elements = []; + function collect(elm) { + if (elm.nodeType !== 1 || elm.style.display === 'none' || elm.disabled) { + return; + } + if (canFocus(elm)) { + elements.push(elm); + } + for (var i = 0; i < elm.childNodes.length; i++) { + collect(elm.childNodes[i]); + } + } + collect(elm || root.getEl()); + return elements; + } + function getNavigationRoot(targetControl) { + var navigationRoot, controls; + targetControl = targetControl || focusedControl; + controls = targetControl.parents().toArray(); + controls.unshift(targetControl); + for (var i = 0; i < controls.length; i++) { + navigationRoot = controls[i]; + if (navigationRoot.settings.ariaRoot) { + break; + } + } + return navigationRoot; + } + function focusFirst(targetControl) { + var navigationRoot = getNavigationRoot(targetControl); + var focusElements = getFocusElements(navigationRoot.getEl()); + if (navigationRoot.settings.ariaRemember && 'lastAriaIndex' in navigationRoot) { + moveFocusToIndex(navigationRoot.lastAriaIndex, focusElements); + } else { + moveFocusToIndex(0, focusElements); + } + } + function moveFocusToIndex(idx, elements) { + if (idx < 0) { + idx = elements.length - 1; + } else if (idx >= elements.length) { + idx = 0; + } + if (elements[idx]) { + elements[idx].focus(); + } + return idx; + } + function moveFocus(dir, elements) { + var idx = -1; + var navigationRoot = getNavigationRoot(); + elements = elements || getFocusElements(navigationRoot.getEl()); + for (var i = 0; i < elements.length; i++) { + if (elements[i] === focusedElement) { + idx = i; + } + } + idx += dir; + navigationRoot.lastAriaIndex = moveFocusToIndex(idx, elements); + } + function left() { + var parentRole = getParentRole(); + if (parentRole === 'tablist') { + moveFocus(-1, getFocusElements(focusedElement.parentNode)); + } else if (focusedControl.parent().submenu) { + cancel(); + } else { + moveFocus(-1); + } + } + function right() { + var role = getRole(), parentRole = getParentRole(); + if (parentRole === 'tablist') { + moveFocus(1, getFocusElements(focusedElement.parentNode)); + } else if (role === 'menuitem' && parentRole === 'menu' && getAriaProp('haspopup')) { + enter(); + } else { + moveFocus(1); + } + } + function up() { + moveFocus(-1); + } + function down() { + var role = getRole(), parentRole = getParentRole(); + if (role === 'menuitem' && parentRole === 'menubar') { + enter(); + } else if (role === 'button' && getAriaProp('haspopup')) { + enter({ key: 'down' }); + } else { + moveFocus(1); + } + } + function tab(e) { + var parentRole = getParentRole(); + if (parentRole === 'tablist') { + var elm = getFocusElements(focusedControl.getEl('body'))[0]; + if (elm) { + elm.focus(); + } + } else { + moveFocus(e.shiftKey ? -1 : 1); + } + } + function cancel() { + focusedControl.fire('cancel'); + } + function enter(aria) { + aria = aria || {}; + focusedControl.fire('click', { + target: focusedElement, + aria: aria + }); + } + root.on('keydown', function (e) { + function handleNonTabOrEscEvent(e, handler) { + if (isTextInputElement(focusedElement) || hasTabstopData(focusedElement)) { + return; + } + if (getRole(focusedElement) === 'slider') { + return; + } + if (handler(e) !== false) { + e.preventDefault(); + } + } + if (e.isDefaultPrevented()) { + return; + } + switch (e.keyCode) { + case 37: + handleNonTabOrEscEvent(e, left); + break; + case 39: + handleNonTabOrEscEvent(e, right); + break; + case 38: + handleNonTabOrEscEvent(e, up); + break; + case 40: + handleNonTabOrEscEvent(e, down); + break; + case 27: + cancel(); + break; + case 14: + case 13: + case 32: + handleNonTabOrEscEvent(e, enter); + break; + case 9: + tab(e); + e.preventDefault(); + break; + } + }); + root.on('focusin', function (e) { + focusedElement = e.target; + focusedControl = e.control; + }); + return { focusFirst: focusFirst }; + } + + var selectorCache = {}; + var Container = Control$1.extend({ + init: function (settings) { + var self = this; + self._super(settings); + settings = self.settings; + if (settings.fixed) { + self.state.set('fixed', true); + } + self._items = new Collection$2(); + if (self.isRtl()) { + self.classes.add('rtl'); + } + self.bodyClasses = new ClassList(function () { + if (self.state.get('rendered')) { + self.getEl('body').className = this.toString(); + } + }); + self.bodyClasses.prefix = self.classPrefix; + self.classes.add('container'); + self.bodyClasses.add('container-body'); + if (settings.containerCls) { + self.classes.add(settings.containerCls); + } + self._layout = global$b.create((settings.layout || '') + 'layout'); + if (self.settings.items) { + self.add(self.settings.items); + } else { + self.add(self.render()); + } + self._hasBody = true; + }, + items: function () { + return this._items; + }, + find: function (selector) { + selector = selectorCache[selector] = selectorCache[selector] || new Selector(selector); + return selector.find(this); + }, + add: function (items) { + var self = this; + self.items().add(self.create(items)).parent(self); + return self; + }, + focus: function (keyboard) { + var self = this; + var focusCtrl, keyboardNav, items; + if (keyboard) { + keyboardNav = self.keyboardNav || self.parents().eq(-1)[0].keyboardNav; + if (keyboardNav) { + keyboardNav.focusFirst(self); + return; + } + } + items = self.find('*'); + if (self.statusbar) { + items.add(self.statusbar.items()); + } + items.each(function (ctrl) { + if (ctrl.settings.autofocus) { + focusCtrl = null; + return false; + } + if (ctrl.canFocus) { + focusCtrl = focusCtrl || ctrl; + } + }); + if (focusCtrl) { + focusCtrl.focus(); + } + return self; + }, + replace: function (oldItem, newItem) { + var ctrlElm; + var items = this.items(); + var i = items.length; + while (i--) { + if (items[i] === oldItem) { + items[i] = newItem; + break; + } + } + if (i >= 0) { + ctrlElm = newItem.getEl(); + if (ctrlElm) { + ctrlElm.parentNode.removeChild(ctrlElm); + } + ctrlElm = oldItem.getEl(); + if (ctrlElm) { + ctrlElm.parentNode.removeChild(ctrlElm); + } + } + newItem.parent(this); + }, + create: function (items) { + var self = this; + var settings; + var ctrlItems = []; + if (!global$4.isArray(items)) { + items = [items]; + } + global$4.each(items, function (item) { + if (item) { + if (!(item instanceof Control$1)) { + if (typeof item === 'string') { + item = { type: item }; + } + settings = global$4.extend({}, self.settings.defaults, item); + item.type = settings.type = settings.type || item.type || self.settings.defaultType || (settings.defaults ? settings.defaults.type : null); + item = global$b.create(settings); + } + ctrlItems.push(item); + } + }); + return ctrlItems; + }, + renderNew: function () { + var self = this; + self.items().each(function (ctrl, index) { + var containerElm; + ctrl.parent(self); + if (!ctrl.state.get('rendered')) { + containerElm = self.getEl('body'); + if (containerElm.hasChildNodes() && index <= containerElm.childNodes.length - 1) { + global$7(containerElm.childNodes[index]).before(ctrl.renderHtml()); + } else { + global$7(containerElm).append(ctrl.renderHtml()); + } + ctrl.postRender(); + ReflowQueue.add(ctrl); + } + }); + self._layout.applyClasses(self.items().filter(':visible')); + self._lastRect = null; + return self; + }, + append: function (items) { + return this.add(items).renderNew(); + }, + prepend: function (items) { + var self = this; + self.items().set(self.create(items).concat(self.items().toArray())); + return self.renderNew(); + }, + insert: function (items, index, before) { + var self = this; + var curItems, beforeItems, afterItems; + items = self.create(items); + curItems = self.items(); + if (!before && index < curItems.length - 1) { + index += 1; + } + if (index >= 0 && index < curItems.length) { + beforeItems = curItems.slice(0, index).toArray(); + afterItems = curItems.slice(index).toArray(); + curItems.set(beforeItems.concat(items, afterItems)); + } + return self.renderNew(); + }, + fromJSON: function (data) { + var self = this; + for (var name in data) { + self.find('#' + name).value(data[name]); + } + return self; + }, + toJSON: function () { + var self = this, data = {}; + self.find('*').each(function (ctrl) { + var name = ctrl.name(), value = ctrl.value(); + if (name && typeof value !== 'undefined') { + data[name] = value; + } + }); + return data; + }, + renderHtml: function () { + var self = this, layout = self._layout, role = this.settings.role; + self.preRender(); + layout.preRender(self); + return '<div id="' + self._id + '" class="' + self.classes + '"' + (role ? ' role="' + this.settings.role + '"' : '') + '>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>'; + }, + postRender: function () { + var self = this; + var box; + self.items().exec('postRender'); + self._super(); + self._layout.postRender(self); + self.state.set('rendered', true); + if (self.settings.style) { + self.$el.css(self.settings.style); + } + if (self.settings.border) { + box = self.borderBox; + self.$el.css({ + 'border-top-width': box.top, + 'border-right-width': box.right, + 'border-bottom-width': box.bottom, + 'border-left-width': box.left + }); + } + if (!self.parent()) { + self.keyboardNav = KeyboardNavigation({ root: self }); + } + return self; + }, + initLayoutRect: function () { + var self = this, layoutRect = self._super(); + self._layout.recalc(self); + return layoutRect; + }, + recalc: function () { + var self = this; + var rect = self._layoutRect; + var lastRect = self._lastRect; + if (!lastRect || lastRect.w !== rect.w || lastRect.h !== rect.h) { + self._layout.recalc(self); + rect = self.layoutRect(); + self._lastRect = { + x: rect.x, + y: rect.y, + w: rect.w, + h: rect.h + }; + return true; + } + }, + reflow: function () { + var i; + ReflowQueue.remove(this); + if (this.visible()) { + Control$1.repaintControls = []; + Control$1.repaintControls.map = {}; + this.recalc(); + i = Control$1.repaintControls.length; + while (i--) { + Control$1.repaintControls[i].repaint(); + } + if (this.settings.layout !== 'flow' && this.settings.layout !== 'stack') { + this.repaint(); + } + Control$1.repaintControls = []; + } + return this; + } + }); + + var Scrollable = { + init: function () { + var self = this; + self.on('repaint', self.renderScroll); + }, + renderScroll: function () { + var self = this, margin = 2; + function repaintScroll() { + var hasScrollH, hasScrollV, bodyElm; + function repaintAxis(axisName, posName, sizeName, contentSizeName, hasScroll, ax) { + var containerElm, scrollBarElm, scrollThumbElm; + var containerSize, scrollSize, ratio, rect; + var posNameLower, sizeNameLower; + scrollBarElm = self.getEl('scroll' + axisName); + if (scrollBarElm) { + posNameLower = posName.toLowerCase(); + sizeNameLower = sizeName.toLowerCase(); + global$7(self.getEl('absend')).css(posNameLower, self.layoutRect()[contentSizeName] - 1); + if (!hasScroll) { + global$7(scrollBarElm).css('display', 'none'); + return; + } + global$7(scrollBarElm).css('display', 'block'); + containerElm = self.getEl('body'); + scrollThumbElm = self.getEl('scroll' + axisName + 't'); + containerSize = containerElm['client' + sizeName] - margin * 2; + containerSize -= hasScrollH && hasScrollV ? scrollBarElm['client' + ax] : 0; + scrollSize = containerElm['scroll' + sizeName]; + ratio = containerSize / scrollSize; + rect = {}; + rect[posNameLower] = containerElm['offset' + posName] + margin; + rect[sizeNameLower] = containerSize; + global$7(scrollBarElm).css(rect); + rect = {}; + rect[posNameLower] = containerElm['scroll' + posName] * ratio; + rect[sizeNameLower] = containerSize * ratio; + global$7(scrollThumbElm).css(rect); + } + } + bodyElm = self.getEl('body'); + hasScrollH = bodyElm.scrollWidth > bodyElm.clientWidth; + hasScrollV = bodyElm.scrollHeight > bodyElm.clientHeight; + repaintAxis('h', 'Left', 'Width', 'contentW', hasScrollH, 'Height'); + repaintAxis('v', 'Top', 'Height', 'contentH', hasScrollV, 'Width'); + } + function addScroll() { + function addScrollAxis(axisName, posName, sizeName, deltaPosName, ax) { + var scrollStart; + var axisId = self._id + '-scroll' + axisName, prefix = self.classPrefix; + global$7(self.getEl()).append('<div id="' + axisId + '" class="' + prefix + 'scrollbar ' + prefix + 'scrollbar-' + axisName + '">' + '<div id="' + axisId + 't" class="' + prefix + 'scrollbar-thumb"></div>' + '</div>'); + self.draghelper = new DragHelper(axisId + 't', { + start: function () { + scrollStart = self.getEl('body')['scroll' + posName]; + global$7('#' + axisId).addClass(prefix + 'active'); + }, + drag: function (e) { + var ratio, hasScrollH, hasScrollV, containerSize; + var layoutRect = self.layoutRect(); + hasScrollH = layoutRect.contentW > layoutRect.innerW; + hasScrollV = layoutRect.contentH > layoutRect.innerH; + containerSize = self.getEl('body')['client' + sizeName] - margin * 2; + containerSize -= hasScrollH && hasScrollV ? self.getEl('scroll' + axisName)['client' + ax] : 0; + ratio = containerSize / self.getEl('body')['scroll' + sizeName]; + self.getEl('body')['scroll' + posName] = scrollStart + e['delta' + deltaPosName] / ratio; + }, + stop: function () { + global$7('#' + axisId).removeClass(prefix + 'active'); + } + }); + } + self.classes.add('scroll'); + addScrollAxis('v', 'Top', 'Height', 'Y', 'Width'); + addScrollAxis('h', 'Left', 'Width', 'X', 'Height'); + } + if (self.settings.autoScroll) { + if (!self._hasScroll) { + self._hasScroll = true; + addScroll(); + self.on('wheel', function (e) { + var bodyEl = self.getEl('body'); + bodyEl.scrollLeft += (e.deltaX || 0) * 10; + bodyEl.scrollTop += e.deltaY * 10; + repaintScroll(); + }); + global$7(self.getEl('body')).on('scroll', repaintScroll); + } + repaintScroll(); + } + } + }; + + var Panel = Container.extend({ + Defaults: { + layout: 'fit', + containerCls: 'panel' + }, + Mixins: [Scrollable], + renderHtml: function () { + var self = this; + var layout = self._layout; + var innerHtml = self.settings.html; + self.preRender(); + layout.preRender(self); + if (typeof innerHtml === 'undefined') { + innerHtml = '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>'; + } else { + if (typeof innerHtml === 'function') { + innerHtml = innerHtml.call(self); + } + self._hasBody = false; + } + return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1" role="group">' + (self._preBodyHtml || '') + innerHtml + '</div>'; + } + }); + + var Resizable = { + resizeToContent: function () { + this._layoutRect.autoResize = true; + this._lastRect = null; + this.reflow(); + }, + resizeTo: function (w, h) { + if (w <= 1 || h <= 1) { + var rect = funcs.getWindowSize(); + w = w <= 1 ? w * rect.w : w; + h = h <= 1 ? h * rect.h : h; + } + this._layoutRect.autoResize = false; + return this.layoutRect({ + minW: w, + minH: h, + w: w, + h: h + }).reflow(); + }, + resizeBy: function (dw, dh) { + var self = this, rect = self.layoutRect(); + return self.resizeTo(rect.w + dw, rect.h + dh); + } + }; + + var documentClickHandler, documentScrollHandler, windowResizeHandler; + var visiblePanels = []; + var zOrder = []; + var hasModal; + function isChildOf(ctrl, parent) { + while (ctrl) { + if (ctrl === parent) { + return true; + } + ctrl = ctrl.parent(); + } + } + function skipOrHidePanels(e) { + var i = visiblePanels.length; + while (i--) { + var panel = visiblePanels[i], clickCtrl = panel.getParentCtrl(e.target); + if (panel.settings.autohide) { + if (clickCtrl) { + if (isChildOf(clickCtrl, panel) || panel.parent() === clickCtrl) { + continue; + } + } + e = panel.fire('autohide', { target: e.target }); + if (!e.isDefaultPrevented()) { + panel.hide(); + } + } + } + } + function bindDocumentClickHandler() { + if (!documentClickHandler) { + documentClickHandler = function (e) { + if (e.button === 2) { + return; + } + skipOrHidePanels(e); + }; + global$7(domGlobals.document).on('click touchstart', documentClickHandler); + } + } + function bindDocumentScrollHandler() { + if (!documentScrollHandler) { + documentScrollHandler = function () { + var i; + i = visiblePanels.length; + while (i--) { + repositionPanel$1(visiblePanels[i]); + } + }; + global$7(domGlobals.window).on('scroll', documentScrollHandler); + } + } + function bindWindowResizeHandler() { + if (!windowResizeHandler) { + var docElm_1 = domGlobals.document.documentElement; + var clientWidth_1 = docElm_1.clientWidth, clientHeight_1 = docElm_1.clientHeight; + windowResizeHandler = function () { + if (!domGlobals.document.all || clientWidth_1 !== docElm_1.clientWidth || clientHeight_1 !== docElm_1.clientHeight) { + clientWidth_1 = docElm_1.clientWidth; + clientHeight_1 = docElm_1.clientHeight; + FloatPanel.hideAll(); + } + }; + global$7(domGlobals.window).on('resize', windowResizeHandler); + } + } + function repositionPanel$1(panel) { + var scrollY = funcs.getViewPort().y; + function toggleFixedChildPanels(fixed, deltaY) { + var parent; + for (var i = 0; i < visiblePanels.length; i++) { + if (visiblePanels[i] !== panel) { + parent = visiblePanels[i].parent(); + while (parent && (parent = parent.parent())) { + if (parent === panel) { + visiblePanels[i].fixed(fixed).moveBy(0, deltaY).repaint(); + } + } + } + } + } + if (panel.settings.autofix) { + if (!panel.state.get('fixed')) { + panel._autoFixY = panel.layoutRect().y; + if (panel._autoFixY < scrollY) { + panel.fixed(true).layoutRect({ y: 0 }).repaint(); + toggleFixedChildPanels(true, scrollY - panel._autoFixY); + } + } else { + if (panel._autoFixY > scrollY) { + panel.fixed(false).layoutRect({ y: panel._autoFixY }).repaint(); + toggleFixedChildPanels(false, panel._autoFixY - scrollY); + } + } + } + } + function addRemove(add, ctrl) { + var i, zIndex = FloatPanel.zIndex || 65535, topModal; + if (add) { + zOrder.push(ctrl); + } else { + i = zOrder.length; + while (i--) { + if (zOrder[i] === ctrl) { + zOrder.splice(i, 1); + } + } + } + if (zOrder.length) { + for (i = 0; i < zOrder.length; i++) { + if (zOrder[i].modal) { + zIndex++; + topModal = zOrder[i]; + } + zOrder[i].getEl().style.zIndex = zIndex; + zOrder[i].zIndex = zIndex; + zIndex++; + } + } + var modalBlockEl = global$7('#' + ctrl.classPrefix + 'modal-block', ctrl.getContainerElm())[0]; + if (topModal) { + global$7(modalBlockEl).css('z-index', topModal.zIndex - 1); + } else if (modalBlockEl) { + modalBlockEl.parentNode.removeChild(modalBlockEl); + hasModal = false; + } + FloatPanel.currentZIndex = zIndex; + } + var FloatPanel = Panel.extend({ + Mixins: [ + Movable, + Resizable + ], + init: function (settings) { + var self = this; + self._super(settings); + self._eventsRoot = self; + self.classes.add('floatpanel'); + if (settings.autohide) { + bindDocumentClickHandler(); + bindWindowResizeHandler(); + visiblePanels.push(self); + } + if (settings.autofix) { + bindDocumentScrollHandler(); + self.on('move', function () { + repositionPanel$1(this); + }); + } + self.on('postrender show', function (e) { + if (e.control === self) { + var $modalBlockEl_1; + var prefix_1 = self.classPrefix; + if (self.modal && !hasModal) { + $modalBlockEl_1 = global$7('#' + prefix_1 + 'modal-block', self.getContainerElm()); + if (!$modalBlockEl_1[0]) { + $modalBlockEl_1 = global$7('<div id="' + prefix_1 + 'modal-block" class="' + prefix_1 + 'reset ' + prefix_1 + 'fade"></div>').appendTo(self.getContainerElm()); + } + global$3.setTimeout(function () { + $modalBlockEl_1.addClass(prefix_1 + 'in'); + global$7(self.getEl()).addClass(prefix_1 + 'in'); + }); + hasModal = true; + } + addRemove(true, self); + } + }); + self.on('show', function () { + self.parents().each(function (ctrl) { + if (ctrl.state.get('fixed')) { + self.fixed(true); + return false; + } + }); + }); + if (settings.popover) { + self._preBodyHtml = '<div class="' + self.classPrefix + 'arrow"></div>'; + self.classes.add('popover').add('bottom').add(self.isRtl() ? 'end' : 'start'); + } + self.aria('label', settings.ariaLabel); + self.aria('labelledby', self._id); + self.aria('describedby', self.describedBy || self._id + '-none'); + }, + fixed: function (state) { + var self = this; + if (self.state.get('fixed') !== state) { + if (self.state.get('rendered')) { + var viewport = funcs.getViewPort(); + if (state) { + self.layoutRect().y -= viewport.y; + } else { + self.layoutRect().y += viewport.y; + } + } + self.classes.toggle('fixed', state); + self.state.set('fixed', state); + } + return self; + }, + show: function () { + var self = this; + var i; + var state = self._super(); + i = visiblePanels.length; + while (i--) { + if (visiblePanels[i] === self) { + break; + } + } + if (i === -1) { + visiblePanels.push(self); + } + return state; + }, + hide: function () { + removeVisiblePanel(this); + addRemove(false, this); + return this._super(); + }, + hideAll: function () { + FloatPanel.hideAll(); + }, + close: function () { + var self = this; + if (!self.fire('close').isDefaultPrevented()) { + self.remove(); + addRemove(false, self); + } + return self; + }, + remove: function () { + removeVisiblePanel(this); + this._super(); + }, + postRender: function () { + var self = this; + if (self.settings.bodyRole) { + this.getEl('body').setAttribute('role', self.settings.bodyRole); + } + return self._super(); + } + }); + FloatPanel.hideAll = function () { + var i = visiblePanels.length; + while (i--) { + var panel = visiblePanels[i]; + if (panel && panel.settings.autohide) { + panel.hide(); + visiblePanels.splice(i, 1); + } + } + }; + function removeVisiblePanel(panel) { + var i; + i = visiblePanels.length; + while (i--) { + if (visiblePanels[i] === panel) { + visiblePanels.splice(i, 1); + } + } + i = zOrder.length; + while (i--) { + if (zOrder[i] === panel) { + zOrder.splice(i, 1); + } + } + } + + var windows = []; + var oldMetaValue = ''; + function toggleFullScreenState(state) { + var noScaleMetaValue = 'width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0'; + var viewport = global$7('meta[name=viewport]')[0], contentValue; + if (global$1.overrideViewPort === false) { + return; + } + if (!viewport) { + viewport = domGlobals.document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + domGlobals.document.getElementsByTagName('head')[0].appendChild(viewport); + } + contentValue = viewport.getAttribute('content'); + if (contentValue && typeof oldMetaValue !== 'undefined') { + oldMetaValue = contentValue; + } + viewport.setAttribute('content', state ? noScaleMetaValue : oldMetaValue); + } + function toggleBodyFullScreenClasses(classPrefix, state) { + if (checkFullscreenWindows() && state === false) { + global$7([ + domGlobals.document.documentElement, + domGlobals.document.body + ]).removeClass(classPrefix + 'fullscreen'); + } + } + function checkFullscreenWindows() { + for (var i = 0; i < windows.length; i++) { + if (windows[i]._fullscreen) { + return true; + } + } + return false; + } + function handleWindowResize() { + if (!global$1.desktop) { + var lastSize_1 = { + w: domGlobals.window.innerWidth, + h: domGlobals.window.innerHeight + }; + global$3.setInterval(function () { + var w = domGlobals.window.innerWidth, h = domGlobals.window.innerHeight; + if (lastSize_1.w !== w || lastSize_1.h !== h) { + lastSize_1 = { + w: w, + h: h + }; + global$7(domGlobals.window).trigger('resize'); + } + }, 100); + } + function reposition() { + var i; + var rect = funcs.getWindowSize(); + var layoutRect; + for (i = 0; i < windows.length; i++) { + layoutRect = windows[i].layoutRect(); + windows[i].moveTo(windows[i].settings.x || Math.max(0, rect.w / 2 - layoutRect.w / 2), windows[i].settings.y || Math.max(0, rect.h / 2 - layoutRect.h / 2)); + } + } + global$7(domGlobals.window).on('resize', reposition); + } + var Window = FloatPanel.extend({ + modal: true, + Defaults: { + border: 1, + layout: 'flex', + containerCls: 'panel', + role: 'dialog', + callbacks: { + submit: function () { + this.fire('submit', { data: this.toJSON() }); + }, + close: function () { + this.close(); + } + } + }, + init: function (settings) { + var self = this; + self._super(settings); + if (self.isRtl()) { + self.classes.add('rtl'); + } + self.classes.add('window'); + self.bodyClasses.add('window-body'); + self.state.set('fixed', true); + if (settings.buttons) { + self.statusbar = new Panel({ + layout: 'flex', + border: '1 0 0 0', + spacing: 3, + padding: 10, + align: 'center', + pack: self.isRtl() ? 'start' : 'end', + defaults: { type: 'button' }, + items: settings.buttons + }); + self.statusbar.classes.add('foot'); + self.statusbar.parent(self); + } + self.on('click', function (e) { + var closeClass = self.classPrefix + 'close'; + if (funcs.hasClass(e.target, closeClass) || funcs.hasClass(e.target.parentNode, closeClass)) { + self.close(); + } + }); + self.on('cancel', function () { + self.close(); + }); + self.on('move', function (e) { + if (e.control === self) { + FloatPanel.hideAll(); + } + }); + self.aria('describedby', self.describedBy || self._id + '-none'); + self.aria('label', settings.title); + self._fullscreen = false; + }, + recalc: function () { + var self = this; + var statusbar = self.statusbar; + var layoutRect, width, x, needsRecalc; + if (self._fullscreen) { + self.layoutRect(funcs.getWindowSize()); + self.layoutRect().contentH = self.layoutRect().innerH; + } + self._super(); + layoutRect = self.layoutRect(); + if (self.settings.title && !self._fullscreen) { + width = layoutRect.headerW; + if (width > layoutRect.w) { + x = layoutRect.x - Math.max(0, width / 2); + self.layoutRect({ + w: width, + x: x + }); + needsRecalc = true; + } + } + if (statusbar) { + statusbar.layoutRect({ w: self.layoutRect().innerW }).recalc(); + width = statusbar.layoutRect().minW + layoutRect.deltaW; + if (width > layoutRect.w) { + x = layoutRect.x - Math.max(0, width - layoutRect.w); + self.layoutRect({ + w: width, + x: x + }); + needsRecalc = true; + } + } + if (needsRecalc) { + self.recalc(); + } + }, + initLayoutRect: function () { + var self = this; + var layoutRect = self._super(); + var deltaH = 0, headEl; + if (self.settings.title && !self._fullscreen) { + headEl = self.getEl('head'); + var size = funcs.getSize(headEl); + layoutRect.headerW = size.width; + layoutRect.headerH = size.height; + deltaH += layoutRect.headerH; + } + if (self.statusbar) { + deltaH += self.statusbar.layoutRect().h; + } + layoutRect.deltaH += deltaH; + layoutRect.minH += deltaH; + layoutRect.h += deltaH; + var rect = funcs.getWindowSize(); + layoutRect.x = self.settings.x || Math.max(0, rect.w / 2 - layoutRect.w / 2); + layoutRect.y = self.settings.y || Math.max(0, rect.h / 2 - layoutRect.h / 2); + return layoutRect; + }, + renderHtml: function () { + var self = this, layout = self._layout, id = self._id, prefix = self.classPrefix; + var settings = self.settings; + var headerHtml = '', footerHtml = '', html = settings.html; + self.preRender(); + layout.preRender(self); + if (settings.title) { + headerHtml = '<div id="' + id + '-head" class="' + prefix + 'window-head">' + '<div id="' + id + '-title" class="' + prefix + 'title">' + self.encode(settings.title) + '</div>' + '<div id="' + id + '-dragh" class="' + prefix + 'dragh"></div>' + '<button type="button" class="' + prefix + 'close" aria-hidden="true">' + '<i class="mce-ico mce-i-remove"></i>' + '</button>' + '</div>'; + } + if (settings.url) { + html = '<iframe src="' + settings.url + '" tabindex="-1"></iframe>'; + } + if (typeof html === 'undefined') { + html = layout.renderHtml(self); + } + if (self.statusbar) { + footerHtml = self.statusbar.renderHtml(); + } + return '<div id="' + id + '" class="' + self.classes + '" hidefocus="1">' + '<div class="' + self.classPrefix + 'reset" role="application">' + headerHtml + '<div id="' + id + '-body" class="' + self.bodyClasses + '">' + html + '</div>' + footerHtml + '</div>' + '</div>'; + }, + fullscreen: function (state) { + var self = this; + var documentElement = domGlobals.document.documentElement; + var slowRendering; + var prefix = self.classPrefix; + var layoutRect; + if (state !== self._fullscreen) { + global$7(domGlobals.window).on('resize', function () { + var time; + if (self._fullscreen) { + if (!slowRendering) { + time = new Date().getTime(); + var rect = funcs.getWindowSize(); + self.moveTo(0, 0).resizeTo(rect.w, rect.h); + if (new Date().getTime() - time > 50) { + slowRendering = true; + } + } else { + if (!self._timer) { + self._timer = global$3.setTimeout(function () { + var rect = funcs.getWindowSize(); + self.moveTo(0, 0).resizeTo(rect.w, rect.h); + self._timer = 0; + }, 50); + } + } + } + }); + layoutRect = self.layoutRect(); + self._fullscreen = state; + if (!state) { + self.borderBox = BoxUtils.parseBox(self.settings.border); + self.getEl('head').style.display = ''; + layoutRect.deltaH += layoutRect.headerH; + global$7([ + documentElement, + domGlobals.document.body + ]).removeClass(prefix + 'fullscreen'); + self.classes.remove('fullscreen'); + self.moveTo(self._initial.x, self._initial.y).resizeTo(self._initial.w, self._initial.h); + } else { + self._initial = { + x: layoutRect.x, + y: layoutRect.y, + w: layoutRect.w, + h: layoutRect.h + }; + self.borderBox = BoxUtils.parseBox('0'); + self.getEl('head').style.display = 'none'; + layoutRect.deltaH -= layoutRect.headerH + 2; + global$7([ + documentElement, + domGlobals.document.body + ]).addClass(prefix + 'fullscreen'); + self.classes.add('fullscreen'); + var rect = funcs.getWindowSize(); + self.moveTo(0, 0).resizeTo(rect.w, rect.h); + } + } + return self.reflow(); + }, + postRender: function () { + var self = this; + var startPos; + setTimeout(function () { + self.classes.add('in'); + self.fire('open'); + }, 0); + self._super(); + if (self.statusbar) { + self.statusbar.postRender(); + } + self.focus(); + this.dragHelper = new DragHelper(self._id + '-dragh', { + start: function () { + startPos = { + x: self.layoutRect().x, + y: self.layoutRect().y + }; + }, + drag: function (e) { + self.moveTo(startPos.x + e.deltaX, startPos.y + e.deltaY); + } + }); + self.on('submit', function (e) { + if (!e.isDefaultPrevented()) { + self.close(); + } + }); + windows.push(self); + toggleFullScreenState(true); + }, + submit: function () { + return this.fire('submit', { data: this.toJSON() }); + }, + remove: function () { + var self = this; + var i; + self.dragHelper.destroy(); + self._super(); + if (self.statusbar) { + this.statusbar.remove(); + } + toggleBodyFullScreenClasses(self.classPrefix, false); + i = windows.length; + while (i--) { + if (windows[i] === self) { + windows.splice(i, 1); + } + } + toggleFullScreenState(windows.length > 0); + }, + getContentWindow: function () { + var ifr = this.getEl().getElementsByTagName('iframe')[0]; + return ifr ? ifr.contentWindow : null; + } + }); + handleWindowResize(); + + var MessageBox = Window.extend({ + init: function (settings) { + settings = { + border: 1, + padding: 20, + layout: 'flex', + pack: 'center', + align: 'center', + containerCls: 'panel', + autoScroll: true, + buttons: { + type: 'button', + text: 'Ok', + action: 'ok' + }, + items: { + type: 'label', + multiline: true, + maxWidth: 500, + maxHeight: 200 + } + }; + this._super(settings); + }, + Statics: { + OK: 1, + OK_CANCEL: 2, + YES_NO: 3, + YES_NO_CANCEL: 4, + msgBox: function (settings) { + var buttons; + var callback = settings.callback || function () { + }; + function createButton(text, status, primary) { + return { + type: 'button', + text: text, + subtype: primary ? 'primary' : '', + onClick: function (e) { + e.control.parents()[1].close(); + callback(status); + } + }; + } + switch (settings.buttons) { + case MessageBox.OK_CANCEL: + buttons = [ + createButton('Ok', true, true), + createButton('Cancel', false) + ]; + break; + case MessageBox.YES_NO: + case MessageBox.YES_NO_CANCEL: + buttons = [ + createButton('Yes', 1, true), + createButton('No', 0) + ]; + if (settings.buttons === MessageBox.YES_NO_CANCEL) { + buttons.push(createButton('Cancel', -1)); + } + break; + default: + buttons = [createButton('Ok', true, true)]; + break; + } + return new Window({ + padding: 20, + x: settings.x, + y: settings.y, + minWidth: 300, + minHeight: 100, + layout: 'flex', + pack: 'center', + align: 'center', + buttons: buttons, + title: settings.title, + role: 'alertdialog', + items: { + type: 'label', + multiline: true, + maxWidth: 500, + maxHeight: 200, + text: settings.text + }, + onPostRender: function () { + this.aria('describedby', this.items()[0]._id); + }, + onClose: settings.onClose, + onCancel: function () { + callback(false); + } + }).renderTo(domGlobals.document.body).reflow(); + }, + alert: function (settings, callback) { + if (typeof settings === 'string') { + settings = { text: settings }; + } + settings.callback = callback; + return MessageBox.msgBox(settings); + }, + confirm: function (settings, callback) { + if (typeof settings === 'string') { + settings = { text: settings }; + } + settings.callback = callback; + settings.buttons = MessageBox.OK_CANCEL; + return MessageBox.msgBox(settings); + } + } + }); + + function WindowManagerImpl (editor) { + var open = function (args, params, closeCallback) { + var win; + args.title = args.title || ' '; + args.url = args.url || args.file; + if (args.url) { + args.width = parseInt(args.width || 320, 10); + args.height = parseInt(args.height || 240, 10); + } + if (args.body) { + args.items = { + defaults: args.defaults, + type: args.bodyType || 'form', + items: args.body, + data: args.data, + callbacks: args.commands + }; + } + if (!args.url && !args.buttons) { + args.buttons = [ + { + text: 'Ok', + subtype: 'primary', + onclick: function () { + win.find('form')[0].submit(); + } + }, + { + text: 'Cancel', + onclick: function () { + win.close(); + } + } + ]; + } + win = new Window(args); + win.on('close', function () { + closeCallback(win); + }); + if (args.data) { + win.on('postRender', function () { + this.find('*').each(function (ctrl) { + var name = ctrl.name(); + if (name in args.data) { + ctrl.value(args.data[name]); + } + }); + }); + } + win.features = args || {}; + win.params = params || {}; + win = win.renderTo(domGlobals.document.body).reflow(); + return win; + }; + var alert = function (message, choiceCallback, closeCallback) { + var win; + win = MessageBox.alert(message, function () { + choiceCallback(); + }); + win.on('close', function () { + closeCallback(win); + }); + return win; + }; + var confirm = function (message, choiceCallback, closeCallback) { + var win; + win = MessageBox.confirm(message, function (state) { + choiceCallback(state); + }); + win.on('close', function () { + closeCallback(win); + }); + return win; + }; + var close = function (window) { + window.close(); + }; + var getParams = function (window) { + return window.params; + }; + var setParams = function (window, params) { + window.params = params; + }; + return { + open: open, + alert: alert, + confirm: confirm, + close: close, + getParams: getParams, + setParams: setParams + }; + } + + var get = function (editor, panel) { + var renderUI = function () { + return Render.renderUI(editor, panel); + }; + return { + renderUI: renderUI, + getNotificationManagerImpl: function () { + return NotificationManagerImpl(editor); + }, + getWindowManagerImpl: function () { + return WindowManagerImpl(); + } + }; + }; + var ThemeApi = { get: get }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var path = function (parts, scope) { + var o = scope !== undefined && scope !== null ? scope : Global; + for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + var resolve = function (p, scope) { + var parts = p.split('.'); + return path(parts, scope); + }; + + var unsafe = function (name, scope) { + return resolve(name, scope); + }; + var getOrDie = function (name, scope) { + var actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + var Global$1 = { getOrDie: getOrDie }; + + function FileReader () { + var f = Global$1.getOrDie('FileReader'); + return new f(); + } + + var global$c = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var blobToBase64 = function (blob) { + return new global$c(function (resolve) { + var reader = FileReader(); + reader.onloadend = function () { + resolve(reader.result.split(',')[1]); + }; + reader.readAsDataURL(blob); + }); + }; + var Conversions = { blobToBase64: blobToBase64 }; + + var pickFile = function () { + return new global$c(function (resolve) { + var fileInput; + fileInput = domGlobals.document.createElement('input'); + fileInput.type = 'file'; + fileInput.style.position = 'fixed'; + fileInput.style.left = 0; + fileInput.style.top = 0; + fileInput.style.opacity = 0.001; + domGlobals.document.body.appendChild(fileInput); + fileInput.onchange = function (e) { + resolve(Array.prototype.slice.call(e.target.files)); + }; + fileInput.click(); + fileInput.parentNode.removeChild(fileInput); + }); + }; + var Picker = { pickFile: pickFile }; + + var count$1 = 0; + var seed = function () { + var rnd = function () { + return Math.round(Math.random() * 4294967295).toString(36); + }; + return 's' + Date.now().toString(36) + rnd() + rnd() + rnd(); + }; + var uuid = function (prefix) { + return prefix + count$1++ + seed(); + }; + var Uuid = { uuid: uuid }; + + var create$1 = function (dom, rng) { + var bookmark = {}; + function setupEndPoint(start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = dom.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + dom.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolve$1 = function (dom, bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + function nodeIndex(container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + } + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + dom.remove(node); + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = dom.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return rng; + }; + var Bookmark = { + create: create$1, + resolve: resolve$1 + }; + + var global$d = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$e = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var getSelectedElements = function (rootElm, startNode, endNode) { + var walker, node; + var elms = []; + walker = new global$d(startNode, rootElm); + for (node = startNode; node; node = walker.next()) { + if (node.nodeType === 1) { + elms.push(node); + } + if (node === endNode) { + break; + } + } + return elms; + }; + var unwrapElements = function (editor, elms) { + var bookmark, dom, selection; + dom = editor.dom; + selection = editor.selection; + bookmark = Bookmark.create(dom, selection.getRng()); + global$4.each(elms, function (elm) { + editor.dom.remove(elm, true); + }); + selection.setRng(Bookmark.resolve(dom, bookmark)); + }; + var isLink = function (elm) { + return elm.nodeName === 'A' && elm.hasAttribute('href'); + }; + var getParentAnchorOrSelf = function (dom, elm) { + var anchorElm = dom.getParent(elm, isLink); + return anchorElm ? anchorElm : elm; + }; + var getSelectedAnchors = function (editor) { + var startElm, endElm, rootElm, anchorElms, selection, dom, rng; + selection = editor.selection; + dom = editor.dom; + rng = selection.getRng(); + startElm = getParentAnchorOrSelf(dom, global$e.getNode(rng.startContainer, rng.startOffset)); + endElm = global$e.getNode(rng.endContainer, rng.endOffset); + rootElm = editor.getBody(); + anchorElms = global$4.grep(getSelectedElements(rootElm, startElm, endElm), isLink); + return anchorElms; + }; + var unlinkSelection = function (editor) { + unwrapElements(editor, getSelectedAnchors(editor)); + }; + var Unlink = { unlinkSelection: unlinkSelection }; + + var createTableHtml = function (cols, rows) { + var x, y, html; + html = '<table data-mce-id="mce" style="width: 100%">'; + html += '<tbody>'; + for (y = 0; y < rows; y++) { + html += '<tr>'; + for (x = 0; x < cols; x++) { + html += '<td><br></td>'; + } + html += '</tr>'; + } + html += '</tbody>'; + html += '</table>'; + return html; + }; + var getInsertedElement = function (editor) { + var elms = editor.dom.select('*[data-mce-id]'); + return elms[0]; + }; + var insertTableHtml = function (editor, cols, rows) { + editor.undoManager.transact(function () { + var tableElm, cellElm; + editor.insertContent(createTableHtml(cols, rows)); + tableElm = getInsertedElement(editor); + tableElm.removeAttribute('data-mce-id'); + cellElm = editor.dom.select('td,th', tableElm); + editor.selection.setCursorLocation(cellElm[0], 0); + }); + }; + var insertTable = function (editor, cols, rows) { + editor.plugins.table ? editor.plugins.table.insertTable(cols, rows) : insertTableHtml(editor, cols, rows); + }; + var formatBlock = function (editor, formatName) { + editor.execCommand('FormatBlock', false, formatName); + }; + var insertBlob = function (editor, base64, blob) { + var blobCache, blobInfo; + blobCache = editor.editorUpload.blobCache; + blobInfo = blobCache.create(Uuid.uuid('mceu'), blob, base64); + blobCache.add(blobInfo); + editor.insertContent(editor.dom.createHTML('img', { src: blobInfo.blobUri() })); + }; + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var unlink = function (editor) { + editor.focus(); + Unlink.unlinkSelection(editor); + collapseSelectionToEnd(editor); + }; + var changeHref = function (editor, elm, url) { + editor.focus(); + editor.dom.setAttrib(elm, 'href', url); + collapseSelectionToEnd(editor); + }; + var insertLink = function (editor, url) { + editor.execCommand('mceInsertLink', false, { href: url }); + collapseSelectionToEnd(editor); + }; + var updateOrInsertLink = function (editor, url) { + var elm = editor.dom.getParent(editor.selection.getStart(), 'a[href]'); + elm ? changeHref(editor, elm, url) : insertLink(editor, url); + }; + var createLink = function (editor, url) { + url.trim().length === 0 ? unlink(editor) : updateOrInsertLink(editor, url); + }; + var Actions = { + insertTable: insertTable, + formatBlock: formatBlock, + insertBlob: insertBlob, + createLink: createLink, + unlink: unlink + }; + + var addHeaderButtons = function (editor) { + var formatBlock = function (name) { + return function () { + Actions.formatBlock(editor, name); + }; + }; + for (var i = 1; i < 6; i++) { + var name = 'h' + i; + editor.addButton(name, { + text: name.toUpperCase(), + tooltip: 'Heading ' + i, + stateSelector: name, + onclick: formatBlock(name), + onPostRender: function () { + var span = this.getEl().firstChild.firstChild; + span.style.fontWeight = 'bold'; + } + }); + } + }; + var addToEditor = function (editor, panel) { + editor.addButton('quicklink', { + icon: 'link', + tooltip: 'Insert/Edit link', + stateSelector: 'a[href]', + onclick: function () { + panel.showForm(editor, 'quicklink'); + } + }); + editor.addButton('quickimage', { + icon: 'image', + tooltip: 'Insert image', + onclick: function () { + Picker.pickFile().then(function (files) { + var blob = files[0]; + Conversions.blobToBase64(blob).then(function (base64) { + Actions.insertBlob(editor, base64, blob); + }); + }); + } + }); + editor.addButton('quicktable', { + icon: 'table', + tooltip: 'Insert table', + onclick: function () { + panel.hide(); + Actions.insertTable(editor, 2, 2); + } + }); + addHeaderButtons(editor); + }; + var Buttons = { addToEditor: addToEditor }; + + var getUiContainerDelta$1 = function () { + var uiContainer = global$1.container; + if (uiContainer && global$2.DOM.getStyle(uiContainer, 'position', true) !== 'static') { + var containerPos = global$2.DOM.getPos(uiContainer); + var dx = containerPos.x - uiContainer.scrollLeft; + var dy = containerPos.y - uiContainer.scrollTop; + return Option.some({ + x: dx, + y: dy + }); + } else { + return Option.none(); + } + }; + var UiContainer$1 = { getUiContainerDelta: getUiContainerDelta$1 }; + + var isDomainLike = function (href) { + return /^www\.|\.(com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil)$/i.test(href.trim()); + }; + var isAbsolute = function (href) { + return /^https?:\/\//.test(href.trim()); + }; + var UrlType = { + isDomainLike: isDomainLike, + isAbsolute: isAbsolute + }; + + var focusFirstTextBox = function (form) { + form.find('textbox').eq(0).each(function (ctrl) { + ctrl.focus(); + }); + }; + var createForm = function (name, spec) { + var form = global$b.create(global$4.extend({ + type: 'form', + layout: 'flex', + direction: 'row', + padding: 5, + name: name, + spacing: 3 + }, spec)); + form.on('show', function () { + focusFirstTextBox(form); + }); + return form; + }; + var toggleVisibility = function (ctrl, state) { + return state ? ctrl.show() : ctrl.hide(); + }; + var askAboutPrefix = function (editor, href) { + return new global$c(function (resolve) { + editor.windowManager.confirm('The URL you entered seems to be an external link. Do you want to add the required http:// prefix?', function (result) { + var output = result === true ? 'http://' + href : href; + resolve(output); + }); + }); + }; + var convertLinkToAbsolute = function (editor, href) { + return !UrlType.isAbsolute(href) && UrlType.isDomainLike(href) ? askAboutPrefix(editor, href) : global$c.resolve(href); + }; + var createQuickLinkForm = function (editor, hide) { + var attachState = {}; + var unlink = function () { + editor.focus(); + Actions.unlink(editor); + hide(); + }; + var onChangeHandler = function (e) { + var meta = e.meta; + if (meta && meta.attach) { + attachState = { + href: this.value(), + attach: meta.attach + }; + } + }; + var onShowHandler = function (e) { + if (e.control === this) { + var elm = void 0, linkurl = ''; + elm = editor.dom.getParent(editor.selection.getStart(), 'a[href]'); + if (elm) { + linkurl = editor.dom.getAttrib(elm, 'href'); + } + this.fromJSON({ linkurl: linkurl }); + toggleVisibility(this.find('#unlink'), elm); + this.find('#linkurl')[0].focus(); + } + }; + return createForm('quicklink', { + items: [ + { + type: 'button', + name: 'unlink', + icon: 'unlink', + onclick: unlink, + tooltip: 'Remove link' + }, + { + type: 'filepicker', + name: 'linkurl', + placeholder: 'Paste or type a link', + filetype: 'file', + onchange: onChangeHandler + }, + { + type: 'button', + icon: 'checkmark', + subtype: 'primary', + tooltip: 'Ok', + onclick: 'submit' + } + ], + onshow: onShowHandler, + onsubmit: function (e) { + convertLinkToAbsolute(editor, e.data.linkurl).then(function (url) { + editor.undoManager.transact(function () { + if (url === attachState.href) { + attachState.attach(); + attachState = {}; + } + Actions.createLink(editor, url); + }); + hide(); + }); + } + }); + }; + var Forms = { createQuickLinkForm: createQuickLinkForm }; + + var getSelectorStateResult = function (itemName, item) { + var result = function (selector, handler) { + return { + selector: selector, + handler: handler + }; + }; + var activeHandler = function (state) { + item.active(state); + }; + var disabledHandler = function (state) { + item.disabled(state); + }; + if (item.settings.stateSelector) { + return result(item.settings.stateSelector, activeHandler); + } + if (item.settings.disabledStateSelector) { + return result(item.settings.disabledStateSelector, disabledHandler); + } + return null; + }; + var bindSelectorChanged = function (editor, itemName, item) { + return function () { + var result = getSelectorStateResult(itemName, item); + if (result !== null) { + editor.selection.selectorChanged(result.selector, result.handler); + } + }; + }; + var itemsToArray$1 = function (items) { + if (Type.isArray(items)) { + return items; + } else if (Type.isString(items)) { + return items.split(/[ ,]/); + } + return []; + }; + var create$2 = function (editor, name, items) { + var toolbarItems = []; + var buttonGroup; + if (!items) { + return; + } + global$4.each(itemsToArray$1(items), function (item) { + if (item === '|') { + buttonGroup = null; + } else { + if (editor.buttons[item]) { + if (!buttonGroup) { + buttonGroup = { + type: 'buttongroup', + items: [] + }; + toolbarItems.push(buttonGroup); + } + var button = editor.buttons[item]; + if (Type.isFunction(button)) { + button = button(); + } + button.type = button.type || 'button'; + button = global$b.create(button); + button.on('postRender', bindSelectorChanged(editor, item, button)); + buttonGroup.items.push(button); + } + } + }); + return global$b.create({ + type: 'toolbar', + layout: 'flow', + name: name, + items: toolbarItems + }); + }; + var Toolbar = { create: create$2 }; + + var create$3 = function () { + var panel, currentRect; + var createToolbars = function (editor, toolbars) { + return global$4.map(toolbars, function (toolbar) { + return Toolbar.create(editor, toolbar.id, toolbar.items); + }); + }; + var hasToolbarItems = function (toolbar) { + return toolbar.items().length > 0; + }; + var create = function (editor, toolbars) { + var items = createToolbars(editor, toolbars).concat([ + Toolbar.create(editor, 'text', Settings.getTextSelectionToolbarItems(editor)), + Toolbar.create(editor, 'insert', Settings.getInsertToolbarItems(editor)), + Forms.createQuickLinkForm(editor, hide) + ]); + return global$b.create({ + type: 'floatpanel', + role: 'dialog', + classes: 'tinymce tinymce-inline arrow', + ariaLabel: 'Inline toolbar', + layout: 'flex', + direction: 'column', + align: 'stretch', + autohide: false, + autofix: true, + fixed: true, + border: 1, + items: global$4.grep(items, hasToolbarItems), + oncancel: function () { + editor.focus(); + } + }); + }; + var showPanel = function (panel) { + if (panel) { + panel.show(); + } + }; + var movePanelTo = function (panel, pos) { + panel.moveTo(pos.x, pos.y); + }; + var togglePositionClass = function (panel, relPos) { + relPos = relPos ? relPos.substr(0, 2) : ''; + global$4.each({ + t: 'down', + b: 'up', + c: 'center' + }, function (cls, pos) { + panel.classes.toggle('arrow-' + cls, pos === relPos.substr(0, 1)); + }); + if (relPos === 'cr') { + panel.classes.toggle('arrow-left', true); + panel.classes.toggle('arrow-right', false); + } else if (relPos === 'cl') { + panel.classes.toggle('arrow-left', false); + panel.classes.toggle('arrow-right', true); + } else { + global$4.each({ + l: 'left', + r: 'right' + }, function (cls, pos) { + panel.classes.toggle('arrow-' + cls, pos === relPos.substr(1, 1)); + }); + } + }; + var showToolbar = function (panel, id) { + var toolbars = panel.items().filter('#' + id); + if (toolbars.length > 0) { + toolbars[0].show(); + panel.reflow(); + return true; + } + return false; + }; + var repositionPanelAt = function (panel, id, editor, targetRect) { + var contentAreaRect, panelRect, result, userConstainHandler; + userConstainHandler = Settings.getPositionHandler(editor); + contentAreaRect = Measure.getContentAreaRect(editor); + panelRect = global$2.DOM.getRect(panel.getEl()); + if (id === 'insert') { + result = Layout.calcInsert(targetRect, contentAreaRect, panelRect); + } else { + result = Layout.calc(targetRect, contentAreaRect, panelRect); + } + if (result) { + var delta = UiContainer$1.getUiContainerDelta().getOr({ + x: 0, + y: 0 + }); + var transposedPanelRect = { + x: result.rect.x - delta.x, + y: result.rect.y - delta.y, + w: result.rect.w, + h: result.rect.h + }; + currentRect = targetRect; + movePanelTo(panel, Layout.userConstrain(userConstainHandler, targetRect, contentAreaRect, transposedPanelRect)); + togglePositionClass(panel, result.position); + return true; + } else { + return false; + } + }; + var showPanelAt = function (panel, id, editor, targetRect) { + showPanel(panel); + panel.items().hide(); + if (!showToolbar(panel, id)) { + hide(); + return; + } + if (repositionPanelAt(panel, id, editor, targetRect) === false) { + hide(); + } + }; + var hasFormVisible = function () { + return panel.items().filter('form:visible').length > 0; + }; + var showForm = function (editor, id) { + if (panel) { + panel.items().hide(); + if (!showToolbar(panel, id)) { + hide(); + return; + } + var contentAreaRect = void 0, panelRect = void 0, result = void 0, userConstainHandler = void 0; + showPanel(panel); + panel.items().hide(); + showToolbar(panel, id); + userConstainHandler = Settings.getPositionHandler(editor); + contentAreaRect = Measure.getContentAreaRect(editor); + panelRect = global$2.DOM.getRect(panel.getEl()); + result = Layout.calc(currentRect, contentAreaRect, panelRect); + if (result) { + panelRect = result.rect; + movePanelTo(panel, Layout.userConstrain(userConstainHandler, currentRect, contentAreaRect, panelRect)); + togglePositionClass(panel, result.position); + } + } + }; + var show = function (editor, id, targetRect, toolbars) { + if (!panel) { + Events.fireBeforeRenderUI(editor); + panel = create(editor, toolbars); + panel.renderTo().reflow().moveTo(targetRect.x, targetRect.y); + editor.nodeChanged(); + } + showPanelAt(panel, id, editor, targetRect); + }; + var reposition = function (editor, id, targetRect) { + if (panel) { + repositionPanelAt(panel, id, editor, targetRect); + } + }; + var hide = function () { + if (panel) { + panel.hide(); + } + }; + var focus = function () { + if (panel) { + panel.find('toolbar:visible').eq(0).each(function (item) { + item.focus(true); + }); + } + }; + var remove = function () { + if (panel) { + panel.remove(); + panel = null; + } + }; + var inForm = function () { + return panel && panel.visible() && hasFormVisible(); + }; + return { + show: show, + showForm: showForm, + reposition: reposition, + inForm: inForm, + hide: hide, + focus: focus, + remove: remove + }; + }; + + var Layout$1 = global$8.extend({ + Defaults: { + firstControlClass: 'first', + lastControlClass: 'last' + }, + init: function (settings) { + this.settings = global$4.extend({}, this.Defaults, settings); + }, + preRender: function (container) { + container.bodyClasses.add(this.settings.containerClass); + }, + applyClasses: function (items) { + var self = this; + var settings = self.settings; + var firstClass, lastClass, firstItem, lastItem; + firstClass = settings.firstControlClass; + lastClass = settings.lastControlClass; + items.each(function (item) { + item.classes.remove(firstClass).remove(lastClass).add(settings.controlClass); + if (item.visible()) { + if (!firstItem) { + firstItem = item; + } + lastItem = item; + } + }); + if (firstItem) { + firstItem.classes.add(firstClass); + } + if (lastItem) { + lastItem.classes.add(lastClass); + } + }, + renderHtml: function (container) { + var self = this; + var html = ''; + self.applyClasses(container.items()); + container.items().each(function (item) { + html += item.renderHtml(); + }); + return html; + }, + recalc: function () { + }, + postRender: function () { + }, + isNative: function () { + return false; + } + }); + + var AbsoluteLayout = Layout$1.extend({ + Defaults: { + containerClass: 'abs-layout', + controlClass: 'abs-layout-item' + }, + recalc: function (container) { + container.items().filter(':visible').each(function (ctrl) { + var settings = ctrl.settings; + ctrl.layoutRect({ + x: settings.x, + y: settings.y, + w: settings.w, + h: settings.h + }); + if (ctrl.recalc) { + ctrl.recalc(); + } + }); + }, + renderHtml: function (container) { + return '<div id="' + container._id + '-absend" class="' + container.classPrefix + 'abs-end"></div>' + this._super(container); + } + }); + + var Button = Widget.extend({ + Defaults: { + classes: 'widget btn', + role: 'button' + }, + init: function (settings) { + var self = this; + var size; + self._super(settings); + settings = self.settings; + size = self.settings.size; + self.on('click mousedown', function (e) { + e.preventDefault(); + }); + self.on('touchstart', function (e) { + self.fire('click', e); + e.preventDefault(); + }); + if (settings.subtype) { + self.classes.add(settings.subtype); + } + if (size) { + self.classes.add('btn-' + size); + } + if (settings.icon) { + self.icon(settings.icon); + } + }, + icon: function (icon) { + if (!arguments.length) { + return this.state.get('icon'); + } + this.state.set('icon', icon); + return this; + }, + repaint: function () { + var btnElm = this.getEl().firstChild; + var btnStyle; + if (btnElm) { + btnStyle = btnElm.style; + btnStyle.width = btnStyle.height = '100%'; + } + this._super(); + }, + renderHtml: function () { + var self = this, id = self._id, prefix = self.classPrefix; + var icon = self.state.get('icon'), image; + var text = self.state.get('text'); + var textHtml = ''; + var ariaPressed; + var settings = self.settings; + image = settings.image; + if (image) { + icon = 'none'; + if (typeof image !== 'string') { + image = domGlobals.window.getSelection ? image[0] : image[1]; + } + image = ' style="background-image: url(\'' + image + '\')"'; + } else { + image = ''; + } + if (text) { + self.classes.add('btn-has-text'); + textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>'; + } + icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : ''; + ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : ''; + return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1"' + ariaPressed + '>' + '<button id="' + id + '-button" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '</div>'; + }, + bindStates: function () { + var self = this, $ = self.$, textCls = self.classPrefix + 'txt'; + function setButtonText(text) { + var $span = $('span.' + textCls, self.getEl()); + if (text) { + if (!$span[0]) { + $('button:first', self.getEl()).append('<span class="' + textCls + '"></span>'); + $span = $('span.' + textCls, self.getEl()); + } + $span.html(self.encode(text)); + } else { + $span.remove(); + } + self.classes.toggle('btn-has-text', !!text); + } + self.state.on('change:text', function (e) { + setButtonText(e.value); + }); + self.state.on('change:icon', function (e) { + var icon = e.value; + var prefix = self.classPrefix; + self.settings.icon = icon; + icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : ''; + var btnElm = self.getEl().firstChild; + var iconElm = btnElm.getElementsByTagName('i')[0]; + if (icon) { + if (!iconElm || iconElm !== btnElm.firstChild) { + iconElm = domGlobals.document.createElement('i'); + btnElm.insertBefore(iconElm, btnElm.firstChild); + } + iconElm.className = icon; + } else if (iconElm) { + btnElm.removeChild(iconElm); + } + setButtonText(self.state.get('text')); + }); + return self._super(); + } + }); + + var BrowseButton = Button.extend({ + init: function (settings) { + var self = this; + settings = global$4.extend({ + text: 'Browse...', + multiple: false, + accept: null + }, settings); + self._super(settings); + self.classes.add('browsebutton'); + if (settings.multiple) { + self.classes.add('multiple'); + } + }, + postRender: function () { + var self = this; + var input = funcs.create('input', { + type: 'file', + id: self._id + '-browse', + accept: self.settings.accept + }); + self._super(); + global$7(input).on('change', function (e) { + var files = e.target.files; + self.value = function () { + if (!files.length) { + return null; + } else if (self.settings.multiple) { + return files; + } else { + return files[0]; + } + }; + e.preventDefault(); + if (files.length) { + self.fire('change', e); + } + }); + global$7(input).on('click', function (e) { + e.stopPropagation(); + }); + global$7(self.getEl('button')).on('click touchstart', function (e) { + e.stopPropagation(); + input.click(); + e.preventDefault(); + }); + self.getEl().appendChild(input); + }, + remove: function () { + global$7(this.getEl('button')).off(); + global$7(this.getEl('input')).off(); + this._super(); + } + }); + + var ButtonGroup = Container.extend({ + Defaults: { + defaultType: 'button', + role: 'group' + }, + renderHtml: function () { + var self = this, layout = self._layout; + self.classes.add('btn-group'); + self.preRender(); + layout.preRender(self); + return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>'; + } + }); + + var Checkbox = Widget.extend({ + Defaults: { + classes: 'checkbox', + role: 'checkbox', + checked: false + }, + init: function (settings) { + var self = this; + self._super(settings); + self.on('click mousedown', function (e) { + e.preventDefault(); + }); + self.on('click', function (e) { + e.preventDefault(); + if (!self.disabled()) { + self.checked(!self.checked()); + } + }); + self.checked(self.settings.checked); + }, + checked: function (state) { + if (!arguments.length) { + return this.state.get('checked'); + } + this.state.set('checked', state); + return this; + }, + value: function (state) { + if (!arguments.length) { + return this.checked(); + } + return this.checked(state); + }, + renderHtml: function () { + var self = this, id = self._id, prefix = self.classPrefix; + return '<div id="' + id + '" class="' + self.classes + '" unselectable="on" aria-labelledby="' + id + '-al" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-checkbox"></i>' + '<span id="' + id + '-al" class="' + prefix + 'label">' + self.encode(self.state.get('text')) + '</span>' + '</div>'; + }, + bindStates: function () { + var self = this; + function checked(state) { + self.classes.toggle('checked', state); + self.aria('checked', state); + } + self.state.on('change:text', function (e) { + self.getEl('al').firstChild.data = self.translate(e.value); + }); + self.state.on('change:checked change:value', function (e) { + self.fire('change'); + checked(e.value); + }); + self.state.on('change:icon', function (e) { + var icon = e.value; + var prefix = self.classPrefix; + if (typeof icon === 'undefined') { + return self.settings.icon; + } + self.settings.icon = icon; + icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : ''; + var btnElm = self.getEl().firstChild; + var iconElm = btnElm.getElementsByTagName('i')[0]; + if (icon) { + if (!iconElm || iconElm !== btnElm.firstChild) { + iconElm = domGlobals.document.createElement('i'); + btnElm.insertBefore(iconElm, btnElm.firstChild); + } + iconElm.className = icon; + } else if (iconElm) { + btnElm.removeChild(iconElm); + } + }); + if (self.state.get('checked')) { + checked(true); + } + return self._super(); + } + }); + + var global$f = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var ComboBox = Widget.extend({ + init: function (settings) { + var self = this; + self._super(settings); + settings = self.settings; + self.classes.add('combobox'); + self.subinput = true; + self.ariaTarget = 'inp'; + settings.menu = settings.menu || settings.values; + if (settings.menu) { + settings.icon = 'caret'; + } + self.on('click', function (e) { + var elm = e.target; + var root = self.getEl(); + if (!global$7.contains(root, elm) && elm !== root) { + return; + } + while (elm && elm !== root) { + if (elm.id && elm.id.indexOf('-open') !== -1) { + self.fire('action'); + if (settings.menu) { + self.showMenu(); + if (e.aria) { + self.menu.items()[0].focus(); + } + } + } + elm = elm.parentNode; + } + }); + self.on('keydown', function (e) { + var rootControl; + if (e.keyCode === 13 && e.target.nodeName === 'INPUT') { + e.preventDefault(); + self.parents().reverse().each(function (ctrl) { + if (ctrl.toJSON) { + rootControl = ctrl; + return false; + } + }); + self.fire('submit', { data: rootControl.toJSON() }); + } + }); + self.on('keyup', function (e) { + if (e.target.nodeName === 'INPUT') { + var oldValue = self.state.get('value'); + var newValue = e.target.value; + if (newValue !== oldValue) { + self.state.set('value', newValue); + self.fire('autocomplete', e); + } + } + }); + self.on('mouseover', function (e) { + var tooltip = self.tooltip().moveTo(-65535); + if (self.statusLevel() && e.target.className.indexOf(self.classPrefix + 'status') !== -1) { + var statusMessage = self.statusMessage() || 'Ok'; + var rel = tooltip.text(statusMessage).show().testMoveRel(e.target, [ + 'bc-tc', + 'bc-tl', + 'bc-tr' + ]); + tooltip.classes.toggle('tooltip-n', rel === 'bc-tc'); + tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl'); + tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr'); + tooltip.moveRel(e.target, rel); + } + }); + }, + statusLevel: function (value) { + if (arguments.length > 0) { + this.state.set('statusLevel', value); + } + return this.state.get('statusLevel'); + }, + statusMessage: function (value) { + if (arguments.length > 0) { + this.state.set('statusMessage', value); + } + return this.state.get('statusMessage'); + }, + showMenu: function () { + var self = this; + var settings = self.settings; + var menu; + if (!self.menu) { + menu = settings.menu || []; + if (menu.length) { + menu = { + type: 'menu', + items: menu + }; + } else { + menu.type = menu.type || 'menu'; + } + self.menu = global$b.create(menu).parent(self).renderTo(self.getContainerElm()); + self.fire('createmenu'); + self.menu.reflow(); + self.menu.on('cancel', function (e) { + if (e.control === self.menu) { + self.focus(); + } + }); + self.menu.on('show hide', function (e) { + e.control.items().each(function (ctrl) { + ctrl.active(ctrl.value() === self.value()); + }); + }).fire('show'); + self.menu.on('select', function (e) { + self.value(e.control.value()); + }); + self.on('focusin', function (e) { + if (e.target.tagName.toUpperCase() === 'INPUT') { + self.menu.hide(); + } + }); + self.aria('expanded', true); + } + self.menu.show(); + self.menu.layoutRect({ w: self.layoutRect().w }); + self.menu.moveRel(self.getEl(), self.isRtl() ? [ + 'br-tr', + 'tr-br' + ] : [ + 'bl-tl', + 'tl-bl' + ]); + }, + focus: function () { + this.getEl('inp').focus(); + }, + repaint: function () { + var self = this, elm = self.getEl(), openElm = self.getEl('open'), rect = self.layoutRect(); + var width, lineHeight, innerPadding = 0; + var inputElm = elm.firstChild; + if (self.statusLevel() && self.statusLevel() !== 'none') { + innerPadding = parseInt(funcs.getRuntimeStyle(inputElm, 'padding-right'), 10) - parseInt(funcs.getRuntimeStyle(inputElm, 'padding-left'), 10); + } + if (openElm) { + width = rect.w - funcs.getSize(openElm).width - 10; + } else { + width = rect.w - 10; + } + var doc = domGlobals.document; + if (doc.all && (!doc.documentMode || doc.documentMode <= 8)) { + lineHeight = self.layoutRect().h - 2 + 'px'; + } + global$7(inputElm).css({ + width: width - innerPadding, + lineHeight: lineHeight + }); + self._super(); + return self; + }, + postRender: function () { + var self = this; + global$7(this.getEl('inp')).on('change', function (e) { + self.state.set('value', e.target.value); + self.fire('change', e); + }); + return self._super(); + }, + renderHtml: function () { + var self = this, id = self._id, settings = self.settings, prefix = self.classPrefix; + var value = self.state.get('value') || ''; + var icon, text, openBtnHtml = '', extraAttrs = '', statusHtml = ''; + if ('spellcheck' in settings) { + extraAttrs += ' spellcheck="' + settings.spellcheck + '"'; + } + if (settings.maxLength) { + extraAttrs += ' maxlength="' + settings.maxLength + '"'; + } + if (settings.size) { + extraAttrs += ' size="' + settings.size + '"'; + } + if (settings.subtype) { + extraAttrs += ' type="' + settings.subtype + '"'; + } + statusHtml = '<i id="' + id + '-status" class="mce-status mce-ico" style="display: none"></i>'; + if (self.disabled()) { + extraAttrs += ' disabled="disabled"'; + } + icon = settings.icon; + if (icon && icon !== 'caret') { + icon = prefix + 'ico ' + prefix + 'i-' + settings.icon; + } + text = self.state.get('text'); + if (icon || text) { + openBtnHtml = '<div id="' + id + '-open" class="' + prefix + 'btn ' + prefix + 'open" tabIndex="-1" role="button">' + '<button id="' + id + '-action" type="button" hidefocus="1" tabindex="-1">' + (icon !== 'caret' ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>') + (text ? (icon ? ' ' : '') + text : '') + '</button>' + '</div>'; + self.classes.add('has-open'); + } + return '<div id="' + id + '" class="' + self.classes + '">' + '<input id="' + id + '-inp" class="' + prefix + 'textbox" value="' + self.encode(value, false) + '" hidefocus="1"' + extraAttrs + ' placeholder="' + self.encode(settings.placeholder) + '" />' + statusHtml + openBtnHtml + '</div>'; + }, + value: function (value) { + if (arguments.length) { + this.state.set('value', value); + return this; + } + if (this.state.get('rendered')) { + this.state.set('value', this.getEl('inp').value); + } + return this.state.get('value'); + }, + showAutoComplete: function (items, term) { + var self = this; + if (items.length === 0) { + self.hideMenu(); + return; + } + var insert = function (value, title) { + return function () { + self.fire('selectitem', { + title: title, + value: value + }); + }; + }; + if (self.menu) { + self.menu.items().remove(); + } else { + self.menu = global$b.create({ + type: 'menu', + classes: 'combobox-menu', + layout: 'flow' + }).parent(self).renderTo(); + } + global$4.each(items, function (item) { + self.menu.add({ + text: item.title, + url: item.previewUrl, + match: term, + classes: 'menu-item-ellipsis', + onclick: insert(item.value, item.title) + }); + }); + self.menu.renderNew(); + self.hideMenu(); + self.menu.on('cancel', function (e) { + if (e.control.parent() === self.menu) { + e.stopPropagation(); + self.focus(); + self.hideMenu(); + } + }); + self.menu.on('select', function () { + self.focus(); + }); + var maxW = self.layoutRect().w; + self.menu.layoutRect({ + w: maxW, + minW: 0, + maxW: maxW + }); + self.menu.repaint(); + self.menu.reflow(); + self.menu.show(); + self.menu.moveRel(self.getEl(), self.isRtl() ? [ + 'br-tr', + 'tr-br' + ] : [ + 'bl-tl', + 'tl-bl' + ]); + }, + hideMenu: function () { + if (this.menu) { + this.menu.hide(); + } + }, + bindStates: function () { + var self = this; + self.state.on('change:value', function (e) { + if (self.getEl('inp').value !== e.value) { + self.getEl('inp').value = e.value; + } + }); + self.state.on('change:disabled', function (e) { + self.getEl('inp').disabled = e.value; + }); + self.state.on('change:statusLevel', function (e) { + var statusIconElm = self.getEl('status'); + var prefix = self.classPrefix, value = e.value; + funcs.css(statusIconElm, 'display', value === 'none' ? 'none' : ''); + funcs.toggleClass(statusIconElm, prefix + 'i-checkmark', value === 'ok'); + funcs.toggleClass(statusIconElm, prefix + 'i-warning', value === 'warn'); + funcs.toggleClass(statusIconElm, prefix + 'i-error', value === 'error'); + self.classes.toggle('has-status', value !== 'none'); + self.repaint(); + }); + funcs.on(self.getEl('status'), 'mouseleave', function () { + self.tooltip().hide(); + }); + self.on('cancel', function (e) { + if (self.menu && self.menu.visible()) { + e.stopPropagation(); + self.hideMenu(); + } + }); + var focusIdx = function (idx, menu) { + if (menu && menu.items().length > 0) { + menu.items().eq(idx)[0].focus(); + } + }; + self.on('keydown', function (e) { + var keyCode = e.keyCode; + if (e.target.nodeName === 'INPUT') { + if (keyCode === global$f.DOWN) { + e.preventDefault(); + self.fire('autocomplete'); + focusIdx(0, self.menu); + } else if (keyCode === global$f.UP) { + e.preventDefault(); + focusIdx(-1, self.menu); + } + } + }); + return self._super(); + }, + remove: function () { + global$7(this.getEl('inp')).off(); + if (this.menu) { + this.menu.remove(); + } + this._super(); + } + }); + + var ColorBox = ComboBox.extend({ + init: function (settings) { + var self = this; + settings.spellcheck = false; + if (settings.onaction) { + settings.icon = 'none'; + } + self._super(settings); + self.classes.add('colorbox'); + self.on('change keyup postrender', function () { + self.repaintColor(self.value()); + }); + }, + repaintColor: function (value) { + var openElm = this.getEl('open'); + var elm = openElm ? openElm.getElementsByTagName('i')[0] : null; + if (elm) { + try { + elm.style.background = value; + } catch (ex) { + } + } + }, + bindStates: function () { + var self = this; + self.state.on('change:value', function (e) { + if (self.state.get('rendered')) { + self.repaintColor(e.value); + } + }); + return self._super(); + } + }); + + var PanelButton = Button.extend({ + showPanel: function () { + var self = this, settings = self.settings; + self.classes.add('opened'); + if (!self.panel) { + var panelSettings = settings.panel; + if (panelSettings.type) { + panelSettings = { + layout: 'grid', + items: panelSettings + }; + } + panelSettings.role = panelSettings.role || 'dialog'; + panelSettings.popover = true; + panelSettings.autohide = true; + panelSettings.ariaRoot = true; + self.panel = new FloatPanel(panelSettings).on('hide', function () { + self.classes.remove('opened'); + }).on('cancel', function (e) { + e.stopPropagation(); + self.focus(); + self.hidePanel(); + }).parent(self).renderTo(self.getContainerElm()); + self.panel.fire('show'); + self.panel.reflow(); + } else { + self.panel.show(); + } + var rtlRels = [ + 'bc-tc', + 'bc-tl', + 'bc-tr' + ]; + var ltrRels = [ + 'bc-tc', + 'bc-tr', + 'bc-tl', + 'tc-bc', + 'tc-br', + 'tc-bl' + ]; + var rel = self.panel.testMoveRel(self.getEl(), settings.popoverAlign || (self.isRtl() ? rtlRels : ltrRels)); + self.panel.classes.toggle('start', rel.substr(-1) === 'l'); + self.panel.classes.toggle('end', rel.substr(-1) === 'r'); + var isTop = rel.substr(0, 1) === 't'; + self.panel.classes.toggle('bottom', !isTop); + self.panel.classes.toggle('top', isTop); + self.panel.moveRel(self.getEl(), rel); + }, + hidePanel: function () { + var self = this; + if (self.panel) { + self.panel.hide(); + } + }, + postRender: function () { + var self = this; + self.aria('haspopup', true); + self.on('click', function (e) { + if (e.control === self) { + if (self.panel && self.panel.visible()) { + self.hidePanel(); + } else { + self.showPanel(); + self.panel.focus(!!e.aria); + } + } + }); + return self._super(); + }, + remove: function () { + if (this.panel) { + this.panel.remove(); + this.panel = null; + } + return this._super(); + } + }); + + var DOM = global$2.DOM; + var ColorButton = PanelButton.extend({ + init: function (settings) { + this._super(settings); + this.classes.add('splitbtn'); + this.classes.add('colorbutton'); + }, + color: function (color) { + if (color) { + this._color = color; + this.getEl('preview').style.backgroundColor = color; + return this; + } + return this._color; + }, + resetColor: function () { + this._color = null; + this.getEl('preview').style.backgroundColor = null; + return this; + }, + renderHtml: function () { + var self = this, id = self._id, prefix = self.classPrefix, text = self.state.get('text'); + var icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : ''; + var image = self.settings.image ? ' style="background-image: url(\'' + self.settings.image + '\')"' : ''; + var textHtml = ''; + if (text) { + self.classes.add('btn-has-text'); + textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>'; + } + return '<div id="' + id + '" class="' + self.classes + '" role="button" tabindex="-1" aria-haspopup="true">' + '<button role="presentation" hidefocus="1" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + '<span id="' + id + '-preview" class="' + prefix + 'preview"></span>' + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>'; + }, + postRender: function () { + var self = this, onClickHandler = self.settings.onclick; + self.on('click', function (e) { + if (e.aria && e.aria.key === 'down') { + return; + } + if (e.control === self && !DOM.getParent(e.target, '.' + self.classPrefix + 'open')) { + e.stopImmediatePropagation(); + onClickHandler.call(self, e); + } + }); + delete self.settings.onclick; + return self._super(); + } + }); + + var global$g = tinymce.util.Tools.resolve('tinymce.util.Color'); + + var ColorPicker = Widget.extend({ + Defaults: { classes: 'widget colorpicker' }, + init: function (settings) { + this._super(settings); + }, + postRender: function () { + var self = this; + var color = self.color(); + var hsv, hueRootElm, huePointElm, svRootElm, svPointElm; + hueRootElm = self.getEl('h'); + huePointElm = self.getEl('hp'); + svRootElm = self.getEl('sv'); + svPointElm = self.getEl('svp'); + function getPos(elm, event) { + var pos = funcs.getPos(elm); + var x, y; + x = event.pageX - pos.x; + y = event.pageY - pos.y; + x = Math.max(0, Math.min(x / elm.clientWidth, 1)); + y = Math.max(0, Math.min(y / elm.clientHeight, 1)); + return { + x: x, + y: y + }; + } + function updateColor(hsv, hueUpdate) { + var hue = (360 - hsv.h) / 360; + funcs.css(huePointElm, { top: hue * 100 + '%' }); + if (!hueUpdate) { + funcs.css(svPointElm, { + left: hsv.s + '%', + top: 100 - hsv.v + '%' + }); + } + svRootElm.style.background = global$g({ + s: 100, + v: 100, + h: hsv.h + }).toHex(); + self.color().parse({ + s: hsv.s, + v: hsv.v, + h: hsv.h + }); + } + function updateSaturationAndValue(e) { + var pos; + pos = getPos(svRootElm, e); + hsv.s = pos.x * 100; + hsv.v = (1 - pos.y) * 100; + updateColor(hsv); + self.fire('change'); + } + function updateHue(e) { + var pos; + pos = getPos(hueRootElm, e); + hsv = color.toHsv(); + hsv.h = (1 - pos.y) * 360; + updateColor(hsv, true); + self.fire('change'); + } + self._repaint = function () { + hsv = color.toHsv(); + updateColor(hsv); + }; + self._super(); + self._svdraghelper = new DragHelper(self._id + '-sv', { + start: updateSaturationAndValue, + drag: updateSaturationAndValue + }); + self._hdraghelper = new DragHelper(self._id + '-h', { + start: updateHue, + drag: updateHue + }); + self._repaint(); + }, + rgb: function () { + return this.color().toRgb(); + }, + value: function (value) { + var self = this; + if (arguments.length) { + self.color().parse(value); + if (self._rendered) { + self._repaint(); + } + } else { + return self.color().toHex(); + } + }, + color: function () { + if (!this._color) { + this._color = global$g(); + } + return this._color; + }, + renderHtml: function () { + var self = this; + var id = self._id; + var prefix = self.classPrefix; + var hueHtml; + var stops = '#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000'; + function getOldIeFallbackHtml() { + var i, l, html = '', gradientPrefix, stopsList; + gradientPrefix = 'filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='; + stopsList = stops.split(','); + for (i = 0, l = stopsList.length - 1; i < l; i++) { + html += '<div class="' + prefix + 'colorpicker-h-chunk" style="' + 'height:' + 100 / l + '%;' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ');' + '-ms-' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ')' + '"></div>'; + } + return html; + } + var gradientCssText = 'background: -ms-linear-gradient(top,' + stops + ');' + 'background: linear-gradient(to bottom,' + stops + ');'; + hueHtml = '<div id="' + id + '-h" class="' + prefix + 'colorpicker-h" style="' + gradientCssText + '">' + getOldIeFallbackHtml() + '<div id="' + id + '-hp" class="' + prefix + 'colorpicker-h-marker"></div>' + '</div>'; + return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-sv" class="' + prefix + 'colorpicker-sv">' + '<div class="' + prefix + 'colorpicker-overlay1">' + '<div class="' + prefix + 'colorpicker-overlay2">' + '<div id="' + id + '-svp" class="' + prefix + 'colorpicker-selector1">' + '<div class="' + prefix + 'colorpicker-selector2"></div>' + '</div>' + '</div>' + '</div>' + '</div>' + hueHtml + '</div>'; + } + }); + + var DropZone = Widget.extend({ + init: function (settings) { + var self = this; + settings = global$4.extend({ + height: 100, + text: 'Drop an image here', + multiple: false, + accept: null + }, settings); + self._super(settings); + self.classes.add('dropzone'); + if (settings.multiple) { + self.classes.add('multiple'); + } + }, + renderHtml: function () { + var self = this; + var attrs, elm; + var cfg = self.settings; + attrs = { + id: self._id, + hidefocus: '1' + }; + elm = funcs.create('div', attrs, '<span>' + this.translate(cfg.text) + '</span>'); + if (cfg.height) { + funcs.css(elm, 'height', cfg.height + 'px'); + } + if (cfg.width) { + funcs.css(elm, 'width', cfg.width + 'px'); + } + elm.className = self.classes; + return elm.outerHTML; + }, + postRender: function () { + var self = this; + var toggleDragClass = function (e) { + e.preventDefault(); + self.classes.toggle('dragenter'); + self.getEl().className = self.classes; + }; + var filter = function (files) { + var accept = self.settings.accept; + if (typeof accept !== 'string') { + return files; + } + var re = new RegExp('(' + accept.split(/\s*,\s*/).join('|') + ')$', 'i'); + return global$4.grep(files, function (file) { + return re.test(file.name); + }); + }; + self._super(); + self.$el.on('dragover', function (e) { + e.preventDefault(); + }); + self.$el.on('dragenter', toggleDragClass); + self.$el.on('dragleave', toggleDragClass); + self.$el.on('drop', function (e) { + e.preventDefault(); + if (self.state.get('disabled')) { + return; + } + var files = filter(e.dataTransfer.files); + self.value = function () { + if (!files.length) { + return null; + } else if (self.settings.multiple) { + return files; + } else { + return files[0]; + } + }; + if (files.length) { + self.fire('change', e); + } + }); + }, + remove: function () { + this.$el.off(); + this._super(); + } + }); + + var Path = Widget.extend({ + init: function (settings) { + var self = this; + if (!settings.delimiter) { + settings.delimiter = '\xBB'; + } + self._super(settings); + self.classes.add('path'); + self.canFocus = true; + self.on('click', function (e) { + var index; + var target = e.target; + if (index = target.getAttribute('data-index')) { + self.fire('select', { + value: self.row()[index], + index: index + }); + } + }); + self.row(self.settings.row); + }, + focus: function () { + var self = this; + self.getEl().firstChild.focus(); + return self; + }, + row: function (row) { + if (!arguments.length) { + return this.state.get('row'); + } + this.state.set('row', row); + return this; + }, + renderHtml: function () { + var self = this; + return '<div id="' + self._id + '" class="' + self.classes + '">' + self._getDataPathHtml(self.state.get('row')) + '</div>'; + }, + bindStates: function () { + var self = this; + self.state.on('change:row', function (e) { + self.innerHtml(self._getDataPathHtml(e.value)); + }); + return self._super(); + }, + _getDataPathHtml: function (data) { + var self = this; + var parts = data || []; + var i, l, html = ''; + var prefix = self.classPrefix; + for (i = 0, l = parts.length; i < l; i++) { + html += (i > 0 ? '<div class="' + prefix + 'divider" aria-hidden="true"> ' + self.settings.delimiter + ' </div>' : '') + '<div role="button" class="' + prefix + 'path-item' + (i === l - 1 ? ' ' + prefix + 'last' : '') + '" data-index="' + i + '" tabindex="-1" id="' + self._id + '-' + i + '" aria-level="' + (i + 1) + '">' + parts[i].name + '</div>'; + } + if (!html) { + html = '<div class="' + prefix + 'path-item">\xA0</div>'; + } + return html; + } + }); + + var ElementPath = Path.extend({ + postRender: function () { + var self = this, editor = self.settings.editor; + function isHidden(elm) { + if (elm.nodeType === 1) { + if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) { + return true; + } + if (elm.getAttribute('data-mce-type') === 'bookmark') { + return true; + } + } + return false; + } + if (editor.settings.elementpath !== false) { + self.on('select', function (e) { + editor.focus(); + editor.selection.select(this.row()[e.index].element); + editor.nodeChanged(); + }); + editor.on('nodeChange', function (e) { + var outParents = []; + var parents = e.parents; + var i = parents.length; + while (i--) { + if (parents[i].nodeType === 1 && !isHidden(parents[i])) { + var args = editor.fire('ResolveName', { + name: parents[i].nodeName.toLowerCase(), + target: parents[i] + }); + if (!args.isDefaultPrevented()) { + outParents.push({ + name: args.name, + element: parents[i] + }); + } + if (args.isPropagationStopped()) { + break; + } + } + } + self.row(outParents); + }); + } + return self._super(); + } + }); + + var FormItem = Container.extend({ + Defaults: { + layout: 'flex', + align: 'center', + defaults: { flex: 1 } + }, + renderHtml: function () { + var self = this, layout = self._layout, prefix = self.classPrefix; + self.classes.add('formitem'); + layout.preRender(self); + return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<div id="' + self._id + '-title" class="' + prefix + 'title">' + self.settings.title + '</div>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>'; + } + }); + + var Form = Container.extend({ + Defaults: { + containerCls: 'form', + layout: 'flex', + direction: 'column', + align: 'stretch', + flex: 1, + padding: 15, + labelGap: 30, + spacing: 10, + callbacks: { + submit: function () { + this.submit(); + } + } + }, + preRender: function () { + var self = this, items = self.items(); + if (!self.settings.formItemDefaults) { + self.settings.formItemDefaults = { + layout: 'flex', + autoResize: 'overflow', + defaults: { flex: 1 } + }; + } + items.each(function (ctrl) { + var formItem; + var label = ctrl.settings.label; + if (label) { + formItem = new FormItem(global$4.extend({ + items: { + type: 'label', + id: ctrl._id + '-l', + text: label, + flex: 0, + forId: ctrl._id, + disabled: ctrl.disabled() + } + }, self.settings.formItemDefaults)); + formItem.type = 'formitem'; + ctrl.aria('labelledby', ctrl._id + '-l'); + if (typeof ctrl.settings.flex === 'undefined') { + ctrl.settings.flex = 1; + } + self.replace(ctrl, formItem); + formItem.add(ctrl); + } + }); + }, + submit: function () { + return this.fire('submit', { data: this.toJSON() }); + }, + postRender: function () { + var self = this; + self._super(); + self.fromJSON(self.settings.data); + }, + bindStates: function () { + var self = this; + self._super(); + function recalcLabels() { + var maxLabelWidth = 0; + var labels = []; + var i, labelGap, items; + if (self.settings.labelGapCalc === false) { + return; + } + if (self.settings.labelGapCalc === 'children') { + items = self.find('formitem'); + } else { + items = self.items(); + } + items.filter('formitem').each(function (item) { + var labelCtrl = item.items()[0], labelWidth = labelCtrl.getEl().clientWidth; + maxLabelWidth = labelWidth > maxLabelWidth ? labelWidth : maxLabelWidth; + labels.push(labelCtrl); + }); + labelGap = self.settings.labelGap || 0; + i = labels.length; + while (i--) { + labels[i].settings.minWidth = maxLabelWidth + labelGap; + } + } + self.on('show', recalcLabels); + recalcLabels(); + } + }); + + var FieldSet = Form.extend({ + Defaults: { + containerCls: 'fieldset', + layout: 'flex', + direction: 'column', + align: 'stretch', + flex: 1, + padding: '25 15 5 15', + labelGap: 30, + spacing: 10, + border: 1 + }, + renderHtml: function () { + var self = this, layout = self._layout, prefix = self.classPrefix; + self.preRender(); + layout.preRender(self); + return '<fieldset id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<legend id="' + self._id + '-title" class="' + prefix + 'fieldset-title">' + self.settings.title + '</legend>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</fieldset>'; + } + }); + + var unique$1 = 0; + var generate = function (prefix) { + var date = new Date(); + var time = date.getTime(); + var random = Math.floor(Math.random() * 1000000000); + unique$1++; + return prefix + '_' + random + unique$1 + String(time); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var cached = function (f) { + var called = false; + var r; + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!called) { + called = true; + r = f.apply(null, args); + } + return r; + }; + }; + + var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE; + var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE; + var COMMENT = domGlobals.Node.COMMENT_NODE; + var DOCUMENT = domGlobals.Node.DOCUMENT_NODE; + var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE; + var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE; + var ELEMENT = domGlobals.Node.ELEMENT_NODE; + var TEXT = domGlobals.Node.TEXT_NODE; + var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE; + var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE; + var ENTITY = domGlobals.Node.ENTITY_NODE; + var NOTATION = domGlobals.Node.NOTATION_NODE; + + var Immutable = function () { + var fields = []; + for (var _i = 0; _i < arguments.length; _i++) { + fields[_i] = arguments[_i]; + } + return function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + if (fields.length !== values.length) { + throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments'); + } + var struct = {}; + each(fields, function (name, i) { + struct[name] = constant(values[i]); + }); + return struct; + }; + }; + + var node = function () { + var f = Global$1.getOrDie('Node'); + return f; + }; + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionPreceding = function (a, b) { + return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING); + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY); + }; + var Node = { + documentPositionPreceding: documentPositionPreceding, + documentPositionContainedBy: documentPositionContainedBy + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var isBrowser = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isEdge: isBrowser(edge, current), + isChrome: isBrowser(chrome, current), + isIE: isBrowser(ie, current), + isOpera: isBrowser(opera, current), + isFirefox: isBrowser(firefox, current), + isSafari: isBrowser(safari, current) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows$1 = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var isOS = function (name, current) { + return function () { + return current === name; + }; + }; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + return { + current: current, + version: version, + isWindows: isOS(windows$1, current), + isiOS: isOS(ios, current), + isAndroid: isOS(android, current), + isOSX: isOS(osx, current), + isLinux: isOS(linux, current), + isSolaris: isOS(solaris, current), + isFreeBSD: isOS(freebsd, current) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows$1), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd) + }; + + var DeviceType = function (os, browser, userAgent) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isAndroid3 = os.isAndroid() && os.version.major === 3; + var isAndroid4 = os.isAndroid() && os.version.major === 4; + var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true; + var isTouch = os.isiOS() || os.isAndroid(); + var isPhone = isTouch && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview) + }; + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('os x'), + versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var detect$2 = function (userAgent) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var detect$3 = cached(function () { + var userAgent = domGlobals.navigator.userAgent; + return PlatformDetection.detect(userAgent); + }); + var PlatformDetection$1 = { detect: detect$3 }; + + var ELEMENT$1 = ELEMENT; + var DOCUMENT$1 = DOCUMENT; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); + }; + var one = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom); + }; + + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return Node.documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var browser = PlatformDetection$1.detect().browser; + var contains$1 = browser.isIE() ? ieContains : regularContains; + + var spot = Immutable('element', 'offset'); + + var descendants = function (scope, selector) { + return all(selector, scope); + }; + + var trim = global$4.trim; + var hasContentEditableState = function (value) { + return function (node) { + if (node && node.nodeType === 1) { + if (node.contentEditable === value) { + return true; + } + if (node.getAttribute('data-mce-contenteditable') === value) { + return true; + } + } + return false; + }; + }; + var isContentEditableTrue = hasContentEditableState('true'); + var isContentEditableFalse = hasContentEditableState('false'); + var create$4 = function (type, title, url, level, attach) { + return { + type: type, + title: title, + url: url, + level: level, + attach: attach + }; + }; + var isChildOfContentEditableTrue = function (node) { + while (node = node.parentNode) { + var value = node.contentEditable; + if (value && value !== 'inherit') { + return isContentEditableTrue(node); + } + } + return false; + }; + var select = function (selector, root) { + return map(descendants(Element.fromDom(root), selector), function (element) { + return element.dom(); + }); + }; + var getElementText = function (elm) { + return elm.innerText || elm.textContent; + }; + var getOrGenerateId = function (elm) { + return elm.id ? elm.id : generate('h'); + }; + var isAnchor = function (elm) { + return elm && elm.nodeName === 'A' && (elm.id || elm.name); + }; + var isValidAnchor = function (elm) { + return isAnchor(elm) && isEditable(elm); + }; + var isHeader = function (elm) { + return elm && /^(H[1-6])$/.test(elm.nodeName); + }; + var isEditable = function (elm) { + return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm); + }; + var isValidHeader = function (elm) { + return isHeader(elm) && isEditable(elm); + }; + var getLevel = function (elm) { + return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0; + }; + var headerTarget = function (elm) { + var headerId = getOrGenerateId(elm); + var attach = function () { + elm.id = headerId; + }; + return create$4('header', getElementText(elm), '#' + headerId, getLevel(elm), attach); + }; + var anchorTarget = function (elm) { + var anchorId = elm.id || elm.name; + var anchorText = getElementText(elm); + return create$4('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop); + }; + var getHeaderTargets = function (elms) { + return map(filter(elms, isValidHeader), headerTarget); + }; + var getAnchorTargets = function (elms) { + return map(filter(elms, isValidAnchor), anchorTarget); + }; + var getTargetElements = function (elm) { + var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm); + return elms; + }; + var hasTitle = function (target) { + return trim(target.title).length > 0; + }; + var find$2 = function (elm) { + var elms = getTargetElements(elm); + return filter(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle); + }; + var LinkTargets = { find: find$2 }; + + var getActiveEditor = function () { + return window.tinymce ? window.tinymce.activeEditor : global$5.activeEditor; + }; + var history = {}; + var HISTORY_LENGTH = 5; + var clearHistory = function () { + history = {}; + }; + var toMenuItem = function (target) { + return { + title: target.title, + value: { + title: { raw: target.title }, + url: target.url, + attach: target.attach + } + }; + }; + var toMenuItems = function (targets) { + return global$4.map(targets, toMenuItem); + }; + var staticMenuItem = function (title, url) { + return { + title: title, + value: { + title: title, + url: url, + attach: noop + } + }; + }; + var isUniqueUrl = function (url, targets) { + var foundTarget = exists(targets, function (target) { + return target.url === url; + }); + return !foundTarget; + }; + var getSetting = function (editorSettings, name, defaultValue) { + var value = name in editorSettings ? editorSettings[name] : defaultValue; + return value === false ? null : value; + }; + var createMenuItems = function (term, targets, fileType, editorSettings) { + var separator = { title: '-' }; + var fromHistoryMenuItems = function (history) { + var historyItems = history.hasOwnProperty(fileType) ? history[fileType] : []; + var uniqueHistory = filter(historyItems, function (url) { + return isUniqueUrl(url, targets); + }); + return global$4.map(uniqueHistory, function (url) { + return { + title: url, + value: { + title: url, + url: url, + attach: noop + } + }; + }); + }; + var fromMenuItems = function (type) { + var filteredTargets = filter(targets, function (target) { + return target.type === type; + }); + return toMenuItems(filteredTargets); + }; + var anchorMenuItems = function () { + var anchorMenuItems = fromMenuItems('anchor'); + var topAnchor = getSetting(editorSettings, 'anchor_top', '#top'); + var bottomAchor = getSetting(editorSettings, 'anchor_bottom', '#bottom'); + if (topAnchor !== null) { + anchorMenuItems.unshift(staticMenuItem('<top>', topAnchor)); + } + if (bottomAchor !== null) { + anchorMenuItems.push(staticMenuItem('<bottom>', bottomAchor)); + } + return anchorMenuItems; + }; + var join = function (items) { + return foldl(items, function (a, b) { + var bothEmpty = a.length === 0 || b.length === 0; + return bothEmpty ? a.concat(b) : a.concat(separator, b); + }, []); + }; + if (editorSettings.typeahead_urls === false) { + return []; + } + return fileType === 'file' ? join([ + filterByQuery(term, fromHistoryMenuItems(history)), + filterByQuery(term, fromMenuItems('header')), + filterByQuery(term, anchorMenuItems()) + ]) : filterByQuery(term, fromHistoryMenuItems(history)); + }; + var addToHistory = function (url, fileType) { + var items = history[fileType]; + if (!/^https?/.test(url)) { + return; + } + if (items) { + if (indexOf(items, url).isNone()) { + history[fileType] = items.slice(0, HISTORY_LENGTH).concat(url); + } + } else { + history[fileType] = [url]; + } + }; + var filterByQuery = function (term, menuItems) { + var lowerCaseTerm = term.toLowerCase(); + var result = global$4.grep(menuItems, function (item) { + return item.title.toLowerCase().indexOf(lowerCaseTerm) !== -1; + }); + return result.length === 1 && result[0].title === term ? [] : result; + }; + var getTitle = function (linkDetails) { + var title = linkDetails.title; + return title.raw ? title.raw : title; + }; + var setupAutoCompleteHandler = function (ctrl, editorSettings, bodyElm, fileType) { + var autocomplete = function (term) { + var linkTargets = LinkTargets.find(bodyElm); + var menuItems = createMenuItems(term, linkTargets, fileType, editorSettings); + ctrl.showAutoComplete(menuItems, term); + }; + ctrl.on('autocomplete', function () { + autocomplete(ctrl.value()); + }); + ctrl.on('selectitem', function (e) { + var linkDetails = e.value; + ctrl.value(linkDetails.url); + var title = getTitle(linkDetails); + if (fileType === 'image') { + ctrl.fire('change', { + meta: { + alt: title, + attach: linkDetails.attach + } + }); + } else { + ctrl.fire('change', { + meta: { + text: title, + attach: linkDetails.attach + } + }); + } + ctrl.focus(); + }); + ctrl.on('click', function (e) { + if (ctrl.value().length === 0 && e.target.nodeName === 'INPUT') { + autocomplete(''); + } + }); + ctrl.on('PostRender', function () { + ctrl.getRoot().on('submit', function (e) { + if (!e.isDefaultPrevented()) { + addToHistory(ctrl.value(), fileType); + } + }); + }); + }; + var statusToUiState = function (result) { + var status = result.status, message = result.message; + if (status === 'valid') { + return { + status: 'ok', + message: message + }; + } else if (status === 'unknown') { + return { + status: 'warn', + message: message + }; + } else if (status === 'invalid') { + return { + status: 'warn', + message: message + }; + } else { + return { + status: 'none', + message: '' + }; + } + }; + var setupLinkValidatorHandler = function (ctrl, editorSettings, fileType) { + var validatorHandler = editorSettings.filepicker_validator_handler; + if (validatorHandler) { + var validateUrl_1 = function (url) { + if (url.length === 0) { + ctrl.statusLevel('none'); + return; + } + validatorHandler({ + url: url, + type: fileType + }, function (result) { + var uiState = statusToUiState(result); + ctrl.statusMessage(uiState.message); + ctrl.statusLevel(uiState.status); + }); + }; + ctrl.state.on('change:value', function (e) { + validateUrl_1(e.value); + }); + } + }; + var FilePicker = ComboBox.extend({ + Statics: { clearHistory: clearHistory }, + init: function (settings) { + var self = this, editor = getActiveEditor(), editorSettings = editor.settings; + var actionCallback, fileBrowserCallback, fileBrowserCallbackTypes; + var fileType = settings.filetype; + settings.spellcheck = false; + fileBrowserCallbackTypes = editorSettings.file_picker_types || editorSettings.file_browser_callback_types; + if (fileBrowserCallbackTypes) { + fileBrowserCallbackTypes = global$4.makeMap(fileBrowserCallbackTypes, /[, ]/); + } + if (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType]) { + fileBrowserCallback = editorSettings.file_picker_callback; + if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) { + actionCallback = function () { + var meta = self.fire('beforecall').meta; + meta = global$4.extend({ filetype: fileType }, meta); + fileBrowserCallback.call(editor, function (value, meta) { + self.value(value).fire('change', { meta: meta }); + }, self.value(), meta); + }; + } else { + fileBrowserCallback = editorSettings.file_browser_callback; + if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) { + actionCallback = function () { + fileBrowserCallback(self.getEl('inp').id, self.value(), fileType, window); + }; + } + } + } + if (actionCallback) { + settings.icon = 'browse'; + settings.onaction = actionCallback; + } + self._super(settings); + self.classes.add('filepicker'); + setupAutoCompleteHandler(self, editorSettings, editor.getBody(), fileType); + setupLinkValidatorHandler(self, editorSettings, fileType); + } + }); + + var FitLayout = AbsoluteLayout.extend({ + recalc: function (container) { + var contLayoutRect = container.layoutRect(), paddingBox = container.paddingBox; + container.items().filter(':visible').each(function (ctrl) { + ctrl.layoutRect({ + x: paddingBox.left, + y: paddingBox.top, + w: contLayoutRect.innerW - paddingBox.right - paddingBox.left, + h: contLayoutRect.innerH - paddingBox.top - paddingBox.bottom + }); + if (ctrl.recalc) { + ctrl.recalc(); + } + }); + } + }); + + var FlexLayout = AbsoluteLayout.extend({ + recalc: function (container) { + var i, l, items, contLayoutRect, contPaddingBox, contSettings, align, pack, spacing, totalFlex, availableSpace, direction; + var ctrl, ctrlLayoutRect, ctrlSettings, flex; + var maxSizeItems = []; + var size, maxSize, ratio, rect, pos, maxAlignEndPos; + var sizeName, minSizeName, posName, maxSizeName, beforeName, innerSizeName, deltaSizeName, contentSizeName; + var alignAxisName, alignInnerSizeName, alignSizeName, alignMinSizeName, alignBeforeName, alignAfterName; + var alignDeltaSizeName, alignContentSizeName; + var max = Math.max, min = Math.min; + items = container.items().filter(':visible'); + contLayoutRect = container.layoutRect(); + contPaddingBox = container.paddingBox; + contSettings = container.settings; + direction = container.isRtl() ? contSettings.direction || 'row-reversed' : contSettings.direction; + align = contSettings.align; + pack = container.isRtl() ? contSettings.pack || 'end' : contSettings.pack; + spacing = contSettings.spacing || 0; + if (direction === 'row-reversed' || direction === 'column-reverse') { + items = items.set(items.toArray().reverse()); + direction = direction.split('-')[0]; + } + if (direction === 'column') { + posName = 'y'; + sizeName = 'h'; + minSizeName = 'minH'; + maxSizeName = 'maxH'; + innerSizeName = 'innerH'; + beforeName = 'top'; + deltaSizeName = 'deltaH'; + contentSizeName = 'contentH'; + alignBeforeName = 'left'; + alignSizeName = 'w'; + alignAxisName = 'x'; + alignInnerSizeName = 'innerW'; + alignMinSizeName = 'minW'; + alignAfterName = 'right'; + alignDeltaSizeName = 'deltaW'; + alignContentSizeName = 'contentW'; + } else { + posName = 'x'; + sizeName = 'w'; + minSizeName = 'minW'; + maxSizeName = 'maxW'; + innerSizeName = 'innerW'; + beforeName = 'left'; + deltaSizeName = 'deltaW'; + contentSizeName = 'contentW'; + alignBeforeName = 'top'; + alignSizeName = 'h'; + alignAxisName = 'y'; + alignInnerSizeName = 'innerH'; + alignMinSizeName = 'minH'; + alignAfterName = 'bottom'; + alignDeltaSizeName = 'deltaH'; + alignContentSizeName = 'contentH'; + } + availableSpace = contLayoutRect[innerSizeName] - contPaddingBox[beforeName] - contPaddingBox[beforeName]; + maxAlignEndPos = totalFlex = 0; + for (i = 0, l = items.length; i < l; i++) { + ctrl = items[i]; + ctrlLayoutRect = ctrl.layoutRect(); + ctrlSettings = ctrl.settings; + flex = ctrlSettings.flex; + availableSpace -= i < l - 1 ? spacing : 0; + if (flex > 0) { + totalFlex += flex; + if (ctrlLayoutRect[maxSizeName]) { + maxSizeItems.push(ctrl); + } + ctrlLayoutRect.flex = flex; + } + availableSpace -= ctrlLayoutRect[minSizeName]; + size = contPaddingBox[alignBeforeName] + ctrlLayoutRect[alignMinSizeName] + contPaddingBox[alignAfterName]; + if (size > maxAlignEndPos) { + maxAlignEndPos = size; + } + } + rect = {}; + if (availableSpace < 0) { + rect[minSizeName] = contLayoutRect[minSizeName] - availableSpace + contLayoutRect[deltaSizeName]; + } else { + rect[minSizeName] = contLayoutRect[innerSizeName] - availableSpace + contLayoutRect[deltaSizeName]; + } + rect[alignMinSizeName] = maxAlignEndPos + contLayoutRect[alignDeltaSizeName]; + rect[contentSizeName] = contLayoutRect[innerSizeName] - availableSpace; + rect[alignContentSizeName] = maxAlignEndPos; + rect.minW = min(rect.minW, contLayoutRect.maxW); + rect.minH = min(rect.minH, contLayoutRect.maxH); + rect.minW = max(rect.minW, contLayoutRect.startMinWidth); + rect.minH = max(rect.minH, contLayoutRect.startMinHeight); + if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) { + rect.w = rect.minW; + rect.h = rect.minH; + container.layoutRect(rect); + this.recalc(container); + if (container._lastRect === null) { + var parentCtrl = container.parent(); + if (parentCtrl) { + parentCtrl._lastRect = null; + parentCtrl.recalc(); + } + } + return; + } + ratio = availableSpace / totalFlex; + for (i = 0, l = maxSizeItems.length; i < l; i++) { + ctrl = maxSizeItems[i]; + ctrlLayoutRect = ctrl.layoutRect(); + maxSize = ctrlLayoutRect[maxSizeName]; + size = ctrlLayoutRect[minSizeName] + ctrlLayoutRect.flex * ratio; + if (size > maxSize) { + availableSpace -= ctrlLayoutRect[maxSizeName] - ctrlLayoutRect[minSizeName]; + totalFlex -= ctrlLayoutRect.flex; + ctrlLayoutRect.flex = 0; + ctrlLayoutRect.maxFlexSize = maxSize; + } else { + ctrlLayoutRect.maxFlexSize = 0; + } + } + ratio = availableSpace / totalFlex; + pos = contPaddingBox[beforeName]; + rect = {}; + if (totalFlex === 0) { + if (pack === 'end') { + pos = availableSpace + contPaddingBox[beforeName]; + } else if (pack === 'center') { + pos = Math.round(contLayoutRect[innerSizeName] / 2 - (contLayoutRect[innerSizeName] - availableSpace) / 2) + contPaddingBox[beforeName]; + if (pos < 0) { + pos = contPaddingBox[beforeName]; + } + } else if (pack === 'justify') { + pos = contPaddingBox[beforeName]; + spacing = Math.floor(availableSpace / (items.length - 1)); + } + } + rect[alignAxisName] = contPaddingBox[alignBeforeName]; + for (i = 0, l = items.length; i < l; i++) { + ctrl = items[i]; + ctrlLayoutRect = ctrl.layoutRect(); + size = ctrlLayoutRect.maxFlexSize || ctrlLayoutRect[minSizeName]; + if (align === 'center') { + rect[alignAxisName] = Math.round(contLayoutRect[alignInnerSizeName] / 2 - ctrlLayoutRect[alignSizeName] / 2); + } else if (align === 'stretch') { + rect[alignSizeName] = max(ctrlLayoutRect[alignMinSizeName] || 0, contLayoutRect[alignInnerSizeName] - contPaddingBox[alignBeforeName] - contPaddingBox[alignAfterName]); + rect[alignAxisName] = contPaddingBox[alignBeforeName]; + } else if (align === 'end') { + rect[alignAxisName] = contLayoutRect[alignInnerSizeName] - ctrlLayoutRect[alignSizeName] - contPaddingBox.top; + } + if (ctrlLayoutRect.flex > 0) { + size += ctrlLayoutRect.flex * ratio; + } + rect[sizeName] = size; + rect[posName] = pos; + ctrl.layoutRect(rect); + if (ctrl.recalc) { + ctrl.recalc(); + } + pos += size + spacing; + } + } + }); + + var FlowLayout = Layout$1.extend({ + Defaults: { + containerClass: 'flow-layout', + controlClass: 'flow-layout-item', + endClass: 'break' + }, + recalc: function (container) { + container.items().filter(':visible').each(function (ctrl) { + if (ctrl.recalc) { + ctrl.recalc(); + } + }); + }, + isNative: function () { + return true; + } + }); + + var descendant = function (scope, selector) { + return one(selector, scope); + }; + + var toggleFormat = function (editor, fmt) { + return function () { + editor.execCommand('mceToggleFormat', false, fmt); + }; + }; + var addFormatChangedListener = function (editor, name, changed) { + var handler = function (state) { + changed(state, name); + }; + if (editor.formatter) { + editor.formatter.formatChanged(name, handler); + } else { + editor.on('init', function () { + editor.formatter.formatChanged(name, handler); + }); + } + }; + var postRenderFormatToggle = function (editor, name) { + return function (e) { + addFormatChangedListener(editor, name, function (state) { + e.control.active(state); + }); + }; + }; + + var register = function (editor) { + var alignFormats = [ + 'alignleft', + 'aligncenter', + 'alignright', + 'alignjustify' + ]; + var defaultAlign = 'alignleft'; + var alignMenuItems = [ + { + text: 'Left', + icon: 'alignleft', + onclick: toggleFormat(editor, 'alignleft') + }, + { + text: 'Center', + icon: 'aligncenter', + onclick: toggleFormat(editor, 'aligncenter') + }, + { + text: 'Right', + icon: 'alignright', + onclick: toggleFormat(editor, 'alignright') + }, + { + text: 'Justify', + icon: 'alignjustify', + onclick: toggleFormat(editor, 'alignjustify') + } + ]; + editor.addMenuItem('align', { + text: 'Align', + menu: alignMenuItems + }); + editor.addButton('align', { + type: 'menubutton', + icon: defaultAlign, + menu: alignMenuItems, + onShowMenu: function (e) { + var menu = e.control.menu; + global$4.each(alignFormats, function (formatName, idx) { + menu.items().eq(idx).each(function (item) { + return item.active(editor.formatter.match(formatName)); + }); + }); + }, + onPostRender: function (e) { + var ctrl = e.control; + global$4.each(alignFormats, function (formatName, idx) { + addFormatChangedListener(editor, formatName, function (state) { + ctrl.icon(defaultAlign); + if (state) { + ctrl.icon(formatName); + } + }); + }); + } + }); + global$4.each({ + alignleft: [ + 'Align left', + 'JustifyLeft' + ], + aligncenter: [ + 'Align center', + 'JustifyCenter' + ], + alignright: [ + 'Align right', + 'JustifyRight' + ], + alignjustify: [ + 'Justify', + 'JustifyFull' + ], + alignnone: [ + 'No alignment', + 'JustifyNone' + ] + }, function (item, name) { + editor.addButton(name, { + active: false, + tooltip: item[0], + cmd: item[1], + onPostRender: postRenderFormatToggle(editor, name) + }); + }); + }; + var Align = { register: register }; + + var getFirstFont = function (fontFamily) { + return fontFamily ? fontFamily.split(',')[0] : ''; + }; + var findMatchingValue = function (items, fontFamily) { + var font = fontFamily ? fontFamily.toLowerCase() : ''; + var value; + global$4.each(items, function (item) { + if (item.value.toLowerCase() === font) { + value = item.value; + } + }); + global$4.each(items, function (item) { + if (!value && getFirstFont(item.value).toLowerCase() === getFirstFont(font).toLowerCase()) { + value = item.value; + } + }); + return value; + }; + var createFontNameListBoxChangeHandler = function (editor, items) { + return function () { + var self = this; + self.state.set('value', null); + editor.on('init nodeChange', function (e) { + var fontFamily = editor.queryCommandValue('FontName'); + var match = findMatchingValue(items, fontFamily); + self.value(match ? match : null); + if (!match && fontFamily) { + self.text(getFirstFont(fontFamily)); + } + }); + }; + }; + var createFormats = function (formats) { + formats = formats.replace(/;$/, '').split(';'); + var i = formats.length; + while (i--) { + formats[i] = formats[i].split('='); + } + return formats; + }; + var getFontItems = function (editor) { + var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats'; + var fonts = createFormats(editor.settings.font_formats || defaultFontsFormats); + return global$4.map(fonts, function (font) { + return { + text: { raw: font[0] }, + value: font[1], + textStyle: font[1].indexOf('dings') === -1 ? 'font-family:' + font[1] : '' + }; + }); + }; + var registerButtons = function (editor) { + editor.addButton('fontselect', function () { + var items = getFontItems(editor); + return { + type: 'listbox', + text: 'Font Family', + tooltip: 'Font Family', + values: items, + fixedWidth: true, + onPostRender: createFontNameListBoxChangeHandler(editor, items), + onselect: function (e) { + if (e.control.settings.value) { + editor.execCommand('FontName', false, e.control.settings.value); + } + } + }; + }); + }; + var register$1 = function (editor) { + registerButtons(editor); + }; + var FontSelect = { register: register$1 }; + + var round = function (number, precision) { + var factor = Math.pow(10, precision); + return Math.round(number * factor) / factor; + }; + var toPt = function (fontSize, precision) { + if (/[0-9.]+px$/.test(fontSize)) { + return round(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt'; + } + return fontSize; + }; + var findMatchingValue$1 = function (items, pt, px) { + var value; + global$4.each(items, function (item) { + if (item.value === px) { + value = px; + } else if (item.value === pt) { + value = pt; + } + }); + return value; + }; + var createFontSizeListBoxChangeHandler = function (editor, items) { + return function () { + var self = this; + editor.on('init nodeChange', function (e) { + var px, pt, precision, match; + px = editor.queryCommandValue('FontSize'); + if (px) { + for (precision = 3; !match && precision >= 0; precision--) { + pt = toPt(px, precision); + match = findMatchingValue$1(items, pt, px); + } + } + self.value(match ? match : null); + if (!match) { + self.text(pt); + } + }); + }; + }; + var getFontSizeItems = function (editor) { + var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt'; + var fontsizeFormats = editor.settings.fontsize_formats || defaultFontsizeFormats; + return global$4.map(fontsizeFormats.split(' '), function (item) { + var text = item, value = item; + var values = item.split('='); + if (values.length > 1) { + text = values[0]; + value = values[1]; + } + return { + text: text, + value: value + }; + }); + }; + var registerButtons$1 = function (editor) { + editor.addButton('fontsizeselect', function () { + var items = getFontSizeItems(editor); + return { + type: 'listbox', + text: 'Font Sizes', + tooltip: 'Font Sizes', + values: items, + fixedWidth: true, + onPostRender: createFontSizeListBoxChangeHandler(editor, items), + onclick: function (e) { + if (e.control.settings.value) { + editor.execCommand('FontSize', false, e.control.settings.value); + } + } + }; + }); + }; + var register$2 = function (editor) { + registerButtons$1(editor); + }; + var FontSizeSelect = { register: register$2 }; + + var hideMenuObjects = function (editor, menu) { + var count = menu.length; + global$4.each(menu, function (item) { + if (item.menu) { + item.hidden = hideMenuObjects(editor, item.menu) === 0; + } + var formatName = item.format; + if (formatName) { + item.hidden = !editor.formatter.canApply(formatName); + } + if (item.hidden) { + count--; + } + }); + return count; + }; + var hideFormatMenuItems = function (editor, menu) { + var count = menu.items().length; + menu.items().each(function (item) { + if (item.menu) { + item.visible(hideFormatMenuItems(editor, item.menu) > 0); + } + if (!item.menu && item.settings.menu) { + item.visible(hideMenuObjects(editor, item.settings.menu) > 0); + } + var formatName = item.settings.format; + if (formatName) { + item.visible(editor.formatter.canApply(formatName)); + } + if (!item.visible()) { + count--; + } + }); + return count; + }; + var createFormatMenu = function (editor) { + var count = 0; + var newFormats = []; + var defaultStyleFormats = [ + { + title: 'Headings', + items: [ + { + title: 'Heading 1', + format: 'h1' + }, + { + title: 'Heading 2', + format: 'h2' + }, + { + title: 'Heading 3', + format: 'h3' + }, + { + title: 'Heading 4', + format: 'h4' + }, + { + title: 'Heading 5', + format: 'h5' + }, + { + title: 'Heading 6', + format: 'h6' + } + ] + }, + { + title: 'Inline', + items: [ + { + title: 'Bold', + icon: 'bold', + format: 'bold' + }, + { + title: 'Italic', + icon: 'italic', + format: 'italic' + }, + { + title: 'Underline', + icon: 'underline', + format: 'underline' + }, + { + title: 'Strikethrough', + icon: 'strikethrough', + format: 'strikethrough' + }, + { + title: 'Superscript', + icon: 'superscript', + format: 'superscript' + }, + { + title: 'Subscript', + icon: 'subscript', + format: 'subscript' + }, + { + title: 'Code', + icon: 'code', + format: 'code' + } + ] + }, + { + title: 'Blocks', + items: [ + { + title: 'Paragraph', + format: 'p' + }, + { + title: 'Blockquote', + format: 'blockquote' + }, + { + title: 'Div', + format: 'div' + }, + { + title: 'Pre', + format: 'pre' + } + ] + }, + { + title: 'Alignment', + items: [ + { + title: 'Left', + icon: 'alignleft', + format: 'alignleft' + }, + { + title: 'Center', + icon: 'aligncenter', + format: 'aligncenter' + }, + { + title: 'Right', + icon: 'alignright', + format: 'alignright' + }, + { + title: 'Justify', + icon: 'alignjustify', + format: 'alignjustify' + } + ] + } + ]; + var createMenu = function (formats) { + var menu = []; + if (!formats) { + return; + } + global$4.each(formats, function (format) { + var menuItem = { + text: format.title, + icon: format.icon + }; + if (format.items) { + menuItem.menu = createMenu(format.items); + } else { + var formatName = format.format || 'custom' + count++; + if (!format.format) { + format.name = formatName; + newFormats.push(format); + } + menuItem.format = formatName; + menuItem.cmd = format.cmd; + } + menu.push(menuItem); + }); + return menu; + }; + var createStylesMenu = function () { + var menu; + if (editor.settings.style_formats_merge) { + if (editor.settings.style_formats) { + menu = createMenu(defaultStyleFormats.concat(editor.settings.style_formats)); + } else { + menu = createMenu(defaultStyleFormats); + } + } else { + menu = createMenu(editor.settings.style_formats || defaultStyleFormats); + } + return menu; + }; + editor.on('init', function () { + global$4.each(newFormats, function (format) { + editor.formatter.register(format.name, format); + }); + }); + return { + type: 'menu', + items: createStylesMenu(), + onPostRender: function (e) { + editor.fire('renderFormatsMenu', { control: e.control }); + }, + itemDefaults: { + preview: true, + textStyle: function () { + if (this.settings.format) { + return editor.formatter.getCssText(this.settings.format); + } + }, + onPostRender: function () { + var self = this; + self.parent().on('show', function () { + var formatName, command; + formatName = self.settings.format; + if (formatName) { + self.disabled(!editor.formatter.canApply(formatName)); + self.active(editor.formatter.match(formatName)); + } + command = self.settings.cmd; + if (command) { + self.active(editor.queryCommandState(command)); + } + }); + }, + onclick: function () { + if (this.settings.format) { + toggleFormat(editor, this.settings.format)(); + } + if (this.settings.cmd) { + editor.execCommand(this.settings.cmd); + } + } + } + }; + }; + var registerMenuItems = function (editor, formatMenu) { + editor.addMenuItem('formats', { + text: 'Formats', + menu: formatMenu + }); + }; + var registerButtons$2 = function (editor, formatMenu) { + editor.addButton('styleselect', { + type: 'menubutton', + text: 'Formats', + menu: formatMenu, + onShowMenu: function () { + if (editor.settings.style_formats_autohide) { + hideFormatMenuItems(editor, this.menu); + } + } + }); + }; + var register$3 = function (editor) { + var formatMenu = createFormatMenu(editor); + registerMenuItems(editor, formatMenu); + registerButtons$2(editor, formatMenu); + }; + var Formats = { register: register$3 }; + + var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre'; + var createFormats$1 = function (formats) { + formats = formats.replace(/;$/, '').split(';'); + var i = formats.length; + while (i--) { + formats[i] = formats[i].split('='); + } + return formats; + }; + var createListBoxChangeHandler = function (editor, items, formatName) { + return function () { + var self = this; + editor.on('nodeChange', function (e) { + var formatter = editor.formatter; + var value = null; + global$4.each(e.parents, function (node) { + global$4.each(items, function (item) { + if (formatName) { + if (formatter.matchNode(node, formatName, { value: item.value })) { + value = item.value; + } + } else { + if (formatter.matchNode(node, item.value)) { + value = item.value; + } + } + if (value) { + return false; + } + }); + if (value) { + return false; + } + }); + self.value(value); + }); + }; + }; + var lazyFormatSelectBoxItems = function (editor, blocks) { + return function () { + var items = []; + global$4.each(blocks, function (block) { + items.push({ + text: block[0], + value: block[1], + textStyle: function () { + return editor.formatter.getCssText(block[1]); + } + }); + }); + return { + type: 'listbox', + text: blocks[0][0], + values: items, + fixedWidth: true, + onselect: function (e) { + if (e.control) { + var fmt = e.control.value(); + toggleFormat(editor, fmt)(); + } + }, + onPostRender: createListBoxChangeHandler(editor, items) + }; + }; + }; + var buildMenuItems = function (editor, blocks) { + return global$4.map(blocks, function (block) { + return { + text: block[0], + onclick: toggleFormat(editor, block[1]), + textStyle: function () { + return editor.formatter.getCssText(block[1]); + } + }; + }); + }; + var register$4 = function (editor) { + var blocks = createFormats$1(editor.settings.block_formats || defaultBlocks); + editor.addMenuItem('blockformats', { + text: 'Blocks', + menu: buildMenuItems(editor, blocks) + }); + editor.addButton('formatselect', lazyFormatSelectBoxItems(editor, blocks)); + }; + var FormatSelect = { register: register$4 }; + + var createCustomMenuItems = function (editor, names) { + var items, nameList; + if (typeof names === 'string') { + nameList = names.split(' '); + } else if (global$4.isArray(names)) { + return flatten$1(global$4.map(names, function (names) { + return createCustomMenuItems(editor, names); + })); + } + items = global$4.grep(nameList, function (name) { + return name === '|' || name in editor.menuItems; + }); + return global$4.map(items, function (name) { + return name === '|' ? { text: '-' } : editor.menuItems[name]; + }); + }; + var isSeparator = function (menuItem) { + return menuItem && menuItem.text === '-'; + }; + var trimMenuItems = function (menuItems) { + var menuItems2 = filter(menuItems, function (menuItem, i) { + return !isSeparator(menuItem) || !isSeparator(menuItems[i - 1]); + }); + return filter(menuItems2, function (menuItem, i) { + return !isSeparator(menuItem) || i > 0 && i < menuItems2.length - 1; + }); + }; + var createContextMenuItems = function (editor, context) { + var outputMenuItems = [{ text: '-' }]; + var menuItems = global$4.grep(editor.menuItems, function (menuItem) { + return menuItem.context === context; + }); + global$4.each(menuItems, function (menuItem) { + if (menuItem.separator === 'before') { + outputMenuItems.push({ text: '|' }); + } + if (menuItem.prependToContext) { + outputMenuItems.unshift(menuItem); + } else { + outputMenuItems.push(menuItem); + } + if (menuItem.separator === 'after') { + outputMenuItems.push({ text: '|' }); + } + }); + return outputMenuItems; + }; + var createInsertMenu = function (editor) { + var insertButtonItems = editor.settings.insert_button_items; + if (insertButtonItems) { + return trimMenuItems(createCustomMenuItems(editor, insertButtonItems)); + } else { + return trimMenuItems(createContextMenuItems(editor, 'insert')); + } + }; + var registerButtons$3 = function (editor) { + editor.addButton('insert', { + type: 'menubutton', + icon: 'insert', + menu: [], + oncreatemenu: function () { + this.menu.add(createInsertMenu(editor)); + this.menu.renderNew(); + } + }); + }; + var register$5 = function (editor) { + registerButtons$3(editor); + }; + var InsertButton = { register: register$5 }; + + var registerFormatButtons = function (editor) { + global$4.each({ + bold: 'Bold', + italic: 'Italic', + underline: 'Underline', + strikethrough: 'Strikethrough', + subscript: 'Subscript', + superscript: 'Superscript' + }, function (text, name) { + editor.addButton(name, { + active: false, + tooltip: text, + onPostRender: postRenderFormatToggle(editor, name), + onclick: toggleFormat(editor, name) + }); + }); + }; + var registerCommandButtons = function (editor) { + global$4.each({ + outdent: [ + 'Decrease indent', + 'Outdent' + ], + indent: [ + 'Increase indent', + 'Indent' + ], + cut: [ + 'Cut', + 'Cut' + ], + copy: [ + 'Copy', + 'Copy' + ], + paste: [ + 'Paste', + 'Paste' + ], + help: [ + 'Help', + 'mceHelp' + ], + selectall: [ + 'Select all', + 'SelectAll' + ], + visualaid: [ + 'Visual aids', + 'mceToggleVisualAid' + ], + newdocument: [ + 'New document', + 'mceNewDocument' + ], + removeformat: [ + 'Clear formatting', + 'RemoveFormat' + ], + remove: [ + 'Remove', + 'Delete' + ] + }, function (item, name) { + editor.addButton(name, { + tooltip: item[0], + cmd: item[1] + }); + }); + }; + var registerCommandToggleButtons = function (editor) { + global$4.each({ + blockquote: [ + 'Blockquote', + 'mceBlockQuote' + ], + subscript: [ + 'Subscript', + 'Subscript' + ], + superscript: [ + 'Superscript', + 'Superscript' + ] + }, function (item, name) { + editor.addButton(name, { + active: false, + tooltip: item[0], + cmd: item[1], + onPostRender: postRenderFormatToggle(editor, name) + }); + }); + }; + var registerButtons$4 = function (editor) { + registerFormatButtons(editor); + registerCommandButtons(editor); + registerCommandToggleButtons(editor); + }; + var registerMenuItems$1 = function (editor) { + global$4.each({ + bold: [ + 'Bold', + 'Bold', + 'Meta+B' + ], + italic: [ + 'Italic', + 'Italic', + 'Meta+I' + ], + underline: [ + 'Underline', + 'Underline', + 'Meta+U' + ], + strikethrough: [ + 'Strikethrough', + 'Strikethrough' + ], + subscript: [ + 'Subscript', + 'Subscript' + ], + superscript: [ + 'Superscript', + 'Superscript' + ], + removeformat: [ + 'Clear formatting', + 'RemoveFormat' + ], + newdocument: [ + 'New document', + 'mceNewDocument' + ], + cut: [ + 'Cut', + 'Cut', + 'Meta+X' + ], + copy: [ + 'Copy', + 'Copy', + 'Meta+C' + ], + paste: [ + 'Paste', + 'Paste', + 'Meta+V' + ], + selectall: [ + 'Select all', + 'SelectAll', + 'Meta+A' + ] + }, function (item, name) { + editor.addMenuItem(name, { + text: item[0], + icon: name, + shortcut: item[2], + cmd: item[1] + }); + }); + editor.addMenuItem('codeformat', { + text: 'Code', + icon: 'code', + onclick: toggleFormat(editor, 'code') + }); + }; + var register$6 = function (editor) { + registerButtons$4(editor); + registerMenuItems$1(editor); + }; + var SimpleControls = { register: register$6 }; + + var toggleUndoRedoState = function (editor, type) { + return function () { + var self = this; + var checkState = function () { + var typeFn = type === 'redo' ? 'hasRedo' : 'hasUndo'; + return editor.undoManager ? editor.undoManager[typeFn]() : false; + }; + self.disabled(!checkState()); + editor.on('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', function () { + self.disabled(editor.readonly || !checkState()); + }); + }; + }; + var registerMenuItems$2 = function (editor) { + editor.addMenuItem('undo', { + text: 'Undo', + icon: 'undo', + shortcut: 'Meta+Z', + onPostRender: toggleUndoRedoState(editor, 'undo'), + cmd: 'undo' + }); + editor.addMenuItem('redo', { + text: 'Redo', + icon: 'redo', + shortcut: 'Meta+Y', + onPostRender: toggleUndoRedoState(editor, 'redo'), + cmd: 'redo' + }); + }; + var registerButtons$5 = function (editor) { + editor.addButton('undo', { + tooltip: 'Undo', + onPostRender: toggleUndoRedoState(editor, 'undo'), + cmd: 'undo' + }); + editor.addButton('redo', { + tooltip: 'Redo', + onPostRender: toggleUndoRedoState(editor, 'redo'), + cmd: 'redo' + }); + }; + var register$7 = function (editor) { + registerMenuItems$2(editor); + registerButtons$5(editor); + }; + var UndoRedo = { register: register$7 }; + + var toggleVisualAidState = function (editor) { + return function () { + var self = this; + editor.on('VisualAid', function (e) { + self.active(e.hasVisual); + }); + self.active(editor.hasVisual); + }; + }; + var registerMenuItems$3 = function (editor) { + editor.addMenuItem('visualaid', { + text: 'Visual aids', + selectable: true, + onPostRender: toggleVisualAidState(editor), + cmd: 'mceToggleVisualAid' + }); + }; + var register$8 = function (editor) { + registerMenuItems$3(editor); + }; + var VisualAid = { register: register$8 }; + + var setupEnvironment = function () { + Widget.tooltips = !global$1.iOS; + Control$1.translate = function (text) { + return global$5.translate(text); + }; + }; + var setupUiContainer = function (editor) { + if (editor.settings.ui_container) { + global$1.container = descendant(Element.fromDom(domGlobals.document.body), editor.settings.ui_container).fold(constant(null), function (elm) { + return elm.dom(); + }); + } + }; + var setupRtlMode = function (editor) { + if (editor.rtl) { + Control$1.rtl = true; + } + }; + var setupHideFloatPanels = function (editor) { + editor.on('mousedown progressstate', function () { + FloatPanel.hideAll(); + }); + }; + var setup = function (editor) { + setupRtlMode(editor); + setupHideFloatPanels(editor); + setupUiContainer(editor); + setupEnvironment(); + FormatSelect.register(editor); + Align.register(editor); + SimpleControls.register(editor); + UndoRedo.register(editor); + FontSizeSelect.register(editor); + FontSelect.register(editor); + Formats.register(editor); + VisualAid.register(editor); + InsertButton.register(editor); + }; + var FormatControls = { setup: setup }; + + var GridLayout = AbsoluteLayout.extend({ + recalc: function (container) { + var settings, rows, cols, items, contLayoutRect, width, height, rect, ctrlLayoutRect, ctrl, x, y, posX, posY, ctrlSettings, contPaddingBox, align, spacingH, spacingV, alignH, alignV, maxX, maxY; + var colWidths = []; + var rowHeights = []; + var ctrlMinWidth, ctrlMinHeight, availableWidth, availableHeight, reverseRows, idx; + settings = container.settings; + items = container.items().filter(':visible'); + contLayoutRect = container.layoutRect(); + cols = settings.columns || Math.ceil(Math.sqrt(items.length)); + rows = Math.ceil(items.length / cols); + spacingH = settings.spacingH || settings.spacing || 0; + spacingV = settings.spacingV || settings.spacing || 0; + alignH = settings.alignH || settings.align; + alignV = settings.alignV || settings.align; + contPaddingBox = container.paddingBox; + reverseRows = 'reverseRows' in settings ? settings.reverseRows : container.isRtl(); + if (alignH && typeof alignH === 'string') { + alignH = [alignH]; + } + if (alignV && typeof alignV === 'string') { + alignV = [alignV]; + } + for (x = 0; x < cols; x++) { + colWidths.push(0); + } + for (y = 0; y < rows; y++) { + rowHeights.push(0); + } + for (y = 0; y < rows; y++) { + for (x = 0; x < cols; x++) { + ctrl = items[y * cols + x]; + if (!ctrl) { + break; + } + ctrlLayoutRect = ctrl.layoutRect(); + ctrlMinWidth = ctrlLayoutRect.minW; + ctrlMinHeight = ctrlLayoutRect.minH; + colWidths[x] = ctrlMinWidth > colWidths[x] ? ctrlMinWidth : colWidths[x]; + rowHeights[y] = ctrlMinHeight > rowHeights[y] ? ctrlMinHeight : rowHeights[y]; + } + } + availableWidth = contLayoutRect.innerW - contPaddingBox.left - contPaddingBox.right; + for (maxX = 0, x = 0; x < cols; x++) { + maxX += colWidths[x] + (x > 0 ? spacingH : 0); + availableWidth -= (x > 0 ? spacingH : 0) + colWidths[x]; + } + availableHeight = contLayoutRect.innerH - contPaddingBox.top - contPaddingBox.bottom; + for (maxY = 0, y = 0; y < rows; y++) { + maxY += rowHeights[y] + (y > 0 ? spacingV : 0); + availableHeight -= (y > 0 ? spacingV : 0) + rowHeights[y]; + } + maxX += contPaddingBox.left + contPaddingBox.right; + maxY += contPaddingBox.top + contPaddingBox.bottom; + rect = {}; + rect.minW = maxX + (contLayoutRect.w - contLayoutRect.innerW); + rect.minH = maxY + (contLayoutRect.h - contLayoutRect.innerH); + rect.contentW = rect.minW - contLayoutRect.deltaW; + rect.contentH = rect.minH - contLayoutRect.deltaH; + rect.minW = Math.min(rect.minW, contLayoutRect.maxW); + rect.minH = Math.min(rect.minH, contLayoutRect.maxH); + rect.minW = Math.max(rect.minW, contLayoutRect.startMinWidth); + rect.minH = Math.max(rect.minH, contLayoutRect.startMinHeight); + if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) { + rect.w = rect.minW; + rect.h = rect.minH; + container.layoutRect(rect); + this.recalc(container); + if (container._lastRect === null) { + var parentCtrl = container.parent(); + if (parentCtrl) { + parentCtrl._lastRect = null; + parentCtrl.recalc(); + } + } + return; + } + if (contLayoutRect.autoResize) { + rect = container.layoutRect(rect); + rect.contentW = rect.minW - contLayoutRect.deltaW; + rect.contentH = rect.minH - contLayoutRect.deltaH; + } + var flexV; + if (settings.packV === 'start') { + flexV = 0; + } else { + flexV = availableHeight > 0 ? Math.floor(availableHeight / rows) : 0; + } + var totalFlex = 0; + var flexWidths = settings.flexWidths; + if (flexWidths) { + for (x = 0; x < flexWidths.length; x++) { + totalFlex += flexWidths[x]; + } + } else { + totalFlex = cols; + } + var ratio = availableWidth / totalFlex; + for (x = 0; x < cols; x++) { + colWidths[x] += flexWidths ? flexWidths[x] * ratio : ratio; + } + posY = contPaddingBox.top; + for (y = 0; y < rows; y++) { + posX = contPaddingBox.left; + height = rowHeights[y] + flexV; + for (x = 0; x < cols; x++) { + if (reverseRows) { + idx = y * cols + cols - 1 - x; + } else { + idx = y * cols + x; + } + ctrl = items[idx]; + if (!ctrl) { + break; + } + ctrlSettings = ctrl.settings; + ctrlLayoutRect = ctrl.layoutRect(); + width = Math.max(colWidths[x], ctrlLayoutRect.startMinWidth); + ctrlLayoutRect.x = posX; + ctrlLayoutRect.y = posY; + align = ctrlSettings.alignH || (alignH ? alignH[x] || alignH[0] : null); + if (align === 'center') { + ctrlLayoutRect.x = posX + width / 2 - ctrlLayoutRect.w / 2; + } else if (align === 'right') { + ctrlLayoutRect.x = posX + width - ctrlLayoutRect.w; + } else if (align === 'stretch') { + ctrlLayoutRect.w = width; + } + align = ctrlSettings.alignV || (alignV ? alignV[x] || alignV[0] : null); + if (align === 'center') { + ctrlLayoutRect.y = posY + height / 2 - ctrlLayoutRect.h / 2; + } else if (align === 'bottom') { + ctrlLayoutRect.y = posY + height - ctrlLayoutRect.h; + } else if (align === 'stretch') { + ctrlLayoutRect.h = height; + } + ctrl.layoutRect(ctrlLayoutRect); + posX += width + spacingH; + if (ctrl.recalc) { + ctrl.recalc(); + } + } + posY += height + spacingV; + } + } + }); + + var Iframe = Widget.extend({ + renderHtml: function () { + var self = this; + self.classes.add('iframe'); + self.canFocus = false; + return '<iframe id="' + self._id + '" class="' + self.classes + '" tabindex="-1" src="' + (self.settings.url || 'javascript:\'\'') + '" frameborder="0"></iframe>'; + }, + src: function (src) { + this.getEl().src = src; + }, + html: function (html, callback) { + var self = this, body = this.getEl().contentWindow.document.body; + if (!body) { + global$3.setTimeout(function () { + self.html(html); + }); + } else { + body.innerHTML = html; + if (callback) { + callback(); + } + } + return this; + } + }); + + var InfoBox = Widget.extend({ + init: function (settings) { + var self = this; + self._super(settings); + self.classes.add('widget').add('infobox'); + self.canFocus = false; + }, + severity: function (level) { + this.classes.remove('error'); + this.classes.remove('warning'); + this.classes.remove('success'); + this.classes.add(level); + }, + help: function (state) { + this.state.set('help', state); + }, + renderHtml: function () { + var self = this, prefix = self.classPrefix; + return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + self.encode(self.state.get('text')) + '<button role="button" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-help"></i>' + '</button>' + '</div>' + '</div>'; + }, + bindStates: function () { + var self = this; + self.state.on('change:text', function (e) { + self.getEl('body').firstChild.data = self.encode(e.value); + if (self.state.get('rendered')) { + self.updateLayoutRect(); + } + }); + self.state.on('change:help', function (e) { + self.classes.toggle('has-help', e.value); + if (self.state.get('rendered')) { + self.updateLayoutRect(); + } + }); + return self._super(); + } + }); + + var Label = Widget.extend({ + init: function (settings) { + var self = this; + self._super(settings); + self.classes.add('widget').add('label'); + self.canFocus = false; + if (settings.multiline) { + self.classes.add('autoscroll'); + } + if (settings.strong) { + self.classes.add('strong'); + } + }, + initLayoutRect: function () { + var self = this, layoutRect = self._super(); + if (self.settings.multiline) { + var size = funcs.getSize(self.getEl()); + if (size.width > layoutRect.maxW) { + layoutRect.minW = layoutRect.maxW; + self.classes.add('multiline'); + } + self.getEl().style.width = layoutRect.minW + 'px'; + layoutRect.startMinH = layoutRect.h = layoutRect.minH = Math.min(layoutRect.maxH, funcs.getSize(self.getEl()).height); + } + return layoutRect; + }, + repaint: function () { + var self = this; + if (!self.settings.multiline) { + self.getEl().style.lineHeight = self.layoutRect().h + 'px'; + } + return self._super(); + }, + severity: function (level) { + this.classes.remove('error'); + this.classes.remove('warning'); + this.classes.remove('success'); + this.classes.add(level); + }, + renderHtml: function () { + var self = this; + var targetCtrl, forName, forId = self.settings.forId; + var text = self.settings.html ? self.settings.html : self.encode(self.state.get('text')); + if (!forId && (forName = self.settings.forName)) { + targetCtrl = self.getRoot().find('#' + forName)[0]; + if (targetCtrl) { + forId = targetCtrl._id; + } + } + if (forId) { + return '<label id="' + self._id + '" class="' + self.classes + '"' + (forId ? ' for="' + forId + '"' : '') + '>' + text + '</label>'; + } + return '<span id="' + self._id + '" class="' + self.classes + '">' + text + '</span>'; + }, + bindStates: function () { + var self = this; + self.state.on('change:text', function (e) { + self.innerHtml(self.encode(e.value)); + if (self.state.get('rendered')) { + self.updateLayoutRect(); + } + }); + return self._super(); + } + }); + + var Toolbar$1 = Container.extend({ + Defaults: { + role: 'toolbar', + layout: 'flow' + }, + init: function (settings) { + var self = this; + self._super(settings); + self.classes.add('toolbar'); + }, + postRender: function () { + var self = this; + self.items().each(function (ctrl) { + ctrl.classes.add('toolbar-item'); + }); + return self._super(); + } + }); + + var MenuBar = Toolbar$1.extend({ + Defaults: { + role: 'menubar', + containerCls: 'menubar', + ariaRoot: true, + defaults: { type: 'menubutton' } + } + }); + + function isChildOf$1(node, parent) { + while (node) { + if (parent === node) { + return true; + } + node = node.parentNode; + } + return false; + } + var MenuButton = Button.extend({ + init: function (settings) { + var self = this; + self._renderOpen = true; + self._super(settings); + settings = self.settings; + self.classes.add('menubtn'); + if (settings.fixedWidth) { + self.classes.add('fixed-width'); + } + self.aria('haspopup', true); + self.state.set('menu', settings.menu || self.render()); + }, + showMenu: function (toggle) { + var self = this; + var menu; + if (self.menu && self.menu.visible() && toggle !== false) { + return self.hideMenu(); + } + if (!self.menu) { + menu = self.state.get('menu') || []; + self.classes.add('opened'); + if (menu.length) { + menu = { + type: 'menu', + animate: true, + items: menu + }; + } else { + menu.type = menu.type || 'menu'; + menu.animate = true; + } + if (!menu.renderTo) { + self.menu = global$b.create(menu).parent(self).renderTo(); + } else { + self.menu = menu.parent(self).show().renderTo(); + } + self.fire('createmenu'); + self.menu.reflow(); + self.menu.on('cancel', function (e) { + if (e.control.parent() === self.menu) { + e.stopPropagation(); + self.focus(); + self.hideMenu(); + } + }); + self.menu.on('select', function () { + self.focus(); + }); + self.menu.on('show hide', function (e) { + if (e.type === 'hide' && e.control.parent() === self) { + self.classes.remove('opened-under'); + } + if (e.control === self.menu) { + self.activeMenu(e.type === 'show'); + self.classes.toggle('opened', e.type === 'show'); + } + self.aria('expanded', e.type === 'show'); + }).fire('show'); + } + self.menu.show(); + self.menu.layoutRect({ w: self.layoutRect().w }); + self.menu.repaint(); + self.menu.moveRel(self.getEl(), self.isRtl() ? [ + 'br-tr', + 'tr-br' + ] : [ + 'bl-tl', + 'tl-bl' + ]); + var menuLayoutRect = self.menu.layoutRect(); + var selfBottom = self.$el.offset().top + self.layoutRect().h; + if (selfBottom > menuLayoutRect.y && selfBottom < menuLayoutRect.y + menuLayoutRect.h) { + self.classes.add('opened-under'); + } + self.fire('showmenu'); + }, + hideMenu: function () { + var self = this; + if (self.menu) { + self.menu.items().each(function (item) { + if (item.hideMenu) { + item.hideMenu(); + } + }); + self.menu.hide(); + } + }, + activeMenu: function (state) { + this.classes.toggle('active', state); + }, + renderHtml: function () { + var self = this, id = self._id, prefix = self.classPrefix; + var icon = self.settings.icon, image; + var text = self.state.get('text'); + var textHtml = ''; + image = self.settings.image; + if (image) { + icon = 'none'; + if (typeof image !== 'string') { + image = domGlobals.window.getSelection ? image[0] : image[1]; + } + image = ' style="background-image: url(\'' + image + '\')"'; + } else { + image = ''; + } + if (text) { + self.classes.add('btn-has-text'); + textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>'; + } + icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : ''; + self.aria('role', self.parent() instanceof MenuBar ? 'menuitem' : 'button'); + return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1" aria-labelledby="' + id + '">' + '<button id="' + id + '-open" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>'; + }, + postRender: function () { + var self = this; + self.on('click', function (e) { + if (e.control === self && isChildOf$1(e.target, self.getEl())) { + self.focus(); + self.showMenu(!e.aria); + if (e.aria) { + self.menu.items().filter(':visible')[0].focus(); + } + } + }); + self.on('mouseenter', function (e) { + var overCtrl = e.control; + var parent = self.parent(); + var hasVisibleSiblingMenu; + if (overCtrl && parent && overCtrl instanceof MenuButton && overCtrl.parent() === parent) { + parent.items().filter('MenuButton').each(function (ctrl) { + if (ctrl.hideMenu && ctrl !== overCtrl) { + if (ctrl.menu && ctrl.menu.visible()) { + hasVisibleSiblingMenu = true; + } + ctrl.hideMenu(); + } + }); + if (hasVisibleSiblingMenu) { + overCtrl.focus(); + overCtrl.showMenu(); + } + } + }); + return self._super(); + }, + bindStates: function () { + var self = this; + self.state.on('change:menu', function () { + if (self.menu) { + self.menu.remove(); + } + self.menu = null; + }); + return self._super(); + }, + remove: function () { + this._super(); + if (this.menu) { + this.menu.remove(); + } + } + }); + + function Throbber (elm, inline) { + var self = this; + var state; + var classPrefix = Control$1.classPrefix; + var timer; + self.show = function (time, callback) { + function render() { + if (state) { + global$7(elm).append('<div class="' + classPrefix + 'throbber' + (inline ? ' ' + classPrefix + 'throbber-inline' : '') + '"></div>'); + if (callback) { + callback(); + } + } + } + self.hide(); + state = true; + if (time) { + timer = global$3.setTimeout(render, time); + } else { + render(); + } + return self; + }; + self.hide = function () { + var child = elm.lastChild; + global$3.clearTimeout(timer); + if (child && child.className.indexOf('throbber') !== -1) { + child.parentNode.removeChild(child); + } + state = false; + return self; + }; + } + + var Menu = FloatPanel.extend({ + Defaults: { + defaultType: 'menuitem', + border: 1, + layout: 'stack', + role: 'application', + bodyRole: 'menu', + ariaRoot: true + }, + init: function (settings) { + var self = this; + settings.autohide = true; + settings.constrainToViewport = true; + if (typeof settings.items === 'function') { + settings.itemsFactory = settings.items; + settings.items = []; + } + if (settings.itemDefaults) { + var items = settings.items; + var i = items.length; + while (i--) { + items[i] = global$4.extend({}, settings.itemDefaults, items[i]); + } + } + self._super(settings); + self.classes.add('menu'); + if (settings.animate && global$1.ie !== 11) { + self.classes.add('animate'); + } + }, + repaint: function () { + this.classes.toggle('menu-align', true); + this._super(); + this.getEl().style.height = ''; + this.getEl('body').style.height = ''; + return this; + }, + cancel: function () { + var self = this; + self.hideAll(); + self.fire('select'); + }, + load: function () { + var self = this; + var time, factory; + function hideThrobber() { + if (self.throbber) { + self.throbber.hide(); + self.throbber = null; + } + } + factory = self.settings.itemsFactory; + if (!factory) { + return; + } + if (!self.throbber) { + self.throbber = new Throbber(self.getEl('body'), true); + if (self.items().length === 0) { + self.throbber.show(); + self.fire('loading'); + } else { + self.throbber.show(100, function () { + self.items().remove(); + self.fire('loading'); + }); + } + self.on('hide close', hideThrobber); + } + self.requestTime = time = new Date().getTime(); + self.settings.itemsFactory(function (items) { + if (items.length === 0) { + self.hide(); + return; + } + if (self.requestTime !== time) { + return; + } + self.getEl().style.width = ''; + self.getEl('body').style.width = ''; + hideThrobber(); + self.items().remove(); + self.getEl('body').innerHTML = ''; + self.add(items); + self.renderNew(); + self.fire('loaded'); + }); + }, + hideAll: function () { + var self = this; + this.find('menuitem').exec('hideMenu'); + return self._super(); + }, + preRender: function () { + var self = this; + self.items().each(function (ctrl) { + var settings = ctrl.settings; + if (settings.icon || settings.image || settings.selectable) { + self._hasIcons = true; + return false; + } + }); + if (self.settings.itemsFactory) { + self.on('postrender', function () { + if (self.settings.itemsFactory) { + self.load(); + } + }); + } + self.on('show hide', function (e) { + if (e.control === self) { + if (e.type === 'show') { + global$3.setTimeout(function () { + self.classes.add('in'); + }, 0); + } else { + self.classes.remove('in'); + } + } + }); + return self._super(); + } + }); + + var ListBox = MenuButton.extend({ + init: function (settings) { + var self = this; + var values, selected, selectedText, lastItemCtrl; + function setSelected(menuValues) { + for (var i = 0; i < menuValues.length; i++) { + selected = menuValues[i].selected || settings.value === menuValues[i].value; + if (selected) { + selectedText = selectedText || menuValues[i].text; + self.state.set('value', menuValues[i].value); + return true; + } + if (menuValues[i].menu) { + if (setSelected(menuValues[i].menu)) { + return true; + } + } + } + } + self._super(settings); + settings = self.settings; + self._values = values = settings.values; + if (values) { + if (typeof settings.value !== 'undefined') { + setSelected(values); + } + if (!selected && values.length > 0) { + selectedText = values[0].text; + self.state.set('value', values[0].value); + } + self.state.set('menu', values); + } + self.state.set('text', settings.text || selectedText); + self.classes.add('listbox'); + self.on('select', function (e) { + var ctrl = e.control; + if (lastItemCtrl) { + e.lastControl = lastItemCtrl; + } + if (settings.multiple) { + ctrl.active(!ctrl.active()); + } else { + self.value(e.control.value()); + } + lastItemCtrl = ctrl; + }); + }, + value: function (value) { + if (arguments.length === 0) { + return this.state.get('value'); + } + if (typeof value === 'undefined') { + return this; + } + function valueExists(values) { + return exists(values, function (a) { + return a.menu ? valueExists(a.menu) : a.value === value; + }); + } + if (this.settings.values) { + if (valueExists(this.settings.values)) { + this.state.set('value', value); + } else if (value === null) { + this.state.set('value', null); + } + } else { + this.state.set('value', value); + } + return this; + }, + bindStates: function () { + var self = this; + function activateMenuItemsByValue(menu, value) { + if (menu instanceof Menu) { + menu.items().each(function (ctrl) { + if (!ctrl.hasMenus()) { + ctrl.active(ctrl.value() === value); + } + }); + } + } + function getSelectedItem(menuValues, value) { + var selectedItem; + if (!menuValues) { + return; + } + for (var i = 0; i < menuValues.length; i++) { + if (menuValues[i].value === value) { + return menuValues[i]; + } + if (menuValues[i].menu) { + selectedItem = getSelectedItem(menuValues[i].menu, value); + if (selectedItem) { + return selectedItem; + } + } + } + } + self.on('show', function (e) { + activateMenuItemsByValue(e.control, self.value()); + }); + self.state.on('change:value', function (e) { + var selectedItem = getSelectedItem(self.state.get('menu'), e.value); + if (selectedItem) { + self.text(selectedItem.text); + } else { + self.text(self.settings.text); + } + }); + return self._super(); + } + }); + + var toggleTextStyle = function (ctrl, state) { + var textStyle = ctrl._textStyle; + if (textStyle) { + var textElm = ctrl.getEl('text'); + textElm.setAttribute('style', textStyle); + if (state) { + textElm.style.color = ''; + textElm.style.backgroundColor = ''; + } + } + }; + var MenuItem = Widget.extend({ + Defaults: { + border: 0, + role: 'menuitem' + }, + init: function (settings) { + var self = this; + var text; + self._super(settings); + settings = self.settings; + self.classes.add('menu-item'); + if (settings.menu) { + self.classes.add('menu-item-expand'); + } + if (settings.preview) { + self.classes.add('menu-item-preview'); + } + text = self.state.get('text'); + if (text === '-' || text === '|') { + self.classes.add('menu-item-sep'); + self.aria('role', 'separator'); + self.state.set('text', '-'); + } + if (settings.selectable) { + self.aria('role', 'menuitemcheckbox'); + self.classes.add('menu-item-checkbox'); + settings.icon = 'selected'; + } + if (!settings.preview && !settings.selectable) { + self.classes.add('menu-item-normal'); + } + self.on('mousedown', function (e) { + e.preventDefault(); + }); + if (settings.menu && !settings.ariaHideMenu) { + self.aria('haspopup', true); + } + }, + hasMenus: function () { + return !!this.settings.menu; + }, + showMenu: function () { + var self = this; + var settings = self.settings; + var menu; + var parent = self.parent(); + parent.items().each(function (ctrl) { + if (ctrl !== self) { + ctrl.hideMenu(); + } + }); + if (settings.menu) { + menu = self.menu; + if (!menu) { + menu = settings.menu; + if (menu.length) { + menu = { + type: 'menu', + items: menu + }; + } else { + menu.type = menu.type || 'menu'; + } + if (parent.settings.itemDefaults) { + menu.itemDefaults = parent.settings.itemDefaults; + } + menu = self.menu = global$b.create(menu).parent(self).renderTo(); + menu.reflow(); + menu.on('cancel', function (e) { + e.stopPropagation(); + self.focus(); + menu.hide(); + }); + menu.on('show hide', function (e) { + if (e.control.items) { + e.control.items().each(function (ctrl) { + ctrl.active(ctrl.settings.selected); + }); + } + }).fire('show'); + menu.on('hide', function (e) { + if (e.control === menu) { + self.classes.remove('selected'); + } + }); + menu.submenu = true; + } else { + menu.show(); + } + menu._parentMenu = parent; + menu.classes.add('menu-sub'); + var rel = menu.testMoveRel(self.getEl(), self.isRtl() ? [ + 'tl-tr', + 'bl-br', + 'tr-tl', + 'br-bl' + ] : [ + 'tr-tl', + 'br-bl', + 'tl-tr', + 'bl-br' + ]); + menu.moveRel(self.getEl(), rel); + menu.rel = rel; + rel = 'menu-sub-' + rel; + menu.classes.remove(menu._lastRel).add(rel); + menu._lastRel = rel; + self.classes.add('selected'); + self.aria('expanded', true); + } + }, + hideMenu: function () { + var self = this; + if (self.menu) { + self.menu.items().each(function (item) { + if (item.hideMenu) { + item.hideMenu(); + } + }); + self.menu.hide(); + self.aria('expanded', false); + } + return self; + }, + renderHtml: function () { + var self = this; + var id = self._id; + var settings = self.settings; + var prefix = self.classPrefix; + var text = self.state.get('text'); + var icon = self.settings.icon, image = '', shortcut = settings.shortcut; + var url = self.encode(settings.url), iconHtml = ''; + function convertShortcut(shortcut) { + var i, value, replace = {}; + if (global$1.mac) { + replace = { + alt: '⌥', + ctrl: '⌘', + shift: '⇧', + meta: '⌘' + }; + } else { + replace = { meta: 'Ctrl' }; + } + shortcut = shortcut.split('+'); + for (i = 0; i < shortcut.length; i++) { + value = replace[shortcut[i].toLowerCase()]; + if (value) { + shortcut[i] = value; + } + } + return shortcut.join('+'); + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + function markMatches(text) { + var match = settings.match || ''; + return match ? text.replace(new RegExp(escapeRegExp(match), 'gi'), function (match) { + return '!mce~match[' + match + ']mce~match!'; + }) : text; + } + function boldMatches(text) { + return text.replace(new RegExp(escapeRegExp('!mce~match['), 'g'), '<b>').replace(new RegExp(escapeRegExp(']mce~match!'), 'g'), '</b>'); + } + if (icon) { + self.parent().classes.add('menu-has-icons'); + } + if (settings.image) { + image = ' style="background-image: url(\'' + settings.image + '\')"'; + } + if (shortcut) { + shortcut = convertShortcut(shortcut); + } + icon = prefix + 'ico ' + prefix + 'i-' + (self.settings.icon || 'none'); + iconHtml = text !== '-' ? '<i class="' + icon + '"' + image + '></i>\xA0' : ''; + text = boldMatches(self.encode(markMatches(text))); + url = boldMatches(self.encode(markMatches(url))); + return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1">' + iconHtml + (text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') + (shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' + shortcut + '</div>' : '') + (settings.menu ? '<div class="' + prefix + 'caret"></div>' : '') + (url ? '<div class="' + prefix + 'menu-item-link">' + url + '</div>' : '') + '</div>'; + }, + postRender: function () { + var self = this, settings = self.settings; + var textStyle = settings.textStyle; + if (typeof textStyle === 'function') { + textStyle = textStyle.call(this); + } + if (textStyle) { + var textElm = self.getEl('text'); + if (textElm) { + textElm.setAttribute('style', textStyle); + self._textStyle = textStyle; + } + } + self.on('mouseenter click', function (e) { + if (e.control === self) { + if (!settings.menu && e.type === 'click') { + self.fire('select'); + global$3.requestAnimationFrame(function () { + self.parent().hideAll(); + }); + } else { + self.showMenu(); + if (e.aria) { + self.menu.focus(true); + } + } + } + }); + self._super(); + return self; + }, + hover: function () { + var self = this; + self.parent().items().each(function (ctrl) { + ctrl.classes.remove('selected'); + }); + self.classes.toggle('selected', true); + return self; + }, + active: function (state) { + toggleTextStyle(this, state); + if (typeof state !== 'undefined') { + this.aria('checked', state); + } + return this._super(state); + }, + remove: function () { + this._super(); + if (this.menu) { + this.menu.remove(); + } + } + }); + + var Radio = Checkbox.extend({ + Defaults: { + classes: 'radio', + role: 'radio' + } + }); + + var ResizeHandle = Widget.extend({ + renderHtml: function () { + var self = this, prefix = self.classPrefix; + self.classes.add('resizehandle'); + if (self.settings.direction === 'both') { + self.classes.add('resizehandle-both'); + } + self.canFocus = false; + return '<div id="' + self._id + '" class="' + self.classes + '">' + '<i class="' + prefix + 'ico ' + prefix + 'i-resize"></i>' + '</div>'; + }, + postRender: function () { + var self = this; + self._super(); + self.resizeDragHelper = new DragHelper(this._id, { + start: function () { + self.fire('ResizeStart'); + }, + drag: function (e) { + if (self.settings.direction !== 'both') { + e.deltaX = 0; + } + self.fire('Resize', e); + }, + stop: function () { + self.fire('ResizeEnd'); + } + }); + }, + remove: function () { + if (this.resizeDragHelper) { + this.resizeDragHelper.destroy(); + } + return this._super(); + } + }); + + function createOptions(options) { + var strOptions = ''; + if (options) { + for (var i = 0; i < options.length; i++) { + strOptions += '<option value="' + options[i] + '">' + options[i] + '</option>'; + } + } + return strOptions; + } + var SelectBox = Widget.extend({ + Defaults: { + classes: 'selectbox', + role: 'selectbox', + options: [] + }, + init: function (settings) { + var self = this; + self._super(settings); + if (self.settings.size) { + self.size = self.settings.size; + } + if (self.settings.options) { + self._options = self.settings.options; + } + self.on('keydown', function (e) { + var rootControl; + if (e.keyCode === 13) { + e.preventDefault(); + self.parents().reverse().each(function (ctrl) { + if (ctrl.toJSON) { + rootControl = ctrl; + return false; + } + }); + self.fire('submit', { data: rootControl.toJSON() }); + } + }); + }, + options: function (state) { + if (!arguments.length) { + return this.state.get('options'); + } + this.state.set('options', state); + return this; + }, + renderHtml: function () { + var self = this; + var options, size = ''; + options = createOptions(self._options); + if (self.size) { + size = ' size = "' + self.size + '"'; + } + return '<select id="' + self._id + '" class="' + self.classes + '"' + size + '>' + options + '</select>'; + }, + bindStates: function () { + var self = this; + self.state.on('change:options', function (e) { + self.getEl().innerHTML = createOptions(e.value); + }); + return self._super(); + } + }); + + function constrain(value, minVal, maxVal) { + if (value < minVal) { + value = minVal; + } + if (value > maxVal) { + value = maxVal; + } + return value; + } + function setAriaProp(el, name, value) { + el.setAttribute('aria-' + name, value); + } + function updateSliderHandle(ctrl, value) { + var maxHandlePos, shortSizeName, sizeName, stylePosName, styleValue, handleEl; + if (ctrl.settings.orientation === 'v') { + stylePosName = 'top'; + sizeName = 'height'; + shortSizeName = 'h'; + } else { + stylePosName = 'left'; + sizeName = 'width'; + shortSizeName = 'w'; + } + handleEl = ctrl.getEl('handle'); + maxHandlePos = (ctrl.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName]; + styleValue = maxHandlePos * ((value - ctrl._minValue) / (ctrl._maxValue - ctrl._minValue)) + 'px'; + handleEl.style[stylePosName] = styleValue; + handleEl.style.height = ctrl.layoutRect().h + 'px'; + setAriaProp(handleEl, 'valuenow', value); + setAriaProp(handleEl, 'valuetext', '' + ctrl.settings.previewFilter(value)); + setAriaProp(handleEl, 'valuemin', ctrl._minValue); + setAriaProp(handleEl, 'valuemax', ctrl._maxValue); + } + var Slider = Widget.extend({ + init: function (settings) { + var self = this; + if (!settings.previewFilter) { + settings.previewFilter = function (value) { + return Math.round(value * 100) / 100; + }; + } + self._super(settings); + self.classes.add('slider'); + if (settings.orientation === 'v') { + self.classes.add('vertical'); + } + self._minValue = isNumber$1(settings.minValue) ? settings.minValue : 0; + self._maxValue = isNumber$1(settings.maxValue) ? settings.maxValue : 100; + self._initValue = self.state.get('value'); + }, + renderHtml: function () { + var self = this, id = self._id, prefix = self.classPrefix; + return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-handle" class="' + prefix + 'slider-handle" role="slider" tabindex="-1"></div>' + '</div>'; + }, + reset: function () { + this.value(this._initValue).repaint(); + }, + postRender: function () { + var self = this; + var minValue, maxValue, screenCordName, stylePosName, sizeName, shortSizeName; + function toFraction(min, max, val) { + return (val + min) / (max - min); + } + function fromFraction(min, max, val) { + return val * (max - min) - min; + } + function handleKeyboard(minValue, maxValue) { + function alter(delta) { + var value; + value = self.value(); + value = fromFraction(minValue, maxValue, toFraction(minValue, maxValue, value) + delta * 0.05); + value = constrain(value, minValue, maxValue); + self.value(value); + self.fire('dragstart', { value: value }); + self.fire('drag', { value: value }); + self.fire('dragend', { value: value }); + } + self.on('keydown', function (e) { + switch (e.keyCode) { + case 37: + case 38: + alter(-1); + break; + case 39: + case 40: + alter(1); + break; + } + }); + } + function handleDrag(minValue, maxValue, handleEl) { + var startPos, startHandlePos, maxHandlePos, handlePos, value; + self._dragHelper = new DragHelper(self._id, { + handle: self._id + '-handle', + start: function (e) { + startPos = e[screenCordName]; + startHandlePos = parseInt(self.getEl('handle').style[stylePosName], 10); + maxHandlePos = (self.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName]; + self.fire('dragstart', { value: value }); + }, + drag: function (e) { + var delta = e[screenCordName] - startPos; + handlePos = constrain(startHandlePos + delta, 0, maxHandlePos); + handleEl.style[stylePosName] = handlePos + 'px'; + value = minValue + handlePos / maxHandlePos * (maxValue - minValue); + self.value(value); + self.tooltip().text('' + self.settings.previewFilter(value)).show().moveRel(handleEl, 'bc tc'); + self.fire('drag', { value: value }); + }, + stop: function () { + self.tooltip().hide(); + self.fire('dragend', { value: value }); + } + }); + } + minValue = self._minValue; + maxValue = self._maxValue; + if (self.settings.orientation === 'v') { + screenCordName = 'screenY'; + stylePosName = 'top'; + sizeName = 'height'; + shortSizeName = 'h'; + } else { + screenCordName = 'screenX'; + stylePosName = 'left'; + sizeName = 'width'; + shortSizeName = 'w'; + } + self._super(); + handleKeyboard(minValue, maxValue); + handleDrag(minValue, maxValue, self.getEl('handle')); + }, + repaint: function () { + this._super(); + updateSliderHandle(this, this.value()); + }, + bindStates: function () { + var self = this; + self.state.on('change:value', function (e) { + updateSliderHandle(self, e.value); + }); + return self._super(); + } + }); + + var Spacer = Widget.extend({ + renderHtml: function () { + var self = this; + self.classes.add('spacer'); + self.canFocus = false; + return '<div id="' + self._id + '" class="' + self.classes + '"></div>'; + } + }); + + var SplitButton = MenuButton.extend({ + Defaults: { + classes: 'widget btn splitbtn', + role: 'button' + }, + repaint: function () { + var self = this; + var elm = self.getEl(); + var rect = self.layoutRect(); + var mainButtonElm, menuButtonElm; + self._super(); + mainButtonElm = elm.firstChild; + menuButtonElm = elm.lastChild; + global$7(mainButtonElm).css({ + width: rect.w - funcs.getSize(menuButtonElm).width, + height: rect.h - 2 + }); + global$7(menuButtonElm).css({ height: rect.h - 2 }); + return self; + }, + activeMenu: function (state) { + var self = this; + global$7(self.getEl().lastChild).toggleClass(self.classPrefix + 'active', state); + }, + renderHtml: function () { + var self = this; + var id = self._id; + var prefix = self.classPrefix; + var image; + var icon = self.state.get('icon'); + var text = self.state.get('text'); + var settings = self.settings; + var textHtml = '', ariaPressed; + image = settings.image; + if (image) { + icon = 'none'; + if (typeof image !== 'string') { + image = domGlobals.window.getSelection ? image[0] : image[1]; + } + image = ' style="background-image: url(\'' + image + '\')"'; + } else { + image = ''; + } + icon = settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : ''; + if (text) { + self.classes.add('btn-has-text'); + textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>'; + } + ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : ''; + return '<div id="' + id + '" class="' + self.classes + '" role="button"' + ariaPressed + ' tabindex="-1">' + '<button type="button" hidefocus="1" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + (self._menuBtnText ? (icon ? '\xA0' : '') + self._menuBtnText : '') + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>'; + }, + postRender: function () { + var self = this, onClickHandler = self.settings.onclick; + self.on('click', function (e) { + var node = e.target; + if (e.control === this) { + while (node) { + if (e.aria && e.aria.key !== 'down' || node.nodeName === 'BUTTON' && node.className.indexOf('open') === -1) { + e.stopImmediatePropagation(); + if (onClickHandler) { + onClickHandler.call(this, e); + } + return; + } + node = node.parentNode; + } + } + }); + delete self.settings.onclick; + return self._super(); + } + }); + + var StackLayout = FlowLayout.extend({ + Defaults: { + containerClass: 'stack-layout', + controlClass: 'stack-layout-item', + endClass: 'break' + }, + isNative: function () { + return true; + } + }); + + var TabPanel = Panel.extend({ + Defaults: { + layout: 'absolute', + defaults: { type: 'panel' } + }, + activateTab: function (idx) { + var activeTabElm; + if (this.activeTabId) { + activeTabElm = this.getEl(this.activeTabId); + global$7(activeTabElm).removeClass(this.classPrefix + 'active'); + activeTabElm.setAttribute('aria-selected', 'false'); + } + this.activeTabId = 't' + idx; + activeTabElm = this.getEl('t' + idx); + activeTabElm.setAttribute('aria-selected', 'true'); + global$7(activeTabElm).addClass(this.classPrefix + 'active'); + this.items()[idx].show().fire('showtab'); + this.reflow(); + this.items().each(function (item, i) { + if (idx !== i) { + item.hide(); + } + }); + }, + renderHtml: function () { + var self = this; + var layout = self._layout; + var tabsHtml = ''; + var prefix = self.classPrefix; + self.preRender(); + layout.preRender(self); + self.items().each(function (ctrl, i) { + var id = self._id + '-t' + i; + ctrl.aria('role', 'tabpanel'); + ctrl.aria('labelledby', id); + tabsHtml += '<div id="' + id + '" class="' + prefix + 'tab" ' + 'unselectable="on" role="tab" aria-controls="' + ctrl._id + '" aria-selected="false" tabIndex="-1">' + self.encode(ctrl.settings.title) + '</div>'; + }); + return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + '<div id="' + self._id + '-head" class="' + prefix + 'tabs" role="tablist">' + tabsHtml + '</div>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>' + '</div>'; + }, + postRender: function () { + var self = this; + self._super(); + self.settings.activeTab = self.settings.activeTab || 0; + self.activateTab(self.settings.activeTab); + this.on('click', function (e) { + var targetParent = e.target.parentNode; + if (targetParent && targetParent.id === self._id + '-head') { + var i = targetParent.childNodes.length; + while (i--) { + if (targetParent.childNodes[i] === e.target) { + self.activateTab(i); + } + } + } + }); + }, + initLayoutRect: function () { + var self = this; + var rect, minW, minH; + minW = funcs.getSize(self.getEl('head')).width; + minW = minW < 0 ? 0 : minW; + minH = 0; + self.items().each(function (item) { + minW = Math.max(minW, item.layoutRect().minW); + minH = Math.max(minH, item.layoutRect().minH); + }); + self.items().each(function (ctrl) { + ctrl.settings.x = 0; + ctrl.settings.y = 0; + ctrl.settings.w = minW; + ctrl.settings.h = minH; + ctrl.layoutRect({ + x: 0, + y: 0, + w: minW, + h: minH + }); + }); + var headH = funcs.getSize(self.getEl('head')).height; + self.settings.minWidth = minW; + self.settings.minHeight = minH + headH; + rect = self._super(); + rect.deltaH += headH; + rect.innerH = rect.h - rect.deltaH; + return rect; + } + }); + + var TextBox = Widget.extend({ + init: function (settings) { + var self = this; + self._super(settings); + self.classes.add('textbox'); + if (settings.multiline) { + self.classes.add('multiline'); + } else { + self.on('keydown', function (e) { + var rootControl; + if (e.keyCode === 13) { + e.preventDefault(); + self.parents().reverse().each(function (ctrl) { + if (ctrl.toJSON) { + rootControl = ctrl; + return false; + } + }); + self.fire('submit', { data: rootControl.toJSON() }); + } + }); + self.on('keyup', function (e) { + self.state.set('value', e.target.value); + }); + } + }, + repaint: function () { + var self = this; + var style, rect, borderBox, borderW, borderH = 0, lastRepaintRect; + style = self.getEl().style; + rect = self._layoutRect; + lastRepaintRect = self._lastRepaintRect || {}; + var doc = domGlobals.document; + if (!self.settings.multiline && doc.all && (!doc.documentMode || doc.documentMode <= 8)) { + style.lineHeight = rect.h - borderH + 'px'; + } + borderBox = self.borderBox; + borderW = borderBox.left + borderBox.right + 8; + borderH = borderBox.top + borderBox.bottom + (self.settings.multiline ? 8 : 0); + if (rect.x !== lastRepaintRect.x) { + style.left = rect.x + 'px'; + lastRepaintRect.x = rect.x; + } + if (rect.y !== lastRepaintRect.y) { + style.top = rect.y + 'px'; + lastRepaintRect.y = rect.y; + } + if (rect.w !== lastRepaintRect.w) { + style.width = rect.w - borderW + 'px'; + lastRepaintRect.w = rect.w; + } + if (rect.h !== lastRepaintRect.h) { + style.height = rect.h - borderH + 'px'; + lastRepaintRect.h = rect.h; + } + self._lastRepaintRect = lastRepaintRect; + self.fire('repaint', {}, false); + return self; + }, + renderHtml: function () { + var self = this; + var settings = self.settings; + var attrs, elm; + attrs = { + id: self._id, + hidefocus: '1' + }; + global$4.each([ + 'rows', + 'spellcheck', + 'maxLength', + 'size', + 'readonly', + 'min', + 'max', + 'step', + 'list', + 'pattern', + 'placeholder', + 'required', + 'multiple' + ], function (name) { + attrs[name] = settings[name]; + }); + if (self.disabled()) { + attrs.disabled = 'disabled'; + } + if (settings.subtype) { + attrs.type = settings.subtype; + } + elm = funcs.create(settings.multiline ? 'textarea' : 'input', attrs); + elm.value = self.state.get('value'); + elm.className = self.classes.toString(); + return elm.outerHTML; + }, + value: function (value) { + if (arguments.length) { + this.state.set('value', value); + return this; + } + if (this.state.get('rendered')) { + this.state.set('value', this.getEl().value); + } + return this.state.get('value'); + }, + postRender: function () { + var self = this; + self.getEl().value = self.state.get('value'); + self._super(); + self.$el.on('change', function (e) { + self.state.set('value', e.target.value); + self.fire('change', e); + }); + }, + bindStates: function () { + var self = this; + self.state.on('change:value', function (e) { + if (self.getEl().value !== e.value) { + self.getEl().value = e.value; + } + }); + self.state.on('change:disabled', function (e) { + self.getEl().disabled = e.value; + }); + return self._super(); + }, + remove: function () { + this.$el.off(); + this._super(); + } + }); + + var getApi = function () { + return { + Selector: Selector, + Collection: Collection$2, + ReflowQueue: ReflowQueue, + Control: Control$1, + Factory: global$b, + KeyboardNavigation: KeyboardNavigation, + Container: Container, + DragHelper: DragHelper, + Scrollable: Scrollable, + Panel: Panel, + Movable: Movable, + Resizable: Resizable, + FloatPanel: FloatPanel, + Window: Window, + MessageBox: MessageBox, + Tooltip: Tooltip, + Widget: Widget, + Progress: Progress, + Notification: Notification, + Layout: Layout$1, + AbsoluteLayout: AbsoluteLayout, + Button: Button, + ButtonGroup: ButtonGroup, + Checkbox: Checkbox, + ComboBox: ComboBox, + ColorBox: ColorBox, + PanelButton: PanelButton, + ColorButton: ColorButton, + ColorPicker: ColorPicker, + Path: Path, + ElementPath: ElementPath, + FormItem: FormItem, + Form: Form, + FieldSet: FieldSet, + FilePicker: FilePicker, + FitLayout: FitLayout, + FlexLayout: FlexLayout, + FlowLayout: FlowLayout, + FormatControls: FormatControls, + GridLayout: GridLayout, + Iframe: Iframe, + InfoBox: InfoBox, + Label: Label, + Toolbar: Toolbar$1, + MenuBar: MenuBar, + MenuButton: MenuButton, + MenuItem: MenuItem, + Throbber: Throbber, + Menu: Menu, + ListBox: ListBox, + Radio: Radio, + ResizeHandle: ResizeHandle, + SelectBox: SelectBox, + Slider: Slider, + Spacer: Spacer, + SplitButton: SplitButton, + StackLayout: StackLayout, + TabPanel: TabPanel, + TextBox: TextBox, + DropZone: DropZone, + BrowseButton: BrowseButton + }; + }; + var appendTo = function (target) { + if (target.ui) { + global$4.each(getApi(), function (ref, key) { + target.ui[key] = ref; + }); + } else { + target.ui = getApi(); + } + }; + var registerToFactory = function () { + global$4.each(getApi(), function (ref, key) { + global$b.add(key, ref); + }); + }; + var Api = { + appendTo: appendTo, + registerToFactory: registerToFactory + }; + + Api.registerToFactory(); + Api.appendTo(window.tinymce ? window.tinymce : {}); + global.add('inlite', function (editor) { + var panel = create$3(); + FormatControls.setup(editor); + Buttons.addToEditor(editor, panel); + return ThemeApi.get(editor, panel); + }); + function Theme () { + } + + return Theme; + +}(window)); +})(); |