diff --git a/builds/appchan-x.js b/builds/appchan-x.js index 319333f39..87c204067 100644 --- a/builds/appchan-x.js +++ b/builds/appchan-x.js @@ -10918,12 +10918,20 @@ MascotTools = { init: function(mascot) { - var el, location; + var el, name; if (!(mascot && (mascot.image != null))) { - mascot = Mascots[Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]]; + if (!Conf[g.MASCOTSTRING].length) { + return; + } + name = Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]; + mascot = Mascots[name]; + Conf['mascot'] = name; } - this.el = el = $('#mascot img', d.body); + if (!this.el) { + this.el = $('#mascot img', d.body); + } + el = this.el; if (!Conf['Mascots'] || (Conf['Hide Mascots on Catalog'] && g.VIEW === 'catalog')) { if (el) { return el.src = ""; @@ -10939,29 +10947,18 @@ $.rmClass(doc, 'mascot-position-bottom'); } if (!mascot) { - if (!(mascot = Mascots[Conf["mascot"]])) { + if (name && !(mascot = Mascots[name])) { if (el) { el.src = ""; } else { null; } - Conf[g.MASCOTSTRING].remove(Conf["mascot"]); + Conf[g.MASCOTSTRING].remove(name); return MascotTools.init(); } } MascotTools.addMascot(mascot); - if (Conf["Sidebar Location"] === 'left') { - if (Conf["Mascot Location"] === "sidebar") { - location = 'left'; - } else { - location = 'right'; - } - } else if (Conf["Mascot Location"] === "sidebar") { - location = 'right'; - } else { - location = 'left'; - } - return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n -moz-box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n pointer-events: none;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n -moz-box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; + return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n -moz-box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n cursor: pointer;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n -moz-box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; }, categories: ['Anime', 'Ponies', 'Questionable', 'Silhouette', 'Western'], dialog: function(key) { @@ -10975,7 +10972,7 @@ } editMascot.name = key || ''; MascotTools.addMascot(editMascot); - MascotTools.init(_conf["mascot"]); + MascotTools.init(editMascot); layout = { name: ["Mascot Name", "", "text"], image: ["Image", "", "text"], @@ -11003,7 +11000,7 @@ $.on(input, 'blur', function() { editMascot[this.name] = this.value; MascotTools.addMascot(editMascot); - return MascotTools.init(_conf["mascot"]); + return MascotTools.init(editMascot); }); fileInput = $.el('input', { type: "file", @@ -11028,14 +11025,12 @@ return alert("Mascot names must start with a letter."); } editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } else { $.on(input, 'blur', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } break; @@ -11043,8 +11038,7 @@ div = this.input(item, name); $.on($('input', div), 'blur', function() { editMascot[this.name] = parseInt(this.value); - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "select": @@ -11064,8 +11058,7 @@ setting.value = value; $.on($('select', div), 'change', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "checkbox": @@ -11076,8 +11069,7 @@ }); $.on($('input', div), 'click', function() { editMascot[this.name] = this.checked ? true : false; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } nodes.push(div); @@ -11125,16 +11117,19 @@ return reader.readAsDataURL(file); }, addMascot: function(mascot) { - var el; + var div, el, image; + image = Array.isArray(mascot.image) ? Style.lightTheme ? mascot.image[1] : mascot.image[0] : mascot.image; if (el = this.el) { - return el.src = Array.isArray(mascot.image) ? (Style.lightTheme ? mascot.image[1] : mascot.image[0]) : mascot.image; + return el.src = image; } else { - this.el = el = $.el('div', { + div = $.el('div', { id: "mascot", - innerHTML: "" + innerHTML: "" }); - return $.add(d.body, el); + this.el = div.firstElementChild; + $.on(this.el, 'mousedown', MascotTools.click); + return $.add(d.body, div); } }, save: function(mascot) { @@ -11184,6 +11179,10 @@ return alert("Mascot \"" + name + "\" saved."); }); }, + click: function(e) { + e.preventDefault(); + return MascotTools.init(); + }, close: function() { Conf['editMode'] = false; editMascot = {}; @@ -11448,10 +11447,10 @@ $.extend(Style, { layoutCSS: $.addStyle(Style.layout, 'layout'), themeCSS: $.addStyle(Style.theme(theme), 'theme'), + dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic'), icons: $.addStyle("", 'icons'), paddingSheet: $.addStyle("", 'padding'), - mascot: $.addStyle("", 'mascotSheet'), - dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic') + mascot: $.addStyle("", 'mascotSheet') }); $.addStyle(JSColor.css(), 'jsColor'); if (d.head) { @@ -11502,7 +11501,6 @@ if (!theme) { theme = Themes[_conf['theme']] || Themes['Yotsuba B']; } - MascotTools.init(_conf["mascot"]); Style.dynamicCSS.textContent = Style.dynamic(); Style.iconPositions(); return Style.padding(); @@ -14441,8 +14439,9 @@ MascotTools.init(); } } else { + Conf['mascot'] = this.id; Conf[g.MASCOTSTRING].push(this.id); - MascotTools.init(this.id); + MascotTools.init(Mascots[this.id]); } $.toggleClass(this, 'enabled'); return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING]); diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 0d6af08cc..32f7c1c5d 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -10912,12 +10912,20 @@ MascotTools = { init: function(mascot) { - var el, location; + var el, name; if (!(mascot && (mascot.image != null))) { - mascot = Mascots[Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]]; + if (!Conf[g.MASCOTSTRING].length) { + return; + } + name = Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]; + mascot = Mascots[name]; + Conf['mascot'] = name; } - this.el = el = $('#mascot img', d.body); + if (!this.el) { + this.el = $('#mascot img', d.body); + } + el = this.el; if (!Conf['Mascots'] || (Conf['Hide Mascots on Catalog'] && g.VIEW === 'catalog')) { if (el) { return el.src = ""; @@ -10933,29 +10941,18 @@ $.rmClass(doc, 'mascot-position-bottom'); } if (!mascot) { - if (!(mascot = Mascots[Conf["mascot"]])) { + if (name && !(mascot = Mascots[name])) { if (el) { el.src = ""; } else { null; } - Conf[g.MASCOTSTRING].remove(Conf["mascot"]); + Conf[g.MASCOTSTRING].remove(name); return MascotTools.init(); } } MascotTools.addMascot(mascot); - if (Conf["Sidebar Location"] === 'left') { - if (Conf["Mascot Location"] === "sidebar") { - location = 'left'; - } else { - location = 'right'; - } - } else if (Conf["Mascot Location"] === "sidebar") { - location = 'right'; - } else { - location = 'left'; - } - return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n -moz-box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n pointer-events: none;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n -moz-box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; + return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n -moz-box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n cursor: pointer;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n -moz-box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; }, categories: ['Anime', 'Ponies', 'Questionable', 'Silhouette', 'Western'], dialog: function(key) { @@ -10969,7 +10966,7 @@ } editMascot.name = key || ''; MascotTools.addMascot(editMascot); - MascotTools.init(_conf["mascot"]); + MascotTools.init(editMascot); layout = { name: ["Mascot Name", "", "text"], image: ["Image", "", "text"], @@ -10997,7 +10994,7 @@ $.on(input, 'blur', function() { editMascot[this.name] = this.value; MascotTools.addMascot(editMascot); - return MascotTools.init(_conf["mascot"]); + return MascotTools.init(editMascot); }); fileInput = $.el('input', { type: "file", @@ -11022,14 +11019,12 @@ return alert("Mascot names must start with a letter."); } editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } else { $.on(input, 'blur', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } break; @@ -11037,8 +11032,7 @@ div = this.input(item, name); $.on($('input', div), 'blur', function() { editMascot[this.name] = parseInt(this.value); - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "select": @@ -11058,8 +11052,7 @@ setting.value = value; $.on($('select', div), 'change', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "checkbox": @@ -11070,8 +11063,7 @@ }); $.on($('input', div), 'click', function() { editMascot[this.name] = this.checked ? true : false; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } nodes.push(div); @@ -11119,16 +11111,19 @@ return reader.readAsDataURL(file); }, addMascot: function(mascot) { - var el; + var div, el, image; + image = Array.isArray(mascot.image) ? Style.lightTheme ? mascot.image[1] : mascot.image[0] : mascot.image; if (el = this.el) { - return el.src = Array.isArray(mascot.image) ? (Style.lightTheme ? mascot.image[1] : mascot.image[0]) : mascot.image; + return el.src = image; } else { - this.el = el = $.el('div', { + div = $.el('div', { id: "mascot", - innerHTML: "" + innerHTML: "" }); - return $.add(d.body, el); + this.el = div.firstElementChild; + $.on(this.el, 'mousedown', MascotTools.click); + return $.add(d.body, div); } }, save: function(mascot) { @@ -11178,6 +11173,10 @@ return alert("Mascot \"" + name + "\" saved."); }); }, + click: function(e) { + e.preventDefault(); + return MascotTools.init(); + }, close: function() { Conf['editMode'] = false; editMascot = {}; @@ -11442,10 +11441,10 @@ $.extend(Style, { layoutCSS: $.addStyle(Style.layout, 'layout'), themeCSS: $.addStyle(Style.theme(theme), 'theme'), + dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic'), icons: $.addStyle("", 'icons'), paddingSheet: $.addStyle("", 'padding'), - mascot: $.addStyle("", 'mascotSheet'), - dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic') + mascot: $.addStyle("", 'mascotSheet') }); $.addStyle(JSColor.css(), 'jsColor'); if (d.head) { @@ -11496,7 +11495,6 @@ if (!theme) { theme = Themes[_conf['theme']] || Themes['Yotsuba B']; } - MascotTools.init(_conf["mascot"]); Style.dynamicCSS.textContent = Style.dynamic(); Style.iconPositions(); return Style.padding(); @@ -14440,8 +14438,9 @@ MascotTools.init(); } } else { + Conf['mascot'] = this.id; Conf[g.MASCOTSTRING].push(this.id); - MascotTools.init(this.id); + MascotTools.init(Mascots[this.id]); } $.toggleClass(this, 'enabled'); return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING]); diff --git a/builds/crx/script.js b/builds/crx/script.js index 827b6e4f8..1d5ad33c6 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -10895,12 +10895,20 @@ MascotTools = { init: function(mascot) { - var el, location; + var el, name; if (!(mascot && (mascot.image != null))) { - mascot = Mascots[Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]]; + if (!Conf[g.MASCOTSTRING].length) { + return; + } + name = Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]; + mascot = Mascots[name]; + Conf['mascot'] = name; } - this.el = el = $('#mascot img', d.body); + if (!this.el) { + this.el = $('#mascot img', d.body); + } + el = this.el; if (!Conf['Mascots'] || (Conf['Hide Mascots on Catalog'] && g.VIEW === 'catalog')) { if (el) { return el.src = ""; @@ -10916,29 +10924,18 @@ $.rmClass(doc, 'mascot-position-bottom'); } if (!mascot) { - if (!(mascot = Mascots[Conf["mascot"]])) { + if (name && !(mascot = Mascots[name])) { if (el) { el.src = ""; } else { null; } - Conf[g.MASCOTSTRING].remove(Conf["mascot"]); + Conf[g.MASCOTSTRING].remove(name); return MascotTools.init(); } } MascotTools.addMascot(mascot); - if (Conf["Sidebar Location"] === 'left') { - if (Conf["Mascot Location"] === "sidebar") { - location = 'left'; - } else { - location = 'right'; - } - } else if (Conf["Mascot Location"] === "sidebar") { - location = 'right'; - } else { - location = 'left'; - } - return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n pointer-events: none;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; + return Style.mascot.textContent = "#mascot {\n display: none;\n}\n.mascots #mascot {\n display: block;\n}\n.sidebar-location-left #mascot img {\n box-sizingtransform: scaleX(-1);\n}\n.sidebar-location-right.mascot-location-sidebar #mascot img,\n.sidebar-location-left #mascot img {\n right: 0;\n left: auto;\n margin-right: " + mascot.hOffset + "px;\n}\n.sidebar-location-right.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-left.sidebar-large #mascot img {\n right: " + (mascot.center ? 25 : 0) + "px;\n}\n.sidebar-location-left.mascot-location-sidebar #mascot img,\n.sidebar-location-right #mascot img {\n left: 0;\n right: auto;\n margin-left: " + mascot.hOffset + "px;\n}\n.sidebar-location-left.sidebar-large.mascot-location-sidebar #mascot img,\n.sidebar-location-right.sidebar-large #mascot img {\n left: " + (mascot.center ? 25 : 0) + "px;\n}\n#mascot img {\n position: fixed;\n z-index: -1;\n bottom: 20.1em;\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n cursor: pointer;\n}\n.fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img,\n.fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.mascot-position-bottom #mascot img,\n.fourchan-ss-navigation.bottom.fixed:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom:not(.post-form-style-fixed):not(.post-form-style-transparent-fade) #mascot img {\n bottom: 1.5em;\n}\n.fourchan-ss-navigation.bottom.fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom #mascot img {\n bottom: 21.6em;\n}\n.fourchan-ss-navigation.bottom.fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.post-form-decorations #mascot img {\n bottom: 21.8em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade #mascot img {\n bottom: 22.9em;\n}\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-fixed.post-form-decorations #mascot img,\n.fourchan-ss-navigation.bottom.fixed.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img,\n.fourchan-ss-navigation.index.pagination-sticky-bottom.show-post-form-header.post-form-style-transparent-fade.post-form-decorations #mascot img {\n bottom: 23.1em;\n}\n.mascot-position-bottom #mascot img,\n.mascot-position-default.posting-disabled #mascot img {\n bottom: 0;\n}\n.mascots-overlap-posts #mascot img {\n z-index: 3;\n}\n.mascot-position-middle #mascot img {\n bottom: 50%;\n box-sizingtransform: translateY(50%);\n}\n.mascot-position-top #mascot img {\n bottom: auto !important;\n top: 17px;\n}\n.grayscale-mascots #mascot img {\n filter: url('data:image/svg+xml,#filters');\n}"; }, categories: ['Anime', 'Ponies', 'Questionable', 'Silhouette', 'Western'], dialog: function(key) { @@ -10952,7 +10949,7 @@ } editMascot.name = key || ''; MascotTools.addMascot(editMascot); - MascotTools.init(_conf["mascot"]); + MascotTools.init(editMascot); layout = { name: ["Mascot Name", "", "text"], image: ["Image", "", "text"], @@ -10980,7 +10977,7 @@ $.on(input, 'blur', function() { editMascot[this.name] = this.value; MascotTools.addMascot(editMascot); - return MascotTools.init(_conf["mascot"]); + return MascotTools.init(editMascot); }); fileInput = $.el('input', { type: "file", @@ -11005,14 +11002,12 @@ return alert("Mascot names must start with a letter."); } editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } else { $.on(input, 'blur', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } break; @@ -11020,8 +11015,7 @@ div = this.input(item, name); $.on($('input', div), 'blur', function() { editMascot[this.name] = parseInt(this.value); - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "select": @@ -11041,8 +11035,7 @@ setting.value = value; $.on($('select', div), 'change', function() { editMascot[this.name] = this.value; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); break; case "checkbox": @@ -11053,8 +11046,7 @@ }); $.on($('input', div), 'click', function() { editMascot[this.name] = this.checked ? true : false; - MascotTools.addMascot(editMascot); - return Style.addStyle(); + return MascotTools.init(editMascot); }); } nodes.push(div); @@ -11102,16 +11094,19 @@ return reader.readAsDataURL(file); }, addMascot: function(mascot) { - var el; + var div, el, image; + image = Array.isArray(mascot.image) ? Style.lightTheme ? mascot.image[1] : mascot.image[0] : mascot.image; if (el = this.el) { - return el.src = Array.isArray(mascot.image) ? (Style.lightTheme ? mascot.image[1] : mascot.image[0]) : mascot.image; + return el.src = image; } else { - this.el = el = $.el('div', { + div = $.el('div', { id: "mascot", - innerHTML: "" + innerHTML: "" }); - return $.add(d.body, el); + this.el = div.firstElementChild; + $.on(this.el, 'mousedown', MascotTools.click); + return $.add(d.body, div); } }, save: function(mascot) { @@ -11161,6 +11156,10 @@ return alert("Mascot \"" + name + "\" saved."); }); }, + click: function(e) { + e.preventDefault(); + return MascotTools.init(); + }, close: function() { Conf['editMode'] = false; editMascot = {}; @@ -11426,10 +11425,10 @@ $.extend(Style, { layoutCSS: $.addStyle(Style.layout, 'layout'), themeCSS: $.addStyle(Style.theme(theme), 'theme'), + dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic'), icons: $.addStyle("", 'icons'), paddingSheet: $.addStyle("", 'padding'), - mascot: $.addStyle("", 'mascotSheet'), - dynamicCSS: $.addStyle(Style.dynamic(), 'dynamic') + mascot: $.addStyle("", 'mascotSheet') }); $.addStyle(JSColor.css(), 'jsColor'); if (d.head) { @@ -11480,7 +11479,6 @@ if (!theme) { theme = Themes[_conf['theme']] || Themes['Yotsuba B']; } - MascotTools.init(_conf["mascot"]); Style.dynamicCSS.textContent = Style.dynamic(); Style.iconPositions(); return Style.padding(); @@ -14419,8 +14417,9 @@ MascotTools.init(); } } else { + Conf['mascot'] = this.id; Conf[g.MASCOTSTRING].push(this.id); - MascotTools.init(this.id); + MascotTools.init(Mascots[this.id]); } $.toggleClass(this, 'enabled'); return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING]); diff --git a/src/General/Settings.coffee b/src/General/Settings.coffee index de38035b8..e68ff5089 100644 --- a/src/General/Settings.coffee +++ b/src/General/Settings.coffee @@ -889,8 +889,9 @@ Settings = if Conf['mascot'] is @id MascotTools.init() else + Conf['mascot'] = @id Conf[g.MASCOTSTRING].push @id - MascotTools.init @id + MascotTools.init Mascots[@id] $.toggleClass @, 'enabled' $.set g.MASCOTSTRING, Conf[g.MASCOTSTRING] diff --git a/src/Theming/Mascots.coffee b/src/Theming/Mascots.coffee index 809568266..a3e2af1fc 100644 --- a/src/Theming/Mascots.coffee +++ b/src/Theming/Mascots.coffee @@ -1,9 +1,15 @@ MascotTools = init: (mascot) -> unless mascot and mascot.image? - mascot = Mascots[Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]] + return unless Conf[g.MASCOTSTRING].length + name = Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)] + mascot = Mascots[name] + Conf['mascot'] = name - @el = el = $('#mascot img', d.body) + unless @el + @el = $ '#mascot img', d.body + + el = @el if !Conf['Mascots'] or (Conf['Hide Mascots on Catalog'] and g.VIEW is 'catalog') return if el then el.src = "" else null @@ -16,23 +22,13 @@ MascotTools = $.rmClass doc, 'mascot-position-bottom' unless mascot - unless mascot = Mascots[Conf["mascot"]] + if name and not mascot = Mascots[name] if el then el.src = "" else null - Conf[g.MASCOTSTRING].remove Conf["mascot"] + Conf[g.MASCOTSTRING].remove name return MascotTools.init() MascotTools.addMascot mascot - if Conf["Sidebar Location"] is 'left' - if Conf["Mascot Location"] is "sidebar" - location = 'left' - else - location = 'right' - else if Conf["Mascot Location"] is "sidebar" - location = 'right' - else - location = 'left' - Style.mascot.textContent = """ #mascot { display: none; @@ -84,7 +80,7 @@ MascotTools = 'auto' }; margin-bottom: #{mascot.vOffset or 0}px; - pointer-events: none; + cursor: pointer; } .fourchan-ss-navigation.bottom.fixed.posting-disabled #mascot img, .fourchan-ss-navigation.bottom.fixed.mascot-position-bottom #mascot img, @@ -149,7 +145,7 @@ MascotTools = editMascot = {} editMascot.name = key or '' MascotTools.addMascot editMascot - MascotTools.init _conf["mascot"] + MascotTools.init editMascot layout = name: [ "Mascot Name" @@ -234,7 +230,7 @@ MascotTools = $.on input, 'blur', -> editMascot[@name] = @value MascotTools.addMascot editMascot - MascotTools.init _conf["mascot"] + MascotTools.init editMascot fileInput = $.el 'input', type: "file" @@ -258,22 +254,19 @@ MascotTools = if (@value isnt "") and !/^[a-z]/i.test @value return alert "Mascot names must start with a letter." editMascot[@name] = @value - MascotTools.addMascot editMascot - Style.addStyle() + MascotTools.init editMascot else $.on input, 'blur', -> editMascot[@name] = @value - MascotTools.addMascot editMascot - Style.addStyle() + MascotTools.init editMascot when "number" div = @input item, name $.on $('input', div), 'blur', -> editMascot[@name] = parseInt @value - MascotTools.addMascot editMascot - Style.addStyle() + MascotTools.init editMascot when "select" value = editMascot[name] or item[1] @@ -289,8 +282,7 @@ MascotTools = $.on $('select', div), 'change', -> editMascot[@name] = @value - MascotTools.addMascot editMascot - Style.addStyle() + MascotTools.init editMascot when "checkbox" value = editMascot[name] or item[1] @@ -299,8 +291,7 @@ MascotTools = innerHTML: "" $.on $('input', div), 'click', -> editMascot[@name] = if @checked then true else false - MascotTools.addMascot editMascot - Style.addStyle() + MascotTools.init editMascot nodes.push div $.add $("#mascotcontent", dialog), nodes @@ -343,14 +334,25 @@ MascotTools = reader.readAsDataURL file addMascot: (mascot) -> + image = + if Array.isArray mascot.image + if Style.lightTheme + mascot.image[1] + else + mascot.image[0] + else mascot.image if el = @el - el.src = if Array.isArray(mascot.image) then (if Style.lightTheme then mascot.image[1] else mascot.image[0]) else mascot.image + el.src = image else - @el = el = $.el 'div', + div = $.el 'div', id: "mascot" - innerHTML: "" + innerHTML: "" - $.add d.body, el + @el = div.firstElementChild + + $.on @el, 'mousedown', MascotTools.click + + $.add d.body, div save: (mascot) -> {name, image} = mascot @@ -390,6 +392,10 @@ MascotTools = $.set 'userMascots', userMascots alert "Mascot \"#{name}\" saved." + click: (e) -> + e.preventDefault() + MascotTools.init() + close: -> Conf['editMode'] = false editMascot = {} diff --git a/src/Theming/Style.coffee b/src/Theming/Style.coffee index 5d0eeaaaa..32c265ebb 100644 --- a/src/Theming/Style.coffee +++ b/src/Theming/Style.coffee @@ -74,10 +74,10 @@ Style = $.extend Style, layoutCSS: $.addStyle Style.layout, 'layout' themeCSS: $.addStyle Style.theme(theme), 'theme' + dynamicCSS: $.addStyle Style.dynamic(), 'dynamic' icons: $.addStyle "", 'icons' paddingSheet: $.addStyle "", 'padding' mascot: $.addStyle "", 'mascotSheet' - dynamicCSS: $.addStyle Style.dynamic(), 'dynamic' # Non-customizable $.addStyle JSColor.css(), 'jsColor' @@ -120,7 +120,6 @@ Style = unless theme theme = Themes[_conf['theme']] or Themes['Yotsuba B'] - MascotTools.init _conf["mascot"] Style.dynamicCSS.textContent = Style.dynamic() Style.iconPositions() Style.padding()