<?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=Module%3AExchangeDefault</id>
	<title>Module:ExchangeDefault - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AExchangeDefault"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:ExchangeDefault&amp;action=history"/>
	<updated>2026-04-30T05:30:12Z</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=Module:ExchangeDefault&amp;diff=38380&amp;oldid=prev</id>
		<title>Alex at 10:22, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:ExchangeDefault&amp;diff=38380&amp;oldid=prev"/>
		<updated>2024-10-17T10:22:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:22, 17 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- &amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- &amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Default view for {{ExchangeItem}} for use on Exchange ns &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.&lt;/del&gt;pages&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Default view for {{ExchangeItem}} for use on Exchange ns pages&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Use of this via #invoke is deprecated and will eventually be removed&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Use of this via #invoke is deprecated and will eventually be removed&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-34923:rev-38380:wikidiff2=table:1.13.0:bc2a06be --&gt;
&lt;/table&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:ExchangeDefault&amp;diff=34923&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;pre&gt; -- Default view for {{ExchangeItem}} for use on Exchange ns mw.pages -- -- Use of this via #invoke is deprecated and will eventually be removed -- This is intended for use by Module:Exchange --  local p = {}  -- imports local exchange = require( &#039;Module:Exchange&#039; ) local excgdata = require( &#039;Module:ExchangeData&#039; )._main local round = require( &#039;Module:Number&#039; )._round local timeago = require( &#039;Module:TimeAgo&#039; )._ago local yesno = require( &#039;Module:Yesno&#039; )  fu...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:ExchangeDefault&amp;diff=34923&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:02Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;pre&amp;gt; -- Default view for {{ExchangeItem}} for use on Exchange ns mw.pages -- -- Use of this via #invoke is deprecated and will eventually be removed -- This is intended for use by &lt;a href=&quot;/w/Module:Exchange&quot; title=&quot;Module:Exchange&quot;&gt;Module:Exchange&lt;/a&gt; --  local p = {}  -- imports local exchange = require( &amp;#039;Module:Exchange&amp;#039; ) local excgdata = require( &amp;#039;Module:ExchangeData&amp;#039; )._main local round = require( &amp;#039;Module:Number&amp;#039; )._round local timeago = require( &amp;#039;Module:TimeAgo&amp;#039; )._ago local yesno = require( &amp;#039;Module:Yesno&amp;#039; )  fu...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;pre&amp;gt;&lt;br /&gt;
-- Default view for {{ExchangeItem}} for use on Exchange ns mw.pages&lt;br /&gt;
--&lt;br /&gt;
-- Use of this via #invoke is deprecated and will eventually be removed&lt;br /&gt;
-- This is intended for use by [[Module:Exchange]]&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- imports&lt;br /&gt;
local exchange = require( &amp;#039;Module:Exchange&amp;#039; )&lt;br /&gt;
local excgdata = require( &amp;#039;Module:ExchangeData&amp;#039; )._main&lt;br /&gt;
local round = require( &amp;#039;Module:Number&amp;#039; )._round&lt;br /&gt;
local timeago = require( &amp;#039;Module:TimeAgo&amp;#039; )._ago&lt;br /&gt;
local yesno = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
function p.main( item )&lt;br /&gt;
    local frame = mw.getCurrentFrame()&lt;br /&gt;
    local lang = mw.language.getContentLanguage()&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
    local data  = mw.loadData( &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
	local bulkData = {&lt;br /&gt;
		price = exchange.loadBulkData(item, &amp;#039;price&amp;#039;, true),&lt;br /&gt;
		date = exchange.loadBulkData(&amp;#039;%LAST_UPDATE_F%&amp;#039;, &amp;#039;price&amp;#039;),&lt;br /&gt;
		last = exchange.loadBulkData(item, &amp;#039;lastPrice&amp;#039;, true),&lt;br /&gt;
		volume = exchange.loadBulkData(item, &amp;#039;volume&amp;#039;, true),&lt;br /&gt;
		volumeDate = exchange.loadBulkData(&amp;#039;%LAST_UPDATE_F%&amp;#039;, &amp;#039;volume&amp;#039;),&lt;br /&gt;
	}&lt;br /&gt;
    -- set variables here if possible to keep table building easier to follow&lt;br /&gt;
    local rowspan = 8&lt;br /&gt;
    local volDate = bulkData.volumeDate or lang:formatDate( &amp;#039;c&amp;#039; )&lt;br /&gt;
    local dateDiffZ = lang:formatDate( &amp;#039;z&amp;#039; ) - lang:formatDate( &amp;#039;z&amp;#039;, volDate )&lt;br /&gt;
    local dateDiffY = lang:formatDate( &amp;#039;Y&amp;#039; ) - lang:formatDate( &amp;#039;Y&amp;#039;, volDate )&lt;br /&gt;
    local price = bulkData.price and lang:formatNum( bulkData.price ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local priceDiff = (bulkData.price or 0) - (bulkData.last or 0)&lt;br /&gt;
    local priceDiffF = lang:formatNum(priceDiff) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local priceDiffPerc = &amp;#039;&amp;#039;&lt;br /&gt;
    local priceDiffClass = &amp;#039;unchanged&amp;#039; --todo neutral&lt;br /&gt;
    local priceDiffSlide = &amp;#039;&amp;#039; --todo neutral&lt;br /&gt;
    local priceDiffIcon = &amp;#039;Unchanged&amp;#039; --todo neutral&lt;br /&gt;
    local itemIcon = data.icon or (( data.item or &amp;#039;Coins 1000&amp;#039;) .. &amp;#039;.png&amp;#039;)&lt;br /&gt;
    local date = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local lowAlchMultiplier = 0.4&lt;br /&gt;
    local highAlchMultiplier = 0.6&lt;br /&gt;
    local rawLowAlch = -1&lt;br /&gt;
    local rawHighAlch = -1&lt;br /&gt;
    local lowAlch = &amp;#039;&amp;lt;i&amp;gt;Not alchable&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local highAlch = &amp;#039;&amp;lt;i&amp;gt;Not alchable&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local memsIcon = &amp;#039;&amp;#039;&lt;br /&gt;
    local usage = &amp;#039;&amp;#039;&lt;br /&gt;
    local timeagodate&lt;br /&gt;
&lt;br /&gt;
    if bulkData.volume and ( dateDiffZ + 365 * dateDiffY ) &amp;lt;= 7 then&lt;br /&gt;
        rowspan = 10&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if bulkData.date then&lt;br /&gt;
        date = lang:formatDate( &amp;#039;j F Y, H:i &amp;quot;(UTC)&amp;quot;&amp;#039;, bulkData.date )&lt;br /&gt;
        timeagodate = bulkData.date&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if data.alchable == nil or yesno( data.alchable ) then&lt;br /&gt;
        if data.value then&lt;br /&gt;
	    	if data.alchmultiplier then&lt;br /&gt;
	    		highAlchMultiplier = data.alchmultiplier&lt;br /&gt;
	    		lowAlchMultiplier = highAlchMultiplier * 2/3&lt;br /&gt;
	    	end&lt;br /&gt;
            rawLowAlch = math.floor( data.value * lowAlchMultiplier )&lt;br /&gt;
            rawHighAlch = math.floor( data.value * highAlchMultiplier )&lt;br /&gt;
            lowAlch = lang:formatNum( rawLowAlch )&lt;br /&gt;
            highAlch = lang:formatNum( rawHighAlch )&lt;br /&gt;
        else&lt;br /&gt;
            lowAlch, highAlch = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;, &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if data.members ~= nil then&lt;br /&gt;
        if data.members then&lt;br /&gt;
            memsIcon = &amp;#039;Members&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            memsIcon = &amp;#039;Free-to-play&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if priceDiff &amp;gt; 0 then&lt;br /&gt;
    	priceDiffClass = &amp;#039;positive&amp;#039;&lt;br /&gt;
    	priceDiffSlide = &amp;#039;slide-up&amp;#039;&lt;br /&gt;
    	priceDiffIcon = &amp;#039;Up&amp;#039;&lt;br /&gt;
    elseif priceDiff &amp;lt; 0 then&lt;br /&gt;
    	priceDiffClass = &amp;#039;negative&amp;#039;&lt;br /&gt;
    	priceDiffSlide = &amp;#039;slide-down&amp;#039;&lt;br /&gt;
    	priceDiffIcon = &amp;#039;Down&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if bulkData.last and bulkData.last &amp;gt; 0 then&lt;br /&gt;
    	priceDiffPerc = round(priceDiff / bulkData.last * 100, 2) .. &amp;#039;%&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if priceDiff &amp;gt;= 0 then&lt;br /&gt;
    	priceDiffF = &amp;#039;+&amp;#039;..priceDiffF&lt;br /&gt;
    	priceDiffPerc = &amp;#039;+&amp;#039;..priceDiffPerc&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- workaround so we can use `table.concat`&lt;br /&gt;
    usage = {}&lt;br /&gt;
	if data.usage then&lt;br /&gt;
	    for k, v in ipairs( data.usage ) do&lt;br /&gt;
	        usage[k] = v&lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #usage == 0 then&lt;br /&gt;
    	usage = &amp;quot;\n* &amp;#039;&amp;#039;None&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
        usage = &amp;#039;\n* [[&amp;#039; .. table.concat( usage, &amp;#039;]]\n* [[&amp;#039; ) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local noErr, chartdata = pcall( excgdata, { item }, true )&lt;br /&gt;
    &lt;br /&gt;
    if not noErr then&lt;br /&gt;
        chartdata = &amp;#039;Chart not available&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- build table&lt;br /&gt;
    local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
    	:addClass(&amp;#039;gemw-container&amp;#039;)&lt;br /&gt;
	if data.historical then&lt;br /&gt;
		div:addClass(&amp;#039;gemw-historical&amp;#039;)&lt;br /&gt;
        date = lang:formatDate( &amp;#039;j F Y, H:i &amp;quot;(UTC)&amp;quot;&amp;#039;, data.date )&lt;br /&gt;
        timeagodate = data.date&lt;br /&gt;
	end&lt;br /&gt;
    	--header&lt;br /&gt;
    div	:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    		:addClass(&amp;#039;gemw-header&amp;#039;)&lt;br /&gt;
    		:addClass(priceDiffClass)&lt;br /&gt;
    		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    			:addClass(&amp;#039;gemw-section-left&amp;#039;)&lt;br /&gt;
                :tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
                    :addClass(&amp;#039;gemw-image&amp;#039;)&lt;br /&gt;
                    :wikitext(&amp;#039;[[File:&amp;#039;..data.icon..&amp;#039;|link=&amp;#039;..data.item..&amp;#039;]]&amp;#039;)&lt;br /&gt;
                    :done()&lt;br /&gt;
    			:tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
    				:addClass(&amp;#039;gemw-name&amp;#039;)&lt;br /&gt;
    				:wikitext(&amp;#039;[[&amp;#039;..data.item..&amp;#039;]]&amp;#039;)&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
    				:addClass(&amp;#039;gemw-examine&amp;#039;)&lt;br /&gt;
    				:wikitext(data.examine or &amp;#039;&amp;#039;)&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-price&amp;#039;)&lt;br /&gt;
    					:addClass(priceDiffSlide)&lt;br /&gt;
    					:attr(&amp;#039;id&amp;#039;, &amp;#039;GEPrice&amp;#039;)&lt;br /&gt;
    					:wikitext(price)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-change&amp;#039;)&lt;br /&gt;
    					:addClass(priceDiffSlide..&amp;#039;-2&amp;#039;)&lt;br /&gt;
    					:wikitext(priceDiffF)&lt;br /&gt;
    					:wikitext(&amp;#039; &amp;#039;)&lt;br /&gt;
    					:wikitext(priceDiffPerc)&lt;br /&gt;
    					:wikitext(&amp;#039; [[File:&amp;#039;..priceDiffIcon..&amp;#039;.svg|12px|link=]]&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:done()&lt;br /&gt;
    		:tag(&amp;#039;div&amp;#039;)	&lt;br /&gt;
    			:addClass(&amp;#039;gemw-section-right&amp;#039;)&lt;br /&gt;
    			:tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
    				:addClass(&amp;#039;gemw-updated&amp;#039;)&lt;br /&gt;
    				:attr(&amp;#039;data-date&amp;#039;, date) -- used by [[MediaWiki:Gadget-gemwupdate.js]]&lt;br /&gt;
    				:wikitext(&amp;#039;Last updated &amp;#039;)&lt;br /&gt;
    				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-time&amp;#039;)&lt;br /&gt;
    					:wikitext(timeago{timeagodate, purge=&amp;#039;yes&amp;#039;, purgeText=&amp;#039;refresh&amp;#039;})&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;br&amp;#039;):done()&lt;br /&gt;
    				:wikitext(&amp;#039; on &amp;#039;)&lt;br /&gt;
    				:wikitext(date)&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    				:addClass(&amp;#039;gemw-button-wrapper gemw-update-price&amp;#039;)&lt;br /&gt;
    				:attr(&amp;#039;id&amp;#039;, &amp;#039;gemw_guide&amp;#039;)&lt;br /&gt;
    				:wikitext(&amp;#039;&amp;#039;)&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:done()	&lt;br /&gt;
    		:done() --close header&lt;br /&gt;
    &lt;br /&gt;
    -- body		&lt;br /&gt;
    local dlTag = div	:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    		:addClass(&amp;#039;gemw-body&amp;#039;)	&lt;br /&gt;
    		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    			:addClass(&amp;#039;gemw-section-left&amp;#039;)&lt;br /&gt;
    			:tag(&amp;#039;dl&amp;#039;)&lt;br /&gt;
    			&lt;br /&gt;
    dlTag			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-members&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;Status&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(memsIcon)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-limit&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;[[Grand Exchange#Trade restrictions|Buy limit]]&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(data.limit and lang:formatNum( data.limit ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039; )&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-id&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;Item ID&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(data.itemId or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-highalch&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;[[High Level Alchemy|High Alchemy]]&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(highAlch)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-lowalch&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;[[Low Level Alchemy|Low Alchemy]]&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(lowAlch)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-property gemw-value&amp;#039;)&lt;br /&gt;
    					:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
    						:wikitext(&amp;#039;[[Value]]&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
    						:wikitext(data.value and lang:formatNum( data.value ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
    						:done()&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    				:tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-links&amp;#039;)&lt;br /&gt;
    					:wikitext(&amp;#039;External links&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-button secondary&amp;#039;)&lt;br /&gt;
    					:wikitext(&amp;#039;[https://secure.runescape.com/m=itemdb_oldschool/viewitem.ws?obj=&amp;#039; .. data.itemId .. &amp;#039; Official GE database]&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-button secondary&amp;#039;)&lt;br /&gt;
    					:wikitext(&amp;#039;[https://secure.runescape.com/m=itemdb_oldschool/results.ws?query=&amp;#039; .. mw.uri.encode( item, &amp;#039;QUERY&amp;#039; ) .. &amp;#039; Related items]&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    				:tag(&amp;#039;p&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-links&amp;#039;)&lt;br /&gt;
    					:wikitext(&amp;#039;Module links&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    					:addClass(&amp;#039;gemw-button secondary&amp;#039;)&lt;br /&gt;
    					:wikitext(&amp;#039;[[Module:Exchange/&amp;#039; .. item .. &amp;#039;|Exchange info]]&amp;#039;)&lt;br /&gt;
    					:done()&lt;br /&gt;
    				:done()&lt;br /&gt;
    			:done()&lt;br /&gt;
    		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    			:addClass(&amp;#039;gemw-section-right gemw-chart&amp;#039;)&lt;br /&gt;
    			:wikitext(chartdata)&lt;br /&gt;
    			:done()&lt;br /&gt;
&lt;br /&gt;
	if bulkData.volume and ( dateDiffZ + 365 * dateDiffY ) &amp;lt;= 7 then&lt;br /&gt;
		dlTag:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;gemw-property gemw-volume&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;dt&amp;#039;)&lt;br /&gt;
					:wikitext(&amp;#039;Daily volume&amp;#039;)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag(&amp;#039;dd&amp;#039;)&lt;br /&gt;
					:wikitext(lang:formatNum( bulkData.volume ))&lt;br /&gt;
					:done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    div = tostring( div )&lt;br /&gt;
&lt;br /&gt;
    -- categories&lt;br /&gt;
    local cats = &amp;#039;&amp;#039;&lt;br /&gt;
    local natPrice&lt;br /&gt;
&lt;br /&gt;
    if title.nsText == &amp;#039;Exchange&amp;#039; then&lt;br /&gt;
        cats = cats .. &amp;#039;[[Category:Grand Exchange]]&amp;#039;&lt;br /&gt;
        if data.historical then&lt;br /&gt;
        	cats = cats .. &amp;#039;[[Category:Historical Grand Exchange]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            cats = cats .. &amp;#039;[[Category:Grand Exchange by date updated|*&amp;#039; .. lang:formatDate( &amp;#039;c&amp;#039;, bulkData.date ) .. data.itemId .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if item ~= title.text then&lt;br /&gt;
            cats = cats .. &amp;#039;[[Category:Exchange names that needs checking]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- have to preprocess this for it to work&lt;br /&gt;
        cats = cats .. frame:preprocess( &amp;#039;{{DEFAULTSORT:&amp;#039; .. data.item .. &amp;#039;}}&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
        if not data.itemId then&lt;br /&gt;
            cats = cats .. &amp;#039;[[Category:Exchange items with no ID]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if not data.icon then&lt;br /&gt;
            cats = cats .. &amp;#039;[[Category:Exchange items missing icon]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
		if not data.historical then&lt;br /&gt;
	       if not data.value then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Exchange items missing value]]&amp;#039;&lt;br /&gt;
	        end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- this doesn&amp;#039;t allow for the update time to be in the previous day but less than 24 hours&lt;br /&gt;
        -- if that&amp;#039;s the case, then the page will end up in the 7 days category&lt;br /&gt;
        -- the same will happen for the other 2 categories too&lt;br /&gt;
        -- but it&amp;#039;s not so noticeable given the already elapsed time&lt;br /&gt;
        local lastUpdate&lt;br /&gt;
        if not data.historical then&lt;br /&gt;
	        lastUpdate = ( lang:formatDate( &amp;#039;z&amp;#039; ) - lang:formatDate( &amp;#039;z&amp;#039;, bulkData.date ) + 365 * ( lang:formatDate( &amp;#039;Y&amp;#039; ) - lang:formatDate( &amp;#039;Y&amp;#039;, bulkData.date ) ) + 3 ) / 7&lt;br /&gt;
	        lastUpdate = round( lastUpdate, 0 )&lt;br /&gt;
	 &lt;br /&gt;
	        if lastUpdate == 2 then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Needs price update/7 days]]&amp;#039;&lt;br /&gt;
	        elseif lastUpdate &amp;gt;= 2 and lastUpdate &amp;lt;= 4 then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Needs price update/28 days]]&amp;#039;&lt;br /&gt;
	        elseif lastUpdate &amp;gt; 4 then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Needs price update/29+ days]]&amp;#039;&lt;br /&gt;
	        end&lt;br /&gt;
	&lt;br /&gt;
	        if not data.limit then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Exchange items missing limit]]&amp;#039;&lt;br /&gt;
	        end&lt;br /&gt;
	&lt;br /&gt;
	        -- Error checking&lt;br /&gt;
	        if not bulkData.price or bulkData.price &amp;lt; 1 then&lt;br /&gt;
	            cats = cats .. &amp;#039;[[Category:Exchange items with no price]]&amp;#039;&lt;br /&gt;
	        end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local smw_to_json_names = {&lt;br /&gt;
    	id = &amp;#039;Exchange ID&amp;#039;,&lt;br /&gt;
    	name = &amp;#039;Exchange name&amp;#039;,&lt;br /&gt;
    	limit = &amp;#039;Exchange limit&amp;#039;,&lt;br /&gt;
    	value = &amp;#039;Exchange value&amp;#039;,&lt;br /&gt;
    	isalchable = &amp;#039;Exchange is alchable&amp;#039;,&lt;br /&gt;
    	highalch = &amp;#039;Exchange high alch&amp;#039;,&lt;br /&gt;
    	lowalch = &amp;#039;Exchange low alch&amp;#039;,&lt;br /&gt;
    	info = &amp;#039;Exchange module&amp;#039;,&lt;br /&gt;
    	history = &amp;#039;Exchange history module&amp;#039;,&lt;br /&gt;
    	historical = &amp;#039;Exchange is historical&amp;#039;&lt;br /&gt;
    }&lt;br /&gt;
    local smw_json = {}&lt;br /&gt;
    local smw_data_arr = {}&lt;br /&gt;
    smw_json.id = data.itemId&lt;br /&gt;
    smw_json.name = item&lt;br /&gt;
    smw_json.limit = data.limit&lt;br /&gt;
    smw_json.value = data.value&lt;br /&gt;
    smw_json.isalchable = data.alchable == nil or yesno( data.alchable )&lt;br /&gt;
    if data.historical == true then&lt;br /&gt;
    	-- ensure data type correctness&lt;br /&gt;
    	smw_json.historical = true&lt;br /&gt;
    else&lt;br /&gt;
    	smw_json.historical = false&lt;br /&gt;
    end&lt;br /&gt;
    if smw_json.isalchable then&lt;br /&gt;
    	smw_json.highalch = rawHighAlch&lt;br /&gt;
    	smw_json.lowalch = rawLowAlch&lt;br /&gt;
    end&lt;br /&gt;
    smw_json.info = &amp;#039;Module:Exchange/&amp;#039; .. data.item&lt;br /&gt;
&lt;br /&gt;
    for k,v in pairs(smw_to_json_names) do&lt;br /&gt;
    	smw_data_arr[v] = smw_json[k]&lt;br /&gt;
    end&lt;br /&gt;
    local smwJsonGood, smwJsonEncoded = pcall(mw.text.jsonEncode,smw_json)&lt;br /&gt;
	if smwJsonGood then&lt;br /&gt;
		smw_data_arr[&amp;#039;Exchange JSON&amp;#039;] = smwJsonEncoded&lt;br /&gt;
	else&lt;br /&gt;
		div = div .. &amp;#039;&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;Error making JSON for SMW&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
    local res = mw.smw.set(smw_data_arr)&lt;br /&gt;
	if not res == true then&lt;br /&gt;
		div = div .. &amp;#039;&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;Error setting SMW properties: &amp;#039;..res.error..&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
    return div .. cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.exchangeItem( frame )&lt;br /&gt;
	local fargs = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local item = pargs[1] or fargs.item	&lt;br /&gt;
    item = exchange.checkTitle( item )&lt;br /&gt;
    return p.main( item )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>