<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Charts-core.js</id>
	<title>MediaWiki:Gadget-Charts-core.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Charts-core.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;action=history"/>
	<updated>2026-04-20T16:07:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=39026&amp;oldid=prev</id>
		<title>Alex at 16:14, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=39026&amp;oldid=prev"/>
		<updated>2024-10-17T16:14:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;amp;diff=39026&amp;amp;oldid=38895&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=38895&amp;oldid=prev</id>
		<title>Alex at 16:12, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=38895&amp;oldid=prev"/>
		<updated>2024-10-17T16:12:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;amp;diff=38895&amp;amp;oldid=839&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=839&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;var DARKMODE_TEXT = (($(&#039;body.wgl-theme-browntown&#039;).length) ? &#039;#f4eaea&#039; : &#039;#cbd9f4&#039;);  function RSWChart(i, dataElement) {     var self = this;     this.is_error = false;     this.index = i;      function error(t) {         dataElement.removeClass(&#039;rsw-chartjs-config&#039;).addClass(&quot;rsw-chart-parsed rsw-chart-error&quot;).text(t);         self.is_error = true;     }      function parseData() {         console.log(&#039;parsing data for &#039; + self.index);         if (self.is_error) retur...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=MediaWiki:Gadget-Charts-core.js&amp;diff=839&amp;oldid=prev"/>
		<updated>2024-10-13T00:28:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;var DARKMODE_TEXT = (($(&amp;#039;body.wgl-theme-browntown&amp;#039;).length) ? &amp;#039;#f4eaea&amp;#039; : &amp;#039;#cbd9f4&amp;#039;);  function RSWChart(i, dataElement) {     var self = this;     this.is_error = false;     this.index = i;      function error(t) {         dataElement.removeClass(&amp;#039;rsw-chartjs-config&amp;#039;).addClass(&amp;quot;rsw-chart-parsed rsw-chart-error&amp;quot;).text(t);         self.is_error = true;     }      function parseData() {         console.log(&amp;#039;parsing data for &amp;#039; + self.index);         if (self.is_error) retur...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;var DARKMODE_TEXT = (($(&amp;#039;body.wgl-theme-browntown&amp;#039;).length) ? &amp;#039;#f4eaea&amp;#039; : &amp;#039;#cbd9f4&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
function RSWChart(i, dataElement) {&lt;br /&gt;
    var self = this;&lt;br /&gt;
    this.is_error = false;&lt;br /&gt;
    this.index = i;&lt;br /&gt;
&lt;br /&gt;
    function error(t) {&lt;br /&gt;
        dataElement.removeClass(&amp;#039;rsw-chartjs-config&amp;#039;).addClass(&amp;quot;rsw-chart-parsed rsw-chart-error&amp;quot;).text(t);&lt;br /&gt;
        self.is_error = true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function parseData() {&lt;br /&gt;
        console.log(&amp;#039;parsing data for &amp;#039; + self.index);&lt;br /&gt;
        if (self.is_error) return;&lt;br /&gt;
        var c = {};&lt;br /&gt;
        console.log(dataElement.text());&lt;br /&gt;
        try {&lt;br /&gt;
            var txt = dataElement.text();&lt;br /&gt;
            txt = txt.replace(/&amp;lt;/g, &amp;#039;&amp;amp;lt;&amp;#039;).replace(/&amp;gt;/g, &amp;#039;&amp;amp;gt;&amp;#039;).replace(/=/g, &amp;#039;&amp;amp;equals;&amp;#039;).replace(/\\/g, &amp;#039;&amp;amp;bsol;&amp;#039;).replace(/\//g, &amp;#039;&amp;amp;sol;&amp;#039;);&lt;br /&gt;
            return JSON.parse(txt);&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            error(&amp;quot;Failed to parse JSON. &amp;quot; + e.name + &amp;quot;: &amp;quot; + e.message);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function addFunctions() {&lt;br /&gt;
        var opts = self.config.options;&lt;br /&gt;
        if (opts.tooltips.format == &amp;quot;skillingSuccess&amp;quot;) {&lt;br /&gt;
            opts.tooltips.callbacks = opts.tooltips.callbacks || {}&lt;br /&gt;
            opts.tooltips.callbacks.label = function(tooltipItem) {&lt;br /&gt;
                var label = tooltipItem.dataset.label.trim() || &amp;#039;&amp;#039;;&lt;br /&gt;
                if (label) {&lt;br /&gt;
                    label += &amp;#039;: &amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
                label += &amp;quot;Level: &amp;quot; + tooltipItem.label + &amp;quot;; Chance: &amp;quot;;&lt;br /&gt;
                label += (tooltipItem.dataPoint.y * 100).toFixed(2) + &amp;quot;%&amp;quot;;&lt;br /&gt;
                return label;&lt;br /&gt;
            }&lt;br /&gt;
        } else if (opts.tooltips.format==&amp;quot;harvestLives&amp;quot;) {&lt;br /&gt;
        	opts.tooltips.callbacks = opts.tooltips.callbacks || {}&lt;br /&gt;
            opts.tooltips.callbacks.label = function(tooltipItem) {&lt;br /&gt;
                var label = tooltipItem.dataset.label.trim() || &amp;#039;&amp;#039;;&lt;br /&gt;
                if (label) {&lt;br /&gt;
                    label += &amp;#039;: &amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
                label += &amp;quot;Level: &amp;quot; + tooltipItem.label + &amp;quot;; Yield: &amp;quot;;&lt;br /&gt;
                label += tooltipItem.dataPoint.y.toFixed(2);&lt;br /&gt;
                return label;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (opts.scales.y.ticks.format == &amp;quot;percent&amp;quot;) {&lt;br /&gt;
            opts.scales.y.ticks.callback = function(value) {&lt;br /&gt;
                return Math.round(value * 100) + &amp;quot;%&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        opts.datasetsPerGroup = opts.datasetsPerGroup || 1;&lt;br /&gt;
        if (opts.datasetsPerGroup !== 1) {&lt;br /&gt;
            opts.tooltips.filter = function(tooltipItem) {&lt;br /&gt;
                return tooltipItem.datasetIndex % opts.datasetsPerGroup == 0 || tooltipItem.dataIndex &amp;gt; 0;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            opts.legend = opts.legend || {};&lt;br /&gt;
            opts.legend.labels = opts.legend.labels || {};&lt;br /&gt;
            opts.legend.labels.filter = function(legendItem, data) {&lt;br /&gt;
                return legendItem.datasetIndex % 3 == 0;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            opts.legend.onClick = function(e, legendItem) {&lt;br /&gt;
                var index = legendItem.datasetIndex;&lt;br /&gt;
&lt;br /&gt;
                var ci = this.chart;&lt;br /&gt;
                [&lt;br /&gt;
                    ci.getDatasetMeta(index - index % 3 + 0),&lt;br /&gt;
                    ci.getDatasetMeta(index - index % 3 + 1),&lt;br /&gt;
                    ci.getDatasetMeta(index - index % 3 + 2)&lt;br /&gt;
                ].forEach(function(meta) {&lt;br /&gt;
                    meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;&lt;br /&gt;
                });&lt;br /&gt;
                ci.update();&lt;br /&gt;
            };&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var legendIconWidth = 25;&lt;br /&gt;
        var legendIconHeight = 25;&lt;br /&gt;
        var legendIconBorder = 2;&lt;br /&gt;
        self.config.data.datasets.forEach(function(dataset, i) {&lt;br /&gt;
            if (i % opts.datasetsPerGroup == 0 &amp;amp;&amp;amp; dataset.pointStyleImg !== undefined) {&lt;br /&gt;
                opts.legend = opts.legend || {};&lt;br /&gt;
                opts.legend.labels = opts.legend.labels || {};&lt;br /&gt;
                opts.legend.labels.usePointStyle = true;&lt;br /&gt;
                opts.legend.labels.font = opts.legend.labels.font || {};&lt;br /&gt;
                opts.legend.labels.font.size = 14;&lt;br /&gt;
                var baseColor = dataset.baseColor || dataset.borderColor;&lt;br /&gt;
                var canvas = document.createElement(&amp;quot;canvas&amp;quot;)&lt;br /&gt;
                canvas.width = legendIconWidth;&lt;br /&gt;
                canvas.height = legendIconHeight;&lt;br /&gt;
                var myctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
                myctx.fillStyle = baseColor;&lt;br /&gt;
                myctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
                myctx.fillStyle = &amp;quot;white&amp;quot;;&lt;br /&gt;
                myctx.fillRect(legendIconBorder, legendIconBorder, canvas.width - 2 * legendIconBorder, canvas.height - 2 * legendIconBorder);&lt;br /&gt;
                var colorData = myctx.getImageData(0, 0, 1, 1).data;&lt;br /&gt;
                var translColor = &amp;quot;rgba(&amp;quot; + colorData[0] + &amp;quot;, &amp;quot; + colorData[1] + &amp;quot;, &amp;quot; + colorData[2] + &amp;quot;, 0.15)&amp;quot;;&lt;br /&gt;
                myctx.fillStyle = translColor;&lt;br /&gt;
                myctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
                var image = new Image()&lt;br /&gt;
                image.src = rs.getFileURLCached(dataset.pointStyleImg);&lt;br /&gt;
                image.crossOrigin = &amp;quot;anonymous&amp;quot;&lt;br /&gt;
                image.onload = function() {&lt;br /&gt;
                    var imgSize = legendIconWidth - legendIconBorder * 2;&lt;br /&gt;
                    var imgScale = Math.min(1.0, imgSize/image.width, imgSize/image.height);&lt;br /&gt;
                    var imgWidth = imgScale * image.width;&lt;br /&gt;
                    var imgHeight = imgScale * image.height&lt;br /&gt;
                    myctx.drawImage(image, (legendIconWidth - imgWidth)/2, (legendIconHeight - imgHeight)/2, imgWidth, imgHeight);&lt;br /&gt;
                }&lt;br /&gt;
                dataset.pointStyle = canvas;&lt;br /&gt;
&lt;br /&gt;
                for (var j = 0; j &amp;lt; opts.datasetsPerGroup; j++) {&lt;br /&gt;
                    self.config.data.datasets[i + j].borderColor = baseColor;&lt;br /&gt;
                    self.config.data.datasets[i + j].backgroundColor = translColor;&lt;br /&gt;
                    self.config.data.datasets[i + j].hoverBorderColor = baseColor;&lt;br /&gt;
                    self.config.data.datasets[i + j].hoverBackgroundColor = translColor;&lt;br /&gt;
                    self.config.data.datasets[i + j].hoverRadius = 0;&lt;br /&gt;
                    if (j == 0) {&lt;br /&gt;
                        self.config.data.datasets[i+j].borderColor = translColor;&lt;br /&gt;
                        self.config.data.datasets[i+j].hoverBorderColor = translColor;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function makeChart() {&lt;br /&gt;
        console.log(&amp;#039;making chart for &amp;#039; + self.index);&lt;br /&gt;
        if (self.is_error) return;&lt;br /&gt;
&lt;br /&gt;
        var canvas = $(&amp;#039;&amp;lt;canvas class=&amp;quot;rsw-chartjs-canvas&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
        canvas.attr(&amp;#039;id&amp;#039;, &amp;#039;rsw-chartjs-chart-&amp;#039; + self.index);&lt;br /&gt;
        dataElement.empty().append(canvas).removeClass(&amp;#039;rsw-chartjs-config&amp;#039;).addClass(&amp;quot;rsw-chart-parsed&amp;quot;);&lt;br /&gt;
        self.chart = new Chart(canvas, self.config);&lt;br /&gt;
    }&lt;br /&gt;
    this.config = parseData();&lt;br /&gt;
    addFunctions()&lt;br /&gt;
    makeChart();&lt;br /&gt;
    self.chart.update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
    console.log(&amp;#039;chart init&amp;#039;);&lt;br /&gt;
    // force all text to be darkmode happy by default&lt;br /&gt;
    if ($(&amp;#039;body.wgl-theme-dark&amp;#039;).length || $(&amp;#039;body.wgl-theme-browntown&amp;#039;).length) {&lt;br /&gt;
        Chart.defaults.font.color = DARKMODE_TEXT;&lt;br /&gt;
        Chart.defaults.color = &amp;#039;rgba(255,255,255,0.1)&amp;#039;;&lt;br /&gt;
        Chart.defaults.scale.gridLines.color = &amp;#039;rgba(255,255,255,0.1)&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    //other defaults&lt;br /&gt;
    Chart.defaults.plugins[&amp;#039;legend&amp;#039;].labels.usePointStyle = true;&lt;br /&gt;
&lt;br /&gt;
    window.charts = [];&lt;br /&gt;
    $(&amp;#039;.rsw-chartjs-config&amp;#039;).each(function(i, e) {&lt;br /&gt;
        console.log(&amp;#039;creating chart &amp;#039; + i);&lt;br /&gt;
        window.charts.push(new RSWChart(i, $(e)));&lt;br /&gt;
    });&lt;br /&gt;
    window.RSWChart = RSWChart;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addHook() {&lt;br /&gt;
    mw.hook(&amp;#039;rscalc.submit&amp;#039;).add(init);&lt;br /&gt;
    if (!window.charts) {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$.when($.ready, $.getScript(&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.0-beta/chart.min.js&amp;quot;)).then(addHook, function() {&lt;br /&gt;
    console.error(&amp;quot;Failed to load chart.js&amp;quot;);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>