Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in /home/monara/public_html/test.athavaneng.com/themes.php on line 99
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 226
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 227
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 228
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 229
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 230
Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 231
home/monara/public_html/Hotel/wp-includes/js/tinymce/themes/modern/theme.js 0000644 00001150123 15073175307 0023070 0 ustar 00 (function () {
var modern = (function (domGlobals) {
'use strict';
var global = tinymce.util.Tools.resolve('tinymce.ThemeManager');
var global$1 = tinymce.util.Tools.resolve('tinymce.EditorManager');
var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
var isBrandingEnabled = function (editor) {
return editor.getParam('branding', true, 'boolean');
};
var hasMenubar = function (editor) {
return getMenubar(editor) !== false;
};
var getMenubar = function (editor) {
return editor.getParam('menubar');
};
var hasStatusbar = function (editor) {
return editor.getParam('statusbar', true, 'boolean');
};
var getToolbarSize = function (editor) {
return editor.getParam('toolbar_items_size');
};
var isReadOnly = function (editor) {
return editor.getParam('readonly', false, 'boolean');
};
var getFixedToolbarContainer = function (editor) {
return editor.getParam('fixed_toolbar_container');
};
var getInlineToolbarPositionHandler = function (editor) {
return editor.getParam('inline_toolbar_position_handler');
};
var getMenu = function (editor) {
return editor.getParam('menu');
};
var getRemovedMenuItems = function (editor) {
return editor.getParam('removed_menuitems', '');
};
var getMinWidth = function (editor) {
return editor.getParam('min_width', 100, 'number');
};
var getMinHeight = function (editor) {
return editor.getParam('min_height', 100, 'number');
};
var getMaxWidth = function (editor) {
return editor.getParam('max_width', 65535, 'number');
};
var getMaxHeight = function (editor) {
return editor.getParam('max_height', 65535, 'number');
};
var isSkinDisabled = function (editor) {
return editor.settings.skin === false;
};
var isInline = function (editor) {
return editor.getParam('inline', false, 'boolean');
};
var getResize = function (editor) {
var resize = editor.getParam('resize', 'vertical');
if (resize === false) {
return 'none';
} else if (resize === 'both') {
return 'both';
} else {
return 'vertical';
}
};
var getSkinUrl = function (editor) {
var settings = editor.settings;
var skin = settings.skin;
var skinUrl = settings.skin_url;
if (skin !== false) {
var skinName = skin ? skin : 'lightgray';
if (skinUrl) {
skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);
} else {
skinUrl = global$1.baseURL + '/skins/' + skinName;
}
}
return skinUrl;
};
var getIndexedToolbars = function (settings, defaultToolbar) {
var toolbars = [];
for (var i = 1; i < 10; i++) {
var toolbar = settings['toolbar' + i];
if (!toolbar) {
break;
}
toolbars.push(toolbar);
}
var mainToolbar = settings.toolbar ? [settings.toolbar] : [defaultToolbar];
return toolbars.length > 0 ? toolbars : mainToolbar;
};
var getToolbars = function (editor) {
var toolbar = editor.getParam('toolbar');
var defaultToolbar = 'undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image';
if (toolbar === false) {
return [];
} else if (global$2.isArray(toolbar)) {
return global$2.grep(toolbar, function (toolbar) {
return toolbar.length > 0;
});
} else {
return getIndexedToolbars(editor.settings, defaultToolbar);
}
};
var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
var global$4 = tinymce.util.Tools.resolve('tinymce.ui.Factory');
var global$5 = tinymce.util.Tools.resolve('tinymce.util.I18n');
var fireSkinLoaded = function (editor) {
return editor.fire('SkinLoaded');
};
var fireResizeEditor = function (editor) {
return editor.fire('ResizeEditor');
};
var fireBeforeRenderUI = function (editor) {
return editor.fire('BeforeRenderUI');
};
var Events = {
fireSkinLoaded: fireSkinLoaded,
fireResizeEditor: fireResizeEditor,
fireBeforeRenderUI: fireBeforeRenderUI
};
var focus = function (panel, type) {
return function () {
var item = panel.find(type)[0];
if (item) {
item.focus(true);
}
};
};
var addKeys = function (editor, panel) {
editor.shortcuts.add('Alt+F9', '', focus(panel, 'menubar'));
editor.shortcuts.add('Alt+F10,F10', '', focus(panel, 'toolbar'));
editor.shortcuts.add('Alt+F11', '', focus(panel, 'elementpath'));
panel.on('cancel', function () {
editor.focus();
});
};
var A11y = { addKeys: addKeys };
var global$6 = tinymce.util.Tools.resolve('tinymce.geom.Rect');
var global$7 = tinymce.util.Tools.resolve('tinymce.util.Delay');
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 getUiContainerDelta = function (ctrl) {
var uiContainer = getUiContainer(ctrl);
if (uiContainer && global$3.DOM.getStyle(uiContainer, 'position', true) !== 'static') {
var containerPos = global$3.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$3.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 createToolbar = function (editor, items, size) {
var toolbarItems = [];
var buttonGroup;
if (!items) {
return;
}
global$2.each(items.split(/[ ,]/), function (item) {
var itemName;
var bindSelectorChanged = function () {
var selection = editor.selection;
if (item.settings.stateSelector) {
selection.selectorChanged(item.settings.stateSelector, function (state) {
item.active(state);
}, true);
}
if (item.settings.disabledStateSelector) {
selection.selectorChanged(item.settings.disabledStateSelector, function (state) {
item.disabled(state);
});
}
};
if (item === '|') {
buttonGroup = null;
} else {
if (!buttonGroup) {
buttonGroup = {
type: 'buttongroup',
items: []
};
toolbarItems.push(buttonGroup);
}
if (editor.buttons[item]) {
itemName = item;
item = editor.buttons[itemName];
if (typeof item === 'function') {
item = item();
}
item.type = item.type || 'button';
item.size = size;
item = global$4.create(item);
buttonGroup.items.push(item);
if (editor.initialized) {
bindSelectorChanged();
} else {
editor.on('init', bindSelectorChanged);
}
}
}
});
return {
type: 'toolbar',
layout: 'flow',
items: toolbarItems
};
};
var createToolbars = function (editor, size) {
var toolbars = [];
var addToolbar = function (items) {
if (items) {
toolbars.push(createToolbar(editor, items, size));
}
};
global$2.each(getToolbars(editor), function (toolbar) {
addToolbar(toolbar);
});
if (toolbars.length) {
return {
type: 'panel',
layout: 'stack',
classes: 'toolbar-grp',
ariaRoot: true,
ariaRemember: true,
items: toolbars
};
}
};
var Toolbar = {
createToolbar: createToolbar,
createToolbars: createToolbars
};
var DOM = global$3.DOM;
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 hideAllFloatingPanels = function (editor) {
global$2.each(editor.contextToolbars, function (toolbar) {
if (toolbar.panel) {
toolbar.panel.hide();
}
});
};
var movePanelTo = function (panel, pos) {
panel.moveTo(pos.left, pos.top);
};
var togglePositionClass = function (panel, relPos, predicate) {
relPos = relPos ? relPos.substr(0, 2) : '';
global$2.each({
t: 'down',
b: 'up'
}, function (cls, pos) {
panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(0, 1)));
});
global$2.each({
l: 'left',
r: 'right'
}, function (cls, pos) {
panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(1, 1)));
});
};
var userConstrain = function (handler, x, y, elementRect, contentAreaRect, panelRect) {
panelRect = toClientRect({
x: x,
y: y,
w: panelRect.w,
h: panelRect.h
});
if (handler) {
panelRect = handler({
elementRect: toClientRect(elementRect),
contentAreaRect: toClientRect(contentAreaRect),
panelRect: panelRect
});
}
return panelRect;
};
var addContextualToolbars = function (editor) {
var scrollContainer;
var getContextToolbars = function () {
return editor.contextToolbars || [];
};
var getElementRect = function (elm) {
var pos, targetRect, root;
pos = DOM.getPos(editor.getContentAreaContainer());
targetRect = editor.dom.getRect(elm);
root = editor.dom.getRoot();
if (root.nodeName === 'BODY') {
targetRect.x -= root.ownerDocument.documentElement.scrollLeft || root.scrollLeft;
targetRect.y -= root.ownerDocument.documentElement.scrollTop || root.scrollTop;
}
targetRect.x += pos.x;
targetRect.y += pos.y;
return targetRect;
};
var reposition = function (match, shouldShow) {
var relPos, panelRect, elementRect, contentAreaRect, panel, relRect, testPositions, smallElementWidthThreshold;
var handler = getInlineToolbarPositionHandler(editor);
if (editor.removed) {
return;
}
if (!match || !match.toolbar.panel) {
hideAllFloatingPanels(editor);
return;
}
testPositions = [
'bc-tc',
'tc-bc',
'tl-bl',
'bl-tl',
'tr-br',
'br-tr'
];
panel = match.toolbar.panel;
if (shouldShow) {
panel.show();
}
elementRect = getElementRect(match.element);
panelRect = DOM.getRect(panel.getEl());
contentAreaRect = DOM.getRect(editor.getContentAreaContainer() || editor.getBody());
var delta = UiContainer.getUiContainerDelta(panel).getOr({
x: 0,
y: 0
});
elementRect.x += delta.x;
elementRect.y += delta.y;
panelRect.x += delta.x;
panelRect.y += delta.y;
contentAreaRect.x += delta.x;
contentAreaRect.y += delta.y;
smallElementWidthThreshold = 25;
if (DOM.getStyle(match.element, 'display', true) !== 'inline') {
var clientRect = match.element.getBoundingClientRect();
elementRect.w = clientRect.width;
elementRect.h = clientRect.height;
}
if (!editor.inline) {
contentAreaRect.w = editor.getDoc().documentElement.offsetWidth;
}
if (editor.selection.controlSelection.isResizable(match.element) && elementRect.w < smallElementWidthThreshold) {
elementRect = global$6.inflate(elementRect, 0, 8);
}
relPos = global$6.findBestRelativePosition(panelRect, elementRect, contentAreaRect, testPositions);
elementRect = global$6.clamp(elementRect, contentAreaRect);
if (relPos) {
relRect = global$6.relativePosition(panelRect, elementRect, relPos);
movePanelTo(panel, userConstrain(handler, relRect.x, relRect.y, elementRect, contentAreaRect, panelRect));
} else {
contentAreaRect.h += panelRect.h;
elementRect = global$6.intersect(contentAreaRect, elementRect);
if (elementRect) {
relPos = global$6.findBestRelativePosition(panelRect, elementRect, contentAreaRect, [
'bc-tc',
'bl-tl',
'br-tr'
]);
if (relPos) {
relRect = global$6.relativePosition(panelRect, elementRect, relPos);
movePanelTo(panel, userConstrain(handler, relRect.x, relRect.y, elementRect, contentAreaRect, panelRect));
} else {
movePanelTo(panel, userConstrain(handler, elementRect.x, elementRect.y, elementRect, contentAreaRect, panelRect));
}
} else {
panel.hide();
}
}
togglePositionClass(panel, relPos, function (pos1, pos2) {
return pos1 === pos2;
});
};
var repositionHandler = function (show) {
return function () {
var execute = function () {
if (editor.selection) {
reposition(findFrontMostMatch(editor.selection.getNode()), show);
}
};
global$7.requestAnimationFrame(execute);
};
};
var bindScrollEvent = function (panel) {
if (!scrollContainer) {
var reposition_1 = repositionHandler(true);
var uiContainer_1 = UiContainer.getUiContainer(panel);
scrollContainer = editor.selection.getScrollContainer() || editor.getWin();
DOM.bind(scrollContainer, 'scroll', reposition_1);
DOM.bind(uiContainer_1, 'scroll', reposition_1);
editor.on('remove', function () {
DOM.unbind(scrollContainer, 'scroll', reposition_1);
DOM.unbind(uiContainer_1, 'scroll', reposition_1);
});
}
};
var showContextToolbar = function (match) {
var panel;
if (match.toolbar.panel) {
match.toolbar.panel.show();
reposition(match);
return;
}
panel = global$4.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: Toolbar.createToolbar(editor, match.toolbar.items),
oncancel: function () {
editor.focus();
}
});
UiContainer.setUiContainer(editor, panel);
bindScrollEvent(panel);
match.toolbar.panel = panel;
panel.renderTo().reflow();
reposition(match);
};
var hideAllContextToolbars = function () {
global$2.each(getContextToolbars(), function (toolbar) {
if (toolbar.panel) {
toolbar.panel.hide();
}
});
};
var findFrontMostMatch = function (targetElm) {
var i, y, parentsAndSelf;
var toolbars = getContextToolbars();
parentsAndSelf = editor.$(targetElm).parents().add(targetElm);
for (i = parentsAndSelf.length - 1; i >= 0; i--) {
for (y = toolbars.length - 1; y >= 0; y--) {
if (toolbars[y].predicate(parentsAndSelf[i])) {
return {
toolbar: toolbars[y],
element: parentsAndSelf[i]
};
}
}
}
return null;
};
editor.on('click keyup setContent ObjectResized', function (e) {
if (e.type === 'setcontent' && !e.selection) {
return;
}
global$7.setEditorTimeout(editor, function () {
var match;
match = findFrontMostMatch(editor.selection.getNode());
if (match) {
hideAllContextToolbars();
showContextToolbar(match);
} else {
hideAllContextToolbars();
}
});
});
editor.on('blur hide contextmenu', hideAllContextToolbars);
editor.on('ObjectResizeStart', function () {
var match = findFrontMostMatch(editor.selection.getNode());
if (match && match.toolbar.panel) {
match.toolbar.panel.hide();
}
});
editor.on('ResizeEditor ResizeWindow', repositionHandler(true));
editor.on('nodeChange', repositionHandler(false));
editor.on('remove', function () {
global$2.each(getContextToolbars(), function (toolbar) {
if (toolbar.panel) {
toolbar.panel.remove();
}
});
editor.contextToolbars = {};
});
editor.shortcuts.add('ctrl+F9', '', function () {
var match = findFrontMostMatch(editor.selection.getNode());
if (match && match.toolbar.panel) {
match.toolbar.panel.items()[0].focus();
}
});
};
var ContextToolbars = { addContextualToolbars: addContextualToolbars };
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 = function (type) {
return function (value) {
return typeOf(value) === type;
};
};
var isArray = isType('array');
var isFunction = isType('function');
var isNumber = isType('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 findIndex = function (xs, pred) {
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i];
if (pred(x, i)) {
return Option.some(i);
}
}
return Option.none();
};
var flatten = function (xs) {
var r = [];
for (var i = 0, len = xs.length; i < len; ++i) {
if (!isArray(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(Array.from) ? Array.from : function (x) {
return nativeSlice.call(x);
};
var defaultMenus = {
file: {
title: 'File',
items: 'newdocument restoredraft | preview | print'
},
edit: {
title: 'Edit',
items: 'undo redo | cut copy paste pastetext | selectall'
},
view: {
title: 'View',
items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen'
},
insert: {
title: 'Insert',
items: 'image link media template codesample inserttable | charmap hr | pagebreak nonbreaking anchor toc | insertdatetime'
},
format: {
title: 'Format',
items: 'bold italic underline strikethrough superscript subscript codeformat | blockformats align | removeformat'
},
tools: {
title: 'Tools',
items: 'spellchecker spellcheckerlanguage | a11ycheck code'
},
table: { title: 'Table' },
help: { title: 'Help' }
};
var delimiterMenuNamePair = function () {
return {
name: '|',
item: { text: '|' }
};
};
var createMenuNameItemPair = function (name, item) {
var menuItem = item ? {
name: name,
item: item
} : null;
return name === '|' ? delimiterMenuNamePair() : menuItem;
};
var hasItemName = function (namedMenuItems, name) {
return findIndex(namedMenuItems, function (namedMenuItem) {
return namedMenuItem.name === name;
}).isSome();
};
var isSeparator = function (namedMenuItem) {
return namedMenuItem && namedMenuItem.item.text === '|';
};
var cleanupMenu = function (namedMenuItems, removedMenuItems) {
var menuItemsPass1 = filter(namedMenuItems, function (namedMenuItem) {
return removedMenuItems.hasOwnProperty(namedMenuItem.name) === false;
});
var menuItemsPass2 = filter(menuItemsPass1, function (namedMenuItem, i) {
return !isSeparator(namedMenuItem) || !isSeparator(menuItemsPass1[i - 1]);
});
return filter(menuItemsPass2, function (namedMenuItem, i) {
return !isSeparator(namedMenuItem) || i > 0 && i < menuItemsPass2.length - 1;
});
};
var createMenu = function (editorMenuItems, menus, removedMenuItems, context) {
var menuButton, menu, namedMenuItems, isUserDefined;
if (menus) {
menu = menus[context];
isUserDefined = true;
} else {
menu = defaultMenus[context];
}
if (menu) {
menuButton = { text: menu.title };
namedMenuItems = [];
global$2.each((menu.items || '').split(/[ ,]/), function (name) {
var namedMenuItem = createMenuNameItemPair(name, editorMenuItems[name]);
if (namedMenuItem) {
namedMenuItems.push(namedMenuItem);
}
});
if (!isUserDefined) {
global$2.each(editorMenuItems, function (item, name) {
if (item.context === context && !hasItemName(namedMenuItems, name)) {
if (item.separator === 'before') {
namedMenuItems.push(delimiterMenuNamePair());
}
if (item.prependToContext) {
namedMenuItems.unshift(createMenuNameItemPair(name, item));
} else {
namedMenuItems.push(createMenuNameItemPair(name, item));
}
if (item.separator === 'after') {
namedMenuItems.push(delimiterMenuNamePair());
}
}
});
}
menuButton.menu = map(cleanupMenu(namedMenuItems, removedMenuItems), function (menuItem) {
return menuItem.item;
});
if (!menuButton.menu.length) {
return null;
}
}
return menuButton;
};
var getDefaultMenubar = function (editor) {
var name;
var defaultMenuBar = [];
var menu = getMenu(editor);
if (menu) {
for (name in menu) {
defaultMenuBar.push(name);
}
} else {
for (name in defaultMenus) {
defaultMenuBar.push(name);
}
}
return defaultMenuBar;
};
var createMenuButtons = function (editor) {
var menuButtons = [];
var defaultMenuBar = getDefaultMenubar(editor);
var removedMenuItems = global$2.makeMap(getRemovedMenuItems(editor).split(/[ ,]/));
var menubar = getMenubar(editor);
var enabledMenuNames = typeof menubar === 'string' ? menubar.split(/[ ,]/) : defaultMenuBar;
for (var i = 0; i < enabledMenuNames.length; i++) {
var menuItems = enabledMenuNames[i];
var menu = createMenu(editor.menuItems, getMenu(editor), removedMenuItems, menuItems);
if (menu) {
menuButtons.push(menu);
}
}
return menuButtons;
};
var Menubar = { createMenuButtons: createMenuButtons };
var DOM$1 = global$3.DOM;
var getSize = function (elm) {
return {
width: elm.clientWidth,
height: elm.clientHeight
};
};
var resizeTo = function (editor, width, height) {
var containerElm, iframeElm, containerSize, iframeSize;
containerElm = editor.getContainer();
iframeElm = editor.getContentAreaContainer().firstChild;
containerSize = getSize(containerElm);
iframeSize = getSize(iframeElm);
if (width !== null) {
width = Math.max(getMinWidth(editor), width);
width = Math.min(getMaxWidth(editor), width);
DOM$1.setStyle(containerElm, 'width', width + (containerSize.width - iframeSize.width));
DOM$1.setStyle(iframeElm, 'width', width);
}
height = Math.max(getMinHeight(editor), height);
height = Math.min(getMaxHeight(editor), height);
DOM$1.setStyle(iframeElm, 'height', height);
Events.fireResizeEditor(editor);
};
var resizeBy = function (editor, dw, dh) {
var elm = editor.getContentAreaContainer();
resizeTo(editor, elm.clientWidth + dw, elm.clientHeight + dh);
};
var Resize = {
resizeTo: resizeTo,
resizeBy: resizeBy
};
var global$8 = tinymce.util.Tools.resolve('tinymce.Env');
var api = function (elm) {
return {
element: function () {
return elm;
}
};
};
var trigger = function (sidebar, panel, callbackName) {
var callback = sidebar.settings[callbackName];
if (callback) {
callback(api(panel.getEl('body')));
}
};
var hidePanels = function (name, container, sidebars) {
global$2.each(sidebars, function (sidebar) {
var panel = container.items().filter('#' + sidebar.name)[0];
if (panel && panel.visible() && sidebar.name !== name) {
trigger(sidebar, panel, 'onhide');
panel.visible(false);
}
});
};
var deactivateButtons = function (toolbar) {
toolbar.items().each(function (ctrl) {
ctrl.active(false);
});
};
var findSidebar = function (sidebars, name) {
return global$2.grep(sidebars, function (sidebar) {
return sidebar.name === name;
})[0];
};
var showPanel = function (editor, name, sidebars) {
return function (e) {
var btnCtrl = e.control;
var container = btnCtrl.parents().filter('panel')[0];
var panel = container.find('#' + name)[0];
var sidebar = findSidebar(sidebars, name);
hidePanels(name, container, sidebars);
deactivateButtons(btnCtrl.parent());
if (panel && panel.visible()) {
trigger(sidebar, panel, 'onhide');
panel.hide();
btnCtrl.active(false);
} else {
if (panel) {
panel.show();
trigger(sidebar, panel, 'onshow');
} else {
panel = global$4.create({
type: 'container',
name: name,
layout: 'stack',
classes: 'sidebar-panel',
html: ''
});
container.prepend(panel);
trigger(sidebar, panel, 'onrender');
trigger(sidebar, panel, 'onshow');
}
btnCtrl.active(true);
}
Events.fireResizeEditor(editor);
};
};
var isModernBrowser = function () {
return !global$8.ie || global$8.ie >= 11;
};
var hasSidebar = function (editor) {
return isModernBrowser() && editor.sidebars ? editor.sidebars.length > 0 : false;
};
var createSidebar = function (editor) {
var buttons = global$2.map(editor.sidebars, function (sidebar) {
var settings = sidebar.settings;
return {
type: 'button',
icon: settings.icon,
image: settings.image,
tooltip: settings.tooltip,
onclick: showPanel(editor, sidebar.name, editor.sidebars)
};
});
return {
type: 'panel',
name: 'sidebar',
layout: 'stack',
classes: 'sidebar',
items: [{
type: 'toolbar',
layout: 'stack',
classes: 'sidebar-toolbar',
items: buttons
}]
};
};
var Sidebar = {
hasSidebar: hasSidebar,
createSidebar: createSidebar
};
var fireSkinLoaded$1 = function (editor) {
var done = function () {
editor._skinLoaded = true;
Events.fireSkinLoaded(editor);
};
return function () {
if (editor.initialized) {
done();
} else {
editor.on('init', done);
}
};
};
var SkinLoaded = { fireSkinLoaded: fireSkinLoaded$1 };
var DOM$2 = global$3.DOM;
var switchMode = function (panel) {
return function (e) {
panel.find('*').disabled(e.mode === 'readonly');
};
};
var editArea = function (border) {
return {
type: 'panel',
name: 'iframe',
layout: 'stack',
classes: 'edit-area',
border: border,
html: ''
};
};
var editAreaContainer = function (editor) {
return {
type: 'panel',
layout: 'stack',
classes: 'edit-aria-container',
border: '1 0 0 0',
items: [
editArea('0'),
Sidebar.createSidebar(editor)
]
};
};
var render = function (editor, theme, args) {
var panel, resizeHandleCtrl, startSize;
if (isSkinDisabled(editor) === false && args.skinUiCss) {
DOM$2.styleSheetLoader.load(args.skinUiCss, SkinLoaded.fireSkinLoaded(editor));
} else {
SkinLoaded.fireSkinLoaded(editor)();
}
panel = theme.panel = global$4.create({
type: 'panel',
role: 'application',
classes: 'tinymce',
style: 'visibility: hidden',
layout: 'stack',
border: 1,
items: [
{
type: 'container',
classes: 'top-part',
items: [
hasMenubar(editor) === false ? null : {
type: 'menubar',
border: '0 0 1 0',
items: Menubar.createMenuButtons(editor)
},
Toolbar.createToolbars(editor, getToolbarSize(editor))
]
},
Sidebar.hasSidebar(editor) ? editAreaContainer(editor) : editArea('1 0 0 0')
]
});
UiContainer.setUiContainer(editor, panel);
if (getResize(editor) !== 'none') {
resizeHandleCtrl = {
type: 'resizehandle',
direction: getResize(editor),
onResizeStart: function () {
var elm = editor.getContentAreaContainer().firstChild;
startSize = {
width: elm.clientWidth,
height: elm.clientHeight
};
},
onResize: function (e) {
if (getResize(editor) === 'both') {
Resize.resizeTo(editor, startSize.width + e.deltaX, startSize.height + e.deltaY);
} else {
Resize.resizeTo(editor, null, startSize.height + e.deltaY);
}
}
};
}
if (hasStatusbar(editor)) {
var linkHtml = 'Tiny';
var html = global$5.translate([
'Powered by {0}',
linkHtml
]);
var brandingLabel = isBrandingEnabled(editor) ? {
type: 'label',
classes: 'branding',
html: ' ' + html
} : null;
panel.add({
type: 'panel',
name: 'statusbar',
classes: 'statusbar',
layout: 'flow',
border: '1 0 0 0',
ariaRoot: true,
items: [
{
type: 'elementpath',
editor: editor
},
resizeHandleCtrl,
brandingLabel
]
});
}
Events.fireBeforeRenderUI(editor);
editor.on('SwitchMode', switchMode(panel));
panel.renderBefore(args.targetNode).reflow();
if (isReadOnly(editor)) {
editor.setMode('readonly');
}
if (args.width) {
DOM$2.setStyle(panel.getEl(), 'width', args.width);
}
editor.on('remove', function () {
panel.remove();
panel = null;
});
A11y.addKeys(editor, panel);
ContextToolbars.addContextualToolbars(editor);
return {
iframeContainer: panel.find('#iframe')[0].getEl(),
editorContainer: panel.getEl()
};
};
var Iframe = { render: render };
var global$9 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');
var count = 0;
var funcs = {
id: function () {
return 'mceu_' + count++;
},
create: function (name, attrs, children) {
var elm = domGlobals.document.createElement(name);
global$3.DOM.setAttribs(elm, attrs);
if (typeof children === 'string') {
elm.innerHTML = children;
} else {
global$2.each(children, function (child) {
if (child.nodeType) {
elm.appendChild(child);
}
});
}
return elm;
},
createFragment: function (html) {
return global$3.DOM.createFragment(html);
},
getWindowSize: function () {
return global$3.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$3.DOM.getPos(elm, root || funcs.getContainer());
},
getContainer: function () {
return global$8.container ? global$8.container : domGlobals.document.body;
},
getViewPort: function (win) {
return global$3.DOM.getViewPort(win);
},
get: function (id) {
return domGlobals.document.getElementById(id);
},
addClass: function (elm, cls) {
return global$3.DOM.addClass(elm, cls);
},
removeClass: function (elm, cls) {
return global$3.DOM.removeClass(elm, cls);
},
hasClass: function (elm, cls) {
return global$3.DOM.hasClass(elm, cls);
},
toggleClass: function (elm, cls, state) {
return global$3.DOM.toggleClass(elm, cls, state);
},
css: function (elm, name, value) {
return global$3.DOM.setStyle(elm, name, value);
},
getRuntimeStyle: function (elm, name) {
return global$3.DOM.getStyle(elm, name, true);
},
on: function (target, name, callback, scope) {
return global$3.DOM.bind(target, name, callback, scope);
},
off: function (target, name, callback) {
return global$3.DOM.unbind(target, name, callback);
},
fire: function (target, name, args) {
return global$3.DOM.fire(target, name, args);
},
innerHtml: function (elm, html) {
global$3.DOM.setHTML(elm, html);
}
};
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 global$a = tinymce.util.Tools.resolve('tinymce.util.Class');
var global$b = 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$2.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$a.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$2.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$2.each(this, callback);
return this;
},
toArray: function () {
return global$2.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$2.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$2.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$2.each('fire on off show hide append prepend before after reflow'.split(' '), function (name) {
proto[name] = function () {
var args = global$2.toArray(arguments);
this.each(function (ctrl) {
if (name in ctrl) {
ctrl[name].apply(ctrl, args);
}
});
return this;
};
});
global$2.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$a.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$c = 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$2.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$a.extend({
Mixins: [global$c],
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$7.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 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$2.extend({}, self.Defaults, settings);
self._id = settings.id || 'mceu_' + idCounter++;
self._aria = { role: settings.role };
self._elmCache = {};
self.$ = global$9;
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$2.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$9('#' + 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$9(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$9(elm).before(this.renderHtml());
this.postRender();
return this;
},
renderTo: function (elm) {
global$9(elm || this.getContainerElm()).append(this.renderHtml());
this.postRender();
return this;
},
preRender: function () {
},
render: function () {
},
renderHtml: function () {
return '';
},
postRender: function () {
var self = this;
var settings = self.settings;
var elm, box, parent, name, parentEventsRoot;
self.$el = global$9(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$2.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$a.extend(proto$1);
function getEventDispatcher(obj) {
if (!obj._eventDispatcher) {
obj._eventDispatcher = new global$b({
scope: obj,
toggleEvent: function (name, state) {
if (state && global$b.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$9(eventCtrl.getEl()).on('mousewheel', fixWheelEvent);
} else {
global$9(eventCtrl.getEl()).on('DOMMouseScroll', fixWheelEvent);
}
continue;
}
if (name === 'mouseenter' || name === 'mouseleave') {
if (!eventRootCtrl._hasMouseEnter) {
global$9(eventRootCtrl.getEl()).on('mouseleave', mouseLeaveHandler).on('mouseover', mouseEnterHandler);
eventRootCtrl._hasMouseEnter = 1;
}
} else if (!eventRootDelegates[name]) {
global$9(eventRootCtrl.getEl()).on(name, delegate);
eventRootDelegates[name] = true;
}
nativeEvents[name] = false;
}
}
}
var Control$1 = Control;
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$4.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$2.isArray(items)) {
items = [items];
}
global$2.each(items, function (item) {
if (item) {
if (!(item instanceof Control$1)) {
if (typeof item === 'string') {
item = { type: item };
}
settings = global$2.extend({}, self.settings.defaults, item);
item.type = settings.type = settings.type || item.type || self.settings.defaultType || (settings.defaults ? settings.defaults.type : null);
item = global$4.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$9(containerElm.childNodes[index]).before(ctrl.renderHtml());
} else {
global$9(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 '
';
}
});
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$9(domGlobals.document).on('click touchstart', documentClickHandler);
}
}
function bindDocumentScrollHandler() {
if (!documentScrollHandler) {
documentScrollHandler = function () {
var i;
i = visiblePanels.length;
while (i--) {
repositionPanel(visiblePanels[i]);
}
};
global$9(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$9(domGlobals.window).on('resize', windowResizeHandler);
}
}
function repositionPanel(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$9('#' + ctrl.classPrefix + 'modal-block', ctrl.getContainerElm())[0];
if (topModal) {
global$9(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(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$9('#' + prefix_1 + 'modal-block', self.getContainerElm());
if (!$modalBlockEl_1[0]) {
$modalBlockEl_1 = global$9('').appendTo(self.getContainerElm());
}
global$7.setTimeout(function () {
$modalBlockEl_1.addClass(prefix_1 + 'in');
global$9(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 = '';
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 isFixed$1 = function (inlineToolbarContainer, editor) {
return !!(inlineToolbarContainer && !editor.settings.ui_container);
};
var render$1 = function (editor, theme, args) {
var panel, inlineToolbarContainer;
var DOM = global$3.DOM;
var fixedToolbarContainer = getFixedToolbarContainer(editor);
if (fixedToolbarContainer) {
inlineToolbarContainer = DOM.select(fixedToolbarContainer)[0];
}
var reposition = function () {
if (panel && panel.moveRel && panel.visible() && !panel._fixed) {
var scrollContainer = editor.selection.getScrollContainer(), body = editor.getBody();
var deltaX = 0, deltaY = 0;
if (scrollContainer) {
var bodyPos = DOM.getPos(body), scrollContainerPos = DOM.getPos(scrollContainer);
deltaX = Math.max(0, scrollContainerPos.x - bodyPos.x);
deltaY = Math.max(0, scrollContainerPos.y - bodyPos.y);
}
panel.fixed(false).moveRel(body, editor.rtl ? [
'tr-br',
'br-tr'
] : [
'tl-bl',
'bl-tl',
'tr-br'
]).moveBy(deltaX, deltaY);
}
};
var show = function () {
if (panel) {
panel.show();
reposition();
DOM.addClass(editor.getBody(), 'mce-edit-focus');
}
};
var hide = function () {
if (panel) {
panel.hide();
FloatPanel.hideAll();
DOM.removeClass(editor.getBody(), 'mce-edit-focus');
}
};
var render = function () {
if (panel) {
if (!panel.visible()) {
show();
}
return;
}
panel = theme.panel = global$4.create({
type: inlineToolbarContainer ? 'panel' : 'floatpanel',
role: 'application',
classes: 'tinymce tinymce-inline',
layout: 'flex',
direction: 'column',
align: 'stretch',
autohide: false,
autofix: true,
fixed: isFixed$1(inlineToolbarContainer, editor),
border: 1,
items: [
hasMenubar(editor) === false ? null : {
type: 'menubar',
border: '0 0 1 0',
items: Menubar.createMenuButtons(editor)
},
Toolbar.createToolbars(editor, getToolbarSize(editor))
]
});
UiContainer.setUiContainer(editor, panel);
Events.fireBeforeRenderUI(editor);
if (inlineToolbarContainer) {
panel.renderTo(inlineToolbarContainer).reflow();
} else {
panel.renderTo().reflow();
}
A11y.addKeys(editor, panel);
show();
ContextToolbars.addContextualToolbars(editor);
editor.on('nodeChange', reposition);
editor.on('ResizeWindow', reposition);
editor.on('activate', show);
editor.on('deactivate', hide);
editor.nodeChanged();
};
editor.settings.content_editable = true;
editor.on('focus', function () {
if (isSkinDisabled(editor) === false && args.skinUiCss) {
DOM.styleSheetLoader.load(args.skinUiCss, render, render);
} else {
render();
}
});
editor.on('blur hide', hide);
editor.on('remove', function () {
if (panel) {
panel.remove();
panel = null;
}
});
if (isSkinDisabled(editor) === false && args.skinUiCss) {
DOM.styleSheetLoader.load(args.skinUiCss, SkinLoaded.fireSkinLoaded(editor));
} else {
SkinLoaded.fireSkinLoaded(editor)();
}
return {};
};
var Inline = { render: render$1 };
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$9(elm).append('');
if (callback) {
callback();
}
}
}
self.hide();
state = true;
if (time) {
timer = global$7.setTimeout(render, time);
} else {
render();
}
return self;
};
self.hide = function () {
var child = elm.lastChild;
global$7.clearTimeout(timer);
if (child && child.className.indexOf('throbber') !== -1) {
child.parentNode.removeChild(child);
}
state = false;
return self;
};
}
var setup = function (editor, theme) {
var throbber;
editor.on('ProgressState', function (e) {
throbber = throbber || new Throbber(theme.panel.getEl('body'));
if (e.state) {
throbber.show(e.time);
} else {
throbber.hide();
}
});
};
var ProgressState = { setup: setup };
var renderUI = function (editor, theme, args) {
var skinUrl = getSkinUrl(editor);
if (skinUrl) {
args.skinUiCss = skinUrl + '/skin.min.css';
editor.contentCSS.push(skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css');
}
ProgressState.setup(editor, theme);
return isInline(editor) ? Inline.render(editor, theme, args) : Iframe.render(editor, theme, args);
};
var Render = { renderUI: renderUI };
var Tooltip = Control$1.extend({
Mixins: [Movable],
Defaults: { classes: 'widget tooltip tooltip-n' },
renderHtml: function () {
var self = this, prefix = self.classPrefix;
return '
' + '' + '
' + self.encode(self.state.get('text')) + '
' + '
';
},
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 '
' + '
' + '' + '
' + '
0%
' + '
';
},
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 = '';
}
notificationStyle = ' style="max-width: ' + self.maxWidth + 'px;' + (self.color ? 'background-color: ' + self.color + ';"' : '"');
if (self.closeButton) {
closeButton = '';
}
if (self.progressBar) {
progressBar = self.progressBar.renderHtml();
}
return '
' + icon + '
' + self.state.get('text') + '
' + progressBar + closeButton + '' + '
';
},
postRender: function () {
var self = this;
global$7.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$2.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
};
}
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$9('meta[name=viewport]')[0], contentValue;
if (global$8.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$9([
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$8.desktop) {
var lastSize_1 = {
w: domGlobals.window.innerWidth,
h: domGlobals.window.innerHeight
};
global$7.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$9(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$9(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 = '
' + '
' + self.encode(settings.title) + '
' + '' + '' + '
';
}
if (settings.url) {
html = '';
}
if (typeof html === 'undefined') {
html = layout.renderHtml(self);
}
if (self.statusbar) {
footerHtml = self.statusbar.renderHtml();
}
return '
' + '
' + headerHtml + '
' + html + '
' + footerHtml + '
' + '
';
},
fullscreen: function (state) {
var self = this;
var documentElement = domGlobals.document.documentElement;
var slowRendering;
var prefix = self.classPrefix;
var layoutRect;
if (state !== self._fullscreen) {
global$9(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$7.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$9([
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$9([
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) {
var renderUI = function (args) {
return Render.renderUI(editor, this, args);
};
var resizeTo = function (w, h) {
return Resize.resizeTo(editor, w, h);
};
var resizeBy = function (dw, dh) {
return Resize.resizeBy(editor, dw, dh);
};
var getNotificationManagerImpl = function () {
return NotificationManagerImpl(editor);
};
var getWindowManagerImpl = function () {
return WindowManagerImpl();
};
return {
renderUI: renderUI,
resizeTo: resizeTo,
resizeBy: resizeBy,
getNotificationManagerImpl: getNotificationManagerImpl,
getWindowManagerImpl: getWindowManagerImpl
};
};
var ThemeApi = { get: get };
var Layout = global$a.extend({
Defaults: {
firstControlClass: 'first',
lastControlClass: 'last'
},
init: function (settings) {
this.settings = global$2.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.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 '' + 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 = '' + self.encode(text) + '';
}
icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
return '
' + '' + '
';
},
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 = $('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$2.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$9(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$9(input).on('click', function (e) {
e.stopPropagation();
});
global$9(self.getEl('button')).on('click touchstart', function (e) {
e.stopPropagation();
input.click();
e.preventDefault();
});
self.getEl().appendChild(input);
},
remove: function () {
global$9(this.getEl('button')).off();
global$9(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 '
';
},
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 ? '
' + self.settings.delimiter + '
' : '') + '
' + parts[i].name + '
';
}
if (!html) {
html = '
\xA0
';
}
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 '
';
}
});
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('').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 = '';
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 = '
' + '
' + self.encode(settings.title) + '
' + '' + '' + '
';
}
if (settings.url) {
html = '';
}
if (typeof html === 'undefined') {
html = layout.renderHtml(self);
}
if (self.statusbar) {
footerHtml = self.statusbar.renderHtml();
}
return '
' + '
' + headerHtml + '
' + html + '
' + footerHtml + '
' + '
';
},
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 = '
';
html += '';
for (y = 0; y < rows; y++) {
html += '
';
for (x = 0; x < cols; x++) {
html += '
';
}
html += '
';
}
html += '';
html += '
';
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 '' + 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 = '' + self.encode(text) + '';
}
icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
return '
' + '' + '
';
},
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 = $('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 '
';
},
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 ? '
' + self.settings.delimiter + '
' : '') + '
' + parts[i].name + '
';
}
if (!html) {
html = '
\xA0
';
}
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 '
';
}
});
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('').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 = '';
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 = '
' + '
' + self.encode(settings.title) + '
' + '' + '' + '
';
}
if (settings.url) {
html = '';
}
if (typeof html === 'undefined') {
html = layout.renderHtml(self);
}
if (self.statusbar) {
footerHtml = self.statusbar.renderHtml();
}
return '
' + '
' + headerHtml + '
' + html + '
' + footerHtml + '
' + '
';
},
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 = '
';
html += '';
for (y = 0; y < rows; y++) {
html += '
';
for (x = 0; x < cols; x++) {
html += '
';
}
html += '
';
}
html += '';
html += '
';
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 '' + 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 = '' + self.encode(text) + '';
}
icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
return '
' + '' + '
';
},
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 = $('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 '
';
},
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 ? '
' + self.settings.delimiter + '
' : '') + '
' + parts[i].name + '
';
}
if (!html) {
html = '
\xA0
';
}
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 '
';
}
});
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$9(domGlobals.document).on('click touchstart', documentClickHandler);
}
}
function bindDocumentScrollHandler() {
if (!documentScrollHandler) {
documentScrollHandler = function () {
var i;
i = visiblePanels.length;
while (i--) {
repositionPanel(visiblePanels[i]);
}
};
global$9(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$9(domGlobals.window).on('resize', windowResizeHandler);
}
}
function repositionPanel(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$9('#' + ctrl.classPrefix + 'modal-block', ctrl.getContainerElm())[0];
if (topModal) {
global$9(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(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$9('#' + prefix_1 + 'modal-block', self.getContainerElm());
if (!$modalBlockEl_1[0]) {
$modalBlockEl_1 = global$9('').appendTo(self.getContainerElm());
}
global$7.setTimeout(function () {
$modalBlockEl_1.addClass(prefix_1 + 'in');
global$9(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 = '';
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 isFixed$1 = function (inlineToolbarContainer, editor) {
return !!(inlineToolbarContainer && !editor.settings.ui_container);
};
var render$1 = function (editor, theme, args) {
var panel, inlineToolbarContainer;
var DOM = global$3.DOM;
var fixedToolbarContainer = getFixedToolbarContainer(editor);
if (fixedToolbarContainer) {
inlineToolbarContainer = DOM.select(fixedToolbarContainer)[0];
}
var reposition = function () {
if (panel && panel.moveRel && panel.visible() && !panel._fixed) {
var scrollContainer = editor.selection.getScrollContainer(), body = editor.getBody();
var deltaX = 0, deltaY = 0;
if (scrollContainer) {
var bodyPos = DOM.getPos(body), scrollContainerPos = DOM.getPos(scrollContainer);
deltaX = Math.max(0, scrollContainerPos.x - bodyPos.x);
deltaY = Math.max(0, scrollContainerPos.y - bodyPos.y);
}
panel.fixed(false).moveRel(body, editor.rtl ? [
'tr-br',
'br-tr'
] : [
'tl-bl',
'bl-tl',
'tr-br'
]).moveBy(deltaX, deltaY);
}
};
var show = function () {
if (panel) {
panel.show();
reposition();
DOM.addClass(editor.getBody(), 'mce-edit-focus');
}
};
var hide = function () {
if (panel) {
panel.hide();
FloatPanel.hideAll();
DOM.removeClass(editor.getBody(), 'mce-edit-focus');
}
};
var render = function () {
if (panel) {
if (!panel.visible()) {
show();
}
return;
}
panel = theme.panel = global$4.create({
type: inlineToolbarContainer ? 'panel' : 'floatpanel',
role: 'application',
classes: 'tinymce tinymce-inline',
layout: 'flex',
direction: 'column',
align: 'stretch',
autohide: false,
autofix: true,
fixed: isFixed$1(inlineToolbarContainer, editor),
border: 1,
items: [
hasMenubar(editor) === false ? null : {
type: 'menubar',
border: '0 0 1 0',
items: Menubar.createMenuButtons(editor)
},
Toolbar.createToolbars(editor, getToolbarSize(editor))
]
});
UiContainer.setUiContainer(editor, panel);
Events.fireBeforeRenderUI(editor);
if (inlineToolbarContainer) {
panel.renderTo(inlineToolbarContainer).reflow();
} else {
panel.renderTo().reflow();
}
A11y.addKeys(editor, panel);
show();
ContextToolbars.addContextualToolbars(editor);
editor.on('nodeChange', reposition);
editor.on('ResizeWindow', reposition);
editor.on('activate', show);
editor.on('deactivate', hide);
editor.nodeChanged();
};
editor.settings.content_editable = true;
editor.on('focus', function () {
if (isSkinDisabled(editor) === false && args.skinUiCss) {
DOM.styleSheetLoader.load(args.skinUiCss, render, render);
} else {
render();
}
});
editor.on('blur hide', hide);
editor.on('remove', function () {
if (panel) {
panel.remove();
panel = null;
}
});
if (isSkinDisabled(editor) === false && args.skinUiCss) {
DOM.styleSheetLoader.load(args.skinUiCss, SkinLoaded.fireSkinLoaded(editor));
} else {
SkinLoaded.fireSkinLoaded(editor)();
}
return {};
};
var Inline = { render: render$1 };
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$9(elm).append('');
if (callback) {
callback();
}
}
}
self.hide();
state = true;
if (time) {
timer = global$7.setTimeout(render, time);
} else {
render();
}
return self;
};
self.hide = function () {
var child = elm.lastChild;
global$7.clearTimeout(timer);
if (child && child.className.indexOf('throbber') !== -1) {
child.parentNode.removeChild(child);
}
state = false;
return self;
};
}
var setup = function (editor, theme) {
var throbber;
editor.on('ProgressState', function (e) {
throbber = throbber || new Throbber(theme.panel.getEl('body'));
if (e.state) {
throbber.show(e.time);
} else {
throbber.hide();
}
});
};
var ProgressState = { setup: setup };
var renderUI = function (editor, theme, args) {
var skinUrl = getSkinUrl(editor);
if (skinUrl) {
args.skinUiCss = skinUrl + '/skin.min.css';
editor.contentCSS.push(skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css');
}
ProgressState.setup(editor, theme);
return isInline(editor) ? Inline.render(editor, theme, args) : Iframe.render(editor, theme, args);
};
var Render = { renderUI: renderUI };
var Tooltip = Control$1.extend({
Mixins: [Movable],
Defaults: { classes: 'widget tooltip tooltip-n' },
renderHtml: function () {
var self = this, prefix = self.classPrefix;
return '
' + '' + '
' + self.encode(self.state.get('text')) + '
' + '
';
},
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 '
' + '
' + '' + '
' + '
0%
' + '
';
},
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 = '';
}
notificationStyle = ' style="max-width: ' + self.maxWidth + 'px;' + (self.color ? 'background-color: ' + self.color + ';"' : '"');
if (self.closeButton) {
closeButton = '';
}
if (self.progressBar) {
progressBar = self.progressBar.renderHtml();
}
return '
' + icon + '
' + self.state.get('text') + '
' + progressBar + closeButton + '' + '
';
},
postRender: function () {
var self = this;
global$7.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$2.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
};
}
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$9('meta[name=viewport]')[0], contentValue;
if (global$8.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$9([
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$8.desktop) {
var lastSize_1 = {
w: domGlobals.window.innerWidth,
h: domGlobals.window.innerHeight
};
global$7.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$9(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$9(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 = '
' + '
' + self.encode(settings.title) + '
' + '' + '' + '
';
}
if (settings.url) {
html = '';
}
if (typeof html === 'undefined') {
html = layout.renderHtml(self);
}
if (self.statusbar) {
footerHtml = self.statusbar.renderHtml();
}
return '
' + '
' + headerHtml + '
' + html + '
' + footerHtml + '
' + '
';
},
fullscreen: function (state) {
var self = this;
var documentElement = domGlobals.document.documentElement;
var slowRendering;
var prefix = self.classPrefix;
var layoutRect;
if (state !== self._fullscreen) {
global$9(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$7.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$9([
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$9([
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) {
var renderUI = function (args) {
return Render.renderUI(editor, this, args);
};
var resizeTo = function (w, h) {
return Resize.resizeTo(editor, w, h);
};
var resizeBy = function (dw, dh) {
return Resize.resizeBy(editor, dw, dh);
};
var getNotificationManagerImpl = function () {
return NotificationManagerImpl(editor);
};
var getWindowManagerImpl = function () {
return WindowManagerImpl();
};
return {
renderUI: renderUI,
resizeTo: resizeTo,
resizeBy: resizeBy,
getNotificationManagerImpl: getNotificationManagerImpl,
getWindowManagerImpl: getWindowManagerImpl
};
};
var ThemeApi = { get: get };
var Layout = global$a.extend({
Defaults: {
firstControlClass: 'first',
lastControlClass: 'last'
},
init: function (settings) {
this.settings = global$2.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.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 '' + 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 = '' + self.encode(text) + '';
}
icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
return '
' + '' + '
';
},
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 = $('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$2.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$9(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$9(input).on('click', function (e) {
e.stopPropagation();
});
global$9(self.getEl('button')).on('click touchstart', function (e) {
e.stopPropagation();
input.click();
e.preventDefault();
});
self.getEl().appendChild(input);
},
remove: function () {
global$9(this.getEl('button')).off();
global$9(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 '
';
},
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 ? '
' + self.settings.delimiter + '
' : '') + '
' + parts[i].name + '
';
}
if (!html) {
html = '
\xA0
';
}
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 '