text: /**
   * NotificationManagerImpl.js
   *
   * Released under LGPL License.
   * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
   *
   * License: http://www.tinymce.com/license
   * Contributing: http://www.tinymce.com/contributing
   */
  
  define(
    'tinymce.ui.NotificationManagerImpl',
    [
      'ephox.katamari.api.Arr',
      'global!setTimeout',
      'tinymce.core.util.Tools',
      'tinymce.ui.DomUtils',
      'tinymce.ui.Notification'
    ],
    function (Arr, setTimeout, Tools, DomUtils, Notification) {
      return function (editor) {
        var getEditorContainer = function (editor) {
          return editor.inline ? editor.getElement() : editor.getContentAreaContainer();
        };
  
        var getContainerWidth = function () {
          var container = getEditorContainer(editor);
          return DomUtils.getSize(container).width;
        };
  
        // Since the viewport will change based on the present notifications, we need to move them all to the
        // top left of the viewport to give an accurate size measurement so we can position them later.
        var prePositionNotifications = function (notifications) {
          Arr.each(notifications, function (notification) {
            notification.moveTo(0, 0);
          });
        };
  
        var positionNotifications = function (notifications) {
          if (notifications.length > 0) {
            var firstItem = notifications.slice(0, 1)[0];
            var container = getEditorContainer(editor);
            firstItem.moveRel(container, 'tc-tc');
            Arr.each(notifications, function (notification, index) {
              if (index > 0) {
                notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');
              }
            });
          }
        };
  
        var reposition = function (notifications) {
          prePositionNotifications(notifications);
          positionNotifications(notifications);
        };
  
        var open = function (args, closeCallback) {
          var extendedArgs = Tools.extend(args, { maxWidth: getContainerWidth() });
          var notif = new Notification(extendedArgs);
          notif.args = extendedArgs;
  
          //If we have a timeout value
          if (extendedArgs.timeout > 0) {
            notif.timer = setTimeout(function () {
              notif.close();
              closeCallback();
            }, extendedArgs.timeout);
          }
  
          notif.on('close', function () {
            closeCallback();
          });
  
          notif.renderTo();
  
          return notif;
        };
  
        var close = function (notification) {
          notification.close();
        };
  
        var getArgs = function (notification) {
          return notification.args;
        };
  
        return {
          open: open,
          close: close,
          reposition: reposition,
          getArgs: getArgs
        };
      };
    }
  );
  