TMVN Club Transfer

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. In addition, the script also saves data for for TMVN League Transfer script (https://gf.qytechs.cn/en/scripts/416755).

目前為 2021-06-13 提交的版本,檢視 最新版本

// ==UserScript==
// @name         TMVN Club Transfer
// @namespace    https://trophymanager.com
// @version      11
// @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. In addition, the script also saves data for for TMVN League Transfer script (https://gf.qytechs.cn/en/scripts/416755).
// @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",
		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',
		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'
	}
	const APPLICATION_COLOR = {
		AVERAGE: 'Aqua',
		TOTAL: 'Yellow'
	}

	var topCount,
	seasonCount;
	seasonCount = localStorage.getItem(APPLICATION_PARAM.SEASON_COUNT_LOCAL_STORAGE_KEY);
	if (seasonCount == null || seasonCount == "") {
		seasonCount = APPLICATION_PARAM.DEFAULT_SEASON_COUNT;
	}
	var boughtArr = [];
	var soldArr = [];
	var tradeArr = [];
	var academySoldMap = new Map();
	var academySummary = [];
	var transferSummary = [];
	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) {}
	});
	$.ajaxSetup({
		async: true
	});
	if (seasonCount > 0 && seasonCount < seasonIds.length) {
		do {
			seasonIds.pop();
		} while (seasonCount < seasonIds.length);
	}

	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) {}
			});
		});
	}

	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();

		if (!(boughtArr.length == 0 && soldArr.length == 0 && tradeArr.length == 0)) {
			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() {
		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) {
						tradeArr.push({
							Id: value.Id,
							Name: value.Name,
							Buy: buyForTrade,
							Sell: tran.Price,
							Profit: (tran.Price - buyForTrade).toFixed(1)
						});
						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 += parseFloat(tran.Price);
							academySoldMap.set(temp[0], academySoldSeasonData);
						} else {
							academySoldMap.set(temp[0], {
								Quantity: 1,
								Sold: parseFloat(tran.Price)
							});
						}
					}
					waitSellForTrade = false;
				}
			});
		}
	}

	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</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>" +
			"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_SHOW_MODE + "' type='text' class='embossed' style='min-width: 100px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Set show mode'></span>" +
			"<span id='" + CONTROL_ID.BUTTON_SHOW_MODE + "' class='button' style='margin-left: 3px;'><span class='button_border'>Show Mode</span></span>" +
			"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_TOP_COUNT + "' type='text' class='embossed' style='min-width: 100px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Set top count'></span>" +
			"<span id='" + CONTROL_ID.BUTTON_TOP_COUNT + "' class='button' style='margin-left: 3px;'><span class='button_border'>Top Count</span></span>" +
			"<span style='display: inline-block;'><input id='" + CONTROL_ID.INPUT_SEASON_COUNT + "' type='text' class='embossed' style='min-width: 100px; line-height: 100%; padding: 3px 3px 4px 3px;' placeholder='Set season count'></span>" +
			"<span id='" + CONTROL_ID.BUTTON_SEASON_COUNT + "' class='button' style='margin-left: 3px;'><span class='button_border'>Season Count</span></span>" +
			"</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);
		/*********/

		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) {
					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>";
			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">' + 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) == 1) {
					trClass = "class='odd'";
				}
			} else {
				display = "style='display:none'";
				if ((rowCount % 2) == 1) {
					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>';

		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);
			});
		}

		localStorage.setItem(clubId + "_AVERAGE_TRANSFER", JSON.stringify({
				"Time": new Date(),
				"Bought": Number((totalBought / transferSummary.length).toFixed(0)),
				"Sold": Number((totalSold / transferSummary.length).toFixed(0)),
				"Balance": Math.round(totalSold / transferSummary.length) - Math.round(totalBought / transferSummary.length),
				"Quantity": Number((totalQuantity / transferSummary.length).toFixed(0)),
				"Average": totalQuantity > 0 ? Number(((totalSold + totalBought) / totalQuantity).toFixed(1)) : 0,
				"SeasonCount": transferSummary.length
			}));
	}

	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;
		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.');
		} else {
			localStorage.setItem(APPLICATION_PARAM.SEASON_COUNT_LOCAL_STORAGE_KEY, seasonCount);
			alert('Set successful, please refresh');
		}
	}
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址