scriptname SKI_ConfigMenu extends SKI_ConfigBase

; SCRIPT VERSION ----------------------------------------------------------------------------------
;
; History
;
; 1:	- Initial version
;
; 2:	- Added category icon theme option
;		- Added noIconColor option
;		- Added controls section for gamepad
;
; 3:	- Added disable 3D item positioning option
;
; 4:	- Converted script to use state options
;		- Added map menu version check
;		- Added active effects widget configuration
;
; 5:	- Fixed 3DItemDisablePositioning
;
; 6:	- Added favorites menu options
;
; 7:	- Changed page layout
;
; 8:	- Removed unsupported icon themes

int function GetVersion()
	return 9
endFunction


; PRIVATE VARIABLES -------------------------------------------------------------------------------

; -- Version 1 --

; Lists
string[]	_alignments
string[]	_alignmentValues
string[]	_sizes

; State
int			_itemlistFontSizeIdx		= 2
int			_itemlistQuantityMinCount	= 6

int			_itemcardAlignIdx			= 2
float		_itemcardXOffset			= 0.0
float		_itemcardYOffset			= 0.0

float		_3DItemXOffset				= 0.0
float		_3DItemYOffset				= 0.0
float		_3DItemScale				= 1.5

int			_searchKey					= 57
int			_switchTabKey				= 56
int			_equipModeKey				= 42

; Internal
float		_itemXBase
float		_itemXBaseW


; -- Version 2 --

; Lists
string[]	_categoryIconThemeShortNames
string[]	_categoryIconThemeLongNames
string[]	_categoryIconThemeValues

; State
int			_categoryIconThemeIdx		= 0
bool		_itemlistNoIconColors		= false

int			_switchTabButton			= 271 ; BACK
int			_prevColumnButton			= 274 ; LEFT_SHOULDER
int			_nextColumnButton			= 275 ; RIGHT_SHOULDER
int			_sortOrderButton			= 272 ; LEFT_THUMB

; -- Version 3 --

; State
bool		_3DItemDisablePositioning		= false

; Internal
float		_fInventory3DItemPosXWide
float		_fInventory3DItemPosX
float		_fMagic3DItemPosXWide
float		_fMagic3DItemPosX

; Flags
int			_3DItemFlags

; -- Version 4 --

; Lists
string[]	_orientations
string[]	_orientationValues

string[]	_vertAlignments
string[]	_vertAlignmentValues

float[]		_effectWidgetIconSizeValues

float[]		_alignmentBaseOffsets
float[]		_vertAlignmentBaseOffsets

; State
int			_effectWidgetIconSizeIdx		= 1		; medium
int			_effectWidgetVAnchorIdx			= 0		; top
int			_effectWidgetHAnchorIdx			= 1		; right
int			_effectWidgetGroupCount			= 8
int			_effectWidgetOrientationIdx		= 1		; vertical
float		_effectWidgetXOffset			= 0.0
float		_effectWidgetYOffset			= 0.0

; Flags
int			_effectWidgetFlags

; -- Version 5 --

; Internal
float		_fInventory3DItemPosZWide
float		_fInventory3DItemPosZ
float		_fMagic3DItemPosZWide
float		_fMagic3DItemPosZ

float		_fInventory3DItemPosScaleWide
float		_fMagic3DItemPosScaleWide
float		_fInventory3DItemPosScale
float		_fMagic3DItemPosScale

; -- Version 6 --

; Lists
string[]	_favGroupNames

; State
int			_favCurGroupIdx				= 0


; PROPERTIES --------------------------------------------------------------------------------------

; -- Version 1 --

SKI_SettingsManager property		SKI_SettingsManagerInstance auto
SKI_Main property					SKI_MainInstance auto

; -- Version 4 --

SKI_ActiveEffectsWidget property	SKI_ActiveEffectsWidgetInstance auto

; -- Version 6 --

SKI_FavoritesManager property		SKI_FavoritesManagerInstance auto


; INITIALIZATION ----------------------------------------------------------------------------------

; @overrides SKI_ConfigBase
event OnConfigInit()
	; Translate strings to display in UI
	_alignments = new string[3]
	_alignments[0] = "$Left"
	_alignments[1] = "$Right"
	_alignments[2] = "$Center"

	_sizes = new string[3]
	_sizes[0] = "$Small"
	_sizes[1] = "$Medium"
	_sizes[2] = "$Large"

	; Strings used as variable values
	_alignmentValues = new string[3]
	_alignmentValues[0] = "left"
	_alignmentValues[1] = "right"
	_alignmentValues[2] = "center"

	ApplySettings()
	ApplyItemListFontSize()
endEvent

; @implements SKI_QuestBase
event OnGameReload()
	parent.OnGameReload()
	ApplySettings()
endEvent

; @implements SKI_QuestBase
event OnVersionUpdate(int a_version)

	; Version 2
	if (a_version >= 2 && CurrentVersion < 2)
		Debug.Trace(self + ": Updating to script version 2")

		_categoryIconThemeShortNames = new string[4]
		_categoryIconThemeShortNames[0] = "SKYUI V3"
		_categoryIconThemeShortNames[1] = "CELTIC"
		_categoryIconThemeShortNames[2] = "CURVED"
		_categoryIconThemeShortNames[3] = "STRAIGHT"

		_categoryIconThemeLongNames = new string[4]
		_categoryIconThemeLongNames[0] = "SkyUI V3, by PsychoSteve"
		_categoryIconThemeLongNames[1] = "Celtic, by GreatClone"
		_categoryIconThemeLongNames[2] = "Curved, by T3T"
		_categoryIconThemeLongNames[3] = "Straight, by T3T"

		_categoryIconThemeValues = new string[4]
		_categoryIconThemeValues[0] = "skyui\\icons_category_psychosteve.swf"
		_categoryIconThemeValues[1] = "skyui\\icons_category_celtic.swf"
		_categoryIconThemeValues[2] = "skyui\\icons_category_curved.swf"
		_categoryIconThemeValues[3] = "skyui\\icons_category_straight.swf"

		; Have been renamed, so clear old overrides and set new ones
		SKI_SettingsManagerInstance.ClearOverride("Input$controls$search")
		SKI_SettingsManagerInstance.ClearOverride("Input$controls$switchTab")
		SKI_SettingsManagerInstance.ClearOverride("Input$controls$equipMode")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey)
	endIf

	if (a_version >= 3 && CurrentVersion < 3)
		Debug.Trace(self + ": Updating to script version 3")

		_3DItemFlags = OPTION_FLAG_NONE

		;The below all reset to true with version 3.2
		;SKI_MainInstance.InventoryMenuCheckEnabled
		;SKI_MainInstance.MagicMenuCheckEnabled
		;SKI_MainInstance.BarterMenuCheckEnabled
		;SKI_MainInstance.ContainerMenuCheckEnabled
		;SKI_MainInstance.GiftMenuCheckEnabled
	endIf

	if (a_version >= 4 && CurrentVersion < 4)
		Debug.Trace(self + ": Updating to script version 4")

		_orientations = new string[2]
		_orientations[0] = "$Horizontal"
		_orientations[1] = "$Vertical"

		_orientationValues = new string[2]
		_orientationValues[0] = "horizontal"
		_orientationValues[1] = "vertical"

		_vertAlignments = new string[3]
		_vertAlignments[0] = "$Top"
		_vertAlignments[1] = "$Bottom"
		_vertAlignments[2] = "$Center"

		_vertAlignmentValues = new string[3]
		_vertAlignmentValues[0] = "top"
		_vertAlignmentValues[1] = "bottom"
		_vertAlignmentValues[2] = "center"

		_effectWidgetIconSizeValues = new float[3]
		_effectWidgetIconSizeValues[0] = 32.0
		_effectWidgetIconSizeValues[1] = 48.0
		_effectWidgetIconSizeValues[2] = 64.0

		_alignmentBaseOffsets = new float[3]
		_alignmentBaseOffsets[0] = 0.0
		_alignmentBaseOffsets[1] = 1280.0
		_alignmentBaseOffsets[2] = 640.0

		_vertAlignmentBaseOffsets = new float[3]
		_vertAlignmentBaseOffsets[0] = 0.0
		_vertAlignmentBaseOffsets[1] = 720.0
		_vertAlignmentBaseOffsets[2] = 360.0

		_effectWidgetFlags = OPTION_FLAG_NONE

		; Sync widget default values
		SKI_ActiveEffectsWidgetInstance.Enabled				= true
		SKI_ActiveEffectsWidgetInstance.EffectSize			= _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx]
		SKI_ActiveEffectsWidgetInstance.HAnchor				= _alignmentValues[_effectWidgetHAnchorIdx]
		SKI_ActiveEffectsWidgetInstance.VAnchor				= _vertAlignmentValues[_effectWidgetVAnchorIdx]
		SKI_ActiveEffectsWidgetInstance.GroupEffectCount	= _effectWidgetGroupCount
		SKI_ActiveEffectsWidgetInstance.Orientation			= _orientationValues[_effectWidgetOrientationIdx]
		SKI_ActiveEffectsWidgetInstance.X					= _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset
		SKI_ActiveEffectsWidgetInstance.Y					= _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset
	endIf

	if (a_version >= 5 && CurrentVersion < 5)
		Debug.Trace(self + ": Updating to script version 5")
	endIf

	if (a_version >= 6 && CurrentVersion < 6)
		Debug.Trace(self + ": Updating to script version 6")

		Pages = new string[3]
		Pages[0] = "$General"
		Pages[1] = "$Favorite Groups"
		Pages[2] = "$Advanced"

		_favGroupNames = new string[8]
		_favGroupNames[0] = "$Group {1}"
		_favGroupNames[1] = "$Group {2}"
		_favGroupNames[2] = "$Group {3}"
		_favGroupNames[3] = "$Group {4}"
		_favGroupNames[4] = "$Group {5}"
		_favGroupNames[5] = "$Group {6}"
		_favGroupNames[6] = "$Group {7}"
		_favGroupNames[7] = "$Group {8}"
	endIf

	if (a_version >= 7 && CurrentVersion < 7)
		Debug.Trace(self + ": Updating to script version 7")

		Pages = new string[3]
		Pages[0] = "$General"
		Pages[1] = "$Controls"
		Pages[2] = "$Advanced"
	endIf

	if (a_version >= 8 && CurrentVersion < 8)
		Debug.Trace(self + ": Updating to script version 8")

		_categoryIconThemeShortNames = new string[1]
		_categoryIconThemeShortNames[0] = "SKYUI V5"

		_categoryIconThemeLongNames = new string[1]
		_categoryIconThemeLongNames[0] = "SkyUI V5, by PsychoSteve"

		_categoryIconThemeValues = new string[1]
		_categoryIconThemeValues[0] = "skyui\\icons_category_psychosteve.swf"

		_categoryIconThemeIdx = 0

		SKI_SettingsManagerInstance.ClearOverride("Appearance$icons$category$source")
		SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx])
	endIf

	if a_version >= 9 && CurrentVersion < 9
		debug.Trace(self as String + ": Updating to script version 9")
		AddEnderalIcons()
	endIf
endEvent


; EVENTS ------------------------------------------------------------------------------------------

; @implements SKI_ConfigBase
event OnPageReset(string a_page)

	; Load custom .swf for animated logo
	if (a_page == "")
		LoadCustomContent("skyui/skyui_splash.swf")
		return
	else
		UnloadCustomContent()
	endIf

	; -------------------------------------------------------
	if (a_page == "$General")
		SetCursorFillMode(TOP_TO_BOTTOM)

		AddHeaderOption("$Item List")
		AddTextOptionST("ITEMLIST_FONT_SIZE", "$Font Size", _sizes[_itemlistFontSizeIdx])
		AddSliderOptionST("ITEMLIST_QUANTITY_MIN_COUNT", "$Quantity Menu Min. Count", _itemlistQuantityMinCount)
		AddMenuOptionST("ITEMLIST_CATEGORY_ICON_THEME", "$Category Icon Theme", _categoryIconThemeShortNames[_categoryIconThemeIdx])
		AddToggleOptionST("ITEMLIST_NO_ICON_COLORS", "$Disable Icon Colors", _itemlistNoIconColors)

		AddEmptyOption()

		AddHeaderOption("$Active Effects HUD")
		AddToggleOptionST("EFFECT_WIDGET_ENABLED", "$Enabled", SKI_ActiveEffectsWidgetInstance.Enabled)
		AddTextOptionST("EFFECT_WIDGET_ICON_SIZE","$Icon Size", _sizes[_effectWidgetIconSizeIdx], _effectWidgetFlags)
		AddSliderOptionST("EFFECT_WIDGET_MIN_TIME_LEFT", "$Minimum Time Left", SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft, "{0} s", _effectWidgetFlags)

		SetCursorPosition(1)

		AddHeaderOption("$Favorites Menu")
		AddToggleOptionST("FAV_MENU_HELP_ENABLED", "$Show Button Help", SKI_FavoritesManagerInstance.ButtonHelpEnabled)

		AddEmptyOption()

		int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR
		int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS

		AddHeaderOption("$Favorite Groups")
		AddMenuOptionST("FAV_GROUP_SELECT", "", "$Group {" + (_favCurGroupIdx+1) + "}")
		AddToggleOptionST("FAV_GROUP_UNEQUIP_ARMOR", "$Unequip Armor", SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG))
		AddToggleOptionST("FAV_GROUP_UNEQUIP_HANDS", "$Unequip Hands", SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG))

	; -------------------------------------------------------
	elseIf (a_page == "$Controls")

		bool isGamepad = Game.UsingGamepad()

		SetCursorFillMode(TOP_TO_BOTTOM)

		AddHeaderOption("$Item List")
		if (! isGamepad)
			AddKeyMapOptionST("SEARCH_KEY", "$Search", _searchKey)
			AddKeyMapOptionST("SWITCH_TAB_KEY", "$Switch Tab", _switchTabKey)
			AddKeyMapOptionST("EQUIP_MODE_KEY", "$Equip Mode", _equipModeKey)
		else
			AddKeyMapOptionST("SEARCH_KEY", "$Search", _searchKey, OPTION_FLAG_DISABLED)
			AddKeyMapOptionST("SWITCH_TAB_BUTTON", "$Switch Tab", _switchTabButton)
			AddKeyMapOptionST("PREV_COLUMN_BUTTON", "$Previous Column", _prevColumnButton)
			AddKeyMapOptionST("NEXT_COLUMN_BUTTON", "$Next Column", _nextColumnButton)
			AddKeyMapOptionST("SORT_ORDER_BUTTON", "$Order", _sortOrderButton)
		endIf

		if (! isGamepad)
			AddEmptyOption()

			AddHeaderOption("$Favorites Menu")
			AddKeyMapOptionST("FAV_GROUP_ADD_KEY", "{$Group}/{$Ungroup}", SKI_FavoritesManagerInstance.GroupAddKey)
			AddKeyMapOptionST("FAV_GROUP_USE_KEY", "$Group Use", SKI_FavoritesManagerInstance.GroupUseKey)
			AddKeyMapOptionST("FAV_SET_ICON_KEY", "$Set Group Icon", SKI_FavoritesManagerInstance.SetIconKey)
			AddKeyMapOptionST("FAV_EQUIP_STATE_KEY", "$Save Equip State", SKI_FavoritesManagerInstance.SaveEquipStateKey)
			AddKeyMapOptionST("FAV_TOGGLE_FOCUS", "$Toggle Focus", SKI_FavoritesManagerInstance.ToggleFocusKey)
		endIf

		SetCursorPosition(1)

		int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys()

		AddHeaderOption("$Favorite Groups")
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY1", "$Group {1}", groupHotkeys[0], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY2", "$Group {2}", groupHotkeys[1], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY3", "$Group {3}", groupHotkeys[2], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY4", "$Group {4}", groupHotkeys[3], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY5", "$Group {5}", groupHotkeys[4], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY6", "$Group {6}", groupHotkeys[5], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY7", "$Group {7}", groupHotkeys[6], OPTION_FLAG_WITH_UNMAP)
		AddKeyMapOptionST("FAV_GROUP_USE_HOTKEY8", "$Group {8}", groupHotkeys[7], OPTION_FLAG_WITH_UNMAP)

	; -------------------------------------------------------
	elseIf (a_page == "$Advanced")
		SetCursorFillMode(TOP_TO_BOTTOM)

		AddHeaderOption("$3D Item")
		AddSliderOptionST("XD_ITEM_XOFFSET", "$Horizontal Offset", _3DItemXOffset, "{0}", _3DItemFlags)
		AddSliderOptionST("XD_ITEM_YOFFSET", "$Vertical Offset", _3DItemYOffset, "{0}", _3DItemFlags)
		AddSliderOptionST("XD_ITEM_SCALE", "$Scale", _3DItemScale, "{1}", _3DItemFlags)
		AddToggleOptionST("XD_ITEM_POSITIONING", "$Disable Positioning", _3DItemDisablePositioning)

		AddEmptyOption()

		AddHeaderOption("$Active Effects HUD")
		AddTextOptionST("EFFECT_WIDGET_ORIENTATION", "$Orientation", _orientations[_effectWidgetOrientationIdx], _effectWidgetFlags)
		AddTextOptionST("EFFECT_WIDGET_HORIZONTAL_ANCHOR", "$Horizontal Anchor", _alignments[_effectWidgetHAnchorIdx], _effectWidgetFlags)
		AddTextOptionST("EFFECT_WIDGET_VERTICAL_ANCHOR", "$Vertical Anchor", _vertAlignments[_effectWidgetVAnchorIdx], _effectWidgetFlags)
		AddSliderOptionST("EFFECT_WIDGET_GROUP_COUNT", "$Icon Group Count", SKI_ActiveEffectsWidgetInstance.GroupEffectCount, "{0}", _effectWidgetFlags)
		AddSliderOptionST("EFFECT_WIDGET_XOFFSET", "$Horizontal Offset", _effectWidgetXOffset, "{0}", _effectWidgetFlags)
		AddSliderOptionST("EFFECT_WIDGET_YOFFSET", "$Vertical Offset", _effectWidgetYOffset, "{0}", _effectWidgetFlags)

		SetCursorPosition(1)

		AddHeaderOption("$Item Card")
		AddTextOptionST("ITEMCARD_ALIGN", "$Align", _alignments[_itemcardAlignIdx])
		AddSliderOptionST("ITEMCARD_XOFFSET", "$Horizontal Offset", _itemcardXOffset)
		AddSliderOptionST("ITEMCARD_YOFFSET", "$Vertical Offset", _itemcardYOffset)

		AddEmptyOption()

		AddHeaderOption("$SWF Version Checking")
		AddToggleOptionST("CHECK_MAP_MENU", "Map Menu", SKI_MainInstance.MapMenuCheckEnabled)
		AddToggleOptionST("CHECK_FAVORITES_MENU", "Favorites Menu", SKI_MainInstance.FavoritesMenuCheckEnabled)
		AddToggleOptionST("CHECK_INVENTORY_MENU", "Inventory Menu", SKI_MainInstance.InventoryMenuCheckEnabled)
		AddToggleOptionST("CHECK_MAGIC_MENU", "Magic Menu", SKI_MainInstance.MagicMenuCheckEnabled)
		AddToggleOptionST("CHECK_BARTER_MENU", "Barter Menu", SKI_MainInstance.BarterMenuCheckEnabled)
		AddToggleOptionST("CHECK_CONTAINER_MENU", "Container Menu", SKI_MainInstance.ContainerMenuCheckEnabled)
		AddToggleOptionST("CHECK_CRAFTING_MENU", "Crafting Menu", SKI_MainInstance.CraftingMenuCheckEnabled)
		AddToggleOptionST("CHECK_GIFT_MENU", "Gift Menu", SKI_MainInstance.GiftMenuCheckEnabled)

	endIf
endEvent


; STATE OPTIONS -----------------------------------------------------------------------------------

state FAV_GROUP_ADD_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SKI_FavoritesManagerInstance.GroupAddKey = a_keyCode
		RefreshFavoriteHotkeys()
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.GroupAddKey = 33
		RefreshFavoriteHotkeys()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{F}")
	endEvent

endState

state FAV_GROUP_USE_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SKI_FavoritesManagerInstance.GroupUseKey = a_keyCode
		RefreshFavoriteHotkeys()
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.GroupUseKey = 19
		RefreshFavoriteHotkeys()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{R}")
	endEvent

endState

state FAV_SET_ICON_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SKI_FavoritesManagerInstance.SetIconKey = a_keyCode
		RefreshFavoriteHotkeys()
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.SetIconKey = 56
		RefreshFavoriteHotkeys()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{LAlt}")
	endEvent

endState

state FAV_EQUIP_STATE_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SKI_FavoritesManagerInstance.SaveEquipStateKey = a_keyCode
		RefreshFavoriteHotkeys()
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.SaveEquipStateKey = 20
		RefreshFavoriteHotkeys()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{T}")
	endEvent

endState

state FAV_TOGGLE_FOCUS ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SKI_FavoritesManagerInstance.ToggleFocusKey = a_keyCode
		RefreshFavoriteHotkeys()
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.ToggleFocusKey = 57
		RefreshFavoriteHotkeys()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{Space}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY1 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(0, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(0, 59)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{F1}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY2 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(1, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(1, 60)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{F2}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY3 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(2, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(2, 61)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{F3}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY4 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(3, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(3, 62)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{F4}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY5 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(4, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(4, -1)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$Off}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY6 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(5, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(5, -1)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$Off}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY7 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(6, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(6, -1)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$Off}")
	endEvent

endState

state FAV_GROUP_USE_HOTKEY8 ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		SetFavoritesGroupHotkey(7, a_keyCode, a_conflictControl, a_conflictName)
	endEvent

	event OnDefaultST()
		SetFavoritesGroupHotkey(7, -1)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$Off}")
	endEvent

endState

state FAV_MENU_HELP_ENABLED ; TOGGLE

	event OnSelectST()
		bool newVal = !SKI_FavoritesManagerInstance.ButtonHelpEnabled
		SKI_FavoritesManagerInstance.ButtonHelpEnabled = newVal

		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_FavoritesManagerInstance.ButtonHelpEnabled = true

		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$On}")
	endEvent

endState

state FAV_GROUP_SELECT ; MENU

	event OnMenuOpenST()
		SetMenuDialogStartIndex(_favCurGroupIdx)
		SetMenuDialogDefaultIndex(0)
		SetMenuDialogOptions(_favGroupNames)
	endEvent

	event OnMenuAcceptST(int a_index)
		_favCurGroupIdx = a_index

		SetCurrentFavoriteGroup(_favCurGroupIdx)

		SetMenuOptionValueST(_favGroupNames[_favCurGroupIdx])
	endEvent

	event OnDefaultST()
		_favCurGroupIdx = 0

		SetCurrentFavoriteGroup(_favCurGroupIdx)

		SetTextOptionValueST(_favCurGroupIdx+1)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO6")
	endEvent

endState

state FAV_GROUP_UNEQUIP_ARMOR ; TOGGLE

	event OnSelectST()
		int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR

		bool newVal = !SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG)
		SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, ARMOR_FLAG, newVal)

		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR

		SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, ARMOR_FLAG, false)

		SetToggleOptionValueST(false)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO7{$Off}")
	endEvent

endState

state FAV_GROUP_UNEQUIP_HANDS ; TOGGLE

	event OnSelectST()
		int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS

		bool newVal = !SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG)
		SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, HANDS_FLAG, newVal)

		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR

		SKI_FavoritesManagerInstance.SetGroupFlag(_favCurGroupIdx, HANDS_FLAG, false)

		SetToggleOptionValueST(false)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO8{$Off}")
	endEvent

endState

; -------------------------------------------------------

state ITEMLIST_FONT_SIZE ; TEXT

	event OnSelectST()
		if (_itemlistFontSizeIdx < _sizes.length - 1)
			_itemlistFontSizeIdx += 1
		else
			_itemlistFontSizeIdx = 0
		endif
		SetTextOptionValueST(_sizes[_itemlistFontSizeIdx])
		ApplyItemListFontSize()
	endEvent

	event OnDefaultST()
		_itemlistFontSizeIdx = 2
		SetTextOptionValueST(_sizes[_itemlistFontSizeIdx])
		ApplyItemListFontSize()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _sizes[1] + "}")
	endEvent

endState

state ITEMLIST_QUANTITY_MIN_COUNT ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_itemlistQuantityMinCount)
		SetSliderDialogDefaultValue(6)
		SetSliderDialogRange(0, 100)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_itemlistQuantityMinCount = a_value as int
		SetSliderOptionValueST(_itemlistQuantityMinCount)
		SKI_SettingsManagerInstance.SetOverride("ItemList$quantityMenu$minCount", _itemlistQuantityMinCount)
	endEvent

	event OnDefaultST()
		_itemlistQuantityMinCount = 6
		SetSliderOptionValueST(_itemlistQuantityMinCount)
		SKI_SettingsManagerInstance.SetOverride("ItemList$quantityMenu$minCount", _itemlistQuantityMinCount)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO2{6}")
	endEvent

endState

state ITEMLIST_CATEGORY_ICON_THEME ; MENU

	event OnMenuOpenST()
		SetMenuDialogStartIndex(_categoryIconThemeIdx)
		SetMenuDialogDefaultIndex(0)
		SetMenuDialogOptions(_categoryIconThemeLongNames)
	endEvent

	event OnMenuAcceptST(int a_index)
		_categoryIconThemeIdx = a_index
		SetMenuOptionValueST(_categoryIconThemeShortNames[_categoryIconThemeIdx])
		SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx])
	endEvent

	event OnDefaultST()
		_categoryIconThemeIdx = 0
		SetTextOptionValueST(_categoryIconThemeShortNames[_categoryIconThemeIdx])
		SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _categoryIconThemeShortNames[0] + "}")
	endEvent

endState

state ITEMLIST_NO_ICON_COLORS ; TOGGLE

	event OnSelectST()
		_itemListNoIconColors = !_itemlistNoIconColors
		SetToggleOptionValueST(_itemlistNoIconColors)
		SKI_SettingsManagerInstance.SetOverride("Appearance$icons$item$noColor", _itemlistNoIconColors)
	endEvent

	event OnDefaultST()
		_itemlistNoIconColors = false
		SetToggleOptionValueST(_itemlistNoIconColors)
		SKI_SettingsManagerInstance.SetOverride("Appearance$icons$item$noColor", _itemlistNoIconColors)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$Off}")
	endEvent

endState

; -------------------------------------------------------

state EFFECT_WIDGET_ENABLED ; TOGGLE

	event OnSelectST()
		bool newVal = !SKI_ActiveEffectsWidgetInstance.Enabled
		SKI_ActiveEffectsWidgetInstance.Enabled = newVal

		if (newVal)
			_effectWidgetFlags = OPTION_FLAG_NONE
		else
			_effectWidgetFlags = OPTION_FLAG_DISABLED
		endIf

		SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_ICON_SIZE")
		SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_MIN_TIME_LEFT")

		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_ActiveEffectsWidgetInstance.Enabled = true

		_effectWidgetFlags = OPTION_FLAG_NONE

		SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_ICON_SIZE")
		SetOptionFlagsST(_effectWidgetFlags, true, "EFFECT_WIDGET_MIN_TIME_LEFT")

		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{$On}")
	endEvent

endState

state EFFECT_WIDGET_ICON_SIZE ; TEXT

	event OnSelectST()
		if (_effectWidgetIconSizeIdx < _sizes.length - 1)
			_effectWidgetIconSizeIdx += 1
		else
			_effectWidgetIconSizeIdx = 0
		endIf

		SKI_ActiveEffectsWidgetInstance.EffectSize = _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx]
		SetTextOptionValueST(_sizes[_effectWidgetIconSizeIdx])
	endEvent

	event OnDefaultST()
		_effectWidgetIconSizeIdx = 1
		SKI_ActiveEffectsWidgetInstance.EffectSize = _effectWidgetIconSizeValues[_effectWidgetIconSizeIdx]
		SetTextOptionValueST(_sizes[_effectWidgetIconSizeIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _sizes[1] + "}")
	endEvent

endState

state EFFECT_WIDGET_ORIENTATION ; TEXT

	event OnSelectST()
		if (_effectWidgetOrientationIdx < _orientations.length - 1)
		  _effectWidgetOrientationIdx += 1
		else
		  _effectWidgetOrientationIdx = 0
		endIf

		SKI_ActiveEffectsWidgetInstance.Orientation = _orientationValues[_effectWidgetOrientationIdx]
		SetTextOptionValueST(_orientations[_effectWidgetOrientationIdx])
	endEvent

	event OnDefaultST()
		_effectWidgetOrientationIdx = 1
		SKI_ActiveEffectsWidgetInstance.Orientation = _orientationValues[_effectWidgetOrientationIdx]
		SetTextOptionValueST(_orientations[_effectWidgetOrientationIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _orientations[1] + "}")
	endEvent

endState

state EFFECT_WIDGET_HORIZONTAL_ANCHOR ; TEXT

	event OnSelectST()
		if (_effectWidgetHAnchorIdx < _alignments.length - 1)
		  _effectWidgetHAnchorIdx += 1
		else
		  _effectWidgetHAnchorIdx = 0
		endIf

		SKI_ActiveEffectsWidgetInstance.HAnchor = _alignmentValues[_effectWidgetHAnchorIdx]
		SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset
		SetTextOptionValueST(_alignments[_effectWidgetHAnchorIdx])
	endEvent

	event OnDefaultST()
		_effectWidgetVAnchorIdx = 1
		SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset
		SetTextOptionValueST(_alignments[_effectWidgetHAnchorIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _alignments[1] + "}")
	endEvent

endState

state EFFECT_WIDGET_VERTICAL_ANCHOR ; TEXT

	event OnSelectST()
		if (_effectWidgetVAnchorIdx < _vertAlignments.length - 1)
		  _effectWidgetVAnchorIdx += 1
		else
		  _effectWidgetVAnchorIdx = 0
		endIf

		SKI_ActiveEffectsWidgetInstance.VAnchor = _vertAlignmentValues[_effectWidgetVAnchorIdx]
		SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset
		SetTextOptionValueST(_vertAlignments[_effectWidgetVAnchorIdx])
	endEvent

	event OnDefaultST()
		_effectWidgetVAnchorIdx = 0
		SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset
		SetTextOptionValueST(_vertAlignments[_effectWidgetVAnchorIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _vertAlignments[0] + "}")
	endEvent

endState

state EFFECT_WIDGET_MIN_TIME_LEFT ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft)
		SetSliderDialogDefaultValue(180)
		SetSliderDialogRange(0, 600)
		SetSliderDialogInterval(10)
	endEvent

	event OnSliderAcceptST(float a_value)
		SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft = a_value as int
		SetSliderOptionValueST(a_value as int, "{0} s")
	endEvent

	event OnDefaultST()
		SKI_ActiveEffectsWidgetInstance.MinimumTimeLeft = 180
		SetSliderOptionValueST(180)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO5{180}")
	endEvent

endState

state EFFECT_WIDGET_GROUP_COUNT ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(SKI_ActiveEffectsWidgetInstance.GroupEffectCount)
		SetSliderDialogDefaultValue(8)
		SetSliderDialogRange(1, 16)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		SKI_ActiveEffectsWidgetInstance.GroupEffectCount = a_value as int
		SetSliderOptionValueST(a_value as int)
	endEvent

	event OnDefaultST()
		SKI_ActiveEffectsWidgetInstance.GroupEffectCount = 8
		SetSliderOptionValueST(8)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{8}")
	endEvent

endState

state EFFECT_WIDGET_XOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_effectWidgetXOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-1280, 1280)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_effectWidgetXOffset = a_value
		SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset
		SetSliderOptionValueST(_effectWidgetXOffset)
	endEvent

	event OnDefaultST()
		_effectWidgetXOffset = 0.0
		SKI_ActiveEffectsWidgetInstance.X = _alignmentBaseOffsets[_effectWidgetHAnchorIdx] + _effectWidgetXOffset
		SetSliderOptionValueST(_effectWidgetXOffset)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

state EFFECT_WIDGET_YOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_effectWidgetYOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-720, 720)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_effectWidgetYOffset = a_value
		SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset
		SetSliderOptionValueST(_effectWidgetYOffset)
	endEvent

	event OnDefaultST()
		_effectWidgetYOffset = 0.0
		SKI_ActiveEffectsWidgetInstance.Y = _vertAlignmentBaseOffsets[_effectWidgetVAnchorIdx] + _effectWidgetYOffset
		SetSliderOptionValueST(_effectWidgetYOffset)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

; -------------------------------------------------------

state SEARCH_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SwapItemListKey(a_keyCode, _searchKey)

		_searchKey = a_keyCode
		SetKeyMapOptionValueST(_searchKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey)
	endEvent

	event OnDefaultST()
		_searchKey = 57
		SetKeyMapOptionValueST(_searchKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{Space}")
	endEvent

endState

state SWITCH_TAB_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SwapItemListKey(a_keyCode, _switchTabKey)

		_switchTabKey = a_keyCode
		SetKeyMapOptionValueST(_switchTabKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey)
	endEvent

	event OnDefaultST()
		_switchTabKey = 56
		SetKeyMapOptionValueST(_switchTabKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{LAlt}")
	endEvent

endState

state EQUIP_MODE_KEY ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, false))
			return
		endIf

		SwapItemListKey(a_keyCode, _equipModeKey)

		_equipModeKey = a_keyCode
		SetKeyMapOptionValueST(_equipModeKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey)
	endEvent

	event OnDefaultST()
		_equipModeKey = 42
		SetKeyMapOptionValueST(_equipModeKey)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{Shift}")
	endEvent

endState

state SWITCH_TAB_BUTTON ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, true))
			return
		endIf

		SwapItemListKey(a_keyCode, _switchTabButton)

		_switchTabButton = a_keyCode
		SetKeyMapOptionValueST(_switchTabButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton)
	endEvent

	event OnDefaultST()
		_switchTabButton = 271
		SetKeyMapOptionValueST(_switchTabButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{Back}")
	endEvent

endState

state PREV_COLUMN_BUTTON ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, true))
			return
		endIf

		SwapItemListKey(a_keyCode, _prevColumnButton)

		_prevColumnButton = a_keyCode
		SetKeyMapOptionValueST(_prevColumnButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton)
	endEvent

	event OnDefaultST()
		_prevColumnButton = 274
		SetKeyMapOptionValueST(_prevColumnButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{LB}")
	endEvent

endState

state NEXT_COLUMN_BUTTON ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, true))
			return
		endIf

		SwapItemListKey(a_keyCode, _nextColumnButton)

		_nextColumnButton = a_keyCode
		SetKeyMapOptionValueST(_nextColumnButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton)
	endEvent

	event OnDefaultST()
		_nextColumnButton = 275
		SetKeyMapOptionValueST(_nextColumnButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{RB}")
	endEvent

endState

state SORT_ORDER_BUTTON ; KEYMAP

	event OnKeyMapChangeST(int a_keyCode, string a_conflictControl, string a_conflictName)
		if (! ValidateKey(a_keyCode, true))
			return
		endIf

		SwapItemListKey(a_keyCode, _sortOrderButton)

		_sortOrderButton = a_keyCode
		SetKeyMapOptionValueST(_sortOrderButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton)
	endEvent

	event OnDefaultST()
		_sortOrderButton = 272
		SetKeyMapOptionValueST(_sortOrderButton)
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{LS}")
	endEvent

endState

; -------------------------------------------------------

state ITEMCARD_ALIGN ; KEYMAP

	event OnSelectST()
		if (_itemcardAlignIdx < _alignments.length - 1)
			_itemcardAlignIdx += 1
		else
			_itemcardAlignIdx = 0
		endif
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$align", _alignmentValues[_itemcardAlignIdx])
		SetTextOptionValueST(_alignments[_itemcardAlignIdx])
	endEvent

	event OnDefaultST()
		_itemcardAlignIdx = 2
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$align", _alignmentValues[_itemcardAlignIdx])
		SetTextOptionValueST(_alignments[_itemcardAlignIdx])
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{" + _alignments[2] + "}")
	endEvent

endState

state ITEMCARD_XOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_itemcardXOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-1000, 1000)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_itemcardXOffset = a_value
		SetSliderOptionValueST(_itemcardXOffset)
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$xOffset", _itemcardXOffset)
	endEvent

	event OnDefaultST()
		_itemcardXOffset = 0.0
		SetSliderOptionValueST(_itemcardXOffset)
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$xOffset", _itemcardXOffset)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

state ITEMCARD_YOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_itemcardYOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-1000, 1000)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_itemcardYOffset = a_value
		SetSliderOptionValueST(_itemcardYOffset)
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$yOffset", _itemcardYOffset)
	endEvent

	event OnDefaultST()
		_itemcardYOffset = 0.0
		SetSliderOptionValueST(_itemcardYOffset)
		SKI_SettingsManagerInstance.SetOverride("ItemInfo$itemcard$yOffset", _itemcardYOffset)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

; -------------------------------------------------------

state XD_ITEM_XOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_3DItemXOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-128, 128)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_3DItemXOffset = a_value
		SetSliderOptionValueST(_3DItemXOffset)
		Apply3DItemXOffset()
	endEvent

	event OnDefaultST()
		_3DItemXOffset = 0.0
		SetSliderOptionValueST(_3DItemXOffset)
		Apply3DItemXOffset()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

state XD_ITEM_YOFFSET ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_3DItemYOffset)
		SetSliderDialogDefaultValue(0)
		SetSliderDialogRange(-128, 128)
		SetSliderDialogInterval(1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_3DItemYOffset = a_value
		SetSliderOptionValueST(_3DItemYOffset)
		Apply3DItemYOffset()
	endEvent

	event OnDefaultST()
		_3DItemYOffset = 0.0
		SetSliderOptionValueST(_3DItemYOffset)
		Apply3DItemYOffset()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{0}")
	endEvent

endState

state XD_ITEM_SCALE ; SLIDER

	event OnSliderOpenST()
		SetSliderDialogStartValue(_3DItemScale)
		SetSliderDialogDefaultValue(1.5)
		SetSliderDialogRange(0.5, 5)
		SetSliderDialogInterval(0.1)
	endEvent

	event OnSliderAcceptST(float a_value)
		_3DItemScale = a_value
		SetSliderOptionValueST(_3DItemScale, "{1}")
		Apply3DItemScale()
	endEvent

	event OnDefaultST()
		_3DItemScale = 1.5
		SetSliderOptionValueST(_3DItemScale, "{1}")
		Apply3DItemScale()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO1{1.5}")
	endEvent

endState

state XD_ITEM_POSITIONING ; SLIDER

	event OnSelectST()
		bool newVal = !_3DItemDisablePositioning
		_3DItemDisablePositioning = newVal

		if (newVal)
			_3DItemFlags = OPTION_FLAG_DISABLED
		else
			_3DItemFlags = OPTION_FLAG_NONE
		endIf

		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_XOFFSET")
		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_YOFFSET")
		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_SCALE")
		SetToggleOptionValueST(newVal)
		Apply3DItemXOffset()
		Apply3DItemYOffset()
		Apply3DItemScale()
	endEvent

	event OnDefaultST()
		_3DItemDisablePositioning = false
		_3DItemFlags = OPTION_FLAG_NONE
		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_XOFFSET")
		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_YOFFSET")
		SetOptionFlagsST(_3DItemFlags, true, "XD_ITEM_SCALE")
		SetToggleOptionValueST(false)
		Apply3DItemXOffset()
		Apply3DItemYOffset()
		Apply3DItemScale()
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO4{$Off}")
	endEvent

endState

; -------------------------------------------------------

state CHECK_INVENTORY_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.InventoryMenuCheckEnabled
		SKI_MainInstance.InventoryMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.InventoryMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_MAGIC_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.MagicMenuCheckEnabled
		SKI_MainInstance.MagicMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.MagicMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_BARTER_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.BarterMenuCheckEnabled
		SKI_MainInstance.BarterMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.BarterMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_CONTAINER_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.ContainerMenuCheckEnabled
		SKI_MainInstance.ContainerMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.ContainerMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_GIFT_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.GiftMenuCheckEnabled
		SKI_MainInstance.GiftMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.GiftMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_MAP_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.MapMenuCheckEnabled
		SKI_MainInstance.MapMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.MapMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_FAVORITES_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.FavoritesMenuCheckEnabled
		SKI_MainInstance.FavoritesMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.FavoritesMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState

state CHECK_CRAFTING_MENU ; SLIDER

	event OnSelectST()
		bool newVal = !SKI_MainInstance.CraftingMenuCheckEnabled
		SKI_MainInstance.CraftingMenuCheckEnabled = newVal
		SetToggleOptionValueST(newVal)
	endEvent

	event OnDefaultST()
		SKI_MainInstance.CraftingMenuCheckEnabled = true
		SetToggleOptionValueST(true)
	endEvent

	event OnHighlightST()
		SetInfoText("$SKI_INFO3{$On}")
	endEvent

endState


; FUNCTIONS ---------------------------------------------------------------------------------------

; @interface
string function GetCustomControl(int a_keyCode)
	int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys()

	int index = groupHotkeys.Find(a_keyCode)
	if (index != -1)
		return ("Group " + (index+1))
	endIf

	return ""
endFunction

function ApplySettings()
	; Apply settings that aren't handled by SKI_SettingsManagerInstance

	_fInventory3DItemPosXWide		= Utility.GetINIFloat("fInventory3DItemPosXWide:Interface")
	_fInventory3DItemPosX 			= Utility.GetINIFloat("fInventory3DItemPosX:Interface")
	_fMagic3DItemPosXWide 			= Utility.GetINIFloat("fMagic3DItemPosXWide:Interface")
	_fMagic3DItemPosX 				= Utility.GetINIFloat("fMagic3DItemPosX:Interface")

	_fInventory3DItemPosZWide		= Utility.GetINIFloat("fInventory3DItemPosZWide:Interface")
	_fInventory3DItemPosZ 			= Utility.GetINIFloat("fInventory3DItemPosZ:Interface")
	_fMagic3DItemPosZWide 			= Utility.GetINIFloat("fMagic3DItemPosZWide:Interface")
	_fMagic3DItemPosZ 				= Utility.GetINIFloat("fMagic3DItemPosZ:Interface")

	_fInventory3DItemPosScaleWide	= Utility.GetINIFloat("fInventory3DItemPosScaleWide:Interface")
	_fMagic3DItemPosScaleWide		= Utility.GetINIFloat("fMagic3DItemPosScaleWide:Interface")
	_fInventory3DItemPosScale		= Utility.GetINIFloat("fInventory3DItemPosScale:Interface")
	_fMagic3DItemPosScale			= Utility.GetINIFloat("fMagic3DItemPosScale:Interface")

	float h = Utility.GetINIInt("iSize H:Display")
	float w = Utility.GetINIInt("iSize W:Display")
	float ar = w / h

	; Widescreen
	if (ar == 1.6) ; 16:10, 1920×1200
		_itemXBaseW = -32.458335876465
	else
		_itemXBaseW = -29.122497558594
	endIf

	; Non-widescreen
	if (ar == 1.25) ; 5:4, 1280x1024
		_itemXBase = -41.622497558594
	else
		_itemXBase = -39.122497558594
	endIf

	Apply3DItemXOffset()
	Apply3DItemYOffset()
	Apply3DItemScale()

	; Added in Enderal SE 2.0.10
	if _categoryIconThemeIdx > _categoryIconThemeValues.Length - 1 || _categoryIconThemeValues.Length < 5
		AddEnderalIcons()
	endif
	
endFunction

function ApplyItemListFontSize()
	; Small
	if (_itemlistFontSizeIdx == 0)
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "12")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "13")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "16")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 0.3, 0>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-25")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 2, 2>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 3, 2, 2>")
	; Medium
	elseIf (_itemlistFontSizeIdx == 1)
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "12")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "14")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "18")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 1.1, 0>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-28")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 3, 3>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 3, 3, 3>")
	; Large
	else
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$label$textFormat$size", "14")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$defaults$entry$textFormat$size", "18")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$n_iconSize$value", "20")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$vars$a_textBorder$value", "<0, 0, 0.4, 0>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$indent", "-30")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$equipColumn$border", "<0, 10, 3.2, 3.2>")
		SKI_SettingsManagerInstance.SetOverride("ListLayout$columns$iconColumn$border", "<0, 4, 3.2, 3.2>")
	endIf
endFunction

function Apply3DItemXOffset()
	; Negative values shift the 3D item to the right
	if (_3DItemDisablePositioning)
		Utility.SetINIFloat("fInventory3DItemPosXWide:Interface", _fInventory3DItemPosXWide)
		Utility.SetINIFloat("fInventory3DItemPosX:Interface", _fInventory3DItemPosX)
		Utility.SetINIFloat("fMagic3DItemPosXWide:Interface", _fMagic3DItemPosXWide)
		Utility.SetINIFloat("fMagic3DItemPosX:Interface", _fMagic3DItemPosX)
	else
		Utility.SetINIFloat("fInventory3DItemPosXWide:Interface", (_itemXBaseW + _3DItemXOffset))
		Utility.SetINIFloat("fInventory3DItemPosX:Interface", (_itemXBase + _3DItemXOffset))
		Utility.SetINIFloat("fMagic3DItemPosXWide:Interface", (_itemXBaseW + _3DItemXOffset))
		Utility.SetINIFloat("fMagic3DItemPosX:Interface", (_itemXBase + _3DItemXOffset))
	endIf
endFunction

function Apply3DItemYOffset()
	; Negative values shift the 3D item to the bottom
	if (_3DItemDisablePositioning)
		Utility.SetINIFloat("fInventory3DItemPosZWide:Interface", _fInventory3DItemPosZWide)
		Utility.SetINIFloat("fInventory3DItemPosZ:Interface", _fInventory3DItemPosZ)
		Utility.SetINIFloat("fMagic3DItemPosZWide:Interface", _fMagic3DItemPosZWide)
		Utility.SetINIFloat("fMagic3DItemPosZ:Interface", _fMagic3DItemPosZ)
	else
		Utility.SetINIFloat("fInventory3DItemPosZWide:Interface", (12 + _3DItemYOffset))
		Utility.SetINIFloat("fInventory3DItemPosZ:Interface", (16 + _3DItemYOffset))
		Utility.SetINIFloat("fMagic3DItemPosZWide:Interface", (12 + _3DItemYOffset))
		Utility.SetINIFloat("fMagic3DItemPosZ:Interface", (16 + _3DItemYOffset))
	endIf
endFunction

function Apply3DItemScale()
	if (_3DItemDisablePositioning)
		Utility.SetINIFloat("fInventory3DItemPosScaleWide:Interface", _fInventory3DItemPosScaleWide)
		Utility.SetINIFloat("fMagic3DItemPosScaleWide:Interface", _fMagic3DItemPosScaleWide)
		Utility.SetINIFloat("fInventory3DItemPosScale:Interface", _fInventory3DItemPosScale)
		Utility.SetINIFloat("fMagic3DItemPosScale:Interface", _fMagic3DItemPosScale)
	else
		Utility.SetINIFloat("fInventory3DItemPosScaleWide:Interface", _3DItemScale)
		Utility.SetINIFloat("fMagic3DItemPosScaleWide:Interface", _3DItemScale)
		Utility.SetINIFloat("fInventory3DItemPosScale:Interface", _3DItemScale)
		Utility.SetINIFloat("fMagic3DItemPosScale:Interface", _3DItemScale)
	endIf
endFunction

bool function ValidateKey(int a_keyCode, bool a_gamepad)
	; Do nothing for ESC
	if (a_keyCode == 1)
		return false
	endIf

	bool isGamepad = Game.UsingGamepad()

	if (isGamepad != a_gamepad)
		return false
	endIf

	if (!isGamepad)
		; Can't detect for mouse, don't need for gamepad
		if (a_keyCode > 255)
			ShowMessage("$SKI_MSG1", false, "$OK")
			return false
		endIf
	else
		; If you removed the gamepad while in this menu, ignore other keys
		if (a_keyCode < 266)
			return false
		endIf
	endIf

	return true
endFunction

function SwapItemListKey(int a_newKey, int a_curKey)
	if (a_newKey == _searchKey)
		_searchKey = a_curKey
		SetKeyMapOptionValueST(_searchKey, true, "SEARCH_KEY")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$search", _searchKey)
	elseIf (a_newKey == _switchTabKey)
		_switchTabKey = a_curKey
		SetKeyMapOptionValueST(_switchTabKey, true, "SWITCH_TAB_KEY")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$switchTab", _switchTabKey)
	elseIf (a_newKey == _equipModeKey)
		_equipModeKey = a_curKey
		SetKeyMapOptionValueST(_equipModeKey, true, "EQUIP_MODE_KEY")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$pc$equipMode", _equipModeKey)

	elseIf (a_newKey == _switchTabButton)
		_switchTabButton = a_curKey
		SetKeyMapOptionValueST(_switchTabButton, true, "SWITCH_TAB_BUTTON")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$switchTab", _switchTabButton)
	elseIf (a_newKey == _prevColumnButton)
		_prevColumnButton = a_curKey
		SetKeyMapOptionValueST(_prevColumnButton, true, "PREV_COLUMN_BUTTON")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$prevColumn", _prevColumnButton)
	elseIf (a_newKey == _nextColumnButton)
		_nextColumnButton = a_curKey
		SetKeyMapOptionValueST(_nextColumnButton, true, "NEXT_COLUMN_BUTTON")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$nextColumn", _nextColumnButton)
	elseIf (a_newKey == _sortOrderButton)
		_sortOrderButton = a_curKey
		SetKeyMapOptionValueST(_sortOrderButton, true, "SORT_ORDER_BUTTON")
		SKI_SettingsManagerInstance.SetOverride("Input$controls$gamepad$sortOrder", _sortOrderButton)
	endIf
endFunction

function SetCurrentFavoriteGroup(int a_index)
	int ARMOR_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_ARMOR
	int HANDS_FLAG = SKI_FavoritesManagerInstance.GROUP_FLAG_UNEQUIP_HANDS

	SetToggleOptionValueST(SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, ARMOR_FLAG), true, "FAV_GROUP_UNEQUIP_ARMOR")
	SetToggleOptionValueST(SKI_FavoritesManagerInstance.GetGroupFlag(_favCurGroupIdx, HANDS_FLAG), true, "FAV_GROUP_UNEQUIP_HANDS")
endFunction

function SetFavoritesGroupHotkey(int a_groupIndex, int a_keyCode, string a_conflictControl = "", string a_conflictName = "")

	bool continue = true

	if (a_conflictControl != "" && a_conflictName != ModName)
		string msg

		if (a_conflictName != "")
			msg = "$SKI_MSG2{" + a_conflictControl + " (" + a_conflictName + ")}"
		else
			msg = "$SKI_MSG2{" + a_conflictControl + "}"
		endIf

		continue = ShowMessage(msg, true, "$Yes", "$No")
	endIf

	if (!continue)
		return
	endIf

	if (!SKI_FavoritesManagerInstance.SetGroupHotkey(a_groupIndex, a_keyCode))
		return
	endIf

	; Update
	int[] groupHotkeys = SKI_FavoritesManagerInstance.GetGroupHotkeys()
	SetKeyMapOptionValueST(groupHotkeys[0], true, "FAV_GROUP_USE_HOTKEY1")
	SetKeyMapOptionValueST(groupHotkeys[1], true, "FAV_GROUP_USE_HOTKEY2")
	SetKeyMapOptionValueST(groupHotkeys[2], true, "FAV_GROUP_USE_HOTKEY3")
	SetKeyMapOptionValueST(groupHotkeys[3], true, "FAV_GROUP_USE_HOTKEY4")
	SetKeyMapOptionValueST(groupHotkeys[4], true, "FAV_GROUP_USE_HOTKEY5")
	SetKeyMapOptionValueST(groupHotkeys[5], true, "FAV_GROUP_USE_HOTKEY6")
	SetKeyMapOptionValueST(groupHotkeys[6], true, "FAV_GROUP_USE_HOTKEY7")
	SetKeyMapOptionValueST(groupHotkeys[7], false, "FAV_GROUP_USE_HOTKEY8")
endFunction

function RefreshFavoriteHotkeys()
	SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.GroupAddKey, true, "FAV_GROUP_ADD_KEY")
	SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.GroupUseKey, true, "FAV_GROUP_USE_KEY")
	SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.SetIconKey, true, "FAV_SET_ICON_KEY")
	SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.ToggleFocusKey, true, "FAV_TOGGLE_FOCUS")
	SetKeyMapOptionValueST(SKI_FavoritesManagerInstance.SaveEquipStateKey, false, "FAV_EQUIP_STATE_KEY")
endFunction

function AddEnderalIcons()
	_categoryIconThemeShortNames = new String[5]
	_categoryIconThemeShortNames[0] = "ENDERAL"
	_categoryIconThemeShortNames[1] = "CELTIC"
	_categoryIconThemeShortNames[2] = "CURVED"
	_categoryIconThemeShortNames[3] = "STRAIGHT"
	_categoryIconThemeShortNames[4] = "SKYUI V5"
	_categoryIconThemeLongNames = new String[5]
	_categoryIconThemeLongNames[0] = "Enderal"
	_categoryIconThemeLongNames[1] = "Celtic, by GreatClone"
	_categoryIconThemeLongNames[2] = "Curved, by T3T"
	_categoryIconThemeLongNames[3] = "Straight, by T3T"
	_categoryIconThemeLongNames[4] = "SkyUI V5, by PsychoSteve"
	_categoryIconThemeValues = new String[5]
	_categoryIconThemeValues[0] = "skyui\\icons_category_enderal.swf"
	_categoryIconThemeValues[1] = "skyui\\icons_category_celtic.swf"
	_categoryIconThemeValues[2] = "skyui\\icons_category_curved.swf"
	_categoryIconThemeValues[3] = "skyui\\icons_category_straight.swf"
	_categoryIconThemeValues[4] = "skyui\\icons_category_psychosteve.swf"

	_categoryIconThemeIdx = 0
	SKI_SettingsManagerInstance.ClearOverride("Appearance$icons$category$source")
	SKI_SettingsManagerInstance.SetOverride("Appearance$icons$category$source", _categoryIconThemeValues[_categoryIconThemeIdx])
endFunction


; REMOVED DATA  -----------------------------------------------------------------------------------

; -- Version 1 --							; (remove version)

; int		_itemlistFontSizeOID_T			; (4)
; int		_itemlistQuantityMinCountOID_S	; (4)
; int		_itemcardAlignOID_T				; (4)
; int		_itemcardXOffsetOID_S			; (4)
; int		_itemcardYOffsetOID_S			; (4)
; int		_3DItemXOffsetOID_S				; (4)
; int		_3DItemYOffsetOID_S				; (4)
; int		_3DItemScaleOID_S				; (4)
; int		_checkInventoryMenuOID_B		; (4)
; int		_checkMagicMenuOID_B			; (4)
; int		_checkBarterMenuOID_B			; (4)
; int		_checkContainerMenuOID_B		; (4)
; int		_checkGiftMenuOID_B				; (4)
; int		_searchKeyOID_K					; (4)
; int		_switchTabKeyOID_K				; (4)
; int		_equipModeKeyOID_K				; (4)

; -- Version 2 --

; int		_itemlistCategoryIconThemeOID_M	; (4)
; int		_itemlistNoIconColorsOID_B 		; (4)
; int		_switchTabButtonOID_K 			; (4)
; int		_prevColumnButtonOID_K 			; (4)
; int		_nextColumnButtonOID_K 			; (4)
; int		_sortOrderButtonOID_K 			; (4)

; -- Version 3 --

; int		_3DItemDisablePositioningOID_B	; (4)