-- Addon: WoWTR Cataclysm-Tooltips (version: 9.02) 2022.08.27
-- Description: AddOn displays translated description in GameTooltip frame.
-- Autor: Platine  (e-mail: platine.wow@gmail.com)

-- General Variables
local _G = _G;    -- aby przespieszyć dostęp do tablicy _G
local ST_version = GetAddOnMetadata("WoWTR_Cataclysm", "Version");
local ST_miasto = "";
--local ST_waitTable = {};
--local ST_waitFrame = nil;

-- fonty z polskimi znakami diakrytycznymi
local ST_Font = QTR_Font2;
aaa = 0;

function DodajMalpe(text)
   local txt = string.gsub(text," ","@",1);  -- zamień pierwszą spacja na @
   if (string.find(txt,"@")==nil) then       -- nie dodał żadnego znaku @
      txt = txt..'@';                        -- dodaj @ na końcu tekstu
   end
   return txt;   
end


function pairsByKeys (t)
   local a = {}
   for n in pairs(t) do table.insert(a, n) end
   table.sort(a, function(a, b) return a > b end)
   local i = 0      -- iterator variable
   local iter = function ()   -- iterator function
      i = i + 1
      if a[i] == nil then return nil
         else return a[i], t[a[i]]
      end
   end
   return iter
end


function Przetlumacz(tekst)
   local txt = tekst;
--   local pomoc8, _ = string.find(txt," Slot ");      
--   if (ST_PM["title"]=="1" and pomoc8==nil) then       -- jest zezwolenie na tłumaczenie tytułu
--      for st_t_en, st_t_pl in pairsByKeys(ST_TooltipsTI) do    -- przeszuka bazę z tytułami
--         txt = string.gsub(txt, st_t_en, st_t_pl);
--      end
--   end
   pomoc8, _ = string.find(txt,"%(");       -- linia zawiera nawiasy, np. jest to lista składników itp.
   if (string.sub(txt,1,9)=='Reagents:') then
      txt = string.gsub(txt, 'Reagents:', 'Malzeme:');
   end
--   if (pomoc8==nil or pomoc8<2) then              -- tłumaczymy także dane stałe
      for st_t_en, st_t_pl in pairsByKeys(ST_Info) do
         txt = string.gsub(txt, st_t_en, st_t_pl);
      end
--   end
   return txt;
end


function OkreslKodKoloru(k1,k2,k3)
   kol1=('%.0f'):format(k1);
   kol2=('%.0f'):format(k2);
   kol3=('%.0f'):format(k3);
   c_out=kol1..","..kol2..","..kol3;
   if (kol1=="1" and kol2=="1" and kol3=="1") then
      c_out='c1';
   elseif (kol1=="1" and kol2=="0" and kol3=="0") then
      c_out='c2';
   elseif (kol1=="1" and kol2=="1" and kol3=="0") then
      c_out='c3';
   elseif (kol1=="0" and kol2=="1" and kol3=="0") then
      c_out='c4';
   elseif (kol1=="1" and kol2=="0" and kol3=="1") then
      c_out='c5';
   end
   return c_out;   
end


function ST_SetFont(element)
  if (ST_PM["fontsize"]=="13") then
     getglobal(element):SetFont(ST_Font, 13);     
  elseif (ST_PM["fontsize"]=="14") then
     getglobal(element):SetFont(ST_Font, 14);     
  elseif (ST_PM["fontsize"]=="15") then
     getglobal(element):SetFont(ST_Font, 15);     
  elseif (ST_PM["fontsize"]=="16") then
     getglobal(element):SetFont(ST_Font, 16);     
  elseif (ST_PM["fontsize"]=="17") then
     getglobal(element):SetFont(ST_Font, 17);     
  elseif (ST_PM["fontsize"]=="18") then
     getglobal(element):SetFont(ST_Font, 18);     
  elseif (ST_PM["fontsize"]=="19") then
     getglobal(element):SetFont(ST_Font, 19);     
  elseif (ST_PM["fontsize"]=="20") then
     getglobal(element):SetFont(ST_Font, 20);     
  elseif (ST_PM["fontsize"]=="12") then
     getglobal(element):SetFont(ST_Font, 12);     
  elseif (ST_PM["fontsize"]=="11") then
     getglobal(element):SetFont(ST_Font, 11);     
  elseif (ST_PM["fontsize"]=="10") then
     getglobal(element):SetFont(ST_Font, 10);     
  end
end


function ST_CheckVars()
  if (not ST_PM) then
     ST_PM = {};
  end
  if (not ST_PS) then
     ST_PS = {};
  end
  if (not ST_PH) then
     ST_PH = {};
  end
  if (not ST_PI) then
     ST_PI = {};
  end
  -- initialize check options
  if (not ST_PM["active"] ) then    -- dodatek aktywny
     ST_PM["active"] = "1";   
  end
--  if (not ST_PM["active1"] ) then    -- dodatek aktywny1 (przedmioty)
--     ST_PM["active1"] = "0";   
--  end
--  if (not ST_PM["active2"] ) then    -- dodatek aktywny2 (spelle i talenty)
--     ST_PM["active2"] = "1";   
--  end
  if (not ST_PM["title"] ) then     -- pokaż tłumaczenie tytułu
     ST_PM["title"] = "0";   
  end
  if (not ST_PM["info"] ) then      -- pokaż tłumaczenia elementów stałych
     ST_PM["info"] = "1";   
  end
  if (not ST_PM["showID"] ) then    -- pokaż ID spellu
     ST_PM["showID"] = "0";   
  end
  if (not ST_PM["price"] ) then     -- ukryj cenę skupu itemu
     ST_PM["price"] = "1";   
  end
  if (not ST_PM["saveNW"] ) then    -- zapisz nieprzetłumaczone
     ST_PM["saveNW"] = "1";   
  end
  if (not ST_PM["fontsize"] ) then  -- wielkość czcionki
     ST_PM["fontsize"] = "13";   
  end
  if (not ST_PM["setsize"] ) then   -- uaktywnij zmiany wielkości czcionki
     ST_PM["setsize"] = "0";   
  end
--  if (not ST_PM["debug"] ) then     -- testowanie
     ST_PM["debug"] = "0";   
--  end
end
  
function ST_SetCheckButtonState()
  STRCheckButton0:SetChecked(ST_PM["active"]=="1");
  STRCheckButton2:SetChecked(ST_PM["info"]=="1");
  STRCheckButton3:SetChecked(ST_PM["showID"]=="1");
  STRCheckButton4:SetChecked(ST_PM["price"]=="1");
  STRCheckButton5:SetChecked(ST_PM["saveNW"]=="1");
--  STRCheckButton01:SetChecked(ST_PM["active1"]=="1");
--  STRCheckButton02:SetChecked(ST_PM["active2"]=="1");
  -- STRCheckSize:SetChecked(ST_PM["setsize"]=="1");
  -- local fontsize = tonumber(ST_PM["fontsize"]);
  -- STRslider:SetValue(fontsize);
  -- if (ST_PM["setsize"]=="1") then
     -- STOpis1:SetFont(ST_Font, fontsize);
  -- else   
     -- STOpis1:SetFont(ST_Font, 13);
  -- end
end


function ST_BlizzardOptions()

-- Create main frame for information text
local STROptions = CreateFrame("FRAME", "WoWTRTooltipsOptions");
STROptions.name = "WoWTR Cataclysm-Tooltips";
STROptions.refresh = function (self) ST_SetCheckButtonState() end;
STROptions:SetScript("OnShow", function (self) ST_SetCheckButtonState() end);

  -- Yeni ekleme yöntemi
  if Settings and Settings.RegisterCanvasLayoutCategory then
    local Category = Settings.RegisterCanvasLayoutCategory(STROptions, "WoWTR Cataclysm-Tooltips")
    Settings.RegisterAddOnCategory(Category)
  elseif InterfaceOptions_AddCategory then
    InterfaceOptions_AddCategory(STROptions);
  end

local STROptionsHeader = STROptions:CreateFontString(nil, "ARTWORK");
STROptionsHeader:SetFontObject(GameFontNormalLarge);
STROptionsHeader:SetJustifyH("LEFT"); 
STROptionsHeader:SetJustifyV("TOP");
STROptionsHeader:ClearAllPoints();
STROptionsHeader:SetPoint("TOPLEFT", 16, -16);
STROptionsHeader:SetText("WoWTR Cataclysm Tooltips, ver. "..ST_version.." by Platine, hknylmz © 2024");

local STRCheckButton0 = CreateFrame("CheckButton", "STRCheckButton0", STROptions, "UICheckButtonTemplate");
STRCheckButton0:SetPoint("TOPLEFT", STROptionsHeader, "BOTTOMLEFT", 0, -30);
STRCheckButton0:SetScript("OnClick", function(self) if (ST_PM["active"]=="1") then ST_PM["active"]="0" else ST_PM["active"]="1" end; end);
STRCheckButton0Text:SetFont(ST_Font, 13);
STRCheckButton0Text:SetText(ST_Interface.active);     -- dodatek aktywny

local STROptionsMode = STROptions:CreateFontString(nil, "ARTWORK");
STROptionsMode:SetFontObject(GameFontWhite);
STROptionsMode:SetJustifyH("LEFT"); 
STROptionsMode:SetJustifyV("TOP");
STROptionsMode:ClearAllPoints();
STROptionsMode:SetPoint("TOPLEFT", STRCheckButton0, "BOTTOMLEFT", 20, -20);
STROptionsMode:SetFont(ST_Font, 13);
STROptionsMode:SetText(ST_Interface.mode);            -- Tryb pracy:

local STRCheckButton2 = CreateFrame("CheckButton", "STRCheckButton2", STROptions, "UICheckButtonTemplate");
STRCheckButton2:SetPoint("TOPLEFT", STROptionsMode, "BOTTOMLEFT", 0, -5);
STRCheckButton2:SetScript("OnClick", function(self) if (ST_PM["info"]=="1") then ST_PM["info"]="0" else ST_PM["info"]="1" end; end);
STRCheckButton2Text:SetFont(ST_Font, 13);
STRCheckButton2Text:SetText(ST_Interface.info);

local STRCheckButton3 = CreateFrame("CheckButton", "STRCheckButton3", STROptions, "UICheckButtonTemplate");
STRCheckButton3:SetPoint("TOPLEFT", STRCheckButton2, "BOTTOMLEFT", 0, 0);
STRCheckButton3:SetScript("OnClick", function(self) if (ST_PM["showID"]=="1") then ST_PM["showID"]="0" else ST_PM["showID"]="1" end; end);
STRCheckButton3Text:SetFont(ST_Font, 13);
STRCheckButton3Text:SetText(ST_Interface.showID);     -- pokaż nr ID umiejętności

local STRCheckButton4 = CreateFrame("CheckButton", "STRCheckButton4", STROptions, "UICheckButtonTemplate");
STRCheckButton4:SetPoint("TOPLEFT", STRCheckButton3, "BOTTOMLEFT", 0, 0);
STRCheckButton4:SetScript("OnClick", function(self) if (ST_PM["price"]=="1") then ST_PM["price"]="0" else ST_PM["price"]="1" end; end);
STRCheckButton4Text:SetFont(ST_Font, 13);
STRCheckButton4Text:SetText(ST_Interface.price);     -- wyświetlanie ceny skupu itemów

local STRCheckButton5 = CreateFrame("CheckButton", "STRCheckButton5", STROptions, "UICheckButtonTemplate");
STRCheckButton5:SetPoint("TOPLEFT", STRCheckButton4, "BOTTOMLEFT", 0, 0);
STRCheckButton5:SetScript("OnClick", function(self) if (ST_PM["saveNW"]=="1") then ST_PM["saveNW"]="0" else ST_PM["saveNW"]="1" end; end);
STRCheckButton5Text:SetFont(ST_Font, 13);
STRCheckButton5Text:SetText(ST_Interface.saveNW);     -- zapisz nieprzetłumaczone spelle

--local STRCheckDebug = CreateFrame("CheckButton", "STRCheckDebug", STROptions, "UICheckButtonTemplate");
--STRCheckDebug:SetPoint("TOPLEFT", STRCheckButton5, "BOTTOMLEFT", 0, 0);
--STRCheckDebug:SetScript("OnClick", function(self) if (ST_PM["debug"]=="1") then ST_PM["debug"]="0" else ST_PM["debug"]="1" end; end);
--STRCheckDebugText:SetFont(ST_Font, 13);
--STRCheckDebugText:SetText("włącz debuger");   



  local BKDISCORD = WoWTRTooltipsOptions:CreateFontString(nil, "ARTWORK");
  BKDISCORD:SetFontObject(GameFontWhite);
  BKDISCORD:SetJustifyH("LEFT");
  BKDISCORD:SetJustifyV("TOP");
  BKDISCORD:ClearAllPoints();
  BKDISCORD:SetPoint("TOPLEFT", STROptionsHeader, "BOTTOMLEFT", 0, -450);
  BKDISCORD:SetFont(QTR_Font2, 13);
  BKDISCORD:SetText("Discord Adresimiz:");
  
  local BKDISCORD2 = CreateFrame("EditBox", "BKDISCORD2", WoWTRTooltipsOptions, "InputBoxTemplate");
  BKDISCORD2:ClearAllPoints();
  BKDISCORD2:SetPoint("TOPLEFT", BKDISCORD, "LEFT", 5, -10);
  BKDISCORD2:SetHeight(20);
  BKDISCORD2:SetWidth(210);
  BKDISCORD2:SetAutoFocus(false);
  BKDISCORD2:SetFontObject(GameFontGreen);
  BKDISCORD2:SetText("https://discord.gg/PEknRSqEQ7");
  BKDISCORD2:SetCursorPosition(0);
  BKDISCORD2:SetScript("OnEnter", function(self)
	  GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT")
      getglobal("GameTooltipTextLeft1"):SetFont(QTR_Font2, 13);
  	  GameTooltip:SetText(QTR_Reklama.WWW3, nil, nil, nil, nil, true)
	  GameTooltip:Show() --Show the tooltip
     end);
  BKDISCORD2:SetScript("OnLeave", function(self)
      getglobal("GameTooltipTextLeft1"):SetFont(Original_Font2, 13);
	  GameTooltip:Hide() --Hide the tooltip
     end);
  BKDISCORD2:SetScript("OnTextChanged", function(self) BKDISCORD2:SetText("https://discord.gg/PEknRSqEQ7"); end);


  local STRWWW1 = WoWTRTooltipsOptions:CreateFontString(nil, "ARTWORK");
  STRWWW1:SetFontObject(GameFontWhite);
  STRWWW1:SetJustifyH("LEFT");
  STRWWW1:SetJustifyV("TOP");
  STRWWW1:ClearAllPoints();
  STRWWW1:SetPoint("TOPLEFT", BKDISCORD, "BOTTOMLEFT", 0, -40);
  STRWWW1:SetFont(QTR_Font2, 13);
  STRWWW1:SetText("WoWTR Web Sayfamız:");
  
local STRWWW2 = CreateFrame("EditBox", "STRWWW2", WoWTRTooltipsOptions, "InputBoxTemplate");
STRWWW2:ClearAllPoints();
STRWWW2:SetPoint("TOPLEFT", STRWWW1, "LEFT", 5, -10);
STRWWW2:SetHeight(20);
STRWWW2:SetWidth(210);
STRWWW2:SetAutoFocus(false);
STRWWW2:SetFontObject(GameFontGreen);
STRWWW2:SetText("https://www.wowtr.com.tr");
STRWWW2:SetCursorPosition(0);
STRWWW2:SetScript("OnEnter", function(self)
   GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT")
   getglobal("GameTooltipTextLeft1"):SetFont(BB_Font, 13);
   GameTooltip:SetText("tıklayın ve panoya kopyalamak için Ctrl+C tuşlarına basın", nil, nil, nil, nil, true)
   GameTooltip:Show() --Show the tooltip
   end);
STRWWW2:SetScript("OnLeave", function(self)
   GameTooltip:Hide() --Hide the tooltip
   end);
STRWWW2:SetScript("OnTextChanged", function(self) STRWWW2:SetText("https://www.wowtr.com.tr"); end);
end


local function StringHash(text)
  local counter = 1;
  local pomoc = 0;
  text = string.gsub(text,"|cFFFFFFFF","");
  text = string.gsub(text,"|r","");
  text = string.gsub(text,"\r","");
  text = string.gsub(text,"\n","");
  text = string.gsub(text,"(%d),(%d)","%1%2");      -- usuń przecinek między cyframi (odstęp tysięczny)
  text = string.gsub(text,"0","");
  text = string.gsub(text,"1","");
  text = string.gsub(text,"2","");
  text = string.gsub(text,"3","");
  text = string.gsub(text,"4","");
  text = string.gsub(text,"5","");
  text = string.gsub(text,"6","");
  text = string.gsub(text,"7","");
  text = string.gsub(text,"8","");
  text = string.gsub(text,"9","");
  local len = string.len(text);
  for i = 1, len, 3 do 
    counter = math.fmod(counter*8161, 4294967279);  -- 2^32 - 17: Prime!
    pomoc = (string.byte(text,i)*16776193);
    counter = counter + pomoc;
    pomoc = ((string.byte(text,i+1) or (len-i+256))*8372226);
    counter = counter + pomoc;
    pomoc = ((string.byte(text,i+2) or (len-i+256))*3932164);
    counter = counter + pomoc;
  end
  return math.fmod(counter, 4294967291) -- 2^32 - 5: Prime (and different from the prime in the loop)
end


-- This will restore the original GetItem after the tooltip is closed.
-- Spowoduje to przywrócenie oryginalnego GetItem po zamknięciu okienka tooltip.
--local ST_originalGetItem = GameTooltip.GetItem;
--GameTooltip:HookScript("OnHide", function(self) GameTooltip.GetItem = ST_originalGetItem; end);


-- Przygotowuje tłumaczenie właściwe: zamienia $x w tłumaczeniu na odpowiednie liczby z oryginału
function ST_TranslatePrepare(ST_origin, ST_tlumacz)
   local tlumaczenie = string.gsub(ST_tlumacz,"$B","\n");
   tlumaczenie = string.gsub(tlumaczenie,"$b","\n");
   tlumaczenie = string.gsub(tlumaczenie, '$L', ST_miasto);          -- miasto lokalizacji do Kamienia Powrotu
   local wartab = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};         -- max. 20 liczb całkowutych w tekście
   local arg0 = 0;
   ST_origin = string.gsub(ST_origin,"(%d),(%d)","%1%2");            -- usuń przecinek tysięczny przy liczbach
   for w in string.gmatch(ST_origin, "%d+") do
      arg0 = arg0 + 1;
      wartab[arg0] = w;      -- tu mamy kolejne cyfry z oryginału
   end;
   if (arg0>19) then
      tlumaczenie=string.gsub(tlumaczenie, "$20", wartab[20]);
   end
   if (arg0>18) then
      tlumaczenie=string.gsub(tlumaczenie, "$19", wartab[19]);
   end
   if (arg0>17) then
      tlumaczenie=string.gsub(tlumaczenie, "$18", wartab[18]);
   end
   if (arg0>16) then
      tlumaczenie=string.gsub(tlumaczenie, "$17", wartab[17]);
   end
   if (arg0>15) then
      tlumaczenie=string.gsub(tlumaczenie, "$16", wartab[16]);
   end
   if (arg0>14) then
      tlumaczenie=string.gsub(tlumaczenie, "$15", wartab[15]);
   end
   if (arg0>13) then
      tlumaczenie=string.gsub(tlumaczenie, "$14", wartab[14]);
   end
   if (arg0>12) then
      tlumaczenie=string.gsub(tlumaczenie, "$13", wartab[13]);
   end
   if (arg0>11) then
      tlumaczenie=string.gsub(tlumaczenie, "$12", wartab[12]);
   end
   if (arg0>10) then
      tlumaczenie=string.gsub(tlumaczenie, "$11", wartab[11]);
   end
   if (arg0>9) then
      tlumaczenie=string.gsub(tlumaczenie, "$10", wartab[10]);
   end
   if (arg0>8) then
      tlumaczenie=string.gsub(tlumaczenie, "$9", wartab[9]);
   end
   if (arg0>7) then
      tlumaczenie=string.gsub(tlumaczenie, "$8", wartab[8]);
   end
   if (arg0>6) then
      tlumaczenie=string.gsub(tlumaczenie, "$7", wartab[7]);
   end
   if (arg0>5) then
      tlumaczenie=string.gsub(tlumaczenie, "$6", wartab[6]);
   end
   if (arg0>4) then
      tlumaczenie=string.gsub(tlumaczenie, "$5", wartab[5]);
   end
   if (arg0>3) then
      tlumaczenie=string.gsub(tlumaczenie, "$4", wartab[4]);
   end
   if (arg0>2) then
      tlumaczenie=string.gsub(tlumaczenie, "$3", wartab[3]);
   end
   if (arg0>1) then
      tlumaczenie=string.gsub(tlumaczenie, "$2", wartab[2]);
   end
   if (arg0>0) then
      tlumaczenie=string.gsub(tlumaczenie, "$1", wartab[1]);
   end
   return tlumaczenie
end


--function ST_wait(delay, func, ...)
--   if(type(delay)~="number" or type(func)~="function") then
--      return false;
--   end
--   if (ST_waitFrame == nil) then
--      ST_waitFrame = CreateFrame("Frame","ST_WaitFrame", UIParent);
--      ST_waitFrame:SetScript("onUpdate",function (self,elapse)
--         local count = #ST_waitTable;
--         local i = 1;
--         while(i<=count) do
--            local waitRecord = tremove(ST_waitTable,i);
--            local d = tremove(waitRecord,1);
--            local f = tremove(waitRecord,1);
--            local p = tremove(waitRecord,1);
--            if(d>elapse) then
--               tinsert(ST_waitTable,i,{d-elapse,f,p});
--               i = i + 1;
--            else
--               count = count - 1;
--               f(unpack(p));
--            end
--         end
--      end);
--   end
--   tinsert(ST_waitTable,{delay,func,{...}});
--   return true;
--end


-- Funkcja przegląda wyświetlane itemy w oknie Tooltip
GameTooltip:HookScript("OnTooltipSetItem", function(self)         -- uwaga, metoda wywoływana jest z plecaka co 0.5 sek.
--aaa=aaa+1;
--print("i"..aaa);

   if (ST_PM["active"]=="1") then          -- dodatek aktywny
      local ST_itemName, ST_itemLink = self:GetItem();
      if (ST_itemName) then                              -- mamy do czynienia z itemem
         local ST_itemID, ST_itemType, ST_itemSubType = GetItemInfoInstant(ST_itemLink);
         if (not ST_itemID) then
            return;
         end   

         -- sprawdź najpierw czy są ramki z ceną
         local moneyFrameLineNumber = {};
         local money = {};
         table.insert(moneyFrameLineNumber, 0);
         table.insert(money,0);
         if (self.shownMoneyFrames) then        -- są ramki z ceną itemu
            for i = 1, self.shownMoneyFrames, 1 do
               local moneyFrameName = self:GetName().."MoneyFrame"..i;     -- nazwa obiektu
               if (_G[moneyFrameName.."PrefixText"]:GetText() == string.format("%s:", SELL_PRICE)) then
                  local _, moneyFrameAnchor = _G[moneyFrameName]:GetPoint(1);
                  moneyFrameLineNumber[i] = tonumber(string.sub(moneyFrameAnchor:GetName(),20));
                  money[i] = _G[moneyFrameName].staticMoney;
               end
            end
         end
         
         local leftText = {};
         local leftColR = {};
         local leftColG = {};
         local leftColB = {};
         local leftSize = {};
         
         local rightText = {};
         local rightColR = {};
         local rightColG = {};
         local rightColB = {};
         local rightSize = {};

         local numLines = self:NumLines();      -- Liczba linii w GameTooltip
         
         -- zapisz wszystkie linie oryginalnej ramki GameTooltip
         for i = 1, numLines, 1 do
            leftText[i] = _G[self:GetName().."TextLeft"..i]:GetText();
            leftColR[i], leftColG[i], leftColB[i] = _G[self:GetName().."TextLeft"..i]:GetTextColor();
            _font1, leftSize[i], _1 = _G[self:GetName().."TextLeft"..i]:GetFont();       -- odczytaj aktualną czcionkę i rozmiar    
            if (_G[self:GetName().."TextRight"..i]) then          -- jeśli istnieje prawy tekst
               rightText[i] = _G[self:GetName().."TextRight"..i]:GetText();
               rightColR[i], rightColG[i], rightColB[i] = _G[self:GetName().."TextRight"..i]:GetTextColor();
               _font1, rightSize[i], _1 = _G[self:GetName().."TextRight"..i]:GetFont();     -- odczytaj aktualną czcionkę i rozmiar
            end
         end

         local ST_prefix = "i";        -- itemy
         local ST_kodKoloru, ST_pomoc0, ST_pomoc1, ST_pomoc2, ST_pomoc3, ST_pomoc4, ST_pomoc5, ST_pomoc6, ST_pomoc7, ST_pomoc8;
--         local ST_leftText, ST_rightText, ST_leftTextR, ST_leftTextG, ST_leftTextB
         local ST_info, ST_tlumaczenie, ST_hash, ST_origin;
         local _font1, _1, p1, p2;
         local ST_orygText = {};
         local ST_nh = 0;                       -- nowy Hash ?

         -- pierwsza linia z tytułem przedmiotu
         ST_pomoc0, _ = string.find(_G[self:GetName().."TextLeft1"]:GetText(),"@");
         if ((ST_pomoc0==nil) and (ST_TooltipsID[ST_prefix..tostring(ST_itemID)]) and (ST_TooltipsID[ST_prefix..tostring(ST_itemID)]~="@")) then  -- jest tłumaczenie tytułu w bazie
            if (ST_PM["title"]=="1") then       -- jest zezwolenie na tłumaczenie tytułu
               _G[self:GetName().."TextLeft1"]:SetText(ST_TooltipsID[ST_prefix..tostring(ST_itemID)]);
               _G[self:GetName().."TextLeft1"]:SetFont(ST_Font, leftSize[1]);
            end
         end

         local last_moneyFrame = 0;
         local curr_money = 1;         -- odliczanie kolejnych ramek money, jeśli jest ich więcej
         for i = 2, numLines, 1 do
            if ((self.shownMoneyFrames) and (i==moneyFrameLineNumber[curr_money])) then   -- są ramki z ceną itemu i jest to linia z taką ramką
               if (ST_PM["price"]=="0") then    -- pokaż cenę skupu itemu
                  _G[self:GetName().."MoneyFrame"..curr_money.."PrefixText"]:SetText("Cena skupu:");
               else
                  _G[self:GetName().."MoneyFrame"..curr_money]:Hide();
               end
               last_moneyFrame = i;
               if (curr_money<self.shownMoneyFrames) then
                  curr_money = curr_money + 1;
               end
            else          -- dodajemy normalną linię z tekstem
               -- tu mamy blok funkcji dokonującej tłumaczenia
               ST_kodKoloru = OkreslKodKoloru(leftColR[i], leftColG[i], leftColB[i]);
               ST_pomoc1, _ = string.find(leftText[i],"Use: ");
               ST_pomoc2, _ = string.find(leftText[i],"+");
               ST_pomoc3, _ = string.find(leftText[i],"Item Level");
               ST_pomoc4, _ = string.find(leftText[i],"Mining;");
               ST_pomoc5, _ = string.find(leftText[i],'"Used ');
               ST_pomoc6, _ = string.find(leftText[i],'"%) Set: ');
               ST_pomoc7, _ = string.find(leftText[i],"->");
               ST_pomoc8, _ = string.find(leftText[i],"#rezerwa#");
               if ( (string.find(leftText[i],"@")==nil) and (string.sub(leftText[i],1,1)~="\n") and (string.len(leftText[i])>1) ) then   -- nie jest to tekst po polsku
                  if ((ST_kodKoloru=="c4" and (ST_pomoc2==nil or ST_pomoc4)) or (p1 and numLines<5) or ST_pomoc1 or ST_pomoc5 or ST_pomoc6) then  -- tu jest tekst wyszczególniony
                     if (ST_itemID == 6948) then                                 -- wyjątek na Kamień Powrotu
                        ST_pomoc5, _ = string.find(leftText[i]," Speak");        -- znajdź kropkę kończącą pierwsze zdanie
                        ST_miasto = string.sub(leftText[i],21,ST_pomoc5-2);
                        ST_pomoc6, _ = string.find(leftText[i],' Min Cooldown)');
                        if (ST_pomoc6) then              -- mamy 2 wersję tekstu z Cooldown
                           ST_hash = 1336493626;
                        else                             -- 1 wersja tekstu (bez Cooldown)
                           ST_hash = 3076025968;
                        end
                     else
                        ST_hash = StringHash(leftText[i]);
                     end
                     if (ST_TooltipsHS[ST_hash] and ST_TooltipsHS[ST_hash]~="@") then            -- mamy przetłumaczony ten Hash
                        ST_tlumaczenie = ST_TooltipsHS[ST_hash];
                        ST_tlumaczenie = ST_TranslatePrepare(leftText[i], ST_tlumaczenie);
                        leftText[i] = ST_tlumaczenie;
                     else
                        ST_nh = 1;              -- nowy Hash
                        table.insert(ST_orygText,leftText[i]);
                     end
                  elseif (leftText[i] and ST_PM["info"]=="1" and ST_pomoc7==nil) then    -- jest zezwolenie na tłumaczenie danych stałych
                     ST_info = Przetlumacz(leftText[i]);                                 -- przetłumacz teksty stałe
                     if ((ST_info == leftText[i]) and (string.len(leftText[i])>2) and (string.sub(leftText[i],1,2)~="|T")) then  -- nic nie przetłumaczono
--                        if (ST_kodKoloru ~= "c3") then
                           ST_PI[ST_info]=leftText[i];         -- zapisz
--                        end
                     else
                        leftText[i] = ST_info;
                     end
                  end
               end
               if (rightText[i] and ST_PM["info"]=="1") then             -- jest zezwolenie na tłumaczenie danych stałych
                  if (string.find(rightText[i],"@")==nil) then                             -- nie jest to tekst po polsku
                     ST_info = Przetlumacz(rightText[i]);
                     if ((ST_info == rightText[i]) and (string.len(rightText[i])>2) and (string.sub(rightText[i],1,2)~="|T")) then  -- nic nie przetłumaczono
                        ST_PI[ST_info]=rightText[i];        -- zapisz
                     else
                        rightText[i] = ST_info;
                     end
                  end               
               end
            
               -- koniec bloku funkcji dokonującej tłumaczenia
               if (rightText[i]) then     -- jest prawa linia
                  _G[self:GetName().."TextLeft"..i]:SetText(leftText[i]);
                  _G[self:GetName().."TextRight"..i]:SetText(rightText[i]);
                  _G[self:GetName().."TextLeft"..i]:SetFont(ST_Font, leftSize[i]);
                  _G[self:GetName().."TextRight"..i]:SetFont(ST_Font, rightSize[i]);
               else                       -- tylko lewa linia
                  _G[self:GetName().."TextLeft"..i]:SetText(leftText[i]);
                  _G[self:GetName().."TextLeft"..i]:SetFont(ST_Font, leftSize[i]);
               end
            end
         end
         
         if (ST_PM["showID"]=="1") then            -- czy dodawać ID itemu ?
            numLines = self:NumLines();      -- Aktualna liczba linii w GameTooltip
            if ((last_moneyFrame ~= numLines) or (ST_PM["price"]=="0")) then
               self:AddLine(" ",0,0,0);         -- dodaj odstęp przed ID
            end
            local tyt = "@";
            if (ST_hash) then
               tyt = "Hash:@"..tostring(ST_hash);
            end
            self:AddDoubleLine("Item@ID: "..tostring(ST_itemID),tyt,0,1,1,0,1,1);
            numLines = self:NumLines();      -- Aktualna liczba linii w GameTooltip
            _G[self:GetName().."TextLeft"..numLines]:SetFont(ST_Font, 12);	-- wielkość 12
            _G[self:GetName().."TextRight"..numLines]:SetFont(ST_Font, 12);	-- wielkość 12
         end
         
         self:Show();                  -- odśwież wyświetloną ramkę (zrobi także resize)
         
         if ((not ST_TooltipsID[ST_prefix..tostring(ST_itemID)]) and (ST_PM["saveNW"]=="1")) then   -- brak tłumaczenia w bazie i jest zezwolenie na zapis
            ST_PS[ST_prefix..tostring(ST_itemID)]="Item@"..ST_itemName.."@"..ST_itemType.."@"..ST_itemSubType;
         end
         if (ST_orygText or (ST_nh==1)) and (ST_PM["saveNW"]=="1") then
            for _, ST_origin in ipairs(ST_orygText) do   
               ST_hash = StringHash(ST_origin);
               if (not ST_TooltipsHS[ST_hash]) then
                  ST_origin = string.gsub(ST_origin,"(%d),(%d)","%1%2");      -- usuń przecinek między cyframi (odstęp tysięczny)
                  ST_origin = string.gsub(ST_origin,"\r","");
                  ST_origin = string.gsub(ST_origin,"\n","$B");
                  ST_PH[ST_hash]=ST_prefix..tostring(ST_itemID).."@"..ST_origin;
               end
            end
         end
         
      end     
   end   -- if ST_PM["active1"]
   
end      -- function
);
    
hooksecurefunc("GameTooltip_ShowCompareItem",function(self)
   if (ShoppingTooltip1 and ShoppingTooltip1:IsVisible()) then
      ST_CurrentEquipped(ShoppingTooltip1);
   end
   if (ShoppingTooltip2 and ShoppingTooltip2:IsVisible()) then
      ST_CurrentEquipped(ShoppingTooltip2);
   end
end );      
	

-- Funkcja przegląda wyświetlane itemy Current Equipped w oknie ShoppingTooltip1 lub ShoppingTooltip2
function ST_CurrentEquipped(obj)
--aaa=aaa+1;
--print("ir"..aaa);

   if (ST_PM["active"]=="1") then          -- dodatek aktywny
      local ST_itemName, ST_itemLink = obj:GetItem();
      if (ST_itemName) then                              -- mamy do czynienia z itemem
         local ST_itemID, ST_itemType, ST_itemSubType = GetItemInfoInstant(ST_itemLink);
         if (not ST_itemID) then
            return;
         end   

         local leftText = {};
         local leftColR = {};
         local leftColG = {};
         local leftColB = {};
         local leftSize = {};
         
         local rightText = {};
         local rightColR = {};
         local rightColG = {};
         local rightColB = {};
         local rightSize = {};

         local numLines = obj:NumLines();      -- Liczba linii w GameTooltip
         
         -- zapisz wszystkie linie oryginalnej ramki GameTooltip
         for i = 1, numLines, 1 do
            leftText[i] = _G[obj:GetName().."TextLeft"..i]:GetText();
            leftColR[i], leftColG[i], leftColB[i] = _G[obj:GetName().."TextLeft"..i]:GetTextColor();
            _font1, leftSize[i], _1 = _G[obj:GetName().."TextLeft"..i]:GetFont();       -- odczytaj aktualną czcionkę i rozmiar    
            if (_G[obj:GetName().."TextRight"..i]) then          -- jeśli istnieje prawy tekst
               rightText[i] = _G[obj:GetName().."TextRight"..i]:GetText();
               rightColR[i], rightColG[i], rightColB[i] = _G[obj:GetName().."TextRight"..i]:GetTextColor();
               _font1, rightSize[i], _1 = _G[obj:GetName().."TextRight"..i]:GetFont();     -- odczytaj aktualną czcionkę i rozmiar
            end
         end

         local ST_prefix = "i";        -- itemy
         local ST_kodKoloru, ST_pomoc0, ST_pomoc1, ST_pomoc2, ST_pomoc3, ST_pomoc4, ST_pomoc5, ST_pomoc6, ST_pomoc7, ST_pomoc8;
--         local ST_leftText, ST_rightText, ST_leftTextR, ST_leftTextG, ST_leftTextB
         local ST_info, ST_tlumaczenie, ST_hash, ST_origin;
         local _font1, _1, p1, p2;
         local ST_orygText = {};
         local ST_nh = 0;                       -- nowy Hash ?

         -- pierwsza linia z opisem założenia przedmiotu (Currently Equipped lub Equipped With)
         if (leftText[1] and ST_PM["info"]=="1") then             -- jest zezwolenie na tłumaczenie danych stałych
            if (string.find(leftText[1],"@")==nil) then                             -- nie jest to tekst po polsku
               if (leftText[1]=="Currently Equipped") then
                  ST_info = "Aktualnie masz@założone";
               elseif(leftText[1]=="Equipped With") then
                  ST_info = "Dodatkowo masz@założone";
               else
                  ST_info = lestText[1];     -- inny wariant tekstu?
               end
               if ((ST_info == leftText[1]) and (string.len(leftText[1])>2) and (string.sub(leftText[1],1,2)~="|T")) then  -- nic nie przetłumaczono
                  ST_PI[ST_info]=leftText[1];        -- zapisz
               else
                  _G[obj:GetName().."TextLeft1"]:SetText(ST_info);
                  _G[obj:GetName().."TextLeft1"]:SetFont(ST_Font, leftSize[1]);
               end
            end               
         end

         -- druga linia z tytułem przedmiotu
         ST_pomoc0, _ = string.find(_G[obj:GetName().."TextLeft2"]:GetText(),"@");
         if ((ST_pomoc0==nil) and (ST_TooltipsID[ST_prefix..tostring(ST_itemID)]) and (ST_TooltipsID[ST_prefix..tostring(ST_itemID)]~="@")) then  -- jest tłumaczenie tytułu w bazie
            if (ST_PM["title"]=="1") then       -- jest zezwolenie na tłumaczenie tytułu
               _G[obj:GetName().."TextLeft2"]:SetText(ST_TooltipsID[ST_prefix..tostring(ST_itemID)]);
               _G[obj:GetName().."TextLeft2"]:SetFont(ST_Font, leftSize[2]);
            end
         end

         for i = 3, numLines, 1 do
            -- tu mamy blok funkcji dokonującej tłumaczenia
            ST_kodKoloru = OkreslKodKoloru(leftColR[i], leftColG[i], leftColB[i]);
            ST_pomoc1, _ = string.find(leftText[i],"Use: ");
            ST_pomoc2, _ = string.find(leftText[i],"+");
            ST_pomoc3, _ = string.find(leftText[i],"Item Level");
            ST_pomoc4, _ = string.find(leftText[i],"Mining;");
            ST_pomoc5, _ = string.find(leftText[i],'"Used ');
            ST_pomoc6, _ = string.find(leftText[i],'"%) Set: ');
            ST_pomoc7, _ = string.find(leftText[i],"->");
            ST_pomoc8, _ = string.find(leftText[i],"#rezerwa#");
            if ( (string.find(leftText[i],"@")==nil) and (string.sub(leftText[i],1,1)~="\n") and (string.len(leftText[i])>1) ) then   -- nie jest to tekst po polsku
               if ((ST_kodKoloru=="c4" and (ST_pomoc2==nil or ST_pomoc4)) or (p1 and numLines<5) or ST_pomoc1 or ST_pomoc5 or ST_pomoc6 or (string.len(leftText[i])>40)) then  -- tu jest tekst wyszczególniony
                  ST_hash = StringHash(leftText[i]);
                  if (ST_TooltipsHS[ST_hash] and ST_TooltipsHS[ST_hash]~="@") then            -- mamy przetłumaczony ten Hash
                     ST_tlumaczenie = ST_TooltipsHS[ST_hash];
                     ST_tlumaczenie = ST_TranslatePrepare(leftText[i], ST_tlumaczenie);
                     leftText[i] = ST_tlumaczenie;
                  else
                     ST_nh = 1;              -- nowy Hash
                     table.insert(ST_orygText,leftText[i]);
                  end
               elseif (leftText[i] and ST_PM["info"]=="1" and ST_pomoc7==nil) then    -- jest zezwolenie na tłumaczenie danych stałych
                  ST_info = Przetlumacz(leftText[i]);                                 -- przetłumacz teksty stałe
                  if ((ST_info == leftText[i]) and (string.len(leftText[i])>2) and (string.sub(leftText[i],1,2)~="|T")) then  -- nic nie przetłumaczono
--                     if (ST_kodKoloru ~= "c3") then
                        ST_PI[ST_info]=leftText[i];         -- zapisz
--                     end
                  else
                     leftText[i] = ST_info;
                  end
               end
            end
            if (rightText[i] and ST_PM["info"]=="1") then             -- jest zezwolenie na tłumaczenie danych stałych
               if (string.find(rightText[i],"@")==nil) then                             -- nie jest to tekst po polsku
                  ST_info = Przetlumacz(rightText[i]);
                  if ((ST_info == rightText[i]) and (string.len(rightText[i])>2) and (string.sub(rightText[i],1,2)~="|T")) then  -- nic nie przetłumaczono
                     ST_PI[ST_info]=rightText[i];        -- zapisz
                  else
                     rightText[i] = ST_info;
                  end
               end               
            end
            
            -- koniec bloku funkcji dokonującej tłumaczenia
            if (rightText[i]) then     -- jest prawa linia
               _G[obj:GetName().."TextLeft"..i]:SetText(leftText[i]);
               _G[obj:GetName().."TextRight"..i]:SetText(rightText[i]);
               _G[obj:GetName().."TextLeft"..i]:SetFont(ST_Font, leftSize[i]);
               _G[obj:GetName().."TextRight"..i]:SetFont(ST_Font, rightSize[i]);
            else                       -- tylko lewa linia
               _G[obj:GetName().."TextLeft"..i]:SetText(leftText[i]);
               _G[obj:GetName().."TextLeft"..i]:SetFont(ST_Font, leftSize[i]);
            end
         end
         
         if (ST_PM["showID"]=="1") then            -- czy dodawać ID itemu ?
            obj:AddLine(" ",0,0,0);         -- dodaj odstęp przed ID
            local tyt = "@";
            if (ST_hash) then
               tyt = "Hash:@"..tostring(ST_hash);
            end
            obj:AddDoubleLine("Item@ID: "..tostring(ST_itemID),tyt,0,1,1,0,1,1);
            numLines = obj:NumLines();      -- Aktualna liczba linii w ShoppingTooltipX
            _G[obj:GetName().."TextLeft"..numLines]:SetFont(ST_Font, 12);	-- wielkość 12
            _G[obj:GetName().."TextRight"..numLines]:SetFont(ST_Font, 12);	-- wielkość 12
         end
         
         obj:Show();                  -- odśwież wyświetloną ramkę (zrobi także resize)
         
         if ((not ST_TooltipsID[ST_prefix..tostring(ST_itemID)]) and (ST_PM["saveNW"]=="1")) then   -- brak tłumaczenia w bazie i jest zezwolenie na zapis
            ST_PS[ST_prefix..tostring(ST_itemID)]="Item@"..ST_itemName.."@"..ST_itemType.."@"..ST_itemSubType;
         end
         if (ST_orygText or (ST_nh==1)) and (ST_PM["saveNW"]=="1") then
            for _, ST_origin in ipairs(ST_orygText) do   
               ST_hash = StringHash(ST_origin);
               if (not ST_TooltipsHS[ST_hash]) then
                  ST_origin = string.gsub(ST_origin,"(%d),(%d)","%1%2");      -- usuń przecinek między cyframi (odstęp tysięczny)
                  ST_origin = string.gsub(ST_origin,"\r","");
                  ST_origin = string.gsub(ST_origin,"\n","$B");
                  ST_PH[ST_hash]=ST_prefix..tostring(ST_itemID).."@"..ST_origin;
               end
            end
         end
         
      end     
   end   -- if ST_PM["active1"]
   
end
    

-- Funkcja przegląda wyświetlane spelle i talenty w oknie Tooltip
GameTooltip:HookScript("OnTooltipSetSpell", function(self)
--aaa=aaa+1;
--print("s"..aaa);

   if (ST_PM["active"]=="1") then          -- dodatek aktywny 
      local ST_spellName, ST_spellID = self:GetSpell();
      if (ST_spellName) then                             -- jest to spell (lub talent)
         local ST_kodKoloru, ST_pomoc0, ST_pomoc1, ST_pomoc2, ST_pomoc3, ST_pomoc4, ST_pomoc5, ST_pomoc6, ST_pomoc7, ST_pomoc8;
         local ST_leftText, ST_rightText, ST_leftTextR, ST_leftTextG, ST_leftTextB, ST_info, ST_tlumaczenie, ST_hash, ST_origin;
         local _font1, _size1, _1;
         local ST_orygText = {};
         local ST_nh = 0;                       -- nowy Hash ?
         local ST_prefix = "s";
         if (PlayerTalentFrame and PlayerTalentFrame:IsVisible() and string.sub(PlayerTalentFrameTitleText:GetText(),1,6)=="Talent") then
            local PTFleft = PlayerTalentFrame:GetLeft();
            local PTFright = PlayerTalentFrame:GetRight();
            local PTFbootom = PlayerTalentFrame:GetBottom();
            local PTFtop = PlayerTalentFrame:GetTop();
            local x,y = GetCursorPosition();
            if (x>PTFleft and x<PTFright and y>PTFbootom and y<PTFtop) then
               ST_prefix = "t";
            end
         end
         
         ST_pomoc0, _ = string.find(_G["GameTooltipTextLeft1"]:GetText(),"@");
         if ((ST_pomoc==nil) and (ST_TooltipsID[ST_prefix..tostring(ST_spellID)]) and (ST_TooltipsID[ST_prefix..tostring(ST_spellID)]~="@")) then  -- jest tłumaczenie tytułu w bazie
            if (ST_PM["title"]=="1") then       -- jest zezwolenie na tłumaczenie tytułu
               local _font2, _size2, _2 = _G["GameTooltipTextLeft1"]:GetFont();       -- odczytaj aktualną czcionkę i rozmiar
               _G["GameTooltipTextLeft1"]:SetText(ST_TooltipsID[ST_prefix..tostring(ST_spellID)]);
               _G["GameTooltipTextLeft1"]:SetFont(ST_Font, _size2);
            end
         end
         
         -- Liczba linii w Tooltip
         local numLines = self:NumLines();

         -- Poszczególne linie (L+R) Tooltip
         for i = 2, numLines, 1 do
            ST_leftText = _G[self:GetName().."TextLeft"..i]:GetText();
            ST_leftTextR, ST_leftTextG, ST_leftTextB = _G[self:GetName().."TextLeft"..i]:GetTextColor();
            ST_kodKoloru = OkreslKodKoloru(ST_leftTextR,ST_leftTextG,ST_leftTextB);
            if (not ST_pomoc1) then
               ST_pomoc1, _ = string.find(ST_leftText,"@ID:");
            end
            ST_pomoc2, _ = string.find(ST_leftText,"Use: ");
            ST_pomoc3, _ = string.find(ST_leftText,"Reagents: ");
            ST_pomoc4, _ = string.find(ST_leftText,"+");
            ST_pomoc5, _ = string.find(ST_leftText,"Item Level");
            ST_pomoc6, _ = string.find(ST_leftText,"%),");
            ST_pomoc7, _ = string.find(ST_leftText,"%) Set: ");
            ST_pomoc8, _ = string.find(ST_leftText,"#rezerwa#");       
            _font1, _size1, _1 = _G[self:GetName().."TextLeft"..i]:GetFont();       -- odczytaj aktualną czcionkę i rozmiar
            if ( (string.find(ST_leftText,"@")==nil) and (string.len(ST_leftText)>1) ) then  -- nie jest to tekst po polsku
               if ((ST_pomoc2 or ST_pomoc7 or (ST_kodKoloru=="c3" and not ST_pomoc5) or (ST_kodKoloru=="c4" and not ST_pomoc4)) and (string.sub(ST_leftText,1,1)~="\n") or (string.len(ST_leftText)>50 and not ST_pomoc3)) then  -- tu jest tekst wyszczególniony
                  ST_hash = StringHash(ST_leftText);
                  if (ST_TooltipsHS[ST_hash] and ST_TooltipsHS[ST_hash]~="@") then        -- mamy przetłumaczony ten Hash
                     ST_tlumaczenie = ST_TooltipsHS[ST_hash];
                     ST_tlumaczenie = ST_TranslatePrepare(ST_leftText, ST_tlumaczenie);
                     _G[self:GetName().."TextLeft"..i]:SetText(ST_tlumaczenie);
                     _G[self:GetName().."TextLeft"..i]:SetFont(ST_Font, _size1);
                  else
                     ST_nh = 1;              -- nowy Hash
                     table.insert(ST_orygText,ST_leftText);
                  end
               elseif ((ST_leftText and ST_PM["info"]=="1") and (string.sub(ST_leftText,1,1)~="\n") and (ST_pomoc6==nil)) then  -- jest zezwolenie na tłumaczenie danych stałych
                  ST_info = Przetlumacz(ST_leftText);                    -- przetłumacz teksty stałe
                  if ((ST_info == ST_leftText) and (string.len(ST_leftText)>2) and (string.sub(ST_leftText,1,2)~="|T")) then       -- nic nie przetłumaczono
--                     if (ST_kodKoloru ~= "c3") then
                        ST_PI[ST_info]=ST_leftText;         -- zapisz
--                     end
                  else
                     _G[self:GetName().."TextLeft"..i]:SetText(ST_info);
                     _G[self:GetName().."TextLeft"..i]:SetFont(ST_Font, _size1);
                  end
               end
            end
            ST_rightText = _G[self:GetName().."TextRight"..i]:GetText();
--          ST_rightTextR, ST_rightTextG, ST_rightTextB = _G[self:GetName().."TextRight"..i]:GetTextColor();
            if (ST_rightText and ST_PM["info"]=="1") then             -- jest zezwolenie na tłumaczenie danych stałych
               if (string.find(ST_rightText,"@")==nil) then                             -- nie jest to tekst po polsku
                  ST_info = Przetlumacz(ST_rightText);
                  if ((ST_info == ST_rightText) and (string.len(ST_rightText)>2) and (string.sub(ST_rightText,1,2)~="|T")) then  -- nic nie przetłumaczono
                     ST_PI[ST_info]=ST_rightText;        -- zapisz
                  else
                     _G[self:GetName().."TextRight"..i]:SetText(ST_info);
                     _G[self:GetName().."TextRight"..i]:SetFont(ST_Font, _size1);
                  end
               end
            end
         end
               
         if (ST_PM["showID"]=="1" and ST_pomoc1==nil) then
            self:AddLine(" ",0,0,0);                                    -- dodaj odstęp przed ID
            local tyt = "@";
            if (ST_hash) then
               tyt = "Hash:@"..tostring(ST_hash);
               if (ST_orygText and #ST_orygText>1) then
                  tyt = tyt.."+";
               end
            end
            if (ST_prefix == "t") then
               self:AddDoubleLine("Talent@ID: "..tostring(ST_spellID),tyt,0,1,1,0,1,1);
            else
               self:AddDoubleLine("Spell@ID: "..tostring(ST_spellID),tyt,0,1,1,0,1,1);
            end
            _G[self:GetName().."TextLeft"..self:NumLines()]:SetFont(ST_Font, 12);	-- wielkość 12
            _G[self:GetName().."TextRight"..self:NumLines()]:SetFont(ST_Font, 12);	-- wielkość 12
         end
         
         self:Show();                                                      -- odśwież wyświetloną ramkę (zrobi także resize)
            
         if ((not ST_TooltipsID[ST_prefix..tostring(ST_spellID)]) and (ST_PM["saveNW"]=="1")) then   -- brak tłumaczenia w bazie i jest zezwolenie na zapis
            if (ST_prefix == 't') then
               ST_PS[ST_prefix..tostring(ST_spellID)]="Talent@"..ST_spellName.."@"..UnitClass("player").."@"..UnitRace("player");
            else
               ST_PS[ST_prefix..tostring(ST_spellID)]="Spell@"..ST_spellName.."@"..UnitClass("player").."@"..UnitRace("player");
            end
         end
         if (ST_orygText or (ST_nh==1)) and (ST_PM["saveNW"]=="1") then
            for _, ST_origin in ipairs(ST_orygText) do   
               ST_hash = StringHash(ST_origin);
               if (not ST_TooltipsHS[ST_hash]) then
                  ST_origin = string.gsub(ST_origin,"(%d),(%d)","%1%2");      -- usuń przecinek między cyframi (odstęp tysięczny)
                  ST_origin = string.gsub(ST_origin,"\r","");
                  ST_origin = string.gsub(ST_origin,"\n","$B");
                  ST_PH[ST_hash]=ST_prefix..tostring(ST_spellID).."@"..ST_origin;
               end
            end
         end
      end
   end
end      -- function
);


GameTooltip:HookScript('OnShow', function(self, ...)        -- do obsługi BuffButtonX
   local ST_GTownerName = self:GetOwner():GetName();
--print(ST_GTownerName);   
   if (ST_GTownerName and (string.sub(ST_GTownerName,1,10) == "BuffButton") and (ST_PM["active"]=="1")) then   -- mamy przycisk BuffButtonX i dodatek jest aktywny
      local ST_kodKoloru, ST_pomoc0, ST_pomoc1, ST_pomoc2, ST_pomoc3, ST_pomoc4, ST_pomoc5, ST_pomoc6, ST_pomoc7, ST_pomoc8;
      local ST_leftText, ST_rightText, ST_leftTextR, ST_leftTextG, ST_leftTextB, ST_info, ST_tlumaczenie, ST_hash, ST_origin;
      local _font1, _size1, _1, ST_title;
      local ST_orygText = {};
      local ST_nh = 0;                       -- nowy Hash ?
      local ST_prefix = "h";       -- typ hash z buffButton
      
      ST_title = _G["GameTooltipTextLeft1"]:GetText();
      local ST_prefix = "h"..ST_title;       -- typ hash z buffButton
      ST_pomoc0, _ = string.find(ST_title,"@");
      if (ST_PM["title"]=="1") then       -- jest zezwolenie na tłumaczenie tytułu
         if (ST_pomoc==nil) then          -- nie jest wyświetlany już tekst polski
            if (ST_TooltipsTI[ST_title]) then   -- jest tłumaczenie tytułu w bazie
               local _font2, _size2, _2 = _G["GameTooltipTextLeft1"]:GetFont();       -- odczytaj aktualną czcionkę i rozmiar
               _G["GameTooltipTextLeft1"]:SetText(ST_TooltipsTI[ST_title]);
               _G["GameTooltipTextLeft1"]:SetFont(ST_Font, _size2);
            else
               ST_PS[ST_prefix]="Title@"..ST_title;
            end
         end
      end
         
      local numLines = self:NumLines();
      for i = 2, numLines, 1 do
         ST_leftText = _G[self:GetName().."TextLeft"..i]:GetText();
         ST_hash = StringHash(ST_leftText);
         if (ST_TooltipsHS[ST_hash] and ST_TooltipsHS[ST_hash]~="@") then        -- mamy przetłumaczony ten Hash
            ST_tlumaczenie = ST_TooltipsHS[ST_hash];
            ST_tlumaczenie = ST_TranslatePrepare(ST_leftText, ST_tlumaczenie);
            _font1, _size1, _1 = _G[self:GetName().."TextLeft"..i]:GetFont();    -- odczytaj aktualną czcionkę i rozmiar
            _G[self:GetName().."TextLeft"..i]:SetText(ST_tlumaczenie);
            _G[self:GetName().."TextLeft"..i]:SetFont(ST_Font, _size1);
         else
            ST_nh = 1;              -- nowy Hash
            table.insert(ST_orygText,ST_leftText);
         end
      end
      
      if (ST_PM["showID"]=="1" and ST_hash) then                     -- pokaż nr Hasha
         self:AddLine(" ",0,0,0);                                    -- dodaj odstęp przed ID
         tyt = "Hash:@"..tostring(ST_hash);
         self:AddDoubleLine(" ",tyt,0,1,1,0,1,1);
         _G[self:GetName().."TextLeft"..self:NumLines()]:SetFont(ST_Font, 12);	-- wielkość 12
         _G[self:GetName().."TextRight"..self:NumLines()]:SetFont(ST_Font, 12);	-- wielkość 12
      end

      self:Show();                                                      -- odśwież wyświetloną ramkę (zrobi także resize)
      
      if (ST_orygText or (ST_nh==1)) and (ST_PM["saveNW"]=="1") then
         for _, ST_origin in ipairs(ST_orygText) do   
            ST_hash = StringHash(ST_origin);
            if (not ST_TooltipsHS[ST_hash]) then
               ST_origin = string.gsub(ST_origin,"(%d),(%d)","%1%2");      -- usuń przecinek między cyframi (odstęp tysięczny)
               ST_origin = string.gsub(ST_origin,"\r","");
               ST_origin = string.gsub(ST_origin,"\n","$B");
               ST_PH[ST_hash]=ST_prefix.."@"..ST_origin;
            end
         end
      end
   end
   
end );      


ST_CheckVars();
ST_BlizzardOptions();

