tinymce.PluginManager.add("image", function (e) { function t(e, t) { function n(e, n) { r.parentNode && r.parentNode.removeChild(r), t({ width: e, height: n }); } var r = document.createElement("img"); (r.onload = function () { n(Math.max(r.width, r.clientWidth), Math.max(r.height, r.clientHeight)); }), (r.onerror = function () { n(); }); var i = r.style; (i.visibility = "hidden"), (i.position = "fixed"), (i.bottom = i.left = 0), (i.width = i.height = "auto"), document.body.appendChild(r), (r.src = e); } function n(e, t, n) { function r(e, n) { return ( (n = n || []), tinymce.each(e, function (e) { var i = { text: e.text || e.title }; e.menu ? (i.menu = r(e.menu)) : ((i.value = e.value), t(i)), n.push(i); }), n ); } return r(e, n || []); } function r(t) { return function () { var n = e.settings.image_list; "string" == typeof n ? tinymce.util.XHR.send({ url: n, success: function (e) { t(tinymce.util.JSON.parse(e)); }, }) : "function" == typeof n ? n(t) : t(n); }; } function i(r) { function i() { var e, t, n, r; (e = f.find("#width")[0]), (t = f.find("#height")[0]), e && t && ((n = e.value()), (r = t.value()), f.find("#constrain")[0].checked() && h && g && n && r && (h != n ? ((r = Math.round((n / h) * r)), isNaN(r) || t.value(r)) : ((n = Math.round((r / g) * n)), isNaN(n) || e.value(n))), (h = n), (g = r)); } function o() { function t(t) { function n() { (t.onload = t.onerror = null), e.selection && (e.selection.select(t), e.nodeChanged()); } (t.onload = function () { y.width || y.height || !x || C.setAttribs(t, { width: t.clientWidth, height: t.clientHeight }), n(); }), (t.onerror = n); } var n, r; u(), i(), (y = tinymce.extend(y, f.toJSON())), y.alt || (y.alt = ""), y.title || (y.title = ""), "" === y.width && (y.width = null), "" === y.height && (y.height = null), y.style || (y.style = null), (y = { src: y.src, alt: y.alt, title: y.title, width: y.width, height: y.height, style: y.style, caption: y.caption, class: y["class"] }), e.undoManager.transact(function () { function i(t) { return e.schema.getTextBlockElements()[t.nodeName]; } if (!y.src) return void (p && (C.remove(p), e.focus(), e.nodeChanged())); if ( ("" === y.title && (y.title = null), p ? C.setAttribs(p, y) : ((y.id = "__mcenew"), e.focus(), e.selection.setContent(C.createHTML("img", y)), (p = C.get("__mcenew")), C.setAttrib(p, "id", null)), e.editorUpload.uploadImagesAuto(), y.caption === !1 && C.is(p.parentNode, "figure.image") && ((n = p.parentNode), C.insertAfter(p, n), C.remove(n)), y.caption !== !0) ) t(p); else if (!C.is(p.parentNode, "figure.image")) { (r = p), (p = p.cloneNode(!0)), (n = C.create("figure", { class: "image" })), n.appendChild(p), n.appendChild(C.create("figcaption", { contentEditable: !0 }, "Caption")), (n.contentEditable = !1); var o = C.getParent(r, i); o ? C.split(o, r, n) : C.replace(n, r), e.selection.select(n); } }); } function a(e) { return e && (e = e.replace(/px$/, "")), e; } function s(n) { var r, i, o, a = n.meta || {}; v && v.value(e.convertURL(this.value(), "src")), tinymce.each(a, function (e, t) { f.find("#" + t).value(e); }), a.width || a.height || ((r = e.convertURL(this.value(), "src")), (i = e.settings.image_prepend_url), (o = new RegExp("^(?:[a-z]+:)?//", "i")), i && !o.test(r) && r.substring(0, i.length) !== i && (r = i + r), this.value(r), t(e.documentBaseURI.toAbsolute(this.value()), function (e) { e.width && e.height && x && ((h = e.width), (g = e.height), f.find("#width").value(h), f.find("#height").value(g)); })); } function l(e) { e.meta = f.toJSON(); } function c(e) { if (e.margin) { var t = e.margin.split(" "); switch (t.length) { case 1: (e["margin-top"] = e["margin-top"] || t[0]), (e["margin-right"] = e["margin-right"] || t[0]), (e["margin-bottom"] = e["margin-bottom"] || t[0]), (e["margin-left"] = e["margin-left"] || t[0]); break; case 2: (e["margin-top"] = e["margin-top"] || t[0]), (e["margin-right"] = e["margin-right"] || t[1]), (e["margin-bottom"] = e["margin-bottom"] || t[0]), (e["margin-left"] = e["margin-left"] || t[1]); break; case 3: (e["margin-top"] = e["margin-top"] || t[0]), (e["margin-right"] = e["margin-right"] || t[1]), (e["margin-bottom"] = e["margin-bottom"] || t[2]), (e["margin-left"] = e["margin-left"] || t[1]); break; case 4: (e["margin-top"] = e["margin-top"] || t[0]), (e["margin-right"] = e["margin-right"] || t[1]), (e["margin-bottom"] = e["margin-bottom"] || t[2]), (e["margin-left"] = e["margin-left"] || t[3]); } delete e.margin; } return e; } function u() { function t(e) { return e.length > 0 && /^[0-9]+$/.test(e) && (e += "px"), e; } if (e.settings.image_advtab) { var n = f.toJSON(), r = C.parseStyle(n.style); (r = c(r)), n.vspace && (r["margin-top"] = r["margin-bottom"] = t(n.vspace)), n.hspace && (r["margin-left"] = r["margin-right"] = t(n.hspace)), n.border && (r["border-width"] = t(n.border)), f.find("#style").value(C.serializeStyle(C.parseStyle(C.serializeStyle(r)))); } } function d() { if (e.settings.image_advtab) { var t = f.toJSON(), n = C.parseStyle(t.style); f.find("#vspace").value(""), f.find("#hspace").value(""), (n = c(n)), ((n["margin-top"] && n["margin-bottom"]) || (n["margin-right"] && n["margin-left"])) && (n["margin-top"] === n["margin-bottom"] ? f.find("#vspace").value(a(n["margin-top"])) : f.find("#vspace").value(""), n["margin-right"] === n["margin-left"] ? f.find("#hspace").value(a(n["margin-right"])) : f.find("#hspace").value("")), n["border-width"] && f.find("#border").value(a(n["border-width"])), f.find("#style").value(C.serializeStyle(C.parseStyle(C.serializeStyle(n)))); } } var f, p, m, h, g, v, b, y = {}, C = e.dom, x = e.settings.image_dimensions !== !1; (p = e.selection.getNode()), (m = C.getParent(p, "figure.image")), m && (p = C.select("img", m)[0]), p && ("IMG" != p.nodeName || p.getAttribute("data-mce-object") || p.getAttribute("data-mce-placeholder")) && (p = null), p && ((h = C.getAttrib(p, "width")), (g = C.getAttrib(p, "height")), (y = { src: C.getAttrib(p, "src"), alt: C.getAttrib(p, "alt"), title: C.getAttrib(p, "title"), class: C.getAttrib(p, "class"), width: h, height: g, caption: !!m })), r && (v = { type: "listbox", label: "Image list", values: n( r, function (t) { t.value = e.convertURL(t.value || t.url, "src"); }, [{ text: "None", value: "" }] ), value: y.src && e.convertURL(y.src, "src"), onselect: function (e) { var t = f.find("#alt"); (!t.value() || (e.lastControl && t.value() == e.lastControl.text())) && t.value(e.control.text()), f.find("#src").value(e.control.value()).fire("change"); }, onPostRender: function () { v = this; }, }), e.settings.image_class_list && (b = { name: "class", type: "listbox", label: "Class", values: n(e.settings.image_class_list, function (t) { t.value && (t.textStyle = function () { return e.formatter.getCssText({ inline: "img", classes: [t.value] }); }); }), }); var w = [{ name: "src", type: "filepicker", filetype: "image", label: "Source", autofocus: !0, onchange: s, onbeforecall: l }, v]; e.settings.image_description !== !1 && w.push({ name: "alt", type: "textbox", label: "Image description" }), e.settings.image_title && w.push({ name: "title", type: "textbox", label: "Image Title" }), x && w.push({ type: "container", label: "Dimensions", layout: "flex", direction: "row", align: "center", spacing: 5, items: [ { name: "width", type: "textbox", maxLength: 5, size: 3, onchange: i, ariaLabel: "Width" }, { type: "label", text: "x" }, { name: "height", type: "textbox", maxLength: 5, size: 3, onchange: i, ariaLabel: "Height" }, { name: "constrain", type: "checkbox", checked: !0, text: "Constrain proportions" }, ], }), w.push(b), e.settings.image_caption && tinymce.Env.ceFalse && w.push({ name: "caption", type: "checkbox", label: "Caption" }), e.settings.image_advtab ? (p && (p.style.marginLeft && p.style.marginRight && p.style.marginLeft === p.style.marginRight && (y.hspace = a(p.style.marginLeft)), p.style.marginTop && p.style.marginBottom && p.style.marginTop === p.style.marginBottom && (y.vspace = a(p.style.marginTop)), p.style.borderWidth && (y.border = a(p.style.borderWidth)), (y.style = e.dom.serializeStyle(e.dom.parseStyle(e.dom.getAttrib(p, "style"))))), (f = e.windowManager.open({ title: "Insert/edit image", data: y, bodyType: "tabpanel", body: [ { title: "General", type: "form", items: w }, { title: "Advanced", type: "form", pack: "start", items: [ { label: "Style", name: "style", type: "textbox", onchange: d }, { type: "form", layout: "grid", packV: "start", columns: 2, padding: 0, alignH: ["left", "right"], defaults: { type: "textbox", maxWidth: 50, onchange: u }, items: [ { label: "Vertical space", name: "vspace" }, { label: "Horizontal space", name: "hspace" }, { label: "Border", name: "border" }, ], }, ], }, ], onSubmit: o, }))) : (f = e.windowManager.open({ title: "Insert/edit image", data: y, body: w, onSubmit: o })); } e.on("preInit", function () { function t(e) { var t = e.attr("class"); return t && /\bimage\b/.test(t); } function n(e) { return function (n) { function r(t) { t.attr("contenteditable", e ? "true" : null); } for (var i, o = n.length; o--;) (i = n[o]), t(i) && (i.attr("contenteditable", e ? "false" : null), tinymce.each(i.getAll("figcaption"), r)); }; } e.parser.addNodeFilter("figure", n(!0)), e.serializer.addNodeFilter("figure", n(!1)); }), e.addButton("image", { icon: "image", tooltip: "Insert/edit image", onclick: r(i), stateSelector: "img:not([data-mce-object],[data-mce-placeholder]),figure.image" }), e.addMenuItem("image", { icon: "image", text: "Image", onclick: r(i), context: "insert", prependToContext: !0 }), e.addCommand("mceImage", r(i)); });