1/* jce - 2.9.99.10 | 2026-07-29 | https://www.joomlacontenteditor.net | Source: https://github.com/widgetfactory/jce | Copyright (C) 2006 - 2026 Ryan Demmer. All rights reserved | GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html; see LICENSE.txt */ 2function IeCursorFix() { 3 return !0; 4} 5 6function jInsertEditorText(text, editor) { 7 try { 8 WfEditor.insert(editor, text); 9 } catch (e) {} 10} 11 12!function() { 13 var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, Dispatcher = tinymce.util.Dispatcher, corePlugins = [ "core", "help", "autolink", "cleanup", "code", "format", "importcss", "colorpicker", "upload", "blobupload", "figure", "ui", "noneditable", "branding" ]; 14 function isHidden(el) { 15 return (el = "string" == typeof el ? document.getElementById(el) : el) && "none" === el.style.display; 16 } 17 function getRefocusBookmarkId(ed) { 18 var prefix = "wf-bookmark-{path}{query}-{id}-"; 19 return prefix = (prefix = (prefix = (prefix = prefix.replace(/\{path\}/g, document.location.pathname)).replace(/\{query\}/g, document.location.search)).replace(/\{id\}/g, ed.id)).replace(/\W/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, ""); 20 } 21 function getScriptOptions(key) { 22 if (!Joomla.optionsStorage) { 23 Joomla.optionsStorage = {}; 24 var scripts = document.querySelectorAll("script.joomla-script-options.new"); 25 if (!scripts) throw new Error("No Joomla options found"); 26 scripts.forEach(element => { 27 element = element.text || element.textContent; 28 try { 29 var data = JSON.parse(element); 30 data && (Joomla.optionsStorage = data); 31 } catch (e) {} 32 }); 33 } 34 scripts = Joomla.getOptions ? Joomla.getOptions("plg_editor_jce", {}) : Joomla.optionsStorage.plg_editor_jce || {}; 35 return scripts && scripts[key] ? (scripts = scripts[key], Array.isArray(scripts) ? scripts[0] : scripts) : null; 36 } 37 var PlatformEditor_register = function(editor) { 38 var instance = { 39 getValue: function() { 40 return WfEditor.getContent(editor.id); 41 }, 42 setValue: function(value) { 43 WfEditor.setContent(editor.id, value); 44 }, 45 getSelection: function() { 46 return WfEditor.getSelection(editor.id, { 47 format: "text" 48 }); 49 }, 50 replaceSelection: function(value) { 51 return WfEditor.insert(editor.id, value); 52 }, 53 disable: function(disabled) { 54 return editor.setMode(disabled ? "readonly" : "design"); 55 }, 56 id: editor.id, 57 instance: editor, 58 onSave: function() {} 59 }; 60 if ("undefined" != typeof JceDecorator) return !0; 61 Joomla.editors && (Joomla.editors.instances[editor.id] = instance); 62 }, PlatformEditor_unregister = function(editor) { 63 var instance, editor = editor.getElement(); 64 if ("undefined" != typeof JceDecorator) return !((instance = JoomlaEditor.get(editor.id)) && instance instanceof JceDecorator) || JoomlaEditor.unregister(instance); 65 Joomla.editors && delete Joomla.editors.instances[editor.id]; 66 }, WfEditor = { 67 settings: null, 68 bookmark: null, 69 options: {}, 70 getSite: function(base) { 71 var u = document.location.href, host = -1 !== base.indexOf("http") ? (host = base.substr(base.indexOf("://") + 3)).substr(host.indexOf("/")) : u.substr(0, u.indexOf(base) + base.length); 72 return -1 !== u.indexOf("/administrator/") && (host += "administrator/"), 73 host; 74 }, 75 init: function(settings) { 76 if (!(settings = settings || getScriptOptions("editor"))) throw new Error("Unable to initialize editor. No settings found"); 77 var base = settings.base_url, site = this.getSite(base), indent = (/https:\/\//.test(document.location.href) && (base = base.replace(/http:/, "https:")), 78 window.tinyMCEPreInit = {}, settings.query = function http_build_query(params, prefix) { 79 var value, fullKey, queryStringParts = []; 80 for (const key in params) params.hasOwnProperty(key) && (value = params[key], 81 fullKey = prefix ? `${prefix}[${key}]` : key, queryStringParts.push("object" == typeof value && null !== value ? http_build_query(value, fullKey) : encodeURIComponent(fullKey) + "=" + encodeURIComponent(value))); 82 return queryStringParts.join("&"); 83 }(settings.query), extend(tinymce, { 84 baseURL: base + "media/com_jce/editor/tinymce", 85 suffix: "", 86 query: settings.query 87 }), "p,h1,h2,h3,h4,h5,h6,blockquote,div,title,pre,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,f
87igure,object,video,audio"); 88 if (this.settings = this.settings || extend({ 89 document_base_url: base, 90 site_url: site, 91 schema: "mixed", 92 convert_urls: !0, 93 relative_urls: !0, 94 mode: "textareas", 95 entity_encoding: "raw", 96 editor_selector: "wf-editor", 97 editor_deselector: "wf-no-editor", 98 urlconverter_callback: "WFEditor.convertURL", 99 popup_css: !1, 100 add_form_submit_trigger: !1, 101 submit_patch: !1, 102 theme: "none", 103 skin_directionality: "ltr", 104 invalid_elements: "applet,iframe,object,embed,script,style,body,bgsound,base,basefont,frame,frameset,head,html,id,ilayer,layer,link,meta,name,title,xml", 105 plugins: "", 106 external_plugins: {}, 107 whitespace_elements: "pre,script,style,textarea,code", 108 allow_conditional_comments: !0, 109 allow_event_attributes: !1, 110 fix_list_elements: !0, 111 indent_before: indent, 112 indent_after: indent, 113 update_styles: !0, 114 constrain_menus: !1, 115 compress: { 116 css: !1, 117 javascript: !1 118 }, 119 language_load: !1 120 }, settings), this.settings) try { 121 this.settings.compress.css && extend(this.settings, { 122 content_css: !1, 123 editor_css: !1 124 }), this.markLoaded(), WFEditor.load(); 125 } catch (e) { 126 console.debug(e); 127 } 128 }, 129 markLoaded: function() { 130 var s = this.settings, each = tinymce.each, suffix = s.suffix || ""; 131 function load(u) { 132 tinymce.ScriptLoader.markDone(tinyMCE.baseURL + "/" + u); 133 } 134 1 == s.compress.javascript && (each(s.external_plugins, function(url, name) { 135 load(url); 136 }), each(s.plugins.split(","), function(n) { 137 n && load("plugins/" + n + "/plugin" + suffix + ".js"); 138 })), each(corePlugins, function(n) { 139 load("plugins/" + n + "/plugin" + suffix + ".js"); 140 }); 141 }, 142 setBookmark: function(ed) { 143 DOM.bind(document.body, "mousedown", function(e) { 144 !function(el) { 145 return DOM.getParent(el, "div.mceEditor, div.mceSplitButtonMenu, div.mceListBoxMenu, div.mceDropDown"); 146 }(e.target) && !function(ed) { 147 return ed.isHidden() || "hidden" == DOM.getStyle(ed.id + "_ifr", "visibility"); 148 }(ed) && ed.selection && (e = ed.selection.getNode(), DOM.getParent(e, "body#tinymce")) && (ed.lastSelectionBookmark = ed.selection.getBookmark(1)); 149 }); 150 }, 151 load: function() { 152 var loaded, self = this; 153 function _load() { 154 loaded || (loaded = !0, self.preinit()); 155 } 156 tinymce.settings = this.settings, tinyMCE.onAddEditor.add(function(mgr, ed) { 157 var options, btns, el = ed.getElement(); 158 "advanced" === ed.settings.theme && (window.Joomla && (Joomla.getOptions && (options = getScriptOptions("joomla_xtd_buttons"), 159 btns = ed.settings.joomla_xtd_buttons || {}, options) && tinymce.is(options, "object") && (each(options, function(value, key) { 160 value && value.length && (btns[key] = value); 161 }), ed.settings.joomla_xtd_buttons = btns), PlatformEditor_register(ed)), 162 self.settings.compress.css && ed.onPreInit.add(function() { 163 ed.dom.loadCSS(self.settings.site_url + "index.php?option=com_jce&task=editor.pack&type=css&slot=content"); 164 }), self.createToggle(el), self.setBookmark(ed), ed.onPreInit.add(function() { 165 self.createTabs(ed); 166 }), ed.onInit.add(function() { 167 ed.onSubmit.addToTop(function() { 168 ed.initialized && ed.getElement() && (ed.setDirty(!1), self.getContent(ed.id)); 169 }), ed.settings.refocus && window.setTimeout(function() { 170 var bookmark = function(ed) { 171 var bookmarkStore = sessionStorage.getItem("wf_refocus_bookmark"), bookmarkData = {}, bookmark = 0; 172 if (bookmarkStore) try { 173 bookmarkData = JSON.parse(bookmarkStore); 174 } catch (e) {} 175 return (bookmark = bookmarkData[getRefocusBookmarkId(ed)] || 0) && (sessionStorage.removeItem("wf_refocus_bookmark"), 176 bookmark = parseInt(bookmark)), bookmark; 177 }(ed); 178 bookmark && self.setActiveLine(ed, bookmark); 179 }, 100); 180 }), ed.onBeforeRenderUI.add(function() { 181 var n = ed.getElement().form; 182 !n || n._mceOldSubmit || n.submit.nodeType || n.submit.length || ((ed.formElement = n)._mceOldSubmit = n.submit, 183 n.submit = function() { 184 return tinymce.each(tinymce.editors, function(e) { 185 e.initialized && e.getElement() && (e.setDirty(!1), 186 self.getContent(e.id)); 187 }), ed.formElement._mceOldSubmit(ed.formElement); 188 }); 189 }), ed.onPostRender.add(function() { 190 var el = ed.getElement(), el = self.getEditorState(el), toggle = tinymce.is(ed.settings.toggle) ? parseInt(ed.settings.toggle, 10) : 0; 191 !el && toggle && (ed.hide(), ed.plugins.source && ed.plugins.source.hide(), 192 ed.plugins.preview) && ed.plugins.preview.hide(); 193 }), ed.onWfEditorChange = new Dispatcher(), ed.onWfEditorChange.add(function(ed, o) {
194 tinymce.is(o.content) && (ed.setContent(o.content, o), ed.onChange.dispatch()); 195 }), ed.onSaveContent.add(function() { 196 var bookmark; 197 ed === tinymce.activeEditor && (bookmark = self.getActiveLine(ed), 198 function(ed, bookmark) { 199 var bookmarkData; 200 bookmark && ((bookmarkData = {})[getRefocusBookmarkId(ed)] = bookmark, 201 sessionStorage.setItem("wf_refocus_bookmark", JSON.stringify(bookmarkData))); 202 }(ed, bookmark)); 203 }), ed.onRemove.add(function() { 204 var nodes, container = DOM.getParent(ed.getElement(), "div.wf-editor-container"); 205 container && (nodes = tinymce.grep(DOM.select("div", container), function(node) { 206 return node !== ed.getElement() && node !== ed.getContainer(); 207 }), DOM.remove(nodes), DOM.remove(container, 1)); 208 })); 209 }), Event.bind(window, "load", function() { 210 _load(), self.initSubformEvents(); 211 }), Event.bind(window, "ready", function() { 212 window.setTimeout(function() { 213 _load(); 214 }, 1e3); 215 }); 216 }, 217 initSubformEvents: function() { 218 var self = this, settings = this.settings; 219 function removeEditor(el) { 220 el = tinymce.EditorManager.get(el.id); 221 el && (el.remove(), el.destroy(!0), PlatformEditor_unregister(el)); 222 } 223 function createEditor(el) { 224 var ed = tinymce.EditorManager.get(el.id); 225 ed || (self.createInstance(el), ed = new tinymce.Editor(el.id, settings)), 226 ed.render(); 227 } 228 function rebuildEditor(row) { 229 row = DOM.select(".wf-editor-container > textarea[id]", row); 230 each(row, function(el) { 231 removeEditor(el), createEditor(el); 232 }); 233 } 234 window.jQuery && (jQuery("div.subform-repeatable").on("subform-row-add", function(event, row) { 235 row = DOM.select(".wf-editor", row); 236 each(row, function(el) { 237 createEditor(el); 238 }); 239 }).on("subform-row-remove", function(event, row) { 240 row = DOM.select(".wf-editor", row); 241 each(row, function(el) { 242 removeEditor(el); 243 }); 244 }), jQuery(document).on("editor-reinit", function(e, row) { 245 rebuildEditor(row); 246 }), jQuery(document).on("sortstop", function(e, ui) { 247 ui.item[0] && rebuildEditor(ui.item[0]); 248 })), DOM.bind(document, "subform-row-add", function(e) { 249 var e = e.detail ? e.detail.row : null; 250 e && (e = DOM.select(".wf-editor", e), each(e, function(el) { 251 createEditor(el); 252 })); 253 }), DOM.bind(document, "subform-row-remove", function(e) { 254 var e = e.detail ? e.detail.row : null; 255 e && (e = DOM.select(".wf-editor", e), each(e, function(el) { 256 removeEditor(el); 257 })); 258 }), DOM.bind(document, "sortstop", function(e) { 259 e = e.detail ? e.detail.row : null; 260 e && rebuildEditor(e); 261 }), DOM.bind(DOM.select("joomla-field-subform.subform-repeatable"), "dragend", function(e) { 262 rebuildEditor(e.target); 263 }); 264 }, 265 isEditorActive: function(elm) { 266 return 0 == DOM.hasClass(elm, "wf-no-editor"); 267 }, 268 canToggle: function() { 269 var settings = this.settings; 270 return tinymce.is(settings.toggle) ? parseInt(settings.toggle, 10) : 0; 271 }, 272 getEditorState: function(el) { 273 var state, s = this.settings; 274 return null == (state = !1 !== s.use_state_cookies ? tinymce.util.Storage.get("wf_editor_state_" + el.id) : state) && (state = tinymce.is(s.toggle_state) ? s.toggle_state : 1), 275 state = parseInt(state, 10); 276 }, 277 createInstance: function(el) { 278 var s = this.settings; 279 if (el = "string" == typeof el ? DOM.get(el) : el) { 280 s.width && DOM.setStyle(el, "width", s.width), s.height && DOM.setStyle(el, "height", s.height); 281 s = this.getEditorState(el);
282 if (this.canToggle()) { 283 this.createToggle(el); 284 var header = DOM.getPrev(el, ".wf-editor-header"); 285 if (!s) return DOM.addClass(el, "wf-no-editor"), DOM.hide(DOM.select(".wf-editor-tabs", header)), 286 DOM.addClass(el.parentNode, "wf-editor-toggle-off"), !1; 287 } 288 return !0; 289 } 290 }, 291 create: function(elements) { 292 var ed; 293 return "string" == typeof elements && ((ed = tinymce.get(elements)) && tinymce.remove(ed), 294 elements = [ elements ]), this.preinit(elements); 295 }, 296 preinit: function(elements) { 297 var self = this, settings = this.settings; 298 try { 299 elements = elements || DOM.select(".wf-editor"), each(elements, function(elm) { 300 var editorId; 301 return !(elm = DOM.get(elm)) || (editorId = function(elm) { 302 var id = elm.id; 303 return id || (id = (id = elm.name) && !DOM.get(id) ? elm.name : DOM.uniqueId(), 304 elm.setAttribute("id", id)), id; 305 }(elm), !!tinymce.get(editorId)) || (DOM.show(elm), "advanced" == settings.theme && self.createInstance(elm), 306 void new tinymce.Editor(editorId, settings, tinymce.EditorManager).render()); 307 }); 308 } catch (e) { 309 console.debug(e); 310 } 311 }, 312 toggleEditor: function(el) { 313 var activeTab, height, ed = tinymce.get(el.id); 314 if (ed) if (DOM.hasClass(el, "wf-no-editor")) switch (DOM.removeClass(el, "wf-no-editor"), 315 DOM.setStyle(DOM.select(".wf-editor-tabs", el.parentNode), "display", ""), 316 DOM.removeClass(el.parentNode, "wf-editor-toggle-off"), !1 !== this.settings.use_state_cookies && tinymce.util.Storage.set("wf_editor_state_" + el.id, 1), 317 (activeTab = !1 !== this.settings.use_state_cookies ? sessionStorage.getItem("wf-editor-tabs-" + ed.id) : activeTab) || ed.settings.active_tab, 318 DOM.hide(ed.getElement()), activeTab) { 319 default: 320 case "wf-editor-wysiwyg": 321 ed.show(); 322 break; 323 324 case "wf-editor-source": 325 ed.plugins.source.toggle(); 326 break; 327 328 case "wf-editor-preview": 329 ed.plugins.preview.toggle(); 330 } else DOM.addClass(el, "wf-no-editor"), DOM.hide(DOM.select(".wf-editor-tabs", el.parentNode)), 331 DOM.addClass(el.parentNode, "wf-editor-toggle-off"), (height = !1 !== this.settings.use_state_cookies ? sessionStorage.getItem("wf-editor-container-height") : height) && !ed.getParam("fullscreen_enabled") && DOM.setStyle(ed.getElement(), "height", height), 332 !1 !== this.settings.use_state_cookies && tinymce.util.Storage.set("wf_editor_state_" + el.id, 0), 333 ed.hide(), this.getContent(ed.id), ed.plugins.source && ed.plugins.source.hide(), 334 ed.plugins.preview && ed.plugins.preview.hide(), DOM.setStyle(ed.getElement(), "display", ""); else DOM.addClass(el.parentNode, "mce-loading"), 335 DOM.removeClass(el, "wf-no-editor"), DOM.removeClass(el.parentNode, "wf-editor-toggle-off"), 336 !1 !== this.settings.use_state_cookies && tinymce.util.Storage.set("wf_editor_state_" + el.id, 1), 337 tinymce.execCommand("mceToggleEditor", !1, el.id), setTimeout(function() { 338 DOM.removeClass(el.parentNode, "mce-loading"); 339 }, 1e3); 340 }, 341 getActiveTab: function(ed) { 342 var ed = ed.getElement().parentNode.querySelector(".wf-editor-tabs > button.active"); 343 return (ed = ed && ed.getAttribute("aria-controls")) ? ed.substring(10) : "wysiwyg"; 344 }, 345 getEditor: function(el) { 346 var ed, win = window; 347 return !win.tinymce && window.parent.tinymce && (win = window.parent), 348 !(!(ed = (ed = (el = el && ("string" == typeof el ? document.getElementById(el) : el)) && el.id ? win.tinymce.get(el.id) : ed) || win.tinymce.activeEditor) || !ed.getElement() || DOM.hasClass(ed.getElement(), "wf-no-editor")) && ("wysiwyg" == (el = this.getActiveTab(ed)) ? ed : "source" == el && ed.plugins.source); 349 }, 350 loadContent: function(ed) { 351 var code, el = ed.getElement(); 352 isHidden(ed.id + "_parent") && ed.plugins.source && null !== (code = ed.plugins.source.getContent()) && (/TEXTAREA|INPUT/i.test(el.nodeName) ? el.value = code : el.innerHTML = code, 353 ed.load()); 354 }, 355 createToggle: function(el) { 356 var self = this, s = this.settings, header = DOM.getPrev(el, ".wf-editor-header") || this.createHeader(el);
357 self.canToggle() && 0 === DOM.select("button.wf-editor-toggle", header).length && (header = DOM.add(header, "button", { 358 class: "wf-editor-toggle btn btn-link", 359 tabindex: "-1" 360 }, '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 448 448"><title></title><g id="wf-toggle-icon" stroke="none" stroke-width="1"></g><path d="M280 64.132v59.482c15.84 6.914 30.406 16.803 42.995 29.391 26.443 26.442 41.005 61.6 41.005 98.995s-14.563 72.552-41.005 98.995c-26.442 26.442-61.599 41.005-98.995 41.005s-72.552-14.563-98.995-41.005c-26.442-26.442-41.005-61.6-41.005-98.995s14.563-72.552 41.005-98.995c12.589-12.589 27.155-22.478 42.995-29.392v-59.481c-80.959 24.097-140 99.082-140 187.868 0 108.248 87.753 196 196 196s196-87.752 196-196c0-88.786-59.041-163.77-140-187.868zM196 0h56v224h-56z"></path></svg>' + (s.toggle_label || "")), 361 DOM.bind(header, "click", function(e) { 362 e.preventDefault(), self.toggleEditor(el); 363 })); 364 }, 365 setActiveLine: function(ed, pos, fromCharacterIndex) { 366 var blocks = [], doc = ed.getDoc(), body = ed.getBody(); 367 !(pos = parseInt(pos)) || pos < 0 || (fromCharacterIndex = fromCharacterIndex ? function(position) { 368 var walker = doc.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, !1); 369 let currentPos = 0; 370 for (;walker.nextNode(); ) { 371 var node = walker.currentNode, nodeLength = node.length; 372 if (currentPos + nodeLength >= position) return node.parentNode; 373 currentPos += nodeLength; 374 } 375 return null; 376 }(pos) : (each(ed.schema.getBlockElements(), function(value, name) { 377 if (/\W/.test(name)) return !0; 378 blocks.push(name.toLowerCase()); 379 }), ed.dom.select(blocks.join(","))[pos] || null)) && (ed.focus(), pos = fromCharacterIndex.childNodes.length, 380 ed.selection.setCursorLocation(fromCharacterIndex, pos), ed.selection.scrollIntoView(fromCharacterIndex)); 381 }, 382 getActiveLine: function(ed) { 383 var blocks = [], line = 0, node = (tinymce.each(ed.schema.getBlockElements(), function(value, name) { 384 if (/\W/.test(name)) return !0; 385 blocks.push(name.toLowerCase()); 386 }), ed.selection.getNode()), nodes = ed.dom.select(blocks.join(",")); 387 if (node) { 388 1 === node.nodeType && "bookmark" !== node.getAttribute("data-mce-type") || (node = node.parentNode); 389 for (var i = 0, len = nodes.length; i < len; i++) if (nodes[i] === node) { 390 line = i; 391 break; 392 } 393 } 394 return line; 395 }, 396 toggleTab: function(ed, tab) { 397 var h, ca, p, self = this, el = ed.getElement(); 398 return DOM.addClass(el.parentNode, "mce-loading"), isHidden(ed.id + "_parent") || DOM.hasClass(el.parentNode, "mce-fullscreen") || (ed.settings.container_height = ed.getContainer().offsetHeight, 399 !1 !== this.settings.use_state_cookies && sessionStorage.setItem("wf-editor-container-height", ed.settings.container_height), 400 ed.settings.container_width = ed.getContainer().offsetWidth, !1 !== this.settings.use_state_cookies && sessionStorage.setItem("wf-editor-container-width", ed.settings.container_width), 401 ed.settings.interface_height = (h = 0, ca = ed.getContentAreaContainer(), 402 p = ca.parentNode, tinymce.each(p.childNodes, function(n) { 403 n !== ca && (h += n.offsetHeight); 404 }), h), !1 !== this.settings.use_state_cookies && sessionStorage.setItem("wf-editor-interface-height", ed.settings.interface_height)), 405 "wf-editor-source" === tab ? (ed.hide(), DOM.hide(el), ed.plugins.preview && ed.plugins.preview.hide(), 406 ed.plugins.source.toggle()) : "wf-editor-preview" === tab ? (self.loadContent(ed), 407 ed.hide(), DOM.hide(el), ed.plugins.source && ed.plugins.source.hide(), 408 ed.onToggleTab.dispatch(ed, tab), ed.plugins.preview.toggle()) : (self.loadContent(ed), 409 ed.plugins.source && ((p = ed.plugins.source.getCursorPos()) && (ed.activeLine = p), 410 ed.plugins.source.hide()), ed.plugins.preview && ed.plugins.preview.hide(), 411 DOM.setStyle(ed.id + "_ifr", "max-width", DOM.getStyle(el.parentNode, "max-width")), 412 ed.show(), ed.activeLine && window.setTimeout(function() { 413 self.setActiveLine(ed, ed.activeLine, !0); 414 }, 100), void DOM.removeClass(el.parentNode, "mce-loading")); 415 }, 416 createHeader: function(element) { 417 var container = DOM.create("div", { 418 class: "editor wf-editor-container" 419 }, '<div class="wf-editor-header"></div>'); 420 return element.parentNode.insertBefore(container, element), DOM.add(container, element), 421 container.firstChild; 422 }, 423 createTabs: function(ed) { 424 var tablist, activeTab, self = this, settings = this.settings, el = ed.getElement(), header = DOM.getPrev(el, ".wf-editor-header") || this.createHeader(el); 425 if (!ed.plugins.source && !ed.plugins.preview) return !1; 426 function makeTabActive(tab) { 427 DOM.removeClass(DOM.select("button", tablist), "active"), DOM.setAttrib(DOM.select("button", tablist), "aria-expanded", "false"), 428 DOM.addClass(tab, "active"), DOM.setAttrib(tab, "aria-expanded", "true"); 429 } 430 DOM.select(".wf-editor-tabs", header).length || (ed.onToggleTab = new tinymce.util.Dispatcher(ed), 431 tablist = DOM.add(header, "div", { 432 role: "tablist", 433 class: "wf-editor-tabs nav nav-tabs" 434 }), activeTab = (activeTab = !1 !== settings.use_state_cookies ? sessionStorage.getItem("wf-editor-tabs-" + ed.id) : activeTab) || ed.settings.active_tab || "wf-editor-wysiwyg", 435 ed.settings.active_tab = activeTab, makeTabActive(DOM.add(tablist, "button", { 436 type: "button", 437 class: "nav-item", 438 "aria-controls": "wf-editor-wysiwyg" 439 }, ed.getLang("tab.wysiwyg", "Editor"))), ed.plugins.source && (header = DOM.add(tablist, "button", { 440 type: "button", 441 class: "nav-item", 442 "aria-controls": "wf-editor-source" 443 }, ed.getLang("tab.code", "Code")), "wf-editor-source" === activeTab) && makeTabActive(header), 444 ed.plugins.preview && (header = DOM.add(tablist, "button", { 445 type: "button", 446 class: "nav-item", 447 "aria-controls": "wf-editor-preview" 448 }, ed.getLang("tab.preview", "Preview")), "wf-editor-preview" === activeTab) && makeTabActive(header), 449 DOM.bind(tablist, "click", function(e) { 450 e.preventDefault(); 451 var e = DOM.getParent(e.target, "button"); 452 e && !DOM.hasClass(e, "active") && (makeTabActive(e), e = DOM.getAttrib(e, "aria-controls"), 453 !1 !== settings.use_state_cookies && sessionStorage.setItem("wf-editor-tabs-" + ed.id, e), 454 self.toggleTab(ed, e)); 455 }), activeTab = this.getEditorState(el), header = tinymce.is(settings.toggle) ? parseInt(settings.toggle, 10) : 0, 456 !activeTab && header && DOM.hide(DOM.select(".wf-editor-tabs", el.parentNode))); 457 }, 458 textareaResize: function(el) { 459 var container = DOM.getPrev(el, ".wf-editor-header").parentNode; 460 DOM.bind(el, "mousedown", function(e) { 461 var mm = DOM.bind(el, "mousemove", function(e) { 462 container.style.maxWidth = el.offsetWidth + "px"; 463 }), mu = DOM.bind(el, "mouseup", function(e) { 464 Event.remove(el, "mousemove", mm), Event.remove(el, "mouseup", mu), 465 container.style.maxWidth = el.offsetWidth + "px"; 466 }); 467 }); 468 }, 469 wrapText: function(el, s) { 470 s ? el.setAttribute("wrap", "soft") : el.removeAttribute("wrap"); 471 }, 472 setContent: function(id, html) { 473 var ed = this.getEditor(id); 474 ed ? ed.setContent(html) : (ed = document.getElementById(id)) && (ed.value = html); 475 }, 476 getContent: function(id) { 477 var state, ed = this.getEditor(id); 478 return ed ? (id = document.getElementById(id), state = this.isEditorActive(id), 479 ed && state ? ed.save() : id ? id.value : "") : ""; 480 }, 481 getSelection: function(id, args) { 482 id = this.getEditor(id); 483 return id && id.getSelection ? id.getSelection(args || {}) : document.getSelection().toString(); 484 }, 485 insert: function(el, v) { 486 var ed = this.getEditor(el); 487 return ed ? ed.execCommand ? isHidden(ed.getElement()) ? (ed.lastSelectionBookmark && ed.selection.moveToBookmark(ed.lastSelectionBookmark), 488 ed.execCommand("mceInsertContent", !1, v)) : this.insertIntoTextarea(ed.getElement(), v) : ed.insertContent(v) : (el = "string" == typeof el ? document.getElementById(el) : el) && !isHidden(el) && this.insertIntoTextarea(el, v), 489 !0; 490 }, 491 insertIntoTextarea: function(el, v) { 492 el.focus(), document.selection ? document.selection.createRange().text = v : el.setRangeText(v, el.selectionStart, el.selectionEnd, "end"); 493 }, 494 convertURL: function(url, elm, save, name) { 495 if (url) { 496 var ed = tinymce.EditorManager.activeEditor; 497 if (ed) { 498 var settings = ed.settings, base = settings.document_base_url; 499 if (settings.convert_urls && (!elm || "LINK" !== elm.nodeName) && 0 !== url.indexOf("file:") && url !== base && url !== base.substring(0, base.length - 1) && "/" !== url.charAt(0)) { 500 if (!settings.mixed_urls) { 501 if (settings.relative_urls) return 0 === url.indexOf(base) ? ed.documentBaseURI.toRelative(url) : url; 502 url = ed.documentBaseURI.toAbsolute(url, settings.remove_script_host); 503 } 504 settings.protocol_relative && (url = url.replace(/(http|https|ftp|ftps):\/\//, "//")); 505 } 506 } 507 } 508 return url; 509 }, 510 indent: function(h) { 511 return h = h.replace(/\n+/g, "\n"), tinymce.trim(h); 512 } 513 }; 514 document.addEventListener("DOMContentLoaded", function handler() { 515 WfEditor.init(), this.removeEventListener("DOMContentLoaded", handler), 516 Joomla.JoomlaTinyMCE = { 517 setupEditors: function(form) { 518 DOM.get(form) && DOM.select(".wf-editor", form).length && WfEditor.init(); 519 } 520 }; 521 }), window.WfEditor = window.WFEditor = WfEditor; 522}();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.