| define(
  'tinymce.themes.mobile.util.FontSizes',
  [
    'ephox.katamari.api.Arr',
    'ephox.katamari.api.Fun',
    'ephox.katamari.api.Option',
    'ephox.sugar.api.dom.Compare',
    'ephox.sugar.api.node.Element',
    'ephox.sugar.api.node.Node',
    'ephox.sugar.api.properties.Css',
    'ephox.sugar.api.search.TransformFind',
    'ephox.sugar.api.search.Traverse'
  ],
  function (Arr, Fun, Option, Compare, Element, Node, Css, TransformFind, Traverse) {
    var candidates = [ '9px', '10px', '11px', '12px', '14px', '16px', '18px', '20px', '24px', '32px', '36px' ];
    var defaultSize = 'medium';
    var defaultIndex = 2;
    var indexToSize = function (index) {
      return Option.from(candidates[index]);
    };
    var sizeToIndex = function (size) {
      return Arr.findIndex(candidates, function (v) {
        return v === size;
      });
    };
    var getRawOrComputed = function (isRoot, rawStart) {
      var optStart = Node.isElement(rawStart) ? Option.some(rawStart) : Traverse.parent(rawStart);
      return optStart.map(function (start) {
        var inline = TransformFind.closest(start, function (elem) {
          return Css.getRaw(elem, 'font-size');
        }, isRoot);
        return inline.getOrThunk(function () {
          return Css.get(start, 'font-size');
        });
      }).getOr('');
    };
    var getSize = function (editor) {
      // This was taken from the tinymce approach (FontInfo is unlikely to be global)
      var node = editor.selection.getStart();
      var elem = Element.fromDom(node);
      var root = Element.fromDom(editor.getBody());
      var isRoot = function (e) {
        return Compare.eq(root, e);
      };
      var elemSize = getRawOrComputed(isRoot, elem);
      return Arr.find(candidates, function (size) {
        return elemSize === size;
      }).getOr(defaultSize);
    };
    var applySize = function (editor, value) {
      var currentValue = getSize(editor);
      if (currentValue !== value) {
        editor.execCommand('fontSize', false, value);
      }
    };
    var get = function (editor) {
      var size = getSize(editor);
      return sizeToIndex(size).getOr(defaultIndex);
    };
    var apply = function (editor, index) {
      indexToSize(index).each(function (size) {
        applySize(editor, size);
      });
    };
    return {
      candidates: Fun.constant(candidates),
      get: get,
      apply: apply
    };
  }
);
 |