[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/tinymce/themes/modern/ -> theme.js (source)

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


Generated: Tue Mar 19 01:00:02 2024 Cross-referenced by PHPXref 0.7.1