//==============================================================================
//  Created on: 12/11/2003
//  Instant Action version of maplist tab
//  This version displays single maplist with preview images
//
//  Written by Ron Prestenback
//  © 2003, Epic Games, Inc. All Rights Reserved
//==============================================================================

class UT2K4Tab_MainSP extends UT2K4Tab_MainBase;

// Preview controls
var automated GUISectionBackground sb_Selection, sb_Preview, sb_Options;
// if _RO_
var automated GUISectionBackground asb_Scroll;
// else
//var automated AltSectionBackground asb_Scroll;
// end if _RO_

var automated GUIScrollTextBox  lb_MapDesc;
var automated GUITreeListBox    lb_Maps;
var() editconst noexport GUITreeList       li_Maps;
var automated moButton	        b_Maplist;
var automated moButton          b_Tutorial;
var automated GUIImage          i_MapPreview, i_DescBack;
var automated GUILabel          l_MapAuthor, l_MapPlayers, l_NoPreview;

var() localized string MapCaption, BonusVehicles, BonusVehiclesMsg;

var config string LastSelectedMap; // Used to keep track of the map which was selected the last time we were in the menus

function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
	local int i;
	local array<CacheManager.MapRecord> TutMaps;

    Super.InitComponent(MyController, MyOwner);

	if ( lb_Maps != None )
		li_Maps = lb_Maps.List;

	if ( li_Maps != None )
	{
	    li_Maps.OnDblClick = MapListDblClick;
	    li_Maps.bSorted = True;
	    lb_Maps.NotifyContextSelect = HandleContextSelect;
	}

    class'CacheManager'.static.GetMaplist(TutMaps, "TUT");

    TutorialMaps.Length = TutMaps.Length;
    for ( i = 0; i < TutMaps.Length; i++ )
    	TutorialMaps[i] = TutMaps[i].MapName;

	lb_Maps.bBoundToParent=false;
	lb_Maps.bScaleToParent=false;

	sb_Selection.ManageComponent(lb_Maps);

	asb_Scroll.ManageComponent(lb_MapDesc);

	if (CurrentGameType.GameTypeGroup==3)
	{
		ch_OfficialMapsOnly.Checked(false);
		ch_OfficialMapsOnly.DisableMe();
	}
	else
		ch_OfficialMapsOnly.EnableMe();

    sb_Options.ManageComponent(ch_OfficialMapsOnly);
    sb_Options.ManageComponent(b_Maplist);
    sb_Options.ManageComponent(b_Tutorial);

    InitMapHandler();
}


// Called when a new gametype is selected
function InitGameType()
{
    local int i;
    local array<CacheManager.GameRecord> Games;
    local bool bReloadMaps;

	// Get a list of all gametypes.
    class'CacheManager'.static.GetGameTypeList(Games);
	for (i = 0; i < Games.Length; i++)
    {
        if (Games[i].ClassName ~= Controller.LastGameType)
        {
        	bReloadMaps = CurrentGameType.MapPrefix != Games[i].MapPrefix;
            CurrentGameType = Games[i];
            break;
        }
    }

    if ( i == Games.Length )
    	return;

	// Update the gametype label's text
    SetGameTypeCaption();

    // Should the tutorial button be enabled?
    CheckGameTutorial();

    // Load Maps for the new gametype, but only if it uses a different maplist
    if (bReloadMaps)
   		InitMaps();

    // Set the selected map
    i = li_Maps.FindIndexByValue(LastSelectedMap);
    if ( i == -1 )
    	i = 0;
    li_Maps.SetIndex(i);
    li_Maps.Expand(i);

	// Load the information (screenshot, desc., etc.) for the currently selected map
//    ReadMapInfo(li_Maps.GetParentCaption());
}

function bool OrigONSMap(string MapName)
{
	if (
		 MapName ~= "ONS-ArcticStronghold" ||
		 MapName ~= "ONS-Crossfire" ||
		 MapName ~= "ONS-Dawn" ||
		 MapName ~= "ONS-Dria" ||
		 MapName ~= "ONS-FrostBite" ||
		 MapName ~= "ONS-Primeval" ||
		 MapName ~= "ONS-RedPlanet" ||
		 MapName ~= "ONS-Severance" ||
		 MapName ~= "ONS-Torlan"
		)
		return true;

	return false;
}


// Query the CacheManager for the maps that correspond to this gametype, then fill the main list
function InitMaps( optional string MapPrefix )
{
    local int i, j, k, BV;
    local bool bTemp;
    local string Package, Item, CurrentItem, Desc;
    local GUITreeNode StoredItem;
    local DecoText DT;
    local array<string> CustomLinkSetups;

	// Make sure we have a map prefix
	if ( MapPrefix == "" )
		MapPrefix = GetMapPrefix();

	// Temporarily disable notification in all components
    bTemp = Controller.bCurMenuInitialized;
    Controller.bCurMenuInitialized = False;

	if ( li_Maps.IsValid() )
		li_Maps.GetElementAtIndex(li_Maps.Index, StoredItem);

	// Get the list of maps for the current gametype
	class'CacheManager'.static.GetMapList( CacheMaps, MapPrefix );
	if ( MapHandler.GetAvailableMaps(MapHandler.GetGameIndex(CurrentGameType.ClassName), Maps) )
	{
		li_Maps.bNotify = False;
		li_Maps.Clear();

		for ( i = 0; i < Maps.Length; i++ )
		{

			DT = None;
			if ( class'CacheManager'.static.IsDefaultContent(Maps[i].MapName) )
			{
				if ( bOnlyShowCustom )
					continue;
			}
			else if ( bOnlyShowOfficial )
				continue;

			j = FindCacheRecordIndex(Maps[i].MapName);
			if ( class'CacheManager'.static.Is2003Content(Maps[i].MapName) )
			{
				if ( CacheMaps[j].TextName != "" )
				{
					if ( !Divide(CacheMaps[j].TextName, ".", Package, Item) )
				{
						Package = "XMaps";
						Item = CacheMaps[j].TextName;
					}
				}

				DT = class'xUtil'.static.LoadDecoText(Package, Item);
			}

			if ( DT != None )
				Desc = JoinArray(DT.Rows, "|");
			else
				Desc =CacheMaps[j].Description;

			li_Maps.AddItem( Maps[i].MapName, Maps[i].MapName, ,,Desc);

			// for now, limit this to power link setups only
			if ( CurrentGameType.MapPrefix ~= "ONS" )
			{

				// Big Hack Time for the bonus pack

				CurrentItem = Maps[i].MapName;
				for (BV=0;BV<2;BV++)
				{
					if ( Maps[i].Options.Length > 0 )
					{
						Package = CacheMaps[j].Description;

						// Add the "auto link setup" item
						li_Maps.AddItem( AutoSelectText @ LinkText, Maps[i].MapName $ "?LinkSetup=Random", CurrentItem,,Package );

						// Now add all official link setups
						for ( k = 0; k < Maps[i].Options.Length; k++ )
						{
							li_Maps.AddItem(Maps[i].Options[k].Value @ LinkText, Maps[i].MapName $ "?LinkSetup=" $ Maps[i].Options[k].Value, CurrentItem,,Package );
						}
					}

					// Now to add the custom setups
					CustomLinkSetups = GetPerObjectNames(Maps[i].MapName, "ONSPowerLinkCustomSetup");
					for ( k = 0; k < CustomLinkSetups.Length; k++ )
					{
						li_Maps.AddItem(CustomLinkSetups[k] @ LinkText, Maps[i].MapName $ "?" $ "LinkSetup=" $ CustomLinkSetups[k], CurrentItem,,Package);
					}

					if ( !OrigONSMap(Maps[i].MapName) )
						break;

					else if (BV<1 && Controller.bECEEdition)
                    {
						li_Maps.AddItem( Maps[i].MapName$BonusVehicles, Maps[i].MapName, ,,BonusVehiclesMsg$Package);
						CurrentItem=CurrentItem$BonusVehicles;
					}

					if ( !Controller.bECEEdition )	// Don't do the second loop if not the ECE
						break;

				}

			}
		}
	}

	if ( li_Maps.bSorted )
		li_Maps.SortList();

	if ( StoredItem.Caption != "" )
	{
		i = li_Maps.FindFullIndex(StoredItem.Caption, StoredItem.Value, StoredItem.ParentCaption);
		if ( i != -1 )
			li_Maps.SilentSetIndex(i);
	}

	li_Maps.bNotify = True;

    Controller.bCurMenuInitialized = bTemp;
}

// =====================================================================================================================
// =====================================================================================================================
//  Utility functions - handles all special stuff that should happen whenever events are received on the page
// =====================================================================================================================
// =====================================================================================================================

// Update all components on the preview side with the data from the currently selected map
function ReadMapInfo(string MapName)
{
    local string mDesc;
    local int Index;

    if(MapName == "")
        return;

    if (!Controller.bCurMenuInitialized)
        return;

    Index = FindCacheRecordIndex(MapName);

    if (CacheMaps[Index].FriendlyName != "")
        asb_Scroll.Caption = CacheMaps[Index].FriendlyName;
    else
		asb_Scroll.Caption = MapName;

	UpdateScreenshot(Index);

	// Only show 1 number if min & max are the same
	if ( CacheMaps[Index].PlayerCountMin == CacheMaps[Index].PlayerCountMax )
		l_MapPlayers.Caption = CacheMaps[Index].PlayerCountMin @ PlayerText;
	else l_MapPlayers.Caption = CacheMaps[Index].PlayerCountMin@"-"@CacheMaps[Index].PlayerCountMax@PlayerText;

	mDesc = li_Maps.GetExtra();

    if (mDesc == "")
        mDesc = MessageNoInfo;

	lb_MapDesc.SetContent( mDesc );
    if (CacheMaps[Index].Author != "" && !class'CacheManager'.static.IsDefaultContent(CacheMaps[Index].MapName))
        l_MapAuthor.Caption = AuthorText$":"@CacheMaps[Index].Author;
    else l_MapAuthor.Caption = "";
}

// If this gametype has a tutorial, enable the tutorial button
function CheckGameTutorial()
{
	local int i;

	for ( i = 0; i < TutorialMaps.Length; i++ )
	{
		if ( Mid(TutorialMaps[i], InStr(TutorialMaps[i], "-") + 1) ~= CurrentGameType.GameAcronym )
		{
			EnableComponent(b_Tutorial);
			b_Tutorial.SetComponentValue(TutorialMaps[i],True);
			return;
		}
	}

	DisableComponent(b_Tutorial);
	b_Tutorial.SetComponentValue("",True);
}

function UpdateScreenshot(int Index)
{
	local Material Screenie;

	if ( Index >= 0 && Index < CacheMaps.Length )
	    Screenie = Material(DynamicLoadObject(CacheMaps[Index].ScreenshotRef, class'Material'));

    i_MapPreview.Image = Screenie;
    l_NoPreview.SetVisibility( Screenie == None );
    i_MapPreview.SetVisibility( Screenie != None );
}

event SetVisibility( bool bIsVisible )
{
	Super.SetVisibility(bIsVisible);

	if ( bIsVisible )
	{
	    l_NoPreview.SetVisibility( i_MapPreview.Image == None );
	    i_MapPreview.SetVisibility( i_MapPreview.Image != None );
	}
}

function SetGameTypeCaption()
{
    sb_Selection. Caption = CurrentGameType.GameName@MapCaption;
}

function string Play()
{
	return GetMapURL(li_Maps,-1);
}

function string GetMapURL( GUITreeList List, int Index )
{

	local string URL;

	URL = Super.GetMapURL(List,Index);
	if ( CurrentGameType.MapPrefix ~= "ONS" && InStr(Caps(URL),"?LINKSETUP=") == -1 )
		URL $= "?LinkSetup=Default";

	if ( (InStr(List.GetCaption(),BonusVehicles)>=0) || (InStr(List.GetParentCaption(),BonusVehicles)>=0) )
		URL $= "?BonusVehicles=true";
	else
		URL $= "?BonusVehicles=false";

	return URL;
}

// =====================================================================================================================
// =====================================================================================================================
//  OnClick's
// =====================================================================================================================
// =====================================================================================================================

function MaplistConfigClick( GUIComponent Sender )
{
	local MaplistEditor MaplistPage;

	// open maplist config page
	if ( Controller.OpenMenu(MaplistEditorMenu) )
	{
		MaplistPage = MaplistEditor(Controller.ActivePage);
		if ( MaplistPage != None )
		{
			MaplistPage.MainPanel = self;
			MaplistPage.bOnlyShowOfficial = bOnlyShowOfficial;
			MaplistPage.bOnlyShowCustom = bOnlyShowCustom;
			MaplistPage.Initialize(MapHandler);
		}
	}
}

// Called when a double click is received in the main maplist
function bool MapListDblClick(GUIComponent Sender)
{
	if ( li_Maps.ValidSelection() )
		return p_Anchor.InternalOnClick(p_Anchor.b_Primary);
	else
	{
		if ( CurrentGameType.MapPrefix ~= "ONS" )
		{
			if ( !li_Maps.IsToggleClick(li_Maps.Index) )
				return p_Anchor.InternalOnClick(p_Anchor.b_Primary);
		}
		else return li_Maps.InternalDblClick(Sender);
	}

    return true;
}

// Called when the "Watch Tutorial" button is clicked
function TutorialClicked( GUIComponent Sender )
{
	if ( Sender == b_Tutorial )
	{
		Play();
		PlayerOwner().ConsoleCommand("START"@b_Tutorial.GetComponentValue()$"?quickstart=true?TeamScreen=false");
		Controller.CloseAll(False,true);
	}
}

// =====================================================================================================================
// =====================================================================================================================
//  OnChange's
// =====================================================================================================================
// =====================================================================================================================

// Called when user clicks on a new map in the main maplist
function MapListChange(GUIComponent Sender)
{
	local MaplistRecord.MapItem Item;

    if (!Controller.bCurMenuInitialized)
        return;

	if ( Sender == lb_Maps )
	{
		if ( li_Maps.IsValid() )
		{
			EnableComponent(b_Primary);
			EnableComponent(b_Secondary);
		}

		class'MaplistRecord'.static.CreateMapItem(li_Maps.GetValue(), Item);

		LastSelectedMap = Item.FullURL;
		SaveConfig();
		ReadMapInfo(Item.MapName);
	}
}

// =====================================================================================================================
// =====================================================================================================================
//  Misc. Events
// =====================================================================================================================
// =====================================================================================================================

function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender)
{
	if ( moButton(Sender) != None && GUILabel(NewComp) != None )
	{
//		GUILabel(NewComp).TextColor = WhiteColor[3];
		moButton(Sender).InternalOnCreateComponent(NewComp, Sender);
	}
}

function bool HandleContextSelect(GUIContextMenu Sender, int Index)
{
	local string MapName;

	if ( Sender != None )
	{
		switch ( Index )
		{
		case 0:
		case 1:
			MapName = GetMapURL(li_Maps,-1);
			if (MapName != "")
			{
				p_Anchor.PrepareToPlay(MapName, MapName);
				p_Anchor.StartGame(MapName, Index == 1);
			}

			break;

		case 3:
			bOnlyShowOfficial = !bOnlyShowOfficial;
			InitMaps();
			ch_OfficialMapsOnly.SetComponentValue(bOnlyShowOfficial, True);
			break;
		}
	}

	return true;
}

function int FindCacheRecordIndex(string MapName)
{
    local int i;

    for (i = 0; i < CacheMaps.Length; i++)
        if (CacheMaps[i].MapName == MapName)
            return i;

    return -1;
}

defaultproperties
{
    Begin Object class=GUISectionBackground Name=SelectionGroup
		WinWidth=0.482149
		WinHeight=0.603330
		WinLeft=0.016993
		WinTop=0.018125
		Caption="Map Selection"
		bFillClient=true
    End Object
    sb_Selection=SelectionGroup

    Begin Object Class=GUITreeListBox Name=AvailableMaps
		WinWidth=0.422481
		WinHeight=0.449870
		WinLeft=0.045671
		WinTop=0.169272
        bVisibleWhenEmpty=true
        Hint="Click a mapname to see a preview and description.  Double-click to play a match on the map."
        StyleName="NoBackground"
        TabOrder=0
        OnChange=MapListChange
        bBoundToParent=false
        bScaleToParent=false
    End Object
    lb_Maps=AvailableMaps

    Begin Object class=GUISectionBackground Name=PreviewGroup
		WinWidth=0.470899
		WinHeight=0.974305
		WinLeft=0.515743
		WinTop=0.018125
		Caption="Preview"
		bFillClient=true
    End Object
    sb_Preview=PreviewGroup

    Begin Object Class=GUILabel Name=NoPreview
		WinWidth=0.372002
		WinHeight=0.357480
		WinLeft=0.562668
		WinTop=0.107691
        TextFont="UT2HeaderFont"
        TextAlign=TXTA_Center
        VertAlign=TXTA_Center
        bMultiline=True
        bTransparent=False
        TextColor=(R=247,G=255,B=0,A=255)
        Caption="No Preview Available"
    End Object
    l_NoPreview=NoPreview

    Begin Object Class=GUIImage Name=MapPreviewImage
		WinWidth=0.372002
		WinHeight=0.357480
		WinLeft=0.562668
		WinTop=0.107691
        ImageColor=(R=255,G=255,B=255,A=255)
        ImageStyle=ISTY_Scaled
        ImageRenderStyle=MSTY_Normal
        RenderWeight=0.2
    End Object
    i_MapPreview=MapPreviewImage

    Begin Object class=GUILabel Name=MapAuthorLabel
        Caption="Testing"
        TextAlign=TXTA_Center
        StyleName="TextLabel"
		WinWidth=0.453285
		WinHeight=0.032552
		WinLeft=0.522265
		WinTop=0.405278
        RenderWeight=0.3
    End Object
    l_MapAuthor=MapAuthorLabel

    Begin Object class=GUILabel Name=RecommendedPlayers
        Caption="Best for 4 to 8 players"
        TextAlign=TXTA_Center
        StyleName="TextLabel"
		WinWidth=0.445313
		WinHeight=0.032552
		WinLeft=0.521288
		WinTop=0.474166
       RenderWeight=0.3
    End Object
    l_MapPlayers=RecommendedPlayers

	Begin Object class=AltSectionBackground name=ScrollSection
		WinWidth=0.409888
		WinHeight=0.437814
		WinLeft=0.546118
		WinTop=0.525219
		Caption="Map Desc"
		bFillClient=true
	End Object
	asb_Scroll=ScrollSection

    Begin Object Class=GUIScrollTextBox Name=MapDescription
		WinWidth=0.379993
		WinHeight=0.268410
		WinLeft=0.561065
		WinTop=0.628421
        CharDelay=0.0025
        EOLDelay=0.5
        bNeverFocus=true
        StyleName="NoBackground"
        bTabStop=False
    End Object
    lb_MapDesc=MapDescription

	Begin Object Class=GUISectionBackground Name=OptionsGroup
		WinWidth=0.482149
		WinHeight=0.351772
		WinLeft=0.018008
		WinTop=0.642580
		Caption="Options"
		BottomPadding=0.07
	End Object
	sb_Options=OptionsGroup

    Begin Object Class=moCheckbox Name=FilterCheck
    	OnChange=ChangeMapFilter
		WinWidth=0.341797
		WinHeight=0.030035
		WinLeft=0.051758
		WinTop=0.772865
    	Caption="Only Official Maps"
// if _RO_
    	Hint="Hides all maps not created by Tripwire."
// else
//    	Hint="Hides all maps not created by Epic or Digital Extremes."
// end if _RO_
    	TabOrder=1
    	bAutoSizeCaption=True
    	ComponentWidth=0.9
    	CaptionWidth=0.1
    	bSquare=True
    End Object
	ch_OfficialMapsOnly=FilterCheck

    Begin Object Class=moButton Name=MaplistButton
		WinWidth=0.341797
		WinHeight=0.05
		WinLeft=0.039258
		WinTop=0.888587
    	ButtonCaption="Maplist Configuration"
    	Hint="Modify the maps that should be used in gameplay"
    	OnChange=MaplistConfigClick
    	TabOrder=2
    	ComponentWidth=1.0
    End Object
    b_Maplist=MaplistButton

    Begin Object Class=moButton Name=TutorialButton
    	OnChange=TutorialClicked
		WinWidth=0.348633
		WinHeight=0.05
		WinLeft=0.556953
		WinTop=0.913326
//		OnCreateComponent=InternalOnCreateComponent
    	ButtonCaption="Watch Game Tutorial"
    	ButtonStyleName="SquareButton"
    	Hint="Watch the tutorial for this gametype."
    	ComponentWidth=1.0
    	TabOrder=3
    End Object
    b_Tutorial=TutorialButton

	MapCaption="Maps"
	BonusVehicles=" (Bonus Vehicles)"
	BonusVehiclesMsg="(Includes Bonus Vehicles)|"
}
