text: ﻿(function () {
      function d(a, b) {
          l.call(this, a, b);
          this.actualConfig = this.originalConfig = this.removedButtons = null;
          this.emptyVisible = !1;
          this.state = "edit";
          this.toolbarButtons = [{
              text: {active: "Hide empty toolbar groups", inactive: "Show empty toolbar groups"},
              group: "edit",
              position: "left",
              cssClass: "button-a-soft",
              clickCallback: function (a, b) {
                  a[a.hasClass("button-a-background") ? "removeClass" : "addClass"]("button-a-background");
                  this._toggleVisibilityEmptyElements();
                  this.emptyVisible ? a.setText(b.text.active) : a.setText(b.text.inactive)
              }
          },
              {
                  text: "Add row separator",
                  group: "edit",
                  position: "left",
                  cssClass: "button-a-soft",
                  clickCallback: function () {
                      this._addSeparator()
                  }
              }, {
                  text: "Select config",
                  group: "config",
                  position: "left",
                  cssClass: "button-a-soft",
                  clickCallback: function () {
                      this.configContainer.findOne("textarea").$.select()
                  }
              }, {
                  text: "Back to configurator",
                  group: "config",
                  position: "right",
                  cssClass: "button-a-background",
                  clickCallback: function () {
                      if ("paste" === this.state) {
                          var a = this.configContainer.findOne("textarea").getValue();
                          (a = d.evaluateToolbarGroupsConfig(a)) ?
                              this.setConfig(a) : alert("Your pasted config is wrong.")
                      }
                      this.state = "edit";
                      this._showConfigurationTool();
                      this.showToolbarBtnsByGroupName(this.state)
                  }
              }, {
                  text: 'Get toolbar \x3cspan class\x3d"highlight"\x3econfig\x3c/span\x3e',
                  group: "edit",
                  position: "right",
                  cssClass: "button-a-background icon-pos-left icon-download",
                  clickCallback: function () {
                      this.state = "config";
                      this._showConfig();
                      this.showToolbarBtnsByGroupName(this.state)
                  }
              }];
          this.cachedActiveElement = null
      }
  
      var l = ToolbarConfigurator.AbstractToolbarModifier;
      ToolbarConfigurator.ToolbarModifier = d;
      d.prototype = Object.create(ToolbarConfigurator.AbstractToolbarModifier.prototype);
      d.prototype.getActualConfig = function () {
          var a = l.prototype.getActualConfig.call(this);
          if (a.toolbarGroups)for (var b = a.toolbarGroups.length, c = 0; c < b; c += 1)a.toolbarGroups[c] = d.parseGroupToConfigValue(a.toolbarGroups[c]);
          return a
      };
      d.prototype._onInit = function (a, b, c) {
          c = !0 === c;
          l.prototype._onInit.call(this, void 0, b);
          this.removedButtons = [];
          c ? this.removedButtons = this.actualConfig.removeButtons ?
              this.actualConfig.removeButtons.split(",") : [] : "removeButtons"in this.originalConfig ? this.removedButtons = this.originalConfig.removeButtons ? this.originalConfig.removeButtons.split(",") : [] : (this.originalConfig.removeButtons = "", this.removedButtons = []);
          this.actualConfig.toolbarGroups || (this.actualConfig.toolbarGroups = this.fullToolbarEditor.getFullToolbarGroupsConfig());
          this._fixGroups(this.actualConfig);
          this._calculateTotalBtns();
          this._createModifier();
          this._refreshMoveBtnsAvalibility();
          this._refreshBtnTabIndexes();
          "function" === typeof a && a(this.mainContainer)
      };
      d.prototype._showConfigurationTool = function () {
          this.configContainer.addClass("hidden");
          this.modifyContainer.removeClass("hidden")
      };
      d.prototype._showConfig = function () {
          var a = this.getActualConfig(), b, c;
          if (a.toolbarGroups) {
              b = a.toolbarGroups;
              for (var e = this.cfg.trimEmptyGroups, f = [], g = b.length, m = 0; m < g; m++) {
                  var h = b[m];
                  if ("/" === h)f.push("'/'"); else {
                      if (e)for (var k = h.groups.length; k--;)0 === d.getTotalSubGroupButtonsNumber(h.groups[k], this.fullToolbarEditor) && h.groups.splice(k,
                          1);
                      e && 0 === h.groups.length || f.push(l.stringifyJSONintoOneLine(h, {
                          addSpaces: !0,
                          noQuotesOnKey: !0,
                          singleQuotes: !0
                      }))
                  }
              }
              b = "\n\t\t" + f.join(",\n\t\t")
          }
          a.removeButtons && (c = a.removeButtons);
          a = ['\x3ctextarea class\x3d"configCode" readonly\x3eCKEDITOR.editorConfig \x3d function( config ) {\n', b ? "\tconfig.toolbarGroups \x3d [" + b + "\n\t];" : "", c ? "\n\n" : "", c ? "\tconfig.removeButtons \x3d '" + c + "';" : "", "\n};\x3c/textarea\x3e"].join("");
          this.modifyContainer.addClass("hidden");
          this.configContainer.removeClass("hidden");
          this.configContainer.setHtml(a)
      };
      d.prototype._toggleVisibilityEmptyElements = function () {
          this.modifyContainer.hasClass("empty-visible") ? (this.modifyContainer.removeClass("empty-visible"), this.emptyVisible = !1) : (this.modifyContainer.addClass("empty-visible"), this.emptyVisible = !0);
          this._refreshMoveBtnsAvalibility()
      };
      d.prototype._createModifier = function () {
          function a() {
              b._highlightGroup(this.data("name"))
          }
  
          var b = this;
          l.prototype._createModifier.call(this);
          this.modifyContainer.setHtml(this._toolbarConfigToListString());
          var c = this.modifyContainer.find('li[data-type\x3d"group"]');
          this.modifyContainer.on("mouseleave", function () {
              this._dehighlightActiveToolGroup()
          }, this);
          for (var e = c.count(), f = 0; f < e; f += 1)c.getItem(f).on("mouseenter", a);
          CKEDITOR.document.on("keypress", function (a) {
              a = a.data.$.keyCode;
              a = 32 === a || 13 === a;
              var c = new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);
              c.getAscendant(function (a) {
                  return a.$ === b.mainContainer.$
              }) && a && "button" === c.data("type") && c.findOne("input").$.click()
          });
          this.modifyContainer.on("click",
              function (a) {
                  var c = a.data.$, e = new CKEDITOR.dom.element(c.target || c.srcElement);
                  if (a = d.getGroupOrSeparatorLiAncestor(e)) {
                      b.cachedActiveElement = document.activeElement;
                      if (e.$ instanceof HTMLInputElement)b._handleCheckboxClicked(e); else if (e.$ instanceof HTMLButtonElement && (c.preventDefault ? c.preventDefault() : c.returnValue = !1, (c = b._handleAnchorClicked(e.$)) && "remove" == c.action))return;
                      c = a.data("type");
                      a = a.data("name");
                      b._setActiveElement(c, a);
                      b.cachedActiveElement && b.cachedActiveElement.focus()
                  }
              });
          this.toolbarContainer ||
          (this._createToolbar(), this.toolbarContainer.insertBefore(this.mainContainer.getChildren().getItem(0)));
          this.showToolbarBtnsByGroupName("edit");
          this.configContainer || (this.configContainer = new CKEDITOR.dom.element("div"), this.configContainer.addClass("configContainer"), this.configContainer.addClass("hidden"), this.mainContainer.append(this.configContainer));
          return this.mainContainer
      };
      d.prototype.showToolbarBtnsByGroupName = function (a) {
          if (this.toolbarContainer)for (var b = this.toolbarContainer.find("button"),
                                             c = b.count(), e = 0; e < c; e += 1) {
              var d = b.getItem(e);
              d.data("group") == a ? d.removeClass("hidden") : d.addClass("hidden")
          }
      };
      d.parseGroupToConfigValue = function (a) {
          if ("separator" == a.type)return "/";
          var b = a.groups, c = b.length;
          delete a.totalBtns;
          for (var e = 0; e < c; e += 1)b[e] = b[e].name;
          return a
      };
      d.getGroupOrSeparatorLiAncestor = function (a) {
          return a.$ instanceof HTMLLIElement && "group" == a.data("type") ? a : d.getFirstAncestor(a, function (a) {
              a = a.data("type");
              return "group" == a || "separator" == a
          })
      };
      d.prototype._setActiveElement = function (a,
                                                b) {
          this.currentActive && this.currentActive.elem.removeClass("active");
          if (null === a)this._dehighlightActiveToolGroup(), this.currentActive = null; else {
              var c = this.mainContainer.findOne('ul[data-type\x3dtable-body] li[data-type\x3d"' + a + '"][data-name\x3d"' + b + '"]');
              c.addClass("active");
              this.currentActive = {type: a, name: b, elem: c};
              "group" == a && this._highlightGroup(b);
              "separator" == a && this._dehighlightActiveToolGroup()
          }
      };
      d.prototype.getActiveToolGroup = function () {
          return this.editorInstance.container ? this.editorInstance.container.findOne(".cke_toolgroup.active, .cke_toolbar.active") :
              null
      };
      d.prototype._dehighlightActiveToolGroup = function () {
          var a = this.getActiveToolGroup();
          a && a.removeClass("active");
          this.editorInstance.container && this.editorInstance.container.removeClass("some-toolbar-active")
      };
      d.prototype._highlightGroup = function (a) {
          this.editorInstance.container && (a = this.getFirstEnabledButtonInGroup(a), a = this.editorInstance.container.findOne(".cke_button__" + a + ", .cke_combo__" + a), this._dehighlightActiveToolGroup(), this.editorInstance.container && this.editorInstance.container.addClass("some-toolbar-active"),
          a && (a = d.getFirstAncestor(a, function (a) {
              return a.hasClass("cke_toolbar")
          })) && a.addClass("active"))
      };
      d.prototype.getFirstEnabledButtonInGroup = function (a) {
          var b = this.actualConfig.toolbarGroups;
          a = this.getGroupIndex(a);
          b = b[a];
          if (-1 === a)return null;
          a = b.groups ? b.groups.length : 0;
          for (var c = 0; c < a; c += 1) {
              var e = this.getFirstEnabledButtonInSubgroup(b.groups[c].name);
              if (e)return e
          }
          return null
      };
      d.prototype.getFirstEnabledButtonInSubgroup = function (a) {
          for (var b = (a = this.fullToolbarEditor.buttonsByGroup[a]) ? a.length :
              0, c = 0; c < b; c += 1) {
              var e = a[c].name;
              if (!this.isButtonRemoved(e))return e
          }
          return null
      };
      d.prototype._handleCheckboxClicked = function (a) {
          var b = a.getAscendant("li").data("name");
          a.$.checked ? this._removeButtonFromRemoved(b) : this._addButtonToRemoved(b)
      };
      d.prototype._handleAnchorClicked = function (a) {
          a = new CKEDITOR.dom.element(a);
          var b = a.getAscendant("li"), c = b.getAscendant("ul"), e = b.data("type"), d = b.data("name"), g = a.data("direction"), m = "up" === g ? b.getPrevious() : b.getNext(), h;
          if (a.hasClass("disabled"))return null;
          if (a.hasClass("remove"))return b.remove(), this._removeSeparator(b.data("name")), this._setActiveElement(null), {action: "remove"};
          if (!a.hasClass("move") || !m)return {action: null};
          if ("group" === e || "separator" === e)h = this._moveGroup(g, d);
          "subgroup" === e && (h = b.getAscendant("li").data("name"), h = this._moveSubgroup(g, h, d));
          "up" === g && b.insertBefore(c.getChild(h));
          "down" === g && b.insertAfter(c.getChild(h));
          for (var k; b = "up" === g ? b.getPrevious() : b.getNext();)if (this.emptyVisible || !b.hasClass("empty")) {
              k = b;
              break
          }
          k || (k =
              '[data-direction\x3d"' + ("up" === g ? "down" : "up") + '"]', this.cachedActiveElement = a.getParent().findOne(k));
          this._refreshMoveBtnsAvalibility();
          this._refreshBtnTabIndexes();
          return {action: "move"}
      };
      d.prototype._refreshMoveBtnsAvalibility = function () {
          function a(a) {
              var c = a.count();
              for (d = 0; d < c; d += 1)b._disableElementsInList(a.getItem(d))
          }
  
          for (var b = this, c = this.mainContainer.find("ul[data-type\x3dtable-body] li \x3e p \x3e span \x3e button.move.disabled"), e = c.count(), d = 0; d < e; d += 1)c.getItem(d).removeClass("disabled");
          a(this.mainContainer.find("ul[data-type\x3dtable-body]"));
          a(this.mainContainer.find("ul[data-type\x3dtable-body] \x3e li \x3e ul"))
      };
      d.prototype._refreshBtnTabIndexes = function () {
          for (var a = this.mainContainer.find('[data-tab\x3d"true"]'), b = a.count(), c = 0; c < b; c++) {
              var e = a.getItem(c), d = e.hasClass("disabled");
              e.setAttribute("tabindex", d ? -1 : c)
          }
      };
      d.prototype._disableElementsInList = function (a) {
          function b(a) {
              return !a.hasClass("empty")
          }
  
          if (a.getChildren().count()) {
              var c;
              this.emptyVisible ? (c = a.getFirst(), a = a.getLast()) :
                  (c = a.getFirst(b), a = a.getLast(b));
              if (c)var e = c.findOne('p button[data-direction\x3d"up"]');
              if (a)var d = a.findOne('p button[data-direction\x3d"down"]');
              e && (e.addClass("disabled"), e.setAttribute("tabindex", "-1"));
              d && (d.addClass("disabled"), d.setAttribute("tabindex", "-1"))
          }
      };
      d.prototype.getGroupIndex = function (a) {
          for (var b = this.actualConfig.toolbarGroups, c = b.length, d = 0; d < c; d += 1)if (b[d].name === a)return d;
          return -1
      };
      d.prototype._addSeparator = function () {
          var a = this._determineSeparatorToAddIndex(), b = d.createSeparatorLiteral(),
              c = CKEDITOR.dom.element.createFromHtml(d.getToolbarSeparatorString(b));
          this.actualConfig.toolbarGroups.splice(a, 0, b);
          c.insertBefore(this.modifyContainer.findOne("ul[data-type\x3dtable-body]").getChild(a));
          this._setActiveElement("separator", b.name);
          this._refreshMoveBtnsAvalibility();
          this._refreshBtnTabIndexes();
          this._refreshEditor()
      };
      d.prototype._removeSeparator = function (a) {
          var b = CKEDITOR.tools.indexOf(this.actualConfig.toolbarGroups, function (b) {
              return "separator" == b.type && b.name == a
          });
          this.actualConfig.toolbarGroups.splice(b,
              1);
          this._refreshMoveBtnsAvalibility();
          this._refreshBtnTabIndexes();
          this._refreshEditor()
      };
      d.prototype._determineSeparatorToAddIndex = function () {
          return this.currentActive ? ("group" == this.currentActive.elem.data("type") || "separator" == this.currentActive.elem.data("type") ? this.currentActive.elem : this.currentActive.elem.getAscendant("li")).getIndex() : 0
      };
      d.prototype._moveElement = function (a, b, c) {
          function e(a) {
              return a.totalBtns || "separator" == a.type
          }
  
          c = this.emptyVisible ? "down" == c ? b + 1 : b - 1 : d.getFirstElementIndexWith(a,
              b, c, e);
          return d.moveTo(c - b, a, b)
      };
      d.prototype._moveGroup = function (a, b) {
          var c = this.getGroupIndex(b), c = this._moveElement(this.actualConfig.toolbarGroups, c, a);
          this._refreshMoveBtnsAvalibility();
          this._refreshBtnTabIndexes();
          this._refreshEditor();
          return c
      };
      d.prototype._moveSubgroup = function (a, b, c) {
          b = this.getGroupIndex(b);
          b = this.actualConfig.toolbarGroups[b];
          var d = CKEDITOR.tools.indexOf(b.groups, function (a) {
              return a.name == c
          });
          a = this._moveElement(b.groups, d, a);
          this._refreshEditor();
          return a
      };
      d.prototype._calculateTotalBtns =
          function () {
              for (var a = this.actualConfig.toolbarGroups, b = a.length; b--;) {
                  var c = a[b], e = d.getTotalGroupButtonsNumber(c, this.fullToolbarEditor);
                  "separator" != c.type && (c.totalBtns = e)
              }
          };
      d.prototype._addButtonToRemoved = function (a) {
          if (-1 != CKEDITOR.tools.indexOf(this.removedButtons, a))throw"Button already added to removed";
          this.removedButtons.push(a);
          this.actualConfig.removeButtons = this.removedButtons.join(",");
          this._refreshEditor()
      };
      d.prototype._removeButtonFromRemoved = function (a) {
          a = CKEDITOR.tools.indexOf(this.removedButtons,
              a);
          if (-1 === a)throw"Trying to remove button from removed, but not found";
          this.removedButtons.splice(a, 1);
          this.actualConfig.removeButtons = this.removedButtons.join(",");
          this._refreshEditor()
      };
      d.parseGroupToConfigValue = function (a) {
          if ("separator" == a.type)return "/";
          var b = a.groups, c = b.length;
          delete a.totalBtns;
          for (var d = 0; d < c; d += 1)b[d] = b[d].name;
          return a
      };
      d.getGroupOrSeparatorLiAncestor = function (a) {
          return a.$ instanceof HTMLLIElement && "group" == a.data("type") ? a : d.getFirstAncestor(a, function (a) {
              a = a.data("type");
              return "group" == a || "separator" == a
          })
      };
      d.createSeparatorLiteral = function () {
          return {type: "separator", name: "separator" + CKEDITOR.tools.getNextNumber()}
      };
      d.prototype._toolbarConfigToListString = function () {
          for (var a = this.actualConfig.toolbarGroups || [], b = '\x3cul data-type\x3d"table-body"\x3e', c = a.length, e = 0; e < c; e += 1)var f = a[e], b = "separator" === f.type ? b + d.getToolbarSeparatorString(f) : b + this._getToolbarGroupString(f);
          b += "\x3c/ul\x3e";
          return d.getToolbarHeaderString() + b
      };
      d.prototype._getToolbarGroupString = function (a) {
          var b =
              a.groups, c;
          c = "" + ['\x3cli data-type\x3d"group" data-name\x3d"', a.name, '" ', a.totalBtns ? "" : 'class\x3d"empty"', "\x3e"].join("");
          c += d.getToolbarElementPreString(a) + "\x3cul\x3e";
          a = b.length;
          for (var e = 0; e < a; e += 1) {
              var f = b[e];
              c += this._getToolbarSubgroupString(f, this.fullToolbarEditor.buttonsByGroup[f.name])
          }
          return c + "\x3c/ul\x3e\x3c/li\x3e"
      };
      d.getToolbarSeparatorString = function (a) {
          return ['\x3cli data-type\x3d"', a.type, '" data-name\x3d"', a.name, '"\x3e', d.getToolbarElementPreString("row separator"), "\x3c/li\x3e"].join("")
      };
      d.getToolbarHeaderString = function () {
          return '\x3cul data-type\x3d"table-header"\x3e\x3cli data-type\x3d"header"\x3e\x3cp\x3eToolbars\x3c/p\x3e\x3cul\x3e\x3cli\x3e\x3cp\x3eToolbar groups\x3c/p\x3e\x3cp\x3eToolbar group items\x3c/p\x3e\x3c/li\x3e\x3c/ul\x3e\x3c/li\x3e\x3c/ul\x3e'
      };
      d.getFirstAncestor = function (a, b) {
          for (var c = a.getParents(), d = c.length; d--;)if (b(c[d]))return c[d];
          return null
      };
      d.getFirstElementIndexWith = function (a, b, c, d) {
          for (; "up" === c ? b-- : ++b < a.length;)if (d(a[b]))return b;
          return -1
      };
      d.moveTo =
          function (a, b, c) {
              var d;
              -1 !== c && (d = b.splice(c, 1)[0]);
              a = c + a;
              b.splice(a, 0, d);
              return a
          };
      d.getTotalSubGroupButtonsNumber = function (a, b) {
          var c = b.buttonsByGroup["string" == typeof a ? a : a.name];
          return c ? c.length : 0
      };
      d.getTotalGroupButtonsNumber = function (a, b) {
          for (var c = 0, e = a.groups, f = e ? e.length : 0, g = 0; g < f; g += 1)c += d.getTotalSubGroupButtonsNumber(e[g], b);
          return c
      };
      d.prototype._getToolbarSubgroupString = function (a, b) {
          var c;
          c = "" + ['\x3cli data-type\x3d"subgroup" data-name\x3d"', a.name, '" ', a.totalBtns ? "" : 'class\x3d"empty" ',
                  "\x3e"].join("");
          c += d.getToolbarElementPreString(a.name);
          c += "\x3cul\x3e";
          for (var e = b ? b.length : 0, f = 0; f < e; f += 1)c += this.getButtonString(b[f]);
          return c += "\x3c/ul\x3e\x3c/li\x3e"
      };
      d.prototype._getConfigButtonName = function (a) {
          var b = this.fullToolbarEditor.editorInstance.ui.items, c;
          for (c in b)if (b[c].name == a)return c;
          return null
      };
      d.prototype.isButtonRemoved = function (a) {
          return -1 != CKEDITOR.tools.indexOf(this.removedButtons, this._getConfigButtonName(a))
      };
      d.prototype.getButtonString = function (a) {
          var b = this.isButtonRemoved(a.name) ?
              "" : 'checked\x3d"checked"';
          return ['\x3cli data-tab\x3d"true" data-type\x3d"button" data-name\x3d"', this._getConfigButtonName(a.name), '"\x3e\x3clabel title\x3d"', a.label, '" \x3e\x3cinput tabindex\x3d"-1"type\x3d"checkbox"', b, "/\x3e", a.$.getOuterHtml(), "\x3c/label\x3e\x3c/li\x3e"].join("")
      };
      d.getToolbarElementPreString = function (a) {
          a = a.name ? a.name : a;
          return ['\x3cp\x3e\x3cspan\x3e\x3cbutton title\x3d"Move element upward" data-tab\x3d"true" data-direction\x3d"up" class\x3d"move icon-up-big"\x3e\x3c/button\x3e\x3cbutton title\x3d"Move element downward" data-tab\x3d"true" data-direction\x3d"down" class\x3d"move icon-down-big"\x3e\x3c/button\x3e',
              "row separator" == a ? '\x3cbutton title\x3d"Remove element" data-tab\x3d"true" class\x3d"remove icon-trash"\x3e\x3c/button\x3e' : "", a, "\x3c/span\x3e\x3c/p\x3e"].join("")
      };
      d.evaluateToolbarGroupsConfig = function (a) {
          return a = function (a) {
              var c = {}, d;
              try {
                  d = eval("(" + a + ")")
              } catch (f) {
                  try {
                      d = eval(a)
                  } catch (g) {
                      return null
                  }
              }
              return c.toolbarGroups && "number" === typeof c.toolbarGroups.length ? JSON.stringify(c) : d && "number" === typeof d.length ? JSON.stringify({toolbarGroups: d}) : d && d.toolbarGroups ? JSON.stringify(d) : null
          }(a)
      };
      return d
  })();