From 420506e58fdfc84f1a5bede0a01dedf0af3bb4f3 Mon Sep 17 00:00:00 2001
From: erdgeist
Date: Sat, 27 Jun 2026 16:58:53 +0200
Subject: Stage 7: Rails 7.2 → 8.1 on Ruby 3.2.11
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Bump Rails to 8.1.3 (Ruby unchanged at 3.2.11, new gemset rails8-upgrade)
- config.load_defaults 8.1; merge app:update diffs for all environment files
- Remove routing-filter 0.7.0; replace with native scope '(:locale)' in
routes.rb and default_url_options in ApplicationController
- Delete config/initializers/routing_filter_rails71_patch.rb
- Replace vendored TinyMCE 3.x (~200 files) with tinymce-rails ~> 8.3;
migrate admin_interface.js from jQuery .tinymce()/advanced theme to
tinymce.init(); add config/tinymce.yml; note: TinyMCE 7+ is GPL
- rails-i18n ~> 8.0 added explicitly (previously indirect dependency)
- awesome_nested_set, acts-as-taggable-on pinned to git main/master
(gemspec activerecord < 8.1 ceiling; no functional incompatibility;
repin to version once upstream releases updated gemspecs)
- globalize ~> 7.0, libxml-ruby ~> 5.0, nokogiri ~> 1.18, pg ~> 1.5
- sass-rails, coffee-rails, uglifier moved from :assets group to main
(Sprockets 4 convention; :assets group no longer meaningful)
- Node: head, draft, lock_owner marked belongs_to optional: true
- Page: node, user, editor marked belongs_to optional: true
- Static assets in public/images/ and public/javascripts/ referenced via
plain HTML tags; Rails 8 load_defaults raises on pipeline helpers for
undeclared assets
- sessions_controller_test.rb: remove stale require and dead rescue_action
- users_controller_test.rb: assert button[type=submit] not input[type=submit]
(Rails 8 button_to renders
is inserted
- // It seems to be that IE doesn't like a root block element placed inside another root block element
- if (t.settings.fix_ie_paragraphs)
- h = h.replace(/
<\/p>|
]+)><\/p>|
/gi, '
');
-
- set();
-
- if (t.settings.fix_ie_paragraphs) {
- // Check for odd paragraphs this is a sign of a broken DOM
- nl = e.getElementsByTagName("p");
- for (i = nl.length - 1, x = 0; i >= 0; i--) {
- n = nl[i];
-
- if (!n.hasChildNodes()) {
- if (!n.mce_keep) {
- x = 1; // Is broken
- break;
- }
-
- n.removeAttribute('mce_keep');
- }
- }
- }
-
- // Time to fix the madness IE left us
- if (x) {
- // So if we replace the p elements with divs and mark them and then replace them back to paragraphs
- // after we use innerHTML we can fix the DOM tree
- h = h.replace(/
]+)>|
/ig, '
');
- h = h.replace(/<\/p>/g, '
');
-
- // Set the new HTML with DIVs
- set();
-
- // Replace all DIV elements with he mce_tmp attibute back to paragraphs
- // This is needed since IE has a annoying bug see above for details
- // This is a slow process but it has to be done. :(
- if (t.settings.fix_ie_paragraphs) {
- nl = e.getElementsByTagName("DIV");
- for (i = nl.length - 1; i >= 0; i--) {
- n = nl[i];
-
- // Is it a temp div
- if (n.mce_tmp) {
- // Create new paragraph
- p = t.doc.createElement('p');
-
- // Copy all attributes
- n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) {
- var v;
-
- if (b !== 'mce_tmp') {
- v = n.getAttribute(b);
-
- if (!v && b === 'class')
- v = n.className;
-
- p.setAttribute(b, v);
- }
- });
-
- // Append all children to new paragraph
- for (x = 0; x|]+)>/gi, '<$1b$2>');
- h = h.replace(/<(\/?)em>|]+)>/gi, '<$1i$2>');
- } else if (isIE) {
- h = h.replace(/'/g, '''); // IE can't handle apos
- h = h.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi, ''); // IE doesn't handle default values correct
- }
-
- // Fix some issues
- h = h.replace(/]+)\/>|/gi, ''); // Force open
-
- // Store away src and href in mce_src and mce_href since browsers mess them up
- if (s.keep_values) {
- // Wrap scripts and styles in comments for serialization purposes
- if (/');
- };
-
- if (!tinymce.is(u, 'string')) {
- each(u, function(u) {
- loadScript(u);
- });
-
- if (cb)
- cb.call(s || t);
- } else {
- loadScript(u);
-
- if (cb)
- cb.call(s || t);
- }
- },
-
- loadQueue : function(cb, s) {
- var t = this;
-
- if (!t.queueLoading) {
- t.queueLoading = 1;
- t.queueCallbacks = [];
-
- t.loadScripts(t.queue, function() {
- t.queueLoading = 0;
-
- if (cb)
- cb.call(s || t);
-
- each(t.queueCallbacks, function(o) {
- o.func.call(o.scope);
- });
- });
- } else if (cb)
- t.queueCallbacks.push({func : cb, scope : s || t});
- },
-
- eval : function(co) {
- var w = window;
-
- // Evaluate script
- if (!w.execScript) {
- try {
- eval.call(w, co);
- } catch (ex) {
- eval(co, w); // Firefox 3.0a8
- }
- } else
- w.execScript(co); // IE
- },
-
- loadScripts : function(sc, cb, s) {
- var t = this, lo = t.lookup;
-
- function done(o) {
- o.state = 2; // Has been loaded
-
- // Run callback
- if (o.func)
- o.func.call(o.scope || t);
- };
-
- function allDone() {
- var l;
-
- // Check if all files are loaded
- l = sc.length;
- each(sc, function(o) {
- o = lo[o.url];
-
- if (o.state === 2) {// It has finished loading
- done(o);
- l--;
- } else
- load(o);
- });
-
- // They are all loaded
- if (l === 0 && cb) {
- cb.call(s || t);
- cb = 0;
- }
- };
-
- function load(o) {
- if (o.state > 0)
- return;
-
- o.state = 1; // Is loading
-
- tinymce.dom.ScriptLoader.loadScript(o.url, function() {
- done(o);
- allDone();
- });
-
- /*
- tinymce.util.XHR.send({
- url : o.url,
- error : t.settings.error,
- success : function(co) {
- t.eval(co);
- done(o);
- allDone();
- }
- });
- */
- };
-
- each(sc, function(o) {
- var u = o.url;
-
- // Add to queue if needed
- if (!lo[u]) {
- lo[u] = o;
- t.queue.push(o);
- } else
- o = lo[u];
-
- // Is already loading or has been loaded
- if (o.state > 0)
- return;
-
- if (!Event.domLoaded && !t.settings.strict_mode) {
- var ix, ol = '';
-
- // Add onload events
- if (cb || o.func) {
- o.state = 1; // Is loading
-
- ix = tinymce.dom.ScriptLoader._addOnLoad(function() {
- done(o);
- allDone();
- });
-
- if (tinymce.isIE)
- ol = ' onreadystatechange="';
- else
- ol = ' onload="';
-
- ol += 'tinymce.dom.ScriptLoader._onLoad(this,\'' + u + '\',' + ix + ');"';
- }
-
- document.write('');
-
- if (!o.func)
- done(o);
- } else
- load(o);
- });
-
- allDone();
- },
-
- // Static methods
- 'static' : {
- _addOnLoad : function(f) {
- var t = this;
-
- t._funcs = t._funcs || [];
- t._funcs.push(f);
-
- return t._funcs.length - 1;
- },
-
- _onLoad : function(e, u, ix) {
- if (!tinymce.isIE || e.readyState == 'complete')
- this._funcs[ix].call(this);
- },
-
- loadScript : function(u, cb) {
- var id = tinymce.DOM.uniqueId(), e;
-
- function done() {
- Event.clear(id);
- tinymce.DOM.remove(id);
-
- if (cb) {
- cb.call(document, u);
- cb = 0;
- }
- };
-
- if (tinymce.isIE) {
-/* Event.add(e, 'readystatechange', function(e) {
- if (e.target && e.target.readyState == 'complete')
- done();
- });*/
-
- tinymce.util.XHR.send({
- url : tinymce._addVer(u),
- async : false,
- success : function(co) {
- window.execScript(co);
- done();
- }
- });
- } else {
- e = tinymce.DOM.create('script', {id : id, type : 'text/javascript', src : tinymce._addVer(u)});
- Event.add(e, 'load', done);
-
- // Check for head or body
- (document.getElementsByTagName('head')[0] || document.body).appendChild(e);
- }
- }
- }
- });
-
- // Global script loader
- tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();
-})(tinymce);
-(function(tinymce) {
- // Shorten class names
- var DOM = tinymce.DOM, is = tinymce.is;
-
- tinymce.create('tinymce.ui.Control', {
- Control : function(id, s) {
- this.id = id;
- this.settings = s = s || {};
- this.rendered = false;
- this.onRender = new tinymce.util.Dispatcher(this);
- this.classPrefix = '';
- this.scope = s.scope || this;
- this.disabled = 0;
- this.active = 0;
- },
-
- setDisabled : function(s) {
- var e;
-
- if (s != this.disabled) {
- e = DOM.get(this.id);
-
- // Add accessibility title for unavailable actions
- if (e && this.settings.unavailable_prefix) {
- if (s) {
- this.prevTitle = e.title;
- e.title = this.settings.unavailable_prefix + ": " + e.title;
- } else
- e.title = this.prevTitle;
- }
-
- this.setState('Disabled', s);
- this.setState('Enabled', !s);
- this.disabled = s;
- }
- },
-
- isDisabled : function() {
- return this.disabled;
- },
-
- setActive : function(s) {
- if (s != this.active) {
- this.setState('Active', s);
- this.active = s;
- }
- },
-
- isActive : function() {
- return this.active;
- },
-
- setState : function(c, s) {
- var n = DOM.get(this.id);
-
- c = this.classPrefix + c;
-
- if (s)
- DOM.addClass(n, c);
- else
- DOM.removeClass(n, c);
- },
-
- isRendered : function() {
- return this.rendered;
- },
-
- renderHTML : function() {
- },
-
- renderTo : function(n) {
- DOM.setHTML(n, this.renderHTML());
- },
-
- postRender : function() {
- var t = this, b;
-
- // Set pending states
- if (is(t.disabled)) {
- b = t.disabled;
- t.disabled = -1;
- t.setDisabled(b);
- }
-
- if (is(t.active)) {
- b = t.active;
- t.active = -1;
- t.setActive(b);
- }
- },
-
- remove : function() {
- DOM.remove(this.id);
- this.destroy();
- },
-
- destroy : function() {
- tinymce.dom.Event.clear(this.id);
- }
- });
-})(tinymce);tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {
- Container : function(id, s) {
- this.parent(id, s);
-
- this.controls = [];
-
- this.lookup = {};
- },
-
- add : function(c) {
- this.lookup[c.id] = c;
- this.controls.push(c);
-
- return c;
- },
-
- get : function(n) {
- return this.lookup[n];
- }
-});
-
-tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
- Separator : function(id, s) {
- this.parent(id, s);
- this.classPrefix = 'mceSeparator';
- },
-
- renderHTML : function() {
- return tinymce.DOM.createHTML('span', {'class' : this.classPrefix});
- }
-});
-(function(tinymce) {
- var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;
-
- tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', {
- MenuItem : function(id, s) {
- this.parent(id, s);
- this.classPrefix = 'mceMenuItem';
- },
-
- setSelected : function(s) {
- this.setState('Selected', s);
- this.selected = s;
- },
-
- isSelected : function() {
- return this.selected;
- },
-
- postRender : function() {
- var t = this;
-
- t.parent();
-
- // Set pending state
- if (is(t.selected))
- t.setSelected(t.selected);
- }
- });
-})(tinymce);
-(function(tinymce) {
- var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;
-
- tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', {
- Menu : function(id, s) {
- var t = this;
-
- t.parent(id, s);
- t.items = {};
- t.collapsed = false;
- t.menuCount = 0;
- t.onAddItem = new tinymce.util.Dispatcher(this);
- },
-
- expand : function(d) {
- var t = this;
-
- if (d) {
- walk(t, function(o) {
- if (o.expand)
- o.expand();
- }, 'items', t);
- }
-
- t.collapsed = false;
- },
-
- collapse : function(d) {
- var t = this;
-
- if (d) {
- walk(t, function(o) {
- if (o.collapse)
- o.collapse();
- }, 'items', t);
- }
-
- t.collapsed = true;
- },
-
- isCollapsed : function() {
- return this.collapsed;
- },
-
- add : function(o) {
- if (!o.settings)
- o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o);
-
- this.onAddItem.dispatch(this, o);
-
- return this.items[o.id] = o;
- },
-
- addSeparator : function() {
- return this.add({separator : true});
- },
-
- addMenu : function(o) {
- if (!o.collapse)
- o = this.createMenu(o);
-
- this.menuCount++;
-
- return this.add(o);
- },
-
- hasMenus : function() {
- return this.menuCount !== 0;
- },
-
- remove : function(o) {
- delete this.items[o.id];
- },
-
- removeAll : function() {
- var t = this;
-
- walk(t, function(o) {
- if (o.removeAll)
- o.removeAll();
- else
- o.remove();
-
- o.destroy();
- }, 'items', t);
-
- t.items = {};
- },
-
- createMenu : function(o) {
- var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o);
-
- m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem);
-
- return m;
- }
- });
-})(tinymce);(function(tinymce) {
- var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element;
-
- tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {
- DropMenu : function(id, s) {
- s = s || {};
- s.container = s.container || DOM.doc.body;
- s.offset_x = s.offset_x || 0;
- s.offset_y = s.offset_y || 0;
- s.vp_offset_x = s.vp_offset_x || 0;
- s.vp_offset_y = s.vp_offset_y || 0;
-
- if (is(s.icons) && !s.icons)
- s['class'] += ' mceNoIcons';
-
- this.parent(id, s);
- this.onShowMenu = new tinymce.util.Dispatcher(this);
- this.onHideMenu = new tinymce.util.Dispatcher(this);
- this.classPrefix = 'mceMenu';
- },
-
- createMenu : function(s) {
- var t = this, cs = t.settings, m;
-
- s.container = s.container || cs.container;
- s.parent = t;
- s.constrain = s.constrain || cs.constrain;
- s['class'] = s['class'] || cs['class'];
- s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x;
- s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y;
- m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s);
-
- m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem);
-
- return m;
- },
-
- update : function() {
- var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th;
-
- tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth;
- th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight;
-
- if (!DOM.boxModel)
- t.element.setStyles({width : tw + 2, height : th + 2});
- else
- t.element.setStyles({width : tw, height : th});
-
- if (s.max_width)
- DOM.setStyle(co, 'width', tw);
-
- if (s.max_height) {
- DOM.setStyle(co, 'height', th);
-
- if (tb.clientHeight < s.max_height)
- DOM.setStyle(co, 'overflow', 'hidden');
- }
- },
-
- showMenu : function(x, y, px) {
- var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix;
-
- t.collapse(1);
-
- if (t.isMenuVisible)
- return;
-
- if (!t.rendered) {
- co = DOM.add(t.settings.container, t.renderNode());
-
- each(t.items, function(o) {
- o.postRender();
- });
-
- t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});
- } else
- co = DOM.get('menu_' + t.id);
-
- // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug
- if (!tinymce.isOpera)
- DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF});
-
- DOM.show(co);
- t.update();
-
- x += s.offset_x || 0;
- y += s.offset_y || 0;
- vp.w -= 4;
- vp.h -= 4;
-
- // Move inside viewport if not submenu
- if (s.constrain) {
- w = co.clientWidth - ot;
- h = co.clientHeight - ot;
- mx = vp.x + vp.w;
- my = vp.y + vp.h;
-
- if ((x + s.vp_offset_x + w) > mx)
- x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w);
-
- if ((y + s.vp_offset_y + h) > my)
- y = Math.max(0, (my - s.vp_offset_y) - h);
- }
-
- DOM.setStyles(co, {left : x , top : y});
- t.element.update();
-
- t.isMenuVisible = 1;
- t.mouseClickFunc = Event.add(co, 'click', function(e) {
- var m;
-
- e = e.target;
-
- if (e && (e = DOM.getParent(e, 'tr')) && !DOM.hasClass(e, cp + 'ItemSub')) {
- m = t.items[e.id];
-
- if (m.isDisabled())
- return;
-
- dm = t;
-
- while (dm) {
- if (dm.hideMenu)
- dm.hideMenu();
-
- dm = dm.settings.parent;
- }
-
- if (m.settings.onclick)
- m.settings.onclick(e);
-
- return Event.cancel(e); // Cancel to fix onbeforeunload problem
- }
- });
-
- if (t.hasMenus()) {
- t.mouseOverFunc = Event.add(co, 'mouseover', function(e) {
- var m, r, mi;
-
- e = e.target;
- if (e && (e = DOM.getParent(e, 'tr'))) {
- m = t.items[e.id];
-
- if (t.lastMenu)
- t.lastMenu.collapse(1);
-
- if (m.isDisabled())
- return;
-
- if (e && DOM.hasClass(e, cp + 'ItemSub')) {
- //p = DOM.getPos(s.container);
- r = DOM.getRect(e);
- m.showMenu((r.x + r.w - ot), r.y - ot, r.x);
- t.lastMenu = m;
- DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive');
- }
- }
- });
- }
-
- t.onShowMenu.dispatch(t);
-
- if (s.keyboard_focus) {
- Event.add(co, 'keydown', t._keyHandler, t);
- DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link
- t._focusIdx = 0;
- }
- },
-
- hideMenu : function(c) {
- var t = this, co = DOM.get('menu_' + t.id), e;
-
- if (!t.isMenuVisible)
- return;
-
- Event.remove(co, 'mouseover', t.mouseOverFunc);
- Event.remove(co, 'click', t.mouseClickFunc);
- Event.remove(co, 'keydown', t._keyHandler);
- DOM.hide(co);
- t.isMenuVisible = 0;
-
- if (!c)
- t.collapse(1);
-
- if (t.element)
- t.element.hide();
-
- if (e = DOM.get(t.id))
- DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive');
-
- t.onHideMenu.dispatch(t);
- },
-
- add : function(o) {
- var t = this, co;
-
- o = t.parent(o);
-
- if (t.isRendered && (co = DOM.get('menu_' + t.id)))
- t._add(DOM.select('tbody', co)[0], o);
-
- return o;
- },
-
- collapse : function(d) {
- this.parent(d);
- this.hideMenu(1);
- },
-
- remove : function(o) {
- DOM.remove(o.id);
- this.destroy();
-
- return this.parent(o);
- },
-
- destroy : function() {
- var t = this, co = DOM.get('menu_' + t.id);
-
- Event.remove(co, 'mouseover', t.mouseOverFunc);
- Event.remove(co, 'click', t.mouseClickFunc);
-
- if (t.element)
- t.element.remove();
-
- DOM.remove(co);
- },
-
- renderNode : function() {
- var t = this, s = t.settings, n, tb, co, w;
-
- w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'});
- co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')});
- t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});
-
- if (s.menu_line)
- DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'});
-
-// n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'});
- n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0});
- tb = DOM.add(n, 'tbody');
-
- each(t.items, function(o) {
- t._add(tb, o);
- });
-
- t.rendered = true;
-
- return w;
- },
-
- // Internal functions
-
- _keyHandler : function(e) {
- var t = this, kc = e.keyCode;
-
- function focus(d) {
- var i = t._focusIdx + d, e = DOM.select('a', 'menu_' + t.id)[i];
-
- if (e) {
- t._focusIdx = i;
- e.focus();
- }
- };
-
- switch (kc) {
- case 38:
- focus(-1); // Select first link
- return;
-
- case 40:
- focus(1);
- return;
-
- case 13:
- return;
-
- case 27:
- return this.hideMenu();
- }
- },
-
- _add : function(tb, o) {
- var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic;
-
- if (s.separator) {
- ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'});
- DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'});
-
- if (n = ro.previousSibling)
- DOM.addClass(n, 'mceLast');
-
- return;
- }
-
- n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'});
- n = it = DOM.add(n, 'td');
- n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'});
-
- DOM.addClass(it, s['class']);
-// n = DOM.add(n, 'span', {'class' : 'item'});
-
- ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')});
-
- if (s.icon_src)
- DOM.add(ic, 'img', {src : s.icon_src});
-
- n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title);
-
- if (o.settings.style)
- DOM.setAttrib(n, 'style', o.settings.style);
-
- if (tb.childNodes.length == 1)
- DOM.addClass(ro, 'mceFirst');
-
- if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator'))
- DOM.addClass(ro, 'mceFirst');
-
- if (o.collapse)
- DOM.addClass(ro, cp + 'ItemSub');
-
- if (n = ro.previousSibling)
- DOM.removeClass(n, 'mceLast');
-
- DOM.addClass(ro, 'mceLast');
- }
- });
-})(tinymce);(function(tinymce) {
- var DOM = tinymce.DOM;
-
- tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {
- Button : function(id, s) {
- this.parent(id, s);
- this.classPrefix = 'mceButton';
- },
-
- renderHTML : function() {
- var cp = this.classPrefix, s = this.settings, h, l;
-
- l = DOM.encode(s.label || '');
- h = '';
-
- if (s.image)
- h += '' + l + '';
- else
- h += '' + (l ? '' + l + '' : '') + '';
-
- return h;
- },
-
- postRender : function() {
- var t = this, s = t.settings;
-
- tinymce.dom.Event.add(t.id, 'click', function(e) {
- if (!t.isDisabled())
- return s.onclick.call(s.scope, e);
- });
- }
- });
-})(tinymce);
-(function(tinymce) {
- var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;
-
- tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', {
- ListBox : function(id, s) {
- var t = this;
-
- t.parent(id, s);
-
- t.items = [];
-
- t.onChange = new Dispatcher(t);
-
- t.onPostRender = new Dispatcher(t);
-
- t.onAdd = new Dispatcher(t);
-
- t.onRenderMenu = new tinymce.util.Dispatcher(this);
-
- t.classPrefix = 'mceListBox';
- },
-
- select : function(va) {
- var t = this, fv, f;
-
- if (va == undefined)
- return t.selectByIndex(-1);
-
- // Is string or number make function selector
- if (va && va.call)
- f = va;
- else {
- f = function(v) {
- return v == va;
- };
- }
-
- // Do we need to do something?
- if (va != t.selectedValue) {
- // Find item
- each(t.items, function(o, i) {
- if (f(o.value)) {
- fv = 1;
- t.selectByIndex(i);
- return false;
- }
- });
-
- if (!fv)
- t.selectByIndex(-1);
- }
- },
-
- selectByIndex : function(idx) {
- var t = this, e, o;
-
- if (idx != t.selectedIndex) {
- e = DOM.get(t.id + '_text');
- o = t.items[idx];
-
- if (o) {
- t.selectedValue = o.value;
- t.selectedIndex = idx;
- DOM.setHTML(e, DOM.encode(o.title));
- DOM.removeClass(e, 'mceTitle');
- } else {
- DOM.setHTML(e, DOM.encode(t.settings.title));
- DOM.addClass(e, 'mceTitle');
- t.selectedValue = t.selectedIndex = null;
- }
-
- e = 0;
- }
- },
-
- add : function(n, v, o) {
- var t = this;
-
- o = o || {};
- o = tinymce.extend(o, {
- title : n,
- value : v
- });
-
- t.items.push(o);
- t.onAdd.dispatch(t, o);
- },
-
- getLength : function() {
- return this.items.length;
- },
-
- renderHTML : function() {
- var h = '', t = this, s = t.settings, cp = t.classPrefix;
-
- h = '