Source: session/trade/TradeDialog.js

/**
 * This class manages the trading good selection, idle trader information and barter panel.
 */
class TradeDialog
{
	constructor(playerViewControl)
	{
		this.tradePanel = new this.TradePanel();
		this.barterPanel = new this.BarterPanel();

		this.tradeDialogPanel = Engine.GetGUIObjectByName("tradeDialogPanel");

		registerPlayersInitHandler(this.onPlayersInit.bind(this));
		Engine.GetGUIObjectByName("closeTrade").onPress = this.close.bind(this);

		registerSimulationUpdateHandler(this.updateIfOpen.bind(this))
		registerEntitySelectionChangeHandler(this.updateIfOpen.bind(this));
		playerViewControl.registerViewedPlayerChangeHandler(this.onViewedPlayerChange.bind(this));
	}

	open()
	{
		closeOpenDialogs();

		if (g_ViewedPlayer < 1)
			return;

		this.updatePanels();
		this.tradeDialogPanel.hidden = false;
	}

	close()
	{
		this.tradeDialogPanel.hidden = true;
	}

	isOpen()
	{
		return !this.tradeDialogPanel.hidden;
	}

	onViewedPlayerChange()
	{
		if (g_ViewedPlayer >= 1)
			this.updateIfOpen();
		else
			this.close();
	}

	toggle()
	{
		let open = this.isOpen();
		closeOpenDialogs();

		if (!open)
			this.open();
	}

	updateIfOpen()
	{
		if (this.isOpen())
			this.updatePanels();
	}

	updatePanels()
	{
		this.barterPanel.update();
		this.tradePanel.update();
	}

	onPlayersInit()
	{
		let size = this.tradeDialogPanel.size;

		let width = 1/2 * Math.max(
			TradeDialog.prototype.BarterPanel.getWidthOffset(),
			TradeDialog.prototype.TradePanel.getWidthOffset());

		size.left -= width;
		size.right += width;
		this.tradeDialogPanel.size = size;
	}
}