Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
// ==========================================================================
// Deck Export
// Adds the export text box to deck articles with copy to clipboard button
// and a select to allow export cards to be replaced with reprint alternatives.
// Version 3.6.1
// Author: Aspallar
//
// ** Please dont edit this code directly in the wika.
// ** Instead use the git repository https://github.com/Aspallar/WikiLua
//
(function ($) {
'use strict';
/*global mw*/
// don't run if wrong page or this version is disabled on page
if (document.getElementById('mdw-arena-export-div') === null ||
document.getElementById('mdw-rarity-table-full') === null ||
document.getElementById('mdw-rarity-table-small') === null ||
$('#mdw-disabled-js').attr('data-deckexport-3-6-1'))
return;
function RarityTotals(cards) {
this.Common = 0;
this.Uncommon = 0;
this.Rare = 0;
this['Mythic Rare'] = 0;
if (Array.isArray(cards)) {
var that = this;
cards.forEach(function (card) {
var rarity = card.rarity;
if (rarity !== 'Basic Land')
that[rarity] += card.num;
});
}
}
RarityTotals.prototype = {
constructor: RarityTotals,
add: function(other) {
var result = new RarityTotals();
result.Common = this.Common + other.Common;
result.Uncommon = this.Uncommon + other.Uncommon;
result.Rare = this.Rare + other.Rare;
result['Mythic Rare'] = this['Mythic Rare'] + other['Mythic Rare'];
return result;
}
}; // End RarityTotals
function ImportData() {
var importCards = [],
altImportCards = [],
sideboardCards = [],
commander = null,
companion = null;
function baseDisplayName(card) {
var set = card.set === 'CON' ? 'CONF' : card.set;
return card.name + ' (' + set + ') ' + card.cardNumber;
}
function importDisplayName(card) {
return card.num + ' ' + baseDisplayName(card);
}
function rarityValue(rarity) {
return { 'Common': 0, 'Uncommon': 1, 'Rare': 2, 'Mythic Rare': 3 }[rarity];
}
function findCardByName(name) {
for (var k = 0, l = importCards.length; k < l; k++) {
if (importCards[k].name === name)
return importCards[k];
}
for (k = 0, l = sideboardCards.length; k < l; k++) {
if (sideboardCards[k].name === name)
return sideboardCards[k];
}
return null;
}
function findAllCardsByName(cards, name) {
return cards.reduce(function (result, card) {
if (card.name === name) result.push(card);
return result;
}, []);
}
function parseCardData(dataString) {
if (dataString !== null && dataString.length > 0) {
importCards = JSON.parse(dataString);
for (var k = 0, l = importCards.length; k < l; k++) {
var card = importCards[k];
if (card.isCmd)
commander = card;
else if (card.isCmp)
companion = card;
}
}
}
function parseSideboardData(dataString) {
if (dataString !== null && dataString.length > 0)
sideboardCards = JSON.parse(dataString);
}
function parseAltCardData(dataString) {
altImportCards = [];
if (dataString !== null && dataString.length > 0) {
var cards = JSON.parse(dataString);
// cards may contain duplicates, don't add duplicates
cards.forEach(function(card) {
if (!altImportCards.some(function (altCard) {
return card.name === altCard.name &&
card.set === altCard.set;
})) altImportCards.push(card);
});
altImportCards.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
}
}
function setCard(dest, source) {
dest.set = source.set;
dest.cardNumber = source.cardNumber;
dest.rarity = source.rarity;
}
function swapCards(altCardIndex) {
var newCard = altImportCards[altCardIndex];
var oldCard = findCardByName(newCard.name);
var oldCardData = {
set: oldCard.set,
cardNumber: oldCard.cardNumber,
rarity: oldCard.rarity
};
findAllCardsByName(importCards, newCard.name).forEach(function (card) {
setCard(card, newCard);
});
findAllCardsByName(sideboardCards, newCard.name).forEach(function (card) {
setCard(card, newCard);
});
setCard(newCard, oldCardData);
return baseDisplayName(newCard);
}
function adjustToCheapest() {
for (var k = 0, l = altImportCards.length; k < l; k++) {
var card = findCardByName(altImportCards[k].name);
if (rarityValue(altImportCards[k].rarity) < rarityValue(card.rarity))
swapCards(k);
}
}
function deckText(includeSideboard) {
var text = commander ? 'Commander\n' + importDisplayName(commander) + '\n\n' : '';
text += companion ? 'Companion\n' + importDisplayName(companion) + '\n\nDeck\n' : 'Deck\n';
importCards.forEach(function(card) {
if (!(card.isCmp || card.isCmd))
text += importDisplayName(card) + '\n';
});
if (includeSideboard && sideboardCards.length > 0) {
text += '\nSideboard\n';
sideboardCards.forEach(function (card) {
text += importDisplayName(card) + '\n';
});
}
return text;
}
return {
swapCards: function (altCardIndex) {
return swapCards(altCardIndex);
},
getDeckRarityTotals: function () {
return new RarityTotals(importCards);
},
getSideboardRarityTotals: function () {
return new RarityTotals(sideboardCards);
},
text: function (includeSideboard) {
return mw.html.escape(deckText(includeSideboard));
},
getAltOptions: function () {
var options = document.createDocumentFragment();
altImportCards.forEach(function (card) {
$('<option>').html(mw.html.escape(baseDisplayName(card))).appendTo(options);
});
return options;
},
hasAlternatives: function () {
return altImportCards.length > 0;
},
hasSideboard: function () {
return sideboardCards.length > 0;
},
initialize: function(deckData, sideboardData, altData) {
parseCardData(deckData);
parseSideboardData(sideboardData);
parseAltCardData(altData);
adjustToCheapest();
}
};
} // End ImportData
function Ui() {
var importData;
var labelOption;
var useSideboard;
function sizeTextareaToContents(textarea) {
textarea.style.overflow = 'hidden';
textarea.style.height = 'auto';
textarea.style.height = textarea.scrollHeight + 'px';
}
function setImportData() {
importData.initialize(
$('#mdw-chartdata-pre').text(),
$('#mdw-sideboard-data').text(),
$('#mdw-alt-carddata').text()
);
}
function setRarityColumn(col, totals) {
col.get(0).innerHTML = totals.Common;
col.get(1).innerHTML = totals.Uncommon;
col.get(2).innerHTML = totals.Rare;
col.get(3).innerHTML = totals['Mythic Rare'];
}
function setRarityContents() {
var deckTotals = importData.getDeckRarityTotals();
var tableFull = $('#mdw-rarity-table-full');
var tableSmall = $('#mdw-rarity-table-small');
if (!useSideboard || !importData.hasSideboard()) {
setRarityColumn(tableSmall.find('td:nth-child(2)'), deckTotals);
tableFull.hide();
tableSmall.show();
} else {
var sideboardTotals = importData.getSideboardRarityTotals();
setRarityColumn(tableFull.find('td:nth-child(2)'), deckTotals);
setRarityColumn(tableFull.find('td:nth-child(3)'), sideboardTotals);
setRarityColumn(tableFull.find('td:nth-child(4)'), deckTotals.add(sideboardTotals));
tableSmall.hide();
tableFull.show();
}
}
function onChangeUseSideboard() {
/* jshint -W040 */ // allow old school jquery use of this
useSideboard = this.checked;
$('#mdw-arena-export-contents').html(importData.text(useSideboard));
setRarityContents();
}
function onClickCopy() {
var importText = document.getElementById('mdw-arena-export-contents');
importText.select();
document.execCommand('copy');
$('#mdw-copied-message').html(' copied to clipboard.');
setTimeout(function () {
$('#mdw-copied-message').empty();
}, 1200);
}
function onClickReset() {
setImportData();
$('#mdw-import-reset').prop('disabled', true);
$('#mdw-import-select').html(labelOption).append(importData.getAltOptions());
$('#mdw-arena-export-contents').html(importData.text(useSideboard));
setRarityContents();
}
function onSelectAlternative() {
/* jshint -W040 */ // allow old school jquery use of this
var text = importData.swapCards(this.selectedIndex - 1);
this.options[this.selectedIndex].text = text;
$('#mdw-arena-export-contents').html(importData.text(useSideboard));
$('#mdw-import-reset').prop('disabled', false);
setRarityContents();
this.selectedIndex = 0;
}
function setupImportStatsUi(container) {
if (container === null)
return;
var sideboardCheckbox = importData.hasSideboard() ?
$('<input type="checkbox" id="mdw-use-sideboard" checked><label for="mdw-use-sideboard">Include sideboard</label>').change(onChangeUseSideboard) :
null;
if (!importData.hasAlternatives()) {
$(container).html(sideboardCheckbox).css('display', 'block');
return;
}
labelOption = $('<option disabled selected>Select alternative cards --</option>');
var altSelect = $('<select id="mdw-import-select"></select>')
.append(labelOption)
.append(importData.getAltOptions())
.change(onSelectAlternative);
var resetButton = $('<input type="button" id="mdw-import-reset" value="Reset" disabled title="Reset import contents to original content." />')
.click(onClickReset);
$(container)
.prepend(sideboardCheckbox)
.append(altSelect)
.append(resetButton)
.css('display', 'block');
}
function setupImportUi(container) {
var elements = $(
'<input type="button" id="mdw-copy-export" value="Copy" />' +
'<span id="mdw-copied-message" />' +
'<br />' +
'<textarea id="mdw-arena-export-contents" style="width:90%" readonly>' +
importData.text(useSideboard) +
'</textarea>'
);
$(container).append(elements);
sizeTextareaToContents(document.getElementById('mdw-arena-export-contents'));
setRarityContents();
$('#mdw-copy-export').click(onClickCopy);
}
return {
start: function() {
var arenaImportContainer = document.getElementById('mdw-arena-export-div');
try {
importData = new ImportData();
setImportData();
} catch(error) {
console.log(error);
return;
}
useSideboard = importData.hasSideboard();
setupImportUi(arenaImportContainer);
setupImportStatsUi(document.getElementById('mdw-arena-export-alt-div'));
return this;
}
};
} // End Ui
var ui;
$(document).ready(function() {
ui = new Ui().start();
});
}(jQuery));