Source: session/top_panel/CivIcon.js

/**
 * This displays the emblem of the civilization of the currently viewed player in the top panel.
 * If clicked, it opens the Structure Tree or Civilization Overview dialog, for the last viewed civilization.
 */
class CivIcon
{
	constructor(playerViewControl)
	{
		this.dialogSelection = {
			"civ": "",
			"page": "page_structree.xml"
		};

		this.civIcon = Engine.GetGUIObjectByName("civIcon");
		this.civIconOverlay = Engine.GetGUIObjectByName("civIconOverlay");
		this.civIconOverlay.onPress = this.onPress.bind(this);

		playerViewControl.registerViewedPlayerChangeHandler(this.rebuild.bind(this));
		registerHotkeyChangeHandler(this.rebuild.bind(this));

		Engine.SetGlobalHotkey("structree", "Press", this.openPage.bind(this, "page_structree.xml"));
		Engine.SetGlobalHotkey("civinfo", "Press", this.openPage.bind(this, "page_civinfo.xml"));
	}

	onPress()
	{
		this.openPage(this.dialogSelection.page);
	}

	openPage(page)
	{
		closeOpenDialogs();
		g_PauseControl.implicitPause();

		Engine.PushGuiPage(
			page,
			{
				// If an Observer triggers `openPage()` via hotkey, g_ViewedPlayer could be -1 or 0
				// (depending on whether they're "viewing" no-one or gaia respectively)
				"civ": this.dialogSelection.civ || g_Players[Math.max(g_ViewedPlayer, 1)].civ,

				// TODO add info about researched techs and unlocked entities
			},
			this.storePageSelection.bind(this));
	}

	storePageSelection(data)
	{
		if (data.nextPage)
			Engine.PushGuiPage(
				data.nextPage,
				{ "civ": data.civ },
				this.storePageSelection.bind(this));
		else
		{
			this.dialogSelection = data;
			resumeGame();
		}
	}

	rebuild()
	{
		let hidden = g_ViewedPlayer <= 0;
		this.civIcon.hidden = hidden;
		if (hidden)
			return;

		let civData = g_CivData[g_Players[g_ViewedPlayer].civ];

		this.civIcon.sprite = "stretched:" + civData.Emblem;
		this.civIconOverlay.tooltip = sprintf(translate(this.Tooltip), {
			"civ": setStringTags(civData.Name, this.CivTags),
			"hotkey_civinfo": colorizeHotkey("%(hotkey)s", "civinfo"),
			"hotkey_structree": colorizeHotkey("%(hotkey)s", "structree")
		});
	}
}

CivIcon.prototype.Tooltip =
	markForTranslation("%(civ)s\n%(hotkey_civinfo)s / %(hotkey_structree)s: View Civilization Overview / Structure Tree\nLast opened will be reopened on click.");

CivIcon.prototype.CivTags = { "font": "sans-bold-stroke-14" };