PIU Phoenix

PIU Phoenix Score&Title Analyser Patch 1.0.2

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         PIU Phoenix
// @license      MIT
// @namespace    https://github.com/numbuh1/pump-it-up-phoenix-bookmarklet
// @version      1.2
// @description  PIU Phoenix Score&Title Analyser Patch 1.0.2
// @author       numbuh1
// @match        https://piugame.com/my_page/my_best_score.php
// @icon         <$ICON$>
// @require      https://code.jquery.com/jquery-3.7.0.min.js
// ==/UserScript==

const rating_text = {
	'sss_p': 'SSS+',
	'sss': 'SSS',
	'ss_p': 'SS+',
	'ss': 'SS',
	's_p': 'S+',
	's': 'S',
	'aaa_p': 'AAA+',
	'aaa': 'AAA',
	'aa_p': 'AA+',
	'aa': 'AA',
	'a_p': 'A+',
	'a': 'A',
	'b': 'B',
	'c': 'C',
	'd': 'D',
	'f': 'F',
};
const plate_text = {
	'pg': 'PERFECT GAME',
	'ug': 'ULTIMATE GAME',
	'eg': 'EXTREME GAME',
	'sg': 'SUPERB GAME',
	'mg': 'MARVELOUS GAME',
	'tg': 'TALENTED GAME',
	'fg': 'FAIR GAME',
	'rg': 'ROUGH GAME'
};
const expert_titles = [
	{
		name: 'THE MASTER',
		description: '[Lv.28] 1,900 rating',
		tier: 'platinum',
		type: 'rating',
		level: '28',
		rating: '1900'
	},
	{
		name: 'EXPERT Lv.10',
		description: '[Lv.27] 7,000 rating',
		tier: 'platinum',
		type: 'rating',
		level: '27',
		rating: '7000'
	},
	{
		name: 'EXPERT Lv.9',
		description: '[Lv.27] 3,500 rating',
		tier: 'gold',
		type: 'rating',
		level: '27',
		rating: '3500'
	},
	{
		name: 'EXPERT Lv.8',
		description: '[Lv.26] 26,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '26',
		rating: '26000'
	},
	{
		name: 'EXPERT Lv.7',
		description: '[Lv.26] 13,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '26',
		rating: '13000'
	},
	{
		name: 'EXPERT Lv.6',
		description: '[Lv.25] 40,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '25',
		rating: '40000'
	},
	{
		name: 'EXPERT Lv.5',
		description: '[Lv.25] 20,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '25',
		rating: '20000'
	},
	{
		name: 'EXPERT Lv.4',
		description: '[Lv.24] 60,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '24',
		rating: '60000'
	},
	{
		name: 'EXPERT Lv.3',
		description: '[Lv.24] 30,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '24',
		rating: '30000'
	},
	{
		name: 'EXPERT Lv.2',
		description: '[Lv.23] 80,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '23',
		rating: '80000'
	},
	{
		name: 'EXPERT Lv.1',
		description: '[Lv.23] 40,000 rating',
		tier: 'gold',
		type: 'rating',
		level: '23',
		rating: '40000'
	},
	{
		name: 'ADVANCED Lv.10',
		description: '[Lv.22] 70,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '22',
		rating: '70000'
	},
	{
		name: 'ADVANCED Lv.9',
		description: '[Lv.22] 52,500 rating',
		tier: 'silver',
		type: 'rating',
		level: '22',
		rating: '52500'
	},
	{
		name: 'ADVANCED Lv.8',
		description: '[Lv.22] 35,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '22',
		rating: '35000'
	},
	{
		name: 'ADVANCED Lv.7',
		description: '[Lv.22] 17,500 rating',
		tier: 'silver',
		type: 'rating',
		level: '22',
		rating: '17500'
	},
	{
		name: 'ADVANCED Lv.6',
		description: '[Lv.21] 45,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '21',
		rating: '45000'
	},
	{
		name: 'ADVANCED Lv.5',
		description: '[Lv.21] 30,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '21',
		rating: '30000'
	},
	{
		name: 'ADVANCED Lv.4',
		description: '[Lv.21] 15,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '21',
		rating: '15000'
	},
	{
		name: 'ADVANCED Lv.3',
		description: '[Lv.20] 39,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '20',
		rating: '39000'
	},
	{
		name: 'ADVANCED Lv.2',
		description: '[Lv.20] 26,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '20',
		rating: '26000'
	},
	{
		name: 'ADVANCED Lv.1',
		description: '[Lv.20] 13,000 rating',
		tier: 'silver',
		type: 'rating',
		level: '20',
		rating: '13000'
	},
	{
		name: 'INTERMEDIATE Lv.10',
		description: '[Lv.19] 11,000 rating',
		tier: 'bronze',
		type: 'rating',
		level: '19',
		rating: '11000'
	},
	{
		name: 'INTERMEDIATE Lv.9',
		description: '[Lv.18] 9,200 rating',
		tier: 'bronze',
		type: 'rating',
		level: '18',
		rating: '9200'
	},
	{
		name: 'INTERMEDIATE Lv.8',
		description: '[Lv.17] 7,600 rating',
		tier: 'bronze',
		type: 'rating',
		level: '17',
		rating: '7600'
	},
	{
		name: 'INTERMEDIATE Lv.7',
		description: '[Lv.16] 6,200 rating',
		tier: 'bronze',
		type: 'rating',
		level: '16',
		rating: '6200'
	},
	{
		name: 'INTERMEDIATE Lv.6',
		description: '[Lv.15] 5,000 rating',
		tier: 'bronze',
		type: 'rating',
		level: '15',
		rating: '5000'
	},
	{
		name: 'INTERMEDIATE Lv.5',
		description: '[Lv.14] 4,000 rating',
		tier: 'bronze',
		type: 'rating',
		level: '14',
		rating: '4000'
	},
	{
		name: 'INTERMEDIATE Lv.4',
		description: '[Lv.13] 3,200 rating',
		tier: 'bronze',
		type: 'rating',
		level: '13',
		rating: '3200'
	},
	{
		name: 'INTERMEDIATE Lv.3',
		description: '[Lv.12] 2,600 rating',
		tier: 'bronze',
		type: 'rating',
		level: '12',
		rating: '2600'
	},
	{
		name: 'INTERMEDIATE Lv.2',
		description: '[Lv.11] 2,200 rating',
		tier: 'bronze',
		type: 'rating',
		level: '11',
		rating: '2200'
	},
	{
		name: 'INTERMEDIATE Lv.1',
		description: '[Lv.10] 2,000 rating',
		tier: 'bronze',
		type: 'rating',
		level: '10',
		rating: '2000'
	},
	{
		name: 'SPECIALIST',
		description: 'All skill titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'skill',
		count: 60
	},
	{
		name: '[BRACKET] EXPERT',
		description: 'All Bracket titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'bracket',
		count: 10
	},
	{
		name: '[BRACKET] Lv.10',
		description: 'Phalanx D24',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Phalanx',
		diff: 'D24'
	},
	{
		name: '[BRACKET] Lv.9',
		description: 'Scorpion King D23',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Scorpion King',
		diff: 'D23'
	},
	{
		name: '[BRACKET] Lv.8',
		description: 'Pop Sequence D23',
		tier: 'gold',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Pop Sequence',
		diff: 'D23'
	},
	{
		name: '[BRACKET] Lv.7',
		description: 'What Happened D23',
		tier: 'gold',
		type: 'skill',
		collect_type: 'bracket',
		song: 'What Happened',
		diff: 'D23'
	},
	{
		name: '[BRACKET] Lv.6',
		description: 'Meteo5cience D22',
		tier: 'silver',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Meteo5cience',
		diff: 'D22'
	},
	{
		name: '[BRACKET] Lv.5',
		description: 'Phalanx S22',
		tier: 'silver',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Phalanx',
		diff: 'S22'
	},
	{
		name: '[BRACKET] Lv.4',
		description: 'What Happened S21',
		tier: 'silver',
		type: 'skill',
		collect_type: 'bracket',
		song: 'What Happened',
		diff: 'S21'
	},
	{
		name: '[BRACKET] Lv.3',
		description: 'Meteo5cience D21',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Meteo5cience',
		diff: 'D21'
	},
	{
		name: '[BRACKET] Lv.2',
		description: 'Mad5cience S20',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Mad5cience',
		diff: 'S20'
	},
	{
		name: '[BRACKET] Lv.1',
		description: 'Allegro furioso D20',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'bracket',
		song: 'Allegro furioso',
		diff: 'D20'
	},
	{
		name: '[HALF] EXPERT',
		description: 'All Half titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'half',
		count: 10
	},
	{
		name: '[HALF] Lv.10',
		description: 'Imprinting D24',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'half',
		song: 'Imprinting',
		diff: 'D24'
	},
	{
		name: '[HALF] Lv.9',
		description: 'Love is a Danger Zone 2 Try To B.P.M D23',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'half',
		song: 'Love is a Danger Zone 2 Try To B.P.M',
		diff: 'D23'
	},
	{
		name: '[HALF] Lv.8',
		description: 'Redline D22',
		tier: 'gold',
		type: 'skill',
		collect_type: 'half',
		song: 'Redline',
		diff: 'D22'
	},
	{
		name: '[HALF] Lv.7',
		description: 'Witch Doctor #1 D21',
		tier: 'gold',
		type: 'skill',
		collect_type: 'half',
		song: 'Witch Doctor #1',
		diff: 'D21'
	},
	{
		name: '[HALF] Lv.6',
		description: 'Utsushiyo No Kaze D20',
		tier: 'silver',
		type: 'skill',
		collect_type: 'half',
		song: 'Utsushiyo No Kaze',
		diff: 'D20'
	},
	{
		name: '[HALF] Lv.5',
		description: 'Phantom D19',
		tier: 'silver',
		type: 'skill',
		collect_type: 'half',
		song: 'Phantom',
		diff: 'D19'
	},
	{
		name: '[HALF] Lv.4',
		description: 'Super Fantasy D18',
		tier: 'silver',
		type: 'skill',
		collect_type: 'half',
		song: 'Super Fantasy',
		diff: 'D18'
	},
	{
		name: '[HALF] Lv.3',
		description: 'Shub Niggurath D18',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'half',
		song: 'Shub Niggurath',
		diff: 'D18'
	},
	{
		name: '[HALF] Lv.2',
		description: 'Butterfly D17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'half',
		song: 'Butterfly',
		diff: 'D17'
	},
	{
		name: '[HALF] Lv.1',
		description: 'Mopemope D17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'half',
		song: 'Mopemope',
		diff: 'D17'
	},
	{
		name: '[GIMMICK] EXPERT',
		description: 'All Gimmick titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'gimmick',
		count: 10
	},
	{
		name: '[GIMMICK] Lv.10',
		description: 'Everybody Got 2 Know S21',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Everybody Got 2 Know',
		diff: 'S21'
	},
	{
		name: '[GIMMICK] Lv.9',
		description: '8 6 S20',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'gimmick',
		song: '8 6',
		diff: 'S20'
	},
	{
		name: '[GIMMICK] Lv.8',
		description: 'Twist of Fate (feat. Ruriling) S19',
		tier: 'gold',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Twist of Fate (feat. Ruriling)',
		diff: 'S19'
	},
	{
		name: '[GIMMICK] Lv.7',
		description: 'Nakakapagpabagabag S19',
		tier: 'gold',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Nakakapagpabagabag',
		diff: 'S19'
	},
	{
		name: '[GIMMICK] Lv.6',
		description: 'Miss S\' story S19',
		tier: 'silver',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Miss S\' story',
		diff: 'S19'
	},
	{
		name: '[GIMMICK] Lv.5',
		description: 'Rock the house - SHORT CUT - S18',
		tier: 'silver',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Rock the house - SHORT CUT -',
		diff: 'S18'
	},
	{
		name: '[GIMMICK] Lv.4',
		description: 'Come to Me S17',
		tier: 'silver',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Come to Me',
		diff: 'S17'
	},
	{
		name: '[GIMMICK] Lv.3',
		description: 'Ugly Dee S17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Ugly Dee',
		diff: 'S17'
	},
	{
		name: '[GIMMICK] Lv.2',
		description: '8 6 S16',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'gimmick',
		song: '8 6',
		diff: 'S16'
	},
	{
		name: '[GIMMICK] Lv.1',
		description: 'Yeo rae a S13',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'gimmick',
		song: 'Yeo rae a',
		diff: 'S13'
	},
	{
		name: '[DRILL] EXPERT',
		description: 'All Drill titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'drill',
		count: 10
	},
	{
		name: '[DRILL] Lv.10',
		description: 'WI-EX-DOC-VA D24',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'drill',
		song: 'WI-EX-DOC-VA',
		diff: 'D24'
	},
	{
		name: '[DRILL] Lv.9',
		description: 'Witch Doctor D23',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'drill',
		song: 'Witch Doctor',
		diff: 'D23'
	},
	{
		name: '[DRILL] Lv.8',
		description: 'Rock the house D22',
		tier: 'gold',
		type: 'skill',
		collect_type: 'drill',
		song: 'Rock the house',
		diff: 'D22'
	},
	{
		name: '[DRILL] Lv.7',
		description: 'Sorceress Elise S21',
		tier: 'gold',
		type: 'skill',
		collect_type: 'drill',
		song: 'Sorceress Elise',
		diff: 'S21'
	},
	{
		name: '[DRILL] Lv.6',
		description: 'Overblow S20',
		tier: 'silver',
		type: 'skill',
		collect_type: 'drill',
		song: 'Overblow',
		diff: 'S20'
	},
	{
		name: '[DRILL] Lv.5',
		description: 'Vacuum S19',
		tier: 'silver',
		type: 'skill',
		collect_type: 'drill',
		song: 'Vacuum',
		diff: 'S19'
	},
	{
		name: '[DRILL] Lv.4',
		description: 'Moonlight S18',
		tier: 'silver',
		type: 'skill',
		collect_type: 'drill',
		song: 'Moonlight',
		diff: 'S18'
	},
	{
		name: '[DRILL] Lv.3',
		description: 'Gun Rock S17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'drill',
		song: 'Gun Rock',
		diff: 'S17'
	},
	{
		name: '[DRILL] Lv.2',
		description: 'Vook S16',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'drill',
		song: 'Vook',
		diff: 'S16'
	},
	{
		name: '[DRILL] Lv.1',
		description: 'Hellfire S13',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'drill',
		song: 'Hellfire',
		diff: 'S13'
	},
	{
		name: '[RUN] EXPERT',
		description: 'All Run titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'run',
		count: 10
	},
	{
		name: '[RUN] Lv.10',
		description: 'Yog-Sothoth D24',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'run',
		song: 'Yog-Sothoth',
		diff: 'D24'
	},
	{
		name: '[RUN] Lv.9',
		description: 'Baroque Virus - FULL SONG - D23',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'run',
		song: 'Baroque Virus - FULL SONG -',
		diff: 'D23'
	},
	{
		name: '[RUN] Lv.8',
		description: 'Gargoyle - FULL SONG - D22',
		tier: 'gold',
		type: 'skill',
		collect_type: 'run',
		song: 'Gargoyle - FULL SONG -',
		diff: 'D22'
	},
	{
		name: '[RUN] Lv.7',
		description: 'Sarabande D21',
		tier: 'gold',
		type: 'skill',
		collect_type: 'run',
		song: 'Sarabande',
		diff: 'D21'
	},
	{
		name: '[RUN] Lv.6',
		description: 'Bee D20',
		tier: 'silver',
		type: 'skill',
		collect_type: 'run',
		song: 'Bee',
		diff: 'D20'
	},
	{
		name: '[RUN] Lv.5',
		description: 'Napalm S19',
		tier: 'silver',
		type: 'skill',
		collect_type: 'run',
		song: 'Napalm',
		diff: 'S19'
	},
	{
		name: '[RUN] Lv.4',
		description: 'Gothique Resonance S18',
		tier: 'silver',
		type: 'skill',
		collect_type: 'run',
		song: 'Gothique Resonance',
		diff: 'S18'
	},
	{
		name: '[RUN] Lv.3',
		description: 'Pavane S17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'run',
		song: 'Pavane',
		diff: 'S17'
	},
	{
		name: '[RUN] Lv.2',
		description: 'Super Fantasy S16',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'run',
		song: 'Super Fantasy',
		diff: 'S16'
	},
	{
		name: '[RUN] Lv.1',
		description: 'Switronic S13',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'run',
		song: 'Switronic',
		diff: 'S13'
	},
	{
		name: '[TWIST] EXPERT',
		description: 'All Twist titles',
		tier: 'platinum',
		type: 'skill_collect',
		collect_type: 'twist',
		count: 10
	},
	{
		name: '[TWIST] Lv.10',
		description: 'Bee D24',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'twist',
		song: 'Bee',
		diff: 'D24'
	},
	{
		name: '[TWIST] Lv.9',
		description: 'Love Is A Danger Zone(Cranky Mix) D23',
		tier: 'platinum',
		type: 'skill',
		collect_type: 'twist',
		song: 'Love Is A Danger Zone(Cranky Mix)',
		diff: 'D23'
	},
	{
		name: '[TWIST] Lv.8',
		description: 'Super Fantasy D22',
		tier: 'gold',
		type: 'skill',
		collect_type: 'twist',
		song: 'Super Fantasy',
		diff: 'D22'
	},
	{
		name: '[TWIST] Lv.7',
		description: 'Love is a Danger Zone D21',
		tier: 'gold',
		type: 'skill',
		collect_type: 'twist',
		song: 'Love is a Danger Zone',
		diff: 'D21'
	},
	{
		name: '[TWIST] Lv.6',
		description: 'Witch Doctor #1 D20',
		tier: 'silver',
		type: 'skill',
		collect_type: 'twist',
		song: 'Witch Doctor #1',
		diff: 'D20'
	},
	{
		name: '[TWIST] Lv.5',
		description: 'U GOT 2 KNOW S19',
		tier: 'silver',
		type: 'skill',
		collect_type: 'twist',
		song: 'U GOT 2 KNOW',
		diff: 'S19'
	},
	{
		name: '[TWIST] Lv.4',
		description: 'Solitary 2 S18',
		tier: 'silver',
		type: 'skill',
		collect_type: 'twist',
		song: 'Solitary 2',
		diff: 'S18'
	},
	{
		name: '[TWIST] Lv.3',
		description: 'U Got Me Rocking S17',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'twist',
		song: 'U Got Me Rocking',
		diff: 'S17'
	},
	{
		name: '[TWIST] Lv.2',
		description: 'Street show down S16',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'twist',
		song: 'Street show down',
		diff: 'S16'
	},
	{
		name: '[TWIST] Lv.1',
		description: 'Scorpion King S13',
		tier: 'bronze',
		type: 'skill',
		collect_type: 'twist',
		song: 'Scorpion King',
		diff: 'S13'
	},
	{
		name: '[XX] Double',
		description: '1949 D28',
		tier: 'platinum',
		type: 'boss',
		song: '1949',
		diff: 'D28'
	},
	{
		name: '[XX] Single',
		description: 'ERRORCODE: 0 S25',
		tier: 'gold',
		type: 'boss',
		song: 'ERRORCODE: 0',
		diff: 'S25'
	},
	{
		name: '[PRIME2] Double',
		description: 'Shub Sothoth D27',
		tier: 'platinum',
		type: 'boss',
		song: 'Shub Sothoth',
		diff: 'D27'
	},
	{
		name: '[PRIME2] Single',
		description: 'Shub Sothoth S25',
		tier: 'gold',
		type: 'boss',
		song: 'Shub Sothoth',
		diff: 'S25'
	},
	{
		name: '[PRIME] Double',
		description: 'Paradoxx D28',
		tier: 'platinum',
		type: 'boss',
		song: 'Paradoxx',
		diff: 'D28'
	},
	{
		name: '[PRIME] Single',
		description: 'Paradoxx S26',
		tier: 'gold',
		type: 'boss',
		song: 'Paradoxx',
		diff: 'S26'
	},
	{
		name: '[FIESTA2] Double',
		description: 'Ignis Fatuus D25',
		tier: 'gold',
		type: 'boss',
		song: 'Ignis Fatuus',
		diff: 'D25'
	},
	{
		name: '[FIESTA2] Single',
		description: 'Ignis Fatuus S22',
		tier: 'silver',
		type: 'boss',
		song: 'Ignis Fatuus',
		diff: 'S22'
	},
	{
		name: '[FIESTA EX] Double',
		description: 'Vacuum Cleaner D26',
		tier: 'gold',
		type: 'boss',
		song: 'Vacuum Cleaner',
		diff: 'D26'
	},
	{
		name: '[FIESTA EX] Single',
		description: 'Vacuum Cleaner S25',
		tier: 'gold',
		type: 'boss',
		song: 'Vacuum Cleaner',
		diff: 'S25'
	},
	{
		name: '[FIESTA] Double',
		description: 'Vacuum D25',
		tier: 'gold',
		type: 'boss',
		song: 'Vacuum',
		diff: 'D25'
	},
	{
		name: '[FIESTA] Single',
		description: 'Vacuum S23',
		tier: 'silver',
		type: 'boss',
		song: 'Vacuum',
		diff: 'S23'
	},
	{
		name: '[NXA] Double',
		description: 'Final Audition Ep. 2-X D24',
		tier: 'gold',
		type: 'boss',
		song: 'Final Audition Ep. 2-X',
		diff: 'D24'
	},
	{
		name: '[NXA] Single',
		description: 'Final Audition Ep. 2-X S23',
		tier: 'silver',
		type: 'boss',
		song: 'Final Audition Ep. 2-X',
		diff: 'S23'
	},
	{
		name: '[NX2] Double',
		description: 'Banya-P Guitar Remix D24',
		tier: 'gold',
		type: 'boss',
		song: 'Banya-P Guitar Remix',
		diff: 'D24'
	},
	{
		name: '[NX2] Single',
		description: 'Banya-P Guitar Remix S22',
		tier: 'silver',
		type: 'boss',
		song: 'Banya-P Guitar Remix',
		diff: 'S22'
	},
	{
		name: '[NX] Double',
		description: 'Bemera D26',
		tier: 'gold',
		type: 'boss',
		song: 'Bemera',
		diff: 'D26'
	},
	{
		name: '[NX] Single',
		description: 'Bemera S24',
		tier: 'silver',
		type: 'boss',
		song: 'Bemera',
		diff: 'S24'
	},
	{
		name: '[ZERO] Double',
		description: 'Love is a Danger Zone pt. 2 D24',
		tier: 'silver',
		type: 'boss',
		song: 'Love is a Danger Zone pt. 2',
		diff: 'D24'
	},
	{
		name: '[ZERO] Single',
		description: 'Love is a Danger Zone pt. 2 S22',
		tier: 'silver',
		type: 'boss',
		song: 'Love is a Danger Zone pt. 2',
		diff: 'S22'
	},
	{
		name: '[EXCEED2] Double',
		description: 'Canon D D23',
		tier: 'silver',
		type: 'boss',
		song: 'Canon D',
		diff: 'D23'
	},
	{
		name: '[EXCEED2] Single',
		description: 'Canon D S20',
		tier: 'silver',
		type: 'boss',
		song: 'Canon D',
		diff: 'S20'
	},
	{
		name: '[EXCEED] Double',
		description: 'Dignity D24',
		tier: 'gold',
		type: 'boss',
		song: 'Dignity',
		diff: 'D24'
	},
	{
		name: '[EXCEED] Single',
		description: 'Dignity S21',
		tier: 'silver',
		type: 'boss',
		song: 'Dignity',
		diff: 'S21'
	},
	{
		name: '[THE PREX3]',
		description: 'Bee S17',
		tier: 'bronze',
		type: 'boss',
		song: 'Bee',
		diff: 'S17'
	},
	{
		name: '[THE REBIRTH]',
		description: 'Love is a Danger Zone S17',
		tier: 'bronze',
		type: 'boss',
		song: 'Love is a Danger Zone',
		diff: 'S17'
	},
	{
		name: '[EXTRA]',
		description: 'Radetzky Can Can D18',
		tier: 'bronze',
		type: 'boss',
		song: 'Radetzky Can Can',
		diff: 'D18'
	},
	{
		name: '[Perfect Collection]',
		description: 'Slam S18',
		tier: 'bronze',
		type: 'boss',
		song: 'Slam',
		diff: 'S18'
	},
	{
		name: '[The O.B.G SE]',
		description: 'Mr. Larpus S15',
		tier: 'bronze',
		type: 'boss',
		song: 'Mr. Larpus',
		diff: 'S15'
	},
	{
		name: '[The O.B.G]',
		description: 'Turkey March S12',
		tier: 'bronze',
		type: 'boss',
		song: 'Turkey March',
		diff: 'S12'
	},
	{
		name: '[The 2nd]',
		description: 'Extravaganza S11',
		tier: 'bronze',
		type: 'boss',
		song: 'Extravaganza',
		diff: 'S11'
	},
	{
		name: '[The 1st]',
		description: 'Another Truth S6',
		tier: 'bronze',
		type: 'boss',
		song: 'Another Truth',
		diff: 'S6'
	},
];

fetchAllScores();

function fetchAllScores() {
	let pages = parseInt($('.board_paging button:last').attr('onclick').split('=')[2].split('\'')[0]);
	$('head').append( $('<link rel="stylesheet" type="text/css" />').attr('href', 'https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css') );
	$('#contents').css('background', '#1a1b1e');
	$('#header').remove();
	$('.pageWrap').html('');
	showProgress(pages);
	let scores = [];
	let current_url = window.location.href;

	if(window.location.href.indexOf('?') == -1) {
		current_url = current_url + '?';
	}

	let mark = 1;
	for (var i = 1; i <= pages; i++) {
		fetchScores(current_url + '&&page=' + i)
			.then((score) => {
				console.log(mark + '/' + pages);
				$('#current_progress_page').html(mark);
				$('#fetch_progress_bar').css('width', ((mark/pages)*100) + '%');
				for (var j = score.length - 1; j >= 0; j--) {
					scores.push(score[j])
				}
				if(mark == pages) {
					$('#progress_pane').hide();
					run(scores)
				}
				mark++;
			});
	}
}


function run(scores) {
	scores.sort(function(a, b){
	    var a1 = a.rating, b1 = b.rating;
	    if(a1 == b1) {
		var a2 = a.score, b2 = b.score;
		    if(a2 == b2) {
			return 0;
		    }
		return a2 > b2 ? -1 : 1;
	    }
	    return a1 > b1 ? -1 : 1;
	});

	createAnalytic(scores);
}

function showProgress(page) {
	$('.pageWrap').prepend('<div id="progress_pane"><h1 style="color:white">Fetching scores:</h1><div id="fetch_progress" class="progress" style="height: 30px;"></div>');
	$('#fetch_progress').append('<div id="fetch_progress_bar" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" ' +
		'aria-valuenow="0" aria-valuemin="0" aria-valuemax="' + page + '" style="width: 0%">'+
		'<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">'+
		'<span style="font-size: 20px;"><span id="current_progress_page">0</span>/' + page + '</span></div></div>');
}

function createAnalytic(scores) {
	console.log("Run Analytics");

	$('.pageWrap').prepend('<div id="table_pane" class="row"><div id="table_pane_body" class="col-md-6"><table id="main_table" class="table table-dark table-striped"></table></div></div>');
	$('#main_table').append('<thead class="thead-dark"><tr><th width="30">#</th><th>Song</th><th width="50">Diff</th><th width="100">Score</th><th width="50">Rank</th><th width="70">Rating</th></tr></thead>');
	//$('#main_table').css('');
	$('#main_table').append('<tbody id="main_table_body"><tbody>');

	for (var i = 0; i < scores.length; i++) {
		switch(scores[i].level_type) {
			case 'single':
			    var level_style = 'style="font-weight: bolder; color: orangered;"';
			    break;
			case 'double':
			    level_style = 'style="font-weight: bolder; color: lawngreen;"';
			    break;
			case 'coop':
			level_style = 'style="font-weight: bolder; color: yellow;"';
			break;
		    default:
			level_style = '';
		}
		switch(scores[i].score_rate) {
			case 'sss_p':
			case 'sss':
			    var score_style = 'style="font-weight: bolder; color: cyan;"';
			    break;
			case 'ss_p':
			case 'ss':
			case 's_p':
			case 's':
			    score_style = 'style="font-weight: bolder; color: gold;"';
			    break;
			case 'aaa_p':
			case 'aaa':
			score_style = 'style="font-weight: bolder; color: silver;"';
			break;
		    case 'aa_p':
		    case 'aa':
		    case 'a_p':
		    case 'a':
			score_style = 'style="font-weight: bolder; color: orangered;"';
			break;
		    default:
			score_style = 'style="font-weight: bolder; color: greenyellow;"';
		}
		$('#main_table_body').append('<tr>' +
			'<td>' + (i+1) + '</td>' +
			'<td>' + scores[i].name + '</td>' +
			'<td ' + level_style + '>' + scores[i].level_text + '</td>' +
			'<td>' + scores[i].score_text + '</td>' +
			'<td ' + score_style + '>' + scores[i].score_rate_text + '</td>' +
			'<td>' + scores[i].rating + '</td>');
	}


	$('#table_pane').append('<div id="table_pane_progress" class="col-md-6"><table id="progress_table" class="table table-dark table-striped"></table></div>');
	$('#progress_table').append('<thead class="thead-dark"><tr><th width="180">Title</th><th width="180">Description</th><th>Progress</th></tr></thead>');
	$('#progress_table').append('<tbody id="progress_table_body"><tbody>');

	var level_progress = [];
	var level_progress_list = [];
	var score_progress = scores;
	score_progress.reduce(function(res, value) {
		if (!res[value.level]) {
		    res[value.level] = { diff: value.level, rating: 0 };
		    level_progress_list.push(res[value.level])
		}
		res[value.level].rating += parseInt(value.rating);
		return res;
	}, {});
	for (let i = 0; i < level_progress_list.length; i++) {
		level_progress[level_progress_list[i].diff] = level_progress_list[i].rating;
	}

	for (let i = 0; i < expert_titles.length; i++) {
		switch(expert_titles[i].tier) {
			case 'platinum':
			    var title_style = 'style="font-weight: bolder; color: cyan;"';
			    break;
			case 'gold':
			    title_style = 'style="font-weight: bolder; color: gold;"';
			    break;
			case 'silver':
			title_style = 'style="font-weight: bolder; color: silver;"';
			break;
		    case 'bronze':
			title_style = 'style="font-weight: bolder; color: orangered;"';
			break;
		    default:
			title_style = '';
		}
		switch(expert_titles[i].type) {
			case 'rating':
				var current_level = expert_titles[i].level;
				var current_rating = level_progress[current_level] ? level_progress[current_level] : 0;
				var max_rating = parseInt(expert_titles[i].rating);
				var progress = Math.round((current_rating / max_rating) * 100);
				if(progress >= 100) {
					var bar_bg = 'bg-success';
				} else {
					bar_bg = 'bg-danger';
				}
				$('#progress_table_body').append('<tr>' +
					'<td ' + title_style + '>' + expert_titles[i].name + '</td>' +
					'<td>' + expert_titles[i].description + '</td>' +
					'<td><div class="progress" style="position: relative;">' +
						'<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' +
							'aria-valuenow="' + current_rating + '" aria-valuemin="0" aria-valuemax="' + max_rating + '" style="width: ' + progress + '%"></div>' +
						'<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + current_rating.toLocaleString() + '/' + max_rating.toLocaleString() + '</div>' +
					'</div></td></tr>');
			    break;
			case 'skill_collect':
				$('#progress_table_body').append('<tr>' +
					'<td ' + title_style + '>' + expert_titles[i].name + '</td>' +
					'<td>' + expert_titles[i].description + '</td>' +
					'<td><div class="progress" style="position: relative;">' +
						'<div id="progress_bar_' + expert_titles[i].collect_type + '" class="progress-bar bg-danger progress-bar-striped progress-bar-animated" role="progressbar"' +
							'aria-valuenow="0" aria-valuemin="0" aria-valuemax="' + expert_titles[i].count + '" style="width: 0%"></div>' +
						'<div id="progress_bar_' + expert_titles[i].collect_type + '_text" style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">0/' + expert_titles[i].count + '</div>' +
					'</div></td><tr><input type="hidden" id="skill_count_' + expert_titles[i].collect_type + '" value="0">');
				break;
			case 'skill':
				var current_song = scores.find(o => o.name === expert_titles[i].song && o.level_text === expert_titles[i].diff);
				if(current_song == undefined) {
					var current_song_score = 0;
					var score_text = 0;
				} else {
					current_song_score = current_song.score;
					score_text = current_song.score_text;
				}
				progress = Math.round(parseInt(current_song_score) / 1000000 * 100);
				if(current_song_score > 990000) {
					bar_bg = 'bg-success';

					var skill_count = parseInt($('#skill_count_skill').val()) + 1;
					$('#skill_count_skill').val(skill_count);
					$('#progress_bar_skill').css('width', skill_count/60*100 + '%');
					$('#progress_bar_skill_text').html(skill_count + '/60');
					if(skill_count == 60) {
						$('#progress_bar_skill').removeClass('bg-danger');
						$('#progress_bar_skill').addClass('bg-success');
					}


					var sub_skill_count = parseInt($('#skill_count_' + expert_titles[i].collect_type).val()) + 1;
					$('#skill_count_' + expert_titles[i].collect_type).val(sub_skill_count);
					$('#progress_bar_' + expert_titles[i].collect_type).css('width', sub_skill_count/10*100 + '%');
					$('#progress_bar_' + expert_titles[i].collect_type + '_text').html(sub_skill_count + '/10');
					if(sub_skill_count == 10) {
						$('#progress_bar_' + expert_titles[i].collect_type).removeClass('bg-danger');
						$('#progress_bar_' + expert_titles[i].collect_type).addClass('bg-success');
					}
				} else {
					bar_bg = 'bg-danger';
				}
				$('#progress_table_body').append('<tr>' +
					'<td ' + title_style + '>' + expert_titles[i].name + '</td>' +
					'<td>' + expert_titles[i].description + '</td>' +
					'<td><div class="progress" style="position: relative;">' +
						'<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' +
							'aria-valuenow="' + current_song_score + '" aria-valuemin="0" aria-valuemax="1000000" style="width: ' + progress + '%"></div>' +
						'<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + score_text + '/1,000,000</div>' +
					'</div></td>');
				break;
			case 'boss':
				current_song = scores.find(o => o.name === expert_titles[i].song && o.level_text === expert_titles[i].diff);
				if(current_song == undefined) {
					current_song_score = 0;
					score_text = 0;
					bar_bg = 'bg-danger';
				} else {
					current_song_score = current_song.score;
					score_text = current_song.score_text;
					bar_bg = 'bg-success';
				}
				progress = Math.round(parseInt(current_song_score) / 1000000 * 100);
				$('#progress_table_body').append('<tr>' +
					'<td ' + title_style + '>' + expert_titles[i].name + '</td>' +
					'<td>' + expert_titles[i].description + '</td>' +
					'<td><div class="progress" style="position: relative;">' +
						'<div class="progress-bar ' + bar_bg + ' progress-bar-striped progress-bar-animated" role="progressbar"' +
							'aria-valuenow="' + current_song_score + '" aria-valuemin="0" aria-valuemax="1000000" style="width: ' + progress + '%"></div>' +
						'<div style="position: absolute; text-align: center; line-height: 20px; overflow: hidden; color: black; right: 0; left: 0; top: 0;">' + score_text + '/1,000,000</div>' +
					'</div></td>');
				break;
			default:
			continue;
		}
	}
}

async function fetchScores(url) {
	var dom = await fetchPage(url);
	const rows = dom.querySelectorAll('.my_best_scoreList .in');
	var songs = [];
	for (var i = 0; i < rows.length; i++) {
		var song = $(dom.querySelectorAll('.my_best_scoreList .in .song_name p')[i]).html();
		var score = $(dom.querySelectorAll('.my_best_scoreList .in .num')[i]).html();
		var score_rate = $(dom.querySelectorAll('.my_best_scoreList .in .etc_con .img:not(.st1) img')[i]).attr('src');
		score_rate = score_rate.split('/grade/')[1].split('.png')[0];

		var score_plate = $(dom.querySelectorAll('.my_best_scoreList .in .etc_con .st1 img')[i]).attr('src');
		score_plate = score_plate.split('/plate/')[1].split('.png')[0];

		var level_type_data = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).attr('style').split('full/')[1].split('_bg')[0];
		switch(level_type_data) {
			case 's':
			    var level_type = 'single';
			    break;
			case 'd':
			    level_type = 'double';
			    break;
			default:
			level_type = 'coop';
		}

		var level = '';
		var levels = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[0]).find('.imG');

		switch(level_type_data) {
			case 's':
			case 'd':
				for (var j = 0; j < levels.length; j++) {
					url = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).find('.imG img').eq(j).attr('src');
					level += url.split('num_')[1].split('.png')[0];
				}
				var rating = calculateRating(level, rating_text[score_rate], 'normal');
				var level_text = level_type_data + level;
				level_text = level_text.toUpperCase();
				break;
			default:
			    url = $(dom.querySelectorAll('.my_best_scoreList .in .stepBall_in')[i]).find('.imG img').eq(1).attr('src');
				level = url.split('num_')[1].split('.png')[0];
				rating = calculateRating(null, rating_text[score_rate], 'coop');
				level_text = 'Cx' + level;
		}

		song = {
		name: song,
		level_text: level_text,
		score_text: score,
		score_rate_text: rating_text[score_rate],
		rating: rating,
		score_plate_text: plate_text[score_plate],
		level_type: level_type,
		level: level,
		score: score.replaceAll(',',''),
		score_rate: score_rate,
		score_plate: score_plate,
	}

	songs.push(song);
	}

	songs.sort(function(a, b){
	    var a1 = a.rating, b1 = b.rating;
	    if(a1 == b1) {
		var a2 = a.score, b2 = b.score;
		    if(a2 == b2) {
			return 0;
		    }
		return a2 > b2 ? -1 : 1;
	    }
	    return a1 > b1 ? -1 : 1;
	});

	return songs;
}

async function fetchPage(url) {
	const response = await fetch(url, {redirect: 'error'});
	const html = await response.text();
	const parser = new DOMParser();
	return parser.parseFromString(html, 'text/html');
}

function calculateRating(level, rate, type) {
	var rate_index = {
		'A':0.9,
		'A+':0.95,
		'AA':1,
		'AA+':1.05,
		'AAA':1.1,
		'AAA+':1.15,
		'S':1.2,
		'S+':1.26,
		'SS':1.32,
		'SS+':1.38,
		'SSS':1.44,
		'SSS+':1.5,
	};

	if(type == 'normal') {
		var level_base = {
			'10':100,
			'11':110,
			'12':130,
			'13':160,
			'14':200,
			'15':250,
			'16':310,
			'17':380,
			'18':460,
			'19':550,
			'20':650,
			'21':760,
			'22':880,
			'23':1010,
			'24':1150,
			'25':1300,
			'26':1460,
			'27':1630,
			'28':1810,
		};
		if(level < 10) return 0;
		var rating = parseInt(level_base[level]) * parseFloat(rate_index[rate]);
	} else if(type == 'coop') {
		level_base = 2000;
		rating = parseInt(level_base) * parseFloat(rate_index[rate]);
	}
	return Math.round(rating.toFixed(2));
}