code:
/datum/admins/proc/player_panel_new()//The new one
	if(!check_rights())
		return
	var/dat = "<title>Player Panel</title>"

	//javascript, the part that does most of the work~
	dat += {"

	"}

	//body tag start + onload and onkeypress (onkeyup) javascript event calls
	dat += ""

	//title + search bar
	dat += {"

					Player panel

					Hover over a line to see more information - Check antagonists - Kick everyone/AFKers in lobby

					Search: <input type='text' id='filter' value='' style='width:300px;'>

	"}

	//player table header
	dat += {"

"}

	var/list/mobs = sortmobs()
	var/i = 1
	for(var/mob/M in mobs)
		if(M.ckey)

			var/color = "#e6e6e6"
			if(i%2 == 0)
				color = "#f2f2f2"
			var/is_antagonist = is_special_character(M)

			var/M_job = ""

			if(isliving(M))

				if(iscarbon(M)) //Carbon stuff
					if(ishuman(M))
						M_job = M.job
					else if(isslime(M))
						M_job = "slime"
					else if(ismonkey(M))
						M_job = "Monkey"
					else if(isalien(M)) //aliens
						if(islarva(M))
							M_job = "Alien larva"
						else
							M_job = "Alien"
					else
						M_job = "Carbon-based"

				else if(issilicon(M)) //silicon
					if(isAI(M))
						M_job = "AI"
					else if(ispAI(M))
						M_job = "pAI"
					else if(isrobot(M))
						M_job = "Cyborg"
					else if(ismommi(M))
						M_job = "MoMMI"
					else
						M_job = "Silicon-based"

				else if(isanimal(M)) //simple animals
					if(iscorgi(M))
						M_job = "Corgi"
					else
						M_job = "Animal"

				else
					M_job = "Living"

			else if(istype(M,/mob/new_player))
				M_job = "New player"

			else if(isobserver(M))
				M_job = "Ghost"

			var/M_name = html_encode(M.name)
			var/M_rname = html_encode(M.real_name)
			var/M_key = html_encode(M.key)

			//output for each mob
			dat += {"

						[M_name] - [M_rname] - [M_key] ([M_job])

			"}

			i++

	//player table ending
	dat += {"

	"}

	usr << browse(dat, "window=players;size=600x480")

//The old one
/datum/admins/proc/player_panel_old()
	if(!check_rights())
		return
	var/dat = "<title>Player Menu</title>"
	dat += "

Name	Real Name	Assigned Job	Key	Options	PM	Traitor?
"
	//add IP:	 to this if wanting to add back in IP checking
	//add (IP: [M.lastKnownIP])	 if you want to know their ip to the lists below
	var/list/mobs = sortmobs()

	for(var/mob/M in mobs)
		if(!M.ckey)	continue

		dat += "
[M.name]	"
		if(isAI(M))
			dat += "AI	"
		else if(isrobot(M))
			dat += "Cyborg	"
		else if(ishuman(M))
			dat += "[M.real_name]	"
		else if(istype(M, /mob/living/silicon/pai))
			dat += "pAI	"
		else if(istype(M, /mob/new_player))
			dat += "New Player	"
		else if(isobserver(M))
			dat += "Ghost	"
		else if(ismonkey(M))
			dat += "Monkey	"
		else if(isalien(M))
			dat += "Alien	"
		else
			dat += "Unknown	"

		if(istype(M,/mob/living/carbon/human))
			var/mob/living/carbon/human/H = M
			if(H.mind && H.mind.assigned_role)
				dat += "[H.mind.assigned_role]	"
		else
			dat += "NA	"

		dat += {"[(M.client ? "[M.client]" : "No client")]
		X
		PM
		"}
		switch(is_special_character(M))
			if(0)
				dat += {"Traitor?	"}
			if(1)
				dat += {"Traitor?	"}
			if(2)
				dat += {"Traitor?	"}

	dat += "
"

	usr << browse(dat, "window=players;size=640x480")

/datum/admins/proc/check_antagonists()
	if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
		var/dat = "<title>Round Status</title>
Round Status
"
		dat += "Current Game Mode: [ticker.mode.name]
"
		if(ticker.mode.replacementmode)
			dat += "Replacement Game Mode: [ticker.mode.replacementmode.name]
"
		dat += "Round Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]
"
		dat += "Emergency shuttle
"
		if(SSshuttle.emergency.mode < SHUTTLE_CALL)
			dat += "Call Shuttle
"
		else
			var/timeleft = SSshuttle.emergency.timeLeft()
			if(SSshuttle.emergency.mode < SHUTTLE_DOCKED)
				dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
				dat += "Send Back
"
			else
				dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
		dat += "End Round Now
"
		dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
		if(ticker.mode.syndicates.len)
			dat += "

Syndicates
"
			for(var/datum/mind/N in ticker.mode.syndicates)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
				else
					dat += "
Nuclear Operative not found!
"
			dat += "

Nuclear Disk(s)
"
			for(var/obj/item/weapon/disk/nuclear/N in world)
				dat += "
[N.name], "
				var/atom/disk_loc = N.loc
				while(!istype(disk_loc, /turf))
					if(istype(disk_loc, /mob))
						var/mob/M = disk_loc
						dat += "carried by [M.real_name] "
					if(istype(disk_loc, /obj))
						var/obj/O = disk_loc
						dat += "in \a [O.name] "
					disk_loc = disk_loc.loc
				dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])
"
			dat += "
"

		if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len)
			dat += "

Revolutionaries
"
			for(var/datum/mind/N in ticker.mode.head_revolutionaries)
				var/mob/M = N.current
				if(!M)
					dat += "
Head Revolutionary not found!
"
				else
					dat += "
[M.real_name] (Leader)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			for(var/datum/mind/N in ticker.mode.revolutionaries)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "

Target(s)		Location
"
			for(var/datum/mind/N in ticker.mode.get_living_heads())
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
					var/turf/mob_loc = get_turf(M)
					dat += "[mob_loc.loc]
"
				else
					dat += "
Head not found!
"
			dat += "
"

		if(ticker.mode.A_bosses.len || ticker.mode.A_gangsters.len)
			dat += "

[gang_name("A")] Gang Members
"
			for(var/datum/mind/N in ticker.mode.A_bosses)
				var/mob/M = N.current
				if(!M)
					dat += "
Gang Boss not found!
"
				else
					dat += "
[M.real_name] (Boss)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			for(var/datum/mind/N in ticker.mode.A_gangsters)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "
"

		if(ticker.mode.shadows.len)
			dat += "

Shadowlings
"
			for(var/datum/mind/N in ticker.mode.shadows)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "
"

		if(ticker.mode.thralls.len)
			dat += "

Shadowling Thralls
"
			for(var/datum/mind/N in ticker.mode.thralls)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "
"

		if(ticker.mode.B_bosses.len || ticker.mode.B_gangsters.len)
			dat += "

[gang_name("B")] Gang Members
"
			for(var/datum/mind/N in ticker.mode.B_bosses)
				var/mob/M = N.current
				if(!M)
					dat += "
Gang Boss not found!
"
				else
					dat += "
[M.real_name] (Boss)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			for(var/datum/mind/N in ticker.mode.B_gangsters)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "
"

		if(ticker.mode.abductors.len)
			dat += "

Abductors
"
			for(var/datum/mind/abductor in ticker.mode.abductors)
				var/mob/M = abductor.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
					dat += "Show Objective
"
				else
					dat += "
Abductor not found!
"
			dat += "
"

		if(ticker.mode.changelings.len > 0)
			dat += "

Changelings
"
			for(var/datum/mind/changeling in ticker.mode.changelings)
				var/mob/M = changeling.current
				if(M)
					dat += "
[M.mind.changeling.changelingID] as [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
					dat += "Show Objective
"
				else
					dat += "
Changeling not found!
"
			dat += "
"

		if(ticker.mode.wizards.len > 0)
			dat += "

Wizards
"
			for(var/datum/mind/wizard in ticker.mode.wizards)
				var/mob/M = wizard.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
					dat += "Show Objective
"
				else
					dat += "
Wizard not found!
"
			dat += "
"

		if(ticker.mode.cult.len)
			dat += "

Cultists
"
			for(var/datum/mind/N in ticker.mode.cult)
				var/mob/M = N.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM
"
			dat += "
"

		if(ticker.mode.traitors.len > 0)
			dat += "

Traitors
"
			for(var/datum/mind/traitor in ticker.mode.traitors)
				var/mob/M = traitor.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
					dat += "Show Objective
"
				else
					dat += "
Traitor not found!
"
			dat += "
"

		if(istype(ticker.mode, /datum/game_mode/blob))
			var/datum/game_mode/blob/mode = ticker.mode
			dat += "

Blob
"
			dat += "
Progress: [blobs.len]/[mode.blobwincount]
"

			for(var/datum/mind/blob in mode.infected_crew)
				var/mob/M = blob.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
				else
					dat += "
Blob not found!
"
			dat += "
"

		if(istype(ticker.mode, /datum/game_mode/monkey))
			var/datum/game_mode/monkey/mode = ticker.mode
			dat += "

Monkey
"

			for(var/datum/mind/eek in mode.ape_infectees)
				var/mob/M = eek.current
				if(M)
					dat += "
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]	"
					dat += "PM	"
				else
					dat += "
Monkey not found!
"
			dat += "
"

		dat += ""
		usr << browse(dat, "window=roundstatus;size=400x500")
	else
		alert("The game hasn't started yet!")