您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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.
// ==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'); } } })();