run:R W Run
308.08 KB
2026-03-11 16:18:51
R W Run
127.68 KB
2026-03-11 16:18:51
R W Run
error_log
📄theme.js
1(function () {
2var modern = (function (domGlobals) {
3 'use strict';
4
5 var global = tinymce.util.Tools.resolve('tinymce.ThemeManager');
6
7 var global$1 = tinymce.util.Tools.resolve('tinymce.EditorManager');
8
9 var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
10
11 var isBrandingEnabled = function (editor) {
12 return editor.getParam('branding', true, 'boolean');
13 };
14 var hasMenubar = function (editor) {
15 return getMenubar(editor) !== false;
16 };
17 var getMenubar = function (editor) {
18 return editor.getParam('menubar');
19 };
20 var hasStatusbar = function (editor) {
21 return editor.getParam('statusbar', true, 'boolean');
22 };
23 var getToolbarSize = function (editor) {
24 return editor.getParam('toolbar_items_size');
25 };
26 var isReadOnly = function (editor) {
27 return editor.getParam('readonly', false, 'boolean');
28 };
29 var getFixedToolbarContainer = function (editor) {
30 return editor.getParam('fixed_toolbar_container');
31 };
32 var getInlineToolbarPositionHandler = function (editor) {
33 return editor.getParam('inline_toolbar_position_handler');
34 };
35 var getMenu = function (editor) {
36 return editor.getParam('menu');
37 };
38 var getRemovedMenuItems = function (editor) {
39 return editor.getParam('removed_menuitems', '');
40 };
41 var getMinWidth = function (editor) {
42 return editor.getParam('min_width', 100, 'number');
43 };
44 var getMinHeight = function (editor) {
45 return editor.getParam('min_height', 100, 'number');
46 };
47 var getMaxWidth = function (editor) {
48 return editor.getParam('max_width', 65535, 'number');
49 };
50 var getMaxHeight = function (editor) {
51 return editor.getParam('max_height', 65535, 'number');
52 };
53 var isSkinDisabled = function (editor) {
54 return editor.settings.skin === false;
55 };
56 var isInline = function (editor) {
57 return editor.getParam('inline', false, 'boolean');
58 };
59 var getResize = function (editor) {
60 var resize = editor.getParam('resize', 'vertical');
61 if (resize === false) {
62 return 'none';
63 } else if (resize === 'both') {
64 return 'both';
65 } else {
66 return 'vertical';
67 }
68 };
69 var getSkinUrl = function (editor) {
70 var settings = editor.settings;
71 var skin = settings.skin;
72 var skinUrl = settings.skin_url;
73 if (skin !== false) {
74 var skinName = skin ? skin : 'lightgray';
75 if (skinUrl) {
76 skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);
77 } else {
78 skinUrl = global$1.baseURL + '/skins/' + skinName;
79 }
80 }
81 return skinUrl;
82 };
83 var getIndexedToolbars = function (settings, defaultToolbar) {
84 var toolbars = [];
85 for (var i = 1; i < 10; i++) {
86 var toolbar = settings['toolbar' + i];
87 if (!toolbar) {
88 break;
89 }
90 toolbars.push(toolbar);
91 }
92 var mainToolbar = settings.toolbar ? [settings.toolbar] : [defaultToolbar];
93 return toolbars.length > 0 ? toolbars : mainToolbar;
94 };
95 var getToolbars = function (editor) {
96 var toolbar = editor.getParam('toolbar');
97 var defaultToolbar = 'undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image';
98 if (toolbar === false) {
99 return [];
100 } else if (global$2.isArray(toolbar)) {
101 return global$2.grep(toolbar, function (toolbar) {
102 return toolbar.length > 0;
103 });
104 } else {
105 return getIndexedToolbars(editor.settings, defaultToolbar);
106 }
107 };
108
109 var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
110
111 var global$4 = tinymce.util.Tools.resolve('tinymce.ui.Factory');
112
113 var global$5 = tinymce.util.Tools.resolve('tinymce.util.I18n');
114
115 var fireSkinLoaded = function (editor) {
116 return editor.fire('SkinLoaded');
117 };
118 var fireResizeEditor = function (editor) {
119 return editor.fire('ResizeEditor');
120 };
121 var fireBeforeRenderUI = function (editor) {
122 return editor.fire('BeforeRenderUI');
123 };
124 var Events = {
125 fireSkinLoaded: fireSkinLoaded,
126 fireResizeEditor: fireResizeEditor,
127 fireBeforeRenderUI: fireBeforeRenderUI
128 };
129
130 var focus = function (panel, type) {
131 return function () {
132 var item = panel.find(type)[0];
133 if (item) {
134 item.focus(true);
135 }
136 };
137 };
138 var addKeys = function (editor, panel) {
139 editor.shortcuts.add('Alt+F9', '', focus(panel, 'menubar'));
140 editor.shortcuts.add('Alt+F10,F10', '', focus(panel, 'toolbar'));
141 editor.shortcuts.add('Alt+F11', '', focus(panel, 'elementpath'));
142 panel.on('cancel', function () {
143 editor.focus();
144 });
145 };
146 var A11y = { addKeys: addKeys };
147
148 var global$6 = tinymce.util.Tools.resolve('tinymce.geom.Rect');
149
150 var global$7 = tinymce.util.Tools.resolve('tinymce.util.Delay');
151
152 var noop = function () {
153 };
154 var constant = function (value) {
155 return function () {
156 return value;
157 };
158 };
159 var never = constant(false);
160 var always = constant(true);
161
162 var none = function () {
163 return NONE;
164 };
165 var NONE = function () {
166 var eq = function (o) {
167 return o.isNone();
168 };
169 var call = function (thunk) {
170 return thunk();
171 };
172 var id = function (n) {
173 return n;
174 };
175 var me = {
176 fold: function (n, s) {
177 return n();
178 },
179 is: never,
180 isSome: never,
181 isNone: always,
182 getOr: id,
183 getOrThunk: call,
184 getOrDie: function (msg) {
185 throw new Error(msg || 'error: getOrDie called on none.');
186 },
187 getOrNull: constant(null),
188 getOrUndefined: constant(undefined),
189 or: id,
190 orThunk: call,
191 map: none,
192 each: noop,
193 bind: none,
194 exists: never,
195 forall: always,
196 filter: none,
197 equals: eq,
198 equals_: eq,
199 toArray: function () {
200 return [];
201 },
202 toString: constant('none()')
203 };
204 if (Object.freeze) {
205 Object.freeze(me);
206 }
207 return me;
208 }();
209 var some = function (a) {
210 var constant_a = constant(a);
211 var self = function () {
212 return me;
213 };
214 var bind = function (f) {
215 return f(a);
216 };
217 var me = {
218 fold: function (n, s) {
219 return s(a);
220 },
221 is: function (v) {
222 return a === v;
223 },
224 isSome: always,
225 isNone: never,
226 getOr: constant_a,
227 getOrThunk: constant_a,
228 getOrDie: constant_a,
229 getOrNull: constant_a,
230 getOrUndefined: constant_a,
231 or: self,
232 orThunk: self,
233 map: function (f) {
234 return some(f(a));
235 },
236 each: function (f) {
237 f(a);
238 },
239 bind: bind,
240 exists: bind,
241 forall: bind,
242 filter: function (f) {
243 return f(a) ? me : NONE;
244 },
245 toArray: function () {
246 return [a];
247 },
248 toString: function () {
249 return 'some(' + a + ')';
250 },
251 equals: function (o) {
252 return o.is(a);
253 },
254 equals_: function (o, elementEq) {
255 return o.fold(never, function (b) {
256 return elementEq(a, b);
257 });
258 }
259 };
260 return me;
261 };
262 var from = function (value) {
263 return value === null || value === undefined ? NONE : some(value);
264 };
265 var Option = {
266 some: some,
267 none: none,
268 from: from
269 };
270
271 var getUiContainerDelta = function (ctrl) {
272 var uiContainer = getUiContainer(ctrl);
273 if (uiContainer && global$3.DOM.getStyle(uiContainer, 'position', true) !== 'static') {
274 var containerPos = global$3.DOM.getPos(uiContainer);
275 var dx = uiContainer.scrollLeft - containerPos.x;
276 var dy = uiContainer.scrollTop - containerPos.y;
277 return Option.some({
278 x: dx,
279 y: dy
280 });
281 } else {
282 return Option.none();
283 }
284 };
285 var setUiContainer = function (editor, ctrl) {
286 var uiContainer = global$3.DOM.select(editor.settings.ui_container)[0];
287 ctrl.getRoot().uiContainer = uiContainer;
288 };
289 var getUiContainer = function (ctrl) {
290 return ctrl ? ctrl.getRoot().uiContainer : null;
291 };
292 var inheritUiContainer = function (fromCtrl, toCtrl) {
293 return toCtrl.uiContainer = getUiContainer(fromCtrl);
294 };
295 var UiContainer = {
296 getUiContainerDelta: getUiContainerDelta,
297 setUiContainer: setUiContainer,
298 getUiContainer: getUiContainer,
299 inheritUiContainer: inheritUiContainer
300 };
301
302 var createToolbar = function (editor, items, size) {
303 var toolbarItems = [];
304 var buttonGroup;
305 if (!items) {
306 return;
307 }
308 global$2.each(items.split(/[ ,]/), function (item) {
309 var itemName;
310 var bindSelectorChanged = function () {
311 var selection = editor.selection;
312 if (item.settings.stateSelector) {
313 selection.selectorChanged(item.settings.stateSelector, function (state) {
314 item.active(state);
315 }, true);
316 }
317 if (item.settings.disabledStateSelector) {
318 selection.selectorChanged(item.settings.disabledStateSelector, function (state) {
319 item.disabled(state);
320 });
321 }
322 };
323 if (item === '|') {
324 buttonGroup = null;
325 } else {
326 if (!buttonGroup) {
327 buttonGroup = {
328 type: 'buttongroup',
329 items: []
330 };
331 toolbarItems.push(buttonGroup);
332 }
333 if (editor.buttons[item]) {
334 itemName = item;
335 item = editor.buttons[itemName];
336 if (typeof item === 'function') {
337 item = item();
338 }
339 item.type = item.type || 'button';
340 item.size = size;
341 item = global$4.create(item);
342 buttonGroup.items.push(item);
343 if (editor.initialized) {
344 bindSelectorChanged();
345 } else {
346 editor.on('init', bindSelectorChanged);
347 }
348 }
349 }
350 });
351 return {
352 type: 'toolbar',
353 layout: 'flow',
354 items: toolbarItems
355 };
356 };
357 var createToolbars = function (editor, size) {
358 var toolbars = [];
359 var addToolbar = function (items) {
360 if (items) {
361 toolbars.push(createToolbar(editor, items, size));
362 }
363 };
364 global$2.each(getToolbars(editor), function (toolbar) {
365 addToolbar(toolbar);
366 });
367 if (toolbars.length) {
368 return {
369 type: 'panel',
370 layout: 'stack',
371 classes: 'toolbar-grp',
372 ariaRoot: true,
373 ariaRemember: true,
374 items: toolbars
375 };
376 }
377 };
378 var Toolbar = {
379 createToolbar: createToolbar,
380 createToolbars: createToolbars
381 };
382
383 var DOM = global$3.DOM;
384 var toClientRect = function (geomRect) {
385 return {
386 left: geomRect.x,
387 top: geomRect.y,
388 width: geomRect.w,
389 height: geomRect.h,
390 right: geomRect.x + geomRect.w,
391 bottom: geomRect.y + geomRect.h
392 };
393 };
394 var hideAllFloatingPanels = function (editor) {
395 global$2.each(editor.contextToolbars, function (toolbar) {
396 if (toolbar.panel) {
397 toolbar.panel.hide();
398 }
399 });
400 };
401 var movePanelTo = function (panel, pos) {
402 panel.moveTo(pos.left, pos.top);
403 };
404 var togglePositionClass = function (panel, relPos, predicate) {
405 relPos = relPos ? relPos.substr(0, 2) : '';
406 global$2.each({
407 t: 'down',
408 b: 'up'
409 }, function (cls, pos) {
410 panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(0, 1)));
411 });
412 global$2.each({
413 l: 'left',
414 r: 'right'
415 }, function (cls, pos) {
416 panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(1, 1)));
417 });
418 };
419 var userConstrain = function (handler, x, y, elementRect, contentAreaRect, panelRect) {
420 panelRect = toClientRect({
421 x: x,
422 y: y,
423 w: panelRect.w,
424 h: panelRect.h
425 });
426 if (handler) {
427 panelRect = handler({
428 elementRect: toClientRect(elementRect),
429 contentAreaRect: toClientRect(contentAreaRect),
430 panelRect: panelRect
431 });
432 }
433 return panelRect;
434 };
435 var addContextualToolbars = function (editor) {
436 var scrollContainer;
437 var getContextToolbars = function () {
438 return editor.contextToolbars || [];
439 };
440 var getElementRect = function (elm) {
441 var pos, targetRect, root;
442 pos = DOM.getPos(editor.getContentAreaContainer());
443 targetRect = editor.dom.getRect(elm);
444 root = editor.dom.getRoot();
445 if (root.nodeName === 'BODY') {
446 targetRect.x -= root.ownerDocument.documentElement.scrollLeft || root.scrollLeft;
447 targetRect.y -= root.ownerDocument.documentElement.scrollTop || root.scrollTop;
448 }
449 targetRect.x += pos.x;
450 targetRect.y += pos.y;
451 return targetRect;
452 };
453 var reposition = function (match, shouldShow) {
454 var relPos, panelRect, elementRect, contentAreaRect, panel, relRect, testPositions, smallElementWidthThreshold;
455 var handler = getInlineToolbarPositionHandler(editor);
456 if (editor.removed) {
457 return;
458 }
459 if (!match || !match.toolbar.panel) {
460 hideAllFloatingPanels(editor);
461 return;
462 }
463 testPositions = [
464 'bc-tc',
465 'tc-bc',
466 'tl-bl',
467 'bl-tl',
468 'tr-br',
469 'br-tr'
470 ];
471 panel = match.toolbar.panel;
472 if (shouldShow) {
473 panel.show();
474 }
475 elementRect = getElementRect(match.element);
476 panelRect = DOM.getRect(panel.getEl());
477 contentAreaRect = DOM.getRect(editor.getContentAreaContainer() || editor.getBody());
478 var delta = UiContainer.getUiContainerDelta(panel).getOr({
479 x: 0,
480 y: 0
481 });
482 elementRect.x += delta.x;
483 elementRect.y += delta.y;
484 panelRect.x += delta.x;
485 panelRect.y += delta.y;
486 contentAreaRect.x += delta.x;
487 contentAreaRect.y += delta.y;
488 smallElementWidthThreshold = 25;
489 if (DOM.getStyle(match.element, 'display', true) !== 'inline') {
490 var clientRect = match.element.getBoundingClientRect();
491 elementRect.w = clientRect.width;
492 elementRect.h = clientRect.height;
493 }
494 if (!editor.inline) {
495 contentAreaRect.w = editor.getDoc().documentElement.offsetWidth;
496 }
497 if (editor.selection.controlSelection.isResizable(match.element) && elementRect.w < smallElementWidthThreshold) {
498 elementRect = global$6.inflate(elementRect, 0, 8);
499 }
500 relPos = global$6.findBestRelativePosition(panelRect, elementRect, contentAreaRect, testPositions);
501 elementRect = global$6.clamp(elementRect, contentAreaRect);
502 if (relPos) {
503 relRect = global$6.relativePosition(panelRect, elementRect, relPos);
504 movePanelTo(panel, userConstrain(handler, relRect.x, relRect.y, elementRect, contentAreaRect, panelRect));
505 } else {
506 contentAreaRect.h += panelRect.h;
507 elementRect = global$6.intersect(contentAreaRect, elementRect);
508 if (elementRect) {
509 relPos = global$6.findBestRelativePosition(panelRect, elementRect, contentAreaRect, [
510 'bc-tc',
511 'bl-tl',
512 'br-tr'
513 ]);
514 if (relPos) {
515 relRect = global$6.relativePosition(panelRect, elementRect, relPos);
516 movePanelTo(panel, userConstrain(handler, relRect.x, relRect.y, elementRect, contentAreaRect, panelRect));
517 } else {
518 movePanelTo(panel, userConstrain(handler, elementRect.x, elementRect.y, elementRect, contentAreaRect, panelRect));
519 }
520 } else {
521 panel.hide();
522 }
523 }
524 togglePositionClass(panel, relPos, function (pos1, pos2) {
525 return pos1 === pos2;
526 });
527 };
528 var repositionHandler = function (show) {
529 return function () {
530 var execute = function () {
531 if (editor.selection) {
532 reposition(findFrontMostMatch(editor.selection.getNode()), show);
533 }
534 };
535 global$7.requestAnimationFrame(execute);
536 };
537 };
538 var bindScrollEvent = function (panel) {
539 if (!scrollContainer) {
540 var reposition_1 = repositionHandler(true);
541 var uiContainer_1 = UiContainer.getUiContainer(panel);
542 scrollContainer = editor.selection.getScrollContainer() || editor.getWin();
543 DOM.bind(scrollContainer, 'scroll', reposition_1);
544 DOM.bind(uiContainer_1, 'scroll', reposition_1);
545 editor.on('remove', function () {
546 DOM.unbind(scrollContainer, 'scroll', reposition_1);
547 DOM.unbind(uiContainer_1, 'scroll', reposition_1);
548 });
549 }
550 };
551 var showContextToolbar = function (match) {
552 var panel;
553 if (match.toolbar.panel) {
554 match.toolbar.panel.show();
555 reposition(match);
556 return;
557 }
558 panel = global$4.create({
559 type: 'floatpanel',
560 role: 'dialog',
561 classes: 'tinymce tinymce-inline arrow',
562 ariaLabel: 'Inline toolbar',
563 layout: 'flex',
564 direction: 'column',
565 align: 'stretch',
566 autohide: false,
567 autofix: true,
568 fixed: true,
569 border: 1,
570 items: Toolbar.createToolbar(editor, match.toolbar.items),
571 oncancel: function () {
572 editor.focus();
573 }
574 });
575 UiContainer.setUiContainer(editor, panel);
576 bindScrollEvent(panel);
577 match.toolbar.panel = panel;
578 panel.renderTo().reflow();
579 reposition(match);
580 };
581 var hideAllContextToolbars = function () {
582 global$2.each(getContextToolbars(), function (toolbar) {
583 if (toolbar.panel) {
584 toolbar.panel.hide();
585 }
586 });
587 };
588 var findFrontMostMatch = function (targetElm) {
589 var i, y, parentsAndSelf;
590 var toolbars = getContextToolbars();
591 parentsAndSelf = editor.$(targetElm).parents().add(targetElm);
592 for (i = parentsAndSelf.length - 1; i >= 0; i--) {
593 for (y = toolbars.length - 1; y >= 0; y--) {
594 if (toolbars[y].predicate(parentsAndSelf[i])) {
595 return {
596 toolbar: toolbars[y],
597 element: parentsAndSelf[i]
598 };
599 }
600 }
601 }
602 return null;
603 };
604 editor.on('click keyup setContent ObjectResized', function (e) {
605 if (e.type === 'setcontent' && !e.selection) {
606 return;
607 }
608 global$7.setEditorTimeout(editor, function () {
609 var match;
610 match = findFrontMostMatch(editor.selection.getNode());
611 if (match) {
612 hideAllContextToolbars();
613 showContextToolbar(match);
614 } else {
615 hideAllContextToolbars();
616 }
617 });
618 });
619 editor.on('blur hide contextmenu', hideAllContextToolbars);
620 editor.on('ObjectResizeStart', function () {
621 var match = findFrontMostMatch(editor.selection.getNode());
622 if (match && match.toolbar.panel) {
623 match.toolbar.panel.hide();
624 }
625 });
626 editor.on('ResizeEditor ResizeWindow', repositionHandler(true));
627 editor.on('nodeChange', repositionHandler(false));
628 editor.on('remove', function () {
629 global$2.each(getContextToolbars(), function (toolbar) {
630 if (toolbar.panel) {
631 toolbar.panel.remove();
632 }
633 });
634 editor.contextToolbars = {};
635 });
636 editor.shortcuts.add('ctrl+F9', '', function () {
637 var match = findFrontMostMatch(editor.selection.getNode());
638 if (match && match.toolbar.panel) {
639 match.toolbar.panel.items()[0].focus();
640 }
641 });
642 };
643 var ContextToolbars = { addContextualToolbars: addContextualToolbars };
644
645 var typeOf = function (x) {
646 if (x === null) {
647 return 'null';
648 }
649 var t = typeof x;
650 if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
651 return 'array';
652 }
653 if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
654 return 'string';
655 }
656 return t;
657 };
658 var isType = function (type) {
659 return function (value) {
660 return typeOf(value) === type;
661 };
662 };
663 var isArray = isType('array');
664 var isFunction = isType('function');
665 var isNumber = isType('number');
666
667 var nativeSlice = Array.prototype.slice;
668 var nativeIndexOf = Array.prototype.indexOf;
669 var nativePush = Array.prototype.push;
670 var rawIndexOf = function (ts, t) {
671 return nativeIndexOf.call(ts, t);
672 };
673 var indexOf = function (xs, x) {
674 var r = rawIndexOf(xs, x);
675 return r === -1 ? Option.none() : Option.some(r);
676 };
677 var exists = function (xs, pred) {
678 for (var i = 0, len = xs.length; i < len; i++) {
679 var x = xs[i];
680 if (pred(x, i)) {
681 return true;
682 }
683 }
684 return false;
685 };
686 var map = function (xs, f) {
687 var len = xs.length;
688 var r = new Array(len);
689 for (var i = 0; i < len; i++) {
690 var x = xs[i];
691 r[i] = f(x, i);
692 }
693 return r;
694 };
695 var each = function (xs, f) {
696 for (var i = 0, len = xs.length; i < len; i++) {
697 var x = xs[i];
698 f(x, i);
699 }
700 };
701 var filter = function (xs, pred) {
702 var r = [];
703 for (var i = 0, len = xs.length; i < len; i++) {
704 var x = xs[i];
705 if (pred(x, i)) {
706 r.push(x);
707 }
708 }
709 return r;
710 };
711 var foldl = function (xs, f, acc) {
712 each(xs, function (x) {
713 acc = f(acc, x);
714 });
715 return acc;
716 };
717 var find = function (xs, pred) {
718 for (var i = 0, len = xs.length; i < len; i++) {
719 var x = xs[i];
720 if (pred(x, i)) {
721 return Option.some(x);
722 }
723 }
724 return Option.none();
725 };
726 var findIndex = function (xs, pred) {
727 for (var i = 0, len = xs.length; i < len; i++) {
728 var x = xs[i];
729 if (pred(x, i)) {
730 return Option.some(i);
731 }
732 }
733 return Option.none();
734 };
735 var flatten = function (xs) {
736 var r = [];
737 for (var i = 0, len = xs.length; i < len; ++i) {
738 if (!isArray(xs[i])) {
739 throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
740 }
741 nativePush.apply(r, xs[i]);
742 }
743 return r;
744 };
745 var from$1 = isFunction(Array.from) ? Array.from : function (x) {
746 return nativeSlice.call(x);
747 };
748
749 var defaultMenus = {
750 file: {
751 title: 'File',
752 items: 'newdocument restoredraft | preview | print'
753 },
754 edit: {
755 title: 'Edit',
756 items: 'undo redo | cut copy paste pastetext | selectall'
757 },
758 view: {
759 title: 'View',
760 items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen'
761 },
762 insert: {
763 title: 'Insert',
764 items: 'image link media template codesample inserttable | charmap hr | pagebreak nonbreaking anchor toc | insertdatetime'
765 },
766 format: {
767 title: 'Format',
768 items: 'bold italic underline strikethrough superscript subscript codeformat | blockformats align | removeformat'
769 },
770 tools: {
771 title: 'Tools',
772 items: 'spellchecker spellcheckerlanguage | a11ycheck code'
773 },
774 table: { title: 'Table' },
775 help: { title: 'Help' }
776 };
777 var delimiterMenuNamePair = function () {
778 return {
779 name: '|',
780 item: { text: '|' }
781 };
782 };
783 var createMenuNameItemPair = function (name, item) {
784 var menuItem = item ? {
785 name: name,
786 item: item
787 } : null;
788 return name === '|' ? delimiterMenuNamePair() : menuItem;
789 };
790 var hasItemName = function (namedMenuItems, name) {
791 return findIndex(namedMenuItems, function (namedMenuItem) {
792 return namedMenuItem.name === name;
793 }).isSome();
794 };
795 var isSeparator = function (namedMenuItem) {
796 return namedMenuItem && namedMenuItem.item.text === '|';
797 };
798 var cleanupMenu = function (namedMenuItems, removedMenuItems) {
799 var menuItemsPass1 = filter(namedMenuItems, function (namedMenuItem) {
800 return removedMenuItems.hasOwnProperty(namedMenuItem.name) === false;
801 });
802 var menuItemsPass2 = filter(menuItemsPass1, function (namedMenuItem, i) {
803 return !isSeparator(namedMenuItem) || !isSeparator(menuItemsPass1[i - 1]);
804 });
805 return filter(menuItemsPass2, function (namedMenuItem, i) {
806 return !isSeparator(namedMenuItem) || i > 0 && i < menuItemsPass2.length - 1;
807 });
808 };
809 var createMenu = function (editorMenuItems, menus, removedMenuItems, context) {
810 var menuButton, menu, namedMenuItems, isUserDefined;
811 if (menus) {
812 menu = menus[context];
813 isUserDefined = true;
814 } else {
815 menu = defaultMenus[context];
816 }
817 if (menu) {
818 menuButton = { text: menu.title };
819 namedMenuItems = [];
820 global$2.each((menu.items || '').split(/[ ,]/), function (name) {
821 var namedMenuItem = createMenuNameItemPair(name, editorMenuItems[name]);
822 if (namedMenuItem) {
823 namedMenuItems.push(namedMenuItem);
824 }
825 });
826 if (!isUserDefined) {
827 global$2.each(editorMenuItems, function (item, name) {
828 if (item.context === context && !hasItemName(namedMenuItems, name)) {
829 if (item.separator === 'before') {
830 namedMenuItems.push(delimiterMenuNamePair());
831 }
832 if (item.prependToContext) {
833 namedMenuItems.unshift(createMenuNameItemPair(name, item));
834 } else {
835 namedMenuItems.push(createMenuNameItemPair(name, item));
836 }
837 if (item.separator === 'after') {
838 namedMenuItems.push(delimiterMenuNamePair());
839 }
840 }
841 });
842 }
843 menuButton.menu = map(cleanupMenu(namedMenuItems, removedMenuItems), function (menuItem) {
844 return menuItem.item;
845 });
846 if (!menuButton.menu.length) {
847 return null;
848 }
849 }
850 return menuButton;
851 };
852 var getDefaultMenubar = function (editor) {
853 var name;
854 var defaultMenuBar = [];
855 var menu = getMenu(editor);
856 if (menu) {
857 for (name in menu) {
858 defaultMenuBar.push(name);
859 }
860 } else {
861 for (name in defaultMenus) {
862 defaultMenuBar.push(name);
863 }
864 }
865 return defaultMenuBar;
866 };
867 var createMenuButtons = function (editor) {
868 var menuButtons = [];
869 var defaultMenuBar = getDefaultMenubar(editor);
870 var removedMenuItems = global$2.makeMap(getRemovedMenuItems(editor).split(/[ ,]/));
871 var menubar = getMenubar(editor);
872 var enabledMenuNames = typeof menubar === 'string' ? menubar.split(/[ ,]/) : defaultMenuBar;
873 for (var i = 0; i < enabledMenuNames.length; i++) {
874 var menuItems = enabledMenuNames[i];
875 var menu = createMenu(editor.menuItems, getMenu(editor), removedMenuItems, menuItems);
876 if (menu) {
877 menuButtons.push(menu);
878 }
879 }
880 return menuButtons;
881 };
882 var Menubar = { createMenuButtons: createMenuButtons };
883
884 var DOM$1 = global$3.DOM;
885 var getSize = function (elm) {
886 return {
887 width: elm.clientWidth,
888 height: elm.clientHeight
889 };
890 };
891 var resizeTo = function (editor, width, height) {
892 var containerElm, iframeElm, containerSize, iframeSize;
893 containerElm = editor.getContainer();
894 iframeElm = editor.getContentAreaContainer().firstChild;
895 containerSize = getSize(containerElm);
896 iframeSize = getSize(iframeElm);
897 if (width !== null) {
898 width = Math.max(getMinWidth(editor), width);
899 width = Math.min(getMaxWidth(editor), width);
900 DOM$1.setStyle(containerElm, 'width', width + (containerSize.width - iframeSize.width));
901 DOM$1.setStyle(iframeElm, 'width', width);
902 }
903 height = Math.max(getMinHeight(editor), height);
904 height = Math.min(getMaxHeight(editor), height);
905 DOM$1.setStyle(iframeElm, 'height', height);
906 Events.fireResizeEditor(editor);
907 };
908 var resizeBy = function (editor, dw, dh) {
909 var elm = editor.getContentAreaContainer();
910 resizeTo(editor, elm.clientWidth + dw, elm.clientHeight + dh);
911 };
912 var Resize = {
913 resizeTo: resizeTo,
914 resizeBy: resizeBy
915 };
916
917 var global$8 = tinymce.util.Tools.resolve('tinymce.Env');
918
919 var api = function (elm) {
920 return {
921 element: function () {
922 return elm;
923 }
924 };
925 };
926 var trigger = function (sidebar, panel, callbackName) {
927 var callback = sidebar.settings[callbackName];
928 if (callback) {
929 callback(api(panel.getEl('body')));
930 }
931 };
932 var hidePanels = function (name, container, sidebars) {
933 global$2.each(sidebars, function (sidebar) {
934 var panel = container.items().filter('#' + sidebar.name)[0];
935 if (panel && panel.visible() && sidebar.name !== name) {
936 trigger(sidebar, panel, 'onhide');
937 panel.visible(false);
938 }
939 });
940 };
941 var deactivateButtons = function (toolbar) {
942 toolbar.items().each(function (ctrl) {
943 ctrl.active(false);
944 });
945 };
946 var findSidebar = function (sidebars, name) {
947 return global$2.grep(sidebars, function (sidebar) {
948 return sidebar.name === name;
949 })[0];
950 };
951 var showPanel = function (editor, name, sidebars) {
952 return function (e) {
953 var btnCtrl = e.control;
954 var container = btnCtrl.parents().filter('panel')[0];
955 var panel = container.find('#' + name)[0];
956 var sidebar = findSidebar(sidebars, name);
957 hidePanels(name, container, sidebars);
958 deactivateButtons(btnCtrl.parent());
959 if (panel && panel.visible()) {
960 trigger(sidebar, panel, 'onhide');
961 panel.hide();
962 btnCtrl.active(false);
963 } else {
964 if (panel) {
965 panel.show();
966 trigger(sidebar, panel, 'onshow');
967 } else {
968 panel = global$4.create({
969 type: 'container',
970 name: name,
971 layout: 'stack',
972 classes: 'sidebar-panel',
973 html: ''
974 });
975 container.prepend(panel);
976 trigger(sidebar, panel, 'onrender');
977 trigger(sidebar, panel, 'onshow');
978 }
979 btnCtrl.active(true);
980 }
981 Events.fireResizeEditor(editor);
982 };
983 };
984 var isModernBrowser = function () {
985 return !global$8.ie || global$8.ie >= 11;
986 };
987 var hasSidebar = function (editor) {
988 return isModernBrowser() && editor.sidebars ? editor.sidebars.length > 0 : false;
989 };
990 var createSidebar = function (editor) {
991 var buttons = global$2.map(editor.sidebars, function (sidebar) {
992 var settings = sidebar.settings;
993 return {
994 type: 'button',
995 icon: settings.icon,
996 image: settings.image,
997 tooltip: settings.tooltip,
998 onclick: showPanel(editor, sidebar.name, editor.sidebars)
999 };
1000 });
1001 return {
1002 type: 'panel',
1003 name: 'sidebar',
1004 layout: 'stack',
1005 classes: 'sidebar',
1006 items: [{
1007 type: 'toolbar',
1008 layout: 'stack',
1009 classes: 'sidebar-toolbar',
1010 items: buttons
1011 }]
1012 };
1013 };
1014 var Sidebar = {
1015 hasSidebar: hasSidebar,
1016 createSidebar: createSidebar
1017 };
1018
1019 var fireSkinLoaded$1 = function (editor) {
1020 var done = function () {
1021 editor._skinLoaded = true;
1022 Events.fireSkinLoaded(editor);
1023 };
1024 return function () {
1025 if (editor.initialized) {
1026 done();
1027 } else {
1028 editor.on('init', done);
1029 }
1030 };
1031 };
1032 var SkinLoaded = { fireSkinLoaded: fireSkinLoaded$1 };
1033
1034 var DOM$2 = global$3.DOM;
1035 var switchMode = function (panel) {
1036 return function (e) {
1037 panel.find('*').disabled(e.mode === 'readonly');
1038 };
1039 };
1040 var editArea = function (border) {
1041 return {
1042 type: 'panel',
1043 name: 'iframe',
1044 layout: 'stack',
1045 classes: 'edit-area',
1046 border: border,
1047 html: ''
1048 };
1049 };
1050 var editAreaContainer = function (editor) {
1051 return {
1052 type: 'panel',
1053 layout: 'stack',
1054 classes: 'edit-aria-container',
1055 border: '1 0 0 0',
1056 items: [
1057 editArea('0'),
1058 Sidebar.createSidebar(editor)
1059 ]
1060 };
1061 };
1062 var render = function (editor, theme, args) {
1063 var panel, resizeHandleCtrl, startSize;
1064 if (isSkinDisabled(editor) === false && args.skinUiCss) {
1065 DOM$2.styleSheetLoader.load(args.skinUiCss, SkinLoaded.fireSkinLoaded(editor));
1066 } else {
1067 SkinLoaded.fireSkinLoaded(editor)();
1068 }
1069 panel = theme.panel = global$4.create({
1070 type: 'panel',
1071 role: 'application',
1072 classes: 'tinymce',
1073 style: 'visibility: hidden',
1074 layout: 'stack',
1075 border: 1,
1076 items: [
1077 {
1078 type: 'container',
1079 classes: 'top-part',
1080 items: [
1081 hasMenubar(editor) === false ? null : {
1082 type: 'menubar',
1083 border: '0 0 1 0',
1084 items: Menubar.createMenuButtons(editor)
1085 },
1086 Toolbar.createToolbars(editor, getToolbarSize(editor))
1087 ]
1088 },
1089 Sidebar.hasSidebar(editor) ? editAreaContainer(editor) : editArea('1 0 0 0')
1090 ]
1091 });
1092 UiContainer.setUiContainer(editor, panel);
1093 if (getResize(editor) !== 'none') {
1094 resizeHandleCtrl = {
1095 type: 'resizehandle',
1096 direction: getResize(editor),
1097 onResizeStart: function () {
1098 var elm = editor.getContentAreaContainer().firstChild;
1099 startSize = {
1100 width: elm.clientWidth,
1101 height: elm.clientHeight
1102 };
1103 },
1104 onResize: function (e) {
1105 if (getResize(editor) === 'both') {
1106 Resize.resizeTo(editor, startSize.width + e.deltaX, startSize.height + e.deltaY);
1107 } else {
1108 Resize.resizeTo(editor, null, startSize.height + e.deltaY);
1109 }
1110 }
1111 };
1112 }
1113 if (hasStatusbar(editor)) {
1114 var linkHtml = '<a href="https://www.tiny.cloud/?utm_campaign=editor_referral&amp;utm_medium=poweredby&amp;utm_source=tinymce" rel="noopener" target="_blank" role="presentation" tabindex="-1">Tiny</a>';
1115 var html = global$5.translate([
1116 'Powered by {0}',
1117 linkHtml
1118 ]);
1119 var brandingLabel = isBrandingEnabled(editor) ? {
1120 type: 'label',
1121 classes: 'branding',
1122 html: ' ' + html
1123 } : null;
1124 panel.add({
1125 type: 'panel',
1126 name: 'statusbar',
1127 classes: 'statusbar',
1128 layout: 'flow',
1129 border: '1 0 0 0',
1130 ariaRoot: true,
1131 items: [
1132 {
1133 type: 'elementpath',
1134 editor: editor
1135 },
1136 resizeHandleCtrl,
1137 brandingLabel
1138 ]
1139 });
1140 }
1141 Events.fireBeforeRenderUI(editor);
1142 editor.on('SwitchMode', switchMode(panel));
1143 panel.renderBefore(args.targetNode).reflow();
1144 if (isReadOnly(editor)) {
1145 editor.setMode('readonly');
1146 }
1147 if (args.width) {
1148 DOM$2.setStyle(panel.getEl(), 'width', args.width);
1149 }
1150 editor.on('remove', function () {
1151 panel.remove();
1152 panel = null;
1153 });
1154 A11y.addKeys(editor, panel);
1155 ContextToolbars.addContextualToolbars(editor);
1156 return {
1157 iframeContainer: panel.find('#iframe')[0].getEl(),
1158 editorContainer: panel.getEl()
1159 };
1160 };
1161 var Iframe = { render: render };
1162
1163 var global$9 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');
1164
1165 var count = 0;
1166 var funcs = {
1167 id: function () {
1168 return 'mceu_' + count++;
1169 },
1170 create: function (name, attrs, children) {
1171 var elm = domGlobals.document.createElement(name);
1172 global$3.DOM.setAttribs(elm, attrs);
1173 if (typeof children === 'string') {
1174 elm.innerHTML = children;
1175 } else {
1176 global$2.each(children, function (child) {
1177 if (child.nodeType) {
1178 elm.appendChild(child);
1179 }
1180 });
1181 }
1182 return elm;
1183 },
1184 createFragment: function (html) {
1185 return global$3.DOM.createFragment(html);
1186 },
1187 getWindowSize: function () {
1188 return global$3.DOM.getViewPort();
1189 },
1190 getSize: function (elm) {
1191 var width, height;
1192 if (elm.getBoundingClientRect) {
1193 var rect = elm.getBoundingClientRect();
1194 width = Math.max(rect.width || rect.right - rect.left, elm.offsetWidth);
1195 height = Math.max(rect.height || rect.bottom - rect.bottom, elm.offsetHeight);
1196 } else {
1197 width = elm.offsetWidth;
1198 height = elm.offsetHeight;
1199 }
1200 return {
1201 width: width,
1202 height: height
1203 };
1204 },
1205 getPos: function (elm, root) {
1206 return global$3.DOM.getPos(elm, root || funcs.getContainer());
1207 },
1208 getContainer: function () {
1209 return global$8.container ? global$8.container : domGlobals.document.body;
1210 },
1211 getViewPort: function (win) {
1212 return global$3.DOM.getViewPort(win);
1213 },
1214 get: function (id) {
1215 return domGlobals.document.getElementById(id);
1216 },
1217 addClass: function (elm, cls) {
1218 return global$3.DOM.addClass(elm, cls);
1219 },
1220 removeClass: function (elm, cls) {
1221 return global$3.DOM.removeClass(elm, cls);
1222 },
1223 hasClass: function (elm, cls) {
1224 return global$3.DOM.hasClass(elm, cls);
1225 },
1226 toggleClass: function (elm, cls, state) {
1227 return global$3.DOM.toggleClass(elm, cls, state);
1228 },
1229 css: function (elm, name, value) {
1230 return global$3.DOM.setStyle(elm, name, value);
1231 },
1232 getRuntimeStyle: function (elm, name) {
1233 return global$3.DOM.getStyle(elm, name, true);
1234 },
1235 on: function (target, name, callback, scope) {
1236 return global$3.DOM.bind(target, name, callback, scope);
1237 },
1238 off: function (target, name, callback) {
1239 return global$3.DOM.unbind(target, name, callback);
1240 },
1241 fire: function (target, name, args) {
1242 return global$3.DOM.fire(target, name, args);
1243 },
1244 innerHtml: function (elm, html) {
1245 global$3.DOM.setHTML(elm, html);
1246 }
1247 };
1248
1249 var isStatic = function (elm) {
1250 return funcs.getRuntimeStyle(elm, 'position') === 'static';
1251 };
1252 var isFixed = function (ctrl) {
1253 return ctrl.state.get('fixed');
1254 };
1255 function calculateRelativePosition(ctrl, targetElm, rel) {
1256 var ctrlElm, pos, x, y, selfW, selfH, targetW, targetH, viewport, size;
1257 viewport = getWindowViewPort();
1258 pos = funcs.getPos(targetElm, UiContainer.getUiContainer(ctrl));
1259 x = pos.x;
1260 y = pos.y;
1261 if (isFixed(ctrl) && isStatic(domGlobals.document.body)) {
1262 x -= viewport.x;
1263 y -= viewport.y;
1264 }
1265 ctrlElm = ctrl.getEl();
1266 size = funcs.getSize(ctrlElm);
1267 selfW = size.width;
1268 selfH = size.height;
1269 size = funcs.getSize(targetElm);
1270 targetW = size.width;
1271 targetH = size.height;
1272 rel = (rel || '').split('');
1273 if (rel[0] === 'b') {
1274 y += targetH;
1275 }
1276 if (rel[1] === 'r') {
1277 x += targetW;
1278 }
1279 if (rel[0] === 'c') {
1280 y += Math.round(targetH / 2);
1281 }
1282 if (rel[1] === 'c') {
1283 x += Math.round(targetW / 2);
1284 }
1285 if (rel[3] === 'b') {
1286 y -= selfH;
1287 }
1288 if (rel[4] === 'r') {
1289 x -= selfW;
1290 }
1291 if (rel[3] === 'c') {
1292 y -= Math.round(selfH / 2);
1293 }
1294 if (rel[4] === 'c') {
1295 x -= Math.round(selfW / 2);
1296 }
1297 return {
1298 x: x,
1299 y: y,
1300 w: selfW,
1301 h: selfH
1302 };
1303 }
1304 var getUiContainerViewPort = function (customUiContainer) {
1305 return {
1306 x: 0,
1307 y: 0,
1308 w: customUiContainer.scrollWidth - 1,
1309 h: customUiContainer.scrollHeight - 1
1310 };
1311 };
1312 var getWindowViewPort = function () {
1313 var win = domGlobals.window;
1314 var x = Math.max(win.pageXOffset, domGlobals.document.body.scrollLeft, domGlobals.document.documentElement.scrollLeft);
1315 var y = Math.max(win.pageYOffset, domGlobals.document.body.scrollTop, domGlobals.document.documentElement.scrollTop);
1316 var w = win.innerWidth || domGlobals.document.documentElement.clientWidth;
1317 var h = win.innerHeight || domGlobals.document.documentElement.clientHeight;
1318 return {
1319 x: x,
1320 y: y,
1321 w: w,
1322 h: h
1323 };
1324 };
1325 var getViewPortRect = function (ctrl) {
1326 var customUiContainer = UiContainer.getUiContainer(ctrl);
1327 return customUiContainer && !isFixed(ctrl) ? getUiContainerViewPort(customUiContainer) : getWindowViewPort();
1328 };
1329 var Movable = {
1330 testMoveRel: function (elm, rels) {
1331 var viewPortRect = getViewPortRect(this);
1332 for (var i = 0; i < rels.length; i++) {
1333 var pos = calculateRelativePosition(this, elm, rels[i]);
1334 if (isFixed(this)) {
1335 if (pos.x > 0 && pos.x + pos.w < viewPortRect.w && pos.y > 0 && pos.y + pos.h < viewPortRect.h) {
1336 return rels[i];
1337 }
1338 } else {
1339 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) {
1340 return rels[i];
1341 }
1342 }
1343 }
1344 return rels[0];
1345 },
1346 moveRel: function (elm, rel) {
1347 if (typeof rel !== 'string') {
1348 rel = this.testMoveRel(elm, rel);
1349 }
1350 var pos = calculateRelativePosition(this, elm, rel);
1351 return this.moveTo(pos.x, pos.y);
1352 },
1353 moveBy: function (dx, dy) {
1354 var self = this, rect = self.layoutRect();
1355 self.moveTo(rect.x + dx, rect.y + dy);
1356 return self;
1357 },
1358 moveTo: function (x, y) {
1359 var self = this;
1360 function constrain(value, max, size) {
1361 if (value < 0) {
1362 return 0;
1363 }
1364 if (value + size > max) {
1365 value = max - size;
1366 return value < 0 ? 0 : value;
1367 }
1368 return value;
1369 }
1370 if (self.settings.constrainToViewport) {
1371 var viewPortRect = getViewPortRect(this);
1372 var layoutRect = self.layoutRect();
1373 x = constrain(x, viewPortRect.w + viewPortRect.x, layoutRect.w);
1374 y = constrain(y, viewPortRect.h + viewPortRect.y, layoutRect.h);
1375 }
1376 var uiContainer = UiContainer.getUiContainer(self);
1377 if (uiContainer && isStatic(uiContainer) && !isFixed(self)) {
1378 x -= uiContainer.scrollLeft;
1379 y -= uiContainer.scrollTop;
1380 }
1381 if (uiContainer) {
1382 x += 1;
1383 y += 1;
1384 }
1385 if (self.state.get('rendered')) {
1386 self.layoutRect({
1387 x: x,
1388 y: y
1389 }).repaint();
1390 } else {
1391 self.settings.x = x;
1392 self.settings.y = y;
1393 }
1394 self.fire('move', {
1395 x: x,
1396 y: y
1397 });
1398 return self;
1399 }
1400 };
1401
1402 var global$a = tinymce.util.Tools.resolve('tinymce.util.Class');
1403
1404 var global$b = tinymce.util.Tools.resolve('tinymce.util.EventDispatcher');
1405
1406 var BoxUtils = {
1407 parseBox: function (value) {
1408 var len;
1409 var radix = 10;
1410 if (!value) {
1411 return;
1412 }
1413 if (typeof value === 'number') {
1414 value = value || 0;
1415 return {
1416 top: value,
1417 left: value,
1418 bottom: value,
1419 right: value
1420 };
1421 }
1422 value = value.split(' ');
1423 len = value.length;
1424 if (len === 1) {
1425 value[1] = value[2] = value[3] = value[0];
1426 } else if (len === 2) {
1427 value[2] = value[0];
1428 value[3] = value[1];
1429 } else if (len === 3) {
1430 value[3] = value[1];
1431 }
1432 return {
1433 top: parseInt(value[0], radix) || 0,
1434 right: parseInt(value[1], radix) || 0,
1435 bottom: parseInt(value[2], radix) || 0,
1436 left: parseInt(value[3], radix) || 0
1437 };
1438 },
1439 measureBox: function (elm, prefix) {
1440 function getStyle(name) {
1441 var defaultView = elm.ownerDocument.defaultView;
1442 if (defaultView) {
1443 var computedStyle = defaultView.getComputedStyle(elm, null);
1444 if (computedStyle) {
1445 name = name.replace(/[A-Z]/g, function (a) {
1446 return '-' + a;
1447 });
1448 return computedStyle.getPropertyValue(name);
1449 } else {
1450 return null;
1451 }
1452 }
1453 return elm.currentStyle[name];
1454 }
1455 function getSide(name) {
1456 var val = parseFloat(getStyle(name));
1457 return isNaN(val) ? 0 : val;
1458 }
1459 return {
1460 top: getSide(prefix + 'TopWidth'),
1461 right: getSide(prefix + 'RightWidth'),
1462 bottom: getSide(prefix + 'BottomWidth'),
1463 left: getSide(prefix + 'LeftWidth')
1464 };
1465 }
1466 };
1467
1468 function noop$1() {
1469 }
1470 function ClassList(onchange) {
1471 this.cls = [];
1472 this.cls._map = {};
1473 this.onchange = onchange || noop$1;
1474 this.prefix = '';
1475 }
1476 global$2.extend(ClassList.prototype, {
1477 add: function (cls) {
1478 if (cls && !this.contains(cls)) {
1479 this.cls._map[cls] = true;
1480 this.cls.push(cls);
1481 this._change();
1482 }
1483 return this;
1484 },
1485 remove: function (cls) {
1486 if (this.contains(cls)) {
1487 var i = void 0;
1488 for (i = 0; i < this.cls.length; i++) {
1489 if (this.cls[i] === cls) {
1490 break;
1491 }
1492 }
1493 this.cls.splice(i, 1);
1494 delete this.cls._map[cls];
1495 this._change();
1496 }
1497 return this;
1498 },
1499 toggle: function (cls, state) {
1500 var curState = this.contains(cls);
1501 if (curState !== state) {
1502 if (curState) {
1503 this.remove(cls);
1504 } else {
1505 this.add(cls);
1506 }
1507 this._change();
1508 }
1509 return this;
1510 },
1511 contains: function (cls) {
1512 return !!this.cls._map[cls];
1513 },
1514 _change: function () {
1515 delete this.clsValue;
1516 this.onchange.call(this);
1517 }
1518 });
1519 ClassList.prototype.toString = function () {
1520 var value;
1521 if (this.clsValue) {
1522 return this.clsValue;
1523 }
1524 value = '';
1525 for (var i = 0; i < this.cls.length; i++) {
1526 if (i > 0) {
1527 value += ' ';
1528 }
1529 value += this.prefix + this.cls[i];
1530 }
1531 return value;
1532 };
1533
1534 function unique(array) {
1535 var uniqueItems = [];
1536 var i = array.length, item;
1537 while (i--) {
1538 item = array[i];
1539 if (!item.__checked) {
1540 uniqueItems.push(item);
1541 item.__checked = 1;
1542 }
1543 }
1544 i = uniqueItems.length;
1545 while (i--) {
1546 delete uniqueItems[i].__checked;
1547 }
1548 return uniqueItems;
1549 }
1550 var expression = /^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i;
1551 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;
1552 var whiteSpace = /^\s*|\s*$/g;
1553 var Collection;
1554 var Selector = global$a.extend({
1555 init: function (selector) {
1556 var match = this.match;
1557 function compileNameFilter(name) {
1558 if (name) {
1559 name = name.toLowerCase();
1560 return function (item) {
1561 return name === '*' || item.type === name;
1562 };
1563 }
1564 }
1565 function compileIdFilter(id) {
1566 if (id) {
1567 return function (item) {
1568 return item._name === id;
1569 };
1570 }
1571 }
1572 function compileClassesFilter(classes) {
1573 if (classes) {
1574 classes = classes.split('.');
1575 return function (item) {
1576 var i = classes.length;
1577 while (i--) {
1578 if (!item.classes.contains(classes[i])) {
1579 return false;
1580 }
1581 }
1582 return true;
1583 };
1584 }
1585 }
1586 function compileAttrFilter(name, cmp, check) {
1587 if (name) {
1588 return function (item) {
1589 var value = item[name] ? item[name]() : '';
1590 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;
1591 };
1592 }
1593 }
1594 function compilePsuedoFilter(name) {
1595 var notSelectors;
1596 if (name) {
1597 name = /(?:not\((.+)\))|(.+)/i.exec(name);
1598 if (!name[1]) {
1599 name = name[2];
1600 return function (item, index, length) {
1601 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;
1602 };
1603 }
1604 notSelectors = parseChunks(name[1], []);
1605 return function (item) {
1606 return !match(item, notSelectors);
1607 };
1608 }
1609 }
1610 function compile(selector, filters, direct) {
1611 var parts;
1612 function add(filter) {
1613 if (filter) {
1614 filters.push(filter);
1615 }
1616 }
1617 parts = expression.exec(selector.replace(whiteSpace, ''));
1618 add(compileNameFilter(parts[1]));
1619 add(compileIdFilter(parts[2]));
1620 add(compileClassesFilter(parts[3]));
1621 add(compileAttrFilter(parts[4], parts[5], parts[6]));
1622 add(compilePsuedoFilter(parts[7]));
1623 filters.pseudo = !!parts[7];
1624 filters.direct = direct;
1625 return filters;
1626 }
1627 function parseChunks(selector, selectors) {
1628 var parts = [];
1629 var extra, matches, i;
1630 do {
1631 chunker.exec('');
1632 matches = chunker.exec(selector);
1633 if (matches) {
1634 selector = matches[3];
1635 parts.push(matches[1]);
1636 if (matches[2]) {
1637 extra = matches[3];
1638 break;
1639 }
1640 }
1641 } while (matches);
1642 if (extra) {
1643 parseChunks(extra, selectors);
1644 }
1645 selector = [];
1646 for (i = 0; i < parts.length; i++) {
1647 if (parts[i] !== '>') {
1648 selector.push(compile(parts[i], [], parts[i - 1] === '>'));
1649 }
1650 }
1651 selectors.push(selector);
1652 return selectors;
1653 }
1654 this._selectors = parseChunks(selector, []);
1655 },
1656 match: function (control, selectors) {
1657 var i, l, si, sl, selector, fi, fl, filters, index, length, siblings, count, item;
1658 selectors = selectors || this._selectors;
1659 for (i = 0, l = selectors.length; i < l; i++) {
1660 selector = selectors[i];
1661 sl = selector.length;
1662 item = control;
1663 count = 0;
1664 for (si = sl - 1; si >= 0; si--) {
1665 filters = selector[si];
1666 while (item) {
1667 if (filters.pseudo) {
1668 siblings = item.parent().items();
1669 index = length = siblings.length;
1670 while (index--) {
1671 if (siblings[index] === item) {
1672 break;
1673 }
1674 }
1675 }
1676 for (fi = 0, fl = filters.length; fi < fl; fi++) {
1677 if (!filters[fi](item, index, length)) {
1678 fi = fl + 1;
1679 break;
1680 }
1681 }
1682 if (fi === fl) {
1683 count++;
1684 break;
1685 } else {
1686 if (si === sl - 1) {
1687 break;
1688 }
1689 }
1690 item = item.parent();
1691 }
1692 }
1693 if (count === sl) {
1694 return true;
1695 }
1696 }
1697 return false;
1698 },
1699 find: function (container) {
1700 var matches = [], i, l;
1701 var selectors = this._selectors;
1702 function collect(items, selector, index) {
1703 var i, l, fi, fl, item;
1704 var filters = selector[index];
1705 for (i = 0, l = items.length; i < l; i++) {
1706 item = items[i];
1707 for (fi = 0, fl = filters.length; fi < fl; fi++) {
1708 if (!filters[fi](item, i, l)) {
1709 fi = fl + 1;
1710 break;
1711 }
1712 }
1713 if (fi === fl) {
1714 if (index === selector.length - 1) {
1715 matches.push(item);
1716 } else {
1717 if (item.items) {
1718 collect(item.items(), selector, index + 1);
1719 }
1720 }
1721 } else if (filters.direct) {
1722 return;
1723 }
1724 if (item.items) {
1725 collect(item.items(), selector, index);
1726 }
1727 }
1728 }
1729 if (container.items) {
1730 for (i = 0, l = selectors.length; i < l; i++) {
1731 collect(container.items(), selectors[i], 0);
1732 }
1733 if (l > 1) {
1734 matches = unique(matches);
1735 }
1736 }
1737 if (!Collection) {
1738 Collection = Selector.Collection;
1739 }
1740 return new Collection(matches);
1741 }
1742 });
1743
1744 var Collection$1, proto;
1745 var push = Array.prototype.push, slice = Array.prototype.slice;
1746 proto = {
1747 length: 0,
1748 init: function (items) {
1749 if (items) {
1750 this.add(items);
1751 }
1752 },
1753 add: function (items) {
1754 var self = this;
1755 if (!global$2.isArray(items)) {
1756 if (items instanceof Collection$1) {
1757 self.add(items.toArray());
1758 } else {
1759 push.call(self, items);
1760 }
1761 } else {
1762 push.apply(self, items);
1763 }
1764 return self;
1765 },
1766 set: function (items) {
1767 var self = this;
1768 var len = self.length;
1769 var i;
1770 self.length = 0;
1771 self.add(items);
1772 for (i = self.length; i < len; i++) {
1773 delete self[i];
1774 }
1775 return self;
1776 },
1777 filter: function (selector) {
1778 var self = this;
1779 var i, l;
1780 var matches = [];
1781 var item, match;
1782 if (typeof selector === 'string') {
1783 selector = new Selector(selector);
1784 match = function (item) {
1785 return selector.match(item);
1786 };
1787 } else {
1788 match = selector;
1789 }
1790 for (i = 0, l = self.length; i < l; i++) {
1791 item = self[i];
1792 if (match(item)) {
1793 matches.push(item);
1794 }
1795 }
1796 return new Collection$1(matches);
1797 },
1798 slice: function () {
1799 return new Collection$1(slice.apply(this, arguments));
1800 },
1801 eq: function (index) {
1802 return index === -1 ? this.slice(index) : this.slice(index, +index + 1);
1803 },
1804 each: function (callback) {
1805 global$2.each(this, callback);
1806 return this;
1807 },
1808 toArray: function () {
1809 return global$2.toArray(this);
1810 },
1811 indexOf: function (ctrl) {
1812 var self = this;
1813 var i = self.length;
1814 while (i--) {
1815 if (self[i] === ctrl) {
1816 break;
1817 }
1818 }
1819 return i;
1820 },
1821 reverse: function () {
1822 return new Collection$1(global$2.toArray(this).reverse());
1823 },
1824 hasClass: function (cls) {
1825 return this[0] ? this[0].classes.contains(cls) : false;
1826 },
1827 prop: function (name, value) {
1828 var self = this;
1829 var item;
1830 if (value !== undefined) {
1831 self.each(function (item) {
1832 if (item[name]) {
1833 item[name](value);
1834 }
1835 });
1836 return self;
1837 }
1838 item = self[0];
1839 if (item && item[name]) {
1840 return item[name]();
1841 }
1842 },
1843 exec: function (name) {
1844 var self = this, args = global$2.toArray(arguments).slice(1);
1845 self.each(function (item) {
1846 if (item[name]) {
1847 item[name].apply(item, args);
1848 }
1849 });
1850 return self;
1851 },
1852 remove: function () {
1853 var i = this.length;
1854 while (i--) {
1855 this[i].remove();
1856 }
1857 return this;
1858 },
1859 addClass: function (cls) {
1860 return this.each(function (item) {
1861 item.classes.add(cls);
1862 });
1863 },
1864 removeClass: function (cls) {
1865 return this.each(function (item) {
1866 item.classes.remove(cls);
1867 });
1868 }
1869 };
1870 global$2.each('fire on off show hide append prepend before after reflow'.split(' '), function (name) {
1871 proto[name] = function () {
1872 var args = global$2.toArray(arguments);
1873 this.each(function (ctrl) {
1874 if (name in ctrl) {
1875 ctrl[name].apply(ctrl, args);
1876 }
1877 });
1878 return this;
1879 };
1880 });
1881 global$2.each('text name disabled active selected checked visible parent value data'.split(' '), function (name) {
1882 proto[name] = function (value) {
1883 return this.prop(name, value);
1884 };
1885 });
1886 Collection$1 = global$a.extend(proto);
1887 Selector.Collection = Collection$1;
1888 var Collection$2 = Collection$1;
1889
1890 var Binding = function (settings) {
1891 this.create = settings.create;
1892 };
1893 Binding.create = function (model, name) {
1894 return new Binding({
1895 create: function (otherModel, otherName) {
1896 var bindings;
1897 var fromSelfToOther = function (e) {
1898 otherModel.set(otherName, e.value);
1899 };
1900 var fromOtherToSelf = function (e) {
1901 model.set(name, e.value);
1902 };
1903 otherModel.on('change:' + otherName, fromOtherToSelf);
1904 model.on('change:' + name, fromSelfToOther);
1905 bindings = otherModel._bindings;
1906 if (!bindings) {
1907 bindings = otherModel._bindings = [];
1908 otherModel.on('destroy', function () {
1909 var i = bindings.length;
1910 while (i--) {
1911 bindings[i]();
1912 }
1913 });
1914 }
1915 bindings.push(function () {
1916 model.off('change:' + name, fromSelfToOther);
1917 });
1918 return model.get(name);
1919 }
1920 });
1921 };
1922
1923 var global$c = tinymce.util.Tools.resolve('tinymce.util.Observable');
1924
1925 function isNode(node) {
1926 return node.nodeType > 0;
1927 }
1928 function isEqual(a, b) {
1929 var k, checked;
1930 if (a === b) {
1931 return true;
1932 }
1933 if (a === null || b === null) {
1934 return a === b;
1935 }
1936 if (typeof a !== 'object' || typeof b !== 'object') {
1937 return a === b;
1938 }
1939 if (global$2.isArray(b)) {
1940 if (a.length !== b.length) {
1941 return false;
1942 }
1943 k = a.length;
1944 while (k--) {
1945 if (!isEqual(a[k], b[k])) {
1946 return false;
1947 }
1948 }
1949 }
1950 if (isNode(a) || isNode(b)) {
1951 return a === b;
1952 }
1953 checked = {};
1954 for (k in b) {
1955 if (!isEqual(a[k], b[k])) {
1956 return false;
1957 }
1958 checked[k] = true;
1959 }
1960 for (k in a) {
1961 if (!checked[k] && !isEqual(a[k], b[k])) {
1962 return false;
1963 }
1964 }
1965 return true;
1966 }
1967 var ObservableObject = global$a.extend({
1968 Mixins: [global$c],
1969 init: function (data) {
1970 var name, value;
1971 data = data || {};
1972 for (name in data) {
1973 value = data[name];
1974 if (value instanceof Binding) {
1975 data[name] = value.create(this, name);
1976 }
1977 }
1978 this.data = data;
1979 },
1980 set: function (name, value) {
1981 var key, args;
1982 var oldValue = this.data[name];
1983 if (value instanceof Binding) {
1984 value = value.create(this, name);
1985 }
1986 if (typeof name === 'object') {
1987 for (key in name) {
1988 this.set(key, name[key]);
1989 }
1990 return this;
1991 }
1992 if (!isEqual(oldValue, value)) {
1993 this.data[name] = value;
1994 args = {
1995 target: this,
1996 name: name,
1997 value: value,
1998 oldValue: oldValue
1999 };
2000 this.fire('change:' + name, args);
2001 this.fire('change', args);
2002 }
2003 return this;
2004 },
2005 get: function (name) {
2006 return this.data[name];
2007 },
2008 has: function (name) {
2009 return name in this.data;
2010 },
2011 bind: function (name) {
2012 return Binding.create(this, name);
2013 },
2014 destroy: function () {
2015 this.fire('destroy');
2016 }
2017 });
2018
2019 var dirtyCtrls = {}, animationFrameRequested;
2020 var ReflowQueue = {
2021 add: function (ctrl) {
2022 var parent = ctrl.parent();
2023 if (parent) {
2024 if (!parent._layout || parent._layout.isNative()) {
2025 return;
2026 }
2027 if (!dirtyCtrls[parent._id]) {
2028 dirtyCtrls[parent._id] = parent;
2029 }
2030 if (!animationFrameRequested) {
2031 animationFrameRequested = true;
2032 global$7.requestAnimationFrame(function () {
2033 var id, ctrl;
2034 animationFrameRequested = false;
2035 for (id in dirtyCtrls) {
2036 ctrl = dirtyCtrls[id];
2037 if (ctrl.state.get('rendered')) {
2038 ctrl.reflow();
2039 }
2040 }
2041 dirtyCtrls = {};
2042 }, domGlobals.document.body);
2043 }
2044 }
2045 },
2046 remove: function (ctrl) {
2047 if (dirtyCtrls[ctrl._id]) {
2048 delete dirtyCtrls[ctrl._id];
2049 }
2050 }
2051 };
2052
2053 var hasMouseWheelEventSupport = 'onmousewheel' in domGlobals.document;
2054 var hasWheelEventSupport = false;
2055 var classPrefix = 'mce-';
2056 var Control, idCounter = 0;
2057 var proto$1 = {
2058 Statics: { classPrefix: classPrefix },
2059 isRtl: function () {
2060 return Control.rtl;
2061 },
2062 classPrefix: classPrefix,
2063 init: function (settings) {
2064 var self = this;
2065 var classes, defaultClasses;
2066 function applyClasses(classes) {
2067 var i;
2068 classes = classes.split(' ');
2069 for (i = 0; i < classes.length; i++) {
2070 self.classes.add(classes[i]);
2071 }
2072 }
2073 self.settings = settings = global$2.extend({}, self.Defaults, settings);
2074 self._id = settings.id || 'mceu_' + idCounter++;
2075 self._aria = { role: settings.role };
2076 self._elmCache = {};
2077 self.$ = global$9;
2078 self.state = new ObservableObject({
2079 visible: true,
2080 active: false,
2081 disabled: false,
2082 value: ''
2083 });
2084 self.data = new ObservableObject(settings.data);
2085 self.classes = new ClassList(function () {
2086 if (self.state.get('rendered')) {
2087 self.getEl().className = this.toString();
2088 }
2089 });
2090 self.classes.prefix = self.classPrefix;
2091 classes = settings.classes;
2092 if (classes) {
2093 if (self.Defaults) {
2094 defaultClasses = self.Defaults.classes;
2095 if (defaultClasses && classes !== defaultClasses) {
2096 applyClasses(defaultClasses);
2097 }
2098 }
2099 applyClasses(classes);
2100 }
2101 global$2.each('title text name visible disabled active value'.split(' '), function (name) {
2102 if (name in settings) {
2103 self[name](settings[name]);
2104 }
2105 });
2106 self.on('click', function () {
2107 if (self.disabled()) {
2108 return false;
2109 }
2110 });
2111 self.settings = settings;
2112 self.borderBox = BoxUtils.parseBox(settings.border);
2113 self.paddingBox = BoxUtils.parseBox(settings.padding);
2114 self.marginBox = BoxUtils.parseBox(settings.margin);
2115 if (settings.hidden) {
2116 self.hide();
2117 }
2118 },
2119 Properties: 'parent,name',
2120 getContainerElm: function () {
2121 var uiContainer = UiContainer.getUiContainer(this);
2122 return uiContainer ? uiContainer : funcs.getContainer();
2123 },
2124 getParentCtrl: function (elm) {
2125 var ctrl;
2126 var lookup = this.getRoot().controlIdLookup;
2127 while (elm && lookup) {
2128 ctrl = lookup[elm.id];
2129 if (ctrl) {
2130 break;
2131 }
2132 elm = elm.parentNode;
2133 }
2134 return ctrl;
2135 },
2136 initLayoutRect: function () {
2137 var self = this;
2138 var settings = self.settings;
2139 var borderBox, layoutRect;
2140 var elm = self.getEl();
2141 var width, height, minWidth, minHeight, autoResize;
2142 var startMinWidth, startMinHeight, initialSize;
2143 borderBox = self.borderBox = self.borderBox || BoxUtils.measureBox(elm, 'border');
2144 self.paddingBox = self.paddingBox || BoxUtils.measureBox(elm, 'padding');
2145 self.marginBox = self.marginBox || BoxUtils.measureBox(elm, 'margin');
2146 initialSize = funcs.getSize(elm);
2147 startMinWidth = settings.minWidth;
2148 startMinHeight = settings.minHeight;
2149 minWidth = startMinWidth || initialSize.width;
2150 minHeight = startMinHeight || initialSize.height;
2151 width = settings.width;
2152 height = settings.height;
2153 autoResize = settings.autoResize;
2154 autoResize = typeof autoResize !== 'undefined' ? autoResize : !width && !height;
2155 width = width || minWidth;
2156 height = height || minHeight;
2157 var deltaW = borderBox.left + borderBox.right;
2158 var deltaH = borderBox.top + borderBox.bottom;
2159 var maxW = settings.maxWidth || 65535;
2160 var maxH = settings.maxHeight || 65535;
2161 self._layoutRect = layoutRect = {
2162 x: settings.x || 0,
2163 y: settings.y || 0,
2164 w: width,
2165 h: height,
2166 deltaW: deltaW,
2167 deltaH: deltaH,
2168 contentW: width - deltaW,
2169 contentH: height - deltaH,
2170 innerW: width - deltaW,
2171 innerH: height - deltaH,
2172 startMinWidth: startMinWidth || 0,
2173 startMinHeight: startMinHeight || 0,
2174 minW: Math.min(minWidth, maxW),
2175 minH: Math.min(minHeight, maxH),
2176 maxW: maxW,
2177 maxH: maxH,
2178 autoResize: autoResize,
2179 scrollW: 0
2180 };
2181 self._lastLayoutRect = {};
2182 return layoutRect;
2183 },
2184 layoutRect: function (newRect) {
2185 var self = this;
2186 var curRect = self._layoutRect, lastLayoutRect, size, deltaWidth, deltaHeight, repaintControls;
2187 if (!curRect) {
2188 curRect = self.initLayoutRect();
2189 }
2190 if (newRect) {
2191 deltaWidth = curRect.deltaW;
2192 deltaHeight = curRect.deltaH;
2193 if (newRect.x !== undefined) {
2194 curRect.x = newRect.x;
2195 }
2196 if (newRect.y !== undefined) {
2197 curRect.y = newRect.y;
2198 }
2199 if (newRect.minW !== undefined) {
2200 curRect.minW = newRect.minW;
2201 }
2202 if (newRect.minH !== undefined) {
2203 curRect.minH = newRect.minH;
2204 }
2205 size = newRect.w;
2206 if (size !== undefined) {
2207 size = size < curRect.minW ? curRect.minW : size;
2208 size = size > curRect.maxW ? curRect.maxW : size;
2209 curRect.w = size;
2210 curRect.innerW = size - deltaWidth;
2211 }
2212 size = newRect.h;
2213 if (size !== undefined) {
2214 size = size < curRect.minH ? curRect.minH : size;
2215 size = size > curRect.maxH ? curRect.maxH : size;
2216 curRect.h = size;
2217 curRect.innerH = size - deltaHeight;
2218 }
2219 size = newRect.innerW;
2220 if (size !== undefined) {
2221 size = size < curRect.minW - deltaWidth ? curRect.minW - deltaWidth : size;
2222 size = size > curRect.maxW - deltaWidth ? curRect.maxW - deltaWidth : size;
2223 curRect.innerW = size;
2224 curRect.w = size + deltaWidth;
2225 }
2226 size = newRect.innerH;
2227 if (size !== undefined) {
2228 size = size < curRect.minH - deltaHeight ? curRect.minH - deltaHeight : size;
2229 size = size > curRect.maxH - deltaHeight ? curRect.maxH - deltaHeight : size;
2230 curRect.innerH = size;
2231 curRect.h = size + deltaHeight;
2232 }
2233 if (newRect.contentW !== undefined) {
2234 curRect.contentW = newRect.contentW;
2235 }
2236 if (newRect.contentH !== undefined) {
2237 curRect.contentH = newRect.contentH;
2238 }
2239 lastLayoutRect = self._lastLayoutRect;
2240 if (lastLayoutRect.x !== curRect.x || lastLayoutRect.y !== curRect.y || lastLayoutRect.w !== curRect.w || lastLayoutRect.h !== curRect.h) {
2241 repaintControls = Control.repaintControls;
2242 if (repaintControls) {
2243 if (repaintControls.map && !repaintControls.map[self._id]) {
2244 repaintControls.push(self);
2245 repaintControls.map[self._id] = true;
2246 }
2247 }
2248 lastLayoutRect.x = curRect.x;
2249 lastLayoutRect.y = curRect.y;
2250 lastLayoutRect.w = curRect.w;
2251 lastLayoutRect.h = curRect.h;
2252 }
2253 return self;
2254 }
2255 return curRect;
2256 },
2257 repaint: function () {
2258 var self = this;
2259 var style, bodyStyle, bodyElm, rect, borderBox;
2260 var borderW, borderH, lastRepaintRect, round, value;
2261 round = !domGlobals.document.createRange ? Math.round : function (value) {
2262 return value;
2263 };
2264 style = self.getEl().style;
2265 rect = self._layoutRect;
2266 lastRepaintRect = self._lastRepaintRect || {};
2267 borderBox = self.borderBox;
2268 borderW = borderBox.left + borderBox.right;
2269 borderH = borderBox.top + borderBox.bottom;
2270 if (rect.x !== lastRepaintRect.x) {
2271 style.left = round(rect.x) + 'px';
2272 lastRepaintRect.x = rect.x;
2273 }
2274 if (rect.y !== lastRepaintRect.y) {
2275 style.top = round(rect.y) + 'px';
2276 lastRepaintRect.y = rect.y;
2277 }
2278 if (rect.w !== lastRepaintRect.w) {
2279 value = round(rect.w - borderW);
2280 style.width = (value >= 0 ? value : 0) + 'px';
2281 lastRepaintRect.w = rect.w;
2282 }
2283 if (rect.h !== lastRepaintRect.h) {
2284 value = round(rect.h - borderH);
2285 style.height = (value >= 0 ? value : 0) + 'px';
2286 lastRepaintRect.h = rect.h;
2287 }
2288 if (self._hasBody && rect.innerW !== lastRepaintRect.innerW) {
2289 value = round(rect.innerW);
2290 bodyElm = self.getEl('body');
2291 if (bodyElm) {
2292 bodyStyle = bodyElm.style;
2293 bodyStyle.width = (value >= 0 ? value : 0) + 'px';
2294 }
2295 lastRepaintRect.innerW = rect.innerW;
2296 }
2297 if (self._hasBody && rect.innerH !== lastRepaintRect.innerH) {
2298 value = round(rect.innerH);
2299 bodyElm = bodyElm || self.getEl('body');
2300 if (bodyElm) {
2301 bodyStyle = bodyStyle || bodyElm.style;
2302 bodyStyle.height = (value >= 0 ? value : 0) + 'px';
2303 }
2304 lastRepaintRect.innerH = rect.innerH;
2305 }
2306 self._lastRepaintRect = lastRepaintRect;
2307 self.fire('repaint', {}, false);
2308 },
2309 updateLayoutRect: function () {
2310 var self = this;
2311 self.parent()._lastRect = null;
2312 funcs.css(self.getEl(), {
2313 width: '',
2314 height: ''
2315 });
2316 self._layoutRect = self._lastRepaintRect = self._lastLayoutRect = null;
2317 self.initLayoutRect();
2318 },
2319 on: function (name, callback) {
2320 var self = this;
2321 function resolveCallbackName(name) {
2322 var callback, scope;
2323 if (typeof name !== 'string') {
2324 return name;
2325 }
2326 return function (e) {
2327 if (!callback) {
2328 self.parentsAndSelf().each(function (ctrl) {
2329 var callbacks = ctrl.settings.callbacks;
2330 if (callbacks && (callback = callbacks[name])) {
2331 scope = ctrl;
2332 return false;
2333 }
2334 });
2335 }
2336 if (!callback) {
2337 e.action = name;
2338 this.fire('execute', e);
2339 return;
2340 }
2341 return callback.call(scope, e);
2342 };
2343 }
2344 getEventDispatcher(self).on(name, resolveCallbackName(callback));
2345 return self;
2346 },
2347 off: function (name, callback) {
2348 getEventDispatcher(this).off(name, callback);
2349 return this;
2350 },
2351 fire: function (name, args, bubble) {
2352 var self = this;
2353 args = args || {};
2354 if (!args.control) {
2355 args.control = self;
2356 }
2357 args = getEventDispatcher(self).fire(name, args);
2358 if (bubble !== false && self.parent) {
2359 var parent = self.parent();
2360 while (parent && !args.isPropagationStopped()) {
2361 parent.fire(name, args, false);
2362 parent = parent.parent();
2363 }
2364 }
2365 return args;
2366 },
2367 hasEventListeners: function (name) {
2368 return getEventDispatcher(this).has(name);
2369 },
2370 parents: function (selector) {
2371 var self = this;
2372 var ctrl, parents = new Collection$2();
2373 for (ctrl = self.parent(); ctrl; ctrl = ctrl.parent()) {
2374 parents.add(ctrl);
2375 }
2376 if (selector) {
2377 parents = parents.filter(selector);
2378 }
2379 return parents;
2380 },
2381 parentsAndSelf: function (selector) {
2382 return new Collection$2(this).add(this.parents(selector));
2383 },
2384 next: function () {
2385 var parentControls = this.parent().items();
2386 return parentControls[parentControls.indexOf(this) + 1];
2387 },
2388 prev: function () {
2389 var parentControls = this.parent().items();
2390 return parentControls[parentControls.indexOf(this) - 1];
2391 },
2392 innerHtml: function (html) {
2393 this.$el.html(html);
2394 return this;
2395 },
2396 getEl: function (suffix) {
2397 var id = suffix ? this._id + '-' + suffix : this._id;
2398 if (!this._elmCache[id]) {
2399 this._elmCache[id] = global$9('#' + id)[0];
2400 }
2401 return this._elmCache[id];
2402 },
2403 show: function () {
2404 return this.visible(true);
2405 },
2406 hide: function () {
2407 return this.visible(false);
2408 },
2409 focus: function () {
2410 try {
2411 this.getEl().focus();
2412 } catch (ex) {
2413 }
2414 return this;
2415 },
2416 blur: function () {
2417 this.getEl().blur();
2418 return this;
2419 },
2420 aria: function (name, value) {
2421 var self = this, elm = self.getEl(self.ariaTarget);
2422 if (typeof value === 'undefined') {
2423 return self._aria[name];
2424 }
2425 self._aria[name] = value;
2426 if (self.state.get('rendered')) {
2427 elm.setAttribute(name === 'role' ? name : 'aria-' + name, value);
2428 }
2429 return self;
2430 },
2431 encode: function (text, translate) {
2432 if (translate !== false) {
2433 text = this.translate(text);
2434 }
2435 return (text || '').replace(/[&<>"]/g, function (match) {
2436 return '&#' + match.charCodeAt(0) + ';';
2437 });
2438 },
2439 translate: function (text) {
2440 return Control.translate ? Control.translate(text) : text;
2441 },
2442 before: function (items) {
2443 var self = this, parent = self.parent();
2444 if (parent) {
2445 parent.insert(items, parent.items().indexOf(self), true);
2446 }
2447 return self;
2448 },
2449 after: function (items) {
2450 var self = this, parent = self.parent();
2451 if (parent) {
2452 parent.insert(items, parent.items().indexOf(self));
2453 }
2454 return self;
2455 },
2456 remove: function () {
2457 var self = this;
2458 var elm = self.getEl();
2459 var parent = self.parent();
2460 var newItems, i;
2461 if (self.items) {
2462 var controls = self.items().toArray();
2463 i = controls.length;
2464 while (i--) {
2465 controls[i].remove();
2466 }
2467 }
2468 if (parent && parent.items) {
2469 newItems = [];
2470 parent.items().each(function (item) {
2471 if (item !== self) {
2472 newItems.push(item);
2473 }
2474 });
2475 parent.items().set(newItems);
2476 parent._lastRect = null;
2477 }
2478 if (self._eventsRoot && self._eventsRoot === self) {
2479 global$9(elm).off();
2480 }
2481 var lookup = self.getRoot().controlIdLookup;
2482 if (lookup) {
2483 delete lookup[self._id];
2484 }
2485 if (elm && elm.parentNode) {
2486 elm.parentNode.removeChild(elm);
2487 }
2488 self.state.set('rendered', false);
2489 self.state.destroy();
2490 self.fire('remove');
2491 return self;
2492 },
2493 renderBefore: function (elm) {
2494 global$9(elm).before(this.renderHtml());
2495 this.postRender();
2496 return this;
2497 },
2498 renderTo: function (elm) {
2499 global$9(elm || this.getContainerElm()).append(this.renderHtml());
2500 this.postRender();
2501 return this;
2502 },
2503 preRender: function () {
2504 },
2505 render: function () {
2506 },
2507 renderHtml: function () {
2508 return '<div id="' + this._id + '" class="' + this.classes + '"></div>';
2509 },
2510 postRender: function () {
2511 var self = this;
2512 var settings = self.settings;
2513 var elm, box, parent, name, parentEventsRoot;
2514 self.$el = global$9(self.getEl());
2515 self.state.set('rendered', true);
2516 for (name in settings) {
2517 if (name.indexOf('on') === 0) {
2518 self.on(name.substr(2), settings[name]);
2519 }
2520 }
2521 if (self._eventsRoot) {
2522 for (parent = self.parent(); !parentEventsRoot && parent; parent = parent.parent()) {
2523 parentEventsRoot = parent._eventsRoot;
2524 }
2525 if (parentEventsRoot) {
2526 for (name in parentEventsRoot._nativeEvents) {
2527 self._nativeEvents[name] = true;
2528 }
2529 }
2530 }
2531 bindPendingEvents(self);
2532 if (settings.style) {
2533 elm = self.getEl();
2534 if (elm) {
2535 elm.setAttribute('style', settings.style);
2536 elm.style.cssText = settings.style;
2537 }
2538 }
2539 if (self.settings.border) {
2540 box = self.borderBox;
2541 self.$el.css({
2542 'border-top-width': box.top,
2543 'border-right-width': box.right,
2544 'border-bottom-width': box.bottom,
2545 'border-left-width': box.left
2546 });
2547 }
2548 var root = self.getRoot();
2549 if (!root.controlIdLookup) {
2550 root.controlIdLookup = {};
2551 }
2552 root.controlIdLookup[self._id] = self;
2553 for (var key in self._aria) {
2554 self.aria(key, self._aria[key]);
2555 }
2556 if (self.state.get('visible') === false) {
2557 self.getEl().style.display = 'none';
2558 }
2559 self.bindStates();
2560 self.state.on('change:visible', function (e) {
2561 var state = e.value;
2562 var parentCtrl;
2563 if (self.state.get('rendered')) {
2564 self.getEl().style.display = state === false ? 'none' : '';
2565 self.getEl().getBoundingClientRect();
2566 }
2567 parentCtrl = self.parent();
2568 if (parentCtrl) {
2569 parentCtrl._lastRect = null;
2570 }
2571 self.fire(state ? 'show' : 'hide');
2572 ReflowQueue.add(self);
2573 });
2574 self.fire('postrender', {}, false);
2575 },
2576 bindStates: function () {
2577 },
2578 scrollIntoView: function (align) {
2579 function getOffset(elm, rootElm) {
2580 var x, y, parent = elm;
2581 x = y = 0;
2582 while (parent && parent !== rootElm && parent.nodeType) {
2583 x += parent.offsetLeft || 0;
2584 y += parent.offsetTop || 0;
2585 parent = parent.offsetParent;
2586 }
2587 return {
2588 x: x,
2589 y: y
2590 };
2591 }
2592 var elm = this.getEl(), parentElm = elm.parentNode;
2593 var x, y, width, height, parentWidth, parentHeight;
2594 var pos = getOffset(elm, parentElm);
2595 x = pos.x;
2596 y = pos.y;
2597 width = elm.offsetWidth;
2598 height = elm.offsetHeight;
2599 parentWidth = parentElm.clientWidth;
2600 parentHeight = parentElm.clientHeight;
2601 if (align === 'end') {
2602 x -= parentWidth - width;
2603 y -= parentHeight - height;
2604 } else if (align === 'center') {
2605 x -= parentWidth / 2 - width / 2;
2606 y -= parentHeight / 2 - height / 2;
2607 }
2608 parentElm.scrollLeft = x;
2609 parentElm.scrollTop = y;
2610 return this;
2611 },
2612 getRoot: function () {
2613 var ctrl = this, rootControl;
2614 var parents = [];
2615 while (ctrl) {
2616 if (ctrl.rootControl) {
2617 rootControl = ctrl.rootControl;
2618 break;
2619 }
2620 parents.push(ctrl);
2621 rootControl = ctrl;
2622 ctrl = ctrl.parent();
2623 }
2624 if (!rootControl) {
2625 rootControl = this;
2626 }
2627 var i = parents.length;
2628 while (i--) {
2629 parents[i].rootControl = rootControl;
2630 }
2631 return rootControl;
2632 },
2633 reflow: function () {
2634 ReflowQueue.remove(this);
2635 var parent = this.parent();
2636 if (parent && parent._layout && !parent._layout.isNative()) {
2637 parent.reflow();
2638 }
2639 return this;
2640 }
2641 };
2642 global$2.each('text title visible disabled active value'.split(' '), function (name) {
2643 proto$1[name] = function (value) {
2644 if (arguments.length === 0) {
2645 return this.state.get(name);
2646 }
2647 if (typeof value !== 'undefined') {
2648 this.state.set(name, value);
2649 }
2650 return this;
2651 };
2652 });
2653 Control = global$a.extend(proto$1);
2654 function getEventDispatcher(obj) {
2655 if (!obj._eventDispatcher) {
2656 obj._eventDispatcher = new global$b({
2657 scope: obj,
2658 toggleEvent: function (name, state) {
2659 if (state && global$b.isNative(name)) {
2660 if (!obj._nativeEvents) {
2661 obj._nativeEvents = {};
2662 }
2663 obj._nativeEvents[name] = true;
2664 if (obj.state.get('rendered')) {
2665 bindPendingEvents(obj);
2666 }
2667 }
2668 }
2669 });
2670 }
2671 return obj._eventDispatcher;
2672 }
2673 function bindPendingEvents(eventCtrl) {
2674 var i, l, parents, eventRootCtrl, nativeEvents, name;
2675 function delegate(e) {
2676 var control = eventCtrl.getParentCtrl(e.target);
2677 if (control) {
2678 control.fire(e.type, e);
2679 }
2680 }
2681 function mouseLeaveHandler() {
2682 var ctrl = eventRootCtrl._lastHoverCtrl;
2683 if (ctrl) {
2684 ctrl.fire('mouseleave', { target: ctrl.getEl() });
2685 ctrl.parents().each(function (ctrl) {
2686 ctrl.fire('mouseleave', { target: ctrl.getEl() });
2687 });
2688 eventRootCtrl._lastHoverCtrl = null;
2689 }
2690 }
2691 function mouseEnterHandler(e) {
2692 var ctrl = eventCtrl.getParentCtrl(e.target), lastCtrl = eventRootCtrl._lastHoverCtrl, idx = 0, i, parents, lastParents;
2693 if (ctrl !== lastCtrl) {
2694 eventRootCtrl._lastHoverCtrl = ctrl;
2695 parents = ctrl.parents().toArray().reverse();
2696 parents.push(ctrl);
2697 if (lastCtrl) {
2698 lastParents = lastCtrl.parents().toArray().reverse();
2699 lastParents.push(lastCtrl);
2700 for (idx = 0; idx < lastParents.length; idx++) {
2701 if (parents[idx] !== lastParents[idx]) {
2702 break;
2703 }
2704 }
2705 for (i = lastParents.length - 1; i >= idx; i--) {
2706 lastCtrl = lastParents[i];
2707 lastCtrl.fire('mouseleave', { target: lastCtrl.getEl() });
2708 }
2709 }
2710 for (i = idx; i < parents.length; i++) {
2711 ctrl = parents[i];
2712 ctrl.fire('mouseenter', { target: ctrl.getEl() });
2713 }
2714 }
2715 }
2716 function fixWheelEvent(e) {
2717 e.preventDefault();
2718 if (e.type === 'mousewheel') {
2719 e.deltaY = -1 / 40 * e.wheelDelta;
2720 if (e.wheelDeltaX) {
2721 e.deltaX = -1 / 40 * e.wheelDeltaX;
2722 }
2723 } else {
2724 e.deltaX = 0;
2725 e.deltaY = e.detail;
2726 }
2727 e = eventCtrl.fire('wheel', e);
2728 }
2729 nativeEvents = eventCtrl._nativeEvents;
2730 if (nativeEvents) {
2731 parents = eventCtrl.parents().toArray();
2732 parents.unshift(eventCtrl);
2733 for (i = 0, l = parents.length; !eventRootCtrl && i < l; i++) {
2734 eventRootCtrl = parents[i]._eventsRoot;
2735 }
2736 if (!eventRootCtrl) {
2737 eventRootCtrl = parents[parents.length - 1] || eventCtrl;
2738 }
2739 eventCtrl._eventsRoot = eventRootCtrl;
2740 for (l = i, i = 0; i < l; i++) {
2741 parents[i]._eventsRoot = eventRootCtrl;
2742 }
2743 var eventRootDelegates = eventRootCtrl._delegates;
2744 if (!eventRootDelegates) {
2745 eventRootDelegates = eventRootCtrl._delegates = {};
2746 }
2747 for (name in nativeEvents) {
2748 if (!nativeEvents) {
2749 return false;
2750 }
2751 if (name === 'wheel' && !hasWheelEventSupport) {
2752 if (hasMouseWheelEventSupport) {
2753 global$9(eventCtrl.getEl()).on('mousewheel', fixWheelEvent);
2754 } else {
2755 global$9(eventCtrl.getEl()).on('DOMMouseScroll', fixWheelEvent);
2756 }
2757 continue;
2758 }
2759 if (name === 'mouseenter' || name === 'mouseleave') {
2760 if (!eventRootCtrl._hasMouseEnter) {
2761 global$9(eventRootCtrl.getEl()).on('mouseleave', mouseLeaveHandler).on('mouseover', mouseEnterHandler);
2762 eventRootCtrl._hasMouseEnter = 1;
2763 }
2764 } else if (!eventRootDelegates[name]) {
2765 global$9(eventRootCtrl.getEl()).on(name, delegate);
2766 eventRootDelegates[name] = true;
2767 }
2768 nativeEvents[name] = false;
2769 }
2770 }
2771 }
2772 var Control$1 = Control;
2773
2774 var hasTabstopData = function (elm) {
2775 return elm.getAttribute('data-mce-tabstop') ? true : false;
2776 };
2777 function KeyboardNavigation (settings) {
2778 var root = settings.root;
2779 var focusedElement, focusedControl;
2780 function isElement(node) {
2781 return node && node.nodeType === 1;
2782 }
2783 try {
2784 focusedElement = domGlobals.document.activeElement;
2785 } catch (ex) {
2786 focusedElement = domGlobals.document.body;
2787 }
2788 focusedControl = root.getParentCtrl(focusedElement);
2789 function getRole(elm) {
2790 elm = elm || focusedElement;
2791 if (isElement(elm)) {
2792 return elm.getAttribute('role');
2793 }
2794 return null;
2795 }
2796 function getParentRole(elm) {
2797 var role, parent = elm || focusedElement;
2798 while (parent = parent.parentNode) {
2799 if (role = getRole(parent)) {
2800 return role;
2801 }
2802 }
2803 }
2804 function getAriaProp(name) {
2805 var elm = focusedElement;
2806 if (isElement(elm)) {
2807 return elm.getAttribute('aria-' + name);
2808 }
2809 }
2810 function isTextInputElement(elm) {
2811 var tagName = elm.tagName.toUpperCase();
2812 return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT';
2813 }
2814 function canFocus(elm) {
2815 if (isTextInputElement(elm) && !elm.hidden) {
2816 return true;
2817 }
2818 if (hasTabstopData(elm)) {
2819 return true;
2820 }
2821 if (/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(getRole(elm))) {
2822 return true;
2823 }
2824 return false;
2825 }
2826 function getFocusElements(elm) {
2827 var elements = [];
2828 function collect(elm) {
2829 if (elm.nodeType !== 1 || elm.style.display === 'none' || elm.disabled) {
2830 return;
2831 }
2832 if (canFocus(elm)) {
2833 elements.push(elm);
2834 }
2835 for (var i = 0; i < elm.childNodes.length; i++) {
2836 collect(elm.childNodes[i]);
2837 }
2838 }
2839 collect(elm || root.getEl());
2840 return elements;
2841 }
2842 function getNavigationRoot(targetControl) {
2843 var navigationRoot, controls;
2844 targetControl = targetControl || focusedControl;
2845 controls = targetControl.parents().toArray();
2846 controls.unshift(targetControl);
2847 for (var i = 0; i < controls.length; i++) {
2848 navigationRoot = controls[i];
2849 if (navigationRoot.settings.ariaRoot) {
2850 break;
2851 }
2852 }
2853 return navigationRoot;
2854 }
2855 function focusFirst(targetControl) {
2856 var navigationRoot = getNavigationRoot(targetControl);
2857 var focusElements = getFocusElements(navigationRoot.getEl());
2858 if (navigationRoot.settings.ariaRemember && 'lastAriaIndex' in navigationRoot) {
2859 moveFocusToIndex(navigationRoot.lastAriaIndex, focusElements);
2860 } else {
2861 moveFocusToIndex(0, focusElements);
2862 }
2863 }
2864 function moveFocusToIndex(idx, elements) {
2865 if (idx < 0) {
2866 idx = elements.length - 1;
2867 } else if (idx >= elements.length) {
2868 idx = 0;
2869 }
2870 if (elements[idx]) {
2871 elements[idx].focus();
2872 }
2873 return idx;
2874 }
2875 function moveFocus(dir, elements) {
2876 var idx = -1;
2877 var navigationRoot = getNavigationRoot();
2878 elements = elements || getFocusElements(navigationRoot.getEl());
2879 for (var i = 0; i < elements.length; i++) {
2880 if (elements[i] === focusedElement) {
2881 idx = i;
2882 }
2883 }
2884 idx += dir;
2885 navigationRoot.lastAriaIndex = moveFocusToIndex(idx, elements);
2886 }
2887 function left() {
2888 var parentRole = getParentRole();
2889 if (parentRole === 'tablist') {
2890 moveFocus(-1, getFocusElements(focusedElement.parentNode));
2891 } else if (focusedControl.parent().submenu) {
2892 cancel();
2893 } else {
2894 moveFocus(-1);
2895 }
2896 }
2897 function right() {
2898 var role = getRole(), parentRole = getParentRole();
2899 if (parentRole === 'tablist') {
2900 moveFocus(1, getFocusElements(focusedElement.parentNode));
2901 } else if (role === 'menuitem' && parentRole === 'menu' && getAriaProp('haspopup')) {
2902 enter();
2903 } else {
2904 moveFocus(1);
2905 }
2906 }
2907 function up() {
2908 moveFocus(-1);
2909 }
2910 function down() {
2911 var role = getRole(), parentRole = getParentRole();
2912 if (role === 'menuitem' && parentRole === 'menubar') {
2913 enter();
2914 } else if (role === 'button' && getAriaProp('haspopup')) {
2915 enter({ key: 'down' });
2916 } else {
2917 moveFocus(1);
2918 }
2919 }
2920 function tab(e) {
2921 var parentRole = getParentRole();
2922 if (parentRole === 'tablist') {
2923 var elm = getFocusElements(focusedControl.getEl('body'))[0];
2924 if (elm) {
2925 elm.focus();
2926 }
2927 } else {
2928 moveFocus(e.shiftKey ? -1 : 1);
2929 }
2930 }
2931 function cancel() {
2932 focusedControl.fire('cancel');
2933 }
2934 function enter(aria) {
2935 aria = aria || {};
2936 focusedControl.fire('click', {
2937 target: focusedElement,
2938 aria: aria
2939 });
2940 }
2941 root.on('keydown', function (e) {
2942 function handleNonTabOrEscEvent(e, handler) {
2943 if (isTextInputElement(focusedElement) || hasTabstopData(focusedElement)) {
2944 return;
2945 }
2946 if (getRole(focusedElement) === 'slider') {
2947 return;
2948 }
2949 if (handler(e) !== false) {
2950 e.preventDefault();
2951 }
2952 }
2953 if (e.isDefaultPrevented()) {
2954 return;
2955 }
2956 switch (e.keyCode) {
2957 case 37:
2958 handleNonTabOrEscEvent(e, left);
2959 break;
2960 case 39:
2961 handleNonTabOrEscEvent(e, right);
2962 break;
2963 case 38:
2964 handleNonTabOrEscEvent(e, up);
2965 break;
2966 case 40:
2967 handleNonTabOrEscEvent(e, down);
2968 break;
2969 case 27:
2970 cancel();
2971 break;
2972 case 14:
2973 case 13:
2974 case 32:
2975 handleNonTabOrEscEvent(e, enter);
2976 break;
2977 case 9:
2978 tab(e);
2979 e.preventDefault();
2980 break;
2981 }
2982 });
2983 root.on('focusin', function (e) {
2984 focusedElement = e.target;
2985 focusedControl = e.control;
2986 });
2987 return { focusFirst: focusFirst };
2988 }
2989
2990 var selectorCache = {};
2991 var Container = Control$1.extend({
2992 init: function (settings) {
2993 var self = this;
2994 self._super(settings);
2995 settings = self.settings;
2996 if (settings.fixed) {
2997 self.state.set('fixed', true);
2998 }
2999 self._items = new Collection$2();
3000 if (self.isRtl()) {
3001 self.classes.add('rtl');
3002 }
3003 self.bodyClasses = new ClassList(function () {
3004 if (self.state.get('rendered')) {
3005 self.getEl('body').className = this.toString();
3006 }
3007 });
3008 self.bodyClasses.prefix = self.classPrefix;
3009 self.classes.add('container');
3010 self.bodyClasses.add('container-body');
3011 if (settings.containerCls) {
3012 self.classes.add(settings.containerCls);
3013 }
3014 self._layout = global$4.create((settings.layout || '') + 'layout');
3015 if (self.settings.items) {
3016 self.add(self.settings.items);
3017 } else {
3018 self.add(self.render());
3019 }
3020 self._hasBody = true;
3021 },
3022 items: function () {
3023 return this._items;
3024 },
3025 find: function (selector) {
3026 selector = selectorCache[selector] = selectorCache[selector] || new Selector(selector);
3027 return selector.find(this);
3028 },
3029 add: function (items) {
3030 var self = this;
3031 self.items().add(self.create(items)).parent(self);
3032 return self;
3033 },
3034 focus: function (keyboard) {
3035 var self = this;
3036 var focusCtrl, keyboardNav, items;
3037 if (keyboard) {
3038 keyboardNav = self.keyboardNav || self.parents().eq(-1)[0].keyboardNav;
3039 if (keyboardNav) {
3040 keyboardNav.focusFirst(self);
3041 return;
3042 }
3043 }
3044 items = self.find('*');
3045 if (self.statusbar) {
3046 items.add(self.statusbar.items());
3047 }
3048 items.each(function (ctrl) {
3049 if (ctrl.settings.autofocus) {
3050 focusCtrl = null;
3051 return false;
3052 }
3053 if (ctrl.canFocus) {
3054 focusCtrl = focusCtrl || ctrl;
3055 }
3056 });
3057 if (focusCtrl) {
3058 focusCtrl.focus();
3059 }
3060 return self;
3061 },
3062 replace: function (oldItem, newItem) {
3063 var ctrlElm;
3064 var items = this.items();
3065 var i = items.length;
3066 while (i--) {
3067 if (items[i] === oldItem) {
3068 items[i] = newItem;
3069 break;
3070 }
3071 }
3072 if (i >= 0) {
3073 ctrlElm = newItem.getEl();
3074 if (ctrlElm) {
3075 ctrlElm.parentNode.removeChild(ctrlElm);
3076 }
3077 ctrlElm = oldItem.getEl();
3078 if (ctrlElm) {
3079 ctrlElm.parentNode.removeChild(ctrlElm);
3080 }
3081 }
3082 newItem.parent(this);
3083 },
3084 create: function (items) {
3085 var self = this;
3086 var settings;
3087 var ctrlItems = [];
3088 if (!global$2.isArray(items)) {
3089 items = [items];
3090 }
3091 global$2.each(items, function (item) {
3092 if (item) {
3093 if (!(item instanceof Control$1)) {
3094 if (typeof item === 'string') {
3095 item = { type: item };
3096 }
3097 settings = global$2.extend({}, self.settings.defaults, item);
3098 item.type = settings.type = settings.type || item.type || self.settings.defaultType || (settings.defaults ? settings.defaults.type : null);
3099 item = global$4.create(settings);
3100 }
3101 ctrlItems.push(item);
3102 }
3103 });
3104 return ctrlItems;
3105 },
3106 renderNew: function () {
3107 var self = this;
3108 self.items().each(function (ctrl, index) {
3109 var containerElm;
3110 ctrl.parent(self);
3111 if (!ctrl.state.get('rendered')) {
3112 containerElm = self.getEl('body');
3113 if (containerElm.hasChildNodes() && index <= containerElm.childNodes.length - 1) {
3114 global$9(containerElm.childNodes[index]).before(ctrl.renderHtml());
3115 } else {
3116 global$9(containerElm).append(ctrl.renderHtml());
3117 }
3118 ctrl.postRender();
3119 ReflowQueue.add(ctrl);
3120 }
3121 });
3122 self._layout.applyClasses(self.items().filter(':visible'));
3123 self._lastRect = null;
3124 return self;
3125 },
3126 append: function (items) {
3127 return this.add(items).renderNew();
3128 },
3129 prepend: function (items) {
3130 var self = this;
3131 self.items().set(self.create(items).concat(self.items().toArray()));
3132 return self.renderNew();
3133 },
3134 insert: function (items, index, before) {
3135 var self = this;
3136 var curItems, beforeItems, afterItems;
3137 items = self.create(items);
3138 curItems = self.items();
3139 if (!before && index < curItems.length - 1) {
3140 index += 1;
3141 }
3142 if (index >= 0 && index < curItems.length) {
3143 beforeItems = curItems.slice(0, index).toArray();
3144 afterItems = curItems.slice(index).toArray();
3145 curItems.set(beforeItems.concat(items, afterItems));
3146 }
3147 return self.renderNew();
3148 },
3149 fromJSON: function (data) {
3150 var self = this;
3151 for (var name in data) {
3152 self.find('#' + name).value(data[name]);
3153 }
3154 return self;
3155 },
3156 toJSON: function () {
3157 var self = this, data = {};
3158 self.find('*').each(function (ctrl) {
3159 var name = ctrl.name(), value = ctrl.value();
3160 if (name && typeof value !== 'undefined') {
3161 data[name] = value;
3162 }
3163 });
3164 return data;
3165 },
3166 renderHtml: function () {
3167 var self = this, layout = self._layout, role = this.settings.role;
3168 self.preRender();
3169 layout.preRender(self);
3170 return '<div id="' + self._id + '" class="' + self.classes + '"' + (role ? ' role="' + this.settings.role + '"' : '') + '>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
3171 },
3172 postRender: function () {
3173 var self = this;
3174 var box;
3175 self.items().exec('postRender');
3176 self._super();
3177 self._layout.postRender(self);
3178 self.state.set('rendered', true);
3179 if (self.settings.style) {
3180 self.$el.css(self.settings.style);
3181 }
3182 if (self.settings.border) {
3183 box = self.borderBox;
3184 self.$el.css({
3185 'border-top-width': box.top,
3186 'border-right-width': box.right,
3187 'border-bottom-width': box.bottom,
3188 'border-left-width': box.left
3189 });
3190 }
3191 if (!self.parent()) {
3192 self.keyboardNav = KeyboardNavigation({ root: self });
3193 }
3194 return self;
3195 },
3196 initLayoutRect: function () {
3197 var self = this, layoutRect = self._super();
3198 self._layout.recalc(self);
3199 return layoutRect;
3200 },
3201 recalc: function () {
3202 var self = this;
3203 var rect = self._layoutRect;
3204 var lastRect = self._lastRect;
3205 if (!lastRect || lastRect.w !== rect.w || lastRect.h !== rect.h) {
3206 self._layout.recalc(self);
3207 rect = self.layoutRect();
3208 self._lastRect = {
3209 x: rect.x,
3210 y: rect.y,
3211 w: rect.w,
3212 h: rect.h
3213 };
3214 return true;
3215 }
3216 },
3217 reflow: function () {
3218 var i;
3219 ReflowQueue.remove(this);
3220 if (this.visible()) {
3221 Control$1.repaintControls = [];
3222 Control$1.repaintControls.map = {};
3223 this.recalc();
3224 i = Control$1.repaintControls.length;
3225 while (i--) {
3226 Control$1.repaintControls[i].repaint();
3227 }
3228 if (this.settings.layout !== 'flow' && this.settings.layout !== 'stack') {
3229 this.repaint();
3230 }
3231 Control$1.repaintControls = [];
3232 }
3233 return this;
3234 }
3235 });
3236
3237 function getDocumentSize(doc) {
3238 var documentElement, body, scrollWidth, clientWidth;
3239 var offsetWidth, scrollHeight, clientHeight, offsetHeight;
3240 var max = Math.max;
3241 documentElement = doc.documentElement;
3242 body = doc.body;
3243 scrollWidth = max(documentElement.scrollWidth, body.scrollWidth);
3244 clientWidth = max(documentElement.clientWidth, body.clientWidth);
3245 offsetWidth = max(documentElement.offsetWidth, body.offsetWidth);
3246 scrollHeight = max(documentElement.scrollHeight, body.scrollHeight);
3247 clientHeight = max(documentElement.clientHeight, body.clientHeight);
3248 offsetHeight = max(documentElement.offsetHeight, body.offsetHeight);
3249 return {
3250 width: scrollWidth < offsetWidth ? clientWidth : scrollWidth,
3251 height: scrollHeight < offsetHeight ? clientHeight : scrollHeight
3252 };
3253 }
3254 function updateWithTouchData(e) {
3255 var keys, i;
3256 if (e.changedTouches) {
3257 keys = 'screenX screenY pageX pageY clientX clientY'.split(' ');
3258 for (i = 0; i < keys.length; i++) {
3259 e[keys[i]] = e.changedTouches[0][keys[i]];
3260 }
3261 }
3262 }
3263 function DragHelper (id, settings) {
3264 var $eventOverlay;
3265 var doc = settings.document || domGlobals.document;
3266 var downButton;
3267 var start, stop, drag, startX, startY;
3268 settings = settings || {};
3269 var handleElement = doc.getElementById(settings.handle || id);
3270 start = function (e) {
3271 var docSize = getDocumentSize(doc);
3272 var handleElm, cursor;
3273 updateWithTouchData(e);
3274 e.preventDefault();
3275 downButton = e.button;
3276 handleElm = handleElement;
3277 startX = e.screenX;
3278 startY = e.screenY;
3279 if (domGlobals.window.getComputedStyle) {
3280 cursor = domGlobals.window.getComputedStyle(handleElm, null).getPropertyValue('cursor');
3281 } else {
3282 cursor = handleElm.runtimeStyle.cursor;
3283 }
3284 $eventOverlay = global$9('<div></div>').css({
3285 position: 'absolute',
3286 top: 0,
3287 left: 0,
3288 width: docSize.width,
3289 height: docSize.height,
3290 zIndex: 2147483647,
3291 opacity: 0.0001,
3292 cursor: cursor
3293 }).appendTo(doc.body);
3294 global$9(doc).on('mousemove touchmove', drag).on('mouseup touchend', stop);
3295 settings.start(e);
3296 };
3297 drag = function (e) {
3298 updateWithTouchData(e);
3299 if (e.button !== downButton) {
3300 return stop(e);
3301 }
3302 e.deltaX = e.screenX - startX;
3303 e.deltaY = e.screenY - startY;
3304 e.preventDefault();
3305 settings.drag(e);
3306 };
3307 stop = function (e) {
3308 updateWithTouchData(e);
3309 global$9(doc).off('mousemove touchmove', drag).off('mouseup touchend', stop);
3310 $eventOverlay.remove();
3311 if (settings.stop) {
3312 settings.stop(e);
3313 }
3314 };
3315 this.destroy = function () {
3316 global$9(handleElement).off();
3317 };
3318 global$9(handleElement).on('mousedown touchstart', start);
3319 }
3320
3321 var Scrollable = {
3322 init: function () {
3323 var self = this;
3324 self.on('repaint', self.renderScroll);
3325 },
3326 renderScroll: function () {
3327 var self = this, margin = 2;
3328 function repaintScroll() {
3329 var hasScrollH, hasScrollV, bodyElm;
3330 function repaintAxis(axisName, posName, sizeName, contentSizeName, hasScroll, ax) {
3331 var containerElm, scrollBarElm, scrollThumbElm;
3332 var containerSize, scrollSize, ratio, rect;
3333 var posNameLower, sizeNameLower;
3334 scrollBarElm = self.getEl('scroll' + axisName);
3335 if (scrollBarElm) {
3336 posNameLower = posName.toLowerCase();
3337 sizeNameLower = sizeName.toLowerCase();
3338 global$9(self.getEl('absend')).css(posNameLower, self.layoutRect()[contentSizeName] - 1);
3339 if (!hasScroll) {
3340 global$9(scrollBarElm).css('display', 'none');
3341 return;
3342 }
3343 global$9(scrollBarElm).css('display', 'block');
3344 containerElm = self.getEl('body');
3345 scrollThumbElm = self.getEl('scroll' + axisName + 't');
3346 containerSize = containerElm['client' + sizeName] - margin * 2;
3347 containerSize -= hasScrollH && hasScrollV ? scrollBarElm['client' + ax] : 0;
3348 scrollSize = containerElm['scroll' + sizeName];
3349 ratio = containerSize / scrollSize;
3350 rect = {};
3351 rect[posNameLower] = containerElm['offset' + posName] + margin;
3352 rect[sizeNameLower] = containerSize;
3353 global$9(scrollBarElm).css(rect);
3354 rect = {};
3355 rect[posNameLower] = containerElm['scroll' + posName] * ratio;
3356 rect[sizeNameLower] = containerSize * ratio;
3357 global$9(scrollThumbElm).css(rect);
3358 }
3359 }
3360 bodyElm = self.getEl('body');
3361 hasScrollH = bodyElm.scrollWidth > bodyElm.clientWidth;
3362 hasScrollV = bodyElm.scrollHeight > bodyElm.clientHeight;
3363 repaintAxis('h', 'Left', 'Width', 'contentW', hasScrollH, 'Height');
3364 repaintAxis('v', 'Top', 'Height', 'contentH', hasScrollV, 'Width');
3365 }
3366 function addScroll() {
3367 function addScrollAxis(axisName, posName, sizeName, deltaPosName, ax) {
3368 var scrollStart;
3369 var axisId = self._id + '-scroll' + axisName, prefix = self.classPrefix;
3370 global$9(self.getEl()).append('<div id="' + axisId + '" class="' + prefix + 'scrollbar ' + prefix + 'scrollbar-' + axisName + '">' + '<div id="' + axisId + 't" class="' + prefix + 'scrollbar-thumb"></div>' + '</div>');
3371 self.draghelper = new DragHelper(axisId + 't', {
3372 start: function () {
3373 scrollStart = self.getEl('body')['scroll' + posName];
3374 global$9('#' + axisId).addClass(prefix + 'active');
3375 },
3376 drag: function (e) {
3377 var ratio, hasScrollH, hasScrollV, containerSize;
3378 var layoutRect = self.layoutRect();
3379 hasScrollH = layoutRect.contentW > layoutRect.innerW;
3380 hasScrollV = layoutRect.contentH > layoutRect.innerH;
3381 containerSize = self.getEl('body')['client' + sizeName] - margin * 2;
3382 containerSize -= hasScrollH && hasScrollV ? self.getEl('scroll' + axisName)['client' + ax] : 0;
3383 ratio = containerSize / self.getEl('body')['scroll' + sizeName];
3384 self.getEl('body')['scroll' + posName] = scrollStart + e['delta' + deltaPosName] / ratio;
3385 },
3386 stop: function () {
3387 global$9('#' + axisId).removeClass(prefix + 'active');
3388 }
3389 });
3390 }
3391 self.classes.add('scroll');
3392 addScrollAxis('v', 'Top', 'Height', 'Y', 'Width');
3393 addScrollAxis('h', 'Left', 'Width', 'X', 'Height');
3394 }
3395 if (self.settings.autoScroll) {
3396 if (!self._hasScroll) {
3397 self._hasScroll = true;
3398 addScroll();
3399 self.on('wheel', function (e) {
3400 var bodyEl = self.getEl('body');
3401 bodyEl.scrollLeft += (e.deltaX || 0) * 10;
3402 bodyEl.scrollTop += e.deltaY * 10;
3403 repaintScroll();
3404 });
3405 global$9(self.getEl('body')).on('scroll', repaintScroll);
3406 }
3407 repaintScroll();
3408 }
3409 }
3410 };
3411
3412 var Panel = Container.extend({
3413 Defaults: {
3414 layout: 'fit',
3415 containerCls: 'panel'
3416 },
3417 Mixins: [Scrollable],
3418 renderHtml: function () {
3419 var self = this;
3420 var layout = self._layout;
3421 var innerHtml = self.settings.html;
3422 self.preRender();
3423 layout.preRender(self);
3424 if (typeof innerHtml === 'undefined') {
3425 innerHtml = '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>';
3426 } else {
3427 if (typeof innerHtml === 'function') {
3428 innerHtml = innerHtml.call(self);
3429 }
3430 self._hasBody = false;
3431 }
3432 return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1" role="group">' + (self._preBodyHtml || '') + innerHtml + '</div>';
3433 }
3434 });
3435
3436 var Resizable = {
3437 resizeToContent: function () {
3438 this._layoutRect.autoResize = true;
3439 this._lastRect = null;
3440 this.reflow();
3441 },
3442 resizeTo: function (w, h) {
3443 if (w <= 1 || h <= 1) {
3444 var rect = funcs.getWindowSize();
3445 w = w <= 1 ? w * rect.w : w;
3446 h = h <= 1 ? h * rect.h : h;
3447 }
3448 this._layoutRect.autoResize = false;
3449 return this.layoutRect({
3450 minW: w,
3451 minH: h,
3452 w: w,
3453 h: h
3454 }).reflow();
3455 },
3456 resizeBy: function (dw, dh) {
3457 var self = this, rect = self.layoutRect();
3458 return self.resizeTo(rect.w + dw, rect.h + dh);
3459 }
3460 };
3461
3462 var documentClickHandler, documentScrollHandler, windowResizeHandler;
3463 var visiblePanels = [];
3464 var zOrder = [];
3465 var hasModal;
3466 function isChildOf(ctrl, parent) {
3467 while (ctrl) {
3468 if (ctrl === parent) {
3469 return true;
3470 }
3471 ctrl = ctrl.parent();
3472 }
3473 }
3474 function skipOrHidePanels(e) {
3475 var i = visiblePanels.length;
3476 while (i--) {
3477 var panel = visiblePanels[i], clickCtrl = panel.getParentCtrl(e.target);
3478 if (panel.settings.autohide) {
3479 if (clickCtrl) {
3480 if (isChildOf(clickCtrl, panel) || panel.parent() === clickCtrl) {
3481 continue;
3482 }
3483 }
3484 e = panel.fire('autohide', { target: e.target });
3485 if (!e.isDefaultPrevented()) {
3486 panel.hide();
3487 }
3488 }
3489 }
3490 }
3491 function bindDocumentClickHandler() {
3492 if (!documentClickHandler) {
3493 documentClickHandler = function (e) {
3494 if (e.button === 2) {
3495 return;
3496 }
3497 skipOrHidePanels(e);
3498 };
3499 global$9(domGlobals.document).on('click touchstart', documentClickHandler);
3500 }
3501 }
3502 function bindDocumentScrollHandler() {
3503 if (!documentScrollHandler) {
3504 documentScrollHandler = function () {
3505 var i;
3506 i = visiblePanels.length;
3507 while (i--) {
3508 repositionPanel(visiblePanels[i]);
3509 }
3510 };
3511 global$9(domGlobals.window).on('scroll', documentScrollHandler);
3512 }
3513 }
3514 function bindWindowResizeHandler() {
3515 if (!windowResizeHandler) {
3516 var docElm_1 = domGlobals.document.documentElement;
3517 var clientWidth_1 = docElm_1.clientWidth, clientHeight_1 = docElm_1.clientHeight;
3518 windowResizeHandler = function () {
3519 if (!domGlobals.document.all || clientWidth_1 !== docElm_1.clientWidth || clientHeight_1 !== docElm_1.clientHeight) {
3520 clientWidth_1 = docElm_1.clientWidth;
3521 clientHeight_1 = docElm_1.clientHeight;
3522 FloatPanel.hideAll();
3523 }
3524 };
3525 global$9(domGlobals.window).on('resize', windowResizeHandler);
3526 }
3527 }
3528 function repositionPanel(panel) {
3529 var scrollY = funcs.getViewPort().y;
3530 function toggleFixedChildPanels(fixed, deltaY) {
3531 var parent;
3532 for (var i = 0; i < visiblePanels.length; i++) {
3533 if (visiblePanels[i] !== panel) {
3534 parent = visiblePanels[i].parent();
3535 while (parent && (parent = parent.parent())) {
3536 if (parent === panel) {
3537 visiblePanels[i].fixed(fixed).moveBy(0, deltaY).repaint();
3538 }
3539 }
3540 }
3541 }
3542 }
3543 if (panel.settings.autofix) {
3544 if (!panel.state.get('fixed')) {
3545 panel._autoFixY = panel.layoutRect().y;
3546 if (panel._autoFixY < scrollY) {
3547 panel.fixed(true).layoutRect({ y: 0 }).repaint();
3548 toggleFixedChildPanels(true, scrollY - panel._autoFixY);
3549 }
3550 } else {
3551 if (panel._autoFixY > scrollY) {
3552 panel.fixed(false).layoutRect({ y: panel._autoFixY }).repaint();
3553 toggleFixedChildPanels(false, panel._autoFixY - scrollY);
3554 }
3555 }
3556 }
3557 }
3558 function addRemove(add, ctrl) {
3559 var i, zIndex = FloatPanel.zIndex || 65535, topModal;
3560 if (add) {
3561 zOrder.push(ctrl);
3562 } else {
3563 i = zOrder.length;
3564 while (i--) {
3565 if (zOrder[i] === ctrl) {
3566 zOrder.splice(i, 1);
3567 }
3568 }
3569 }
3570 if (zOrder.length) {
3571 for (i = 0; i < zOrder.length; i++) {
3572 if (zOrder[i].modal) {
3573 zIndex++;
3574 topModal = zOrder[i];
3575 }
3576 zOrder[i].getEl().style.zIndex = zIndex;
3577 zOrder[i].zIndex = zIndex;
3578 zIndex++;
3579 }
3580 }
3581 var modalBlockEl = global$9('#' + ctrl.classPrefix + 'modal-block', ctrl.getContainerElm())[0];
3582 if (topModal) {
3583 global$9(modalBlockEl).css('z-index', topModal.zIndex - 1);
3584 } else if (modalBlockEl) {
3585 modalBlockEl.parentNode.removeChild(modalBlockEl);
3586 hasModal = false;
3587 }
3588 FloatPanel.currentZIndex = zIndex;
3589 }
3590 var FloatPanel = Panel.extend({
3591 Mixins: [
3592 Movable,
3593 Resizable
3594 ],
3595 init: function (settings) {
3596 var self = this;
3597 self._super(settings);
3598 self._eventsRoot = self;
3599 self.classes.add('floatpanel');
3600 if (settings.autohide) {
3601 bindDocumentClickHandler();
3602 bindWindowResizeHandler();
3603 visiblePanels.push(self);
3604 }
3605 if (settings.autofix) {
3606 bindDocumentScrollHandler();
3607 self.on('move', function () {
3608 repositionPanel(this);
3609 });
3610 }
3611 self.on('postrender show', function (e) {
3612 if (e.control === self) {
3613 var $modalBlockEl_1;
3614 var prefix_1 = self.classPrefix;
3615 if (self.modal && !hasModal) {
3616 $modalBlockEl_1 = global$9('#' + prefix_1 + 'modal-block', self.getContainerElm());
3617 if (!$modalBlockEl_1[0]) {
3618 $modalBlockEl_1 = global$9('<div id="' + prefix_1 + 'modal-block" class="' + prefix_1 + 'reset ' + prefix_1 + 'fade"></div>').appendTo(self.getContainerElm());
3619 }
3620 global$7.setTimeout(function () {
3621 $modalBlockEl_1.addClass(prefix_1 + 'in');
3622 global$9(self.getEl()).addClass(prefix_1 + 'in');
3623 });
3624 hasModal = true;
3625 }
3626 addRemove(true, self);
3627 }
3628 });
3629 self.on('show', function () {
3630 self.parents().each(function (ctrl) {
3631 if (ctrl.state.get('fixed')) {
3632 self.fixed(true);
3633 return false;
3634 }
3635 });
3636 });
3637 if (settings.popover) {
3638 self._preBodyHtml = '<div class="' + self.classPrefix + 'arrow"></div>';
3639 self.classes.add('popover').add('bottom').add(self.isRtl() ? 'end' : 'start');
3640 }
3641 self.aria('label', settings.ariaLabel);
3642 self.aria('labelledby', self._id);
3643 self.aria('describedby', self.describedBy || self._id + '-none');
3644 },
3645 fixed: function (state) {
3646 var self = this;
3647 if (self.state.get('fixed') !== state) {
3648 if (self.state.get('rendered')) {
3649 var viewport = funcs.getViewPort();
3650 if (state) {
3651 self.layoutRect().y -= viewport.y;
3652 } else {
3653 self.layoutRect().y += viewport.y;
3654 }
3655 }
3656 self.classes.toggle('fixed', state);
3657 self.state.set('fixed', state);
3658 }
3659 return self;
3660 },
3661 show: function () {
3662 var self = this;
3663 var i;
3664 var state = self._super();
3665 i = visiblePanels.length;
3666 while (i--) {
3667 if (visiblePanels[i] === self) {
3668 break;
3669 }
3670 }
3671 if (i === -1) {
3672 visiblePanels.push(self);
3673 }
3674 return state;
3675 },
3676 hide: function () {
3677 removeVisiblePanel(this);
3678 addRemove(false, this);
3679 return this._super();
3680 },
3681 hideAll: function () {
3682 FloatPanel.hideAll();
3683 },
3684 close: function () {
3685 var self = this;
3686 if (!self.fire('close').isDefaultPrevented()) {
3687 self.remove();
3688 addRemove(false, self);
3689 }
3690 return self;
3691 },
3692 remove: function () {
3693 removeVisiblePanel(this);
3694 this._super();
3695 },
3696 postRender: function () {
3697 var self = this;
3698 if (self.settings.bodyRole) {
3699 this.getEl('body').setAttribute('role', self.settings.bodyRole);
3700 }
3701 return self._super();
3702 }
3703 });
3704 FloatPanel.hideAll = function () {
3705 var i = visiblePanels.length;
3706 while (i--) {
3707 var panel = visiblePanels[i];
3708 if (panel && panel.settings.autohide) {
3709 panel.hide();
3710 visiblePanels.splice(i, 1);
3711 }
3712 }
3713 };
3714 function removeVisiblePanel(panel) {
3715 var i;
3716 i = visiblePanels.length;
3717 while (i--) {
3718 if (visiblePanels[i] === panel) {
3719 visiblePanels.splice(i, 1);
3720 }
3721 }
3722 i = zOrder.length;
3723 while (i--) {
3724 if (zOrder[i] === panel) {
3725 zOrder.splice(i, 1);
3726 }
3727 }
3728 }
3729
3730 var isFixed$1 = function (inlineToolbarContainer, editor) {
3731 return !!(inlineToolbarContainer && !editor.settings.ui_container);
3732 };
3733 var render$1 = function (editor, theme, args) {
3734 var panel, inlineToolbarContainer;
3735 var DOM = global$3.DOM;
3736 var fixedToolbarContainer = getFixedToolbarContainer(editor);
3737 if (fixedToolbarContainer) {
3738 inlineToolbarContainer = DOM.select(fixedToolbarContainer)[0];
3739 }
3740 var reposition = function () {
3741 if (panel && panel.moveRel && panel.visible() && !panel._fixed) {
3742 var scrollContainer = editor.selection.getScrollContainer(), body = editor.getBody();
3743 var deltaX = 0, deltaY = 0;
3744 if (scrollContainer) {
3745 var bodyPos = DOM.getPos(body), scrollContainerPos = DOM.getPos(scrollContainer);
3746 deltaX = Math.max(0, scrollContainerPos.x - bodyPos.x);
3747 deltaY = Math.max(0, scrollContainerPos.y - bodyPos.y);
3748 }
3749 panel.fixed(false).moveRel(body, editor.rtl ? [
3750 'tr-br',
3751 'br-tr'
3752 ] : [
3753 'tl-bl',
3754 'bl-tl',
3755 'tr-br'
3756 ]).moveBy(deltaX, deltaY);
3757 }
3758 };
3759 var show = function () {
3760 if (panel) {
3761 panel.show();
3762 reposition();
3763 DOM.addClass(editor.getBody(), 'mce-edit-focus');
3764 }
3765 };
3766 var hide = function () {
3767 if (panel) {
3768 panel.hide();
3769 FloatPanel.hideAll();
3770 DOM.removeClass(editor.getBody(), 'mce-edit-focus');
3771 }
3772 };
3773 var render = function () {
3774 if (panel) {
3775 if (!panel.visible()) {
3776 show();
3777 }
3778 return;
3779 }
3780 panel = theme.panel = global$4.create({
3781 type: inlineToolbarContainer ? 'panel' : 'floatpanel',
3782 role: 'application',
3783 classes: 'tinymce tinymce-inline',
3784 layout: 'flex',
3785 direction: 'column',
3786 align: 'stretch',
3787 autohide: false,
3788 autofix: true,
3789 fixed: isFixed$1(inlineToolbarContainer, editor),
3790 border: 1,
3791 items: [
3792 hasMenubar(editor) === false ? null : {
3793 type: 'menubar',
3794 border: '0 0 1 0',
3795 items: Menubar.createMenuButtons(editor)
3796 },
3797 Toolbar.createToolbars(editor, getToolbarSize(editor))
3798 ]
3799 });
3800 UiContainer.setUiContainer(editor, panel);
3801 Events.fireBeforeRenderUI(editor);
3802 if (inlineToolbarContainer) {
3803 panel.renderTo(inlineToolbarContainer).reflow();
3804 } else {
3805 panel.renderTo().reflow();
3806 }
3807 A11y.addKeys(editor, panel);
3808 show();
3809 ContextToolbars.addContextualToolbars(editor);
3810 editor.on('nodeChange', reposition);
3811 editor.on('ResizeWindow', reposition);
3812 editor.on('activate', show);
3813 editor.on('deactivate', hide);
3814 editor.nodeChanged();
3815 };
3816 editor.settings.content_editable = true;
3817 editor.on('focus', function () {
3818 if (isSkinDisabled(editor) === false && args.skinUiCss) {
3819 DOM.styleSheetLoader.load(args.skinUiCss, render, render);
3820 } else {
3821 render();
3822 }
3823 });
3824 editor.on('blur hide', hide);
3825 editor.on('remove', function () {
3826 if (panel) {
3827 panel.remove();
3828 panel = null;
3829 }
3830 });
3831 if (isSkinDisabled(editor) === false && args.skinUiCss) {
3832 DOM.styleSheetLoader.load(args.skinUiCss, SkinLoaded.fireSkinLoaded(editor));
3833 } else {
3834 SkinLoaded.fireSkinLoaded(editor)();
3835 }
3836 return {};
3837 };
3838 var Inline = { render: render$1 };
3839
3840 function Throbber (elm, inline) {
3841 var self = this;
3842 var state;
3843 var classPrefix = Control$1.classPrefix;
3844 var timer;
3845 self.show = function (time, callback) {
3846 function render() {
3847 if (state) {
3848 global$9(elm).append('<div class="' + classPrefix + 'throbber' + (inline ? ' ' + classPrefix + 'throbber-inline' : '') + '"></div>');
3849 if (callback) {
3850 callback();
3851 }
3852 }
3853 }
3854 self.hide();
3855 state = true;
3856 if (time) {
3857 timer = global$7.setTimeout(render, time);
3858 } else {
3859 render();
3860 }
3861 return self;
3862 };
3863 self.hide = function () {
3864 var child = elm.lastChild;
3865 global$7.clearTimeout(timer);
3866 if (child && child.className.indexOf('throbber') !== -1) {
3867 child.parentNode.removeChild(child);
3868 }
3869 state = false;
3870 return self;
3871 };
3872 }
3873
3874 var setup = function (editor, theme) {
3875 var throbber;
3876 editor.on('ProgressState', function (e) {
3877 throbber = throbber || new Throbber(theme.panel.getEl('body'));
3878 if (e.state) {
3879 throbber.show(e.time);
3880 } else {
3881 throbber.hide();
3882 }
3883 });
3884 };
3885 var ProgressState = { setup: setup };
3886
3887 var renderUI = function (editor, theme, args) {
3888 var skinUrl = getSkinUrl(editor);
3889 if (skinUrl) {
3890 args.skinUiCss = skinUrl + '/skin.min.css';
3891 editor.contentCSS.push(skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css');
3892 }
3893 ProgressState.setup(editor, theme);
3894 return isInline(editor) ? Inline.render(editor, theme, args) : Iframe.render(editor, theme, args);
3895 };
3896 var Render = { renderUI: renderUI };
3897
3898 var Tooltip = Control$1.extend({
3899 Mixins: [Movable],
3900 Defaults: { classes: 'widget tooltip tooltip-n' },
3901 renderHtml: function () {
3902 var self = this, prefix = self.classPrefix;
3903 return '<div id="' + self._id + '" class="' + self.classes + '" role="presentation">' + '<div class="' + prefix + 'tooltip-arrow"></div>' + '<div class="' + prefix + 'tooltip-inner">' + self.encode(self.state.get('text')) + '</div>' + '</div>';
3904 },
3905 bindStates: function () {
3906 var self = this;
3907 self.state.on('change:text', function (e) {
3908 self.getEl().lastChild.innerHTML = self.encode(e.value);
3909 });
3910 return self._super();
3911 },
3912 repaint: function () {
3913 var self = this;
3914 var style, rect;
3915 style = self.getEl().style;
3916 rect = self._layoutRect;
3917 style.left = rect.x + 'px';
3918 style.top = rect.y + 'px';
3919 style.zIndex = 65535 + 65535;
3920 }
3921 });
3922
3923 var Widget = Control$1.extend({
3924 init: function (settings) {
3925 var self = this;
3926 self._super(settings);
3927 settings = self.settings;
3928 self.canFocus = true;
3929 if (settings.tooltip && Widget.tooltips !== false) {
3930 self.on('mouseenter', function (e) {
3931 var tooltip = self.tooltip().moveTo(-65535);
3932 if (e.control === self) {
3933 var rel = tooltip.text(settings.tooltip).show().testMoveRel(self.getEl(), [
3934 'bc-tc',
3935 'bc-tl',
3936 'bc-tr'
3937 ]);
3938 tooltip.classes.toggle('tooltip-n', rel === 'bc-tc');
3939 tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl');
3940 tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr');
3941 tooltip.moveRel(self.getEl(), rel);
3942 } else {
3943 tooltip.hide();
3944 }
3945 });
3946 self.on('mouseleave mousedown click', function () {
3947 self.tooltip().remove();
3948 self._tooltip = null;
3949 });
3950 }
3951 self.aria('label', settings.ariaLabel || settings.tooltip);
3952 },
3953 tooltip: function () {
3954 if (!this._tooltip) {
3955 this._tooltip = new Tooltip({ type: 'tooltip' });
3956 UiContainer.inheritUiContainer(this, this._tooltip);
3957 this._tooltip.renderTo();
3958 }
3959 return this._tooltip;
3960 },
3961 postRender: function () {
3962 var self = this, settings = self.settings;
3963 self._super();
3964 if (!self.parent() && (settings.width || settings.height)) {
3965 self.initLayoutRect();
3966 self.repaint();
3967 }
3968 if (settings.autofocus) {
3969 self.focus();
3970 }
3971 },
3972 bindStates: function () {
3973 var self = this;
3974 function disable(state) {
3975 self.aria('disabled', state);
3976 self.classes.toggle('disabled', state);
3977 }
3978 function active(state) {
3979 self.aria('pressed', state);
3980 self.classes.toggle('active', state);
3981 }
3982 self.state.on('change:disabled', function (e) {
3983 disable(e.value);
3984 });
3985 self.state.on('change:active', function (e) {
3986 active(e.value);
3987 });
3988 if (self.state.get('disabled')) {
3989 disable(true);
3990 }
3991 if (self.state.get('active')) {
3992 active(true);
3993 }
3994 return self._super();
3995 },
3996 remove: function () {
3997 this._super();
3998 if (this._tooltip) {
3999 this._tooltip.remove();
4000 this._tooltip = null;
4001 }
4002 }
4003 });
4004
4005 var Progress = Widget.extend({
4006 Defaults: { value: 0 },
4007 init: function (settings) {
4008 var self = this;
4009 self._super(settings);
4010 self.classes.add('progress');
4011 if (!self.settings.filter) {
4012 self.settings.filter = function (value) {
4013 return Math.round(value);
4014 };
4015 }
4016 },
4017 renderHtml: function () {
4018 var self = this, id = self._id, prefix = this.classPrefix;
4019 return '<div id="' + id + '" class="' + self.classes + '">' + '<div class="' + prefix + 'bar-container">' + '<div class="' + prefix + 'bar"></div>' + '</div>' + '<div class="' + prefix + 'text">0%</div>' + '</div>';
4020 },
4021 postRender: function () {
4022 var self = this;
4023 self._super();
4024 self.value(self.settings.value);
4025 return self;
4026 },
4027 bindStates: function () {
4028 var self = this;
4029 function setValue(value) {
4030 value = self.settings.filter(value);
4031 self.getEl().lastChild.innerHTML = value + '%';
4032 self.getEl().firstChild.firstChild.style.width = value + '%';
4033 }
4034 self.state.on('change:value', function (e) {
4035 setValue(e.value);
4036 });
4037 setValue(self.state.get('value'));
4038 return self._super();
4039 }
4040 });
4041
4042 var updateLiveRegion = function (ctx, text) {
4043 ctx.getEl().lastChild.textContent = text + (ctx.progressBar ? ' ' + ctx.progressBar.value() + '%' : '');
4044 };
4045 var Notification = Control$1.extend({
4046 Mixins: [Movable],
4047 Defaults: { classes: 'widget notification' },
4048 init: function (settings) {
4049 var self = this;
4050 self._super(settings);
4051 self.maxWidth = settings.maxWidth;
4052 if (settings.text) {
4053 self.text(settings.text);
4054 }
4055 if (settings.icon) {
4056 self.icon = settings.icon;
4057 }
4058 if (settings.color) {
4059 self.color = settings.color;
4060 }
4061 if (settings.type) {
4062 self.classes.add('notification-' + settings.type);
4063 }
4064 if (settings.timeout && (settings.timeout < 0 || settings.timeout > 0) && !settings.closeButton) {
4065 self.closeButton = false;
4066 } else {
4067 self.classes.add('has-close');
4068 self.closeButton = true;
4069 }
4070 if (settings.progressBar) {
4071 self.progressBar = new Progress();
4072 }
4073 self.on('click', function (e) {
4074 if (e.target.className.indexOf(self.classPrefix + 'close') !== -1) {
4075 self.close();
4076 }
4077 });
4078 },
4079 renderHtml: function () {
4080 var self = this;
4081 var prefix = self.classPrefix;
4082 var icon = '', closeButton = '', progressBar = '', notificationStyle = '';
4083 if (self.icon) {
4084 icon = '<i class="' + prefix + 'ico' + ' ' + prefix + 'i-' + self.icon + '"></i>';
4085 }
4086 notificationStyle = ' style="max-width: ' + self.maxWidth + 'px;' + (self.color ? 'background-color: ' + self.color + ';"' : '"');
4087 if (self.closeButton) {
4088 closeButton = '<button type="button" class="' + prefix + 'close" aria-hidden="true">\xD7</button>';
4089 }
4090 if (self.progressBar) {
4091 progressBar = self.progressBar.renderHtml();
4092 }
4093 return '<div id="' + self._id + '" class="' + self.classes + '"' + notificationStyle + ' role="presentation">' + icon + '<div class="' + prefix + 'notification-inner">' + self.state.get('text') + '</div>' + progressBar + closeButton + '<div style="clip: rect(1px, 1px, 1px, 1px);height: 1px;overflow: hidden;position: absolute;width: 1px;"' + ' aria-live="assertive" aria-relevant="additions" aria-atomic="true"></div>' + '</div>';
4094 },
4095 postRender: function () {
4096 var self = this;
4097 global$7.setTimeout(function () {
4098 self.$el.addClass(self.classPrefix + 'in');
4099 updateLiveRegion(self, self.state.get('text'));
4100 }, 100);
4101 return self._super();
4102 },
4103 bindStates: function () {
4104 var self = this;
4105 self.state.on('change:text', function (e) {
4106 self.getEl().firstChild.innerHTML = e.value;
4107 updateLiveRegion(self, e.value);
4108 });
4109 if (self.progressBar) {
4110 self.progressBar.bindStates();
4111 self.progressBar.state.on('change:value', function (e) {
4112 updateLiveRegion(self, self.state.get('text'));
4113 });
4114 }
4115 return self._super();
4116 },
4117 close: function () {
4118 var self = this;
4119 if (!self.fire('close').isDefaultPrevented()) {
4120 self.remove();
4121 }
4122 return self;
4123 },
4124 repaint: function () {
4125 var self = this;
4126 var style, rect;
4127 style = self.getEl().style;
4128 rect = self._layoutRect;
4129 style.left = rect.x + 'px';
4130 style.top = rect.y + 'px';
4131 style.zIndex = 65535 - 1;
4132 }
4133 });
4134
4135 function NotificationManagerImpl (editor) {
4136 var getEditorContainer = function (editor) {
4137 return editor.inline ? editor.getElement() : editor.getContentAreaContainer();
4138 };
4139 var getContainerWidth = function () {
4140 var container = getEditorContainer(editor);
4141 return funcs.getSize(container).width;
4142 };
4143 var prePositionNotifications = function (notifications) {
4144 each(notifications, function (notification) {
4145 notification.moveTo(0, 0);
4146 });
4147 };
4148 var positionNotifications = function (notifications) {
4149 if (notifications.length > 0) {
4150 var firstItem = notifications.slice(0, 1)[0];
4151 var container = getEditorContainer(editor);
4152 firstItem.moveRel(container, 'tc-tc');
4153 each(notifications, function (notification, index) {
4154 if (index > 0) {
4155 notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');
4156 }
4157 });
4158 }
4159 };
4160 var reposition = function (notifications) {
4161 prePositionNotifications(notifications);
4162 positionNotifications(notifications);
4163 };
4164 var open = function (args, closeCallback) {
4165 var extendedArgs = global$2.extend(args, { maxWidth: getContainerWidth() });
4166 var notif = new Notification(extendedArgs);
4167 notif.args = extendedArgs;
4168 if (extendedArgs.timeout > 0) {
4169 notif.timer = setTimeout(function () {
4170 notif.close();
4171 closeCallback();
4172 }, extendedArgs.timeout);
4173 }
4174 notif.on('close', function () {
4175 closeCallback();
4176 });
4177 notif.renderTo();
4178 return notif;
4179 };
4180 var close = function (notification) {
4181 notification.close();
4182 };
4183 var getArgs = function (notification) {
4184 return notification.args;
4185 };
4186 return {
4187 open: open,
4188 close: close,
4189 reposition: reposition,
4190 getArgs: getArgs
4191 };
4192 }
4193
4194 var windows = [];
4195 var oldMetaValue = '';
4196 function toggleFullScreenState(state) {
4197 var noScaleMetaValue = 'width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0';
4198 var viewport = global$9('meta[name=viewport]')[0], contentValue;
4199 if (global$8.overrideViewPort === false) {
4200 return;
4201 }
4202 if (!viewport) {
4203 viewport = domGlobals.document.createElement('meta');
4204 viewport.setAttribute('name', 'viewport');
4205 domGlobals.document.getElementsByTagName('head')[0].appendChild(viewport);
4206 }
4207 contentValue = viewport.getAttribute('content');
4208 if (contentValue && typeof oldMetaValue !== 'undefined') {
4209 oldMetaValue = contentValue;
4210 }
4211 viewport.setAttribute('content', state ? noScaleMetaValue : oldMetaValue);
4212 }
4213 function toggleBodyFullScreenClasses(classPrefix, state) {
4214 if (checkFullscreenWindows() && state === false) {
4215 global$9([
4216 domGlobals.document.documentElement,
4217 domGlobals.document.body
4218 ]).removeClass(classPrefix + 'fullscreen');
4219 }
4220 }
4221 function checkFullscreenWindows() {
4222 for (var i = 0; i < windows.length; i++) {
4223 if (windows[i]._fullscreen) {
4224 return true;
4225 }
4226 }
4227 return false;
4228 }
4229 function handleWindowResize() {
4230 if (!global$8.desktop) {
4231 var lastSize_1 = {
4232 w: domGlobals.window.innerWidth,
4233 h: domGlobals.window.innerHeight
4234 };
4235 global$7.setInterval(function () {
4236 var w = domGlobals.window.innerWidth, h = domGlobals.window.innerHeight;
4237 if (lastSize_1.w !== w || lastSize_1.h !== h) {
4238 lastSize_1 = {
4239 w: w,
4240 h: h
4241 };
4242 global$9(domGlobals.window).trigger('resize');
4243 }
4244 }, 100);
4245 }
4246 function reposition() {
4247 var i;
4248 var rect = funcs.getWindowSize();
4249 var layoutRect;
4250 for (i = 0; i < windows.length; i++) {
4251 layoutRect = windows[i].layoutRect();
4252 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));
4253 }
4254 }
4255 global$9(domGlobals.window).on('resize', reposition);
4256 }
4257 var Window = FloatPanel.extend({
4258 modal: true,
4259 Defaults: {
4260 border: 1,
4261 layout: 'flex',
4262 containerCls: 'panel',
4263 role: 'dialog',
4264 callbacks: {
4265 submit: function () {
4266 this.fire('submit', { data: this.toJSON() });
4267 },
4268 close: function () {
4269 this.close();
4270 }
4271 }
4272 },
4273 init: function (settings) {
4274 var self = this;
4275 self._super(settings);
4276 if (self.isRtl()) {
4277 self.classes.add('rtl');
4278 }
4279 self.classes.add('window');
4280 self.bodyClasses.add('window-body');
4281 self.state.set('fixed', true);
4282 if (settings.buttons) {
4283 self.statusbar = new Panel({
4284 layout: 'flex',
4285 border: '1 0 0 0',
4286 spacing: 3,
4287 padding: 10,
4288 align: 'center',
4289 pack: self.isRtl() ? 'start' : 'end',
4290 defaults: { type: 'button' },
4291 items: settings.buttons
4292 });
4293 self.statusbar.classes.add('foot');
4294 self.statusbar.parent(self);
4295 }
4296 self.on('click', function (e) {
4297 var closeClass = self.classPrefix + 'close';
4298 if (funcs.hasClass(e.target, closeClass) || funcs.hasClass(e.target.parentNode, closeClass)) {
4299 self.close();
4300 }
4301 });
4302 self.on('cancel', function () {
4303 self.close();
4304 });
4305 self.on('move', function (e) {
4306 if (e.control === self) {
4307 FloatPanel.hideAll();
4308 }
4309 });
4310 self.aria('describedby', self.describedBy || self._id + '-none');
4311 self.aria('label', settings.title);
4312 self._fullscreen = false;
4313 },
4314 recalc: function () {
4315 var self = this;
4316 var statusbar = self.statusbar;
4317 var layoutRect, width, x, needsRecalc;
4318 if (self._fullscreen) {
4319 self.layoutRect(funcs.getWindowSize());
4320 self.layoutRect().contentH = self.layoutRect().innerH;
4321 }
4322 self._super();
4323 layoutRect = self.layoutRect();
4324 if (self.settings.title && !self._fullscreen) {
4325 width = layoutRect.headerW;
4326 if (width > layoutRect.w) {
4327 x = layoutRect.x - Math.max(0, width / 2);
4328 self.layoutRect({
4329 w: width,
4330 x: x
4331 });
4332 needsRecalc = true;
4333 }
4334 }
4335 if (statusbar) {
4336 statusbar.layoutRect({ w: self.layoutRect().innerW }).recalc();
4337 width = statusbar.layoutRect().minW + layoutRect.deltaW;
4338 if (width > layoutRect.w) {
4339 x = layoutRect.x - Math.max(0, width - layoutRect.w);
4340 self.layoutRect({
4341 w: width,
4342 x: x
4343 });
4344 needsRecalc = true;
4345 }
4346 }
4347 if (needsRecalc) {
4348 self.recalc();
4349 }
4350 },
4351 initLayoutRect: function () {
4352 var self = this;
4353 var layoutRect = self._super();
4354 var deltaH = 0, headEl;
4355 if (self.settings.title && !self._fullscreen) {
4356 headEl = self.getEl('head');
4357 var size = funcs.getSize(headEl);
4358 layoutRect.headerW = size.width;
4359 layoutRect.headerH = size.height;
4360 deltaH += layoutRect.headerH;
4361 }
4362 if (self.statusbar) {
4363 deltaH += self.statusbar.layoutRect().h;
4364 }
4365 layoutRect.deltaH += deltaH;
4366 layoutRect.minH += deltaH;
4367 layoutRect.h += deltaH;
4368 var rect = funcs.getWindowSize();
4369 layoutRect.x = self.settings.x || Math.max(0, rect.w / 2 - layoutRect.w / 2);
4370 layoutRect.y = self.settings.y || Math.max(0, rect.h / 2 - layoutRect.h / 2);
4371 return layoutRect;
4372 },
4373 renderHtml: function () {
4374 var self = this, layout = self._layout, id = self._id, prefix = self.classPrefix;
4375 var settings = self.settings;
4376 var headerHtml = '', footerHtml = '', html = settings.html;
4377 self.preRender();
4378 layout.preRender(self);
4379 if (settings.title) {
4380 headerHtml = '<div id="' + id + '-head" class="' + prefix + 'window-head">' + '<div id="' + id + '-title" class="' + prefix + 'title">' + self.encode(settings.title) + '</div>' + '<div id="' + id + '-dragh" class="' + prefix + 'dragh"></div>' + '<button type="button" class="' + prefix + 'close" aria-hidden="true">' + '<i class="mce-ico mce-i-remove"></i>' + '</button>' + '</div>';
4381 }
4382 if (settings.url) {
4383 html = '<iframe src="' + settings.url + '" tabindex="-1"></iframe>';
4384 }
4385 if (typeof html === 'undefined') {
4386 html = layout.renderHtml(self);
4387 }
4388 if (self.statusbar) {
4389 footerHtml = self.statusbar.renderHtml();
4390 }
4391 return '<div id="' + id + '" class="' + self.classes + '" hidefocus="1">' + '<div class="' + self.classPrefix + 'reset" role="application">' + headerHtml + '<div id="' + id + '-body" class="' + self.bodyClasses + '">' + html + '</div>' + footerHtml + '</div>' + '</div>';
4392 },
4393 fullscreen: function (state) {
4394 var self = this;
4395 var documentElement = domGlobals.document.documentElement;
4396 var slowRendering;
4397 var prefix = self.classPrefix;
4398 var layoutRect;
4399 if (state !== self._fullscreen) {
4400 global$9(domGlobals.window).on('resize', function () {
4401 var time;
4402 if (self._fullscreen) {
4403 if (!slowRendering) {
4404 time = new Date().getTime();
4405 var rect = funcs.getWindowSize();
4406 self.moveTo(0, 0).resizeTo(rect.w, rect.h);
4407 if (new Date().getTime() - time > 50) {
4408 slowRendering = true;
4409 }
4410 } else {
4411 if (!self._timer) {
4412 self._timer = global$7.setTimeout(function () {
4413 var rect = funcs.getWindowSize();
4414 self.moveTo(0, 0).resizeTo(rect.w, rect.h);
4415 self._timer = 0;
4416 }, 50);
4417 }
4418 }
4419 }
4420 });
4421 layoutRect = self.layoutRect();
4422 self._fullscreen = state;
4423 if (!state) {
4424 self.borderBox = BoxUtils.parseBox(self.settings.border);
4425 self.getEl('head').style.display = '';
4426 layoutRect.deltaH += layoutRect.headerH;
4427 global$9([
4428 documentElement,
4429 domGlobals.document.body
4430 ]).removeClass(prefix + 'fullscreen');
4431 self.classes.remove('fullscreen');
4432 self.moveTo(self._initial.x, self._initial.y).resizeTo(self._initial.w, self._initial.h);
4433 } else {
4434 self._initial = {
4435 x: layoutRect.x,
4436 y: layoutRect.y,
4437 w: layoutRect.w,
4438 h: layoutRect.h
4439 };
4440 self.borderBox = BoxUtils.parseBox('0');
4441 self.getEl('head').style.display = 'none';
4442 layoutRect.deltaH -= layoutRect.headerH + 2;
4443 global$9([
4444 documentElement,
4445 domGlobals.document.body
4446 ]).addClass(prefix + 'fullscreen');
4447 self.classes.add('fullscreen');
4448 var rect = funcs.getWindowSize();
4449 self.moveTo(0, 0).resizeTo(rect.w, rect.h);
4450 }
4451 }
4452 return self.reflow();
4453 },
4454 postRender: function () {
4455 var self = this;
4456 var startPos;
4457 setTimeout(function () {
4458 self.classes.add('in');
4459 self.fire('open');
4460 }, 0);
4461 self._super();
4462 if (self.statusbar) {
4463 self.statusbar.postRender();
4464 }
4465 self.focus();
4466 this.dragHelper = new DragHelper(self._id + '-dragh', {
4467 start: function () {
4468 startPos = {
4469 x: self.layoutRect().x,
4470 y: self.layoutRect().y
4471 };
4472 },
4473 drag: function (e) {
4474 self.moveTo(startPos.x + e.deltaX, startPos.y + e.deltaY);
4475 }
4476 });
4477 self.on('submit', function (e) {
4478 if (!e.isDefaultPrevented()) {
4479 self.close();
4480 }
4481 });
4482 windows.push(self);
4483 toggleFullScreenState(true);
4484 },
4485 submit: function () {
4486 return this.fire('submit', { data: this.toJSON() });
4487 },
4488 remove: function () {
4489 var self = this;
4490 var i;
4491 self.dragHelper.destroy();
4492 self._super();
4493 if (self.statusbar) {
4494 this.statusbar.remove();
4495 }
4496 toggleBodyFullScreenClasses(self.classPrefix, false);
4497 i = windows.length;
4498 while (i--) {
4499 if (windows[i] === self) {
4500 windows.splice(i, 1);
4501 }
4502 }
4503 toggleFullScreenState(windows.length > 0);
4504 },
4505 getContentWindow: function () {
4506 var ifr = this.getEl().getElementsByTagName('iframe')[0];
4507 return ifr ? ifr.contentWindow : null;
4508 }
4509 });
4510 handleWindowResize();
4511
4512 var MessageBox = Window.extend({
4513 init: function (settings) {
4514 settings = {
4515 border: 1,
4516 padding: 20,
4517 layout: 'flex',
4518 pack: 'center',
4519 align: 'center',
4520 containerCls: 'panel',
4521 autoScroll: true,
4522 buttons: {
4523 type: 'button',
4524 text: 'Ok',
4525 action: 'ok'
4526 },
4527 items: {
4528 type: 'label',
4529 multiline: true,
4530 maxWidth: 500,
4531 maxHeight: 200
4532 }
4533 };
4534 this._super(settings);
4535 },
4536 Statics: {
4537 OK: 1,
4538 OK_CANCEL: 2,
4539 YES_NO: 3,
4540 YES_NO_CANCEL: 4,
4541 msgBox: function (settings) {
4542 var buttons;
4543 var callback = settings.callback || function () {
4544 };
4545 function createButton(text, status, primary) {
4546 return {
4547 type: 'button',
4548 text: text,
4549 subtype: primary ? 'primary' : '',
4550 onClick: function (e) {
4551 e.control.parents()[1].close();
4552 callback(status);
4553 }
4554 };
4555 }
4556 switch (settings.buttons) {
4557 case MessageBox.OK_CANCEL:
4558 buttons = [
4559 createButton('Ok', true, true),
4560 createButton('Cancel', false)
4561 ];
4562 break;
4563 case MessageBox.YES_NO:
4564 case MessageBox.YES_NO_CANCEL:
4565 buttons = [
4566 createButton('Yes', 1, true),
4567 createButton('No', 0)
4568 ];
4569 if (settings.buttons === MessageBox.YES_NO_CANCEL) {
4570 buttons.push(createButton('Cancel', -1));
4571 }
4572 break;
4573 default:
4574 buttons = [createButton('Ok', true, true)];
4575 break;
4576 }
4577 return new Window({
4578 padding: 20,
4579 x: settings.x,
4580 y: settings.y,
4581 minWidth: 300,
4582 minHeight: 100,
4583 layout: 'flex',
4584 pack: 'center',
4585 align: 'center',
4586 buttons: buttons,
4587 title: settings.title,
4588 role: 'alertdialog',
4589 items: {
4590 type: 'label',
4591 multiline: true,
4592 maxWidth: 500,
4593 maxHeight: 200,
4594 text: settings.text
4595 },
4596 onPostRender: function () {
4597 this.aria('describedby', this.items()[0]._id);
4598 },
4599 onClose: settings.onClose,
4600 onCancel: function () {
4601 callback(false);
4602 }
4603 }).renderTo(domGlobals.document.body).reflow();
4604 },
4605 alert: function (settings, callback) {
4606 if (typeof settings === 'string') {
4607 settings = { text: settings };
4608 }
4609 settings.callback = callback;
4610 return MessageBox.msgBox(settings);
4611 },
4612 confirm: function (settings, callback) {
4613 if (typeof settings === 'string') {
4614 settings = { text: settings };
4615 }
4616 settings.callback = callback;
4617 settings.buttons = MessageBox.OK_CANCEL;
4618 return MessageBox.msgBox(settings);
4619 }
4620 }
4621 });
4622
4623 function WindowManagerImpl (editor) {
4624 var open = function (args, params, closeCallback) {
4625 var win;
4626 args.title = args.title || ' ';
4627 args.url = args.url || args.file;
4628 if (args.url) {
4629 args.width = parseInt(args.width || 320, 10);
4630 args.height = parseInt(args.height || 240, 10);
4631 }
4632 if (args.body) {
4633 args.items = {
4634 defaults: args.defaults,
4635 type: args.bodyType || 'form',
4636 items: args.body,
4637 data: args.data,
4638 callbacks: args.commands
4639 };
4640 }
4641 if (!args.url && !args.buttons) {
4642 args.buttons = [
4643 {
4644 text: 'Ok',
4645 subtype: 'primary',
4646 onclick: function () {
4647 win.find('form')[0].submit();
4648 }
4649 },
4650 {
4651 text: 'Cancel',
4652 onclick: function () {
4653 win.close();
4654 }
4655 }
4656 ];
4657 }
4658 win = new Window(args);
4659 win.on('close', function () {
4660 closeCallback(win);
4661 });
4662 if (args.data) {
4663 win.on('postRender', function () {
4664 this.find('*').each(function (ctrl) {
4665 var name = ctrl.name();
4666 if (name in args.data) {
4667 ctrl.value(args.data[name]);
4668 }
4669 });
4670 });
4671 }
4672 win.features = args || {};
4673 win.params = params || {};
4674 win = win.renderTo(domGlobals.document.body).reflow();
4675 return win;
4676 };
4677 var alert = function (message, choiceCallback, closeCallback) {
4678 var win;
4679 win = MessageBox.alert(message, function () {
4680 choiceCallback();
4681 });
4682 win.on('close', function () {
4683 closeCallback(win);
4684 });
4685 return win;
4686 };
4687 var confirm = function (message, choiceCallback, closeCallback) {
4688 var win;
4689 win = MessageBox.confirm(message, function (state) {
4690 choiceCallback(state);
4691 });
4692 win.on('close', function () {
4693 closeCallback(win);
4694 });
4695 return win;
4696 };
4697 var close = function (window) {
4698 window.close();
4699 };
4700 var getParams = function (window) {
4701 return window.params;
4702 };
4703 var setParams = function (window, params) {
4704 window.params = params;
4705 };
4706 return {
4707 open: open,
4708 alert: alert,
4709 confirm: confirm,
4710 close: close,
4711 getParams: getParams,
4712 setParams: setParams
4713 };
4714 }
4715
4716 var get = function (editor) {
4717 var renderUI = function (args) {
4718 return Render.renderUI(editor, this, args);
4719 };
4720 var resizeTo = function (w, h) {
4721 return Resize.resizeTo(editor, w, h);
4722 };
4723 var resizeBy = function (dw, dh) {
4724 return Resize.resizeBy(editor, dw, dh);
4725 };
4726 var getNotificationManagerImpl = function () {
4727 return NotificationManagerImpl(editor);
4728 };
4729 var getWindowManagerImpl = function () {
4730 return WindowManagerImpl();
4731 };
4732 return {
4733 renderUI: renderUI,
4734 resizeTo: resizeTo,
4735 resizeBy: resizeBy,
4736 getNotificationManagerImpl: getNotificationManagerImpl,
4737 getWindowManagerImpl: getWindowManagerImpl
4738 };
4739 };
4740 var ThemeApi = { get: get };
4741
4742 var Layout = global$a.extend({
4743 Defaults: {
4744 firstControlClass: 'first',
4745 lastControlClass: 'last'
4746 },
4747 init: function (settings) {
4748 this.settings = global$2.extend({}, this.Defaults, settings);
4749 },
4750 preRender: function (container) {
4751 container.bodyClasses.add(this.settings.containerClass);
4752 },
4753 applyClasses: function (items) {
4754 var self = this;
4755 var settings = self.settings;
4756 var firstClass, lastClass, firstItem, lastItem;
4757 firstClass = settings.firstControlClass;
4758 lastClass = settings.lastControlClass;
4759 items.each(function (item) {
4760 item.classes.remove(firstClass).remove(lastClass).add(settings.controlClass);
4761 if (item.visible()) {
4762 if (!firstItem) {
4763 firstItem = item;
4764 }
4765 lastItem = item;
4766 }
4767 });
4768 if (firstItem) {
4769 firstItem.classes.add(firstClass);
4770 }
4771 if (lastItem) {
4772 lastItem.classes.add(lastClass);
4773 }
4774 },
4775 renderHtml: function (container) {
4776 var self = this;
4777 var html = '';
4778 self.applyClasses(container.items());
4779 container.items().each(function (item) {
4780 html += item.renderHtml();
4781 });
4782 return html;
4783 },
4784 recalc: function () {
4785 },
4786 postRender: function () {
4787 },
4788 isNative: function () {
4789 return false;
4790 }
4791 });
4792
4793 var AbsoluteLayout = Layout.extend({
4794 Defaults: {
4795 containerClass: 'abs-layout',
4796 controlClass: 'abs-layout-item'
4797 },
4798 recalc: function (container) {
4799 container.items().filter(':visible').each(function (ctrl) {
4800 var settings = ctrl.settings;
4801 ctrl.layoutRect({
4802 x: settings.x,
4803 y: settings.y,
4804 w: settings.w,
4805 h: settings.h
4806 });
4807 if (ctrl.recalc) {
4808 ctrl.recalc();
4809 }
4810 });
4811 },
4812 renderHtml: function (container) {
4813 return '<div id="' + container._id + '-absend" class="' + container.classPrefix + 'abs-end"></div>' + this._super(container);
4814 }
4815 });
4816
4817 var Button = Widget.extend({
4818 Defaults: {
4819 classes: 'widget btn',
4820 role: 'button'
4821 },
4822 init: function (settings) {
4823 var self = this;
4824 var size;
4825 self._super(settings);
4826 settings = self.settings;
4827 size = self.settings.size;
4828 self.on('click mousedown', function (e) {
4829 e.preventDefault();
4830 });
4831 self.on('touchstart', function (e) {
4832 self.fire('click', e);
4833 e.preventDefault();
4834 });
4835 if (settings.subtype) {
4836 self.classes.add(settings.subtype);
4837 }
4838 if (size) {
4839 self.classes.add('btn-' + size);
4840 }
4841 if (settings.icon) {
4842 self.icon(settings.icon);
4843 }
4844 },
4845 icon: function (icon) {
4846 if (!arguments.length) {
4847 return this.state.get('icon');
4848 }
4849 this.state.set('icon', icon);
4850 return this;
4851 },
4852 repaint: function () {
4853 var btnElm = this.getEl().firstChild;
4854 var btnStyle;
4855 if (btnElm) {
4856 btnStyle = btnElm.style;
4857 btnStyle.width = btnStyle.height = '100%';
4858 }
4859 this._super();
4860 },
4861 renderHtml: function () {
4862 var self = this, id = self._id, prefix = self.classPrefix;
4863 var icon = self.state.get('icon'), image;
4864 var text = self.state.get('text');
4865 var textHtml = '';
4866 var ariaPressed;
4867 var settings = self.settings;
4868 image = settings.image;
4869 if (image) {
4870 icon = 'none';
4871 if (typeof image !== 'string') {
4872 image = domGlobals.window.getSelection ? image[0] : image[1];
4873 }
4874 image = ' style="background-image: url(\'' + image + '\')"';
4875 } else {
4876 image = '';
4877 }
4878 if (text) {
4879 self.classes.add('btn-has-text');
4880 textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
4881 }
4882 icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
4883 ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
4884 return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1"' + ariaPressed + '>' + '<button id="' + id + '-button" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '</div>';
4885 },
4886 bindStates: function () {
4887 var self = this, $ = self.$, textCls = self.classPrefix + 'txt';
4888 function setButtonText(text) {
4889 var $span = $('span.' + textCls, self.getEl());
4890 if (text) {
4891 if (!$span[0]) {
4892 $('button:first', self.getEl()).append('<span class="' + textCls + '"></span>');
4893 $span = $('span.' + textCls, self.getEl());
4894 }
4895 $span.html(self.encode(text));
4896 } else {
4897 $span.remove();
4898 }
4899 self.classes.toggle('btn-has-text', !!text);
4900 }
4901 self.state.on('change:text', function (e) {
4902 setButtonText(e.value);
4903 });
4904 self.state.on('change:icon', function (e) {
4905 var icon = e.value;
4906 var prefix = self.classPrefix;
4907 self.settings.icon = icon;
4908 icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
4909 var btnElm = self.getEl().firstChild;
4910 var iconElm = btnElm.getElementsByTagName('i')[0];
4911 if (icon) {
4912 if (!iconElm || iconElm !== btnElm.firstChild) {
4913 iconElm = domGlobals.document.createElement('i');
4914 btnElm.insertBefore(iconElm, btnElm.firstChild);
4915 }
4916 iconElm.className = icon;
4917 } else if (iconElm) {
4918 btnElm.removeChild(iconElm);
4919 }
4920 setButtonText(self.state.get('text'));
4921 });
4922 return self._super();
4923 }
4924 });
4925
4926 var BrowseButton = Button.extend({
4927 init: function (settings) {
4928 var self = this;
4929 settings = global$2.extend({
4930 text: 'Browse...',
4931 multiple: false,
4932 accept: null
4933 }, settings);
4934 self._super(settings);
4935 self.classes.add('browsebutton');
4936 if (settings.multiple) {
4937 self.classes.add('multiple');
4938 }
4939 },
4940 postRender: function () {
4941 var self = this;
4942 var input = funcs.create('input', {
4943 type: 'file',
4944 id: self._id + '-browse',
4945 accept: self.settings.accept
4946 });
4947 self._super();
4948 global$9(input).on('change', function (e) {
4949 var files = e.target.files;
4950 self.value = function () {
4951 if (!files.length) {
4952 return null;
4953 } else if (self.settings.multiple) {
4954 return files;
4955 } else {
4956 return files[0];
4957 }
4958 };
4959 e.preventDefault();
4960 if (files.length) {
4961 self.fire('change', e);
4962 }
4963 });
4964 global$9(input).on('click', function (e) {
4965 e.stopPropagation();
4966 });
4967 global$9(self.getEl('button')).on('click touchstart', function (e) {
4968 e.stopPropagation();
4969 input.click();
4970 e.preventDefault();
4971 });
4972 self.getEl().appendChild(input);
4973 },
4974 remove: function () {
4975 global$9(this.getEl('button')).off();
4976 global$9(this.getEl('input')).off();
4977 this._super();
4978 }
4979 });
4980
4981 var ButtonGroup = Container.extend({
4982 Defaults: {
4983 defaultType: 'button',
4984 role: 'group'
4985 },
4986 renderHtml: function () {
4987 var self = this, layout = self._layout;
4988 self.classes.add('btn-group');
4989 self.preRender();
4990 layout.preRender(self);
4991 return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
4992 }
4993 });
4994
4995 var Checkbox = Widget.extend({
4996 Defaults: {
4997 classes: 'checkbox',
4998 role: 'checkbox',
4999 checked: false
5000 },
5001 init: function (settings) {
5002 var self = this;
5003 self._super(settings);
5004 self.on('click mousedown', function (e) {
5005 e.preventDefault();
5006 });
5007 self.on('click', function (e) {
5008 e.preventDefault();
5009 if (!self.disabled()) {
5010 self.checked(!self.checked());
5011 }
5012 });
5013 self.checked(self.settings.checked);
5014 },
5015 checked: function (state) {
5016 if (!arguments.length) {
5017 return this.state.get('checked');
5018 }
5019 this.state.set('checked', state);
5020 return this;
5021 },
5022 value: function (state) {
5023 if (!arguments.length) {
5024 return this.checked();
5025 }
5026 return this.checked(state);
5027 },
5028 renderHtml: function () {
5029 var self = this, id = self._id, prefix = self.classPrefix;
5030 return '<div id="' + id + '" class="' + self.classes + '" unselectable="on" aria-labelledby="' + id + '-al" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-checkbox"></i>' + '<span id="' + id + '-al" class="' + prefix + 'label">' + self.encode(self.state.get('text')) + '</span>' + '</div>';
5031 },
5032 bindStates: function () {
5033 var self = this;
5034 function checked(state) {
5035 self.classes.toggle('checked', state);
5036 self.aria('checked', state);
5037 }
5038 self.state.on('change:text', function (e) {
5039 self.getEl('al').firstChild.data = self.translate(e.value);
5040 });
5041 self.state.on('change:checked change:value', function (e) {
5042 self.fire('change');
5043 checked(e.value);
5044 });
5045 self.state.on('change:icon', function (e) {
5046 var icon = e.value;
5047 var prefix = self.classPrefix;
5048 if (typeof icon === 'undefined') {
5049 return self.settings.icon;
5050 }
5051 self.settings.icon = icon;
5052 icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
5053 var btnElm = self.getEl().firstChild;
5054 var iconElm = btnElm.getElementsByTagName('i')[0];
5055 if (icon) {
5056 if (!iconElm || iconElm !== btnElm.firstChild) {
5057 iconElm = domGlobals.document.createElement('i');
5058 btnElm.insertBefore(iconElm, btnElm.firstChild);
5059 }
5060 iconElm.className = icon;
5061 } else if (iconElm) {
5062 btnElm.removeChild(iconElm);
5063 }
5064 });
5065 if (self.state.get('checked')) {
5066 checked(true);
5067 }
5068 return self._super();
5069 }
5070 });
5071
5072 var global$d = tinymce.util.Tools.resolve('tinymce.util.VK');
5073
5074 var ComboBox = Widget.extend({
5075 init: function (settings) {
5076 var self = this;
5077 self._super(settings);
5078 settings = self.settings;
5079 self.classes.add('combobox');
5080 self.subinput = true;
5081 self.ariaTarget = 'inp';
5082 settings.menu = settings.menu || settings.values;
5083 if (settings.menu) {
5084 settings.icon = 'caret';
5085 }
5086 self.on('click', function (e) {
5087 var elm = e.target;
5088 var root = self.getEl();
5089 if (!global$9.contains(root, elm) && elm !== root) {
5090 return;
5091 }
5092 while (elm && elm !== root) {
5093 if (elm.id && elm.id.indexOf('-open') !== -1) {
5094 self.fire('action');
5095 if (settings.menu) {
5096 self.showMenu();
5097 if (e.aria) {
5098 self.menu.items()[0].focus();
5099 }
5100 }
5101 }
5102 elm = elm.parentNode;
5103 }
5104 });
5105 self.on('keydown', function (e) {
5106 var rootControl;
5107 if (e.keyCode === 13 && e.target.nodeName === 'INPUT') {
5108 e.preventDefault();
5109 self.parents().reverse().each(function (ctrl) {
5110 if (ctrl.toJSON) {
5111 rootControl = ctrl;
5112 return false;
5113 }
5114 });
5115 self.fire('submit', { data: rootControl.toJSON() });
5116 }
5117 });
5118 self.on('keyup', function (e) {
5119 if (e.target.nodeName === 'INPUT') {
5120 var oldValue = self.state.get('value');
5121 var newValue = e.target.value;
5122 if (newValue !== oldValue) {
5123 self.state.set('value', newValue);
5124 self.fire('autocomplete', e);
5125 }
5126 }
5127 });
5128 self.on('mouseover', function (e) {
5129 var tooltip = self.tooltip().moveTo(-65535);
5130 if (self.statusLevel() && e.target.className.indexOf(self.classPrefix + 'status') !== -1) {
5131 var statusMessage = self.statusMessage() || 'Ok';
5132 var rel = tooltip.text(statusMessage).show().testMoveRel(e.target, [
5133 'bc-tc',
5134 'bc-tl',
5135 'bc-tr'
5136 ]);
5137 tooltip.classes.toggle('tooltip-n', rel === 'bc-tc');
5138 tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl');
5139 tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr');
5140 tooltip.moveRel(e.target, rel);
5141 }
5142 });
5143 },
5144 statusLevel: function (value) {
5145 if (arguments.length > 0) {
5146 this.state.set('statusLevel', value);
5147 }
5148 return this.state.get('statusLevel');
5149 },
5150 statusMessage: function (value) {
5151 if (arguments.length > 0) {
5152 this.state.set('statusMessage', value);
5153 }
5154 return this.state.get('statusMessage');
5155 },
5156 showMenu: function () {
5157 var self = this;
5158 var settings = self.settings;
5159 var menu;
5160 if (!self.menu) {
5161 menu = settings.menu || [];
5162 if (menu.length) {
5163 menu = {
5164 type: 'menu',
5165 items: menu
5166 };
5167 } else {
5168 menu.type = menu.type || 'menu';
5169 }
5170 self.menu = global$4.create(menu).parent(self).renderTo(self.getContainerElm());
5171 self.fire('createmenu');
5172 self.menu.reflow();
5173 self.menu.on('cancel', function (e) {
5174 if (e.control === self.menu) {
5175 self.focus();
5176 }
5177 });
5178 self.menu.on('show hide', function (e) {
5179 e.control.items().each(function (ctrl) {
5180 ctrl.active(ctrl.value() === self.value());
5181 });
5182 }).fire('show');
5183 self.menu.on('select', function (e) {
5184 self.value(e.control.value());
5185 });
5186 self.on('focusin', function (e) {
5187 if (e.target.tagName.toUpperCase() === 'INPUT') {
5188 self.menu.hide();
5189 }
5190 });
5191 self.aria('expanded', true);
5192 }
5193 self.menu.show();
5194 self.menu.layoutRect({ w: self.layoutRect().w });
5195 self.menu.moveRel(self.getEl(), self.isRtl() ? [
5196 'br-tr',
5197 'tr-br'
5198 ] : [
5199 'bl-tl',
5200 'tl-bl'
5201 ]);
5202 },
5203 focus: function () {
5204 this.getEl('inp').focus();
5205 },
5206 repaint: function () {
5207 var self = this, elm = self.getEl(), openElm = self.getEl('open'), rect = self.layoutRect();
5208 var width, lineHeight, innerPadding = 0;
5209 var inputElm = elm.firstChild;
5210 if (self.statusLevel() && self.statusLevel() !== 'none') {
5211 innerPadding = parseInt(funcs.getRuntimeStyle(inputElm, 'padding-right'), 10) - parseInt(funcs.getRuntimeStyle(inputElm, 'padding-left'), 10);
5212 }
5213 if (openElm) {
5214 width = rect.w - funcs.getSize(openElm).width - 10;
5215 } else {
5216 width = rect.w - 10;
5217 }
5218 var doc = domGlobals.document;
5219 if (doc.all && (!doc.documentMode || doc.documentMode <= 8)) {
5220 lineHeight = self.layoutRect().h - 2 + 'px';
5221 }
5222 global$9(inputElm).css({
5223 width: width - innerPadding,
5224 lineHeight: lineHeight
5225 });
5226 self._super();
5227 return self;
5228 },
5229 postRender: function () {
5230 var self = this;
5231 global$9(this.getEl('inp')).on('change', function (e) {
5232 self.state.set('value', e.target.value);
5233 self.fire('change', e);
5234 });
5235 return self._super();
5236 },
5237 renderHtml: function () {
5238 var self = this, id = self._id, settings = self.settings, prefix = self.classPrefix;
5239 var value = self.state.get('value') || '';
5240 var icon, text, openBtnHtml = '', extraAttrs = '', statusHtml = '';
5241 if ('spellcheck' in settings) {
5242 extraAttrs += ' spellcheck="' + settings.spellcheck + '"';
5243 }
5244 if (settings.maxLength) {
5245 extraAttrs += ' maxlength="' + settings.maxLength + '"';
5246 }
5247 if (settings.size) {
5248 extraAttrs += ' size="' + settings.size + '"';
5249 }
5250 if (settings.subtype) {
5251 extraAttrs += ' type="' + settings.subtype + '"';
5252 }
5253 statusHtml = '<i id="' + id + '-status" class="mce-status mce-ico" style="display: none"></i>';
5254 if (self.disabled()) {
5255 extraAttrs += ' disabled="disabled"';
5256 }
5257 icon = settings.icon;
5258 if (icon && icon !== 'caret') {
5259 icon = prefix + 'ico ' + prefix + 'i-' + settings.icon;
5260 }
5261 text = self.state.get('text');
5262 if (icon || text) {
5263 openBtnHtml = '<div id="' + id + '-open" class="' + prefix + 'btn ' + prefix + 'open" tabIndex="-1" role="button">' + '<button id="' + id + '-action" type="button" hidefocus="1" tabindex="-1">' + (icon !== 'caret' ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>') + (text ? (icon ? ' ' : '') + text : '') + '</button>' + '</div>';
5264 self.classes.add('has-open');
5265 }
5266 return '<div id="' + id + '" class="' + self.classes + '">' + '<input id="' + id + '-inp" class="' + prefix + 'textbox" value="' + self.encode(value, false) + '" hidefocus="1"' + extraAttrs + ' placeholder="' + self.encode(settings.placeholder) + '" />' + statusHtml + openBtnHtml + '</div>';
5267 },
5268 value: function (value) {
5269 if (arguments.length) {
5270 this.state.set('value', value);
5271 return this;
5272 }
5273 if (this.state.get('rendered')) {
5274 this.state.set('value', this.getEl('inp').value);
5275 }
5276 return this.state.get('value');
5277 },
5278 showAutoComplete: function (items, term) {
5279 var self = this;
5280 if (items.length === 0) {
5281 self.hideMenu();
5282 return;
5283 }
5284 var insert = function (value, title) {
5285 return function () {
5286 self.fire('selectitem', {
5287 title: title,
5288 value: value
5289 });
5290 };
5291 };
5292 if (self.menu) {
5293 self.menu.items().remove();
5294 } else {
5295 self.menu = global$4.create({
5296 type: 'menu',
5297 classes: 'combobox-menu',
5298 layout: 'flow'
5299 }).parent(self).renderTo();
5300 }
5301 global$2.each(items, function (item) {
5302 self.menu.add({
5303 text: item.title,
5304 url: item.previewUrl,
5305 match: term,
5306 classes: 'menu-item-ellipsis',
5307 onclick: insert(item.value, item.title)
5308 });
5309 });
5310 self.menu.renderNew();
5311 self.hideMenu();
5312 self.menu.on('cancel', function (e) {
5313 if (e.control.parent() === self.menu) {
5314 e.stopPropagation();
5315 self.focus();
5316 self.hideMenu();
5317 }
5318 });
5319 self.menu.on('select', function () {
5320 self.focus();
5321 });
5322 var maxW = self.layoutRect().w;
5323 self.menu.layoutRect({
5324 w: maxW,
5325 minW: 0,
5326 maxW: maxW
5327 });
5328 self.menu.repaint();
5329 self.menu.reflow();
5330 self.menu.show();
5331 self.menu.moveRel(self.getEl(), self.isRtl() ? [
5332 'br-tr',
5333 'tr-br'
5334 ] : [
5335 'bl-tl',
5336 'tl-bl'
5337 ]);
5338 },
5339 hideMenu: function () {
5340 if (this.menu) {
5341 this.menu.hide();
5342 }
5343 },
5344 bindStates: function () {
5345 var self = this;
5346 self.state.on('change:value', function (e) {
5347 if (self.getEl('inp').value !== e.value) {
5348 self.getEl('inp').value = e.value;
5349 }
5350 });
5351 self.state.on('change:disabled', function (e) {
5352 self.getEl('inp').disabled = e.value;
5353 });
5354 self.state.on('change:statusLevel', function (e) {
5355 var statusIconElm = self.getEl('status');
5356 var prefix = self.classPrefix, value = e.value;
5357 funcs.css(statusIconElm, 'display', value === 'none' ? 'none' : '');
5358 funcs.toggleClass(statusIconElm, prefix + 'i-checkmark', value === 'ok');
5359 funcs.toggleClass(statusIconElm, prefix + 'i-warning', value === 'warn');
5360 funcs.toggleClass(statusIconElm, prefix + 'i-error', value === 'error');
5361 self.classes.toggle('has-status', value !== 'none');
5362 self.repaint();
5363 });
5364 funcs.on(self.getEl('status'), 'mouseleave', function () {
5365 self.tooltip().hide();
5366 });
5367 self.on('cancel', function (e) {
5368 if (self.menu && self.menu.visible()) {
5369 e.stopPropagation();
5370 self.hideMenu();
5371 }
5372 });
5373 var focusIdx = function (idx, menu) {
5374 if (menu && menu.items().length > 0) {
5375 menu.items().eq(idx)[0].focus();
5376 }
5377 };
5378 self.on('keydown', function (e) {
5379 var keyCode = e.keyCode;
5380 if (e.target.nodeName === 'INPUT') {
5381 if (keyCode === global$d.DOWN) {
5382 e.preventDefault();
5383 self.fire('autocomplete');
5384 focusIdx(0, self.menu);
5385 } else if (keyCode === global$d.UP) {
5386 e.preventDefault();
5387 focusIdx(-1, self.menu);
5388 }
5389 }
5390 });
5391 return self._super();
5392 },
5393 remove: function () {
5394 global$9(this.getEl('inp')).off();
5395 if (this.menu) {
5396 this.menu.remove();
5397 }
5398 this._super();
5399 }
5400 });
5401
5402 var ColorBox = ComboBox.extend({
5403 init: function (settings) {
5404 var self = this;
5405 settings.spellcheck = false;
5406 if (settings.onaction) {
5407 settings.icon = 'none';
5408 }
5409 self._super(settings);
5410 self.classes.add('colorbox');
5411 self.on('change keyup postrender', function () {
5412 self.repaintColor(self.value());
5413 });
5414 },
5415 repaintColor: function (value) {
5416 var openElm = this.getEl('open');
5417 var elm = openElm ? openElm.getElementsByTagName('i')[0] : null;
5418 if (elm) {
5419 try {
5420 elm.style.background = value;
5421 } catch (ex) {
5422 }
5423 }
5424 },
5425 bindStates: function () {
5426 var self = this;
5427 self.state.on('change:value', function (e) {
5428 if (self.state.get('rendered')) {
5429 self.repaintColor(e.value);
5430 }
5431 });
5432 return self._super();
5433 }
5434 });
5435
5436 var PanelButton = Button.extend({
5437 showPanel: function () {
5438 var self = this, settings = self.settings;
5439 self.classes.add('opened');
5440 if (!self.panel) {
5441 var panelSettings = settings.panel;
5442 if (panelSettings.type) {
5443 panelSettings = {
5444 layout: 'grid',
5445 items: panelSettings
5446 };
5447 }
5448 panelSettings.role = panelSettings.role || 'dialog';
5449 panelSettings.popover = true;
5450 panelSettings.autohide = true;
5451 panelSettings.ariaRoot = true;
5452 self.panel = new FloatPanel(panelSettings).on('hide', function () {
5453 self.classes.remove('opened');
5454 }).on('cancel', function (e) {
5455 e.stopPropagation();
5456 self.focus();
5457 self.hidePanel();
5458 }).parent(self).renderTo(self.getContainerElm());
5459 self.panel.fire('show');
5460 self.panel.reflow();
5461 } else {
5462 self.panel.show();
5463 }
5464 var rtlRels = [
5465 'bc-tc',
5466 'bc-tl',
5467 'bc-tr'
5468 ];
5469 var ltrRels = [
5470 'bc-tc',
5471 'bc-tr',
5472 'bc-tl',
5473 'tc-bc',
5474 'tc-br',
5475 'tc-bl'
5476 ];
5477 var rel = self.panel.testMoveRel(self.getEl(), settings.popoverAlign || (self.isRtl() ? rtlRels : ltrRels));
5478 self.panel.classes.toggle('start', rel.substr(-1) === 'l');
5479 self.panel.classes.toggle('end', rel.substr(-1) === 'r');
5480 var isTop = rel.substr(0, 1) === 't';
5481 self.panel.classes.toggle('bottom', !isTop);
5482 self.panel.classes.toggle('top', isTop);
5483 self.panel.moveRel(self.getEl(), rel);
5484 },
5485 hidePanel: function () {
5486 var self = this;
5487 if (self.panel) {
5488 self.panel.hide();
5489 }
5490 },
5491 postRender: function () {
5492 var self = this;
5493 self.aria('haspopup', true);
5494 self.on('click', function (e) {
5495 if (e.control === self) {
5496 if (self.panel && self.panel.visible()) {
5497 self.hidePanel();
5498 } else {
5499 self.showPanel();
5500 self.panel.focus(!!e.aria);
5501 }
5502 }
5503 });
5504 return self._super();
5505 },
5506 remove: function () {
5507 if (this.panel) {
5508 this.panel.remove();
5509 this.panel = null;
5510 }
5511 return this._super();
5512 }
5513 });
5514
5515 var DOM$3 = global$3.DOM;
5516 var ColorButton = PanelButton.extend({
5517 init: function (settings) {
5518 this._super(settings);
5519 this.classes.add('splitbtn');
5520 this.classes.add('colorbutton');
5521 },
5522 color: function (color) {
5523 if (color) {
5524 this._color = color;
5525 this.getEl('preview').style.backgroundColor = color;
5526 return this;
5527 }
5528 return this._color;
5529 },
5530 resetColor: function () {
5531 this._color = null;
5532 this.getEl('preview').style.backgroundColor = null;
5533 return this;
5534 },
5535 renderHtml: function () {
5536 var self = this, id = self._id, prefix = self.classPrefix, text = self.state.get('text');
5537 var icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
5538 var image = self.settings.image ? ' style="background-image: url(\'' + self.settings.image + '\')"' : '';
5539 var textHtml = '';
5540 if (text) {
5541 self.classes.add('btn-has-text');
5542 textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
5543 }
5544 return '<div id="' + id + '" class="' + self.classes + '" role="button" tabindex="-1" aria-haspopup="true">' + '<button role="presentation" hidefocus="1" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + '<span id="' + id + '-preview" class="' + prefix + 'preview"></span>' + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
5545 },
5546 postRender: function () {
5547 var self = this, onClickHandler = self.settings.onclick;
5548 self.on('click', function (e) {
5549 if (e.aria && e.aria.key === 'down') {
5550 return;
5551 }
5552 if (e.control === self && !DOM$3.getParent(e.target, '.' + self.classPrefix + 'open')) {
5553 e.stopImmediatePropagation();
5554 onClickHandler.call(self, e);
5555 }
5556 });
5557 delete self.settings.onclick;
5558 return self._super();
5559 }
5560 });
5561
5562 var global$e = tinymce.util.Tools.resolve('tinymce.util.Color');
5563
5564 var ColorPicker = Widget.extend({
5565 Defaults: { classes: 'widget colorpicker' },
5566 init: function (settings) {
5567 this._super(settings);
5568 },
5569 postRender: function () {
5570 var self = this;
5571 var color = self.color();
5572 var hsv, hueRootElm, huePointElm, svRootElm, svPointElm;
5573 hueRootElm = self.getEl('h');
5574 huePointElm = self.getEl('hp');
5575 svRootElm = self.getEl('sv');
5576 svPointElm = self.getEl('svp');
5577 function getPos(elm, event) {
5578 var pos = funcs.getPos(elm);
5579 var x, y;
5580 x = event.pageX - pos.x;
5581 y = event.pageY - pos.y;
5582 x = Math.max(0, Math.min(x / elm.clientWidth, 1));
5583 y = Math.max(0, Math.min(y / elm.clientHeight, 1));
5584 return {
5585 x: x,
5586 y: y
5587 };
5588 }
5589 function updateColor(hsv, hueUpdate) {
5590 var hue = (360 - hsv.h) / 360;
5591 funcs.css(huePointElm, { top: hue * 100 + '%' });
5592 if (!hueUpdate) {
5593 funcs.css(svPointElm, {
5594 left: hsv.s + '%',
5595 top: 100 - hsv.v + '%'
5596 });
5597 }
5598 svRootElm.style.background = global$e({
5599 s: 100,
5600 v: 100,
5601 h: hsv.h
5602 }).toHex();
5603 self.color().parse({
5604 s: hsv.s,
5605 v: hsv.v,
5606 h: hsv.h
5607 });
5608 }
5609 function updateSaturationAndValue(e) {
5610 var pos;
5611 pos = getPos(svRootElm, e);
5612 hsv.s = pos.x * 100;
5613 hsv.v = (1 - pos.y) * 100;
5614 updateColor(hsv);
5615 self.fire('change');
5616 }
5617 function updateHue(e) {
5618 var pos;
5619 pos = getPos(hueRootElm, e);
5620 hsv = color.toHsv();
5621 hsv.h = (1 - pos.y) * 360;
5622 updateColor(hsv, true);
5623 self.fire('change');
5624 }
5625 self._repaint = function () {
5626 hsv = color.toHsv();
5627 updateColor(hsv);
5628 };
5629 self._super();
5630 self._svdraghelper = new DragHelper(self._id + '-sv', {
5631 start: updateSaturationAndValue,
5632 drag: updateSaturationAndValue
5633 });
5634 self._hdraghelper = new DragHelper(self._id + '-h', {
5635 start: updateHue,
5636 drag: updateHue
5637 });
5638 self._repaint();
5639 },
5640 rgb: function () {
5641 return this.color().toRgb();
5642 },
5643 value: function (value) {
5644 var self = this;
5645 if (arguments.length) {
5646 self.color().parse(value);
5647 if (self._rendered) {
5648 self._repaint();
5649 }
5650 } else {
5651 return self.color().toHex();
5652 }
5653 },
5654 color: function () {
5655 if (!this._color) {
5656 this._color = global$e();
5657 }
5658 return this._color;
5659 },
5660 renderHtml: function () {
5661 var self = this;
5662 var id = self._id;
5663 var prefix = self.classPrefix;
5664 var hueHtml;
5665 var stops = '#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000';
5666 function getOldIeFallbackHtml() {
5667 var i, l, html = '', gradientPrefix, stopsList;
5668 gradientPrefix = 'filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=';
5669 stopsList = stops.split(',');
5670 for (i = 0, l = stopsList.length - 1; i < l; i++) {
5671 html += '<div class="' + prefix + 'colorpicker-h-chunk" style="' + 'height:' + 100 / l + '%;' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ');' + '-ms-' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ')' + '"></div>';
5672 }
5673 return html;
5674 }
5675 var gradientCssText = 'background: -ms-linear-gradient(top,' + stops + ');' + 'background: linear-gradient(to bottom,' + stops + ');';
5676 hueHtml = '<div id="' + id + '-h" class="' + prefix + 'colorpicker-h" style="' + gradientCssText + '">' + getOldIeFallbackHtml() + '<div id="' + id + '-hp" class="' + prefix + 'colorpicker-h-marker"></div>' + '</div>';
5677 return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-sv" class="' + prefix + 'colorpicker-sv">' + '<div class="' + prefix + 'colorpicker-overlay1">' + '<div class="' + prefix + 'colorpicker-overlay2">' + '<div id="' + id + '-svp" class="' + prefix + 'colorpicker-selector1">' + '<div class="' + prefix + 'colorpicker-selector2"></div>' + '</div>' + '</div>' + '</div>' + '</div>' + hueHtml + '</div>';
5678 }
5679 });
5680
5681 var DropZone = Widget.extend({
5682 init: function (settings) {
5683 var self = this;
5684 settings = global$2.extend({
5685 height: 100,
5686 text: 'Drop an image here',
5687 multiple: false,
5688 accept: null
5689 }, settings);
5690 self._super(settings);
5691 self.classes.add('dropzone');
5692 if (settings.multiple) {
5693 self.classes.add('multiple');
5694 }
5695 },
5696 renderHtml: function () {
5697 var self = this;
5698 var attrs, elm;
5699 var cfg = self.settings;
5700 attrs = {
5701 id: self._id,
5702 hidefocus: '1'
5703 };
5704 elm = funcs.create('div', attrs, '<span>' + this.translate(cfg.text) + '</span>');
5705 if (cfg.height) {
5706 funcs.css(elm, 'height', cfg.height + 'px');
5707 }
5708 if (cfg.width) {
5709 funcs.css(elm, 'width', cfg.width + 'px');
5710 }
5711 elm.className = self.classes;
5712 return elm.outerHTML;
5713 },
5714 postRender: function () {
5715 var self = this;
5716 var toggleDragClass = function (e) {
5717 e.preventDefault();
5718 self.classes.toggle('dragenter');
5719 self.getEl().className = self.classes;
5720 };
5721 var filter = function (files) {
5722 var accept = self.settings.accept;
5723 if (typeof accept !== 'string') {
5724 return files;
5725 }
5726 var re = new RegExp('(' + accept.split(/\s*,\s*/).join('|') + ')$', 'i');
5727 return global$2.grep(files, function (file) {
5728 return re.test(file.name);
5729 });
5730 };
5731 self._super();
5732 self.$el.on('dragover', function (e) {
5733 e.preventDefault();
5734 });
5735 self.$el.on('dragenter', toggleDragClass);
5736 self.$el.on('dragleave', toggleDragClass);
5737 self.$el.on('drop', function (e) {
5738 e.preventDefault();
5739 if (self.state.get('disabled')) {
5740 return;
5741 }
5742 var files = filter(e.dataTransfer.files);
5743 self.value = function () {
5744 if (!files.length) {
5745 return null;
5746 } else if (self.settings.multiple) {
5747 return files;
5748 } else {
5749 return files[0];
5750 }
5751 };
5752 if (files.length) {
5753 self.fire('change', e);
5754 }
5755 });
5756 },
5757 remove: function () {
5758 this.$el.off();
5759 this._super();
5760 }
5761 });
5762
5763 var Path = Widget.extend({
5764 init: function (settings) {
5765 var self = this;
5766 if (!settings.delimiter) {
5767 settings.delimiter = '\xBB';
5768 }
5769 self._super(settings);
5770 self.classes.add('path');
5771 self.canFocus = true;
5772 self.on('click', function (e) {
5773 var index;
5774 var target = e.target;
5775 if (index = target.getAttribute('data-index')) {
5776 self.fire('select', {
5777 value: self.row()[index],
5778 index: index
5779 });
5780 }
5781 });
5782 self.row(self.settings.row);
5783 },
5784 focus: function () {
5785 var self = this;
5786 self.getEl().firstChild.focus();
5787 return self;
5788 },
5789 row: function (row) {
5790 if (!arguments.length) {
5791 return this.state.get('row');
5792 }
5793 this.state.set('row', row);
5794 return this;
5795 },
5796 renderHtml: function () {
5797 var self = this;
5798 return '<div id="' + self._id + '" class="' + self.classes + '">' + self._getDataPathHtml(self.state.get('row')) + '</div>';
5799 },
5800 bindStates: function () {
5801 var self = this;
5802 self.state.on('change:row', function (e) {
5803 self.innerHtml(self._getDataPathHtml(e.value));
5804 });
5805 return self._super();
5806 },
5807 _getDataPathHtml: function (data) {
5808 var self = this;
5809 var parts = data || [];
5810 var i, l, html = '';
5811 var prefix = self.classPrefix;
5812 for (i = 0, l = parts.length; i < l; i++) {
5813 html += (i > 0 ? '<div class="' + prefix + 'divider" aria-hidden="true"> ' + self.settings.delimiter + ' </div>' : '') + '<div role="button" class="' + prefix + 'path-item' + (i === l - 1 ? ' ' + prefix + 'last' : '') + '" data-index="' + i + '" tabindex="-1" id="' + self._id + '-' + i + '" aria-level="' + (i + 1) + '">' + parts[i].name + '</div>';
5814 }
5815 if (!html) {
5816 html = '<div class="' + prefix + 'path-item">\xA0</div>';
5817 }
5818 return html;
5819 }
5820 });
5821
5822 var ElementPath = Path.extend({
5823 postRender: function () {
5824 var self = this, editor = self.settings.editor;
5825 function isHidden(elm) {
5826 if (elm.nodeType === 1) {
5827 if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) {
5828 return true;
5829 }
5830 if (elm.getAttribute('data-mce-type') === 'bookmark') {
5831 return true;
5832 }
5833 }
5834 return false;
5835 }
5836 if (editor.settings.elementpath !== false) {
5837 self.on('select', function (e) {
5838 editor.focus();
5839 editor.selection.select(this.row()[e.index].element);
5840 editor.nodeChanged();
5841 });
5842 editor.on('nodeChange', function (e) {
5843 var outParents = [];
5844 var parents = e.parents;
5845 var i = parents.length;
5846 while (i--) {
5847 if (parents[i].nodeType === 1 && !isHidden(parents[i])) {
5848 var args = editor.fire('ResolveName', {
5849 name: parents[i].nodeName.toLowerCase(),
5850 target: parents[i]
5851 });
5852 if (!args.isDefaultPrevented()) {
5853 outParents.push({
5854 name: args.name,
5855 element: parents[i]
5856 });
5857 }
5858 if (args.isPropagationStopped()) {
5859 break;
5860 }
5861 }
5862 }
5863 self.row(outParents);
5864 });
5865 }
5866 return self._super();
5867 }
5868 });
5869
5870 var FormItem = Container.extend({
5871 Defaults: {
5872 layout: 'flex',
5873 align: 'center',
5874 defaults: { flex: 1 }
5875 },
5876 renderHtml: function () {
5877 var self = this, layout = self._layout, prefix = self.classPrefix;
5878 self.classes.add('formitem');
5879 layout.preRender(self);
5880 return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<div id="' + self._id + '-title" class="' + prefix + 'title">' + self.settings.title + '</div>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
5881 }
5882 });
5883
5884 var Form = Container.extend({
5885 Defaults: {
5886 containerCls: 'form',
5887 layout: 'flex',
5888 direction: 'column',
5889 align: 'stretch',
5890 flex: 1,
5891 padding: 15,
5892 labelGap: 30,
5893 spacing: 10,
5894 callbacks: {
5895 submit: function () {
5896 this.submit();
5897 }
5898 }
5899 },
5900 preRender: function () {
5901 var self = this, items = self.items();
5902 if (!self.settings.formItemDefaults) {
5903 self.settings.formItemDefaults = {
5904 layout: 'flex',
5905 autoResize: 'overflow',
5906 defaults: { flex: 1 }
5907 };
5908 }
5909 items.each(function (ctrl) {
5910 var formItem;
5911 var label = ctrl.settings.label;
5912 if (label) {
5913 formItem = new FormItem(global$2.extend({
5914 items: {
5915 type: 'label',
5916 id: ctrl._id + '-l',
5917 text: label,
5918 flex: 0,
5919 forId: ctrl._id,
5920 disabled: ctrl.disabled()
5921 }
5922 }, self.settings.formItemDefaults));
5923 formItem.type = 'formitem';
5924 ctrl.aria('labelledby', ctrl._id + '-l');
5925 if (typeof ctrl.settings.flex === 'undefined') {
5926 ctrl.settings.flex = 1;
5927 }
5928 self.replace(ctrl, formItem);
5929 formItem.add(ctrl);
5930 }
5931 });
5932 },
5933 submit: function () {
5934 return this.fire('submit', { data: this.toJSON() });
5935 },
5936 postRender: function () {
5937 var self = this;
5938 self._super();
5939 self.fromJSON(self.settings.data);
5940 },
5941 bindStates: function () {
5942 var self = this;
5943 self._super();
5944 function recalcLabels() {
5945 var maxLabelWidth = 0;
5946 var labels = [];
5947 var i, labelGap, items;
5948 if (self.settings.labelGapCalc === false) {
5949 return;
5950 }
5951 if (self.settings.labelGapCalc === 'children') {
5952 items = self.find('formitem');
5953 } else {
5954 items = self.items();
5955 }
5956 items.filter('formitem').each(function (item) {
5957 var labelCtrl = item.items()[0], labelWidth = labelCtrl.getEl().clientWidth;
5958 maxLabelWidth = labelWidth > maxLabelWidth ? labelWidth : maxLabelWidth;
5959 labels.push(labelCtrl);
5960 });
5961 labelGap = self.settings.labelGap || 0;
5962 i = labels.length;
5963 while (i--) {
5964 labels[i].settings.minWidth = maxLabelWidth + labelGap;
5965 }
5966 }
5967 self.on('show', recalcLabels);
5968 recalcLabels();
5969 }
5970 });
5971
5972 var FieldSet = Form.extend({
5973 Defaults: {
5974 containerCls: 'fieldset',
5975 layout: 'flex',
5976 direction: 'column',
5977 align: 'stretch',
5978 flex: 1,
5979 padding: '25 15 5 15',
5980 labelGap: 30,
5981 spacing: 10,
5982 border: 1
5983 },
5984 renderHtml: function () {
5985 var self = this, layout = self._layout, prefix = self.classPrefix;
5986 self.preRender();
5987 layout.preRender(self);
5988 return '<fieldset id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<legend id="' + self._id + '-title" class="' + prefix + 'fieldset-title">' + self.settings.title + '</legend>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</fieldset>';
5989 }
5990 });
5991
5992 var unique$1 = 0;
5993 var generate = function (prefix) {
5994 var date = new Date();
5995 var time = date.getTime();
5996 var random = Math.floor(Math.random() * 1000000000);
5997 unique$1++;
5998 return prefix + '_' + random + unique$1 + String(time);
5999 };
6000
6001 var fromHtml = function (html, scope) {
6002 var doc = scope || domGlobals.document;
6003 var div = doc.createElement('div');
6004 div.innerHTML = html;
6005 if (!div.hasChildNodes() || div.childNodes.length > 1) {
6006 domGlobals.console.error('HTML does not have a single root node', html);
6007 throw new Error('HTML must have a single root node');
6008 }
6009 return fromDom(div.childNodes[0]);
6010 };
6011 var fromTag = function (tag, scope) {
6012 var doc = scope || domGlobals.document;
6013 var node = doc.createElement(tag);
6014 return fromDom(node);
6015 };
6016 var fromText = function (text, scope) {
6017 var doc = scope || domGlobals.document;
6018 var node = doc.createTextNode(text);
6019 return fromDom(node);
6020 };
6021 var fromDom = function (node) {
6022 if (node === null || node === undefined) {
6023 throw new Error('Node cannot be null or undefined');
6024 }
6025 return { dom: constant(node) };
6026 };
6027 var fromPoint = function (docElm, x, y) {
6028 var doc = docElm.dom();
6029 return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
6030 };
6031 var Element = {
6032 fromHtml: fromHtml,
6033 fromTag: fromTag,
6034 fromText: fromText,
6035 fromDom: fromDom,
6036 fromPoint: fromPoint
6037 };
6038
6039 var cached = function (f) {
6040 var called = false;
6041 var r;
6042 return function () {
6043 var args = [];
6044 for (var _i = 0; _i < arguments.length; _i++) {
6045 args[_i] = arguments[_i];
6046 }
6047 if (!called) {
6048 called = true;
6049 r = f.apply(null, args);
6050 }
6051 return r;
6052 };
6053 };
6054
6055 var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
6056 var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
6057 var COMMENT = domGlobals.Node.COMMENT_NODE;
6058 var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
6059 var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
6060 var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
6061 var ELEMENT = domGlobals.Node.ELEMENT_NODE;
6062 var TEXT = domGlobals.Node.TEXT_NODE;
6063 var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
6064 var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
6065 var ENTITY = domGlobals.Node.ENTITY_NODE;
6066 var NOTATION = domGlobals.Node.NOTATION_NODE;
6067
6068 var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
6069
6070 var path = function (parts, scope) {
6071 var o = scope !== undefined && scope !== null ? scope : Global;
6072 for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
6073 o = o[parts[i]];
6074 }
6075 return o;
6076 };
6077 var resolve = function (p, scope) {
6078 var parts = p.split('.');
6079 return path(parts, scope);
6080 };
6081
6082 var unsafe = function (name, scope) {
6083 return resolve(name, scope);
6084 };
6085 var getOrDie = function (name, scope) {
6086 var actual = unsafe(name, scope);
6087 if (actual === undefined || actual === null) {
6088 throw new Error(name + ' not available on this browser');
6089 }
6090 return actual;
6091 };
6092 var Global$1 = { getOrDie: getOrDie };
6093
6094 var Immutable = function () {
6095 var fields = [];
6096 for (var _i = 0; _i < arguments.length; _i++) {
6097 fields[_i] = arguments[_i];
6098 }
6099 return function () {
6100 var values = [];
6101 for (var _i = 0; _i < arguments.length; _i++) {
6102 values[_i] = arguments[_i];
6103 }
6104 if (fields.length !== values.length) {
6105 throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
6106 }
6107 var struct = {};
6108 each(fields, function (name, i) {
6109 struct[name] = constant(values[i]);
6110 });
6111 return struct;
6112 };
6113 };
6114
6115 var node = function () {
6116 var f = Global$1.getOrDie('Node');
6117 return f;
6118 };
6119 var compareDocumentPosition = function (a, b, match) {
6120 return (a.compareDocumentPosition(b) & match) !== 0;
6121 };
6122 var documentPositionPreceding = function (a, b) {
6123 return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
6124 };
6125 var documentPositionContainedBy = function (a, b) {
6126 return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
6127 };
6128 var Node = {
6129 documentPositionPreceding: documentPositionPreceding,
6130 documentPositionContainedBy: documentPositionContainedBy
6131 };
6132
6133 var firstMatch = function (regexes, s) {
6134 for (var i = 0; i < regexes.length; i++) {
6135 var x = regexes[i];
6136 if (x.test(s)) {
6137 return x;
6138 }
6139 }
6140 return undefined;
6141 };
6142 var find$1 = function (regexes, agent) {
6143 var r = firstMatch(regexes, agent);
6144 if (!r) {
6145 return {
6146 major: 0,
6147 minor: 0
6148 };
6149 }
6150 var group = function (i) {
6151 return Number(agent.replace(r, '$' + i));
6152 };
6153 return nu(group(1), group(2));
6154 };
6155 var detect = function (versionRegexes, agent) {
6156 var cleanedAgent = String(agent).toLowerCase();
6157 if (versionRegexes.length === 0) {
6158 return unknown();
6159 }
6160 return find$1(versionRegexes, cleanedAgent);
6161 };
6162 var unknown = function () {
6163 return nu(0, 0);
6164 };
6165 var nu = function (major, minor) {
6166 return {
6167 major: major,
6168 minor: minor
6169 };
6170 };
6171 var Version = {
6172 nu: nu,
6173 detect: detect,
6174 unknown: unknown
6175 };
6176
6177 var edge = 'Edge';
6178 var chrome = 'Chrome';
6179 var ie = 'IE';
6180 var opera = 'Opera';
6181 var firefox = 'Firefox';
6182 var safari = 'Safari';
6183 var isBrowser = function (name, current) {
6184 return function () {
6185 return current === name;
6186 };
6187 };
6188 var unknown$1 = function () {
6189 return nu$1({
6190 current: undefined,
6191 version: Version.unknown()
6192 });
6193 };
6194 var nu$1 = function (info) {
6195 var current = info.current;
6196 var version = info.version;
6197 return {
6198 current: current,
6199 version: version,
6200 isEdge: isBrowser(edge, current),
6201 isChrome: isBrowser(chrome, current),
6202 isIE: isBrowser(ie, current),
6203 isOpera: isBrowser(opera, current),
6204 isFirefox: isBrowser(firefox, current),
6205 isSafari: isBrowser(safari, current)
6206 };
6207 };
6208 var Browser = {
6209 unknown: unknown$1,
6210 nu: nu$1,
6211 edge: constant(edge),
6212 chrome: constant(chrome),
6213 ie: constant(ie),
6214 opera: constant(opera),
6215 firefox: constant(firefox),
6216 safari: constant(safari)
6217 };
6218
6219 var windows$1 = 'Windows';
6220 var ios = 'iOS';
6221 var android = 'Android';
6222 var linux = 'Linux';
6223 var osx = 'OSX';
6224 var solaris = 'Solaris';
6225 var freebsd = 'FreeBSD';
6226 var isOS = function (name, current) {
6227 return function () {
6228 return current === name;
6229 };
6230 };
6231 var unknown$2 = function () {
6232 return nu$2({
6233 current: undefined,
6234 version: Version.unknown()
6235 });
6236 };
6237 var nu$2 = function (info) {
6238 var current = info.current;
6239 var version = info.version;
6240 return {
6241 current: current,
6242 version: version,
6243 isWindows: isOS(windows$1, current),
6244 isiOS: isOS(ios, current),
6245 isAndroid: isOS(android, current),
6246 isOSX: isOS(osx, current),
6247 isLinux: isOS(linux, current),
6248 isSolaris: isOS(solaris, current),
6249 isFreeBSD: isOS(freebsd, current)
6250 };
6251 };
6252 var OperatingSystem = {
6253 unknown: unknown$2,
6254 nu: nu$2,
6255 windows: constant(windows$1),
6256 ios: constant(ios),
6257 android: constant(android),
6258 linux: constant(linux),
6259 osx: constant(osx),
6260 solaris: constant(solaris),
6261 freebsd: constant(freebsd)
6262 };
6263
6264 var DeviceType = function (os, browser, userAgent) {
6265 var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
6266 var isiPhone = os.isiOS() && !isiPad;
6267 var isAndroid3 = os.isAndroid() && os.version.major === 3;
6268 var isAndroid4 = os.isAndroid() && os.version.major === 4;
6269 var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
6270 var isTouch = os.isiOS() || os.isAndroid();
6271 var isPhone = isTouch && !isTablet;
6272 var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
6273 return {
6274 isiPad: constant(isiPad),
6275 isiPhone: constant(isiPhone),
6276 isTablet: constant(isTablet),
6277 isPhone: constant(isPhone),
6278 isTouch: constant(isTouch),
6279 isAndroid: os.isAndroid,
6280 isiOS: os.isiOS,
6281 isWebView: constant(iOSwebview)
6282 };
6283 };
6284
6285 var detect$1 = function (candidates, userAgent) {
6286 var agent = String(userAgent).toLowerCase();
6287 return find(candidates, function (candidate) {
6288 return candidate.search(agent);
6289 });
6290 };
6291 var detectBrowser = function (browsers, userAgent) {
6292 return detect$1(browsers, userAgent).map(function (browser) {
6293 var version = Version.detect(browser.versionRegexes, userAgent);
6294 return {
6295 current: browser.name,
6296 version: version
6297 };
6298 });
6299 };
6300 var detectOs = function (oses, userAgent) {
6301 return detect$1(oses, userAgent).map(function (os) {
6302 var version = Version.detect(os.versionRegexes, userAgent);
6303 return {
6304 current: os.name,
6305 version: version
6306 };
6307 });
6308 };
6309 var UaString = {
6310 detectBrowser: detectBrowser,
6311 detectOs: detectOs
6312 };
6313
6314 var contains = function (str, substr) {
6315 return str.indexOf(substr) !== -1;
6316 };
6317
6318 var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
6319 var checkContains = function (target) {
6320 return function (uastring) {
6321 return contains(uastring, target);
6322 };
6323 };
6324 var browsers = [
6325 {
6326 name: 'Edge',
6327 versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
6328 search: function (uastring) {
6329 return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
6330 }
6331 },
6332 {
6333 name: 'Chrome',
6334 versionRegexes: [
6335 /.*?chrome\/([0-9]+)\.([0-9]+).*/,
6336 normalVersionRegex
6337 ],
6338 search: function (uastring) {
6339 return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
6340 }
6341 },
6342 {
6343 name: 'IE',
6344 versionRegexes: [
6345 /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
6346 /.*?rv:([0-9]+)\.([0-9]+).*/
6347 ],
6348 search: function (uastring) {
6349 return contains(uastring, 'msie') || contains(uastring, 'trident');
6350 }
6351 },
6352 {
6353 name: 'Opera',
6354 versionRegexes: [
6355 normalVersionRegex,
6356 /.*?opera\/([0-9]+)\.([0-9]+).*/
6357 ],
6358 search: checkContains('opera')
6359 },
6360 {
6361 name: 'Firefox',
6362 versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
6363 search: checkContains('firefox')
6364 },
6365 {
6366 name: 'Safari',
6367 versionRegexes: [
6368 normalVersionRegex,
6369 /.*?cpu os ([0-9]+)_([0-9]+).*/
6370 ],
6371 search: function (uastring) {
6372 return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
6373 }
6374 }
6375 ];
6376 var oses = [
6377 {
6378 name: 'Windows',
6379 search: checkContains('win'),
6380 versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
6381 },
6382 {
6383 name: 'iOS',
6384 search: function (uastring) {
6385 return contains(uastring, 'iphone') || contains(uastring, 'ipad');
6386 },
6387 versionRegexes: [
6388 /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
6389 /.*cpu os ([0-9]+)_([0-9]+).*/,
6390 /.*cpu iphone os ([0-9]+)_([0-9]+).*/
6391 ]
6392 },
6393 {
6394 name: 'Android',
6395 search: checkContains('android'),
6396 versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
6397 },
6398 {
6399 name: 'OSX',
6400 search: checkContains('os x'),
6401 versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
6402 },
6403 {
6404 name: 'Linux',
6405 search: checkContains('linux'),
6406 versionRegexes: []
6407 },
6408 {
6409 name: 'Solaris',
6410 search: checkContains('sunos'),
6411 versionRegexes: []
6412 },
6413 {
6414 name: 'FreeBSD',
6415 search: checkContains('freebsd'),
6416 versionRegexes: []
6417 }
6418 ];
6419 var PlatformInfo = {
6420 browsers: constant(browsers),
6421 oses: constant(oses)
6422 };
6423
6424 var detect$2 = function (userAgent) {
6425 var browsers = PlatformInfo.browsers();
6426 var oses = PlatformInfo.oses();
6427 var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
6428 var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
6429 var deviceType = DeviceType(os, browser, userAgent);
6430 return {
6431 browser: browser,
6432 os: os,
6433 deviceType: deviceType
6434 };
6435 };
6436 var PlatformDetection = { detect: detect$2 };
6437
6438 var detect$3 = cached(function () {
6439 var userAgent = domGlobals.navigator.userAgent;
6440 return PlatformDetection.detect(userAgent);
6441 });
6442 var PlatformDetection$1 = { detect: detect$3 };
6443
6444 var ELEMENT$1 = ELEMENT;
6445 var DOCUMENT$1 = DOCUMENT;
6446 var bypassSelector = function (dom) {
6447 return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;
6448 };
6449 var all = function (selector, scope) {
6450 var base = scope === undefined ? domGlobals.document : scope.dom();
6451 return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);
6452 };
6453 var one = function (selector, scope) {
6454 var base = scope === undefined ? domGlobals.document : scope.dom();
6455 return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);
6456 };
6457
6458 var regularContains = function (e1, e2) {
6459 var d1 = e1.dom();
6460 var d2 = e2.dom();
6461 return d1 === d2 ? false : d1.contains(d2);
6462 };
6463 var ieContains = function (e1, e2) {
6464 return Node.documentPositionContainedBy(e1.dom(), e2.dom());
6465 };
6466 var browser = PlatformDetection$1.detect().browser;
6467 var contains$1 = browser.isIE() ? ieContains : regularContains;
6468
6469 var spot = Immutable('element', 'offset');
6470
6471 var descendants = function (scope, selector) {
6472 return all(selector, scope);
6473 };
6474
6475 var trim = global$2.trim;
6476 var hasContentEditableState = function (value) {
6477 return function (node) {
6478 if (node && node.nodeType === 1) {
6479 if (node.contentEditable === value) {
6480 return true;
6481 }
6482 if (node.getAttribute('data-mce-contenteditable') === value) {
6483 return true;
6484 }
6485 }
6486 return false;
6487 };
6488 };
6489 var isContentEditableTrue = hasContentEditableState('true');
6490 var isContentEditableFalse = hasContentEditableState('false');
6491 var create = function (type, title, url, level, attach) {
6492 return {
6493 type: type,
6494 title: title,
6495 url: url,
6496 level: level,
6497 attach: attach
6498 };
6499 };
6500 var isChildOfContentEditableTrue = function (node) {
6501 while (node = node.parentNode) {
6502 var value = node.contentEditable;
6503 if (value && value !== 'inherit') {
6504 return isContentEditableTrue(node);
6505 }
6506 }
6507 return false;
6508 };
6509 var select = function (selector, root) {
6510 return map(descendants(Element.fromDom(root), selector), function (element) {
6511 return element.dom();
6512 });
6513 };
6514 var getElementText = function (elm) {
6515 return elm.innerText || elm.textContent;
6516 };
6517 var getOrGenerateId = function (elm) {
6518 return elm.id ? elm.id : generate('h');
6519 };
6520 var isAnchor = function (elm) {
6521 return elm && elm.nodeName === 'A' && (elm.id || elm.name);
6522 };
6523 var isValidAnchor = function (elm) {
6524 return isAnchor(elm) && isEditable(elm);
6525 };
6526 var isHeader = function (elm) {
6527 return elm && /^(H[1-6])$/.test(elm.nodeName);
6528 };
6529 var isEditable = function (elm) {
6530 return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);
6531 };
6532 var isValidHeader = function (elm) {
6533 return isHeader(elm) && isEditable(elm);
6534 };
6535 var getLevel = function (elm) {
6536 return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;
6537 };
6538 var headerTarget = function (elm) {
6539 var headerId = getOrGenerateId(elm);
6540 var attach = function () {
6541 elm.id = headerId;
6542 };
6543 return create('header', getElementText(elm), '#' + headerId, getLevel(elm), attach);
6544 };
6545 var anchorTarget = function (elm) {
6546 var anchorId = elm.id || elm.name;
6547 var anchorText = getElementText(elm);
6548 return create('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);
6549 };
6550 var getHeaderTargets = function (elms) {
6551 return map(filter(elms, isValidHeader), headerTarget);
6552 };
6553 var getAnchorTargets = function (elms) {
6554 return map(filter(elms, isValidAnchor), anchorTarget);
6555 };
6556 var getTargetElements = function (elm) {
6557 var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);
6558 return elms;
6559 };
6560 var hasTitle = function (target) {
6561 return trim(target.title).length > 0;
6562 };
6563 var find$2 = function (elm) {
6564 var elms = getTargetElements(elm);
6565 return filter(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);
6566 };
6567 var LinkTargets = { find: find$2 };
6568
6569 var getActiveEditor = function () {
6570 return window.tinymce ? window.tinymce.activeEditor : global$1.activeEditor;
6571 };
6572 var history = {};
6573 var HISTORY_LENGTH = 5;
6574 var clearHistory = function () {
6575 history = {};
6576 };
6577 var toMenuItem = function (target) {
6578 return {
6579 title: target.title,
6580 value: {
6581 title: { raw: target.title },
6582 url: target.url,
6583 attach: target.attach
6584 }
6585 };
6586 };
6587 var toMenuItems = function (targets) {
6588 return global$2.map(targets, toMenuItem);
6589 };
6590 var staticMenuItem = function (title, url) {
6591 return {
6592 title: title,
6593 value: {
6594 title: title,
6595 url: url,
6596 attach: noop
6597 }
6598 };
6599 };
6600 var isUniqueUrl = function (url, targets) {
6601 var foundTarget = exists(targets, function (target) {
6602 return target.url === url;
6603 });
6604 return !foundTarget;
6605 };
6606 var getSetting = function (editorSettings, name, defaultValue) {
6607 var value = name in editorSettings ? editorSettings[name] : defaultValue;
6608 return value === false ? null : value;
6609 };
6610 var createMenuItems = function (term, targets, fileType, editorSettings) {
6611 var separator = { title: '-' };
6612 var fromHistoryMenuItems = function (history) {
6613 var historyItems = history.hasOwnProperty(fileType) ? history[fileType] : [];
6614 var uniqueHistory = filter(historyItems, function (url) {
6615 return isUniqueUrl(url, targets);
6616 });
6617 return global$2.map(uniqueHistory, function (url) {
6618 return {
6619 title: url,
6620 value: {
6621 title: url,
6622 url: url,
6623 attach: noop
6624 }
6625 };
6626 });
6627 };
6628 var fromMenuItems = function (type) {
6629 var filteredTargets = filter(targets, function (target) {
6630 return target.type === type;
6631 });
6632 return toMenuItems(filteredTargets);
6633 };
6634 var anchorMenuItems = function () {
6635 var anchorMenuItems = fromMenuItems('anchor');
6636 var topAnchor = getSetting(editorSettings, 'anchor_top', '#top');
6637 var bottomAchor = getSetting(editorSettings, 'anchor_bottom', '#bottom');
6638 if (topAnchor !== null) {
6639 anchorMenuItems.unshift(staticMenuItem('<top>', topAnchor));
6640 }
6641 if (bottomAchor !== null) {
6642 anchorMenuItems.push(staticMenuItem('<bottom>', bottomAchor));
6643 }
6644 return anchorMenuItems;
6645 };
6646 var join = function (items) {
6647 return foldl(items, function (a, b) {
6648 var bothEmpty = a.length === 0 || b.length === 0;
6649 return bothEmpty ? a.concat(b) : a.concat(separator, b);
6650 }, []);
6651 };
6652 if (editorSettings.typeahead_urls === false) {
6653 return [];
6654 }
6655 return fileType === 'file' ? join([
6656 filterByQuery(term, fromHistoryMenuItems(history)),
6657 filterByQuery(term, fromMenuItems('header')),
6658 filterByQuery(term, anchorMenuItems())
6659 ]) : filterByQuery(term, fromHistoryMenuItems(history));
6660 };
6661 var addToHistory = function (url, fileType) {
6662 var items = history[fileType];
6663 if (!/^https?/.test(url)) {
6664 return;
6665 }
6666 if (items) {
6667 if (indexOf(items, url).isNone()) {
6668 history[fileType] = items.slice(0, HISTORY_LENGTH).concat(url);
6669 }
6670 } else {
6671 history[fileType] = [url];
6672 }
6673 };
6674 var filterByQuery = function (term, menuItems) {
6675 var lowerCaseTerm = term.toLowerCase();
6676 var result = global$2.grep(menuItems, function (item) {
6677 return item.title.toLowerCase().indexOf(lowerCaseTerm) !== -1;
6678 });
6679 return result.length === 1 && result[0].title === term ? [] : result;
6680 };
6681 var getTitle = function (linkDetails) {
6682 var title = linkDetails.title;
6683 return title.raw ? title.raw : title;
6684 };
6685 var setupAutoCompleteHandler = function (ctrl, editorSettings, bodyElm, fileType) {
6686 var autocomplete = function (term) {
6687 var linkTargets = LinkTargets.find(bodyElm);
6688 var menuItems = createMenuItems(term, linkTargets, fileType, editorSettings);
6689 ctrl.showAutoComplete(menuItems, term);
6690 };
6691 ctrl.on('autocomplete', function () {
6692 autocomplete(ctrl.value());
6693 });
6694 ctrl.on('selectitem', function (e) {
6695 var linkDetails = e.value;
6696 ctrl.value(linkDetails.url);
6697 var title = getTitle(linkDetails);
6698 if (fileType === 'image') {
6699 ctrl.fire('change', {
6700 meta: {
6701 alt: title,
6702 attach: linkDetails.attach
6703 }
6704 });
6705 } else {
6706 ctrl.fire('change', {
6707 meta: {
6708 text: title,
6709 attach: linkDetails.attach
6710 }
6711 });
6712 }
6713 ctrl.focus();
6714 });
6715 ctrl.on('click', function (e) {
6716 if (ctrl.value().length === 0 && e.target.nodeName === 'INPUT') {
6717 autocomplete('');
6718 }
6719 });
6720 ctrl.on('PostRender', function () {
6721 ctrl.getRoot().on('submit', function (e) {
6722 if (!e.isDefaultPrevented()) {
6723 addToHistory(ctrl.value(), fileType);
6724 }
6725 });
6726 });
6727 };
6728 var statusToUiState = function (result) {
6729 var status = result.status, message = result.message;
6730 if (status === 'valid') {
6731 return {
6732 status: 'ok',
6733 message: message
6734 };
6735 } else if (status === 'unknown') {
6736 return {
6737 status: 'warn',
6738 message: message
6739 };
6740 } else if (status === 'invalid') {
6741 return {
6742 status: 'warn',
6743 message: message
6744 };
6745 } else {
6746 return {
6747 status: 'none',
6748 message: ''
6749 };
6750 }
6751 };
6752 var setupLinkValidatorHandler = function (ctrl, editorSettings, fileType) {
6753 var validatorHandler = editorSettings.filepicker_validator_handler;
6754 if (validatorHandler) {
6755 var validateUrl_1 = function (url) {
6756 if (url.length === 0) {
6757 ctrl.statusLevel('none');
6758 return;
6759 }
6760 validatorHandler({
6761 url: url,
6762 type: fileType
6763 }, function (result) {
6764 var uiState = statusToUiState(result);
6765 ctrl.statusMessage(uiState.message);
6766 ctrl.statusLevel(uiState.status);
6767 });
6768 };
6769 ctrl.state.on('change:value', function (e) {
6770 validateUrl_1(e.value);
6771 });
6772 }
6773 };
6774 var FilePicker = ComboBox.extend({
6775 Statics: { clearHistory: clearHistory },
6776 init: function (settings) {
6777 var self = this, editor = getActiveEditor(), editorSettings = editor.settings;
6778 var actionCallback, fileBrowserCallback, fileBrowserCallbackTypes;
6779 var fileType = settings.filetype;
6780 settings.spellcheck = false;
6781 fileBrowserCallbackTypes = editorSettings.file_picker_types || editorSettings.file_browser_callback_types;
6782 if (fileBrowserCallbackTypes) {
6783 fileBrowserCallbackTypes = global$2.makeMap(fileBrowserCallbackTypes, /[, ]/);
6784 }
6785 if (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType]) {
6786 fileBrowserCallback = editorSettings.file_picker_callback;
6787 if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) {
6788 actionCallback = function () {
6789 var meta = self.fire('beforecall').meta;
6790 meta = global$2.extend({ filetype: fileType }, meta);
6791 fileBrowserCallback.call(editor, function (value, meta) {
6792 self.value(value).fire('change', { meta: meta });
6793 }, self.value(), meta);
6794 };
6795 } else {
6796 fileBrowserCallback = editorSettings.file_browser_callback;
6797 if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) {
6798 actionCallback = function () {
6799 fileBrowserCallback(self.getEl('inp').id, self.value(), fileType, window);
6800 };
6801 }
6802 }
6803 }
6804 if (actionCallback) {
6805 settings.icon = 'browse';
6806 settings.onaction = actionCallback;
6807 }
6808 self._super(settings);
6809 self.classes.add('filepicker');
6810 setupAutoCompleteHandler(self, editorSettings, editor.getBody(), fileType);
6811 setupLinkValidatorHandler(self, editorSettings, fileType);
6812 }
6813 });
6814
6815 var FitLayout = AbsoluteLayout.extend({
6816 recalc: function (container) {
6817 var contLayoutRect = container.layoutRect(), paddingBox = container.paddingBox;
6818 container.items().filter(':visible').each(function (ctrl) {
6819 ctrl.layoutRect({
6820 x: paddingBox.left,
6821 y: paddingBox.top,
6822 w: contLayoutRect.innerW - paddingBox.right - paddingBox.left,
6823 h: contLayoutRect.innerH - paddingBox.top - paddingBox.bottom
6824 });
6825 if (ctrl.recalc) {
6826 ctrl.recalc();
6827 }
6828 });
6829 }
6830 });
6831
6832 var FlexLayout = AbsoluteLayout.extend({
6833 recalc: function (container) {
6834 var i, l, items, contLayoutRect, contPaddingBox, contSettings, align, pack, spacing, totalFlex, availableSpace, direction;
6835 var ctrl, ctrlLayoutRect, ctrlSettings, flex;
6836 var maxSizeItems = [];
6837 var size, maxSize, ratio, rect, pos, maxAlignEndPos;
6838 var sizeName, minSizeName, posName, maxSizeName, beforeName, innerSizeName, deltaSizeName, contentSizeName;
6839 var alignAxisName, alignInnerSizeName, alignSizeName, alignMinSizeName, alignBeforeName, alignAfterName;
6840 var alignDeltaSizeName, alignContentSizeName;
6841 var max = Math.max, min = Math.min;
6842 items = container.items().filter(':visible');
6843 contLayoutRect = container.layoutRect();
6844 contPaddingBox = container.paddingBox;
6845 contSettings = container.settings;
6846 direction = container.isRtl() ? contSettings.direction || 'row-reversed' : contSettings.direction;
6847 align = contSettings.align;
6848 pack = container.isRtl() ? contSettings.pack || 'end' : contSettings.pack;
6849 spacing = contSettings.spacing || 0;
6850 if (direction === 'row-reversed' || direction === 'column-reverse') {
6851 items = items.set(items.toArray().reverse());
6852 direction = direction.split('-')[0];
6853 }
6854 if (direction === 'column') {
6855 posName = 'y';
6856 sizeName = 'h';
6857 minSizeName = 'minH';
6858 maxSizeName = 'maxH';
6859 innerSizeName = 'innerH';
6860 beforeName = 'top';
6861 deltaSizeName = 'deltaH';
6862 contentSizeName = 'contentH';
6863 alignBeforeName = 'left';
6864 alignSizeName = 'w';
6865 alignAxisName = 'x';
6866 alignInnerSizeName = 'innerW';
6867 alignMinSizeName = 'minW';
6868 alignAfterName = 'right';
6869 alignDeltaSizeName = 'deltaW';
6870 alignContentSizeName = 'contentW';
6871 } else {
6872 posName = 'x';
6873 sizeName = 'w';
6874 minSizeName = 'minW';
6875 maxSizeName = 'maxW';
6876 innerSizeName = 'innerW';
6877 beforeName = 'left';
6878 deltaSizeName = 'deltaW';
6879 contentSizeName = 'contentW';
6880 alignBeforeName = 'top';
6881 alignSizeName = 'h';
6882 alignAxisName = 'y';
6883 alignInnerSizeName = 'innerH';
6884 alignMinSizeName = 'minH';
6885 alignAfterName = 'bottom';
6886 alignDeltaSizeName = 'deltaH';
6887 alignContentSizeName = 'contentH';
6888 }
6889 availableSpace = contLayoutRect[innerSizeName] - contPaddingBox[beforeName] - contPaddingBox[beforeName];
6890 maxAlignEndPos = totalFlex = 0;
6891 for (i = 0, l = items.length; i < l; i++) {
6892 ctrl = items[i];
6893 ctrlLayoutRect = ctrl.layoutRect();
6894 ctrlSettings = ctrl.settings;
6895 flex = ctrlSettings.flex;
6896 availableSpace -= i < l - 1 ? spacing : 0;
6897 if (flex > 0) {
6898 totalFlex += flex;
6899 if (ctrlLayoutRect[maxSizeName]) {
6900 maxSizeItems.push(ctrl);
6901 }
6902 ctrlLayoutRect.flex = flex;
6903 }
6904 availableSpace -= ctrlLayoutRect[minSizeName];
6905 size = contPaddingBox[alignBeforeName] + ctrlLayoutRect[alignMinSizeName] + contPaddingBox[alignAfterName];
6906 if (size > maxAlignEndPos) {
6907 maxAlignEndPos = size;
6908 }
6909 }
6910 rect = {};
6911 if (availableSpace < 0) {
6912 rect[minSizeName] = contLayoutRect[minSizeName] - availableSpace + contLayoutRect[deltaSizeName];
6913 } else {
6914 rect[minSizeName] = contLayoutRect[innerSizeName] - availableSpace + contLayoutRect[deltaSizeName];
6915 }
6916 rect[alignMinSizeName] = maxAlignEndPos + contLayoutRect[alignDeltaSizeName];
6917 rect[contentSizeName] = contLayoutRect[innerSizeName] - availableSpace;
6918 rect[alignContentSizeName] = maxAlignEndPos;
6919 rect.minW = min(rect.minW, contLayoutRect.maxW);
6920 rect.minH = min(rect.minH, contLayoutRect.maxH);
6921 rect.minW = max(rect.minW, contLayoutRect.startMinWidth);
6922 rect.minH = max(rect.minH, contLayoutRect.startMinHeight);
6923 if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) {
6924 rect.w = rect.minW;
6925 rect.h = rect.minH;
6926 container.layoutRect(rect);
6927 this.recalc(container);
6928 if (container._lastRect === null) {
6929 var parentCtrl = container.parent();
6930 if (parentCtrl) {
6931 parentCtrl._lastRect = null;
6932 parentCtrl.recalc();
6933 }
6934 }
6935 return;
6936 }
6937 ratio = availableSpace / totalFlex;
6938 for (i = 0, l = maxSizeItems.length; i < l; i++) {
6939 ctrl = maxSizeItems[i];
6940 ctrlLayoutRect = ctrl.layoutRect();
6941 maxSize = ctrlLayoutRect[maxSizeName];
6942 size = ctrlLayoutRect[minSizeName] + ctrlLayoutRect.flex * ratio;
6943 if (size > maxSize) {
6944 availableSpace -= ctrlLayoutRect[maxSizeName] - ctrlLayoutRect[minSizeName];
6945 totalFlex -= ctrlLayoutRect.flex;
6946 ctrlLayoutRect.flex = 0;
6947 ctrlLayoutRect.maxFlexSize = maxSize;
6948 } else {
6949 ctrlLayoutRect.maxFlexSize = 0;
6950 }
6951 }
6952 ratio = availableSpace / totalFlex;
6953 pos = contPaddingBox[beforeName];
6954 rect = {};
6955 if (totalFlex === 0) {
6956 if (pack === 'end') {
6957 pos = availableSpace + contPaddingBox[beforeName];
6958 } else if (pack === 'center') {
6959 pos = Math.round(contLayoutRect[innerSizeName] / 2 - (contLayoutRect[innerSizeName] - availableSpace) / 2) + contPaddingBox[beforeName];
6960 if (pos < 0) {
6961 pos = contPaddingBox[beforeName];
6962 }
6963 } else if (pack === 'justify') {
6964 pos = contPaddingBox[beforeName];
6965 spacing = Math.floor(availableSpace / (items.length - 1));
6966 }
6967 }
6968 rect[alignAxisName] = contPaddingBox[alignBeforeName];
6969 for (i = 0, l = items.length; i < l; i++) {
6970 ctrl = items[i];
6971 ctrlLayoutRect = ctrl.layoutRect();
6972 size = ctrlLayoutRect.maxFlexSize || ctrlLayoutRect[minSizeName];
6973 if (align === 'center') {
6974 rect[alignAxisName] = Math.round(contLayoutRect[alignInnerSizeName] / 2 - ctrlLayoutRect[alignSizeName] / 2);
6975 } else if (align === 'stretch') {
6976 rect[alignSizeName] = max(ctrlLayoutRect[alignMinSizeName] || 0, contLayoutRect[alignInnerSizeName] - contPaddingBox[alignBeforeName] - contPaddingBox[alignAfterName]);
6977 rect[alignAxisName] = contPaddingBox[alignBeforeName];
6978 } else if (align === 'end') {
6979 rect[alignAxisName] = contLayoutRect[alignInnerSizeName] - ctrlLayoutRect[alignSizeName] - contPaddingBox.top;
6980 }
6981 if (ctrlLayoutRect.flex > 0) {
6982 size += ctrlLayoutRect.flex * ratio;
6983 }
6984 rect[sizeName] = size;
6985 rect[posName] = pos;
6986 ctrl.layoutRect(rect);
6987 if (ctrl.recalc) {
6988 ctrl.recalc();
6989 }
6990 pos += size + spacing;
6991 }
6992 }
6993 });
6994
6995 var FlowLayout = Layout.extend({
6996 Defaults: {
6997 containerClass: 'flow-layout',
6998 controlClass: 'flow-layout-item',
6999 endClass: 'break'
7000 },
7001 recalc: function (container) {
7002 container.items().filter(':visible').each(function (ctrl) {
7003 if (ctrl.recalc) {
7004 ctrl.recalc();
7005 }
7006 });
7007 },
7008 isNative: function () {
7009 return true;
7010 }
7011 });
7012
7013 var descendant = function (scope, selector) {
7014 return one(selector, scope);
7015 };
7016
7017 var toggleFormat = function (editor, fmt) {
7018 return function () {
7019 editor.execCommand('mceToggleFormat', false, fmt);
7020 };
7021 };
7022 var addFormatChangedListener = function (editor, name, changed) {
7023 var handler = function (state) {
7024 changed(state, name);
7025 };
7026 if (editor.formatter) {
7027 editor.formatter.formatChanged(name, handler);
7028 } else {
7029 editor.on('init', function () {
7030 editor.formatter.formatChanged(name, handler);
7031 });
7032 }
7033 };
7034 var postRenderFormatToggle = function (editor, name) {
7035 return function (e) {
7036 addFormatChangedListener(editor, name, function (state) {
7037 e.control.active(state);
7038 });
7039 };
7040 };
7041
7042 var register = function (editor) {
7043 var alignFormats = [
7044 'alignleft',
7045 'aligncenter',
7046 'alignright',
7047 'alignjustify'
7048 ];
7049 var defaultAlign = 'alignleft';
7050 var alignMenuItems = [
7051 {
7052 text: 'Left',
7053 icon: 'alignleft',
7054 onclick: toggleFormat(editor, 'alignleft')
7055 },
7056 {
7057 text: 'Center',
7058 icon: 'aligncenter',
7059 onclick: toggleFormat(editor, 'aligncenter')
7060 },
7061 {
7062 text: 'Right',
7063 icon: 'alignright',
7064 onclick: toggleFormat(editor, 'alignright')
7065 },
7066 {
7067 text: 'Justify',
7068 icon: 'alignjustify',
7069 onclick: toggleFormat(editor, 'alignjustify')
7070 }
7071 ];
7072 editor.addMenuItem('align', {
7073 text: 'Align',
7074 menu: alignMenuItems
7075 });
7076 editor.addButton('align', {
7077 type: 'menubutton',
7078 icon: defaultAlign,
7079 menu: alignMenuItems,
7080 onShowMenu: function (e) {
7081 var menu = e.control.menu;
7082 global$2.each(alignFormats, function (formatName, idx) {
7083 menu.items().eq(idx).each(function (item) {
7084 return item.active(editor.formatter.match(formatName));
7085 });
7086 });
7087 },
7088 onPostRender: function (e) {
7089 var ctrl = e.control;
7090 global$2.each(alignFormats, function (formatName, idx) {
7091 addFormatChangedListener(editor, formatName, function (state) {
7092 ctrl.icon(defaultAlign);
7093 if (state) {
7094 ctrl.icon(formatName);
7095 }
7096 });
7097 });
7098 }
7099 });
7100 global$2.each({
7101 alignleft: [
7102 'Align left',
7103 'JustifyLeft'
7104 ],
7105 aligncenter: [
7106 'Align center',
7107 'JustifyCenter'
7108 ],
7109 alignright: [
7110 'Align right',
7111 'JustifyRight'
7112 ],
7113 alignjustify: [
7114 'Justify',
7115 'JustifyFull'
7116 ],
7117 alignnone: [
7118 'No alignment',
7119 'JustifyNone'
7120 ]
7121 }, function (item, name) {
7122 editor.addButton(name, {
7123 active: false,
7124 tooltip: item[0],
7125 cmd: item[1],
7126 onPostRender: postRenderFormatToggle(editor, name)
7127 });
7128 });
7129 };
7130 var Align = { register: register };
7131
7132 var getFirstFont = function (fontFamily) {
7133 return fontFamily ? fontFamily.split(',')[0] : '';
7134 };
7135 var findMatchingValue = function (items, fontFamily) {
7136 var font = fontFamily ? fontFamily.toLowerCase() : '';
7137 var value;
7138 global$2.each(items, function (item) {
7139 if (item.value.toLowerCase() === font) {
7140 value = item.value;
7141 }
7142 });
7143 global$2.each(items, function (item) {
7144 if (!value && getFirstFont(item.value).toLowerCase() === getFirstFont(font).toLowerCase()) {
7145 value = item.value;
7146 }
7147 });
7148 return value;
7149 };
7150 var createFontNameListBoxChangeHandler = function (editor, items) {
7151 return function () {
7152 var self = this;
7153 self.state.set('value', null);
7154 editor.on('init nodeChange', function (e) {
7155 var fontFamily = editor.queryCommandValue('FontName');
7156 var match = findMatchingValue(items, fontFamily);
7157 self.value(match ? match : null);
7158 if (!match && fontFamily) {
7159 self.text(getFirstFont(fontFamily));
7160 }
7161 });
7162 };
7163 };
7164 var createFormats = function (formats) {
7165 formats = formats.replace(/;$/, '').split(';');
7166 var i = formats.length;
7167 while (i--) {
7168 formats[i] = formats[i].split('=');
7169 }
7170 return formats;
7171 };
7172 var getFontItems = function (editor) {
7173 var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats';
7174 var fonts = createFormats(editor.settings.font_formats || defaultFontsFormats);
7175 return global$2.map(fonts, function (font) {
7176 return {
7177 text: { raw: font[0] },
7178 value: font[1],
7179 textStyle: font[1].indexOf('dings') === -1 ? 'font-family:' + font[1] : ''
7180 };
7181 });
7182 };
7183 var registerButtons = function (editor) {
7184 editor.addButton('fontselect', function () {
7185 var items = getFontItems(editor);
7186 return {
7187 type: 'listbox',
7188 text: 'Font Family',
7189 tooltip: 'Font Family',
7190 values: items,
7191 fixedWidth: true,
7192 onPostRender: createFontNameListBoxChangeHandler(editor, items),
7193 onselect: function (e) {
7194 if (e.control.settings.value) {
7195 editor.execCommand('FontName', false, e.control.settings.value);
7196 }
7197 }
7198 };
7199 });
7200 };
7201 var register$1 = function (editor) {
7202 registerButtons(editor);
7203 };
7204 var FontSelect = { register: register$1 };
7205
7206 var round = function (number, precision) {
7207 var factor = Math.pow(10, precision);
7208 return Math.round(number * factor) / factor;
7209 };
7210 var toPt = function (fontSize, precision) {
7211 if (/[0-9.]+px$/.test(fontSize)) {
7212 return round(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';
7213 }
7214 return fontSize;
7215 };
7216 var findMatchingValue$1 = function (items, pt, px) {
7217 var value;
7218 global$2.each(items, function (item) {
7219 if (item.value === px) {
7220 value = px;
7221 } else if (item.value === pt) {
7222 value = pt;
7223 }
7224 });
7225 return value;
7226 };
7227 var createFontSizeListBoxChangeHandler = function (editor, items) {
7228 return function () {
7229 var self = this;
7230 editor.on('init nodeChange', function (e) {
7231 var px, pt, precision, match;
7232 px = editor.queryCommandValue('FontSize');
7233 if (px) {
7234 for (precision = 3; !match && precision >= 0; precision--) {
7235 pt = toPt(px, precision);
7236 match = findMatchingValue$1(items, pt, px);
7237 }
7238 }
7239 self.value(match ? match : null);
7240 if (!match) {
7241 self.text(pt);
7242 }
7243 });
7244 };
7245 };
7246 var getFontSizeItems = function (editor) {
7247 var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
7248 var fontsizeFormats = editor.settings.fontsize_formats || defaultFontsizeFormats;
7249 return global$2.map(fontsizeFormats.split(' '), function (item) {
7250 var text = item, value = item;
7251 var values = item.split('=');
7252 if (values.length > 1) {
7253 text = values[0];
7254 value = values[1];
7255 }
7256 return {
7257 text: text,
7258 value: value
7259 };
7260 });
7261 };
7262 var registerButtons$1 = function (editor) {
7263 editor.addButton('fontsizeselect', function () {
7264 var items = getFontSizeItems(editor);
7265 return {
7266 type: 'listbox',
7267 text: 'Font Sizes',
7268 tooltip: 'Font Sizes',
7269 values: items,
7270 fixedWidth: true,
7271 onPostRender: createFontSizeListBoxChangeHandler(editor, items),
7272 onclick: function (e) {
7273 if (e.control.settings.value) {
7274 editor.execCommand('FontSize', false, e.control.settings.value);
7275 }
7276 }
7277 };
7278 });
7279 };
7280 var register$2 = function (editor) {
7281 registerButtons$1(editor);
7282 };
7283 var FontSizeSelect = { register: register$2 };
7284
7285 var hideMenuObjects = function (editor, menu) {
7286 var count = menu.length;
7287 global$2.each(menu, function (item) {
7288 if (item.menu) {
7289 item.hidden = hideMenuObjects(editor, item.menu) === 0;
7290 }
7291 var formatName = item.format;
7292 if (formatName) {
7293 item.hidden = !editor.formatter.canApply(formatName);
7294 }
7295 if (item.hidden) {
7296 count--;
7297 }
7298 });
7299 return count;
7300 };
7301 var hideFormatMenuItems = function (editor, menu) {
7302 var count = menu.items().length;
7303 menu.items().each(function (item) {
7304 if (item.menu) {
7305 item.visible(hideFormatMenuItems(editor, item.menu) > 0);
7306 }
7307 if (!item.menu && item.settings.menu) {
7308 item.visible(hideMenuObjects(editor, item.settings.menu) > 0);
7309 }
7310 var formatName = item.settings.format;
7311 if (formatName) {
7312 item.visible(editor.formatter.canApply(formatName));
7313 }
7314 if (!item.visible()) {
7315 count--;
7316 }
7317 });
7318 return count;
7319 };
7320 var createFormatMenu = function (editor) {
7321 var count = 0;
7322 var newFormats = [];
7323 var defaultStyleFormats = [
7324 {
7325 title: 'Headings',
7326 items: [
7327 {
7328 title: 'Heading 1',
7329 format: 'h1'
7330 },
7331 {
7332 title: 'Heading 2',
7333 format: 'h2'
7334 },
7335 {
7336 title: 'Heading 3',
7337 format: 'h3'
7338 },
7339 {
7340 title: 'Heading 4',
7341 format: 'h4'
7342 },
7343 {
7344 title: 'Heading 5',
7345 format: 'h5'
7346 },
7347 {
7348 title: 'Heading 6',
7349 format: 'h6'
7350 }
7351 ]
7352 },
7353 {
7354 title: 'Inline',
7355 items: [
7356 {
7357 title: 'Bold',
7358 icon: 'bold',
7359 format: 'bold'
7360 },
7361 {
7362 title: 'Italic',
7363 icon: 'italic',
7364 format: 'italic'
7365 },
7366 {
7367 title: 'Underline',
7368 icon: 'underline',
7369 format: 'underline'
7370 },
7371 {
7372 title: 'Strikethrough',
7373 icon: 'strikethrough',
7374 format: 'strikethrough'
7375 },
7376 {
7377 title: 'Superscript',
7378 icon: 'superscript',
7379 format: 'superscript'
7380 },
7381 {
7382 title: 'Subscript',
7383 icon: 'subscript',
7384 format: 'subscript'
7385 },
7386 {
7387 title: 'Code',
7388 icon: 'code',
7389 format: 'code'
7390 }
7391 ]
7392 },
7393 {
7394 title: 'Blocks',
7395 items: [
7396 {
7397 title: 'Paragraph',
7398 format: 'p'
7399 },
7400 {
7401 title: 'Blockquote',
7402 format: 'blockquote'
7403 },
7404 {
7405 title: 'Div',
7406 format: 'div'
7407 },
7408 {
7409 title: 'Pre',
7410 format: 'pre'
7411 }
7412 ]
7413 },
7414 {
7415 title: 'Alignment',
7416 items: [
7417 {
7418 title: 'Left',
7419 icon: 'alignleft',
7420 format: 'alignleft'
7421 },
7422 {
7423 title: 'Center',
7424 icon: 'aligncenter',
7425 format: 'aligncenter'
7426 },
7427 {
7428 title: 'Right',
7429 icon: 'alignright',
7430 format: 'alignright'
7431 },
7432 {
7433 title: 'Justify',
7434 icon: 'alignjustify',
7435 format: 'alignjustify'
7436 }
7437 ]
7438 }
7439 ];
7440 var createMenu = function (formats) {
7441 var menu = [];
7442 if (!formats) {
7443 return;
7444 }
7445 global$2.each(formats, function (format) {
7446 var menuItem = {
7447 text: format.title,
7448 icon: format.icon
7449 };
7450 if (format.items) {
7451 menuItem.menu = createMenu(format.items);
7452 } else {
7453 var formatName = format.format || 'custom' + count++;
7454 if (!format.format) {
7455 format.name = formatName;
7456 newFormats.push(format);
7457 }
7458 menuItem.format = formatName;
7459 menuItem.cmd = format.cmd;
7460 }
7461 menu.push(menuItem);
7462 });
7463 return menu;
7464 };
7465 var createStylesMenu = function () {
7466 var menu;
7467 if (editor.settings.style_formats_merge) {
7468 if (editor.settings.style_formats) {
7469 menu = createMenu(defaultStyleFormats.concat(editor.settings.style_formats));
7470 } else {
7471 menu = createMenu(defaultStyleFormats);
7472 }
7473 } else {
7474 menu = createMenu(editor.settings.style_formats || defaultStyleFormats);
7475 }
7476 return menu;
7477 };
7478 editor.on('init', function () {
7479 global$2.each(newFormats, function (format) {
7480 editor.formatter.register(format.name, format);
7481 });
7482 });
7483 return {
7484 type: 'menu',
7485 items: createStylesMenu(),
7486 onPostRender: function (e) {
7487 editor.fire('renderFormatsMenu', { control: e.control });
7488 },
7489 itemDefaults: {
7490 preview: true,
7491 textStyle: function () {
7492 if (this.settings.format) {
7493 return editor.formatter.getCssText(this.settings.format);
7494 }
7495 },
7496 onPostRender: function () {
7497 var self = this;
7498 self.parent().on('show', function () {
7499 var formatName, command;
7500 formatName = self.settings.format;
7501 if (formatName) {
7502 self.disabled(!editor.formatter.canApply(formatName));
7503 self.active(editor.formatter.match(formatName));
7504 }
7505 command = self.settings.cmd;
7506 if (command) {
7507 self.active(editor.queryCommandState(command));
7508 }
7509 });
7510 },
7511 onclick: function () {
7512 if (this.settings.format) {
7513 toggleFormat(editor, this.settings.format)();
7514 }
7515 if (this.settings.cmd) {
7516 editor.execCommand(this.settings.cmd);
7517 }
7518 }
7519 }
7520 };
7521 };
7522 var registerMenuItems = function (editor, formatMenu) {
7523 editor.addMenuItem('formats', {
7524 text: 'Formats',
7525 menu: formatMenu
7526 });
7527 };
7528 var registerButtons$2 = function (editor, formatMenu) {
7529 editor.addButton('styleselect', {
7530 type: 'menubutton',
7531 text: 'Formats',
7532 menu: formatMenu,
7533 onShowMenu: function () {
7534 if (editor.settings.style_formats_autohide) {
7535 hideFormatMenuItems(editor, this.menu);
7536 }
7537 }
7538 });
7539 };
7540 var register$3 = function (editor) {
7541 var formatMenu = createFormatMenu(editor);
7542 registerMenuItems(editor, formatMenu);
7543 registerButtons$2(editor, formatMenu);
7544 };
7545 var Formats = { register: register$3 };
7546
7547 var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre';
7548 var createFormats$1 = function (formats) {
7549 formats = formats.replace(/;$/, '').split(';');
7550 var i = formats.length;
7551 while (i--) {
7552 formats[i] = formats[i].split('=');
7553 }
7554 return formats;
7555 };
7556 var createListBoxChangeHandler = function (editor, items, formatName) {
7557 return function () {
7558 var self = this;
7559 editor.on('nodeChange', function (e) {
7560 var formatter = editor.formatter;
7561 var value = null;
7562 global$2.each(e.parents, function (node) {
7563 global$2.each(items, function (item) {
7564 if (formatName) {
7565 if (formatter.matchNode(node, formatName, { value: item.value })) {
7566 value = item.value;
7567 }
7568 } else {
7569 if (formatter.matchNode(node, item.value)) {
7570 value = item.value;
7571 }
7572 }
7573 if (value) {
7574 return false;
7575 }
7576 });
7577 if (value) {
7578 return false;
7579 }
7580 });
7581 self.value(value);
7582 });
7583 };
7584 };
7585 var lazyFormatSelectBoxItems = function (editor, blocks) {
7586 return function () {
7587 var items = [];
7588 global$2.each(blocks, function (block) {
7589 items.push({
7590 text: block[0],
7591 value: block[1],
7592 textStyle: function () {
7593 return editor.formatter.getCssText(block[1]);
7594 }
7595 });
7596 });
7597 return {
7598 type: 'listbox',
7599 text: blocks[0][0],
7600 values: items,
7601 fixedWidth: true,
7602 onselect: function (e) {
7603 if (e.control) {
7604 var fmt = e.control.value();
7605 toggleFormat(editor, fmt)();
7606 }
7607 },
7608 onPostRender: createListBoxChangeHandler(editor, items)
7609 };
7610 };
7611 };
7612 var buildMenuItems = function (editor, blocks) {
7613 return global$2.map(blocks, function (block) {
7614 return {
7615 text: block[0],
7616 onclick: toggleFormat(editor, block[1]),
7617 textStyle: function () {
7618 return editor.formatter.getCssText(block[1]);
7619 }
7620 };
7621 });
7622 };
7623 var register$4 = function (editor) {
7624 var blocks = createFormats$1(editor.settings.block_formats || defaultBlocks);
7625 editor.addMenuItem('blockformats', {
7626 text: 'Blocks',
7627 menu: buildMenuItems(editor, blocks)
7628 });
7629 editor.addButton('formatselect', lazyFormatSelectBoxItems(editor, blocks));
7630 };
7631 var FormatSelect = { register: register$4 };
7632
7633 var createCustomMenuItems = function (editor, names) {
7634 var items, nameList;
7635 if (typeof names === 'string') {
7636 nameList = names.split(' ');
7637 } else if (global$2.isArray(names)) {
7638 return flatten(global$2.map(names, function (names) {
7639 return createCustomMenuItems(editor, names);
7640 }));
7641 }
7642 items = global$2.grep(nameList, function (name) {
7643 return name === '|' || name in editor.menuItems;
7644 });
7645 return global$2.map(items, function (name) {
7646 return name === '|' ? { text: '-' } : editor.menuItems[name];
7647 });
7648 };
7649 var isSeparator$1 = function (menuItem) {
7650 return menuItem && menuItem.text === '-';
7651 };
7652 var trimMenuItems = function (menuItems) {
7653 var menuItems2 = filter(menuItems, function (menuItem, i) {
7654 return !isSeparator$1(menuItem) || !isSeparator$1(menuItems[i - 1]);
7655 });
7656 return filter(menuItems2, function (menuItem, i) {
7657 return !isSeparator$1(menuItem) || i > 0 && i < menuItems2.length - 1;
7658 });
7659 };
7660 var createContextMenuItems = function (editor, context) {
7661 var outputMenuItems = [{ text: '-' }];
7662 var menuItems = global$2.grep(editor.menuItems, function (menuItem) {
7663 return menuItem.context === context;
7664 });
7665 global$2.each(menuItems, function (menuItem) {
7666 if (menuItem.separator === 'before') {
7667 outputMenuItems.push({ text: '|' });
7668 }
7669 if (menuItem.prependToContext) {
7670 outputMenuItems.unshift(menuItem);
7671 } else {
7672 outputMenuItems.push(menuItem);
7673 }
7674 if (menuItem.separator === 'after') {
7675 outputMenuItems.push({ text: '|' });
7676 }
7677 });
7678 return outputMenuItems;
7679 };
7680 var createInsertMenu = function (editor) {
7681 var insertButtonItems = editor.settings.insert_button_items;
7682 if (insertButtonItems) {
7683 return trimMenuItems(createCustomMenuItems(editor, insertButtonItems));
7684 } else {
7685 return trimMenuItems(createContextMenuItems(editor, 'insert'));
7686 }
7687 };
7688 var registerButtons$3 = function (editor) {
7689 editor.addButton('insert', {
7690 type: 'menubutton',
7691 icon: 'insert',
7692 menu: [],
7693 oncreatemenu: function () {
7694 this.menu.add(createInsertMenu(editor));
7695 this.menu.renderNew();
7696 }
7697 });
7698 };
7699 var register$5 = function (editor) {
7700 registerButtons$3(editor);
7701 };
7702 var InsertButton = { register: register$5 };
7703
7704 var registerFormatButtons = function (editor) {
7705 global$2.each({
7706 bold: 'Bold',
7707 italic: 'Italic',
7708 underline: 'Underline',
7709 strikethrough: 'Strikethrough',
7710 subscript: 'Subscript',
7711 superscript: 'Superscript'
7712 }, function (text, name) {
7713 editor.addButton(name, {
7714 active: false,
7715 tooltip: text,
7716 onPostRender: postRenderFormatToggle(editor, name),
7717 onclick: toggleFormat(editor, name)
7718 });
7719 });
7720 };
7721 var registerCommandButtons = function (editor) {
7722 global$2.each({
7723 outdent: [
7724 'Decrease indent',
7725 'Outdent'
7726 ],
7727 indent: [
7728 'Increase indent',
7729 'Indent'
7730 ],
7731 cut: [
7732 'Cut',
7733 'Cut'
7734 ],
7735 copy: [
7736 'Copy',
7737 'Copy'
7738 ],
7739 paste: [
7740 'Paste',
7741 'Paste'
7742 ],
7743 help: [
7744 'Help',
7745 'mceHelp'
7746 ],
7747 selectall: [
7748 'Select all',
7749 'SelectAll'
7750 ],
7751 visualaid: [
7752 'Visual aids',
7753 'mceToggleVisualAid'
7754 ],
7755 newdocument: [
7756 'New document',
7757 'mceNewDocument'
7758 ],
7759 removeformat: [
7760 'Clear formatting',
7761 'RemoveFormat'
7762 ],
7763 remove: [
7764 'Remove',
7765 'Delete'
7766 ]
7767 }, function (item, name) {
7768 editor.addButton(name, {
7769 tooltip: item[0],
7770 cmd: item[1]
7771 });
7772 });
7773 };
7774 var registerCommandToggleButtons = function (editor) {
7775 global$2.each({
7776 blockquote: [
7777 'Blockquote',
7778 'mceBlockQuote'
7779 ],
7780 subscript: [
7781 'Subscript',
7782 'Subscript'
7783 ],
7784 superscript: [
7785 'Superscript',
7786 'Superscript'
7787 ]
7788 }, function (item, name) {
7789 editor.addButton(name, {
7790 active: false,
7791 tooltip: item[0],
7792 cmd: item[1],
7793 onPostRender: postRenderFormatToggle(editor, name)
7794 });
7795 });
7796 };
7797 var registerButtons$4 = function (editor) {
7798 registerFormatButtons(editor);
7799 registerCommandButtons(editor);
7800 registerCommandToggleButtons(editor);
7801 };
7802 var registerMenuItems$1 = function (editor) {
7803 global$2.each({
7804 bold: [
7805 'Bold',
7806 'Bold',
7807 'Meta+B'
7808 ],
7809 italic: [
7810 'Italic',
7811 'Italic',
7812 'Meta+I'
7813 ],
7814 underline: [
7815 'Underline',
7816 'Underline',
7817 'Meta+U'
7818 ],
7819 strikethrough: [
7820 'Strikethrough',
7821 'Strikethrough'
7822 ],
7823 subscript: [
7824 'Subscript',
7825 'Subscript'
7826 ],
7827 superscript: [
7828 'Superscript',
7829 'Superscript'
7830 ],
7831 removeformat: [
7832 'Clear formatting',
7833 'RemoveFormat'
7834 ],
7835 newdocument: [
7836 'New document',
7837 'mceNewDocument'
7838 ],
7839 cut: [
7840 'Cut',
7841 'Cut',
7842 'Meta+X'
7843 ],
7844 copy: [
7845 'Copy',
7846 'Copy',
7847 'Meta+C'
7848 ],
7849 paste: [
7850 'Paste',
7851 'Paste',
7852 'Meta+V'
7853 ],
7854 selectall: [
7855 'Select all',
7856 'SelectAll',
7857 'Meta+A'
7858 ]
7859 }, function (item, name) {
7860 editor.addMenuItem(name, {
7861 text: item[0],
7862 icon: name,
7863 shortcut: item[2],
7864 cmd: item[1]
7865 });
7866 });
7867 editor.addMenuItem('codeformat', {
7868 text: 'Code',
7869 icon: 'code',
7870 onclick: toggleFormat(editor, 'code')
7871 });
7872 };
7873 var register$6 = function (editor) {
7874 registerButtons$4(editor);
7875 registerMenuItems$1(editor);
7876 };
7877 var SimpleControls = { register: register$6 };
7878
7879 var toggleUndoRedoState = function (editor, type) {
7880 return function () {
7881 var self = this;
7882 var checkState = function () {
7883 var typeFn = type === 'redo' ? 'hasRedo' : 'hasUndo';
7884 return editor.undoManager ? editor.undoManager[typeFn]() : false;
7885 };
7886 self.disabled(!checkState());
7887 editor.on('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', function () {
7888 self.disabled(editor.readonly || !checkState());
7889 });
7890 };
7891 };
7892 var registerMenuItems$2 = function (editor) {
7893 editor.addMenuItem('undo', {
7894 text: 'Undo',
7895 icon: 'undo',
7896 shortcut: 'Meta+Z',
7897 onPostRender: toggleUndoRedoState(editor, 'undo'),
7898 cmd: 'undo'
7899 });
7900 editor.addMenuItem('redo', {
7901 text: 'Redo',
7902 icon: 'redo',
7903 shortcut: 'Meta+Y',
7904 onPostRender: toggleUndoRedoState(editor, 'redo'),
7905 cmd: 'redo'
7906 });
7907 };
7908 var registerButtons$5 = function (editor) {
7909 editor.addButton('undo', {
7910 tooltip: 'Undo',
7911 onPostRender: toggleUndoRedoState(editor, 'undo'),
7912 cmd: 'undo'
7913 });
7914 editor.addButton('redo', {
7915 tooltip: 'Redo',
7916 onPostRender: toggleUndoRedoState(editor, 'redo'),
7917 cmd: 'redo'
7918 });
7919 };
7920 var register$7 = function (editor) {
7921 registerMenuItems$2(editor);
7922 registerButtons$5(editor);
7923 };
7924 var UndoRedo = { register: register$7 };
7925
7926 var toggleVisualAidState = function (editor) {
7927 return function () {
7928 var self = this;
7929 editor.on('VisualAid', function (e) {
7930 self.active(e.hasVisual);
7931 });
7932 self.active(editor.hasVisual);
7933 };
7934 };
7935 var registerMenuItems$3 = function (editor) {
7936 editor.addMenuItem('visualaid', {
7937 text: 'Visual aids',
7938 selectable: true,
7939 onPostRender: toggleVisualAidState(editor),
7940 cmd: 'mceToggleVisualAid'
7941 });
7942 };
7943 var register$8 = function (editor) {
7944 registerMenuItems$3(editor);
7945 };
7946 var VisualAid = { register: register$8 };
7947
7948 var setupEnvironment = function () {
7949 Widget.tooltips = !global$8.iOS;
7950 Control$1.translate = function (text) {
7951 return global$1.translate(text);
7952 };
7953 };
7954 var setupUiContainer = function (editor) {
7955 if (editor.settings.ui_container) {
7956 global$8.container = descendant(Element.fromDom(domGlobals.document.body), editor.settings.ui_container).fold(constant(null), function (elm) {
7957 return elm.dom();
7958 });
7959 }
7960 };
7961 var setupRtlMode = function (editor) {
7962 if (editor.rtl) {
7963 Control$1.rtl = true;
7964 }
7965 };
7966 var setupHideFloatPanels = function (editor) {
7967 editor.on('mousedown progressstate', function () {
7968 FloatPanel.hideAll();
7969 });
7970 };
7971 var setup$1 = function (editor) {
7972 setupRtlMode(editor);
7973 setupHideFloatPanels(editor);
7974 setupUiContainer(editor);
7975 setupEnvironment();
7976 FormatSelect.register(editor);
7977 Align.register(editor);
7978 SimpleControls.register(editor);
7979 UndoRedo.register(editor);
7980 FontSizeSelect.register(editor);
7981 FontSelect.register(editor);
7982 Formats.register(editor);
7983 VisualAid.register(editor);
7984 InsertButton.register(editor);
7985 };
7986 var FormatControls = { setup: setup$1 };
7987
7988 var GridLayout = AbsoluteLayout.extend({
7989 recalc: function (container) {
7990 var settings, rows, cols, items, contLayoutRect, width, height, rect, ctrlLayoutRect, ctrl, x, y, posX, posY, ctrlSettings, contPaddingBox, align, spacingH, spacingV, alignH, alignV, maxX, maxY;
7991 var colWidths = [];
7992 var rowHeights = [];
7993 var ctrlMinWidth, ctrlMinHeight, availableWidth, availableHeight, reverseRows, idx;
7994 settings = container.settings;
7995 items = container.items().filter(':visible');
7996 contLayoutRect = container.layoutRect();
7997 cols = settings.columns || Math.ceil(Math.sqrt(items.length));
7998 rows = Math.ceil(items.length / cols);
7999 spacingH = settings.spacingH || settings.spacing || 0;
8000 spacingV = settings.spacingV || settings.spacing || 0;
8001 alignH = settings.alignH || settings.align;
8002 alignV = settings.alignV || settings.align;
8003 contPaddingBox = container.paddingBox;
8004 reverseRows = 'reverseRows' in settings ? settings.reverseRows : container.isRtl();
8005 if (alignH && typeof alignH === 'string') {
8006 alignH = [alignH];
8007 }
8008 if (alignV && typeof alignV === 'string') {
8009 alignV = [alignV];
8010 }
8011 for (x = 0; x < cols; x++) {
8012 colWidths.push(0);
8013 }
8014 for (y = 0; y < rows; y++) {
8015 rowHeights.push(0);
8016 }
8017 for (y = 0; y < rows; y++) {
8018 for (x = 0; x < cols; x++) {
8019 ctrl = items[y * cols + x];
8020 if (!ctrl) {
8021 break;
8022 }
8023 ctrlLayoutRect = ctrl.layoutRect();
8024 ctrlMinWidth = ctrlLayoutRect.minW;
8025 ctrlMinHeight = ctrlLayoutRect.minH;
8026 colWidths[x] = ctrlMinWidth > colWidths[x] ? ctrlMinWidth : colWidths[x];
8027 rowHeights[y] = ctrlMinHeight > rowHeights[y] ? ctrlMinHeight : rowHeights[y];
8028 }
8029 }
8030 availableWidth = contLayoutRect.innerW - contPaddingBox.left - contPaddingBox.right;
8031 for (maxX = 0, x = 0; x < cols; x++) {
8032 maxX += colWidths[x] + (x > 0 ? spacingH : 0);
8033 availableWidth -= (x > 0 ? spacingH : 0) + colWidths[x];
8034 }
8035 availableHeight = contLayoutRect.innerH - contPaddingBox.top - contPaddingBox.bottom;
8036 for (maxY = 0, y = 0; y < rows; y++) {
8037 maxY += rowHeights[y] + (y > 0 ? spacingV : 0);
8038 availableHeight -= (y > 0 ? spacingV : 0) + rowHeights[y];
8039 }
8040 maxX += contPaddingBox.left + contPaddingBox.right;
8041 maxY += contPaddingBox.top + contPaddingBox.bottom;
8042 rect = {};
8043 rect.minW = maxX + (contLayoutRect.w - contLayoutRect.innerW);
8044 rect.minH = maxY + (contLayoutRect.h - contLayoutRect.innerH);
8045 rect.contentW = rect.minW - contLayoutRect.deltaW;
8046 rect.contentH = rect.minH - contLayoutRect.deltaH;
8047 rect.minW = Math.min(rect.minW, contLayoutRect.maxW);
8048 rect.minH = Math.min(rect.minH, contLayoutRect.maxH);
8049 rect.minW = Math.max(rect.minW, contLayoutRect.startMinWidth);
8050 rect.minH = Math.max(rect.minH, contLayoutRect.startMinHeight);
8051 if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) {
8052 rect.w = rect.minW;
8053 rect.h = rect.minH;
8054 container.layoutRect(rect);
8055 this.recalc(container);
8056 if (container._lastRect === null) {
8057 var parentCtrl = container.parent();
8058 if (parentCtrl) {
8059 parentCtrl._lastRect = null;
8060 parentCtrl.recalc();
8061 }
8062 }
8063 return;
8064 }
8065 if (contLayoutRect.autoResize) {
8066 rect = container.layoutRect(rect);
8067 rect.contentW = rect.minW - contLayoutRect.deltaW;
8068 rect.contentH = rect.minH - contLayoutRect.deltaH;
8069 }
8070 var flexV;
8071 if (settings.packV === 'start') {
8072 flexV = 0;
8073 } else {
8074 flexV = availableHeight > 0 ? Math.floor(availableHeight / rows) : 0;
8075 }
8076 var totalFlex = 0;
8077 var flexWidths = settings.flexWidths;
8078 if (flexWidths) {
8079 for (x = 0; x < flexWidths.length; x++) {
8080 totalFlex += flexWidths[x];
8081 }
8082 } else {
8083 totalFlex = cols;
8084 }
8085 var ratio = availableWidth / totalFlex;
8086 for (x = 0; x < cols; x++) {
8087 colWidths[x] += flexWidths ? flexWidths[x] * ratio : ratio;
8088 }
8089 posY = contPaddingBox.top;
8090 for (y = 0; y < rows; y++) {
8091 posX = contPaddingBox.left;
8092 height = rowHeights[y] + flexV;
8093 for (x = 0; x < cols; x++) {
8094 if (reverseRows) {
8095 idx = y * cols + cols - 1 - x;
8096 } else {
8097 idx = y * cols + x;
8098 }
8099 ctrl = items[idx];
8100 if (!ctrl) {
8101 break;
8102 }
8103 ctrlSettings = ctrl.settings;
8104 ctrlLayoutRect = ctrl.layoutRect();
8105 width = Math.max(colWidths[x], ctrlLayoutRect.startMinWidth);
8106 ctrlLayoutRect.x = posX;
8107 ctrlLayoutRect.y = posY;
8108 align = ctrlSettings.alignH || (alignH ? alignH[x] || alignH[0] : null);
8109 if (align === 'center') {
8110 ctrlLayoutRect.x = posX + width / 2 - ctrlLayoutRect.w / 2;
8111 } else if (align === 'right') {
8112 ctrlLayoutRect.x = posX + width - ctrlLayoutRect.w;
8113 } else if (align === 'stretch') {
8114 ctrlLayoutRect.w = width;
8115 }
8116 align = ctrlSettings.alignV || (alignV ? alignV[x] || alignV[0] : null);
8117 if (align === 'center') {
8118 ctrlLayoutRect.y = posY + height / 2 - ctrlLayoutRect.h / 2;
8119 } else if (align === 'bottom') {
8120 ctrlLayoutRect.y = posY + height - ctrlLayoutRect.h;
8121 } else if (align === 'stretch') {
8122 ctrlLayoutRect.h = height;
8123 }
8124 ctrl.layoutRect(ctrlLayoutRect);
8125 posX += width + spacingH;
8126 if (ctrl.recalc) {
8127 ctrl.recalc();
8128 }
8129 }
8130 posY += height + spacingV;
8131 }
8132 }
8133 });
8134
8135 var Iframe$1 = Widget.extend({
8136 renderHtml: function () {
8137 var self = this;
8138 self.classes.add('iframe');
8139 self.canFocus = false;
8140 return '<iframe id="' + self._id + '" class="' + self.classes + '" tabindex="-1" src="' + (self.settings.url || 'javascript:\'\'') + '" frameborder="0"></iframe>';
8141 },
8142 src: function (src) {
8143 this.getEl().src = src;
8144 },
8145 html: function (html, callback) {
8146 var self = this, body = this.getEl().contentWindow.document.body;
8147 if (!body) {
8148 global$7.setTimeout(function () {
8149 self.html(html);
8150 });
8151 } else {
8152 body.innerHTML = html;
8153 if (callback) {
8154 callback();
8155 }
8156 }
8157 return this;
8158 }
8159 });
8160
8161 var InfoBox = Widget.extend({
8162 init: function (settings) {
8163 var self = this;
8164 self._super(settings);
8165 self.classes.add('widget').add('infobox');
8166 self.canFocus = false;
8167 },
8168 severity: function (level) {
8169 this.classes.remove('error');
8170 this.classes.remove('warning');
8171 this.classes.remove('success');
8172 this.classes.add(level);
8173 },
8174 help: function (state) {
8175 this.state.set('help', state);
8176 },
8177 renderHtml: function () {
8178 var self = this, prefix = self.classPrefix;
8179 return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + self.encode(self.state.get('text')) + '<button role="button" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-help"></i>' + '</button>' + '</div>' + '</div>';
8180 },
8181 bindStates: function () {
8182 var self = this;
8183 self.state.on('change:text', function (e) {
8184 self.getEl('body').firstChild.data = self.encode(e.value);
8185 if (self.state.get('rendered')) {
8186 self.updateLayoutRect();
8187 }
8188 });
8189 self.state.on('change:help', function (e) {
8190 self.classes.toggle('has-help', e.value);
8191 if (self.state.get('rendered')) {
8192 self.updateLayoutRect();
8193 }
8194 });
8195 return self._super();
8196 }
8197 });
8198
8199 var Label = Widget.extend({
8200 init: function (settings) {
8201 var self = this;
8202 self._super(settings);
8203 self.classes.add('widget').add('label');
8204 self.canFocus = false;
8205 if (settings.multiline) {
8206 self.classes.add('autoscroll');
8207 }
8208 if (settings.strong) {
8209 self.classes.add('strong');
8210 }
8211 },
8212 initLayoutRect: function () {
8213 var self = this, layoutRect = self._super();
8214 if (self.settings.multiline) {
8215 var size = funcs.getSize(self.getEl());
8216 if (size.width > layoutRect.maxW) {
8217 layoutRect.minW = layoutRect.maxW;
8218 self.classes.add('multiline');
8219 }
8220 self.getEl().style.width = layoutRect.minW + 'px';
8221 layoutRect.startMinH = layoutRect.h = layoutRect.minH = Math.min(layoutRect.maxH, funcs.getSize(self.getEl()).height);
8222 }
8223 return layoutRect;
8224 },
8225 repaint: function () {
8226 var self = this;
8227 if (!self.settings.multiline) {
8228 self.getEl().style.lineHeight = self.layoutRect().h + 'px';
8229 }
8230 return self._super();
8231 },
8232 severity: function (level) {
8233 this.classes.remove('error');
8234 this.classes.remove('warning');
8235 this.classes.remove('success');
8236 this.classes.add(level);
8237 },
8238 renderHtml: function () {
8239 var self = this;
8240 var targetCtrl, forName, forId = self.settings.forId;
8241 var text = self.settings.html ? self.settings.html : self.encode(self.state.get('text'));
8242 if (!forId && (forName = self.settings.forName)) {
8243 targetCtrl = self.getRoot().find('#' + forName)[0];
8244 if (targetCtrl) {
8245 forId = targetCtrl._id;
8246 }
8247 }
8248 if (forId) {
8249 return '<label id="' + self._id + '" class="' + self.classes + '"' + (forId ? ' for="' + forId + '"' : '') + '>' + text + '</label>';
8250 }
8251 return '<span id="' + self._id + '" class="' + self.classes + '">' + text + '</span>';
8252 },
8253 bindStates: function () {
8254 var self = this;
8255 self.state.on('change:text', function (e) {
8256 self.innerHtml(self.encode(e.value));
8257 if (self.state.get('rendered')) {
8258 self.updateLayoutRect();
8259 }
8260 });
8261 return self._super();
8262 }
8263 });
8264
8265 var Toolbar$1 = Container.extend({
8266 Defaults: {
8267 role: 'toolbar',
8268 layout: 'flow'
8269 },
8270 init: function (settings) {
8271 var self = this;
8272 self._super(settings);
8273 self.classes.add('toolbar');
8274 },
8275 postRender: function () {
8276 var self = this;
8277 self.items().each(function (ctrl) {
8278 ctrl.classes.add('toolbar-item');
8279 });
8280 return self._super();
8281 }
8282 });
8283
8284 var MenuBar = Toolbar$1.extend({
8285 Defaults: {
8286 role: 'menubar',
8287 containerCls: 'menubar',
8288 ariaRoot: true,
8289 defaults: { type: 'menubutton' }
8290 }
8291 });
8292
8293 function isChildOf$1(node, parent) {
8294 while (node) {
8295 if (parent === node) {
8296 return true;
8297 }
8298 node = node.parentNode;
8299 }
8300 return false;
8301 }
8302 var MenuButton = Button.extend({
8303 init: function (settings) {
8304 var self = this;
8305 self._renderOpen = true;
8306 self._super(settings);
8307 settings = self.settings;
8308 self.classes.add('menubtn');
8309 if (settings.fixedWidth) {
8310 self.classes.add('fixed-width');
8311 }
8312 self.aria('haspopup', true);
8313 self.state.set('menu', settings.menu || self.render());
8314 },
8315 showMenu: function (toggle) {
8316 var self = this;
8317 var menu;
8318 if (self.menu && self.menu.visible() && toggle !== false) {
8319 return self.hideMenu();
8320 }
8321 if (!self.menu) {
8322 menu = self.state.get('menu') || [];
8323 self.classes.add('opened');
8324 if (menu.length) {
8325 menu = {
8326 type: 'menu',
8327 animate: true,
8328 items: menu
8329 };
8330 } else {
8331 menu.type = menu.type || 'menu';
8332 menu.animate = true;
8333 }
8334 if (!menu.renderTo) {
8335 self.menu = global$4.create(menu).parent(self).renderTo();
8336 } else {
8337 self.menu = menu.parent(self).show().renderTo();
8338 }
8339 self.fire('createmenu');
8340 self.menu.reflow();
8341 self.menu.on('cancel', function (e) {
8342 if (e.control.parent() === self.menu) {
8343 e.stopPropagation();
8344 self.focus();
8345 self.hideMenu();
8346 }
8347 });
8348 self.menu.on('select', function () {
8349 self.focus();
8350 });
8351 self.menu.on('show hide', function (e) {
8352 if (e.type === 'hide' && e.control.parent() === self) {
8353 self.classes.remove('opened-under');
8354 }
8355 if (e.control === self.menu) {
8356 self.activeMenu(e.type === 'show');
8357 self.classes.toggle('opened', e.type === 'show');
8358 }
8359 self.aria('expanded', e.type === 'show');
8360 }).fire('show');
8361 }
8362 self.menu.show();
8363 self.menu.layoutRect({ w: self.layoutRect().w });
8364 self.menu.repaint();
8365 self.menu.moveRel(self.getEl(), self.isRtl() ? [
8366 'br-tr',
8367 'tr-br'
8368 ] : [
8369 'bl-tl',
8370 'tl-bl'
8371 ]);
8372 var menuLayoutRect = self.menu.layoutRect();
8373 var selfBottom = self.$el.offset().top + self.layoutRect().h;
8374 if (selfBottom > menuLayoutRect.y && selfBottom < menuLayoutRect.y + menuLayoutRect.h) {
8375 self.classes.add('opened-under');
8376 }
8377 self.fire('showmenu');
8378 },
8379 hideMenu: function () {
8380 var self = this;
8381 if (self.menu) {
8382 self.menu.items().each(function (item) {
8383 if (item.hideMenu) {
8384 item.hideMenu();
8385 }
8386 });
8387 self.menu.hide();
8388 }
8389 },
8390 activeMenu: function (state) {
8391 this.classes.toggle('active', state);
8392 },
8393 renderHtml: function () {
8394 var self = this, id = self._id, prefix = self.classPrefix;
8395 var icon = self.settings.icon, image;
8396 var text = self.state.get('text');
8397 var textHtml = '';
8398 image = self.settings.image;
8399 if (image) {
8400 icon = 'none';
8401 if (typeof image !== 'string') {
8402 image = domGlobals.window.getSelection ? image[0] : image[1];
8403 }
8404 image = ' style="background-image: url(\'' + image + '\')"';
8405 } else {
8406 image = '';
8407 }
8408 if (text) {
8409 self.classes.add('btn-has-text');
8410 textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
8411 }
8412 icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
8413 self.aria('role', self.parent() instanceof MenuBar ? 'menuitem' : 'button');
8414 return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1" aria-labelledby="' + id + '">' + '<button id="' + id + '-open" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
8415 },
8416 postRender: function () {
8417 var self = this;
8418 self.on('click', function (e) {
8419 if (e.control === self && isChildOf$1(e.target, self.getEl())) {
8420 self.focus();
8421 self.showMenu(!e.aria);
8422 if (e.aria) {
8423 self.menu.items().filter(':visible')[0].focus();
8424 }
8425 }
8426 });
8427 self.on('mouseenter', function (e) {
8428 var overCtrl = e.control;
8429 var parent = self.parent();
8430 var hasVisibleSiblingMenu;
8431 if (overCtrl && parent && overCtrl instanceof MenuButton && overCtrl.parent() === parent) {
8432 parent.items().filter('MenuButton').each(function (ctrl) {
8433 if (ctrl.hideMenu && ctrl !== overCtrl) {
8434 if (ctrl.menu && ctrl.menu.visible()) {
8435 hasVisibleSiblingMenu = true;
8436 }
8437 ctrl.hideMenu();
8438 }
8439 });
8440 if (hasVisibleSiblingMenu) {
8441 overCtrl.focus();
8442 overCtrl.showMenu();
8443 }
8444 }
8445 });
8446 return self._super();
8447 },
8448 bindStates: function () {
8449 var self = this;
8450 self.state.on('change:menu', function () {
8451 if (self.menu) {
8452 self.menu.remove();
8453 }
8454 self.menu = null;
8455 });
8456 return self._super();
8457 },
8458 remove: function () {
8459 this._super();
8460 if (this.menu) {
8461 this.menu.remove();
8462 }
8463 }
8464 });
8465
8466 var Menu = FloatPanel.extend({
8467 Defaults: {
8468 defaultType: 'menuitem',
8469 border: 1,
8470 layout: 'stack',
8471 role: 'application',
8472 bodyRole: 'menu',
8473 ariaRoot: true
8474 },
8475 init: function (settings) {
8476 var self = this;
8477 settings.autohide = true;
8478 settings.constrainToViewport = true;
8479 if (typeof settings.items === 'function') {
8480 settings.itemsFactory = settings.items;
8481 settings.items = [];
8482 }
8483 if (settings.itemDefaults) {
8484 var items = settings.items;
8485 var i = items.length;
8486 while (i--) {
8487 items[i] = global$2.extend({}, settings.itemDefaults, items[i]);
8488 }
8489 }
8490 self._super(settings);
8491 self.classes.add('menu');
8492 if (settings.animate && global$8.ie !== 11) {
8493 self.classes.add('animate');
8494 }
8495 },
8496 repaint: function () {
8497 this.classes.toggle('menu-align', true);
8498 this._super();
8499 this.getEl().style.height = '';
8500 this.getEl('body').style.height = '';
8501 return this;
8502 },
8503 cancel: function () {
8504 var self = this;
8505 self.hideAll();
8506 self.fire('select');
8507 },
8508 load: function () {
8509 var self = this;
8510 var time, factory;
8511 function hideThrobber() {
8512 if (self.throbber) {
8513 self.throbber.hide();
8514 self.throbber = null;
8515 }
8516 }
8517 factory = self.settings.itemsFactory;
8518 if (!factory) {
8519 return;
8520 }
8521 if (!self.throbber) {
8522 self.throbber = new Throbber(self.getEl('body'), true);
8523 if (self.items().length === 0) {
8524 self.throbber.show();
8525 self.fire('loading');
8526 } else {
8527 self.throbber.show(100, function () {
8528 self.items().remove();
8529 self.fire('loading');
8530 });
8531 }
8532 self.on('hide close', hideThrobber);
8533 }
8534 self.requestTime = time = new Date().getTime();
8535 self.settings.itemsFactory(function (items) {
8536 if (items.length === 0) {
8537 self.hide();
8538 return;
8539 }
8540 if (self.requestTime !== time) {
8541 return;
8542 }
8543 self.getEl().style.width = '';
8544 self.getEl('body').style.width = '';
8545 hideThrobber();
8546 self.items().remove();
8547 self.getEl('body').innerHTML = '';
8548 self.add(items);
8549 self.renderNew();
8550 self.fire('loaded');
8551 });
8552 },
8553 hideAll: function () {
8554 var self = this;
8555 this.find('menuitem').exec('hideMenu');
8556 return self._super();
8557 },
8558 preRender: function () {
8559 var self = this;
8560 self.items().each(function (ctrl) {
8561 var settings = ctrl.settings;
8562 if (settings.icon || settings.image || settings.selectable) {
8563 self._hasIcons = true;
8564 return false;
8565 }
8566 });
8567 if (self.settings.itemsFactory) {
8568 self.on('postrender', function () {
8569 if (self.settings.itemsFactory) {
8570 self.load();
8571 }
8572 });
8573 }
8574 self.on('show hide', function (e) {
8575 if (e.control === self) {
8576 if (e.type === 'show') {
8577 global$7.setTimeout(function () {
8578 self.classes.add('in');
8579 }, 0);
8580 } else {
8581 self.classes.remove('in');
8582 }
8583 }
8584 });
8585 return self._super();
8586 }
8587 });
8588
8589 var ListBox = MenuButton.extend({
8590 init: function (settings) {
8591 var self = this;
8592 var values, selected, selectedText, lastItemCtrl;
8593 function setSelected(menuValues) {
8594 for (var i = 0; i < menuValues.length; i++) {
8595 selected = menuValues[i].selected || settings.value === menuValues[i].value;
8596 if (selected) {
8597 selectedText = selectedText || menuValues[i].text;
8598 self.state.set('value', menuValues[i].value);
8599 return true;
8600 }
8601 if (menuValues[i].menu) {
8602 if (setSelected(menuValues[i].menu)) {
8603 return true;
8604 }
8605 }
8606 }
8607 }
8608 self._super(settings);
8609 settings = self.settings;
8610 self._values = values = settings.values;
8611 if (values) {
8612 if (typeof settings.value !== 'undefined') {
8613 setSelected(values);
8614 }
8615 if (!selected && values.length > 0) {
8616 selectedText = values[0].text;
8617 self.state.set('value', values[0].value);
8618 }
8619 self.state.set('menu', values);
8620 }
8621 self.state.set('text', settings.text || selectedText);
8622 self.classes.add('listbox');
8623 self.on('select', function (e) {
8624 var ctrl = e.control;
8625 if (lastItemCtrl) {
8626 e.lastControl = lastItemCtrl;
8627 }
8628 if (settings.multiple) {
8629 ctrl.active(!ctrl.active());
8630 } else {
8631 self.value(e.control.value());
8632 }
8633 lastItemCtrl = ctrl;
8634 });
8635 },
8636 value: function (value) {
8637 if (arguments.length === 0) {
8638 return this.state.get('value');
8639 }
8640 if (typeof value === 'undefined') {
8641 return this;
8642 }
8643 function valueExists(values) {
8644 return exists(values, function (a) {
8645 return a.menu ? valueExists(a.menu) : a.value === value;
8646 });
8647 }
8648 if (this.settings.values) {
8649 if (valueExists(this.settings.values)) {
8650 this.state.set('value', value);
8651 } else if (value === null) {
8652 this.state.set('value', null);
8653 }
8654 } else {
8655 this.state.set('value', value);
8656 }
8657 return this;
8658 },
8659 bindStates: function () {
8660 var self = this;
8661 function activateMenuItemsByValue(menu, value) {
8662 if (menu instanceof Menu) {
8663 menu.items().each(function (ctrl) {
8664 if (!ctrl.hasMenus()) {
8665 ctrl.active(ctrl.value() === value);
8666 }
8667 });
8668 }
8669 }
8670 function getSelectedItem(menuValues, value) {
8671 var selectedItem;
8672 if (!menuValues) {
8673 return;
8674 }
8675 for (var i = 0; i < menuValues.length; i++) {
8676 if (menuValues[i].value === value) {
8677 return menuValues[i];
8678 }
8679 if (menuValues[i].menu) {
8680 selectedItem = getSelectedItem(menuValues[i].menu, value);
8681 if (selectedItem) {
8682 return selectedItem;
8683 }
8684 }
8685 }
8686 }
8687 self.on('show', function (e) {
8688 activateMenuItemsByValue(e.control, self.value());
8689 });
8690 self.state.on('change:value', function (e) {
8691 var selectedItem = getSelectedItem(self.state.get('menu'), e.value);
8692 if (selectedItem) {
8693 self.text(selectedItem.text);
8694 } else {
8695 self.text(self.settings.text);
8696 }
8697 });
8698 return self._super();
8699 }
8700 });
8701
8702 var toggleTextStyle = function (ctrl, state) {
8703 var textStyle = ctrl._textStyle;
8704 if (textStyle) {
8705 var textElm = ctrl.getEl('text');
8706 textElm.setAttribute('style', textStyle);
8707 if (state) {
8708 textElm.style.color = '';
8709 textElm.style.backgroundColor = '';
8710 }
8711 }
8712 };
8713 var MenuItem = Widget.extend({
8714 Defaults: {
8715 border: 0,
8716 role: 'menuitem'
8717 },
8718 init: function (settings) {
8719 var self = this;
8720 var text;
8721 self._super(settings);
8722 settings = self.settings;
8723 self.classes.add('menu-item');
8724 if (settings.menu) {
8725 self.classes.add('menu-item-expand');
8726 }
8727 if (settings.preview) {
8728 self.classes.add('menu-item-preview');
8729 }
8730 text = self.state.get('text');
8731 if (text === '-' || text === '|') {
8732 self.classes.add('menu-item-sep');
8733 self.aria('role', 'separator');
8734 self.state.set('text', '-');
8735 }
8736 if (settings.selectable) {
8737 self.aria('role', 'menuitemcheckbox');
8738 self.classes.add('menu-item-checkbox');
8739 settings.icon = 'selected';
8740 }
8741 if (!settings.preview && !settings.selectable) {
8742 self.classes.add('menu-item-normal');
8743 }
8744 self.on('mousedown', function (e) {
8745 e.preventDefault();
8746 });
8747 if (settings.menu && !settings.ariaHideMenu) {
8748 self.aria('haspopup', true);
8749 }
8750 },
8751 hasMenus: function () {
8752 return !!this.settings.menu;
8753 },
8754 showMenu: function () {
8755 var self = this;
8756 var settings = self.settings;
8757 var menu;
8758 var parent = self.parent();
8759 parent.items().each(function (ctrl) {
8760 if (ctrl !== self) {
8761 ctrl.hideMenu();
8762 }
8763 });
8764 if (settings.menu) {
8765 menu = self.menu;
8766 if (!menu) {
8767 menu = settings.menu;
8768 if (menu.length) {
8769 menu = {
8770 type: 'menu',
8771 items: menu
8772 };
8773 } else {
8774 menu.type = menu.type || 'menu';
8775 }
8776 if (parent.settings.itemDefaults) {
8777 menu.itemDefaults = parent.settings.itemDefaults;
8778 }
8779 menu = self.menu = global$4.create(menu).parent(self).renderTo();
8780 menu.reflow();
8781 menu.on('cancel', function (e) {
8782 e.stopPropagation();
8783 self.focus();
8784 menu.hide();
8785 });
8786 menu.on('show hide', function (e) {
8787 if (e.control.items) {
8788 e.control.items().each(function (ctrl) {
8789 ctrl.active(ctrl.settings.selected);
8790 });
8791 }
8792 }).fire('show');
8793 menu.on('hide', function (e) {
8794 if (e.control === menu) {
8795 self.classes.remove('selected');
8796 }
8797 });
8798 menu.submenu = true;
8799 } else {
8800 menu.show();
8801 }
8802 menu._parentMenu = parent;
8803 menu.classes.add('menu-sub');
8804 var rel = menu.testMoveRel(self.getEl(), self.isRtl() ? [
8805 'tl-tr',
8806 'bl-br',
8807 'tr-tl',
8808 'br-bl'
8809 ] : [
8810 'tr-tl',
8811 'br-bl',
8812 'tl-tr',
8813 'bl-br'
8814 ]);
8815 menu.moveRel(self.getEl(), rel);
8816 menu.rel = rel;
8817 rel = 'menu-sub-' + rel;
8818 menu.classes.remove(menu._lastRel).add(rel);
8819 menu._lastRel = rel;
8820 self.classes.add('selected');
8821 self.aria('expanded', true);
8822 }
8823 },
8824 hideMenu: function () {
8825 var self = this;
8826 if (self.menu) {
8827 self.menu.items().each(function (item) {
8828 if (item.hideMenu) {
8829 item.hideMenu();
8830 }
8831 });
8832 self.menu.hide();
8833 self.aria('expanded', false);
8834 }
8835 return self;
8836 },
8837 renderHtml: function () {
8838 var self = this;
8839 var id = self._id;
8840 var settings = self.settings;
8841 var prefix = self.classPrefix;
8842 var text = self.state.get('text');
8843 var icon = self.settings.icon, image = '', shortcut = settings.shortcut;
8844 var url = self.encode(settings.url), iconHtml = '';
8845 function convertShortcut(shortcut) {
8846 var i, value, replace = {};
8847 if (global$8.mac) {
8848 replace = {
8849 alt: '&#x2325;',
8850 ctrl: '&#x2318;',
8851 shift: '&#x21E7;',
8852 meta: '&#x2318;'
8853 };
8854 } else {
8855 replace = { meta: 'Ctrl' };
8856 }
8857 shortcut = shortcut.split('+');
8858 for (i = 0; i < shortcut.length; i++) {
8859 value = replace[shortcut[i].toLowerCase()];
8860 if (value) {
8861 shortcut[i] = value;
8862 }
8863 }
8864 return shortcut.join('+');
8865 }
8866 function escapeRegExp(str) {
8867 return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
8868 }
8869 function markMatches(text) {
8870 var match = settings.match || '';
8871 return match ? text.replace(new RegExp(escapeRegExp(match), 'gi'), function (match) {
8872 return '!mce~match[' + match + ']mce~match!';
8873 }) : text;
8874 }
8875 function boldMatches(text) {
8876 return text.replace(new RegExp(escapeRegExp('!mce~match['), 'g'), '<b>').replace(new RegExp(escapeRegExp(']mce~match!'), 'g'), '</b>');
8877 }
8878 if (icon) {
8879 self.parent().classes.add('menu-has-icons');
8880 }
8881 if (settings.image) {
8882 image = ' style="background-image: url(\'' + settings.image + '\')"';
8883 }
8884 if (shortcut) {
8885 shortcut = convertShortcut(shortcut);
8886 }
8887 icon = prefix + 'ico ' + prefix + 'i-' + (self.settings.icon || 'none');
8888 iconHtml = text !== '-' ? '<i class="' + icon + '"' + image + '></i>\xA0' : '';
8889 text = boldMatches(self.encode(markMatches(text)));
8890 url = boldMatches(self.encode(markMatches(url)));
8891 return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1">' + iconHtml + (text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') + (shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' + shortcut + '</div>' : '') + (settings.menu ? '<div class="' + prefix + 'caret"></div>' : '') + (url ? '<div class="' + prefix + 'menu-item-link">' + url + '</div>' : '') + '</div>';
8892 },
8893 postRender: function () {
8894 var self = this, settings = self.settings;
8895 var textStyle = settings.textStyle;
8896 if (typeof textStyle === 'function') {
8897 textStyle = textStyle.call(this);
8898 }
8899 if (textStyle) {
8900 var textElm = self.getEl('text');
8901 if (textElm) {
8902 textElm.setAttribute('style', textStyle);
8903 self._textStyle = textStyle;
8904 }
8905 }
8906 self.on('mouseenter click', function (e) {
8907 if (e.control === self) {
8908 if (!settings.menu && e.type === 'click') {
8909 self.fire('select');
8910 global$7.requestAnimationFrame(function () {
8911 self.parent().hideAll();
8912 });
8913 } else {
8914 self.showMenu();
8915 if (e.aria) {
8916 self.menu.focus(true);
8917 }
8918 }
8919 }
8920 });
8921 self._super();
8922 return self;
8923 },
8924 hover: function () {
8925 var self = this;
8926 self.parent().items().each(function (ctrl) {
8927 ctrl.classes.remove('selected');
8928 });
8929 self.classes.toggle('selected', true);
8930 return self;
8931 },
8932 active: function (state) {
8933 toggleTextStyle(this, state);
8934 if (typeof state !== 'undefined') {
8935 this.aria('checked', state);
8936 }
8937 return this._super(state);
8938 },
8939 remove: function () {
8940 this._super();
8941 if (this.menu) {
8942 this.menu.remove();
8943 }
8944 }
8945 });
8946
8947 var Radio = Checkbox.extend({
8948 Defaults: {
8949 classes: 'radio',
8950 role: 'radio'
8951 }
8952 });
8953
8954 var ResizeHandle = Widget.extend({
8955 renderHtml: function () {
8956 var self = this, prefix = self.classPrefix;
8957 self.classes.add('resizehandle');
8958 if (self.settings.direction === 'both') {
8959 self.classes.add('resizehandle-both');
8960 }
8961 self.canFocus = false;
8962 return '<div id="' + self._id + '" class="' + self.classes + '">' + '<i class="' + prefix + 'ico ' + prefix + 'i-resize"></i>' + '</div>';
8963 },
8964 postRender: function () {
8965 var self = this;
8966 self._super();
8967 self.resizeDragHelper = new DragHelper(this._id, {
8968 start: function () {
8969 self.fire('ResizeStart');
8970 },
8971 drag: function (e) {
8972 if (self.settings.direction !== 'both') {
8973 e.deltaX = 0;
8974 }
8975 self.fire('Resize', e);
8976 },
8977 stop: function () {
8978 self.fire('ResizeEnd');
8979 }
8980 });
8981 },
8982 remove: function () {
8983 if (this.resizeDragHelper) {
8984 this.resizeDragHelper.destroy();
8985 }
8986 return this._super();
8987 }
8988 });
8989
8990 function createOptions(options) {
8991 var strOptions = '';
8992 if (options) {
8993 for (var i = 0; i < options.length; i++) {
8994 strOptions += '<option value="' + options[i] + '">' + options[i] + '</option>';
8995 }
8996 }
8997 return strOptions;
8998 }
8999 var SelectBox = Widget.extend({
9000 Defaults: {
9001 classes: 'selectbox',
9002 role: 'selectbox',
9003 options: []
9004 },
9005 init: function (settings) {
9006 var self = this;
9007 self._super(settings);
9008 if (self.settings.size) {
9009 self.size = self.settings.size;
9010 }
9011 if (self.settings.options) {
9012 self._options = self.settings.options;
9013 }
9014 self.on('keydown', function (e) {
9015 var rootControl;
9016 if (e.keyCode === 13) {
9017 e.preventDefault();
9018 self.parents().reverse().each(function (ctrl) {
9019 if (ctrl.toJSON) {
9020 rootControl = ctrl;
9021 return false;
9022 }
9023 });
9024 self.fire('submit', { data: rootControl.toJSON() });
9025 }
9026 });
9027 },
9028 options: function (state) {
9029 if (!arguments.length) {
9030 return this.state.get('options');
9031 }
9032 this.state.set('options', state);
9033 return this;
9034 },
9035 renderHtml: function () {
9036 var self = this;
9037 var options, size = '';
9038 options = createOptions(self._options);
9039 if (self.size) {
9040 size = ' size = "' + self.size + '"';
9041 }
9042 return '<select id="' + self._id + '" class="' + self.classes + '"' + size + '>' + options + '</select>';
9043 },
9044 bindStates: function () {
9045 var self = this;
9046 self.state.on('change:options', function (e) {
9047 self.getEl().innerHTML = createOptions(e.value);
9048 });
9049 return self._super();
9050 }
9051 });
9052
9053 function constrain(value, minVal, maxVal) {
9054 if (value < minVal) {
9055 value = minVal;
9056 }
9057 if (value > maxVal) {
9058 value = maxVal;
9059 }
9060 return value;
9061 }
9062 function setAriaProp(el, name, value) {
9063 el.setAttribute('aria-' + name, value);
9064 }
9065 function updateSliderHandle(ctrl, value) {
9066 var maxHandlePos, shortSizeName, sizeName, stylePosName, styleValue, handleEl;
9067 if (ctrl.settings.orientation === 'v') {
9068 stylePosName = 'top';
9069 sizeName = 'height';
9070 shortSizeName = 'h';
9071 } else {
9072 stylePosName = 'left';
9073 sizeName = 'width';
9074 shortSizeName = 'w';
9075 }
9076 handleEl = ctrl.getEl('handle');
9077 maxHandlePos = (ctrl.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName];
9078 styleValue = maxHandlePos * ((value - ctrl._minValue) / (ctrl._maxValue - ctrl._minValue)) + 'px';
9079 handleEl.style[stylePosName] = styleValue;
9080 handleEl.style.height = ctrl.layoutRect().h + 'px';
9081 setAriaProp(handleEl, 'valuenow', value);
9082 setAriaProp(handleEl, 'valuetext', '' + ctrl.settings.previewFilter(value));
9083 setAriaProp(handleEl, 'valuemin', ctrl._minValue);
9084 setAriaProp(handleEl, 'valuemax', ctrl._maxValue);
9085 }
9086 var Slider = Widget.extend({
9087 init: function (settings) {
9088 var self = this;
9089 if (!settings.previewFilter) {
9090 settings.previewFilter = function (value) {
9091 return Math.round(value * 100) / 100;
9092 };
9093 }
9094 self._super(settings);
9095 self.classes.add('slider');
9096 if (settings.orientation === 'v') {
9097 self.classes.add('vertical');
9098 }
9099 self._minValue = isNumber(settings.minValue) ? settings.minValue : 0;
9100 self._maxValue = isNumber(settings.maxValue) ? settings.maxValue : 100;
9101 self._initValue = self.state.get('value');
9102 },
9103 renderHtml: function () {
9104 var self = this, id = self._id, prefix = self.classPrefix;
9105 return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-handle" class="' + prefix + 'slider-handle" role="slider" tabindex="-1"></div>' + '</div>';
9106 },
9107 reset: function () {
9108 this.value(this._initValue).repaint();
9109 },
9110 postRender: function () {
9111 var self = this;
9112 var minValue, maxValue, screenCordName, stylePosName, sizeName, shortSizeName;
9113 function toFraction(min, max, val) {
9114 return (val + min) / (max - min);
9115 }
9116 function fromFraction(min, max, val) {
9117 return val * (max - min) - min;
9118 }
9119 function handleKeyboard(minValue, maxValue) {
9120 function alter(delta) {
9121 var value;
9122 value = self.value();
9123 value = fromFraction(minValue, maxValue, toFraction(minValue, maxValue, value) + delta * 0.05);
9124 value = constrain(value, minValue, maxValue);
9125 self.value(value);
9126 self.fire('dragstart', { value: value });
9127 self.fire('drag', { value: value });
9128 self.fire('dragend', { value: value });
9129 }
9130 self.on('keydown', function (e) {
9131 switch (e.keyCode) {
9132 case 37:
9133 case 38:
9134 alter(-1);
9135 break;
9136 case 39:
9137 case 40:
9138 alter(1);
9139 break;
9140 }
9141 });
9142 }
9143 function handleDrag(minValue, maxValue, handleEl) {
9144 var startPos, startHandlePos, maxHandlePos, handlePos, value;
9145 self._dragHelper = new DragHelper(self._id, {
9146 handle: self._id + '-handle',
9147 start: function (e) {
9148 startPos = e[screenCordName];
9149 startHandlePos = parseInt(self.getEl('handle').style[stylePosName], 10);
9150 maxHandlePos = (self.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName];
9151 self.fire('dragstart', { value: value });
9152 },
9153 drag: function (e) {
9154 var delta = e[screenCordName] - startPos;
9155 handlePos = constrain(startHandlePos + delta, 0, maxHandlePos);
9156 handleEl.style[stylePosName] = handlePos + 'px';
9157 value = minValue + handlePos / maxHandlePos * (maxValue - minValue);
9158 self.value(value);
9159 self.tooltip().text('' + self.settings.previewFilter(value)).show().moveRel(handleEl, 'bc tc');
9160 self.fire('drag', { value: value });
9161 },
9162 stop: function () {
9163 self.tooltip().hide();
9164 self.fire('dragend', { value: value });
9165 }
9166 });
9167 }
9168 minValue = self._minValue;
9169 maxValue = self._maxValue;
9170 if (self.settings.orientation === 'v') {
9171 screenCordName = 'screenY';
9172 stylePosName = 'top';
9173 sizeName = 'height';
9174 shortSizeName = 'h';
9175 } else {
9176 screenCordName = 'screenX';
9177 stylePosName = 'left';
9178 sizeName = 'width';
9179 shortSizeName = 'w';
9180 }
9181 self._super();
9182 handleKeyboard(minValue, maxValue);
9183 handleDrag(minValue, maxValue, self.getEl('handle'));
9184 },
9185 repaint: function () {
9186 this._super();
9187 updateSliderHandle(this, this.value());
9188 },
9189 bindStates: function () {
9190 var self = this;
9191 self.state.on('change:value', function (e) {
9192 updateSliderHandle(self, e.value);
9193 });
9194 return self._super();
9195 }
9196 });
9197
9198 var Spacer = Widget.extend({
9199 renderHtml: function () {
9200 var self = this;
9201 self.classes.add('spacer');
9202 self.canFocus = false;
9203 return '<div id="' + self._id + '" class="' + self.classes + '"></div>';
9204 }
9205 });
9206
9207 var SplitButton = MenuButton.extend({
9208 Defaults: {
9209 classes: 'widget btn splitbtn',
9210 role: 'button'
9211 },
9212 repaint: function () {
9213 var self = this;
9214 var elm = self.getEl();
9215 var rect = self.layoutRect();
9216 var mainButtonElm, menuButtonElm;
9217 self._super();
9218 mainButtonElm = elm.firstChild;
9219 menuButtonElm = elm.lastChild;
9220 global$9(mainButtonElm).css({
9221 width: rect.w - funcs.getSize(menuButtonElm).width,
9222 height: rect.h - 2
9223 });
9224 global$9(menuButtonElm).css({ height: rect.h - 2 });
9225 return self;
9226 },
9227 activeMenu: function (state) {
9228 var self = this;
9229 global$9(self.getEl().lastChild).toggleClass(self.classPrefix + 'active', state);
9230 },
9231 renderHtml: function () {
9232 var self = this;
9233 var id = self._id;
9234 var prefix = self.classPrefix;
9235 var image;
9236 var icon = self.state.get('icon');
9237 var text = self.state.get('text');
9238 var settings = self.settings;
9239 var textHtml = '', ariaPressed;
9240 image = settings.image;
9241 if (image) {
9242 icon = 'none';
9243 if (typeof image !== 'string') {
9244 image = domGlobals.window.getSelection ? image[0] : image[1];
9245 }
9246 image = ' style="background-image: url(\'' + image + '\')"';
9247 } else {
9248 image = '';
9249 }
9250 icon = settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
9251 if (text) {
9252 self.classes.add('btn-has-text');
9253 textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
9254 }
9255 ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
9256 return '<div id="' + id + '" class="' + self.classes + '" role="button"' + ariaPressed + ' tabindex="-1">' + '<button type="button" hidefocus="1" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + (self._menuBtnText ? (icon ? '\xA0' : '') + self._menuBtnText : '') + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
9257 },
9258 postRender: function () {
9259 var self = this, onClickHandler = self.settings.onclick;
9260 self.on('click', function (e) {
9261 var node = e.target;
9262 if (e.control === this) {
9263 while (node) {
9264 if (e.aria && e.aria.key !== 'down' || node.nodeName === 'BUTTON' && node.className.indexOf('open') === -1) {
9265 e.stopImmediatePropagation();
9266 if (onClickHandler) {
9267 onClickHandler.call(this, e);
9268 }
9269 return;
9270 }
9271 node = node.parentNode;
9272 }
9273 }
9274 });
9275 delete self.settings.onclick;
9276 return self._super();
9277 }
9278 });
9279
9280 var StackLayout = FlowLayout.extend({
9281 Defaults: {
9282 containerClass: 'stack-layout',
9283 controlClass: 'stack-layout-item',
9284 endClass: 'break'
9285 },
9286 isNative: function () {
9287 return true;
9288 }
9289 });
9290
9291 var TabPanel = Panel.extend({
9292 Defaults: {
9293 layout: 'absolute',
9294 defaults: { type: 'panel' }
9295 },
9296 activateTab: function (idx) {
9297 var activeTabElm;
9298 if (this.activeTabId) {
9299 activeTabElm = this.getEl(this.activeTabId);
9300 global$9(activeTabElm).removeClass(this.classPrefix + 'active');
9301 activeTabElm.setAttribute('aria-selected', 'false');
9302 }
9303 this.activeTabId = 't' + idx;
9304 activeTabElm = this.getEl('t' + idx);
9305 activeTabElm.setAttribute('aria-selected', 'true');
9306 global$9(activeTabElm).addClass(this.classPrefix + 'active');
9307 this.items()[idx].show().fire('showtab');
9308 this.reflow();
9309 this.items().each(function (item, i) {
9310 if (idx !== i) {
9311 item.hide();
9312 }
9313 });
9314 },
9315 renderHtml: function () {
9316 var self = this;
9317 var layout = self._layout;
9318 var tabsHtml = '';
9319 var prefix = self.classPrefix;
9320 self.preRender();
9321 layout.preRender(self);
9322 self.items().each(function (ctrl, i) {
9323 var id = self._id + '-t' + i;
9324 ctrl.aria('role', 'tabpanel');
9325 ctrl.aria('labelledby', id);
9326 tabsHtml += '<div id="' + id + '" class="' + prefix + 'tab" ' + 'unselectable="on" role="tab" aria-controls="' + ctrl._id + '" aria-selected="false" tabIndex="-1">' + self.encode(ctrl.settings.title) + '</div>';
9327 });
9328 return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + '<div id="' + self._id + '-head" class="' + prefix + 'tabs" role="tablist">' + tabsHtml + '</div>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>' + '</div>';
9329 },
9330 postRender: function () {
9331 var self = this;
9332 self._super();
9333 self.settings.activeTab = self.settings.activeTab || 0;
9334 self.activateTab(self.settings.activeTab);
9335 this.on('click', function (e) {
9336 var targetParent = e.target.parentNode;
9337 if (targetParent && targetParent.id === self._id + '-head') {
9338 var i = targetParent.childNodes.length;
9339 while (i--) {
9340 if (targetParent.childNodes[i] === e.target) {
9341 self.activateTab(i);
9342 }
9343 }
9344 }
9345 });
9346 },
9347 initLayoutRect: function () {
9348 var self = this;
9349 var rect, minW, minH;
9350 minW = funcs.getSize(self.getEl('head')).width;
9351 minW = minW < 0 ? 0 : minW;
9352 minH = 0;
9353 self.items().each(function (item) {
9354 minW = Math.max(minW, item.layoutRect().minW);
9355 minH = Math.max(minH, item.layoutRect().minH);
9356 });
9357 self.items().each(function (ctrl) {
9358 ctrl.settings.x = 0;
9359 ctrl.settings.y = 0;
9360 ctrl.settings.w = minW;
9361 ctrl.settings.h = minH;
9362 ctrl.layoutRect({
9363 x: 0,
9364 y: 0,
9365 w: minW,
9366 h: minH
9367 });
9368 });
9369 var headH = funcs.getSize(self.getEl('head')).height;
9370 self.settings.minWidth = minW;
9371 self.settings.minHeight = minH + headH;
9372 rect = self._super();
9373 rect.deltaH += headH;
9374 rect.innerH = rect.h - rect.deltaH;
9375 return rect;
9376 }
9377 });
9378
9379 var TextBox = Widget.extend({
9380 init: function (settings) {
9381 var self = this;
9382 self._super(settings);
9383 self.classes.add('textbox');
9384 if (settings.multiline) {
9385 self.classes.add('multiline');
9386 } else {
9387 self.on('keydown', function (e) {
9388 var rootControl;
9389 if (e.keyCode === 13) {
9390 e.preventDefault();
9391 self.parents().reverse().each(function (ctrl) {
9392 if (ctrl.toJSON) {
9393 rootControl = ctrl;
9394 return false;
9395 }
9396 });
9397 self.fire('submit', { data: rootControl.toJSON() });
9398 }
9399 });
9400 self.on('keyup', function (e) {
9401 self.state.set('value', e.target.value);
9402 });
9403 }
9404 },
9405 repaint: function () {
9406 var self = this;
9407 var style, rect, borderBox, borderW, borderH = 0, lastRepaintRect;
9408 style = self.getEl().style;
9409 rect = self._layoutRect;
9410 lastRepaintRect = self._lastRepaintRect || {};
9411 var doc = domGlobals.document;
9412 if (!self.settings.multiline && doc.all && (!doc.documentMode || doc.documentMode <= 8)) {
9413 style.lineHeight = rect.h - borderH + 'px';
9414 }
9415 borderBox = self.borderBox;
9416 borderW = borderBox.left + borderBox.right + 8;
9417 borderH = borderBox.top + borderBox.bottom + (self.settings.multiline ? 8 : 0);
9418 if (rect.x !== lastRepaintRect.x) {
9419 style.left = rect.x + 'px';
9420 lastRepaintRect.x = rect.x;
9421 }
9422 if (rect.y !== lastRepaintRect.y) {
9423 style.top = rect.y + 'px';
9424 lastRepaintRect.y = rect.y;
9425 }
9426 if (rect.w !== lastRepaintRect.w) {
9427 style.width = rect.w - borderW + 'px';
9428 lastRepaintRect.w = rect.w;
9429 }
9430 if (rect.h !== lastRepaintRect.h) {
9431 style.height = rect.h - borderH + 'px';
9432 lastRepaintRect.h = rect.h;
9433 }
9434 self._lastRepaintRect = lastRepaintRect;
9435 self.fire('repaint', {}, false);
9436 return self;
9437 },
9438 renderHtml: function () {
9439 var self = this;
9440 var settings = self.settings;
9441 var attrs, elm;
9442 attrs = {
9443 id: self._id,
9444 hidefocus: '1'
9445 };
9446 global$2.each([
9447 'rows',
9448 'spellcheck',
9449 'maxLength',
9450 'size',
9451 'readonly',
9452 'min',
9453 'max',
9454 'step',
9455 'list',
9456 'pattern',
9457 'placeholder',
9458 'required',
9459 'multiple'
9460 ], function (name) {
9461 attrs[name] = settings[name];
9462 });
9463 if (self.disabled()) {
9464 attrs.disabled = 'disabled';
9465 }
9466 if (settings.subtype) {
9467 attrs.type = settings.subtype;
9468 }
9469 elm = funcs.create(settings.multiline ? 'textarea' : 'input', attrs);
9470 elm.value = self.state.get('value');
9471 elm.className = self.classes.toString();
9472 return elm.outerHTML;
9473 },
9474 value: function (value) {
9475 if (arguments.length) {
9476 this.state.set('value', value);
9477 return this;
9478 }
9479 if (this.state.get('rendered')) {
9480 this.state.set('value', this.getEl().value);
9481 }
9482 return this.state.get('value');
9483 },
9484 postRender: function () {
9485 var self = this;
9486 self.getEl().value = self.state.get('value');
9487 self._super();
9488 self.$el.on('change', function (e) {
9489 self.state.set('value', e.target.value);
9490 self.fire('change', e);
9491 });
9492 },
9493 bindStates: function () {
9494 var self = this;
9495 self.state.on('change:value', function (e) {
9496 if (self.getEl().value !== e.value) {
9497 self.getEl().value = e.value;
9498 }
9499 });
9500 self.state.on('change:disabled', function (e) {
9501 self.getEl().disabled = e.value;
9502 });
9503 return self._super();
9504 },
9505 remove: function () {
9506 this.$el.off();
9507 this._super();
9508 }
9509 });
9510
9511 var getApi = function () {
9512 return {
9513 Selector: Selector,
9514 Collection: Collection$2,
9515 ReflowQueue: ReflowQueue,
9516 Control: Control$1,
9517 Factory: global$4,
9518 KeyboardNavigation: KeyboardNavigation,
9519 Container: Container,
9520 DragHelper: DragHelper,
9521 Scrollable: Scrollable,
9522 Panel: Panel,
9523 Movable: Movable,
9524 Resizable: Resizable,
9525 FloatPanel: FloatPanel,
9526 Window: Window,
9527 MessageBox: MessageBox,
9528 Tooltip: Tooltip,
9529 Widget: Widget,
9530 Progress: Progress,
9531 Notification: Notification,
9532 Layout: Layout,
9533 AbsoluteLayout: AbsoluteLayout,
9534 Button: Button,
9535 ButtonGroup: ButtonGroup,
9536 Checkbox: Checkbox,
9537 ComboBox: ComboBox,
9538 ColorBox: ColorBox,
9539 PanelButton: PanelButton,
9540 ColorButton: ColorButton,
9541 ColorPicker: ColorPicker,
9542 Path: Path,
9543 ElementPath: ElementPath,
9544 FormItem: FormItem,
9545 Form: Form,
9546 FieldSet: FieldSet,
9547 FilePicker: FilePicker,
9548 FitLayout: FitLayout,
9549 FlexLayout: FlexLayout,
9550 FlowLayout: FlowLayout,
9551 FormatControls: FormatControls,
9552 GridLayout: GridLayout,
9553 Iframe: Iframe$1,
9554 InfoBox: InfoBox,
9555 Label: Label,
9556 Toolbar: Toolbar$1,
9557 MenuBar: MenuBar,
9558 MenuButton: MenuButton,
9559 MenuItem: MenuItem,
9560 Throbber: Throbber,
9561 Menu: Menu,
9562 ListBox: ListBox,
9563 Radio: Radio,
9564 ResizeHandle: ResizeHandle,
9565 SelectBox: SelectBox,
9566 Slider: Slider,
9567 Spacer: Spacer,
9568 SplitButton: SplitButton,
9569 StackLayout: StackLayout,
9570 TabPanel: TabPanel,
9571 TextBox: TextBox,
9572 DropZone: DropZone,
9573 BrowseButton: BrowseButton
9574 };
9575 };
9576 var appendTo = function (target) {
9577 if (target.ui) {
9578 global$2.each(getApi(), function (ref, key) {
9579 target.ui[key] = ref;
9580 });
9581 } else {
9582 target.ui = getApi();
9583 }
9584 };
9585 var registerToFactory = function () {
9586 global$2.each(getApi(), function (ref, key) {
9587 global$4.add(key, ref);
9588 });
9589 };
9590 var Api = {
9591 appendTo: appendTo,
9592 registerToFactory: registerToFactory
9593 };
9594
9595 Api.registerToFactory();
9596 Api.appendTo(window.tinymce ? window.tinymce : {});
9597 global.add('modern', function (editor) {
9598 FormatControls.setup(editor);
9599 return ThemeApi.get(editor);
9600 });
9601 function Theme () {
9602 }
9603
9604 return Theme;
9605
9606}(window));
9607})();
9608