Quantcast
--[[--------------------------------------------------------------------
    Copyright (C) 2011, 2012 Sidoine De Wispelaere.
    Copyright (C) 2012, 2013, 2014 Johnny C. Lam.
    See the file LICENSE.txt for copying permission.
--]]--------------------------------------------------------------------

local OVALE, Ovale = ...
local OvaleEquipment = Ovale:NewModule("OvaleEquipment", "AceEvent-3.0")
Ovale.OvaleEquipment = OvaleEquipment

--<private-static-properties>
local OvaleProfiler = Ovale.OvaleProfiler

local pairs = pairs
local strgsub = string.gsub
local strmatch = string.match
local tonumber = tonumber
local tostring = tostring
local type = type
local wipe = wipe

local API_CreateFrame = CreateFrame
local API_GetAuctionItemSubClasses = GetAuctionItemSubClasses
local API_GetInventoryItemID = GetInventoryItemID
local API_GetInventoryItemGems = GetInventoryItemGems
local API_GetItemInfo = GetItemInfo
local API_UnitClass = UnitClass
local INVSLOT_AMMO = INVSLOT_AMMO
local INVSLOT_BACK = INVSLOT_BACK
local INVSLOT_BODY = INVSLOT_BODY
local INVSLOT_CHEST = INVSLOT_CHEST
local INVSLOT_FEET = INVSLOT_FEET
local INVSLOT_FINGER1 = INVSLOT_FINGER1
local INVSLOT_FINGER2 = INVSLOT_FINGER2
local INVSLOT_FIRST_EQUIPPED = INVSLOT_FIRST_EQUIPPED
local INVSLOT_HAND = INVSLOT_HAND
local INVSLOT_HEAD = INVSLOT_HEAD
local INVSLOT_LAST_EQUIPPED = INVSLOT_LAST_EQUIPPED
local INVSLOT_LEGS = INVSLOT_LEGS
local INVSLOT_MAINHAND = INVSLOT_MAINHAND
local INVSLOT_NECK = INVSLOT_NECK
local INVSLOT_OFFHAND = INVSLOT_OFFHAND
local INVSLOT_RANGED = INVSLOT_RANGED
local INVSLOT_SHOULDER = INVSLOT_SHOULDER
local INVSLOT_TABARD = INVSLOT_TABARD
local INVSLOT_TRINKET1 = INVSLOT_TRINKET1
local INVSLOT_TRINKET2 = INVSLOT_TRINKET2
local INVSLOT_WAIST = INVSLOT_WAIST
local INVSLOT_WRIST = INVSLOT_WRIST

-- Register for profiling.
OvaleProfiler:RegisterProfiling(OvaleEquipment)

-- Player's class.
local _, self_class = API_UnitClass("player")

-- Frame for tooltip-scanning.
local self_tooltip = nil
local OVALE_ITEM_LEVEL_PATTERN = "^" .. strgsub(ITEM_LEVEL, "%%d", "(%%d+)")

-- equipment slot names
local OVALE_SLOTNAME = {
	AmmoSlot = INVSLOT_AMMO,
	BackSlot = INVSLOT_BACK,
	ChestSlot = INVSLOT_CHEST,
	FeetSlot = INVSLOT_FEET,
	Finger0Slot = INVSLOT_FINGER1,
	Finger1Slot = INVSLOT_FINGER2,
	HandsSlot = INVSLOT_HAND,
	HeadSlot = INVSLOT_HEAD,
	LegsSlot = INVSLOT_LEGS,
	MainHandSlot = INVSLOT_MAINHAND,
	NeckSlot = INVSLOT_NECK,
	SecondaryHandSlot = INVSLOT_OFFHAND,
	ShirtSlot = INVSLOT_BODY,
	ShoulderSlot = INVSLOT_SHOULDER,
	TabardSlot = INVSLOT_TABARD,
	Trinket0Slot = INVSLOT_TRINKET1,
	Trinket1Slot = INVSLOT_TRINKET2,
	WaistSlot = INVSLOT_WAIST,
	WristSlot = INVSLOT_WRIST,
}
-- slots that can contain pieces from armor sets
local OVALE_ARMORSET_SLOT_IDS = { INVSLOT_CHEST, INVSLOT_HAND, INVSLOT_HEAD, INVSLOT_LEGS, INVSLOT_SHOULDER }
-- database of armor set items: OVALE_ARMORSET[itemId] = armorSetName
local OVALE_ARMORSET = {
	-- Death Knight
	[ 85314] = "T14_tank",	[ 85315] = "T14_tank",	[ 85316] = "T14_tank",	[ 85317] = "T14_tank",	[ 85318] = "T14_tank",
	[ 86654] = "T14_tank",	[ 86655] = "T14_tank",	[ 86656] = "T14_tank",	[ 86657] = "T14_tank",	[ 86658] = "T14_tank",
	[ 86918] = "T14_tank",	[ 86919] = "T14_tank",	[ 86920] = "T14_tank",	[ 86921] = "T14_tank",	[ 86922] = "T14_tank",
	[ 95225] = "T15_melee",	[ 95226] = "T15_melee",	[ 95227] = "T15_melee",	[ 95228] = "T15_melee",	[ 95229] = "T15_melee",
	[ 95230] = "T15_tank",	[ 95231] = "T15_tank",	[ 95232] = "T15_tank",	[ 95233] = "T15_tank",	[ 95234] = "T15_tank",
	[ 95825] = "T15_melee",	[ 95826] = "T15_melee",	[ 95827] = "T15_melee",	[ 95828] = "T15_melee",	[ 95829] = "T15_melee",
	[ 95830] = "T15_tank",	[ 95831] = "T15_tank",	[ 95832] = "T15_tank",	[ 95833] = "T15_tank",	[ 95834] = "T15_tank",
	[ 96569] = "T15_melee",	[ 96570] = "T15_melee",	[ 96571] = "T15_melee",	[ 96572] = "T15_melee",	[ 96573] = "T15_melee",
	[ 96574] = "T15_tank",	[ 96575] = "T15_tank",	[ 96576] = "T15_tank",	[ 96577] = "T15_tank",	[ 96578] = "T15_tank",
	[ 99039] = "T16_tank",	[ 99040] = "T16_tank",	[ 99048] = "T16_tank",	[ 99049] = "T16_tank",	[ 99060] = "T16_tank",
	[ 99057] = "T16_melee",	[ 99058] = "T16_melee",	[ 99059] = "T16_melee",	[ 99066] = "T16_melee",	[ 99067] = "T16_melee",
	[ 99179] = "T16_tank",	[ 99188] = "T16_tank",	[ 99189] = "T16_tank",	[ 99190] = "T16_tank",	[ 99191] = "T16_tank",
	[ 99186] = "T16_melee",	[ 99187] = "T16_melee",	[ 99192] = "T16_melee",	[ 99193] = "T16_melee",	[ 99194] = "T16_melee",
	[ 99323] = "T16_tank",	[ 99324] = "T16_tank",	[ 99325] = "T16_tank",	[ 99330] = "T16_tank",	[ 99331] = "T16_tank",
	[ 99335] = "T16_melee",	[ 99336] = "T16_melee",	[ 99337] = "T16_melee",	[ 99338] = "T16_melee",	[ 99339] = "T16_melee",
	[ 99564] = "T16_tank",	[ 99604] = "T16_tank",	[ 99605] = "T16_tank",	[ 99640] = "T16_tank",	[ 99652] = "T16_tank",
	[ 99571] = "T16_melee",	[ 99572] = "T16_melee",	[ 99608] = "T16_melee",	[ 99609] = "T16_melee",	[ 99639] = "T16_melee",
	[115535] = "T17",		[115536] = "T17",		[115537] = "T17",		[115538] = "T17",		[115539] = "T17",
	-- Druid
	[ 85304] = "T14_caster",[ 85305] = "T14_caster",[ 85306] = "T14_caster",[ 85307] = "T14_caster",[ 85308] = "T14_caster",
	[ 85309] = "T14_melee",	[ 85310] = "T14_melee",	[ 85311] = "T14_melee",	[ 85312] = "T14_melee",	[ 85313] = "T14_melee",
	[ 85354] = "T14_heal",	[ 85355] = "T14_heal",	[ 85356] = "T14_heal",	[ 85357] = "T14_heal",	[ 85358] = "T14_heal",
	[ 85379] = "T14_tank",	[ 85380] = "T14_tank",	[ 85381] = "T14_tank",	[ 85382] = "T14_tank",	[ 85383] = "T14_tank",
	[ 86644] = "T14_caster",[ 86645] = "T14_caster",[ 86646] = "T14_caster",[ 86647] = "T14_caster",[ 86648] = "T14_caster",
	[ 86649] = "T14_melee",	[ 86650] = "T14_melee",	[ 86651] = "T14_melee",	[ 86652] = "T14_melee",	[ 86653] = "T14_melee",
	[ 86694] = "T14_heal",	[ 86695] = "T14_heal",	[ 86696] = "T14_heal",	[ 86697] = "T14_heal",	[ 86698] = "T14_heal",
	[ 86719] = "T14_tank",	[ 86720] = "T14_tank",	[ 86721] = "T14_tank",	[ 86722] = "T14_tank",	[ 86723] = "T14_tank",
	[ 86923] = "T14_melee",	[ 86924] = "T14_melee",	[ 86925] = "T14_melee",	[ 86926] = "T14_melee",	[ 86927] = "T14_melee",
	[ 86928] = "T14_heal",	[ 86929] = "T14_heal",	[ 86930] = "T14_heal",	[ 86931] = "T14_heal",	[ 86932] = "T14_heal",
	[ 86933] = "T14_caster",[ 86934] = "T14_caster",[ 86935] = "T14_caster",[ 86936] = "T14_caster",[ 86937] = "T14_caster",
	[ 86938] = "T14_tank",	[ 86939] = "T14_tank",	[ 86940] = "T14_tank",	[ 86941] = "T14_tank",	[ 86942] = "T14_tank",
	[ 95235] = "T15_melee",	[ 95236] = "T15_melee",	[ 95237] = "T15_melee",	[ 95238] = "T15_melee",	[ 95239] = "T15_melee",
	[ 95245] = "T15_caster",[ 95246] = "T15_caster",[ 95247] = "T15_caster",[ 95248] = "T15_caster",[ 95249] = "T15_caster",
	[ 95250] = "T15_tank",	[ 95251] = "T15_tank",	[ 95252] = "T15_tank",	[ 95253] = "T15_tank",	[ 95254] = "T15_tank",
	[ 95835] = "T15_melee",	[ 95836] = "T15_melee",	[ 95837] = "T15_melee",	[ 95838] = "T15_melee",	[ 95839] = "T15_melee",
	[ 95845] = "T15_caster",[ 95846] = "T15_caster",[ 95847] = "T15_caster",[ 95848] = "T15_caster",[ 95849] = "T15_caster",
	[ 95850] = "T15_tank",	[ 95851] = "T15_tank",	[ 95852] = "T15_tank",	[ 95853] = "T15_tank",	[ 95854] = "T15_tank",
	[ 96579] = "T15_melee",	[ 96580] = "T15_melee",	[ 96581] = "T15_melee",	[ 96582] = "T15_melee",	[ 96583] = "T15_melee",
	[ 96589] = "T15_caster",[ 96590] = "T15_caster",[ 96591] = "T15_caster",[ 96592] = "T15_caster",[ 96593] = "T15_caster",
	[ 96594] = "T15_tank",	[ 96595] = "T15_tank",	[ 96596] = "T15_tank",	[ 96597] = "T15_tank",	[ 96598] = "T15_tank",
	[ 98978] = "T16_tank",	[ 98981] = "T16_tank",	[ 98999] = "T16_tank",	[ 99000] = "T16_tank",	[ 99001] = "T16_tank",
	[ 98994] = "T16_caster",[ 98995] = "T16_caster",[ 98996] = "T16_caster",[ 98997] = "T16_caster",[ 98998] = "T16_caster",
	[ 99012] = "T16_heal",	[ 99013] = "T16_heal",	[ 99014] = "T16_heal",	[ 99015] = "T16_heal",	[ 99016] = "T16_heal",
	[ 99022] = "T16_melee",	[ 99041] = "T16_melee",	[ 99042] = "T16_melee",	[ 99043] = "T16_melee",	[ 99044] = "T16_melee",
	[ 99163] = "T16_tank",	[ 99164] = "T16_tank",	[ 99165] = "T16_tank",	[ 99166] = "T16_tank",	[ 99170] = "T16_tank",
	[ 99169] = "T16_caster",[ 99174] = "T16_caster",[ 99175] = "T16_caster",[ 99176] = "T16_caster",[ 99177] = "T16_caster",
	[ 99171] = "T16_heal",	[ 99172] = "T16_heal",	[ 99173] = "T16_heal",	[ 99178] = "T16_heal",	[ 99185] = "T16_heal",
	[ 99180] = "T16_melee",	[ 99181] = "T16_melee",	[ 99182] = "T16_melee",	[ 99183] = "T16_melee",	[ 99184] = "T16_melee",
	[ 99322] = "T16_melee",	[ 99326] = "T16_melee",	[ 99327] = "T16_melee",	[ 99328] = "T16_melee",	[ 99329] = "T16_melee",
	[ 99419] = "T16_tank",	[ 99420] = "T16_tank",	[ 99421] = "T16_tank",	[ 99422] = "T16_tank",	[ 99423] = "T16_tank",
	[ 99427] = "T16_caster",[ 99428] = "T16_caster",[ 99432] = "T16_caster",[ 99433] = "T16_caster",[ 99434] = "T16_caster",
	[ 99429] = "T16_heal",	[ 99430] = "T16_heal",	[ 99431] = "T16_heal",	[ 99435] = "T16_heal",	[ 99436] = "T16_heal",
	[ 99581] = "T16_heal",	[ 99582] = "T16_heal",	[ 99583] = "T16_heal",	[ 99637] = "T16_heal",	[ 99638] = "T16_heal",
	[ 99589] = "T16_melee",	[ 99599] = "T16_melee",	[ 99600] = "T16_melee",	[ 99632] = "T16_melee",	[ 99633] = "T16_melee",
	[ 99610] = "T16_tank",	[ 99622] = "T16_tank",	[ 99623] = "T16_tank",	[ 99624] = "T16_tank",	[ 99664] = "T16_tank",
	[ 99617] = "T16_caster",[ 99618] = "T16_caster",[ 99619] = "T16_caster",[ 99620] = "T16_caster",[ 99621] = "T16_caster",
	[115540] = "T17",		[115541] = "T17",		[115542] = "T17",		[115543] = "T17",		[115544] = "T17",
	-- Hunter
	[ 85294] = "T14_melee",	[ 85295] = "T14_melee",	[ 85296] = "T14_melee",	[ 85297] = "T14_melee",	[ 85298] = "T14_melee",
	[ 86634] = "T14_melee",	[ 86635] = "T14_melee",	[ 86636] = "T14_melee",	[ 86637] = "T14_melee",	[ 86638] = "T14_melee",
	[ 87002] = "T14_melee",	[ 87003] = "T14_melee",	[ 87004] = "T14_melee",	[ 87005] = "T14_melee",	[ 87006] = "T14_melee",
	[ 95255] = "T15_melee",	[ 95256] = "T15_melee",	[ 95257] = "T15_melee",	[ 95258] = "T15_melee",	[ 95259] = "T15_melee",
	[ 95882] = "T15_melee",	[ 95883] = "T15_melee",	[ 95884] = "T15_melee",	[ 95885] = "T15_melee",	[ 95886] = "T15_melee",
	[ 96626] = "T15_melee",	[ 96627] = "T15_melee",	[ 96628] = "T15_melee",	[ 96629] = "T15_melee",	[ 96630] = "T15_melee",
	[ 99080] = "T16_melee",	[ 99081] = "T16_melee",	[ 99082] = "T16_melee",	[ 99085] = "T16_melee",	[ 99086] = "T16_melee",
	[ 99157] = "T16_melee",	[ 99158] = "T16_melee",	[ 99159] = "T16_melee",	[ 99167] = "T16_melee",	[ 99168] = "T16_melee",
	[ 99402] = "T16_melee",	[ 99403] = "T16_melee",	[ 99404] = "T16_melee",	[ 99405] = "T16_melee",	[ 99406] = "T16_melee",
	[ 99573] = "T16_melee",	[ 99574] = "T16_melee",	[ 99577] = "T16_melee",	[ 99578] = "T16_melee",	[ 99660] = "T16_melee",
	[115545] = "T17",		[115546] = "T17",		[115547] = "T17",		[115548] = "T17",		[115549] = "T17",
	-- Mage
	[ 85374] = "T14_caster",[ 85375] = "T14_caster",[ 85376] = "T14_caster",[ 85377] = "T14_caster",[ 85378] = "T14_caster",
	[ 86714] = "T14_caster",[ 86715] = "T14_caster",[ 86716] = "T14_caster",[ 86717] = "T14_caster",[ 86718] = "T14_caster",
	[ 87007] = "T14_caster",[ 87008] = "T14_caster",[ 87009] = "T14_caster",[ 87010] = "T14_caster",[ 87011] = "T14_caster",
	[ 95260] = "T15_caster",[ 95261] = "T15_caster",[ 95262] = "T15_caster",[ 95263] = "T15_caster",[ 95264] = "T15_caster",
	[ 95890] = "T15_caster",[ 95891] = "T15_caster",[ 95892] = "T15_caster",[ 95893] = "T15_caster",[ 95894] = "T15_caster",
	[ 96634] = "T15_caster",[ 96635] = "T15_caster",[ 96636] = "T15_caster",[ 96637] = "T15_caster",[ 96638] = "T15_caster",
	[ 99077] = "T16_caster",[ 99078] = "T16_caster",[ 99079] = "T16_caster",[ 99083] = "T16_caster",[ 99084] = "T16_caster",
	[ 99152] = "T16_caster",[ 99153] = "T16_caster",[ 99160] = "T16_caster",[ 99161] = "T16_caster",[ 99162] = "T16_caster",
	[ 99397] = "T16_caster",[ 99398] = "T16_caster",[ 99399] = "T16_caster",[ 99400] = "T16_caster",[ 99401] = "T16_caster",
	[ 99575] = "T16_caster",[ 99576] = "T16_caster",[ 99657] = "T16_caster",[ 99658] = "T16_caster",[ 99659] = "T16_caster",
	[115550] = "T17",		[115551] = "T17",		[115552] = "T17",		[115553] = "T17",		[115554] = "T17",
	-- Monk
	[ 85394] = "T14_melee",	[ 85395] = "T14_melee",	[ 85396] = "T14_melee",	[ 85397] = "T14_melee",	[ 85398] = "T14_melee",
	[ 86734] = "T14_melee",	[ 86735] = "T14_melee",	[ 86736] = "T14_melee",	[ 86737] = "T14_melee",	[ 86738] = "T14_melee",
	[ 87084] = "T14_melee",	[ 87085] = "T14_melee",	[ 87086] = "T14_melee",	[ 87087] = "T14_melee",	[ 87088] = "T14_melee",
	[ 95270] = "T15_heal",	[ 95271] = "T15_heal",	[ 95272] = "T15_heal",	[ 95273] = "T15_heal",	[ 95274] = "T15_heal",
	[ 95275] = "T15_tank",	[ 95276] = "T15_tank",	[ 95277] = "T15_tank",	[ 95278] = "T15_tank",	[ 95279] = "T15_tank",
	[ 95900] = "T15_heal",	[ 95901] = "T15_heal",	[ 95902] = "T15_heal",	[ 95903] = "T15_heal",	[ 95904] = "T15_heal",
	[ 95905] = "T15_tank",	[ 95906] = "T15_tank",	[ 95907] = "T15_tank",	[ 95908] = "T15_tank",	[ 95909] = "T15_tank",
	[ 96644] = "T15_heal",	[ 96645] = "T15_heal",	[ 96646] = "T15_heal",	[ 96647] = "T15_heal",	[ 96648] = "T15_heal",
	[ 96649] = "T15_tank",	[ 96650] = "T15_tank",	[ 96651] = "T15_tank",	[ 96652] = "T15_tank",	[ 96653] = "T15_tank",
	[ 99050] = "T16_tank",	[ 99051] = "T16_tank",	[ 99063] = "T16_tank",	[ 99064] = "T16_tank",	[ 99065] = "T16_tank",
	[ 99061] = "T16_heal",	[ 99062] = "T16_heal",	[ 99068] = "T16_heal",	[ 99069] = "T16_heal",	[ 99070] = "T16_heal",
	[ 99071] = "T16_melee",	[ 99072] = "T16_melee",	[ 99073] = "T16_melee",	[ 99074] = "T16_melee",	[ 99075] = "T16_melee",
	[ 99140] = "T16_tank",	[ 99141] = "T16_tank",	[ 99142] = "T16_tank",	[ 99143] = "T16_tank",	[ 99144] = "T16_tank",
	[ 99145] = "T16_melee",	[ 99146] = "T16_melee",	[ 99154] = "T16_melee",	[ 99155] = "T16_melee",	[ 99156] = "T16_melee",
	[ 99147] = "T16_heal",	[ 99148] = "T16_heal",	[ 99149] = "T16_heal",	[ 99150] = "T16_heal",	[ 99151] = "T16_heal",
	[ 99381] = "T16_heal",	[ 99388] = "T16_heal",	[ 99389] = "T16_heal",	[ 99390] = "T16_heal",	[ 99391] = "T16_heal",
	[ 99382] = "T16_tank",	[ 99383] = "T16_tank",	[ 99384] = "T16_tank",	[ 99385] = "T16_tank",	[ 99386] = "T16_tank",
	[ 99392] = "T16_melee",	[ 99393] = "T16_melee",	[ 99394] = "T16_melee",	[ 99395] = "T16_melee",	[ 99396] = "T16_melee",
	[ 99552] = "T16_heal",	[ 99553] = "T16_heal",	[ 99554] = "T16_heal",	[ 99641] = "T16_heal",	[ 99642] = "T16_heal",
	[ 99555] = "T16_melee",	[ 99556] = "T16_melee",	[ 99653] = "T16_melee",	[ 99654] = "T16_melee",	[ 99655] = "T16_melee",
	[ 99565] = "T16_tank",	[ 99606] = "T16_tank",	[ 99607] = "T16_tank",	[ 99643] = "T16_tank",	[ 99644] = "T16_tank",
	[115555] = "T17",		[115556] = "T17",		[115557] = "T17",		[115558] = "T17",		[115559] = "T17",
	-- Paladin
	[ 85319] = "T14_tank",	[ 85320] = "T14_tank",	[ 85321] = "T14_tank",	[ 85322] = "T14_tank",	[ 85323] = "T14_tank",
	[ 85339] = "T14_melee",	[ 85340] = "T14_melee",	[ 85341] = "T14_melee",	[ 85342] = "T14_melee",	[ 85343] = "T14_melee",
	[ 85344] = "T14_heal",	[ 85345] = "T14_heal",	[ 85346] = "T14_heal",	[ 85347] = "T14_heal",	[ 85348] = "T14_heal",
	[ 86659] = "T14_tank",	[ 86660] = "T14_tank",	[ 86661] = "T14_tank",	[ 86662] = "T14_tank",	[ 86663] = "T14_tank",
	[ 86679] = "T14_melee",	[ 86680] = "T14_melee",	[ 86681] = "T14_melee",	[ 86682] = "T14_melee",	[ 86683] = "T14_melee",
	[ 86684] = "T14_heal",	[ 86685] = "T14_heal",	[ 86686] = "T14_heal",	[ 86687] = "T14_heal",	[ 86688] = "T14_heal",
	[ 87099] = "T14_melee",	[ 87100] = "T14_melee",	[ 87101] = "T14_melee",	[ 87102] = "T14_melee",	[ 87103] = "T14_melee",
	[ 87104] = "T14_heal",	[ 87105] = "T14_heal",	[ 87106] = "T14_heal",	[ 87107] = "T14_heal",	[ 87108] = "T14_heal",
	[ 87109] = "T14_tank",	[ 87110] = "T14_tank",	[ 87111] = "T14_tank",	[ 87112] = "T14_tank",	[ 87113] = "T14_tank",
	[ 95280] = "T15_melee",	[ 95281] = "T15_melee",	[ 95282] = "T15_melee",	[ 95283] = "T15_melee",	[ 95284] = "T15_melee",
	[ 95290] = "T15_tank",	[ 95291] = "T15_tank",	[ 95292] = "T15_tank",	[ 95293] = "T15_tank",	[ 95294] = "T15_tank",
	[ 95910] = "T15_melee",	[ 95911] = "T15_melee",	[ 95912] = "T15_melee",	[ 95913] = "T15_melee",	[ 95914] = "T15_melee",
	[ 95920] = "T15_tank",	[ 95921] = "T15_tank",	[ 95922] = "T15_tank",	[ 95923] = "T15_tank",	[ 95924] = "T15_tank",
	[ 96654] = "T15_melee",	[ 96655] = "T15_melee",	[ 96656] = "T15_melee",	[ 96657] = "T15_melee",	[ 96658] = "T15_melee",
	[ 96664] = "T15_tank",	[ 96665] = "T15_tank",	[ 96666] = "T15_tank",	[ 96667] = "T15_tank",	[ 96668] = "T15_tank",
	[ 98979] = "T16_heal",	[ 98980] = "T16_heal",	[ 98982] = "T16_heal",	[ 99003] = "T16_heal",	[ 99076] = "T16_heal",
	[ 98985] = "T16_melee",	[ 98986] = "T16_melee",	[ 98987] = "T16_melee",	[ 99002] = "T16_melee",	[ 99052] = "T16_melee",
	[ 99026] = "T16_tank",	[ 99027] = "T16_tank",	[ 99028] = "T16_tank",	[ 99029] = "T16_tank",	[ 99031] = "T16_tank",
	[ 99124] = "T16_heal",	[ 99125] = "T16_heal",	[ 99133] = "T16_heal",	[ 99134] = "T16_heal",	[ 99135] = "T16_heal",
	[ 99126] = "T16_tank",	[ 99127] = "T16_tank",	[ 99128] = "T16_tank",	[ 99129] = "T16_tank",	[ 99130] = "T16_tank",
	[ 99132] = "T16_melee",	[ 99136] = "T16_melee",	[ 99137] = "T16_melee",	[ 99138] = "T16_melee",	[ 99139] = "T16_melee",
	[ 99364] = "T16_tank",	[ 99368] = "T16_tank",	[ 99369] = "T16_tank",	[ 99370] = "T16_tank",	[ 99371] = "T16_tank",
	[ 99372] = "T16_melee",	[ 99373] = "T16_melee",	[ 99379] = "T16_melee",	[ 99380] = "T16_melee",	[ 99387] = "T16_melee",
	[ 99374] = "T16_heal",	[ 99375] = "T16_heal",	[ 99376] = "T16_heal",	[ 99377] = "T16_heal",	[ 99378] = "T16_heal",
	[ 99566] = "T16_melee",	[ 99625] = "T16_melee",	[ 99651] = "T16_melee",	[ 99661] = "T16_melee",	[ 99662] = "T16_melee",
	[ 99593] = "T16_tank",	[ 99594] = "T16_tank",	[ 99595] = "T16_tank",	[ 99596] = "T16_tank",	[ 99598] = "T16_tank",
	[ 99626] = "T16_heal",	[ 99648] = "T16_heal",	[ 99656] = "T16_heal",	[ 99665] = "T16_heal",	[ 99666] = "T16_heal",
	[115565] = "T17",		[115566] = "T17",		[115567] = "T17",		[115568] = "T17",		[115569] = "T17",
	-- Priest
	[ 85359] = "T14_heal",	[ 85360] = "T14_heal",	[ 85361] = "T14_heal",	[ 85362] = "T14_heal",	[ 85363] = "T14_heal",
	[ 85364] = "T14_caster",[ 85365] = "T14_caster",[ 85366] = "T14_caster",[ 85367] = "T14_caster",[ 85368] = "T14_caster",
	[ 86699] = "T14_heal",	[ 86700] = "T14_heal",	[ 86701] = "T14_heal",	[ 86702] = "T14_heal",	[ 86703] = "T14_heal",
	[ 86704] = "T14_caster",[ 86705] = "T14_caster",[ 86706] = "T14_caster",[ 86707] = "T14_caster",[ 86708] = "T14_caster",
	[ 87114] = "T14_heal",	[ 87115] = "T14_heal",	[ 87116] = "T14_heal",	[ 87117] = "T14_heal",	[ 87118] = "T14_heal",
	[ 87119] = "T14_caster",[ 87120] = "T14_caster",[ 87121] = "T14_caster",[ 87122] = "T14_caster",[ 87123] = "T14_caster",
	[ 99004] = "T16_caster",[ 99005] = "T16_caster",[ 99019] = "T16_caster",[ 99020] = "T16_caster",[ 99021] = "T16_caster",
	[ 99017] = "T16_heal",	[ 99018] = "T16_heal",	[ 99023] = "T16_heal",	[ 99024] = "T16_heal",	[ 99025] = "T16_heal",
	[ 99110] = "T16_caster",[ 99111] = "T16_caster",[ 99121] = "T16_caster",[ 99122] = "T16_caster",[ 99123] = "T16_caster",
	[ 99117] = "T16_heal",	[ 99118] = "T16_heal",	[ 99119] = "T16_heal",	[ 99120] = "T16_heal",	[ 99131] = "T16_heal",
	[ 99357] = "T16_heal",	[ 99358] = "T16_heal",	[ 99365] = "T16_heal",	[ 99366] = "T16_heal",	[ 99367] = "T16_heal",
	[ 99359] = "T16_caster",[ 99360] = "T16_caster",[ 99361] = "T16_caster",[ 99362] = "T16_caster",[ 99363] = "T16_caster",
	[ 99584] = "T16_heal",	[ 99585] = "T16_heal",	[ 99590] = "T16_heal",	[ 99591] = "T16_heal",	[ 99592] = "T16_heal",
	[ 99586] = "T16_caster",[ 99587] = "T16_caster",[ 99588] = "T16_caster",[ 99627] = "T16_caster",[ 99628] = "T16_caster",
	[115560] = "T17",		[115561] = "T17",		[115562] = "T17",		[115563] = "T17",		[115564] = "T17",
	-- Rogue
	[ 85299] = "T14_melee",	[ 85300] = "T14_melee",	[ 85301] = "T14_melee",	[ 85302] = "T14_melee",	[ 85303] = "T14_melee",
	[ 86639] = "T14_melee",	[ 86640] = "T14_melee",	[ 86641] = "T14_melee",	[ 86642] = "T14_melee",	[ 86643] = "T14_melee",
	[ 87124] = "T14_melee",	[ 87125] = "T14_melee",	[ 87126] = "T14_melee",	[ 87127] = "T14_melee",	[ 87128] = "T14_melee",
	[ 95305] = "T15_melee",	[ 95306] = "T15_melee",	[ 95307] = "T15_melee",	[ 95308] = "T15_melee",	[ 95309] = "T15_melee",
	[ 95935] = "T15_melee",	[ 95936] = "T15_melee",	[ 95937] = "T15_melee",	[ 95938] = "T15_melee",	[ 95939] = "T15_melee",
	[ 96679] = "T15_melee",	[ 96680] = "T15_melee",	[ 96681] = "T15_melee",	[ 96682] = "T15_melee",	[ 96683] = "T15_melee",
	[ 99006] = "T16_melee",	[ 99007] = "T16_melee",	[ 99008] = "T16_melee",	[ 99009] = "T16_melee",	[ 99010] = "T16_melee",
	[ 99112] = "T16_melee",	[ 99113] = "T16_melee",	[ 99114] = "T16_melee",	[ 99115] = "T16_melee",	[ 99116] = "T16_melee",
	[ 99348] = "T16_melee",	[ 99349] = "T16_melee",	[ 99350] = "T16_melee",	[ 99355] = "T16_melee",	[ 99356] = "T16_melee",
	[ 99629] = "T16_melee",	[ 99630] = "T16_melee",	[ 99631] = "T16_melee",	[ 99634] = "T16_melee",	[ 99635] = "T16_melee",
	[115570] = "T17",		[115571] = "T17",		[115572] = "T17",		[115573] = "T17",		[115574] = "T17",
	-- Shaman
	[ 95315] = "T15_melee",	[ 95316] = "T15_melee",	[ 95317] = "T15_melee",	[ 95318] = "T15_melee",	[ 95319] = "T15_melee",
	[ 95320] = "T15_caster",[ 95321] = "T15_caster",[ 95322] = "T15_caster",[ 95323] = "T15_caster",[ 95324] = "T15_caster",
	[ 95945] = "T15_melee",	[ 95946] = "T15_melee",	[ 95947] = "T15_melee",	[ 95948] = "T15_melee",	[ 95949] = "T15_melee",
	[ 95950] = "T15_caster",[ 95951] = "T15_caster",[ 95952] = "T15_caster",[ 95953] = "T15_caster",[ 95954] = "T15_caster",
	[ 96689] = "T15_melee",	[ 96690] = "T15_melee",	[ 96691] = "T15_melee",	[ 96692] = "T15_melee",	[ 96693] = "T15_melee",
	[ 96694] = "T15_caster",[ 96695] = "T15_caster",[ 96696] = "T15_caster",[ 96697] = "T15_caster",[ 96698] = "T15_caster",
	[ 98922] = "T16_melee",	[ 98977] = "T16_melee",	[ 98983] = "T16_melee",	[ 98984] = "T16_melee",	[ 98993] = "T16_melee",
	[ 98988] = "T16_heal",	[ 98989] = "T16_heal",	[ 98990] = "T16_heal",	[ 98991] = "T16_heal",	[ 99011] = "T16_heal",
	[ 99087] = "T16_caster",[ 99088] = "T16_caster",[ 99089] = "T16_caster",[ 99090] = "T16_caster",[ 99091] = "T16_caster",
	[ 99092] = "T16_caster",[ 99093] = "T16_caster",[ 99094] = "T16_caster",[ 99095] = "T16_caster",[ 99106] = "T16_caster",
	[ 99099] = "T16_heal",	[ 99100] = "T16_heal",	[ 99107] = "T16_heal",	[ 99108] = "T16_heal",	[ 99109] = "T16_heal",
	[ 99101] = "T16_melee",	[ 99102] = "T16_melee",	[ 99103] = "T16_melee",	[ 99104] = "T16_melee",	[ 99105] = "T16_melee",
	[ 99332] = "T16_caster",[ 99333] = "T16_caster",[ 99334] = "T16_caster",[ 99344] = "T16_caster",[ 99345] = "T16_caster",
	[ 99340] = "T16_melee",	[ 99341] = "T16_melee",	[ 99342] = "T16_melee",	[ 99343] = "T16_melee",	[ 99347] = "T16_melee",
	[ 99346] = "T16_heal",	[ 99351] = "T16_heal",	[ 99352] = "T16_heal",	[ 99353] = "T16_heal",	[ 99354] = "T16_heal",
	[ 99579] = "T16_caster",[ 99580] = "T16_caster",[ 99645] = "T16_caster",[ 99646] = "T16_caster",[ 99647] = "T16_caster",
	[ 99611] = "T16_heal",	[ 99612] = "T16_heal",	[ 99613] = "T16_heal",	[ 99614] = "T16_heal",	[ 99636] = "T16_heal",
	[ 99615] = "T16_melee",	[ 99616] = "T16_melee",	[ 99649] = "T16_melee",	[ 99650] = "T16_melee",	[ 99663] = "T16_melee",
	[115575] = "T17",		[115576] = "T17",		[115577] = "T17",		[115578] = "T17",		[115579] = "T17",
	--Warlock
	[ 85369] = "T14_caster",[ 85370] = "T14_caster",[ 85371] = "T14_caster",[ 85372] = "T14_caster",[ 85373] = "T14_caster",
	[ 86709] = "T14_caster",[ 86710] = "T14_caster",[ 86711] = "T14_caster",[ 86712] = "T14_caster",[ 86713] = "T14_caster",
	[ 87187] = "T14_caster",[ 87188] = "T14_caster",[ 87189] = "T14_caster",[ 87190] = "T14_caster",[ 87191] = "T14_caster",
	[ 95325] = "T15_caster",[ 95326] = "T15_caster",[ 95327] = "T15_caster",[ 95328] = "T15_caster",[ 95329] = "T15_caster",
	[ 95981] = "T15_caster",[ 95982] = "T15_caster",[ 95983] = "T15_caster",[ 95984] = "T15_caster",[ 95985] = "T15_caster",
	[ 96725] = "T15_caster",[ 96726] = "T15_caster",[ 96727] = "T15_caster",[ 96728] = "T15_caster",[ 96729] = "T15_caster",
	[ 99045] = "T16_caster",[ 99053] = "T16_caster",[ 99054] = "T16_caster",[ 99055] = "T16_caster",[ 99056] = "T16_caster",
	[ 99096] = "T16_caster",[ 99097] = "T16_caster",[ 99098] = "T16_caster",[ 99204] = "T16_caster",[ 99205] = "T16_caster",
	[ 99416] = "T16_caster",[ 99417] = "T16_caster",[ 99424] = "T16_caster",[ 99425] = "T16_caster",[ 99426] = "T16_caster",
	[ 99567] = "T16_caster",[ 99568] = "T16_caster",[ 99569] = "T16_caster",[ 99570] = "T16_caster",[ 99601] = "T16_caster",
	[115585] = "T17",		[115586] = "T17",		[115587] = "T17",		[115588] = "T17",		[115589] = "T17",
	-- Warrior
	[ 85324] = "T14_tank",	[ 85325] = "T14_tank",	[ 85326] = "T14_tank",	[ 85327] = "T14_tank",	[ 85328] = "T14_tank",
	[ 85329] = "T14_melee",	[ 85330] = "T14_melee",	[ 85331] = "T14_melee",	[ 85332] = "T14_melee",	[ 85333] = "T14_melee",
	[ 86664] = "T14_tank",	[ 86665] = "T14_tank",	[ 86666] = "T14_tank",	[ 86667] = "T14_tank",	[ 86668] = "T14_tank",
	[ 86669] = "T14_melee",	[ 86670] = "T14_melee",	[ 86671] = "T14_melee",	[ 86672] = "T14_melee",	[ 86673] = "T14_melee",
	[ 87192] = "T14_melee",	[ 87193] = "T14_melee",	[ 87194] = "T14_melee",	[ 87195] = "T14_melee",	[ 87196] = "T14_melee",
	[ 87197] = "T14_tank",	[ 87198] = "T14_tank",	[ 87199] = "T14_tank",	[ 87200] = "T14_tank",	[ 87201] = "T14_tank",
	[ 95330] = "T15_melee",	[ 95331] = "T15_melee",	[ 95332] = "T15_melee",	[ 95333] = "T15_melee",	[ 95334] = "T15_melee",
	[ 95986] = "T15_melee",	[ 95987] = "T15_melee",	[ 95988] = "T15_melee",	[ 95989] = "T15_melee",	[ 95990] = "T15_melee",
	[ 96730] = "T15_melee",	[ 96731] = "T15_melee",	[ 96732] = "T15_melee",	[ 96733] = "T15_melee",	[ 96734] = "T15_melee",
	[ 99030] = "T16_tank",	[ 99032] = "T16_tank",	[ 99033] = "T16_tank",	[ 99037] = "T16_tank",	[ 99038] = "T16_tank",
	[ 99034] = "T16_melee",	[ 99035] = "T16_melee",	[ 99036] = "T16_melee",	[ 99046] = "T16_melee",	[ 99047] = "T16_melee",
	[ 99195] = "T16_tank",	[ 99196] = "T16_tank",	[ 99201] = "T16_tank",	[ 99202] = "T16_tank",	[ 99203] = "T16_tank",
	[ 99197] = "T16_melee",	[ 99198] = "T16_melee",	[ 99199] = "T16_melee",	[ 99200] = "T16_melee",	[ 99206] = "T16_melee",
	[ 99407] = "T16_tank",	[ 99408] = "T16_tank",	[ 99409] = "T16_tank",	[ 99410] = "T16_tank",	[ 99415] = "T16_tank",
	[ 99411] = "T16_melee",	[ 99412] = "T16_melee",	[ 99413] = "T16_melee",	[ 99414] = "T16_melee",	[ 99418] = "T16_melee",
	[ 99557] = "T16_tank",	[ 99558] = "T16_tank",	[ 99562] = "T16_tank",	[ 99563] = "T16_tank",	[ 99597] = "T16_tank",
	[ 99559] = "T16_melee",	[ 99560] = "T16_melee",	[ 99561] = "T16_melee",	[ 99602] = "T16_melee",	[ 99603] = "T16_melee",
	[115580] = "T17",		[115581] = "T17",		[115582] = "T17",		[115583] = "T17",		[115584] = "T17",
}

local OVALE_WEAPON_CLASS = {}
do
	OVALE_WEAPON_CLASS[1],	-- "One-Handed Axes"
	OVALE_WEAPON_CLASS[2],	-- "Two-Handed Axes"
	OVALE_WEAPON_CLASS[3],	-- "Bows"
	OVALE_WEAPON_CLASS[4],	-- "Guns"
	OVALE_WEAPON_CLASS[5],	-- "One-Handed Maces"
	OVALE_WEAPON_CLASS[6],	-- "Two-Handed Maces"
	OVALE_WEAPON_CLASS[7],	-- "Polearms"
	OVALE_WEAPON_CLASS[8],	-- "One-Handed Swords"
	OVALE_WEAPON_CLASS[9],	-- "Two-Handed Swords"
	OVALE_WEAPON_CLASS[10],	-- "Staves"
	OVALE_WEAPON_CLASS[11],	-- "Fist Weapons"
	OVALE_WEAPON_CLASS[12],	-- "Miscellaneous"
	OVALE_WEAPON_CLASS[13],	-- "Daggers"
	OVALE_WEAPON_CLASS[14],	-- "Thrown"
	OVALE_WEAPON_CLASS[15],	-- "Crossbows"
	OVALE_WEAPON_CLASS[16],	-- "Wands"
	OVALE_WEAPON_CLASS[17] = API_GetAuctionItemSubClasses(1)	-- "Fishing Poles"
end

local OVALE_META_GEM = nil
do
	local _, _, _, _, _, _, name = API_GetAuctionItemSubClasses(8)	-- "8" is "Gem"
	OVALE_META_GEM = name
end

-- Normalized weapon attack speeds (http://www.wowpedia.org/Normalization)
local OVALE_NORMALIZED_WEAPON_SPEED = {
	[OVALE_WEAPON_CLASS[1]]  = 2.4,
	[OVALE_WEAPON_CLASS[2]]  = 3.3,
	[OVALE_WEAPON_CLASS[3]]  = 2.8,
	[OVALE_WEAPON_CLASS[4]]  = 2.8,
	[OVALE_WEAPON_CLASS[5]]  = 2.4,
	[OVALE_WEAPON_CLASS[6]]  = 3.3,
	[OVALE_WEAPON_CLASS[7]]  = 3.3,
	[OVALE_WEAPON_CLASS[8]]  = 2.4,
	[OVALE_WEAPON_CLASS[9]]  = 3.3,
	[OVALE_WEAPON_CLASS[10]] = 3.3,
	[OVALE_WEAPON_CLASS[11]] = 2.4,
	[OVALE_WEAPON_CLASS[12]] = 2.4, -- ??
	[OVALE_WEAPON_CLASS[13]] = 1.7,
	[OVALE_WEAPON_CLASS[14]] = 1.7, -- ??
	[OVALE_WEAPON_CLASS[15]] = 2.8,
	[OVALE_WEAPON_CLASS[16]] = 2.4,
	[OVALE_WEAPON_CLASS[17]] = 3.3,
}
--</private-static-properties>

--<public-static-properties>
-- Whether the equipment information is ready for use by other modules.
OvaleEquipment.ready = false
-- Item IDs of equipped items, indexed by slot ID.
OvaleEquipment.equippedItems = {}
-- Item levels of equipped items, indexed by slot ID.
OvaleEquipment.equippedItemLevels = {}
-- Type of main-hand item equipped.
OvaleEquipment.mainHandItemType = nil
-- Type of off-hand item equipped.
OvaleEquipment.offHandItemType = nil
-- Count of equipped pieces of an armor set: armorSetCount[armorSetName] = equippedCount
OvaleEquipment.armorSetCount = {}
-- Item ID of meta gem if equipped.
OvaleEquipment.metaGem = nil

-- Normalized weapon speeds for equipped mainhand and offhand weapons.
OvaleEquipment.mainHandWeaponSpeed = nil
OvaleEquipment.offHandWeaponSpeed = nil
--</public-static-properties>

--<private-static-methods>
local function GetEquippedItemType(slotId)
	OvaleEquipment:StartProfiling("OvaleEquipment_GetEquippedItemType")
	local itemId = OvaleEquipment:GetEquippedItem(slotId)
	local itemType
	if itemId then
		local _, _, _, _, _, _, _, _, inventoryType = API_GetItemInfo(itemId)
		itemType = inventoryType
	end
	OvaleEquipment:StopProfiling("OvaleEquipment_GetEquippedItemType")
	return itemType
end

local function GetItemLevel(slotId)
	OvaleEquipment:StartProfiling("OvaleEquipment_GetItemLevel")
	self_tooltip:SetInventoryItem("player", slotId)
	local itemLevel
	for i = 2, self_tooltip:NumLines() do
		local text = _G["OvaleEquipment_ScanningTooltipTextLeft" .. i]:GetText()
		if text then
			itemLevel = strmatch(text, OVALE_ITEM_LEVEL_PATTERN)
			if itemLevel then
				itemLevel = tonumber(itemLevel)
				break
			end
		end
	end
	OvaleEquipment:StopProfiling("OvaleEquipment_GetItemLevel")
	return itemLevel
end

local function GetNormalizedWeaponSpeed(slotId)
	OvaleEquipment:StartProfiling("OvaleEquipment_GetNormalizedWeaponSpeed")
	local weaponSpeed
	if slotId == INVSLOT_MAINHAND or slotId == INVSLOT_OFFHAND then
		local itemId = OvaleEquipment:GetEquippedItem(slotId)
		if itemId then
			local _, _, _, _, _, _, weaponClass = API_GetItemInfo(itemId)
			weaponSpeed = OVALE_NORMALIZED_WEAPON_SPEED[weaponClass]
		end
	end
	OvaleEquipment:StopProfiling("OvaleEquipment_GetNormalizedWeaponSpeed")
	return weaponSpeed
end
--</private-static-methods>

--<public-static-methods>
function OvaleEquipment:OnInitialize()
	-- Create the tooltip used for scanning.
	self_tooltip = API_CreateFrame("GameTooltip", "OvaleEquipment_ScanningTooltip", nil, "GameTooltipTemplate")
	self_tooltip:SetOwner(UIParent, "ANCHOR_NONE")
end

function OvaleEquipment:OnEnable()
	self:RegisterEvent("GET_ITEM_INFO_RECEIVED")
	self:RegisterEvent("PLAYER_ENTERING_WORLD", "UpdateEquippedItems")
	self:RegisterEvent("PLAYER_AVG_ITEM_LEVEL_UPDATE", "UpdateEquippedItemLevels")
	self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
end

function OvaleEquipment:OnDisable()
	self:UnregisterEvent("GET_ITEM_INFO_RECEIVED")
	self:UnregisterEvent("PLAYER_ENTERING_WORLD")
	self:UnregisterEvent("PLAYER_AVG_ITEM_LEVEL_UPDATE")
	self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED")
end

function OvaleEquipment:GET_ITEM_INFO_RECEIVED(event)
	self:StartProfiling("OvaleEquipment_GET_ITEM_INFO_RECEIVED")
	self.mainHandItemType = GetEquippedItemType(INVSLOT_MAINHAND)
	self.offHandItemType = GetEquippedItemType(INVSLOT_OFFHAND)
	self.mainHandWeaponSpeed = self:HasMainHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_MAINHAND)
	self.offHandWeaponSpeed = self:HasOffHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_OFFHAND)

	local changed = self:UpdateMetaGem()
	if changed then
		self:SendMessage("Ovale_EquipmentChanged")
	end
	self:StopProfiling("OvaleEquipment_GET_ITEM_INFO_RECEIVED")
end

function OvaleEquipment:PLAYER_EQUIPMENT_CHANGED(event, slotId, hasItem)
	self:StartProfiling("OvaleEquipment_PLAYER_EQUIPMENT_CHANGED")
	if hasItem then
		self.equippedItems[slotId] = API_GetInventoryItemID("player", slotId)
		self.equippedItemLevels[slotId] = GetItemLevel(slotId)
		if slotId == INVSLOT_MAINHAND then
			self.mainHandItemType = GetEquippedItemType(slotId)
			self.mainHandWeaponSpeed = self:HasMainHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_MAINHAND)
		elseif slotId == INVSLOT_OFFHAND then
			self.offHandItemType = GetEquippedItemType(slotId)
			self.offHandWeaponSpeed = self:HasOffHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_OFFHAND)
		end
	else
		self.equippedItems[slotId] = nil
		self.equippedItemLevels[slotId] = nil
		if slotId == INVSLOT_MAINHAND then
			self.mainHandItemType = nil
		elseif slotId == INVSLOT_OFFHAND then
			self.offHandItemType = nil
		end
	end

	self:UpdateArmorSetCount()
	self:SendMessage("Ovale_EquipmentChanged")
	self:StopProfiling("OvaleEquipment_PLAYER_EQUIPMENT_CHANGED")
end

do
	-- Legacy armor set names; no longer documented.
	local armorSetName = {
		HUNTER = { ["T14"] = "T14_melee", ["T15"] = "T15_melee", ["T16"] = "T16_melee" },
		MAGE = { ["T14"] = "T14_caster", ["T15"] = "T15_caster", ["T16"] = "T16_caster" },
		ROGUE = { ["T14"] = "T14_melee", ["T15"] = "T15_melee", ["T16"] = "T16_melee" },
		WARLOCK = { ["T14"] = "T14_caster", ["T15"] = "T15_caster" },
	}

	function OvaleEquipment:GetArmorSetCount(name)
		local count = self.armorSetCount[name]
		if not count then
			if armorSetName[self_class] and armorSetName[self_class][name] then
				name = armorSetName[self_class][name]
				count = self.armorSetCount[name]
			end
		end
		return count or 0
	end
end

function OvaleEquipment:GetEquippedItem(slotId)
	if slotId and type(slotId) ~= "number" then
		slotId = OVALE_SLOTNAME[slotId]
	end
	if slotId then
		return self.equippedItems[slotId]
	end
	return nil
end

function OvaleEquipment:GetEquippedItemLevel(slotId)
	if slotId and type(slotId) ~= "number" then
		slotId = OVALE_SLOTNAME[slotId]
	end
	if slotId then
		return self.equippedItemLevels[slotId]
	end
	return nil
end

function OvaleEquipment:HasEquippedItem(itemId, slotId)
	if slotId and type(slotId) ~= "number" then
		slotId = OVALE_SLOTNAME[slotId]
	end
	if slotId then
		if self.equippedItems[slotId] == itemId then
			return slotId
		end
	else
		for slotId, equippedItemId in pairs(self.equippedItems) do
			if equippedItemId == itemId then
				return slotId
			end
		end
	end
	return nil
end

function OvaleEquipment:HasMainHandWeapon(handedness)
	if handedness then
		if handedness == 1 then
			return self.mainHandItemType == "INVTYPE_WEAPON"
				or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND"
		elseif handedness == 2 then
			return self.mainHandItemType == "INVTYPE_2HWEAPON"
		end
	else
		return self.mainHandItemType == "INVTYPE_WEAPON"
			or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND"
			or self.mainHandItemType == "INVTYPE_2HWEAPON"
	end
	return false
end

function OvaleEquipment:HasOffHandWeapon(handedness)
	if handedness then
		if handedness == 1 then
			return self.offHandItemType == "INVTYPE_WEAPON"
				or self.offHandItemType == "INVTYPE_WEAPONOFFHAND"
				or self.offHandItemType == "INVTYPE_WEAPONMAINHAND"
		elseif handedness == 2 then
			return self.offHandItemType == "INVTYPE_2HWEAPON"
		end
	else
		return self.offHandItemType == "INVTYPE_WEAPON"
			or self.offHandItemType == "INVTYPE_WEAPONOFFHAND"
			or self.offHandItemType == "INVTYPE_WEAPONMAINHAND"
			or self.offHandItemType == "INVTYPE_2HWEAPON"
	end
	return false
end

function OvaleEquipment:HasShield()
	return self.offHandItemType == "INVTYPE_SHIELD"
end

function OvaleEquipment:HasTrinket(itemId)
	return self:HasEquippedItem(itemId, INVSLOT_TRINKET1)
		or self:HasEquippedItem(itemId, INVSLOT_TRINKET2)
end

function OvaleEquipment:HasTwoHandedWeapon(slotId)
	if slotId and type(slotId) ~= "number" then
		slotId = OVALE_SLOTNAME[slotId]
	end
	if slotId then
		if slotId == INVSLOT_MAINHAND then
			return self.mainHandItemType == "INVTYPE_2HWEAPON"
		elseif slotId == INVSLOT_OFFHAND then
			return self.offHandItemType == "INVTYPE_2HWEAPON"
		end
	else
		return self.mainHandItemType == "INVTYPE_2HWEAPON" or self.offHandItemType == "INVTYPE_2HWEAPON"
	end
	return false
end

function OvaleEquipment:HasOneHandedWeapon(slotId)
	if slotId and type(slotId) ~= "number" then
		slotId = OVALE_SLOTNAME[slotId]
	end
	if slotId then
		if slotId == INVSLOT_MAINHAND then
			return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND"
		elseif slotId == INVSLOT_OFFHAND then
			return self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND"
		end
	else
		return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND"
			or self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND"
	end
	return false
end

function OvaleEquipment:UpdateArmorSetCount()
	self:StartProfiling("OvaleEquipment_UpdateArmorSetCount")
	wipe(self.armorSetCount)
	for i = 1, #OVALE_ARMORSET_SLOT_IDS do
		local itemId = self:GetEquippedItem(OVALE_ARMORSET_SLOT_IDS[i])
		if itemId then
			local name = OVALE_ARMORSET[itemId]
			if name then
				if not self.armorSetCount[name] then
					self.armorSetCount[name] = 1
				else
					self.armorSetCount[name] = self.armorSetCount[name] + 1
				end
			end
		end
	end
	self:StopProfiling("OvaleEquipment_UpdateArmorSetCount")
end

function OvaleEquipment:UpdateEquippedItems()
	self:StartProfiling("OvaleEquipment_UpdateEquippedItems")
	local changed = false
	local item
	for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
		item = API_GetInventoryItemID("player", slotId)
		if item ~= self.equippedItems[slotId] then
			self.equippedItems[slotId] = item
			changed = true
		end
	end
	local changedMetaGem = self:UpdateMetaGem()
	local changedItemLevels = self:UpdateEquippedItemLevels()
	changed = changed or changedMetaGem or changedItemLevels

	self.mainHandItemType = GetEquippedItemType(INVSLOT_MAINHAND)
	self.offHandItemType = GetEquippedItemType(INVSLOT_OFFHAND)
	self.mainHandWeaponSpeed = self:HasMainHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_MAINHAND)
	self.offHandWeaponSpeed = self:HasOffHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_OFFHAND)

	if changed then
		self:UpdateArmorSetCount()
		self:SendMessage("Ovale_EquipmentChanged")
	end
	self.ready = true
	self:StopProfiling("OvaleEquipment_UpdateEquippedItems")
end

function OvaleEquipment:UpdateEquippedItemLevels()
	self:StartProfiling("OvaleEquipment_UpdateEquippedItemLevels")
	local changed = false
	local itemLevel
	for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
		itemLevel = GetItemLevel(slotId)
		if itemLevel ~= self.equippedItemLevels[slotId] then
			self.equippedItemLevels[slotId] = itemLevel
			changed = true
		end
	end
	if changed then
		self:SendMessage("Ovale_EquipmentChanged")
	end
	self:StopProfiling("OvaleEquipment_UpdateEquippedItemLevels")
	return changed
end

function OvaleEquipment:UpdateMetaGem()
	self:StartProfiling("OvaleEquipment_UpdateMetaGem")
	local changed = false
	local gemId = API_GetInventoryItemGems(INVSLOT_HEAD)
	if gemId then
		local name, link, quality, iLevel, reqLevel, class, subclass = API_GetItemInfo(gemId)
		if subclass == OVALE_META_GEM then
			if gemId ~= self.metaGem then
				self.metaGem = gemId
				changed = true
			end
		end
	else
		if self.metaGem then
			self.metaGem = nil
			changed = true
		end
	end
	self:StopProfiling("OvaleEquipment_UpdateMetaGem")
	return changed
end

function OvaleEquipment:DebugEquipment()
	for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
		self:Print("Slot %d = %s (%d)", slotId, self:GetEquippedItem(slotId), self:GetEquippedItemLevel(slotId))
	end
	self:Print("Main-hand item type: %s", self.mainHandItemType)
	self:Print("Off-hand item type: %s", self.offHandItemType)
	for k, v in pairs(self.armorSetCount) do
		self:Print("Player has %d piece(s) of %s armor set.", v, k)
	end
end
--</public-static-methods>