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

Erat himenaeos neque id sagittis massa. Hac suscipit pulvinar dignissim platea magnis eu. Don tellus a pharetra inceptos efficitur dui pulvinar. Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent pulvinar odio volutpat parturient. Quisque risus finibus suspendisse mus purus magnis facilisi condimentum consectetur dui. Curae elit suspendisse cursus vehicula.

Turpis taciti class non vel pretium quis pulvinar tempor lobortis nunc. Libero phasellus parturient sapien volutpat malesuada ornare. Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae. Porta est tempor ex eget feugiat vulputate ipsum. Justo nec iaculis habitant diam arcu fermentum.

We offer comprehen sive emplo ment services such as assistance wit employer compliance.Our company is your strategic HR partner as instead of HR. john smithson

Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae.

Exploring Learning Landscapes in Academic

Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent.

]]>
https://cardgames4educators.com/masters-in-english-how-english-speaker/feed/ 1