--------------------------------------------------------------------------------
-- GemsInfo_r11-proper
--------------------------------------------------------------------------------
localization = GetGameLocalization()
--localization = "eng"
--------------------------------------------------------------------------------
local wtMainPanel 			= mainForm		:GetChildChecked( "MainPanel", 	false )	-- главная панель, лежит на форме (слое экрана);
local wtButton	 			= mainForm		:GetChildChecked( "Button", 	false ) -- кнопка показа панели, лежит также на форме;
local wtGemPanel 			= mainForm		:GetChildChecked( "GemPanel", 	false ) -- "болванка" для каждой нашей панельки с информацией;
local wtCaption 			= wtMainPanel	:GetChildChecked( "TextView", 	false ) -- заголовок панели, лежит на панели;
local wtScrollableContainer = wtMainPanel	:GetChildChecked( "Container", 	false ) -- контейнер, содержащий панельки с информацией;

--local wtAOWindow = mainForm:GetChildChecked( "AOWindow", false )

local gemDesc				= wtGemPanel	:GetWidgetDesc()										-- описатель для клонирования "болванки";
local iconDesc				= wtGemPanel	:GetChildChecked( "IconButton", false ):GetWidgetDesc()	-- описатель для клонирования иконки;
local gems, targetGems = {}, {}														-- информация обо всех наших самоцеветах;
local widgets = {}
local colors = {																	-- цвета наших самоцветов:
	[ITEM_QUALITY_JUNK]			= {  }, 
	[ITEM_QUALITY_GOODS]        = {  },
	[ITEM_QUALITY_COMMON]       = { r = 050/255; g = 120/255; b = 050/255; a = 1 },	-- "зеленый",	+
	[ITEM_QUALITY_UNCOMMON]     = { r = 050/255; g = 070/255; b = 150/255; a = 1 }, -- "синий",		+
	[ITEM_QUALITY_RARE]         = { r = 120/255; g = 070/255; b = 170/255; a = 1 },	-- "фиоловый",	+
	[ITEM_QUALITY_EPIC]         = { r = 170/255; g = 100/255; b = 050/255; a = 1 },	-- "рыжий",		+
	[ITEM_QUALITY_LEGENDARY]    = { r = 020/255; g = 170/255; b = 120/255; a = 1 },	-- "салатовый";	+
	[ITEM_QUALITY_RELIC]        = {  },
}
local stats = {
	[ INNATE_STAT_STRENGTH ]	= L( "Strength" ),	-- Сила
	[ INNATE_STAT_MIGHT ]		= L( "Might" ),		-- Точность
	[ INNATE_STAT_DEXTERITY ]	= L( "Dexterity" ),	-- Ловкость
	[ INNATE_STAT_AGILITY ]		= L( "Agility" ),	-- Проворство
	[ INNATE_STAT_STAMINA ]		= L( "Stamina" ),	-- Выносливость
	[ INNATE_STAT_PRECISION ]	= L( "Precision" ),	-- Удача
	[ INNATE_STAT_HARDINESS ]	= L( "Hardiness" ),	-- Инстинкт
	[ INNATE_STAT_INTELLECT ]	= L( "Intellect" ),	-- Разум
	[ INNATE_STAT_INTUITION ]	= L( "Intuition" ),	-- Интуиция
	[ INNATE_STAT_SPIRIT ]		= L( "Spirit" ),	-- Дух
	[ INNATE_STAT_WILL ]		= L( "Will" ),		-- Упорство
	[ INNATE_STAT_RESOLVE ]		= L( "Resolve" ),	-- Воля
	[ INNATE_STAT_WISDOM ]		= L( "Wisdom" ),	-- Мудрость
	[ INNATE_STAT_LETHALITY ]	= L( "Lethality" ),	-- Ярость
}
local onEvent = {}
local isInspected = { initiator = false, done = true }
--------------------------------------------------------------------------------
local function DestroyWidgets( widgets )
	for i, v in widgets do
		v:DestroyWidget()
	end
end
--------------------------------------------------------------------------------
local function GetGems()													-- функция получения информации обо всех имеющихся самоцветах;
																			-- далее получим таблицу со всеми ID своей экипировки:	
	local arrEquipment = unit.GetEquipmentItemIds( avatar.GetId(), ITEM_CONT_EQUIPMENT )
	for _, id in arrEquipment do
		local parentInfo = avatar.GetItemInfo( id )							-- запишем информацию о шмотке-контейнере самоцвета;
		local enchants = enchant.GetEnchants( id )							-- если в ней есть самоцветы, то получим их ID;
		if enchants then
			for _, enchId in enchants do
				local itemInfo = avatar.GetItemInfo( enchId )				-- информация о самоцвете как о предмете;
				local metaInfo = avatar.GetItemMetaInfo( enchId )			-- информация о самоцвете как об улучшаемом предмете;
				local enchantInfo = enchant.GetEnchantInfo( enchId )		-- информация о самоцвете как о самоцветеОо;
																			-- далее записываем всю информацию в таблицу самоцветов:
				gems[enchId] = { enchId = enchId, itemInfo = itemInfo, metaInfo = metaInfo, enchantInfo = enchantInfo, parentInfo = parentInfo }
			end
		end
	end
end
--------------------------------------------------------------------------------
local function GetBackgroundTexture( gem )
	local txEnchantDefence = common.GetAddonRelatedTexture( "EnchantDefence" )
	local txEnchantOffence = common.GetAddonRelatedTexture( "EnchantOffence" )
	local txEnchantSpecial = common.GetAddonRelatedTexture( "EnchantSpecial" )
	if 		gem.enchantInfo.slot == ENUM_EnchantSlot_Defence then return txEnchantDefence
	elseif 	gem.enchantInfo.slot == ENUM_EnchantSlot_Offence then return txEnchantOffence
	elseif 	gem.enchantInfo.slot == ENUM_EnchantSlot_Special then return txEnchantSpecial
	end
end
--------------------------------------------------------------------------------
local function CreateGemPanel( gem )										-- функция создания одной информационной панельки;
	local gemPanel		= mainForm:CreateWidgetByDesc( gemDesc )			-- создаем копию панельки с помощью заготовленной "болванки";
	local wtBar 		= gemPanel:GetChildChecked( "Bar", 			false )	-- полоска прогресса крафта, лежит на копии панельки;
	local wtBarButton	= gemPanel:GetChildChecked( "BarButton", 	false )	-- передняя и задняя текстуры для полоски; на панельке;
	local wtIconButton1 = gemPanel:GetChildChecked( "IconButton", 	false )	-- "болванка" иконки; на панельке;
	local wtIconButton2 = mainForm:CreateWidgetByDesc( iconDesc )			-- создаем копию иконки;
	local wtIconButton3 = mainForm:CreateWidgetByDesc( iconDesc )
	gemPanel:AddChild( wtIconButton2 )										-- добавляем созданные копии иконки на панельку;
	gemPanel:AddChild( wtIconButton3 )
	local wtPercentage 	= gemPanel:GetChildChecked( "TextView", 	false )	-- цифровое отображение прогресса крафта; на панельке;
	local wtIndex1 		= gemPanel:GetChildChecked( "GemIndex", 	false )
	local wtIndex2		= mainForm:CreateWidgetByDesc( wtIndex1:GetWidgetDesc() )
	gemPanel:AddChild( wtIndex2 )
	wtIndex1:SetPriority( 5 )
	
	local pos = wtBar:GetPlacementPlain()
	pos.sizeX = ( 215 / 100 ) * gem.metaInfo.improvement	-- задаем длину полоске прогресса в соответствии с полученным значением;
	wtBar:SetPlacementPlain( pos )
	
	wtBar		:SetBackgroundColor( {r=0;g=1;b=0;a=1.0} )	-- закрашиваем полоску зеленым непрозрачным цветом;
	wtBarButton	:SetBackgroundColor( {r=0;g=0;b=0;a=0.5} )	-- задаем фоновой тестуре прозрачность 50% (главным образом ради прозрачной тени);
	
	local pos = wtPercentage:GetPlacementPlain()
	pos.highPosX = 35										-- задаем сдвиг для цифрового оторажения прогресса, относительно правого края панельки;
	wtPercentage:SetPlacementPlain( pos )
	
	local col 	 = GetHexFromRGBA( {r=1;g=1;b=1;a=1} )		-- цвет текста;
	local outCol = GetHexFromRGBA( {r=.3;g=.3;b=.8;a=.5} )	-- цвет обводки;
	local fSize	 = 15										-- размер шрифта;
															-- далее идет задание форматирования надписи:
	wtPercentage:SetFormat( ToWS( "<html color='"..col.."' alignx='center' fontsize='"..fSize.."' outlinecolor='"..outCol.."' outline='1'><r name='value'/></html>" ) )
	wtPercentage:SetVal( "value", ToWS( gem.metaInfo.improvement.."%" ) )	-- подстановка конкретного значения в шаблон форматированной строки;
	
	--> 1
	wtIndex1:SetFormat( ToWS( "<html color='"..col.."' alignx='center' fontsize='"..fSize.."' outlinecolor='"..outCol.."' outline='2'><r name='value'/></html>" ) )
	wtIndex1:SetVal( "value", ToWS( "56" ) )
	
	local pos = wtIndex2:GetPlacementPlain()
	pos.alignX = WIDGET_ALIGN_HIGH
	pos.highPosX = -10
	pos.highPosY = 0
	wtIndex2:SetPlacementPlain( pos )
	
	wtIndex2:SetFormat( ToWS( "<html color='"..col.."' alignx='center' fontsize='"..fSize.."' outlinecolor='"..outCol.."' outline='2'><r name='value'/></html>" ) )
	wtIndex2:SetVal( "value", ToWS( "56" ) )
	
	wtIndex1:Show( false )
	wtIndex2:Show( false )
	--< 1
	
	local pos = wtIconButton2:GetPlacementPlain()
	pos.posX = 40											-- сдвигаем иконку самоцвета вправо (при копировании они все лежат одна на другой);
	wtIconButton2:SetPlacementPlain( pos )
	
	local pos = wtIconButton3:GetPlacementPlain()
	pos.alignX = WIDGET_ALIGN_HIGH							-- выравниваем иконку улучшенного самоцвета по правому краю панельки;
	wtIconButton3:SetPlacementPlain( pos )
	
	wtIconButton1:SetName( "IconButton1_"..gem.parentInfo.dressSlot )		-- в новое название виджета добавляем доп. инфу, которая нам понадобится потом;
	wtIconButton1:SetForegroundTexture( gem.parentInfo.icon )				-- задаем текстуру шмотки в качестве фона иконки;
	wtIconButton1:SetBackgroundTexture( gem.parentInfo.icon )				-- задаем текстуру шмотки в качестве фона иконки;
	
	wtIconButton2:SetName( "IconButton2_"..gem.enchId )
	wtIconButton2:SetForegroundTexture( gem.itemInfo.icon )
	wtIconButton2:SetBackgroundTexture( GetBackgroundTexture( gem ) )
	wtIconButton2:SetForegroundClearMaskEffect(
		{ r = 1; g = 1; b = 1; a = 1 },
		{ r = 200/255; g = 200/255; b = 200/255; a = 1 }
	)
	wtIconButton2:SetBackgroundColor( colors[gem.itemInfo.quality] )
		
	wtIconButton3:SetName( "IconButton3" )
	wtIconButton3:SetForegroundTexture( gem.itemInfo.icon )
	wtIconButton3:SetBackgroundTexture( GetBackgroundTexture( gem ) )
	wtIconButton3:SetForegroundClearMaskEffect(
		{ r = 1; g = 1; b = 1; a = 1 },
		{ r = 200/255; g = 200/255; b = 200/255; a = 1 }
	)
	local col if gem.itemInfo.quality == ITEM_QUALITY_LEGENDARY then col = colors[gem.itemInfo.quality] else col = colors[gem.itemInfo.quality + 1] end
	wtIconButton3:SetBackgroundColor( col )									-- здесь мы берем следующий в иерархии цвет, для имитации улучшенного самоцвета;
	
	if ( not gem.metaInfo.hasMetaState ) or ( gem.itemInfo.quality == ITEM_QUALITY_LEGENDARY and gem.itemInfo.level == 56 ) then
		wtBar			:Show( false )
		wtBarButton		:SetForegroundColor( {r=0;g=0;b=0;a=0} )
		wtIconButton3	:Show( false )
				
		local pos 	= wtPercentage:GetPlacementPlain()
		pos.alignX 	= WIDGET_ALIGN_LOW
		pos.posX 	= 80
		pos.sizeX 	= 300
		pos.sizeY 	= 20
		wtPercentage:SetPlacementPlain( pos )
		if gem.itemInfo.quality == ITEM_QUALITY_LEGENDARY then
			local col 	 = GetHexFromRGBA( {r=1;g=1;b=1;a=1} )		-- цвет текста;
			local outCol = GetHexFromRGBA( {r=.3;g=.3;b=.8;a=.5} )	-- цвет обводки;
			local fSize	 = 13										-- размер шрифта;
															-- далее идет задание форматирования надписи:
			wtPercentage:SetFormat( ToWS( "<html color='"..col.."' alignx='left' fontsize='"..fSize.."' outlinecolor='"..outCol.."' outline='1'><r name='value'/></html>" ) )
			wtPercentage:SetVal( "value", ToWS( L( "Maximum quality" ).." ("..stats[ gem.enchantInfo.bonusStat ].." +"..gem.enchantInfo.bonus..")" ) )
						
			local pos = wtBar:GetPlacementPlain()
			pos.sizeX = 0.002
			wtBar:SetPlacementPlain( pos )
			if gem.itemInfo.level == 56 then
				wtIndex1:Show( true )
			end
		else
			wtPercentage:SetVal( "value", ToWS( L( "Gem can't be improved." ) ) )
		end
	else
		local pos = wtBar:GetPlacementPlain()
		if pos.sizeX == 0 then
			pos.sizeX = 0.001
			wtBar:SetPlacementPlain( pos )
		end
		if gem.itemInfo.quality == ITEM_QUALITY_LEGENDARY then
			wtIndex2:Show( true )
		end
	end
	
	gemPanel:Show( true )													-- делаем панельку видимой;
	
	--wtMainPanel:AddChild( gemPanel )
	wtScrollableContainer:PushFront( gemPanel )								-- "выжигаем" панельку в нашем контейнере, который находится на главной панели;
	--gemPanel:DestroyWidget()
	return gemPanel
end
--------------------------------------------------------------------------------
local function CreateGemPanels()
	if targetGems.act then targetGems.act = nil; gems = targetGems; targetGems = {} end
	for id, gem in gems do
		widgets[ GetTableSize( widgets ) + 1 ] = CreateGemPanel( gem )
	end
	--LogInfo( "Panels created!" )
	--LogTable( widgets )
end
--------------------------------------------------------------------------------
local function ActualizeCaptionDesc()
	local counter = {}
	for id, gem in gems do
		if gem.metaInfo.hasMetaState then			
			if gem.itemInfo.quality == ITEM_QUALITY_LEGENDARY and gem.itemInfo.level == 56 then
				counter[ gem.itemInfo.quality + 1 ] = ( counter[ gem.itemInfo.quality + 1 ] or 0 ) + 1
			else
				counter[ gem.itemInfo.quality ] = ( counter[ gem.itemInfo.quality ] or 0 ) + 1
			end
		end
	end
	
	--LogTable( counter )
	
	local wtDescription = wtMainPanel:GetChildChecked( "Description", false )
	local valuedText = wtDescription:GetValuedText()
	valuedText:ClearValues()
	valuedText:SetVal( "text_01", ToWS( L( "Total gems:" ).." ( " ) )
	valuedText:SetVal( "text_02", ToWS( " )" ) )
	if counter[ 8 ] then valuedText:SetVal( "textYellow",  	ToWS( "["..tostring( counter[ 8 ] or "" ).."]" ) ) end
	if counter[ 7 ] then valuedText:SetVal( "textCian",  	ToWS( "["..tostring( counter[ 7 ] or "" ).."]" ) ) end
	if counter[ 6 ] then valuedText:SetVal( "textOrange", 	ToWS( "["..tostring( counter[ 6 ] or "" ).."]" ) ) end
	if counter[ 5 ] then valuedText:SetVal( "textMagenta", 	ToWS( "["..tostring( counter[ 5 ] or "" ).."]" ) ) end
	if counter[ 4 ] then valuedText:SetVal( "textBlue", 	ToWS( "["..tostring( counter[ 4 ] or "" ).."]" ) ) end
	if counter[ 3 ] then valuedText:SetVal( "textGreen", 	ToWS( "["..tostring( counter[ 3 ] or "" ).."]" ) ) end
	wtDescription:SetValuedText( valuedText )
end
--------------------------------------------------------------------------------
						-- далее задаем начальные значения типам сортировки (если, напр., true, то после сортировки получим false):
local slotDown = true	-- считаем, что сортировка по типу вещей выполнена в порядке убывания (т.о. следующая будет в пор. возрастания, как нам и надо);
local qualDown = false	-- считаем, что сортировка по качеству самоцветов выполнена в порядке возрастания;
local progDown = false	-- считаем, что сортировка по прогрессу скрафченности самоцветов выполнена в порядке возрастания;
local nameDown = false
local lastSort = nil	-- последняя проводимая сортировка;
--------------------------------------------------------------------------------
local function SortGemPanels( param )			-- param -- тип сортировки: "progDown", "progUp", "slotDown", "slotUp", "qualDown", "qualUp";
	if not param then param = "progDown" end	-- если param не задан, то сортируем по прогрессу крафта в порядке убывания;
	lastSort = param							-- запоминаем тип последней сортировки;
	
	local gemPanels = {}						-- занесем все информационные панельки в gemPanels для дальнейшей сортировки:
	for i = 0, wtScrollableContainer:GetElementCount() - 1 do
		gemPanels[i+1] = wtScrollableContainer:At( i )
	end
	
	local function comp( wt1, wt2 )				-- функция сравнения параметров панелек в соответствии с заданным типом сортировки:
		if param == "progDown" then
			return wt1:GetChildChecked( "Bar", false ):GetPlacementPlain().sizeX > wt2:GetChildChecked( "Bar", false ):GetPlacementPlain().sizeX
		elseif param == "progUp" then	
			return wt1:GetChildChecked( "Bar", false ):GetPlacementPlain().sizeX < wt2:GetChildChecked( "Bar", false ):GetPlacementPlain().sizeX
		elseif param == "slotDown" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton1_" ); local dressSlot1 = tonumber( string.sub( name1, string.len( "IconButton1_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton1_" ); local dressSlot2 = tonumber( string.sub( name2, string.len( "IconButton1_" ) + 1 ) )
			return dressSlot1 > dressSlot2
		elseif param == "slotUp" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton1_" ); local dressSlot1 = tonumber( string.sub( name1, string.len( "IconButton1_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton1_" ); local dressSlot2 = tonumber( string.sub( name2, string.len( "IconButton1_" ) + 1 ) )
			return dressSlot1 < dressSlot2
		elseif param == "qualDown" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton2_" ); local enchId1 = tonumber( string.sub( name1, string.len( "IconButton2_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton2_" ); local enchId2 = tonumber( string.sub( name2, string.len( "IconButton2_" ) + 1 ) )
			return gems[enchId1].itemInfo.quality+gems[enchId1].itemInfo.level*10 > gems[enchId2].itemInfo.quality+gems[enchId2].itemInfo.level*10
		elseif param == "qualUp" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton2_" ); local enchId1 = tonumber( string.sub( name1, string.len( "IconButton2_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton2_" ); local enchId2 = tonumber( string.sub( name2, string.len( "IconButton2_" ) + 1 ) )
			return gems[enchId1].itemInfo.quality+gems[enchId1].itemInfo.level*10 < gems[enchId2].itemInfo.quality+gems[enchId2].itemInfo.level*10
		elseif param == "nameDown" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton2_" ); local enchId1 = tonumber( string.sub( name1, string.len( "IconButton2_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton2_" ); local enchId2 = tonumber( string.sub( name2, string.len( "IconButton2_" ) + 1 ) )
			return FromWS(gems[enchId1].itemInfo.name) > FromWS(gems[enchId2].itemInfo.name)
		elseif param == "nameUp" then
			local _, name1 = GetChildCheckedEx( wt1, "IconButton2_" ); local enchId1 = tonumber( string.sub( name1, string.len( "IconButton2_" ) + 1 ) )
			local _, name2 = GetChildCheckedEx( wt2, "IconButton2_" ); local enchId2 = tonumber( string.sub( name2, string.len( "IconButton2_" ) + 1 ) )
			return FromWS(gems[enchId1].itemInfo.name) < FromWS(gems[enchId2].itemInfo.name)
		end
	end
	
	table.sort( gemPanels, comp )						-- сама сортировка; далее восстанавливаем умолчания другим видам сортировки:
	if		( param == "slotDown" ) or ( param == "slotUp" ) then slotDown = not slotDown; qualDown = false; 	progDown = false; nameDown = false
	elseif	( param == "qualDown" ) or ( param == "qualUp" ) then qualDown = not qualDown; slotDown = true; 	progDown = false; nameDown = false
	elseif	( param == "progDown" ) or ( param == "progUp" ) then progDown = not progDown; slotDown = true; 	qualDown = false; nameDown = false
	elseif	( param == "nameDown" ) or ( param == "nameUp" ) then progDown = not progDown; slotDown = true; 	qualDown = false; progDown = false; end
	
	wtScrollableContainer:RemoveItems()					-- удаляем старое содержимое контейнера;
	
	for i = 1, GetTableSize( gemPanels ) do
		wtScrollableContainer:PushFront( gemPanels[i] )	-- "выжигаем" в контейнере новые панельки;
	end	
	
	wtScrollableContainer:ForceReposition()				-- форсируем возможность получения объема содержимого контейнера;
	wtScrollableContainer:EnsureVisible( wtScrollableContainer:At( wtScrollableContainer:GetElementCount() - 1 ) ) -- скроллим до 1-го элемента сверху;
end
--------------------------------------------------------------------------------
local function RefreshGemPanels()						-- обновление информационных панелек;
	gems = {}											-- удаляем всю информацию о самоцветах;
	wtScrollableContainer:RemoveItems()					-- очищаем контейнер;
	DestroyWidgets( widgets )
	widgets = {}
	GetGems()											-- заного получаем информацию о самоцветах;
	CreateGemPanels()									-- создаем информационные панельки;
	ActualizeCaptionDesc()
	if wtScrollableContainer:GetElementCount() > 0 then
		if lastSort then SortGemPanels( lastSort ) else SortGemPanels() end	-- сортируем их согласно последней сортировке, если таковая была;
	end
end
--------------------------------------------------------------------------------
local function Inspect()
	if wtMainPanel:IsVisible() and avatar.GetTarget() and avatar.GetTarget() ~= avatar.GetId() and unit.IsPlayer( avatar.GetTarget() ) and avatar.IsTargetInspected() and ( not isInspected.done ) then 
		--LogInfo( "GemsInfo Inspect Started" )		
		--if not avatar.IsTargetInspected() then --[[LogInfo( "Fail!" ); ]]return end
		local arrEquipment = unit.GetEquipmentItemIds( avatar.GetTarget(), ITEM_CONT_EQUIPMENT )
		if GetTableSize( arrEquipment ) > 0 then
			--LogInfo( "targetGems has been initialized" )
			--LogTable( arrEquipment )
			for _, id in arrEquipment do
				local parentInfo = avatar.GetItemInfo( id )							-- запишем информацию о шмотке-контейнере самоцвета;
				local enchants = enchant.GetEnchants( id )							-- если в ней есть самоцветы, то получим их ID;
				if enchants then
					for _, enchId in enchants do
						local itemInfo = avatar.GetItemInfo( enchId )				-- информация о самоцвете как о предмете;
						local metaInfo = avatar.GetItemMetaInfo( enchId )			-- информация о самоцвете как об улучшаемом предмете;
						local enchantInfo = enchant.GetEnchantInfo( enchId )		-- информация о самоцвете как о самоцветеОо;
																					-- далее записываем всю информацию в таблицу самоцветов:
						targetGems[enchId] = { enchId = enchId, itemInfo = itemInfo, metaInfo = metaInfo, enchantInfo = enchantInfo, parentInfo = parentInfo }
						targetGems.act = true
					end
				end
			end
			if isInspected.initiator then
				isInspected.initiator = false
				isInspected.done = true
				--LogInfo( "avatar.EndInspect()" )
				--LogTable( isInspected )
				avatar.EndInspect()
			else
				isInspected.initiator = false
				isInspected.done = true
				--LogInfo( "avatar.EndInspect() analog" )
				--LogTable( isInspected )
			end
			RefreshGemPanels()
		else
			--LogInfo( "Something's going wrong" )
		end
	else
		--LogInfo( "Inspect() by another Addon" )
	end
end
--------------------------------------------------------------------------------
local function StartInspect()
	if wtMainPanel:IsVisible() and avatar.GetTarget() and avatar.GetTarget() ~= avatar.GetId() and unit.IsPlayer( avatar.GetTarget() ) then
		if not avatar.IsTargetInspected() then
			isInspected.initiator = true
			isInspected.done = false
			--LogInfo( "avatar.StartInspect()" )
			--LogTable( isInspected )
			avatar.StartInspect( avatar.GetTarget() )
		else
			isInspected.initiator = false
			isInspected.done = false
			--LogInfo( "Already Inspecting by another Addon" )
			--LogTable( isInspected )
			Inspect()
		end
	elseif wtMainPanel:IsVisible() and avatar.GetTarget() and avatar.GetTarget() == avatar.GetId() then
		RefreshGemPanels()
	elseif wtMainPanel:IsVisible() then
		RefreshGemPanels()
	end
end
--------------------------------------------------------------------------------
local function InspectCheck()
	--LogInfo( "Inspect Finished" )
	if not isInspected.done then
		--LogInfo( "Inspect Restarted" )
		StartInspect()
	end
end
--------------------------------------------------------------------------------
local dead = nil
--------------------------------------------------------------------------------
local function OnEquipmentItemChanged( param )
	if --[[param.unitId == avatar.GetId() and]] param.slotType == ITEM_CONT_EQUIPMENT and not dead then
		RefreshGemPanels()
	end
end
--------------------------------------------------------------------------------
local function OnUnitDeadChanged( param )
	if param.unitId == avatar.GetId() then
		wtGemPanel:PlayFadeEffect( 0.0, 0.0, 2000, EA_SYMMETRIC_FLASH )
		dead = true
	end
end
---------------------------------------------------------------------------------
local function OnEffectFinished ( param )
	if param.wtOwner:IsEqual( wtGemPanel ) then
		dead = nil
	end
end
--------------------------------------------------------------------------------
local function CreateCaption()							-- создадим заголовок окна (за основу берется виджет цифрового отображения прогресса крафта);
	local pos 	= wtCaption:GetPlacementPlain()
	pos.alignX 	= WIDGET_ALIGN_CENTER					-- горизонтально выравниваем по центру;
	pos.alignY 	= WIDGET_ALIGN_LOW						-- вертикально привязываемся к верхнему краю главной панели;
	pos.sizeX 	= 400									-- размер по горизонтали пусть будет 200px;
	pos.sizeY 	= 20
	pos.posY 	= 10									-- отступ от верхнего края панели 12px;
	wtCaption:SetPlacementPlain( pos )

	local col 	 = GetHexFromRGBA( {r=1;g=1;b=1;a=1} )		-- цвет текста;
	local outCol = GetHexFromRGBA( {r=.3;g=.3;b=.8;a=.5} )	-- цвет обводки;
	local fSize	 = 15										-- размер шрифта;
															-- далее идет задание форматирования надписи и подстановка нашего текста:
	wtCaption:SetFormat( ToWS( "<html color='"..col.."' alignx='center' fontsize='"..fSize.."' outlinecolor='"..outCol.."' outline='1'><r name='value'/></html>" ) )
	wtCaption:SetVal( "value", ToWS( L( "Gems Info:" ) ) )
	
	
	local wtDescription = mainForm:CreateWidgetByDesc( wtCaption:GetWidgetDesc() )
	wtMainPanel:AddChild( wtDescription )
	wtDescription:SetName( "Description" )
	local pos 	= wtDescription:GetPlacementPlain()
	pos.alignX 	= WIDGET_ALIGN_CENTER					-- горизонтально выравниваем по центру;
	pos.alignY 	= WIDGET_ALIGN_LOW						-- вертикально привязываемся к верхнему краю главной панели;
	pos.sizeX 	= 400
	pos.sizeY 	= 20
	pos.posY 	= 30									-- отступ от верхнего края панели 12px;
	wtDescription:SetPlacementPlain( pos )
	
	local valuedText = common.CreateValuedText()
	local formatVT = 	"<html fontname='AllodsWest' alignx='center' fontsize='14' shadow='1'>"..
						"<rs class='class_01'>		<r name='text_01'/></rs>"..
						"<rs class='colorYellow'>	<r name='textYellow'/></rs>"..
						"<rs class='colorCian'>		<r name='textCian'/></rs>"..
						"<rs class='colorOrange'>	<r name='textOrange'/></rs>"..	
						"<rs class='colorMagenta'>	<r name='textMagenta'/></rs>"..			
						"<rs class='colorBlue'>		<r name='textBlue'/></rs>"..
						"<rs class='colorGreen'>	<r name='textGreen'/></rs>"..
						"<rs class='class_01'>		<r name='text_02'/></rs>"..
						"</html>"
	valuedText:SetFormat( ToWS( formatVT ) )
	valuedText:ClearValues()
	valuedText:SetClassVal( "class_01", 	"Quest" )
	valuedText:SetClassVal( "colorYellow", 	"LogColorYellow" )	-- салат 56
	valuedText:SetClassVal( "colorCian", 	"LogColorCian" )	-- салат
	valuedText:SetClassVal( "colorOrange", 	"LogColorOrange" )	-- рыж
	valuedText:SetClassVal( "colorMagenta", "LogColorMagenta" )	-- фиол
	valuedText:SetClassVal( "colorBlue", 	"LogColorBlue" )	-- син
	valuedText:SetClassVal( "colorGreen", 	"LogColorGreen" )	-- зел
	valuedText:SetVal( "text_01", ToWS( L( "Total gems:" ).." ( " ) )
	valuedText:SetVal( "text_02", ToWS( " )" ) )
	--valuedText:SetVal( "textGreen", ToWS( "1" ) )
	
	wtDescription:SetValuedText( valuedText )
end
--------------------------------------------------------------------------------
local function OnButtonReaction()					-- левый клик по кнопке
	if DnD:IsDragging() then return end				-- если тащем, то не обрабатывать нажатие;
	wtMainPanel:Show( not wtMainPanel:IsVisible() )	-- если нажали, то показать/скрыть панель;
	if wtMainPanel:IsVisible() then
		StartInspect()
		--LogInfo( "Inspect Started" )
	end
end
--------------------------------------------------------------------------------
local function IconButtonLeftClick( param )							-- левый клик по иконкам;
	if string.find( param.sender, "IconButton1_" ) then				-- ЛКМ по иконке шмотки;
		local sort = "slotUp"
		if slotDown then sort = "slotUp" else sort = "slotDown" end	-- тип сортировки (убыв./возраст.);
		SortGemPanels( sort )										-- сортировка по шмоткам;
	elseif string.find( param.sender, "IconButton2_" ) then
		if common.GetBitAnd( param.kbFlags, KBF_SHIFT ) ~= 0 then	-- ЛКМ+Shift по иконке самоцвета(см. выше);
			local sort = "nameUp"
			if nameDown then sort = "nameUp" else sort = "nameDown" end
			SortGemPanels( sort )
		else														-- ЛКМ по иконке самоцвета(см. выше);
			local sort = "qualUp"
			if qualDown then sort = "qualUp" else sort = "qualDown" end
			SortGemPanels( sort )
		end
	end	
end
--------------------------------------------------------------------------------
local function IconButtonRightClick( param )													-- ПКМ по иконке самоцвета;
	if string.find( param.sender, "IconButton2_" ) then
		local enchId = tonumber( string.sub( param.sender, string.len( "IconButton2_" ) + 1 ) )	-- вытягиваем из названия иконки ID самоцвета (а по нему получаем всю информацию по панелье);
		enchant.EnchantExtract( gems[enchId].parentInfo.itemId, gems[enchId].enchantInfo.slot )	-- вынимаем самоцвет из шмотки;
	end
end
--------------------------------------------------------------------------------
local function OnBarButton()										-- ЛКМ по полоске прогресса крафта(см. выше);
	local sort = "progDown"
	if progDown then sort = "progUp" else sort = "progDown" end
	SortGemPanels( sort )
end
--------------------------------------------------------------------------------
-- AOPanel, AOPanelMod, ATPanel support:
--------------------------------------------------------------------------------
onEvent [ "AOPANEL_START" ] = function( params )
	local wtAOPIcon = mainForm:GetChildChecked( "AOPIcon", false )
	local SetVal = { val = ToWS("") }
	local params = { header = SetVal, ptype = "button", size = 22, icon = wtAOPIcon }
	userMods.SendEvent( "AOPANEL_SEND_ADDON", { name = "Gems Info", sysName = common.GetAddonName(), param = params } )
	wtButton:Show( false )
end
--------------------------------------------------------------------------------
onEvent [ "AOPANEL_BUTTON_LEFT_CLICK" ] = function( params )
	if params.sender == common.GetAddonName() then
		OnButtonReaction()
	end
end
--------------------------------------------------------------------------------
onEvent [ "ATPANEL_START" ] = function( params )
	local txEnchantCorn = common.GetAddonRelatedTexture( "EnchantCorn" )
	userMods.SendEvent( "ATPANEL_SEND_ADDON", {	sysName = common.GetAddonName(), abbrev = "Gems", image = txEnchantCorn, 
	tip = L( "ATPanel tip" ), } )
	wtButton:Show( false )
end
--------------------------------------------------------------------------------
onEvent [ "ATPANEL_BUTTON_LEFT_CLICK" ] = function( params )
	if params.target == common.GetAddonName() then
		OnButtonReaction()
	end
end
--------------------------------------------------------------------------------
-- INIT
--------------------------------------------------------------------------------
local function Init()
	CreateCaption()									-- создаем заголовок окна;
	DnD:Init( wtMainPanel, wtMainPanel, true )		-- получаем возможность таскать панель по экрану;
	DnD:Init( wtButton, wtButton, true )			-- получаем возможность таскать кнопку по экрану;
	
	--DnD:Init( wtAOWindow, wtAOWindow, true )			-- получаем возможность таскать кнопку по экрану;
	
	--local wtFrame = wtAOWindow:GetChildChecked( "FrameDefault", false )
	
	if avatar.IsExist() then RefreshGemPanels() end	-- если наш персонаж уже в игре, то обновляем панельки, если нет, то ждем дозагрузки;
	common.RegisterEventHandler		( RefreshGemPanels,		"EVENT_AVATAR_CREATED"	)
	common.RegisterEventHandler		( OnEquipmentItemChanged,"EVENT_CONTAINER_ITEM_CHANGED"	)
	common.RegisterEventHandler		( OnUnitDeadChanged,	"EVENT_UNIT_DEAD_CHANGED"	)
	common.RegisterEventHandler		( OnEffectFinished, 	"EVENT_EFFECT_FINISHED" )
	common.RegisterEventHandler		( StartInspect, 		"EVENT_AVATAR_PRIMARY_TARGET_CHANGED" )
	common.RegisterEventHandler		( Inspect, 				"EVENT_INSPECT_STARTED" )
	common.RegisterEventHandler		( InspectCheck, 		"EVENT_INSPECT_FINISHED")
	common.RegisterReactionHandler	( OnButtonReaction,		"ButtonReaction"		)
	common.RegisterReactionHandler	( IconButtonLeftClick,	"IconButtonReaction"	)
	common.RegisterReactionHandler	( IconButtonRightClick,	"IconButtonRightClick"	)
	common.RegisterReactionHandler	( OnBarButton,			"BarButtonReaction"		)
	
	RegisterEventHandlers( onEvent )
end
--------------------------------------------------------------------------------
Init()
--------------------------------------------------------------------------------
