class RespawnDialogue extends UIScriptedMenu
{
	const int 					ID_RESPAWN_CUSTOM = 101;
	const int 					ID_RESPAWN_RANDOM = 102;
	
	//tooltips
	protected Widget			m_DetailsRoot;
	protected TextWidget		m_DetailsLabel;
	protected RichTextWidget	m_DetailsText;
	
	protected Widget 			m_CustomRespawn;
	
	//helper
	protected Widget 			m_CurrentlyHighlighted;
	
	void RespawnDialogue();
	void ~RespawnDialogue();
	
	override Widget Init()
	{
		layoutRoot 					= GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_respawn_dialogue.layout");
		m_DetailsRoot 				= layoutRoot.FindAnyWidget("menu_details_tooltip");
		m_DetailsLabel				= TextWidget.Cast(m_DetailsRoot.FindAnyWidget("menu_details_label"));
		m_DetailsText				= RichTextWidget.Cast(m_DetailsRoot.FindAnyWidget("menu_details_tooltip_content"));
		
		m_CustomRespawn 			= layoutRoot.FindAnyWidget("respawn_button_custom");
		SetFocus(m_CustomRespawn);

		return layoutRoot;
	}
	
	override void Update(float timeslice)
	{
		super.Update(timeslice);
		
		Man player = GetGame().GetPlayer();
		bool playerAlive = player && player.GetPlayerState() == EPlayerStates.ALIVE;
		if (playerAlive && !player.IsUnconscious())
		{
			Close();
			return;
		}
		
		if (GetUApi().GetInputByID(UAUIBack).LocalPress() || GetUApi().GetInputByID(UAUIMenu).LocalPress())
			Close();
	}

	override bool OnClick(Widget w, int x, int y, int button)
	{
		super.OnClick(w, x, y, button);
		
		switch (w.GetUserID())
		{
			case IDC_CANCEL:
				Close();
				return true;

			case ID_RESPAWN_CUSTOM:
				return RequestRespawn(false);

			case ID_RESPAWN_RANDOM:
				return RequestRespawn(true);
		}

		return false;
	}
	
	override bool OnMouseEnter(Widget w, int x, int y)
	{
		string tooltip_header = "";
		string tooltip_text = "";
		ColorHighlight(w);
		switch (w.GetUserID())
		{
			case ID_RESPAWN_RANDOM:
				tooltip_header = "#main_menu_respawn_random";
				tooltip_text = "#main_menu_respawn_random_tooltip";
				break;
			
			case ID_RESPAWN_CUSTOM:
				tooltip_header = "#main_menu_respawn_custom";
				tooltip_text = "#main_menu_respawn_custom_tooltip";
				break;
		}

		SetTooltipTexts(w, tooltip_header, tooltip_text);
		return true;
	}
	
	override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
	{
		ColorNormal(w);
		return true;
	}
	
	override void OnShow()
	{
		super.OnShow();
		
		SetFocus(m_CustomRespawn);
	}
	
	override bool OnFocus(Widget w, int x, int y)
	{
		string tooltip_header = "";
		string tooltip_text = "";
		if (IsFocusable(w))
		{
			ColorHighlight(w);
			switch (w.GetUserID())
			{
				case ID_RESPAWN_RANDOM:
					tooltip_header = "#main_menu_respawn_random";
					tooltip_text = "#main_menu_respawn_random_tooltip";
					break;
				
				case ID_RESPAWN_CUSTOM:
					tooltip_header = "#main_menu_respawn_custom";
					tooltip_text = "#main_menu_respawn_custom_tooltip";
					break;
			}

			SetTooltipTexts(w, tooltip_header, tooltip_text);
			return true;
		}

		SetTooltipTexts(w, tooltip_header, tooltip_text);
		return false;
	}
	
	override bool OnFocusLost(Widget w, int x, int y)
	{
		if (IsFocusable(w))
		{
			ColorNormal(w);
			return true;
		}

		return false;
	}
	
	bool IsFocusable(Widget w)
	{
		if (w)
		{
			if (w.GetUserID() == IDC_CANCEL || w.GetUserID() == ID_RESPAWN_CUSTOM || w.GetUserID() == ID_RESPAWN_RANDOM)
				return true;
		}

		return false;
	}
	
	protected void ColorHighlight(Widget w)
	{
		if (!w)
			return;

		if (m_CurrentlyHighlighted != w)
		{
			if (m_CurrentlyHighlighted)
				ColorNormal(m_CurrentlyHighlighted);

			m_CurrentlyHighlighted = w;
		}

		ButtonSetColor(w, ARGB(255, 0, 0, 0));
		ButtonSetTextColor(w, ARGB(255, 255, 0, 0));
	}
	
	protected void ColorNormal(Widget w)
	{
		if (!w)
			return;
		
		ButtonSetColor(w, ARGB(0, 0, 0, 0));
		ButtonSetTextColor(w, ARGB(255, 255, 255, 255));
	}
	
	protected void ButtonSetColor(Widget w, int color)
	{
		Widget panel = w.FindWidget(w.GetName() + "_panel");
		if (panel)
			panel.SetColor(color);
	}
	
	protected void ButtonSetTextColor(Widget w, int color)
	{
		TextWidget label = TextWidget.Cast(w.FindAnyWidget(w.GetName() + "_label"));
		if (label)
			label.SetColor(color);
	}
	
	void SetTooltipTexts(Widget w, string header = "", string desc = "")
	{
		bool show = header != "" && desc != "";
		m_DetailsRoot.Show(show);
		m_DetailsLabel.SetText(header);
		m_DetailsText.SetText(desc);
		
		m_DetailsText.Update();
		m_DetailsLabel.Update();
		m_DetailsRoot.Update();
	}
	
	bool RequestRespawn(bool random)
	{
		IngameHud.Cast(GetGame().GetMission().GetHud()).InitBadgesAndNotifiers();
		Man player = GetGame().GetPlayer();
		if (player && (player.GetPlayerState() == EPlayerStates.ALIVE && !player.IsUnconscious()))
			return false;
		
		#ifdef PLATFORM_CONSOLE
		InGameMenuXbox menu_ingame = InGameMenuXbox.Cast(GetGame().GetUIManager().FindMenu(MENU_INGAME));
		#else
		InGameMenu menu_ingame = InGameMenu.Cast(GetGame().GetUIManager().FindMenu(MENU_INGAME));
		#endif
		
		if (!menu_ingame)
			return false;
		
		menu_ingame.MenuRequestRespawn(this, random);
		return true;
	}
}
