local MAJOR_VERSION, MINOR_VERSION = "LibBlueItem-1.0", 17
local lib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
if not lib then return end

local _G = _G
local type = _G.type
local min = _G.math.min
local max = _G.math.max
local floor = _G.math.floor
local tonumber = _G.tonumber
local GetItemInfo = _G.GetItemInfo
local GetItemIcon = _G.GetItemIcon
local GetSpellInfo = _G.GetSpellInfo
local GetCurrentKeyBoardFocus = _G.GetCurrentKeyBoardFocus
local dummy, leftText, leftRed, leftGreen, leftBlue, rightText, rightRed, rightGreen, rightBlue = {}

local forceEnchantSpell = {
	[114112] = GetSpellInfo(2018),
	[113263] = GetSpellInfo(2018),
}

local ItemLevelBonusID = {
-- 드레노어의 전쟁군주
	"518", -- 일반 5인 던전(530)
	"519", -- 일반 5인 던전(550)
	"521", -- 일반 5인 전전(600)
	"520", -- 일반 5인 던전(570)
	"522", -- 일반 5인 던전(615)
	"524", -- 영웅 5인 던전(630)
	"642", -- 신화 5인 던전(685)

	"553", -- 이벤트 아이템(635)
	"557", -- 이벤트 아이템(670)
	
	"525", -- 제조템 1/6
	"526", -- 제조템 2/6 (방어구)
	"527", -- 제조템 3/6 (방어구)
	"593", -- 제조템 4/6 (방어구)
	"617",  -- 제조템 5/6 (방어구)
	"618",  -- 제조템 6/6 (방어구)
	
	"558", -- 제조템 2/6 (무기)
	"559", -- 제조템 3/6 (무기)
	"594", -- 제조템 4/6 (무기)
	"619",  -- 제조템 5/6 (무기)
	"620",  -- 제조템 6/6 (무기)
	
	"566", -- 영웅 레이드 던전
	"567", -- 신화 레이드 던전
	
	"569", -- 신화 티어 토큰	
	"570", -- 영웅 티어 토큰	
	
	"582", -- 계귀템 1/2
	"583", -- 계귀템 2/2	
	
	"591", -- 도전모드 일퀘 보상 6.1(660)
	"609", -- 도전모드 일퀘 보상 6.2(680)
	
	"615", -- 시간여행 드랍템
	
	"648", -- 불길한 장비 강화
	
	"692", -- 시간왜곡의 인장
	
-- 군단
	"3379", -- 에메랄드의악몽 공찾
	"1807", -- 에메랄드의악몽 일반
	"1805", -- 에메랄드의악몽 영웅
	"1806", -- 에메랄드의악몽 신화

	"3446", -- 밤의요새 공찾
	"3443", -- 밤의요새 일반
	"3444", -- 밤의요새 영웅
	"3445", -- 밤의요새 신화
	
	"3470", -- 욤앵의시험 공찾
	"3505", -- 욤앵의시험 막넴 공찾
	"3467", -- 용맹의시험 일반
	"3506", -- 용맹의시험 막넴 일반
	"3468", -- 용맹의시험 영웅
	"3507", -- 용맹의시험 막넴 영웅
	"3469", -- 용맹의시험 신화
	"3508", -- 용맹의시험 막넴 신화
	
	"1826", -- 일반 5인 던전 (110렙)
	"1726", -- 영웅 5인 던전
	"1727", -- 신화 5인 던전
	"3452", -- 카라잔 초반 (855)
	"3453", -- 카라잔 후반 (860)
	"3454", -- 카라잔 히든 (875)
	
	"3381", -- 전당 세트 (810)
	"3382", -- 전당 세트 (820)
	"3383", -- 전당 세트 (830)
	"3384", -- 전당 세트 (840)
	
	"596", -- 제조템 소멸석 0
	"597", -- 제조템 소멸석 1
	"598", -- 제조템 소멸석 2
	"599", -- 제조템 소멸석 3
	"666", -- 제조템 소멸석 4
	"667",  -- 제조템 소멸석 5
	"668",  -- 제조템 소멸석 6
	"669",  -- 제조템 소멸석 7
	"670",  -- 제조템 소멸석 8
	
	"3427", -- 군단 시즌1 하급 (805)
}

local ItemLevelBonusIDForward = {
	["1798"] = "566", -- 지옥불 성채 영웅
	["1799"] = "567", -- 지옥불 성채 신화

	["3410"] = "1727",	-- 신화 5인 던전 쐐기돌 2단계
	["3411"] = "1727",	-- 신화 5인 던전 쐐기돌 3단계
	["3412"] = "1727",	-- 신화 5인 던전 쐐기돌 4단계
	["3413"] = "1727",	-- 신화 5인 던전 쐐기돌 5단계
	["3414"] = "1727",	-- 신화 5인 던전 쐐기돌 6단계
	["3415"] = "1727",	-- 신화 5인 던전 쐐기돌 7단계
	["3416"] = "1727",	-- 신화 5인 던전 쐐기돌 8단계
	["3417"] = "1727",	-- 신화 5인 던전 쐐기돌 9단계
	["3418"] = "1727",	-- 신화 5인 던전 쐐기돌 10단계
	["3509"] = "1727",	-- 신화 5인 던전 쐐기돌 11단계
	["3510"] = "1727",	-- 신화 5인 던전 쐐기돌 12단계
--	["3421"] = "1727",	-- 신화 5인 던전 쐐기돌 13단계
--	["3422"] = "1727",	-- 신화 5인 던전 쐐기돌 14단계
--	["3423"] = "1727",	-- 신화 5인 던전 쐐기돌 15단계
}

local WorldQuestRewardBonusID = {
	["1824"] = 805, -- 전역퀘 805,
	["1825"] = 810, -- 전역퀘 810,
	["3394"] = 815, -- 전역퀘 815,
	["3395"] = 820, -- 전역퀘 820,
	["3396"] = 825, -- 전역퀘 825,
	["3397"] = 830, -- 전역퀘 830,
	["3432"] = 835, -- 전역퀘 835,
	["3473"] = 840, -- 전역퀘 840,
	["3474"] = 845, -- 전역퀘 845,
--	["1727"] = 840, -- 신화던전 전역퀘 840
}

local FixedBonusID = {
-- 군단 월드드랍 835
	[141570] = 1497,
	[141569] = 1497,
	[141571] = 1497,
	[141568] = 1497,
	[141590] = 1497,
	[141589] = 1497,
	[141587] = 1497,
	[141588] = 1497,
	[141581] = 1497,
	[141582] = 1497,
	[141583] = 1497,
	[141580] = 1497,
	[141585] = 1497,
	[141574] = 1497,
	[141575] = 1497,
	[141572] = 1497,
	[141573] = 1497,
	[141584] = 1497,
	[141566] = 1497,
	[141565] = 1497,
	[141567] = 1497,
	[141564] = 1497,
	[141576] = 1497,
	[141579] = 1497,
	[141578] = 1497,
	[141577] = 1497,
	[141586] = 1497,
}

lib.tooltip = lib.tooltip or CreateFrame("GameTooltip")
lib.tooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
lib.tooltip.left = lib.tooltip.left or {}
lib.tooltip.right = lib.tooltip.right or {}
for i = #lib.tooltip.left + 1, 50 do
	lib.tooltip.left[i] = lib.tooltip:CreateFontString(nil, nil, "GameFontNormal")
	lib.tooltip.right[i] = lib.tooltip:CreateFontString(nil, nil, "GameFontNormal")
	lib.tooltip:AddFontStrings(lib.tooltip.left[i], lib.tooltip.right[i])
end

lib.itemSubClassLocale = lib.itemSubClassLocale or {}
wipe(lib.itemSubClassLocale)
lib.itemSubClassLocale.AXES_1H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_AXE1H))
lib.itemSubClassLocale.AXES_2H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_AXE2H))
lib.itemSubClassLocale.BOWS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_BOWS))
lib.itemSubClassLocale.GUNS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_GUNS))
lib.itemSubClassLocale.MACES_1H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_MACE1H))
lib.itemSubClassLocale.MACES_2H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_MACE2H))
lib.itemSubClassLocale.POLEARMS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_POLEARM))
lib.itemSubClassLocale.SWORD_1H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_SWORD1H))
lib.itemSubClassLocale.SWORD_2H = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_SWORD2H))
lib.itemSubClassLocale.STAVES = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_STAFF))
lib.itemSubClassLocale.FIST = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_UNARMED))
lib.itemSubClassLocale.OTHERS  = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_GENERIC))
lib.itemSubClassLocale.DAGGERS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_DAGGER))
lib.itemSubClassLocale.THROWN = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_THROWN))
lib.itemSubClassLocale.CROSSBOWS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_CROSSBOW))
lib.itemSubClassLocale.WANDS = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_WAND))
lib.itemSubClassLocale.FISHING_POLES = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_FISHINGPOLE))
--lib.itemSubClassLocale.WARGLAVE = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, LE_ITEM_WEAPON_WARGLAIVE))
lib.itemSubClassLocale.CLOTH = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, LE_ITEM_ARMOR_CLOTH))
lib.itemSubClassLocale.LEATHER = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, LE_ITEM_ARMOR_LEATHER))
lib.itemSubClassLocale.MAIL = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, LE_ITEM_ARMOR_MAIL))
lib.itemSubClassLocale.PLATE = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, LE_ITEM_ARMOR_PLATE))
lib.itemSubClassLocale.SHIELD = select(1, GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, LE_ITEM_ARMOR_SHIELD))

lib.enchantmentNames = lib.enchantmentNames or CopyTable(dummy)
wipe(lib.enchantmentNames)
lib.enchantmentNames[3290] = GetSpellInfo(52641)
lib.enchantmentNames[3599] = GetSpellInfo(54736)
lib.enchantmentNames[3601] = GetSpellInfo(54793)
lib.enchantmentNames[3603] = GetSpellInfo(54998)
lib.enchantmentNames[3604] = GetSpellInfo(54999)
lib.enchantmentNames[3605] = GetSpellInfo(55002)
lib.enchantmentNames[3859] = GetSpellInfo(63765)
lib.enchantmentNames[3860] = GetSpellInfo(63770)
lib.enchantmentNames[4179] = GetSpellInfo(82175)
lib.enchantmentNames[4180] = GetSpellInfo(82177)
lib.enchantmentNames[4181] = GetSpellInfo(82180)
lib.enchantmentNames[4182] = GetSpellInfo(82200)
lib.enchantmentNames[4183] = GetSpellInfo(82201)
lib.enchantmentNames[4187] = GetSpellInfo(84424)
lib.enchantmentNames[4188] = GetSpellInfo(84427)
lib.enchantmentNames[4214] = GetSpellInfo(84425)
lib.enchantmentNames[4222] = GetSpellInfo(67839)
lib.enchantmentNames[4223] = GetSpellInfo(55016)

local frostWeapon = GetSpellInfo(8033)
local defaultItem, defaultItemName, defaultItemEnchantPos, defaultItemEnchantText = 2570
defaultItemName = GetItemInfo(defaultItem)
if defaultItemName then
	if lib.frames then
		lib.frames:UnregisterAllEvents()
	end
else
	lib.frames = lib.frames or CreateFrame("Frame")
	lib.frames:UnregisterAllEvents()
	lib.frames:RegisterEvent("GET_ITEM_INFO_RECEIVED")
	lib.frames:SetScript("OnEvent", function(self)
		defaultItemName = GetItemInfo(defaultItem)
		if defaultItemName then
			self:SetScript("OnEvent", nil)
			self:UnregisterAllEvents()
		end
	end)
end

local function makePattern(text)
	text = text:gsub("%.", "%%."):gsub("%(", "%%("):gsub("%)", "%%)"):gsub("%%d", "%([0%-9%%-]+%)"):gsub("%%s", "%(%.+%)")
	return text
end

local itemSetName = "^"..makePattern(ITEM_SET_NAME).."$"

local function clearTooltip()
	lib.tooltip:ClearLines()
	lib.tooltip:Hide()
end

local function setTooltip(method, ...)
	if type(lib.tooltip[method]) == "function" then
		lib.tooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
		lib.tooltip[method](lib.tooltip, ...)
		lib.tooltip:Show()
		return true
	else
		clearTooltip()
		return nil
	end
end

local function getLine(line)
	if line and line:IsShown() and (line:GetText() or "") ~= "" then
		return line:GetText(), line:GetTextColor()
	end
	return nil
end

local function isNatural(num)
	num = tonumber(num)
	return num and num > 0 and num == floor(num) and num or nil
end

local function refreshDefaultItemName()
	defaultItemName = defaultItemName or GetItemInfo(defaultItem)
	return defaultItemName and true or nil
end

local function iterateTooltip(_, index)
	if lib.tooltip:IsShown() then
		index = index + 1
		while index <= min(#lib.tooltip.left, lib.tooltip:NumLines()) do
			leftText, leftRed, leftGreen, leftBlue = getLine(lib.tooltip.left[index])
			if leftText then
				rightText, rightRed, rightGreen, rightBlue = getLine(lib.tooltip.right[index])
				return index, leftText, rightText, leftRed, leftGreen, leftBlue, rightRed, rightGreen, rightBlue
			end
			index = index + 1
		end
	end
	leftText, leftRed, leftGreen, leftBlue, rightText, rightRed, rightGreen, rightBlue = nil
	clearTooltip()
end

function lib:UnpackTooltip(start, method, ...)
	if setTooltip(method, ...) then
		if lib.tooltip:NumLines() > 0 and lib.tooltip.left[1]:GetText() ~= RETRIEVING_ITEM_INFO then
			return iterateTooltip, nil, max(0, (start or 1) - 1)
		else
			clearTooltip()
		end
	end
	return pairs(dummy)
end

function lib:GetRandomSuffixFormat(code)
	if isNatural(code) and refreshDefaultItemName() then
		code = GetItemInfo("item:"..defaultItem..":0:0:0:0:0:-"..code..":1")
		if code and code:trim() ~= defaultItemName then
			code = code:match("^"..ITEM_SUFFIX_TEMPLATE:format(defaultItemName, "(.+)").."$")
			if code then
				return ITEM_SUFFIX_TEMPLATE:format("%s", code)
			end
		end
	end
	return nil
end

function lib:GetEnchantmentText(code)
	if lib.enchantmentNames[code] then
		return lib.enchantmentNames[code]
	elseif isNatural(code) and refreshDefaultItemName() then
		if not defaultItemEnchantPos then
			defaultItemEnchantPos = 4
			for i, text in lib:UnpackTooltip(2, "SetHyperlink", "item:"..defaultItem..":2") do
				if text and text == frostWeapon then
					defaultItemEnchantPos = i
					break
				end
			end
		end
		if defaultItemEnchantPos then
			defaultItemEnchantText = defaultItemEnchantText or (setTooltip("SetItemByID", defaultItem) and lib.tooltip:NumLines() >= defaultItemEnchantPos and lib.tooltip.left[defaultItemEnchantPos]:GetText())
			if defaultItemEnchantText then
				code = setTooltip("SetHyperlink", "item:"..defaultItem..":"..code) and lib.tooltip:NumLines() >= defaultItemEnchantPos and lib.tooltip.left[defaultItemEnchantPos]:GetText()
				if code ~= defaultItemEnchantText then
					return code
				end
			end
		end
	end
	return nil
end

function lib:GetItemSetName(code)
	code = tonumber(code)
	if code and GetItemIcon(code) then
		GetItemInfo(code)
		for i, text in lib:UnpackTooltip(4, "SetItemByID", code) do
			text = text:match(itemSetName)
			if text then
				return text, i
			end
		end
	end
	return nil
end

function lib:IsEnchantSpell(id)
	if id and GetSpellInfo(id) then
		if forceEnchantSpell[id] then
			return forceEnchantSpell[id]..": "..GetSpellInfo(id)
		elseif setTooltip("SetHyperlink", "enchant:"..id) then
			leftText, leftRed, leftGreen, leftBlue = getLine(lib.tooltip.left[1])
			if leftText and leftBlue == 0 then
				leftRed, leftGreen, leftBlue = nil
				return leftText
			end
			leftText, leftRed, leftGreen, leftBlue = nil
		end
	end
	return nil
end

function lib:GetItemSubClassLocales()
	return lib.itemSubClassLocale
end

local subClassValues = {
	[lib.itemSubClassLocale.SWORD_1H] = 2,
	[lib.itemSubClassLocale.SWORD_2H] = 2,
	[lib.itemSubClassLocale.MACES_1H] = 3,
	[lib.itemSubClassLocale.MACES_2H] = 3,
	[lib.itemSubClassLocale.AXES_1H] = 4,
	[lib.itemSubClassLocale.AXES_2H] = 4,
	[lib.itemSubClassLocale.DAGGERS] = 5,
	[lib.itemSubClassLocale.FIST] = 6,
	[lib.itemSubClassLocale.POLEARMS] = 7,
	[lib.itemSubClassLocale.STAVES] = 8,
	[lib.itemSubClassLocale.FISHING_POLES] = 9,
	[lib.itemSubClassLocale.SHIELD] = 10,
	[lib.itemSubClassLocale.GUNS] = 11,
	[lib.itemSubClassLocale.BOWS] = 12,
	[lib.itemSubClassLocale.CROSSBOWS] = 13,
	[lib.itemSubClassLocale.THROWN] = 14,
	[lib.itemSubClassLocale.WANDS] = 15,
	[lib.itemSubClassLocale.CLOTH] = 17,
	[lib.itemSubClassLocale.LEATHER] = 18,
	[lib.itemSubClassLocale.MAIL] = 19,
	[lib.itemSubClassLocale.PLATE] = 20,
}

local equipLocValues = {
	INVTYPE_2HWEAPON = 100,
	INVTYPE_WEAPONMAINHAND = 200,
	INVTYPE_WEAPON = 300,
	INVTYPE_WEAPONOFFHAND = 400,
	INVTYPE_RANGED = 500,
	INVTYPE_RANGEDRIGHT = 500,
	INVTYPE_THROWN = 500,
	INVTYPE_SHIELD = 600,
	INVTYPE_HOLDABLE = 700,
	INVTYPE_HEAD = 900,
	INVTYPE_SHOULDER = 1000,
	INVTYPE_CHEST = 1100,
	INVTYPE_ROBE = 1100,
	INVTYPE_LEGS = 1200,
	INVTYPE_HAND = 1300,
	INVTYPE_WRIST = 1400,
	INVTYPE_WAIST = 1500,
	INVTYPE_FEET = 1600,
	INVTYPE_CLOAK = 1700,
	INVTYPE_NECK = 1800,
	INVTYPE_FINGER = 1900,
	INVTYPE_TRINKET = 2000,
	INVTYPE_BODY = 2100,
	INVTYPE_TABARD = 2200,
}

local function lookup(tbl, value)
	for p, v in pairs(tbl) do
		if v == value then
			return p
		end
	end
	return nil
end

function lib:CheckFixedBonusID(id)
	for fid, fbid in pairs(FixedBonusID) do
		if fid == id then 
			return true, fbid
		end
	end	
	return false, 0
end

function lib:GetItemEquipCode(a1, a2)
	if isNatural(a1) then
		local itemSubClass, _, itemEquipLoc = select(7, GetItemInfo(tonumber(a1)))
		if itemSubClass then
			return (subClassValues[itemSubClass] or 99) + (equipLocValues[itemEquipLoc] or 9900)
		end
	elseif type(a1) == "string" and type(a2) == "string" and (subClassValues[a1] or equipLocValues[a2]) then
		return (subClassValues[a1] or 99) + (equipLocValues[a2] or 9900)
	end
	return nil
end

function lib:CheckWorldQuestReward(link)
	if link == nil then return false, 0, 0 end
	
	--lib:PrintItemStringParse(link)

	local _, _, _, _, _, _, _, _, _, _, _, _, _, numbonus, bonuses, name = link:match("|cff(%x+)|Hitem:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)|h%[([^%]]+)%]|h|r")  
	if name == nil then
		_, _, _, _, _, _, _, _, _, _, _, _, numbonus, bonuses = link:match("item:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)")  
	end
	numbonus = tonumber(numbonus)
	if numbonus == nil then return  false, 0, 0 end
	
	local bid
	for m = 1, numbonus do
		bid, bonuses = bonuses:match(":(%d*)(.*)")
		for wqbid, wqorglv in pairs(WorldQuestRewardBonusID) do
			if bid == wqbid then 
				return true, wqbid, wqorglv
			end
		end		
	end  	
	return false, 0, 0 
end

function lib:GetItemIDWithBonusID(id, link)
	-- 들어온 id가 이미 확장된 id라면, 들어온걸 그대로 반환한다
	local chk = select(1, lib:GetItemIDAndBonusID(id))
	if chk  then
		return id
	end
	
	-- 들어온 id가 확장되지 않았고 bid가 있다면 확장해서 반환한다
	local bid = lib:GetItemLevelBonusID(link)
	if  bid then
		id = id * 10000 + bid
	end

	return id
end

function lib:GetItemLevelBonusID(link)
	if link == nil then return nil end
	
	--lib:PrintItemStringParse(link)

	local _, _, _, _, _, _, _, _, _, _, _, _, _, numbonus, bonuses, name = link:match("|cff(%x+)|Hitem:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)|h%[([^%]]+)%]|h|r")  
	if name == nil then
		_, _, _, _, _, _, _, _, _, _, _, _, numbonus, bonuses = link:match("item:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)")  
	end
	numbonus = tonumber(numbonus)
	if numbonus == nil then return nil end
	
	local bid
	for m = 1, numbonus do
		bid, bonuses = bonuses:match(":(%d*)(.*)")
		local chk, tobid = lib:IsLevelBonusID(bid)
		if chk then
			return tonumber(tobid)
		end
	end  	
	return nil
end

function lib:IsLevelBonusID(bonusID)	
	for _, levelbid in pairs(ItemLevelBonusID) do
		if levelbid == bonusID then 
			return true, bonusID
		end
	end
	
	for frombid, tobid in pairs(ItemLevelBonusIDForward) do
		if frombid == bonusID then 
			return true, tobid
		end
	end
	
	return false, 0
end

function lib:GetItemIDAndBonusID(idwbid)
	local bid = idwbid%10000
	local id = math.floor(idwbid/10000)
	local chk, tobid = lib:IsLevelBonusID(tostring(bid))
	if id > 100000 and chk then
		return true, id, tobid;
	end
	return false, idwbid, 0
end

function lib:PrintItemStringParse(itemLink)
	if itemLink == nil then return end;
	local temp, itemID, enchant, gemID1, gemID2, gemID3, gemID4, suffixID, uniqueID, linkLevel, specializationID, upgradeTypeID, instanceDifficultyID, numBonusIDs, bonusIDsAndUpgradeID, name = itemLink:match("|cff(%x+)|Hitem:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)|h%[([^%]]+)%]|h|r")  
	
	if name == nil then
		itemID, enchant, gemID1, gemID2, gemID3, gemID4, suffixID, uniqueID, linkLevel, specializationID, upgradeTypeID, instanceDifficultyID, numBonusIDs, bonusIDsAndUpgradeID = itemLink:match("item:(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%-?%d*):(%d*):(%-?%d*):(%d*):(%d*):(%d*)([^|]*)")  
		name = itemID
	end
			
	--[[	
	local lenn = link:len()
	local lll = link:sub(12, lenn);
	print(lll) 	
	--]]
	
	print("==" .. name .. "==")
	print("Item ID : " .. itemID)
	print("Enchant : " .. enchant)
	print("Gem IDs : " .. gemID1 .. " " .. gemID2 .. " " .. gemID3 .. " " .. gemID4)
	print("Suffix ID : " .. suffixID)
	print("Link Level : " .. linkLevel)
	print("Specialization ID : " .. specializationID)
	print("Upgrade Type ID : " .. upgradeTypeID)
	print("Instance Difficulty ID : " .. instanceDifficultyID)
	print("num Bonus IDs : " .. numBonusIDs)
	
	local bidList = ""
	local uid = ""
	local numbonus = tonumber(numBonusIDs)
	if numbonus and numbonus > 0 then
		local id
		for m = 1, numbonus+1 do
			id, bonusIDsAndUpgradeID = bonusIDsAndUpgradeID:match(":(%d*)(.*)")
			if m <= numbonus then
				bidList = bidList .. id .. " "
			elseif id then
				uid = id
			end				
		end 			
	end
		
	print("Bonus IDs : " .. bidList)
	print("Upgrade ID : " .. uid)
end