// ==UserScript==
// @name TMVN Club Transfer
// @namespace https://trophymanager.com
// @version 13
// @description Trophymanager: transfer statistics of all seasons, the most expensive players, the most successful trades, revenue from the academy... It made by request of Vasco Vitkovice, Tirana Smokers, Bones and Langevåg IL.
// @include https://trophymanager.com/club/*
// @include https://trophymanager.com/club/*/
// @exclude https://trophymanager.com/club/
// @exclude https://trophymanager.com/club/*/squad/
// @grant none
// ==/UserScript==
(function () {
'use strict';
const APPLICATION_PARAM = {
DEFAULT_TOP_COUNT: 10,
TOP_COUNT_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_TOP_COUNT",
DEFAULT_SEASON_COUNT: 0,
SEASON_COUNT_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_SEASON_COUNT",
TO_SEASON_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_TO_SEASON",
MIN_PROFIT_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_MIN_PROFIT",
DEFAULT_MIN_PROFIT: -999999,
MAX_PROFIT_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_MAX_PROFIT",
DEFAULT_MAX_PROFIT: 999999,
DEFAULT_SHOW_MODE: "11111",
SHOW_MODE_LOCAL_STORAGE_KEY: "TMVN_CLUB_TRANSFER_SHOW_MODE",
SEASON_SHOW: 2
}
const CLASS_NAME = {
SUMMARY_TRANSFER: 'tmvn_club_transfer_script_classname_summary_transfer',
ACADEMY_REVENUE: 'tmvn_club_transfer_script_classname_academy_revenue'
}
const CONTROL_ID = {
INPUT_SHOW_MODE: 'tmvn_club_transfer_script_input_show_mode',
BUTTON_SHOW_MODE: 'tmvn_club_transfer_script_button_show_mode_set',
INPUT_TOP_COUNT: 'tmvn_club_transfer_script_input_top_count',
BUTTON_TOP_COUNT: 'tmvn_club_transfer_script_button_top_count_set',
INPUT_SEASON_COUNT: 'tmvn_club_transfer_script_input_season_count',
INPUT_TO_SEASON: 'tmvn_club_transfer_script_input_to_season',
BUTTON_SEASON_COUNT: 'tmvn_club_transfer_script_button_season_count_set',
BUTTON_SHOW_ALL_SUMMARY_TRANSFER: 'tmvn_club_transfer_script_button_show_all_summary_transfer',
BUTTON_SHOW_ALL_ACADEMY_REVENUE: 'tmvn_club_transfer_script_button_show_all_academy_revenue',
INPUT_MIN_PROFIT: 'tmvn_club_transfer_script_input_min_profit',
INPUT_MAX_PROFIT: 'tmvn_club_transfer_script_input_max_profit',
BUTTON_TRADE_PROFIT: 'tmvn_club_transfer_script_button_trade_profit_set',
}
const APPLICATION_COLOR = {
AVERAGE: 'Aqua',
TOTAL: 'Yellow',
ONSQUAD: 'Blue',
}
var topCount,
seasonCount,
toSeason,
minProfit,
maxProfit,
totalTradeBuy,
totalTradeSell,
totalTradeProfit,
totalSquadBuy,
squadCount;
seasonCount = localStorage.getItem(APPLICATION_PARAM.SEASON_COUNT_LOCAL_STORAGE_KEY);
if (seasonCount == null || seasonCount == "") {
seasonCount = APPLICATION_PARAM.DEFAULT_SEASON_COUNT;
}
minProfit = localStorage.getItem(APPLICATION_PARAM.MIN_PROFIT_LOCAL_STORAGE_KEY);
if (minProfit == null || minProfit == "") {
minProfit = APPLICATION_PARAM.DEFAULT_MIN_PROFIT;
}
maxProfit = localStorage.getItem(APPLICATION_PARAM.MAX_PROFIT_LOCAL_STORAGE_KEY);
if (maxProfit == null || maxProfit == "") {
maxProfit = APPLICATION_PARAM.DEFAULT_MAX_PROFIT;
}
var boughtArr = [];
var soldArr = [];
var tradeArr = [];
var academySoldMap = new Map();
var academySummary = [];
var transferSummary = [];
var squadPlayerIdArr = [];
var playerMap = new Map();
var loadCount = 0;
var loadDone = false;
var clubId = location.href.split('/')[4];
var seasonIds = [];
$.ajaxSetup({
async: false
});
$.ajax('https://trophymanager.com/history/club/transfers/' + clubId, {
type: "GET",
dataType: 'html',
crossDomain: true,
success: function (response) {
let comboSeason = $('#stats_season', response)[0].options;
for (let i = 0; i < comboSeason.length; i++) {
seasonIds.push(comboSeason[i].value);
}
},
error: function (e) {}
});
$.ajax('https://trophymanager.com/club/' + clubId + '/squad/', {
type: "GET",
dataType: 'html',
crossDomain: true,
success: function (response) {
let player = $('a[player_link]', response);
for (let i = 0; i < player.length; i++) {
squadPlayerIdArr.push(player[i].getAttribute('player_link'));
}
},
error: function (e) {}
});
$.ajaxSetup({
async: true
});
if (seasonCount > 0 && seasonCount < seasonIds.length) {
toSeason = localStorage.getItem(APPLICATION_PARAM.TO_SEASON_LOCAL_STORAGE_KEY);
if (toSeason == null || toSeason == "") {
do {
seasonIds.pop();
} while (seasonCount < seasonIds.length);
} else {
let fromSeason = toSeason - seasonCount + 1;
while (fromSeason > seasonIds[seasonIds.length - 1]) {
seasonIds.pop();
}
while (toSeason < seasonIds[0]) {
seasonIds.shift();
}
}
}
if (clubId != "" && seasonIds.length > 0) {
seasonIds.forEach((seasonId) => {
$.ajax('https://trophymanager.com/history/club/transfers/' + clubId + '/' + seasonId, {
type: "GET",
dataType: 'html',
crossDomain: true,
success: function (response) {
let tbl = $('.zebra.hover', response);
if (tbl.length != 2) {
return;
}
let trBuy = $('tr', tbl[0]);
let playerId,
playerName,
price;
for (let i = 1; i < trBuy.length; i++) {
let td = $('td', trBuy[i]);
if (td.length < 4)
continue;
let a = $('a', td[0]);
if (a.length == 0)
continue;
playerName = a[0].innerText;
playerId = a[0].getAttribute('player_link');
price = td[3].innerText.replace(/,/g, '');
setMap(playerId, playerName, seasonId, price, 1);
}
let trSell = $('tr', tbl[1]);
for (let i = 1; i < trSell.length; i++) {
let td = $('td', trSell[i]);
if (td.length < 4)
continue;
let a = $('a', td[0]);
if (a.length == 0)
continue;
playerName = a[0].innerText;
playerId = a[0].getAttribute('player_link');
price = td[3].innerText.replace(/,/g, '');
setMap(playerId, playerName, seasonId, price, 2);
}
let tdArr = $('.zebra.hover td', response);
if (tdArr.length >= 3) {
var bought,
sold,
balance,
quantity,
average;
bought = Math.round(tdArr[tdArr.length - 3].children[0].innerText.replace(/,/g, ''));
sold = Math.round(tdArr[tdArr.length - 2].children[0].innerText.replace(/,/g, ''));
balance = sold - bought;
if (bought > 0 && sold > 0) {
quantity = (tdArr.length - 3) / 4;
} else if ((bought == 0 && sold > 0) || (bought > 0 && sold == 0)) {
quantity = Math.round((tdArr.length - 4) / 4); //bug when has sell/buy players but all prices = 0 --> round and accept wrong result
} else if (bought == 0 && sold == 0) {
quantity = 0;
}
if (quantity == 0) {
average = '0.0';
} else {
average = ((sold + bought) / quantity).toFixed(1);
}
transferSummary.push({
Season: seasonId,
Bought: bought,
Sold: sold,
Balance: balance,
Quantity: quantity,
Average: average
});
}
loadCount++;
if (loadCount >= seasonIds.length) {
loadDone = true;
}
},
error: function (e) {}
});
});
} else {
loadDone = true;
}
var myInterval = setInterval(append, 1000);
function append() {
if (!loadDone) {
return;
}
clearInterval(myInterval);
processPlayer();
boughtArr.sort((a, b) => parseFloat(b.Price) - parseFloat(a.Price));
soldArr.sort((a, b) => parseFloat(b.Price) - parseFloat(a.Price));
tradeArr.sort((a, b) => parseFloat(b.Profit) - parseFloat(a.Profit));
transferSummary.sort(function (a, b) {
return b.Season - a.Season
}); //order an object array
processAcademy();
present();
try {
$('.banner_placeholder.rectangle')[0].parentNode.removeChild($('.banner_placeholder.rectangle')[0]);
} catch (err) {}
}
//buyOrSell: 1 - buy, 2 - sell
function setMap(playerId, playerName, seasonId, price, buyOrSell) {
let player;
if (playerMap.has(playerId)) {
player = playerMap.get(playerId);
player.Transaction.push({
SeasonBS: seasonId + '.' + buyOrSell,
Price: price
});
try {
if (player.Name.trim() == '') {
player.Name = playerName; //fix bug of TM not show playername
}
} catch (e) {}
} else {
player = {
Id: playerId,
Name: playerName,
Transaction: [{
SeasonBS: seasonId + '.' + buyOrSell,
Price: price
}
]
}
playerMap.set(playerId, player);
}
}
function processPlayer() {
totalTradeBuy = 0;
totalTradeSell = 0;
totalTradeProfit = 0;
totalSquadBuy = 0;
squadCount = 0;
for (let[key, value]of playerMap) {
value.Transaction.sort((a, b) => parseFloat(a.SeasonBS) - parseFloat(b.SeasonBS));
let waitSellForTrade = false;
let buyForTrade;
value.Transaction.forEach(tran => {
let temp = tran.SeasonBS.split('.');
if (temp[1] == 1) {
boughtArr.push({
Id: value.Id,
Name: value.Name,
Season: temp[0],
Price: tran.Price
});
waitSellForTrade = true;
buyForTrade = tran.Price;
} else {
if (waitSellForTrade) {
let afterTax = (tran.Price * 0.94).toFixed(1);
let tradeProfit = Math.round((afterTax - buyForTrade) * 10) / 10;
if (tradeProfit >= minProfit && tradeProfit <= maxProfit) {
tradeArr.push({
Id: value.Id,
Name: value.Name,
Buy: buyForTrade,
Sell: afterTax,
Profit: tradeProfit
});
totalTradeBuy += Math.round(parseFloat(buyForTrade) * 10) / 10;
totalTradeSell += Math.round(parseFloat(afterTax) * 10) / 10;
totalTradeProfit += Math.round(parseFloat(tradeProfit) * 10) / 10;
}
soldArr.push({
Id: value.Id,
Name: value.Name,
Season: temp[0],
Price: tran.Price,
YoungAcademy: false
});
} else {
soldArr.push({
Id: value.Id,
Name: value.Name,
Season: temp[0],
Price: tran.Price,
YoungAcademy: true
});
if (academySoldMap.has(temp[0])) {
let academySoldSeasonData = academySoldMap.get(temp[0]);
academySoldSeasonData.Quantity++;
academySoldSeasonData.Sold += Math.round(parseFloat(tran.Price) * 10) / 10;
academySoldMap.set(temp[0], academySoldSeasonData);
} else {
academySoldMap.set(temp[0], {
Quantity: 1,
Sold: Math.round(parseFloat(tran.Price) * 10) / 10
});
}
}
waitSellForTrade = false;
}
});
if (squadPlayerIdArr.includes(value.Id)) { //player is still playing in squad. Can not be inferred from transfer history data because bug data of TM
totalSquadBuy += Math.round(parseFloat(buyForTrade) * 10) / 10;
squadCount++;
}
}
}
function processAcademy() {
seasonIds.forEach((seasonId) => {
if (academySoldMap.has(seasonId)) {
let season = academySoldMap.get(seasonId);
let seasonAverage = (Math.round(season.Sold) / season.Quantity).toFixed(1);
academySummary.push({
Season: seasonId,
Quantity: season.Quantity,
Sold: Math.round(season.Sold),
Average: seasonAverage
});
} else {
academySummary.push({
Season: seasonId,
Quantity: 0,
Sold: 0,
Average: '0.0'
});
}
});
}
function present() {
let clubTransfer =
"<div class=\"box\">" +
"<div class=\"box_head\">" +
"<h2 class=\"std\">Club Transfer (M)</h2>" +
"</div>" +
"<div class=\"box_body\">" +
"<div class=\"box_shadow\"></div>" +
"<h3>TOP BOUGHT</h3>" +
"<div id=\"topBought_content\" class=\"content_menu\"></div>" +
"<h3>TOP SOLD</h3>" +
"<div id=\"topSold_content\" class=\"content_menu\"></div>" +
"<h3>TOP TRADE PROFIT (INCLUDE TAX)</h3>" +
"<div id=\"topTrade_content\" class=\"content_menu\"></div>" +
"<h3>SUMMARY TRANSFER</h3>" +
"<div id=\"summaryTransfer_content\" class=\"content_menu\"></div>" +
"<h3>ACADEMY REVENUE</h3>" +
"<div id=\"academyRevenue_content\" class=\"content_menu\"></div>" +
"<h3>CONFIG</h3>" +
"<table>" +
"<tr>" +
"<td>" +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_SHOW_MODE + "' type='text' class='embossed' style='width: 150px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Mode'></span>" +
"</td>" +
"<td>" +
"<span id='" + CONTROL_ID.BUTTON_SHOW_MODE + "' class='button' style='margin-left: 3px;'><span class='button_border'>Show Mode</span></span>" +
"</td>" +
"</tr>" +
"<tr>" +
"<td>" +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_TOP_COUNT + "' type='text' class='embossed' style='width: 150px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Top count'></span>" +
"</td>" +
"<td>" +
"<span id='" + CONTROL_ID.BUTTON_TOP_COUNT + "' class='button' style='margin-left: 3px;'><span class='button_border'>Top Count</span></span>" +
"</td>" +
"</tr>" +
"<tr>" +
"<td>" +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_SEASON_COUNT + "' type='text' class='embossed' style='width: 65px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Count'></span>" +
" - " +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_TO_SEASON + "' type='text' class='embossed' style='width: 65px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='To season'></span>" +
"</td>" +
"<td>" +
"<span id='" + CONTROL_ID.BUTTON_SEASON_COUNT + "' class='button' style='margin-left: 3px;'><span class='button_border'>Season Count</span></span>" +
"</td>" +
"</tr>" +
"<tr>" +
"<td>" +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_MIN_PROFIT + "' type='text' class='embossed' style='width: 65px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Min profit'></span>" +
" - " +
"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_MAX_PROFIT + "' type='text' class='embossed' style='width: 65px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Max profit'></span>" +
"</td>" +
"<td>" +
"<span id='" + CONTROL_ID.BUTTON_TRADE_PROFIT + "' class='button' style='margin-left: 3px;'><span class='button_border'>Profit (M)</span></span>" +
"</td>" +
"</tr>" +
"</table>" +
"</div>" +
"<div class=\"box_footer\">" +
"<div></div>" +
"</div>" +
"</div>";
$(".column3_a").append(clubTransfer);
/*** SHOW MODE ***/
document.getElementById(CONTROL_ID.BUTTON_SHOW_MODE).addEventListener('click', (e) => {
setShowMode();
});
let showMode = localStorage.getItem(APPLICATION_PARAM.SHOW_MODE_LOCAL_STORAGE_KEY);
if (showMode == null || showMode == "") {
showMode = APPLICATION_PARAM.DEFAULT_SHOW_MODE;
}
$('#' + CONTROL_ID.INPUT_SHOW_MODE).val(showMode);
/*********/
/*** TOP COUT ***/
document.getElementById(CONTROL_ID.BUTTON_TOP_COUNT).addEventListener('click', (e) => {
setTopCount();
});
topCount = localStorage.getItem(APPLICATION_PARAM.TOP_COUNT_LOCAL_STORAGE_KEY);
if (topCount == null || topCount == "") {
topCount = APPLICATION_PARAM.DEFAULT_TOP_COUNT;
}
$('#' + CONTROL_ID.INPUT_TOP_COUNT).val(topCount);
/*********/
/*** SEASON COUT ***/
document.getElementById(CONTROL_ID.BUTTON_SEASON_COUNT).addEventListener('click', (e) => {
setSeasonCount();
});
$('#' + CONTROL_ID.INPUT_SEASON_COUNT).val(seasonCount);
$('#' + CONTROL_ID.INPUT_TO_SEASON).val(toSeason);
/*********/
/*** MIN PROFIT ***/
document.getElementById(CONTROL_ID.BUTTON_TRADE_PROFIT).addEventListener('click', (e) => {
setTradeProfit();
});
$('#' + CONTROL_ID.INPUT_MIN_PROFIT).val(minProfit);
$('#' + CONTROL_ID.INPUT_MAX_PROFIT).val(maxProfit);
/*********/
let invidualMode = showMode.split("");
if (invidualMode[0] == "1") {
showTopBought();
}
if (invidualMode[1] == "1") {
showTopSold();
}
if (invidualMode[2] == "1") {
showTopTradeProfit();
}
if (invidualMode[3] == "1") {
showSummaryTransfer();
}
if (invidualMode[4] == "1") {
showAcademyRevenue();
}
}
function showTopBought() {
if (boughtArr.length > 0) {
var topBought_content = "<table>" +
"<tr style='color:Orange;'><th align='right'>#</th><th>Player</th><th align='right'>SS</th><th align='right'>Price</th></tr>";
let rowCount = 0;
for (let i = 0; i < boughtArr.length && i < topCount; i++) {
rowCount++;
let classOdd = "";
if ((rowCount % 2) == 1) {
classOdd = "class='odd'";
}
topBought_content +=
'<tr ' + classOdd + '><td align="right">' + (i + 1) + '. ' +
'</td><td>' + '<span onclick = \"window.open(\'https:\/\/trophymanager.com\/players\/' + boughtArr[i].Id + '\')\">' + boughtArr[i].Name + '</span>' +
'</td><td align="right">' + boughtArr[i].Season +
'</td><td align="right">' + boughtArr[i].Price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td></tr>';
}
topBought_content += "</table>";
$("#topBought_content").append(topBought_content);
}
}
function showTopSold() {
if (soldArr.length > 0) {
var topSold_content = "<table>" +
"<tr style='color:Orange;'><th align='right'>#</th><th>Player</th><th align='right'>SS</th><th align='right'>Price</th></tr>";
let rowCount = 0;
for (let i = 0; i < soldArr.length && i < topCount; i++) {
rowCount++;
let classOdd = "";
if ((rowCount % 2) == 1) {
classOdd = "class='odd'";
}
if (soldArr[i].YoungAcademy && seasonCount == APPLICATION_PARAM.DEFAULT_SEASON_COUNT) {
topSold_content += "<tr style='color:Yellow;' " + classOdd + ">";
} else {
topSold_content += "<tr " + classOdd + ">";
}
topSold_content +=
'<td align="right">' + (i + 1) + '. ' +
'</td><td>' + '<span onclick = \"window.open(\'https:\/\/trophymanager.com\/players\/' + soldArr[i].Id + '\')\">' + soldArr[i].Name + '</span>' +
'</td><td align="right">' + soldArr[i].Season +
'</td><td align="right">' + soldArr[i].Price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td></tr>';
}
topSold_content += "</table>";
$("#topSold_content").append(topSold_content);
}
}
function showTopTradeProfit() {
if (tradeArr.length > 0) {
var topTrade_content = "<table>" +
"<tr style='color:Orange;'><th align='right'>#</th><th>Player</th><th align='right'>Buy</th><th align='right'>Sell</th><th align='right'>Profit</th></tr>";
topTrade_content +=
'<tr class="odd" style="color:' + APPLICATION_COLOR.AVERAGE + ';"><td></td><td>Average (' + tradeArr.length + ' players)</td><td align="right">' +
(totalTradeBuy / tradeArr.length).toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalTradeSell / tradeArr.length).toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalTradeProfit / tradeArr.length).toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td></tr>';
topTrade_content +=
'<tr style="color:' + APPLICATION_COLOR.TOTAL + ';"><td></td><td>Total (' + tradeArr.length + ' players)</td><td align="right">' +
totalTradeBuy.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
totalTradeSell.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
totalTradeProfit.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td></tr>';
let rowCount = 0;
for (let i = 0; i < tradeArr.length && i < topCount; i++) {
rowCount++;
let classOdd = "";
if ((rowCount % 2) == 1) {
classOdd = "class='odd'";
}
topTrade_content +=
'<tr ' + classOdd + '><td align="right">' + (i + 1) + '. ' +
'</td><td>' + '<span onclick = \"window.open(\'https:\/\/trophymanager.com\/players\/' + tradeArr[i].Id + '\')\">' + tradeArr[i].Name + '</span>' +
'</td><td align="right">' + tradeArr[i].Buy.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right" style="color:Orange;">' + tradeArr[i].Sell.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right">' + tradeArr[i].Profit.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td></tr>';
}
topTrade_content += "</table>";
$("#topTrade_content").append(topTrade_content);
}
}
function showSummaryTransfer() {
let summaryTransfer_content = "<table>" +
"<tr style='color:Orange;'><th align='right'>SS</th><th align='right'>Buy</th><th align='right'>Sell</th><th align='right'>+-</th><th align='right'>#</th><th align='right'>Avg</th></tr>";
let totalBought = 0,
totalSold = 0,
totalQuantity = 0;
let rowCount = 0;
let seasonTrArr = [];
transferSummary.forEach((summary) => {
rowCount++;
let trClass = "",
display = "";
if (rowCount <= APPLICATION_PARAM.SEASON_SHOW) {
if ((rowCount % 2) == 0) {
trClass = "class='odd'";
}
} else {
display = "style='display:none'";
if ((rowCount % 2) == 0) {
trClass = "class='odd " + CLASS_NAME.SUMMARY_TRANSFER + "'";
} else {
trClass = "class='" + CLASS_NAME.SUMMARY_TRANSFER + "'";
}
}
let seasonTr =
'<tr ' + trClass + ' ' + display + '><td align="right">' + summary.Season +
'</td><td align="right">' + summary.Bought.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right">' + summary.Sold.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right">' + summary.Balance.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right">' + summary.Quantity +
'</td><td align="right">' + summary.Average.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td></tr>';
seasonTrArr.push(seasonTr);
totalBought += summary.Bought;
totalSold += summary.Sold;
totalQuantity += summary.Quantity;
});
summaryTransfer_content +=
'<tr class="odd" style="color:' + APPLICATION_COLOR.AVERAGE + ';"><td align="right">Average</td><td align="right">' +
(totalBought / transferSummary.length).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalSold / transferSummary.length).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(Math.round(totalSold / transferSummary.length) - Math.round(totalBought / transferSummary.length)).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalQuantity / transferSummary.length).toFixed(0) + '</td><td align="right">' +
(totalQuantity > 0 ? ((totalSold + totalBought) / totalQuantity).toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",") : 0) + '</td></tr>';
summaryTransfer_content +=
'<tr style="color:' + APPLICATION_COLOR.TOTAL + ';"><td align="right">Total</td><td align="right">' +
totalBought.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
totalSold.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalSold - totalBought).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
totalQuantity.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
'</td></tr>';
if (seasonCount == APPLICATION_PARAM.DEFAULT_SEASON_COUNT) { //only display onSquadTotalBuy if show all seasons
summaryTransfer_content +=
'<tr class="odd" style="color:' + APPLICATION_COLOR.ONSQUAD + ';"><td align="right">Squad (' + squadCount + ')</td><td align="right">' +
totalSquadBuy.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right"></td><td align="right">' +
(totalSquadBuy + totalSold - totalBought).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right"></td><td align="right">' +
'</td></tr>';
} else {
summaryTransfer_content +=
'<tr class="odd" style="color:' + APPLICATION_COLOR.ONSQUAD + ';"><td align="right">Squad</td><td align="right" colspan="5">Show if summary all seasons</td></tr>';
}
seasonTrArr.forEach((seasonTr) => {
summaryTransfer_content += seasonTr;
});
if (rowCount > APPLICATION_PARAM.SEASON_SHOW) {
let buttonLabel = "Show all season " + seasonIds[seasonIds.length - 1] + " - " + seasonIds[0];
summaryTransfer_content += "<tr align='center'><td colspan='6'>" + "<span id='" + CONTROL_ID.BUTTON_SHOW_ALL_SUMMARY_TRANSFER + "' class='button' style='margin-left: 3px;'><span class='button_border'>" + buttonLabel + "</span></span>" + "</td></tr>";
}
summaryTransfer_content += "</table>";
$("#summaryTransfer_content").append(summaryTransfer_content);
if (rowCount > APPLICATION_PARAM.SEASON_SHOW) {
document.getElementById(CONTROL_ID.BUTTON_SHOW_ALL_SUMMARY_TRANSFER).addEventListener('click', (e) => {
showAll(CLASS_NAME.SUMMARY_TRANSFER, CONTROL_ID.BUTTON_SHOW_ALL_SUMMARY_TRANSFER);
});
}
}
function showAcademyRevenue() {
let academyRevenue_content = "<table>" +
"<tr style='color:Orange;'><th align='right'>SS</th><th align='right'>Sell</th><th align='right'>#</th><th align='right'>Avg</th></tr>";
let totalSold = 0,
totalQuantity = 0;
let rowCount = 0;
let seasonTrArr = [];
academySummary.forEach((summary) => {
rowCount++;
let trClass = "",
display = "";
if (rowCount <= APPLICATION_PARAM.SEASON_SHOW) {
if ((rowCount % 2) == 1) {
trClass = "class='odd'";
}
} else {
display = "style='display:none'";
if ((rowCount % 2) == 1) {
trClass = "class='odd " + CLASS_NAME.ACADEMY_REVENUE + "'";
} else {
trClass = "class='" + CLASS_NAME.ACADEMY_REVENUE + "'";
}
}
let seasonTr =
'<tr ' + trClass + ' ' + display + '><td align="right">' + summary.Season +
'</td><td align="right">' + summary.Sold.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td><td align="right">' + summary.Quantity +
'</td><td align="right">' + summary.Average.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") +
'</td></tr>';
seasonTrArr.push(seasonTr);
totalSold += summary.Sold;
totalQuantity += summary.Quantity;
});
academyRevenue_content +=
'<tr class="odd" style="color:' + APPLICATION_COLOR.AVERAGE + ';"><td align="right">Average</td><td align="right">' +
(totalSold / academySummary.length).toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
(totalQuantity / academySummary.length).toFixed(0) + '</td><td align="right">' +
(totalQuantity > 0 ? (totalSold / totalQuantity).toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",") : 0) + '</td></tr>';
academyRevenue_content +=
'<tr style="color:' + APPLICATION_COLOR.TOTAL + ';"><td align="right">Total</td><td align="right">' +
totalSold.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
totalQuantity.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '</td><td align="right">' +
'</td></tr>';
seasonTrArr.forEach((seasonTr) => {
academyRevenue_content += seasonTr;
});
if (rowCount > APPLICATION_PARAM.SEASON_SHOW) {
let buttonLabel = "Show all season " + seasonIds[seasonIds.length - 1] + " - " + seasonIds[0];
academyRevenue_content += "<tr align='center'><td colspan='4'>" + "<span id='" + CONTROL_ID.BUTTON_SHOW_ALL_ACADEMY_REVENUE + "' class='button' style='margin-left: 3px;'><span class='button_border'>" + buttonLabel + "</span></span>" + "</td></tr>";
}
academyRevenue_content += "</table>";
$("#academyRevenue_content").append(academyRevenue_content);
if (rowCount > APPLICATION_PARAM.SEASON_SHOW) {
document.getElementById(CONTROL_ID.BUTTON_SHOW_ALL_ACADEMY_REVENUE).addEventListener('click', (e) => {
showAll(CLASS_NAME.ACADEMY_REVENUE, CONTROL_ID.BUTTON_SHOW_ALL_ACADEMY_REVENUE);
});
}
}
function showAll(className, controlId) {
let trArr = $('.' + className);
for (let i = 0; i < trArr.length; i++) {
trArr[i].style = 'display:""';
}
$('#' + controlId)[0].style = 'display:none';
}
function setShowMode() {
let showMode = $('#' + CONTROL_ID.INPUT_SHOW_MODE)[0].value;
if (showMode == '') {
localStorage.removeItem(APPLICATION_PARAM.SHOW_MODE_LOCAL_STORAGE_KEY);
} else if (!isValidShowMode(showMode)) {
alert('Allowable show mode value has the form XXXXX where X is 0 or 1');
} else {
localStorage.setItem(APPLICATION_PARAM.SHOW_MODE_LOCAL_STORAGE_KEY, showMode);
alert('Set successful, please refresh');
}
}
function isValidShowMode(mode) {
let arr = mode.split('');
if (arr.length != 5)
return false;
for (let i = 0; i < arr.length; i++) {
if (arr[i] != '0' && arr[i] != '1') {
return false;
}
}
return true;
}
function setTopCount() {
let topCount = $('#' + CONTROL_ID.INPUT_TOP_COUNT)[0].value;
if (topCount == '') {
localStorage.removeItem(APPLICATION_PARAM.TOP_COUNT_LOCAL_STORAGE_KEY);
} else if (isNaN(topCount) || topCount <= 0) {
alert('Top count must be positive integer');
} else {
localStorage.setItem(APPLICATION_PARAM.TOP_COUNT_LOCAL_STORAGE_KEY, topCount);
alert('Set successful, please refresh');
}
}
function setSeasonCount() {
let seasonCount = $('#' + CONTROL_ID.INPUT_SEASON_COUNT)[0].value;
let toSeason = $('#' + CONTROL_ID.INPUT_TO_SEASON)[0].value;
let valid = true;
if (seasonCount == '') {
localStorage.removeItem(APPLICATION_PARAM.SEASON_COUNT_LOCAL_STORAGE_KEY);
} else if (isNaN(seasonCount) || seasonCount < 0) {
alert('Season count must be positive integer. Season count = 0 means all seasons.');
valid = false;
} else {
localStorage.setItem(APPLICATION_PARAM.SEASON_COUNT_LOCAL_STORAGE_KEY, seasonCount);
}
if (toSeason == '') {
localStorage.removeItem(APPLICATION_PARAM.TO_SEASON_LOCAL_STORAGE_KEY);
} else if (isNaN(toSeason) || toSeason < 0) {
alert('To season must be positive integer. To season = 0 means current season.');
valid = false;
} else {
localStorage.setItem(APPLICATION_PARAM.TO_SEASON_LOCAL_STORAGE_KEY, toSeason);
}
if (valid) {
alert('Set successful, please refresh');
}
}
function setTradeProfit() {
let minProfit = $('#' + CONTROL_ID.INPUT_MIN_PROFIT)[0].value;
let maxProfit = $('#' + CONTROL_ID.INPUT_MAX_PROFIT)[0].value;
let valid = true;
if (minProfit == '') {
localStorage.removeItem(APPLICATION_PARAM.MIN_PROFIT_LOCAL_STORAGE_KEY);
} else if (isNaN(minProfit)) {
alert('Min profit must be number');
valid = false;
} else {
localStorage.setItem(APPLICATION_PARAM.MIN_PROFIT_LOCAL_STORAGE_KEY, minProfit);
}
if (maxProfit == '') {
localStorage.removeItem(APPLICATION_PARAM.MAX_PROFIT_LOCAL_STORAGE_KEY);
} else if (isNaN(maxProfit)) {
alert('Max profit must be number');
valid = false;
} else {
localStorage.setItem(APPLICATION_PARAM.MAX_PROFIT_LOCAL_STORAGE_KEY, maxProfit);
}
if (valid) {
alert('Set successful, please refresh');
}
}
})();