(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
})();