PIU Phoenix

PIU Phoenix Score&Title Analyser Patch 1.0.2

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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));
}