Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_    #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__   #
 __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____   #
  ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____  #
	______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____  #
	 _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ #
	 __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
	  _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
		___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I  By: Munglunch               #
##############################################################################
credit: Elv.           original logic from ElvUI. Adapted to SVUI #
##############################################################################
##########################################################
LOCALIZED LUA FUNCTIONS
##########################################################
]]--
--[[ GLOBALS ]]--
local _G = _G;
local unpack 	= _G.unpack;
local select 	= _G.select;
local pairs 	= _G.pairs;
local ipairs 	= _G.ipairs;
local type 		= _G.type;
local tinsert 	= _G.tinsert;
local string 	= _G.string;
local math 		= _G.math;
local table 	= _G.table;
--[[ STRING METHODS ]]--
local find, format, len = string.find, string.format, string.len;
local sub, byte = string.sub, string.byte;
--[[ MATH METHODS ]]--
local floor, ceil = math.floor, math.ceil;
local twipe = table.wipe;
--[[
##########################################################
GET ADDON DATA
##########################################################
]]--
local SV = select(2, ...)
local L = SV.L
local MOD = SV:NewPackage("SVBag", L["Bags"]);
local TTIP = SV.SVTip;
--[[
##########################################################
LOCAL VARS
##########################################################
]]--
local CreateFrame = _G.CreateFrame;
local hooksecurefunc = _G.hooksecurefunc;
local iconTex = [[Interface\BUTTONS\WHITE8X8]]
local borderTex = [[Interface\Addons\SVUI\assets\artwork\Template\ROUND]]
local ICON_BAGS = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-BAGS]]
local ICON_SORT = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-SORT]]
local ICON_STACK = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-STACK]]
local ICON_TRANSFER = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-TRANSFER]]
local ICON_PURCHASE = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-PURCHASE]]
local ICON_VENDOR = [[Interface\AddOns\SVUI\assets\artwork\Icons\BAGS-VENDOR]]
local numBagFrame = NUM_BAG_FRAMES + 1;
local gearSet, gearList = {}, {};
local internalTimer;
local RefProfessionColors = {
	[0x0008] = {224/255,187/255,74/255},
	[0x0010] = {74/255,77/255,224/255},
	[0x0020] = {18/255,181/255,32/255},
	[0x0040] = {160/255,3/255,168/255},
	[0x0080] = {232/255,118/255,46/255},
	[0x0200] = {8/255,180/255,207/255},
	[0x0400] = {105/255,79/255,7/255},
	[0x10000] = {222/255,13/255,65/255},
	[0x100000] = {18/255,224/255,180/255}
}
--[[
##########################################################
LOCAL FUNCTIONS
##########################################################
]]--
local function StyleBagToolButton(button)
	if button.styled then return end

	local outer = button:CreateTexture(nil, "OVERLAY")
	outer:WrapOuter(button, 6, 6)
	outer:SetTexture(borderTex)
	outer:SetGradient("VERTICAL", 0.4, 0.47, 0.5, 0.3, 0.33, 0.35)

	if button.SetNormalTexture then
		iconTex = button:GetNormalTexture()
		iconTex:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1)
	end

	local icon = button:CreateTexture(nil, "OVERLAY")
	icon:WrapOuter(button, 6, 6)
	SetPortraitToTexture(icon, iconTex)
	hooksecurefunc(icon, "SetTexture", SetPortraitToTexture)

	local hover = button:CreateTexture(nil, "HIGHLIGHT")
	hover:WrapOuter(button, 6, 6)
	hover:SetTexture(borderTex)
	hover:SetGradient(unpack(SV.Media.gradient.yellow))

	if button.SetPushedTexture then
		local pushed = button:CreateTexture(nil, "BORDER")
		pushed:WrapOuter(button, 6, 6)
		pushed:SetTexture(borderTex)
		pushed:SetGradient(unpack(SV.Media.gradient.highlight))
		button:SetPushedTexture(pushed)
	end

	if button.SetCheckedTexture then
		local checked = button:CreateTexture(nil, "BORDER")
		checked:WrapOuter(button, 6, 6)
		checked:SetTexture(borderTex)
		checked:SetGradient(unpack(SV.Media.gradient.green))
		button:SetCheckedTexture(checked)
	end

	if button.SetDisabledTexture then
		local disabled = button:CreateTexture(nil, "BORDER")
		disabled:WrapOuter(button, 6, 6)
		disabled:SetTexture(borderTex)
		disabled:SetGradient(unpack(SV.Media.gradient.default))
		button:SetDisabledTexture(disabled)
	end

	local cd = button:GetName() and _G[button:GetName().."Cooldown"]
	if cd then
		cd:ClearAllPoints()
		cd:FillInner()
	end
	button.styled = true
end

local function encodeSub(i, j, k)
	local l = j;
	while k>0 and l <= #i do
		local m = byte(i, l)
		if m>240 then
			l = l + 4;
		elseif m>225 then
			l = l + 3;
		elseif m>192 then
			l = l + 2;
		else
			l = l + 1;
		end
		k = k-1;
	end
	return i:sub(j, (l-1))
end

local function formatAndSave(level, font, saveTo)
	if level == 1 then
		font:SetFormattedText("|cffffffaa%s|r", encodeSub(saveTo[1], 1, 4))
	elseif level == 2 then
		font:SetFormattedText("|cffffffaa%s %s|r", encodeSub(saveTo[1], 1, 4), encodeSub(saveTo[2], 1, 4))
	elseif level == 3 then
		font:SetFormattedText("|cffffffaa%s %s %s|r", encodeSub(saveTo[1], 1, 4), encodeSub(saveTo[2], 1, 4), encodeSub(saveTo[3], 1, 4))
	else
		font:SetText()
	end
end

local function BuildEquipmentMap()
	for t, u in pairs(gearList)do
		twipe(u);
	end
	local set, player, bank, bags, index, bag, loc, _;
	for i = 1, GetNumEquipmentSets() do
		set = GetEquipmentSetInfo(i);
		gearSet = GetEquipmentSetLocations(set);
		if(gearSet) then
			for key, location in pairs(gearSet)do
				if(type(location) ~= "string") then
					player, bank, bags, _, index, bag = EquipmentManager_UnpackLocation(location);
					if((bank or bags) and (index and bag)) then
						loc = format("%d_%d", bag, index);
						gearList[loc] = (gearList[loc] or {});
						tinsert(gearList[loc], set);
					end
				end
			end
		end
	end
end
--[[
##########################################################
CORE FUNCTIONS
##########################################################
]]--
function MOD:INVENTORY_SEARCH_UPDATE()
	for _, frame in pairs(self.BagFrames) do
		for id, bag in ipairs(frame.Bags) do
			for i = 1, GetContainerNumSlots(id) do
				local _, _, _, _, _, _, _, n = GetContainerItemInfo(id, i)
				local item = bag[i]
				if(item and item:IsShown()) then
					if n then
						SetItemButtonDesaturated(item, 1, 1, 1, 1)
						item:SetAlpha(0.4)
					else
						SetItemButtonDesaturated(item, 0, 1, 1, 1)
						item:SetAlpha(1)
					end
				end
			end
		end
	end
end

local SlotUpdate = function(self, slotID)
	if(not self[slotID]) then return end

	local bag = self:GetID();
	local slot = self[slotID];
	local bagType = self.bagFamily;

	slot:Show()

	local texture, count, locked, rarity = GetContainerItemInfo(bag, slotID);
	local start, duration, enable = GetContainerItemCooldown(bag, slotID);
	local itemLink = GetContainerItemLink(bag, slotID);

	CooldownFrame_SetTimer(slot.cooldown, start, duration, enable);

	if(duration > 0 and enable == 0) then
		SetItemButtonTextureVertexColor(slot, 0.4, 0.4, 0.4)
	else
		SetItemButtonTextureVertexColor(slot, 1, 1, 1)
	end

	if(bagType) then
		local r, g, b = bagType[1], bagType[2], bagType[3];
		slot:SetBackdropColor(r, g, b, 0.5)
		slot:SetBackdropBorderColor(r, g, b, 1)
	elseif(itemLink) then
		local rarity = select(3, GetItemInfo(itemLink))
		if(rarity and rarity > 1) then
			local r, g, b = GetItemQualityColor(rarity)
			slot:SetBackdropBorderColor(r, g, b)
		else
			slot:SetBackdropBorderColor(0, 0, 0)
		end
	else
		slot:SetBackdropBorderColor(0, 0, 0)
	end

	if(C_NewItems.IsNewItem(bag, slotID)) then
		ActionButton_ShowOverlayGlow(slot)
	else
		ActionButton_HideOverlayGlow(slot)
	end

	SetItemButtonTexture(slot, texture)
	SetItemButtonCount(slot, count)
	SetItemButtonDesaturated(slot, locked, 0.5, 0.5, 0.5)
end

local RefreshSlots = function(self)
	local bagID = self:GetID()
	if(not bagID or (not self.SlotUpdate)) then return end
	local maxcount = GetContainerNumSlots(bagID)
	for slotID = 1, maxcount do
		self:SlotUpdate(slotID)
	end
end

local BagMenu_OnEnter = function(self)
	local parent = self.parent
	if(not parent) then return end
	for bagID, bag in ipairs(parent.Bags) do
		local numSlots = GetContainerNumSlots(bagID)
		for slotID = 1, numSlots do
			if bag[slotID] then
				if bagID == self.id then
					bag[slotID]:SetAlpha(1)
				else
					bag[slotID]:SetAlpha(0.1)
				end
			end
		end
	end
end

local BagMenu_OnLeave = function(self)
	local parent = self.parent
	if(not parent) then return end
	for bagID, bag in ipairs(parent.Bags) do
		local numSlots = GetContainerNumSlots(bagID)
		for slotID = 1, numSlots do
			if bag[slotID] then
				bag[slotID]:SetAlpha(1)
			end
		end
	end
end

local ContainerFrame_UpdateCooldowns = function(self)
	for bagID, bag in ipairs(self.Bags) do
		for slotID = 1, GetContainerNumSlots(bagID)do
			local start, duration, enable = GetContainerItemCooldown(bagID, slotID)
			if(bag[slotID]) then
				CooldownFrame_SetTimer(bag[slotID].cooldown, start, duration, enable)
				if duration > 0 and enable == 0 then
					SetItemButtonTextureVertexColor(bag[slotID], 0.4, 0.4, 0.4)
				else
					SetItemButtonTextureVertexColor(bag[slotID], 1, 1, 1)
				end
			end
		end
	end
end

local ContainerFrame_UpdateBags = function(self)
	for bagID, bag in ipairs(self.Bags) do
		bag:RefreshSlots()
	end
end

local ContainerFrame_UpdateLayout = function(self)
	if SV.db.SVBag.enable ~= true then return; end

	local isBank = self.isBank
	local isReagent = self.isReagent
	local containerName = self:GetName()
	local buttonSpacing, numContainerRows = 8, 0;
	local containerWidth, numContainerColumns, buttonSize

	if(SV.db.SVBag.alignToChat) then
		containerWidth = (isBank and SV.db.SVDock.dockLeftWidth or SV.db.SVDock.dockRightWidth)
		local precount, avg = 0, 0.08;
		for i, bagID in ipairs(self.BagIDs) do
			local numSlots = GetContainerNumSlots(bagID);
			precount = precount + (numSlots or 0);
		end
		if(precount > 287) then
			avg = 0.12
		elseif(precount > 167) then
			avg = 0.11
		elseif(precount > 127) then
			avg = 0.1
		elseif(precount > 97) then
			avg = 0.09
		end

		--local rowCalc = ceil(precount * avg);
		numContainerColumns = avg * 100;

		local unitSize = floor(containerWidth / numContainerColumns)
		buttonSize = unitSize - buttonSpacing;
	else
		containerWidth = (isBank and SV.db.SVBag.bankWidth) or SV.db.SVBag.bagWidth
		buttonSize = isBank and SV.db.SVBag.bankSize or SV.db.SVBag.bagSize;
		numContainerColumns = floor(containerWidth / (buttonSize + buttonSpacing));
	end

	local holderWidth = ((buttonSize + buttonSpacing) * numContainerColumns) - buttonSpacing;
	local bottomPadding = (containerWidth - holderWidth) * 0.5;
	local lastButton, lastRowButton, globalName;
	local numContainerSlots, fullContainerSlots = GetNumBankSlots();
	local totalSlots = 0;

	self.holderFrame:Width(holderWidth);

	local menu = self.BagMenu

	if(not isReagent)  then
		for i, bagID in ipairs(self.BagIDs) do
			if((not isBank and bagID <= 3) or (isBank and bagID ~= -1 and numContainerSlots >= 1 and not ((i - 1) > numContainerSlots))) then
				menu:Size(((buttonSize + buttonSpacing) * (isBank and i - 1 or i)) + buttonSpacing, buttonSize + (buttonSpacing * 2))

				local bagSlot;

				if(not menu[i]) then
					if isBank then
						globalName = ("SVUI_BankBag%d"):format((bagID - 4));
						bagSlot = CreateFrame("CheckButton", globalName, menu, "BankItemButtonBagTemplate")
					else
						globalName = ("SVUI_MainBag%dSlot"):format(bagID);
						bagSlot = CreateFrame("CheckButton", globalName, menu, "BagSlotButtonTemplate")
					end

					bagSlot.parent = self;

					bagSlot:SetNormalTexture("")
					bagSlot:SetCheckedTexture("")
					bagSlot:SetPushedTexture("")
					bagSlot:SetScript("OnClick", nil)

					local texName = ("%sIconTexture"):format(globalName)
					bagSlot.iconTexture = _G[texName];
					bagSlot.iconTexture:FillInner()
					bagSlot.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)

					bagSlot:HookScript("OnEnter", BagMenu_OnEnter)
					bagSlot:HookScript("OnLeave", BagMenu_OnLeave)

					if(isBank) then
						bagSlot:SetID(bagID)
						bagSlot.id = bagID;
					else
						bagSlot.id = (bagID + 1);
					end

					menu[i] = bagSlot;
				else
					bagSlot = menu[i]
				end

				bagSlot:Size(buttonSize)
				bagSlot:ClearAllPoints()

				if(isBank) then
					if(i == 2) then
						bagSlot:SetPoint("BOTTOMLEFT", menu, "BOTTOMLEFT", buttonSpacing, buttonSpacing)
					else
						bagSlot:SetPoint("LEFT", menu[i - 1], "RIGHT", buttonSpacing, 0)
					end

					if(bagSlot.GetInventorySlot) then
						BankFrameItemButton_Update(bagSlot)
						BankFrameItemButton_UpdateLocked(bagSlot)
					end
				else
					if(i == 1) then
						bagSlot:SetPoint("BOTTOMLEFT", menu, "BOTTOMLEFT", buttonSpacing, buttonSpacing)
					else
						bagSlot:SetPoint("LEFT", menu[i - 1], "RIGHT", buttonSpacing, 0)
					end
				end
			end

			local numSlots = GetContainerNumSlots(bagID);
			local bagName = ("%sBag%d"):format(containerName, bagID)
			local template = (bagID == -1) and "BankItemButtonGenericTemplate" or "ContainerFrameItemButtonTemplate"
			local bag;

			if not self.Bags[bagID] then
				bag = CreateFrame("Frame", bagName, self);
				bag:SetID(bagID);
				bag.numSlots = numSlots;
				bag.SlotUpdate = SlotUpdate;
				bag.RefreshSlots = RefreshSlots;
				self.Bags[bagID] = bag
			else
				bag = self.Bags[bagID]
			end

			if numSlots > 0 then
				local btype = select(2, GetContainerNumFreeSlots(bagID));
				if RefProfessionColors[btype] then
					local r, g, b = unpack(RefProfessionColors[btype]);
					bag.bagFamily = {r, g, b};
					bag:SetBackdropColor(r, g, b, 0.25)
					bag:SetBackdropBorderColor(r, g, b, 1)
				else
					bag.bagFamily = false;
				end

				for i = 1, MAX_CONTAINER_ITEMS do
					if bag[i] then
						bag[i]:Hide();
					end
				end

				for slotID = 1, numSlots do
					local slot;
					totalSlots = totalSlots + 1;

					if not bag[slotID] then
						local slotName = ("%sSlot%d"):format(bagName, slotID)
						local newTexName = ("%sNewItemTexture"):format(slotName)
						local iconName = ("%sIconTexture"):format(slotName)
						local cdName = ("%sCooldown"):format(slotName)

						slot = CreateFrame("CheckButton", slotName, bag, template);
						slot:SetNormalTexture(nil);
						slot:SetCheckedTexture(nil);
						slot:SetSlotTemplate(true, 2, 0, 0, true);

						if(_G[newTexName]) then
							_G[newTexName]:Hide()
						end

						slot.iconTexture = _G[iconName];
						slot.iconTexture:FillInner(slot);
						slot.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9);
						slot.cooldown = _G[cdName];

						SV.Timers:AddCooldown(slot.cooldown)

						bag[slotID] = slot
					else
						slot = bag[slotID]
					end

					slot:SetID(slotID);
					slot:Size(buttonSize);
					bag:SlotUpdate(slotID);

					if slot:GetPoint() then
						slot:ClearAllPoints();
					end

					if lastButton then
						if((totalSlots - 1) % numContainerColumns == 0) then
							slot:Point("TOP", lastRowButton, "BOTTOM", 0, -buttonSpacing);
							numContainerRows = numContainerRows + 1;
							lastRowButton = slot;
						else
							slot:Point("LEFT", lastButton, "RIGHT", buttonSpacing, 0);
						end
					else
						slot:Point("TOPLEFT", self.holderFrame, "TOPLEFT");
						numContainerRows = numContainerRows + 1;
						lastRowButton = slot;
					end

					lastButton = slot;
				end
			else
				if(menu[i] and menu[i].GetInventorySlot) then
					BankFrameItemButton_Update(menu[i])
					BankFrameItemButton_UpdateLocked(menu[i])
				end
				for i = 1, MAX_CONTAINER_ITEMS do
					if(bag[i]) then
						bag[i]:Hide();
					end
				end
			end
		end
	end

	self:Size(containerWidth, (((buttonSize + buttonSpacing) * numContainerRows) - buttonSpacing) + self.topOffset + self.bottomOffset);
end

function MOD:RefreshBagFrames(frame)
	if(frame and self[frame]) then
		self[frame]:UpdateLayout()
		return
	else
		if(self.BagFrame) then
			self.BagFrame:UpdateLayout()
		end
		if self.BankFrame then
			self.BankFrame:UpdateLayout()
		end
		if self.ReagentFrame then
			self.ReagentFrame:UpdateLayout()
		end
	end
end

function MOD:UpdateGoldText()
	self.BagFrame.goldText:SetText(GetCoinTextureString(GetMoney(), 12))
end

function MOD:VendorGrays(arg1, arg2, arg3)
	if(not MerchantFrame or not MerchantFrame:IsShown()) and not arg1 and not arg3 then
		SV:AddonMessage(L["You must be at a vendor."])
		return
	end
	local copper = 0;
	local deleted = 0;
	for i = 0, 4 do
		for silver = 1, GetContainerNumSlots(i) do
			local a2 = GetContainerItemLink(i, silver)
			if a2 and select(11, GetItemInfo(a2)) then
				local a3 = select(11, GetItemInfo(a2)) * select(2, GetContainerItemInfo(i, silver))
				if arg1 then
					if find(a2, "ff9d9d9d") then
						if not arg3 then
							PickupContainerItem(i, silver)
							DeleteCursorItem()
						end
						copper = copper + a3;
						deleted = deleted + 1
					end
				else
					if select(3, GetItemInfo(a2)) == 0 and a3 > 0 then
						if not arg3 then
							UseContainerItem(i, silver)
							PickupMerchantItem()
						end
						copper = copper + a3
					end
				end
			end
		end
	end
	if arg3 then return copper end
	local strMsg
	if copper > 0 and not arg1 then
		local gold, silver, copper = floor(copper / 10000) or 0, floor(copper%10000 / 100) or 0, copper%100;
		strMsg = ("%s |cffffffff%s%s%s%s%s%s|r"):format(L["Vendored gray items for:"], gold, L["goldabbrev"], silver, L["silverabbrev"], copper, L["copperabbrev"])
	elseif not arg1 and not arg2 then
		strMsg = L["No gray items to sell."]
	elseif deleted > 0 then
		local gold, silver, copper = floor(copper / 10000) or 0, floor(copper%10000 / 100) or 0, copper%100;
		local prefix = ("|cffffffff%s%s%s%s%s%s|r"):format(gold, L["goldabbrev"], silver, L["silverabbrev"], copper, L["copperabbrev"])
		strMsg = (L["Deleted %d gray items. Total Worth: %s"]):format(deleted, prefix)
	elseif not arg2 then
		strMsg = L["No gray items to delete."]
	end
	SV:AddonMessage(strMsg)
end

function MOD:ModifyBags()
	local docked = SV.db.SVBag.alignToChat
	local anchor, x, y
	if(docked) then
		if self.BagFrame then
			self.BagFrame:ClearAllPoints()
			self.BagFrame:Point("BOTTOMRIGHT", RightSuperDock, "BOTTOMRIGHT", 0, 0)
		end
		if self.BankFrame then
			self.BankFrame:ClearAllPoints()
			self.BankFrame:Point("BOTTOMLEFT", LeftSuperDock, "BOTTOMLEFT", 0, 0)
		end
	else
		if self.BagFrame then
			local anchor, x, y = SV.db.SVBag.bags.point, SV.db.SVBag.bags.xOffset, SV.db.SVBag.bags.yOffset
			self.BagFrame:ClearAllPoints()
			self.BagFrame:Point(anchor, SV.UIParent, anchor, x, y)
		end
		if self.BankFrame then
			local anchor, x, y = SV.db.SVBag.bank.point, SV.db.SVBag.bank.xOffset, SV.db.SVBag.bank.yOffset
			self.BankFrame:ClearAllPoints()
			self.BankFrame:Point(anchor, SV.UIParent, anchor, x, y)
		end
	end
end

do
	local function Bags_OnEnter()
		if SV.db.SVBag.bagBar.mouseover ~= true then return end
		SV:SecureFadeIn(SVUI_BagBar, 0.2, SVUI_BagBar:GetAlpha(), 1)
	end

	local function Bags_OnLeave()
		if SV.db.SVBag.bagBar.mouseover ~= true then return end
		SV:SecureFadeOut(SVUI_BagBar, 0.2, SVUI_BagBar:GetAlpha(), 0)
	end

	local function AlterBagBar(bar)
		local icon = _G[bar:GetName().."IconTexture"]
		bar.oldTex = icon:GetTexture()
		bar:RemoveTextures()
		bar:SetFixedPanelTemplate("Default")
		bar:SetSlotTemplate(false, 1, nil, nil, true)
		icon:SetTexture(bar.oldTex)
		icon:FillInner()
		icon:SetTexCoord(0.1, 0.9, 0.1, 0.9 )
	end

	local function LoadBagBar()
		if MOD.BagBarLoaded then return end

		local bar = CreateFrame("Frame", "SVUI_BagBar", SV.UIParent)
		bar:SetPoint("TOPRIGHT", RightSuperDock, "TOPLEFT", -4, 0)
		bar.buttons = {}
		bar:EnableMouse(true)
		bar:SetScript("OnEnter", Bags_OnEnter)
		bar:SetScript("OnLeave", Bags_OnLeave)

		MainMenuBarBackpackButton:SetParent(bar)
		MainMenuBarBackpackButton.SetParent = SV.Cloaked;
		MainMenuBarBackpackButton:ClearAllPoints()
		MainMenuBarBackpackButtonCount:SetFontTemplate(nil, 10)
		MainMenuBarBackpackButtonCount:ClearAllPoints()
		MainMenuBarBackpackButtonCount:Point("BOTTOMRIGHT", MainMenuBarBackpackButton, "BOTTOMRIGHT", -1, 4)
		MainMenuBarBackpackButton:HookScript("OnEnter", Bags_OnEnter)
		MainMenuBarBackpackButton:HookScript("OnLeave", Bags_OnLeave)

		tinsert(bar.buttons, MainMenuBarBackpackButton)
		AlterBagBar(MainMenuBarBackpackButton)

		local count = #bar.buttons
		local frameCount = NUM_BAG_FRAMES - 1;

		for i = 0, frameCount do
			local bagSlot = _G["CharacterBag"..i.."Slot"]
			bagSlot:SetParent(bar)
			bagSlot.SetParent = SV.Cloaked;
			bagSlot:HookScript("OnEnter", Bags_OnEnter)
			bagSlot:HookScript("OnLeave", Bags_OnLeave)
			AlterBagBar(bagSlot)
			count = count + 1
			bar.buttons[count] = bagSlot
		end

		MOD.BagBarLoaded = true
	end

	function MOD:ModifyBagBar()
		if not SV.db.SVBag.bagBar.enable then return end

		if not self.BagBarLoaded then
			LoadBagBar()
		end
		if SV.db.SVBag.bagBar.mouseover then
			SVUI_BagBar:SetAlpha(0)
		else
			SVUI_BagBar:SetAlpha(1)
		end

		local showBy = SV.db.SVBag.bagBar.showBy
		local sortDir = SV.db.SVBag.bagBar.sortDirection
		local bagSize = SV.db.SVBag.bagBar.size
		local bagSpacing = SV.db.SVBag.bagBar.spacing

		for i = 1, #SVUI_BagBar.buttons do
			local button = SVUI_BagBar.buttons[i]
			local lastButton = SVUI_BagBar.buttons[i - 1]

			button:Size(bagSize)
			button:ClearAllPoints()

			if(showBy == "HORIZONTAL" and sortDir == "ASCENDING") then
				if i == 1 then
					button:SetPoint("LEFT", SVUI_BagBar, "LEFT", bagSpacing, 0)
				elseif lastButton then
					button:SetPoint("LEFT", lastButton, "RIGHT", bagSpacing, 0)
				end
			elseif(showBy == "VERTICAL" and sortDir == "ASCENDING") then
				if i == 1 then
					button:SetPoint("TOP", SVUI_BagBar, "TOP", 0, -bagSpacing)
				elseif lastButton then
					button:SetPoint("TOP", lastButton, "BOTTOM", 0, -bagSpacing)
				end
			elseif(showBy == "HORIZONTAL" and sortDir == "DESCENDING") then
				if i == 1 then
					button:SetPoint("RIGHT", SVUI_BagBar, "RIGHT", -bagSpacing, 0)
				elseif lastButton then
					button:SetPoint("RIGHT", lastButton, "LEFT", -bagSpacing, 0)
				end
			else
				if i == 1 then
					button:SetPoint("BOTTOM", SVUI_BagBar, "BOTTOM", 0, bagSpacing)
				elseif lastButton then
					button:SetPoint("BOTTOM", lastButton, "TOP", 0, bagSpacing)
				end
			end
		end
		if showBy == "HORIZONTAL" then
			SVUI_BagBar:Width((bagSize * numBagFrame) + (bagSpacing * numBagFrame) + bagSpacing)
			SVUI_BagBar:Height(bagSize + (bagSpacing * 2))
		else
			SVUI_BagBar:Height((bagSize * numBagFrame) + (bagSpacing * numBagFrame) + bagSpacing)
			SVUI_BagBar:Width(bagSize + (bagSpacing * 2))
		end

	    if not SVUI_BagBar_MOVE then
	    	SVUI_BagBar:SetPanelTemplate("Default")
	        SV.Mentalo:Add(SVUI_BagBar, L["Bags Bar"])
	    end

	    if SV.db.SVBag.bagBar.showBackdrop then
			SVUI_BagBar.Panel:Show()
		else
			SVUI_BagBar.Panel:Hide()
		end
	end
end
--[[
##########################################################
BAG CONTAINER CREATION
##########################################################
]]--
do
	local function UpdateEquipmentInfo(slot, bag, index)
		if not slot.equipmentinfo then
			slot.equipmentinfo = slot:CreateFontString(nil,"OVERLAY")
			slot.equipmentinfo:SetFontTemplate(SV.Media.font.roboto, 10, "OUTLINE")
			slot.equipmentinfo:SetAllPoints(slot)
			slot.equipmentinfo:SetWordWrap(true)
			slot.equipmentinfo:SetJustifyH('LEFT')
			slot.equipmentinfo:SetJustifyV('BOTTOM')
		end
		if slot.equipmentinfo then
			slot.equipmentinfo:SetAllPoints(slot)
			local loc = format("%d_%d", bag, index)
			local level = 0;
			if gearList[loc] then
				level = #gearList[loc] < 4 and #gearList[loc] or 3;
				formatAndSave(level, slot.equipmentinfo, gearList[loc])
			else
				formatAndSave(level, slot.equipmentinfo, nil)
			end
		end
	end

	local Search_OnKeyPressed = function(self)
		self:GetParent().detail:Show()
		self:ClearFocus()
		SetItemSearch('')
	end

	local Search_OnInput = function(self)
		local i = 3;
		local j = self:GetText()
		if len(j) > i then
			local k=true;
			for h=1,i,1 do
				if sub(j,0-h,0-h) ~= sub(j,-1-h,-1-h) then
					k=false;
					break
				end
			end
			if k then
				Search_OnKeyPressed(self)
				return
			end
		end
		SetItemSearch(j)
	end

	local Search_OnClick = function(self, button)
		local container = self:GetParent()
		if button == "RightButton"then
			container.detail:Hide()
			container.editBox:Show()
			container.editBox:SetText(SEARCH)
			container.editBox:HighlightText()
		else
			if container.editBox:IsShown()then
				container.editBox:Hide()
				container.editBox:ClearFocus()
				container.detail:Show()
				SetItemSearch('')
			else
				container.detail:Hide()
				container.editBox:Show()
				container.editBox:SetText(SEARCH)
				container.editBox:HighlightText()
			end
		end
	end

	local Container_OnEvent = function(self, event, ...)
		if(event == "ITEM_LOCK_CHANGED") then
			local bagID, slotID = ...
			if(bagID and slotID and self.Bags[bagID] and self.Bags[bagID][slotID]) then
				self.Bags[bagID]:SlotUpdate(slotID)
			end
		elseif(event == "BAG_UPDATE" or event == "EQUIPMENT_SETS_CHANGED") then
			BuildEquipmentMap()
			for id, bag in ipairs(self.Bags) do
				local numSlots = GetContainerNumSlots(id)
				if(numSlots ~= bag.numSlots) then
					self:UpdateLayout()
					return
				end
				if(SV.db.SVGear.misc.setoverlay) then
					for i = 1, numSlots do
						if bag[i] then
							UpdateEquipmentInfo(bag[i], id, i)
						end
					end
				end
			end
			local bagID = ...
			if(bagID and self.Bags[bagID]) then
				self.Bags[bagID]:RefreshSlots()
			end
		elseif(event == "BAG_UPDATE_COOLDOWN") then
			self:RefreshCooldowns()
		elseif(event == "PLAYERBANKSLOTS_CHANGED" or event == "PLAYERREAGENTBANKSLOTS_CHANGED") then
			self:RefreshBags()
		end
	end

	local Vendor_OnClick = function(self)
		if IsShiftKeyDown()then
			SV.SystemAlert["DELETE_GRAYS"].Money = MOD:VendorGrays(false,true,true)
			SV:StaticPopup_Show('DELETE_GRAYS')
		else
			MOD:VendorGrays()
		end
	end

	local Token_OnEnter = function(self)
		GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
		GameTooltip:SetBackpackToken(self:GetID())
	end

	local Token_OnLeave = function(self)
		GameTooltip:Hide()
	end

	local Token_OnClick = function(self)
		if IsModifiedClick("CHATLINK") then
			HandleModifiedItemClick(GetCurrencyLink(self.currencyID))
		end
	end

	local Tooltip_Show = function(self)
		GameTooltip:SetOwner(self:GetParent(),"ANCHOR_TOP",0,4)
		GameTooltip:ClearLines()
		GameTooltip:AddLine(self.ttText)
		if self.ttText2 then
			GameTooltip:AddLine(' ')
			GameTooltip:AddDoubleLine(self.ttText2,self.ttText2desc,1,1,1)
		end
		self:GetNormalTexture():SetGradient(unpack(SV.Media.gradient.highlight))
		GameTooltip:Show()
	end

	local Tooltip_Hide = function(self)
		self:GetNormalTexture():SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1)
		GameTooltip:Hide()
	end

	local Container_OnDragStart = function(self)
		if IsShiftKeyDown()then self:StartMoving()end
	end
	local Container_OnDragStop = function(self)
		self:StopMovingOrSizing()
	end
	local Container_OnClick = function(self)
		if IsControlKeyDown() then MOD:ModifyBags() end
	end
	local Container_OnEnter = function(self)
		GameTooltip:SetOwner(self,"ANCHOR_TOPLEFT",0,4)
		GameTooltip:ClearLines()
		GameTooltip:AddDoubleLine(L['Hold Shift + Drag:'],L['Temporary Move'],1,1,1)
		GameTooltip:AddDoubleLine(L['Hold Control + Right Click:'],L['Reset Position'],1,1,1)
		GameTooltip:Show()
	end

	function MOD:ToggleEquipmentOverlay()
		if(self.BagFrame) then
			for id,bag in ipairs(self.BagFrame.Bags) do
				local numSlots = GetContainerNumSlots(id)
				if(SV.db.SVGear.misc.setoverlay) then
					for i=1,numSlots do
						if bag[i] then
							UpdateEquipmentInfo(bag[i], id, i)
						end
					end
				else
					for i=1,numSlots do
						if(bag and bag[i] and bag[i].equipmentinfo) then
							bag[i].equipmentinfo:SetText()
						end
					end
				end
			end
		end
		if(self.BankFrame) then
			for id,bag in ipairs(self.BankFrame.Bags) do
				local numSlots = GetContainerNumSlots(id)
				if(SV.db.SVGear.misc.setoverlay) then
					for i=1,numSlots do
						if bag and bag[i] then
							UpdateEquipmentInfo(bag[i], id, i)
						end
					end
				else
					for i=1,numSlots do
						if(bag and bag[i] and bag[i].equipmentinfo) then
							bag[i].equipmentinfo:SetText()
						end
					end
				end
			end
		end
		if(self.ReagentFrame) then
			for id,bag in ipairs(self.ReagentFrame.Bags) do
				local numSlots = GetContainerNumSlots(id)
				if(SV.db.SVGear.misc.setoverlay) then
					for i=1,numSlots do
						if bag and bag[i] then
							UpdateEquipmentInfo(bag[i], id, i)
						end
					end
				else
					for i=1,numSlots do
						if(bag and bag[i] and bag[i].equipmentinfo) then
							bag[i].equipmentinfo:SetText()
						end
					end
				end
			end
		end
	end

	function MOD:MakeBags()
		local bagName = "SVUI_ContainerFrame"
		local uisCount = #UISpecialFrames + 1;
		local bagsCount = #self.BagFrames + 1;
		local frame = CreateFrame("Button", "SVUI_ContainerFrame", SV.UIParent)

		frame:SetPanelTemplate("Container")
		frame:SetFrameStrata("HIGH")
		frame.UpdateLayout = ContainerFrame_UpdateLayout;
		frame.RefreshBags = ContainerFrame_UpdateBags;
		frame.RefreshCooldowns = ContainerFrame_UpdateCooldowns;

		frame:RegisterEvent("ITEM_LOCK_CHANGED")
		frame:RegisterEvent("BAG_UPDATE_COOLDOWN")
		frame:RegisterEvent("BAG_UPDATE")
		frame:RegisterEvent("EQUIPMENT_SETS_CHANGED")
		frame:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
		frame:RegisterEvent("PLAYERREAGENTBANKSLOTS_CHANGED")
		frame:SetMovable(true)

		frame:RegisterForDrag("LeftButton", "RightButton")
		frame:RegisterForClicks("AnyUp")

		frame:SetScript("OnDragStart", Container_OnDragStart)
		frame:SetScript("OnDragStop", Container_OnDragStop)
		frame:SetScript("OnClick", Container_OnClick)
		frame:SetScript("OnEnter", Container_OnEnter)
		frame:SetScript("OnLeave", Token_OnLeave)
		frame:SetScript("OnEvent", Container_OnEvent)

		frame.isBank = false;
		frame.isReagent = false;
		frame:Hide()
		frame.bottomOffset = 32;
		frame.topOffset = 65;
		frame.BagIDs = {0, 1, 2, 3, 4}
		frame.Bags = {}
		frame.closeButton = CreateFrame("Button", "SVUI_ContainerFrameCloseButton", frame, "UIPanelCloseButton")
		frame.closeButton:Point("TOPRIGHT", -4, -4)
		frame.holderFrame = CreateFrame("Frame", nil, frame)
		frame.holderFrame:Point("TOP", frame, "TOP", 0, -frame.topOffset)
		frame.holderFrame:Point("BOTTOM", frame, "BOTTOM", 0, frame.bottomOffset)
		frame.BagMenu = CreateFrame("Button", "SVUI_ContainerFrameBagMenu", frame)
		frame.BagMenu:Point("BOTTOMLEFT", frame, "TOPLEFT", 0, 1)
		frame.BagMenu:SetFixedPanelTemplate("Transparent")
		frame.BagMenu:Hide()

		frame.goldText = frame:CreateFontString(nil, "OVERLAY")
		frame.goldText:SetFontTemplate(SV.Media.font.numbers)
		frame.goldText:Point("BOTTOMRIGHT", frame.holderFrame, "TOPRIGHT", -2, 4)
		frame.goldText:SetJustifyH("RIGHT")
		frame.editBox = CreateFrame("EditBox", "SVUI_ContainerFrameEditBox", frame)
		frame.editBox:SetFrameLevel(frame.editBox:GetFrameLevel()+2)
		frame.editBox:SetEditboxTemplate()
		frame.editBox:Height(15)
		frame.editBox:Hide()
		frame.editBox:Point("BOTTOMLEFT", frame.holderFrame, "TOPLEFT", 2, 4)
		frame.editBox:Point("RIGHT", frame.goldText, "LEFT", -5, 0)
		frame.editBox:SetAutoFocus(true)
		frame.editBox:SetScript("OnEscapePressed", Search_OnKeyPressed)
		frame.editBox:SetScript("OnEnterPressed", Search_OnKeyPressed)
		frame.editBox:SetScript("OnEditFocusLost", frame.editBox.Hide)
		frame.editBox:SetScript("OnEditFocusGained", frame.editBox.HighlightText)
		frame.editBox:SetScript("OnTextChanged", Search_OnInput)
		frame.editBox:SetScript("OnChar", Search_OnInput)
		frame.editBox.SearchReset = Search_OnKeyPressed
		frame.editBox:SetText(SEARCH)
		frame.editBox:SetFontTemplate(SV.Media.font.roboto)

		local searchButton = CreateFrame("Button", nil, frame)
		searchButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
		searchButton:SetSize(60, 18)
		searchButton:SetPoint("BOTTOMLEFT", frame.editBox, "BOTTOMLEFT", -2, 0)
		searchButton:SetButtonTemplate()
		searchButton:SetScript("OnClick", Search_OnClick)
		local searchText = searchButton:CreateFontString(nil, "OVERLAY")
		searchText:SetFont(SV.Media.font.roboto, 12, "NONE")
		searchText:SetAllPoints(searchButton)
		searchText:SetJustifyH("CENTER")
		searchText:SetText("|cff9999ff"..SEARCH.."|r")
		searchButton:SetFontString(searchText)
		frame.detail = searchButton

		frame.sortButton = CreateFrame("Button", nil, frame)
		frame.sortButton:Point("TOP", frame, "TOP", 0, -10)
		frame.sortButton:Size(25, 25)
		frame.sortButton:SetNormalTexture(ICON_SORT)
		StyleBagToolButton(frame.sortButton)
		frame.sortButton.ttText = L["Sort Bags"]
		frame.sortButton:SetScript("OnEnter", Tooltip_Show)
		frame.sortButton:SetScript("OnLeave", Tooltip_Hide)
		local Sort_OnClick = (SV.GameVersion >= 60000) and SortBags or MOD:RunSortingProcess(MOD.Sort, "bags")
		frame.sortButton:SetScript("OnClick", Sort_OnClick)

		frame.stackButton = CreateFrame("Button", nil, frame)
		frame.stackButton:Point("LEFT", frame.sortButton, "RIGHT", 10, 0)
		frame.stackButton:Size(25, 25)
		frame.stackButton:SetNormalTexture(ICON_STACK)
		StyleBagToolButton(frame.stackButton)
		frame.stackButton.ttText = L["Stack Items"]
		frame.stackButton:SetScript("OnEnter", Tooltip_Show)
		frame.stackButton:SetScript("OnLeave", Tooltip_Hide)
		local Stack_OnClick = MOD:RunSortingProcess(MOD.Stack, "bags")
		frame.stackButton:SetScript("OnClick", Stack_OnClick)

		frame.vendorButton = CreateFrame("Button", nil, frame)
		frame.vendorButton:Point("RIGHT", frame.sortButton, "LEFT", -10, 0)
		frame.vendorButton:Size(25, 25)
		frame.vendorButton:SetNormalTexture(ICON_VENDOR)
		StyleBagToolButton(frame.vendorButton)
		frame.vendorButton.ttText = L["Vendor Grays"]
		frame.vendorButton.ttText2 = L["Hold Shift:"]
		frame.vendorButton.ttText2desc = L["Delete Grays"]
		frame.vendorButton:SetScript("OnEnter", Tooltip_Show)
		frame.vendorButton:SetScript("OnLeave", Tooltip_Hide)
		frame.vendorButton:SetScript("OnClick", Vendor_OnClick)

		frame.bagsButton = CreateFrame("Button", nil, frame)
		frame.bagsButton:Point("RIGHT", frame.vendorButton, "LEFT", -10, 0)
		frame.bagsButton:Size(25, 25)
		frame.bagsButton:SetNormalTexture(ICON_BAGS)
		StyleBagToolButton(frame.bagsButton)
		frame.bagsButton.ttText = L["Toggle Bags"]
		frame.bagsButton:SetScript("OnEnter", Tooltip_Show)
		frame.bagsButton:SetScript("OnLeave", Tooltip_Hide)
		local BagBtn_OnClick = function()
			ToggleFrame(frame.BagMenu)
		end
		frame.bagsButton:SetScript("OnClick", BagBtn_OnClick)

		frame.transferButton = CreateFrame("Button", nil, frame)
		frame.transferButton:Point("LEFT", frame.stackButton, "RIGHT", 10, 0)
		frame.transferButton:Size(25, 25)
		frame.transferButton:SetNormalTexture(ICON_TRANSFER)
		StyleBagToolButton(frame.transferButton)
		frame.transferButton.ttText = L["Stack Bags to Bank"]
		frame.transferButton:SetScript("OnEnter", Tooltip_Show)
		frame.transferButton:SetScript("OnLeave", Tooltip_Hide)
		local Transfer_OnClick = MOD:RunSortingProcess(MOD.Transfer, "bags bank")
		frame.transferButton:SetScript("OnClick", Transfer_OnClick)

		frame.currencyButton = CreateFrame("Frame", nil, frame)
		frame.currencyButton:Point("BOTTOMLEFT", frame, "BOTTOMLEFT", 4, 0)
		frame.currencyButton:Point("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -4, 0)
		frame.currencyButton:Height(32)
		for h = 1, MAX_WATCHED_TOKENS do
			frame.currencyButton[h] = CreateFrame("Button", nil, frame.currencyButton)
			frame.currencyButton[h]:Size(22)
			frame.currencyButton[h]:SetFixedPanelTemplate("Default")
			frame.currencyButton[h]:SetID(h)
			frame.currencyButton[h].icon = frame.currencyButton[h]:CreateTexture(nil, "OVERLAY")
			frame.currencyButton[h].icon:FillInner()
			frame.currencyButton[h].icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
			frame.currencyButton[h].text = frame.currencyButton[h]:CreateFontString(nil, "OVERLAY")
			frame.currencyButton[h].text:Point("LEFT", frame.currencyButton[h], "RIGHT", 2, 0)
			frame.currencyButton[h].text:SetFontTemplate(SV.Media.font.numbers, 18, "NONE")
			frame.currencyButton[h]:SetScript("OnEnter", Token_OnEnter)
			frame.currencyButton[h]:SetScript("OnLeave", Token_OnLeave)
			frame.currencyButton[h]:SetScript("OnClick", Token_OnClick)
			frame.currencyButton[h]:Hide()
		end

		frame:SetScript("OnHide", CloseAllBags)
		SV:AddToDisplayAudit(frame)
		--UISpecialFrames[uisCount] = "SVUI_ContainerFrame";

		self.BagFrames[bagsCount] = frame
		self.BagFrame = frame
	end

	function MOD:MakeBankOrReagent(isReagent)
		-- Reagent Slots: 1 - 98
		-- /script print(ReagentBankFrameItem1:GetInventorySlot())
		local bagName = isReagent and "SVUI_ReagentContainerFrame" or "SVUI_BankContainerFrame"
		local uisCount = #UISpecialFrames + 1;
		local bagsCount = #self.BagFrames + 1;

		local frame = CreateFrame("Button", bagName, isReagent and self.BankFrame or SV.UIParent)
		frame:SetPanelTemplate(isReagent and "Action" or "Container")
		frame:SetFrameStrata("HIGH")

		frame.UpdateLayout = ContainerFrame_UpdateLayout;
		frame.RefreshBags = ContainerFrame_UpdateBags;
		frame.RefreshCooldowns = ContainerFrame_UpdateCooldowns;

		frame:RegisterEvent("ITEM_LOCK_CHANGED")
		frame:RegisterEvent("BAG_UPDATE_COOLDOWN")
		frame:RegisterEvent("BAG_UPDATE")
		frame:RegisterEvent("EQUIPMENT_SETS_CHANGED")
		frame:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
		frame:RegisterEvent("PLAYERREAGENTBANKSLOTS_CHANGED")

		frame:SetMovable(true)
		frame:RegisterForDrag("LeftButton", "RightButton")
		frame:RegisterForClicks("AnyUp")
		frame:SetScript("OnDragStart", Container_OnDragStart)
		frame:SetScript("OnDragStop", Container_OnDragStop)
		frame:SetScript("OnClick", Container_OnClick)
		frame:SetScript("OnEnter", Container_OnEnter)
		frame:SetScript("OnLeave", Token_OnLeave)
		frame:SetScript("OnEvent", Container_OnEvent)

		frame.isBank = true;
		frame.isReagent = isReagent;
		frame:Hide()
		frame.bottomOffset = 8;
		frame.topOffset = 60;

		if(isReagent) then
			frame.BagIDs = {}
		else
			frame.BagIDs = {-1, 5, 6, 7, 8, 9, 10, 11}
		end

		frame.Bags = {}

		frame.closeButton = CreateFrame("Button", bagName.."CloseButton", frame, "UIPanelCloseButton")
		frame.closeButton:Point("TOPRIGHT", -4, -4)

		frame.holderFrame = CreateFrame("Frame", nil, frame)
		frame.holderFrame:Point("TOP", frame, "TOP", 0, -frame.topOffset)
		frame.holderFrame:Point("BOTTOM", frame, "BOTTOM", 0, frame.bottomOffset)

		frame.BagMenu = CreateFrame("Button", bagName.."BagMenu", frame)
		frame.BagMenu:Point("BOTTOMLEFT", frame, "TOPLEFT", 0, 1)
		frame.BagMenu:SetFixedPanelTemplate("Transparent")
		frame.BagMenu:Hide()

		frame.sortButton = CreateFrame("Button", nil, frame)
		frame.sortButton:Point("TOPRIGHT", frame, "TOP", 0, -10)
		frame.sortButton:Size(25, 25)
		frame.sortButton:SetNormalTexture(ICON_SORT)
		StyleBagToolButton(frame.sortButton)
		frame.sortButton.ttText = L["Sort Bags"]
		frame.sortButton:SetScript("OnEnter", Tooltip_Show)
		frame.sortButton:SetScript("OnLeave", Tooltip_Hide)
		local Sort_OnClick = (SV.GameVersion >= 60000) and BankFrame_AutoSortButtonOnClick or MOD:RunSortingProcess(MOD.Sort, "bank")
		frame.sortButton:SetScript("OnClick", Sort_OnClick)

		frame.stackButton = CreateFrame("Button", nil, frame)
		frame.stackButton:Point("LEFT", frame.sortButton, "RIGHT", 10, 0)
		frame.stackButton:Size(25, 25)
		frame.stackButton:SetNormalTexture(ICON_STACK)
		StyleBagToolButton(frame.stackButton)
		frame.stackButton.ttText = L["Stack Items"]
		frame.stackButton:SetScript("OnEnter", Tooltip_Show)
		frame.stackButton:SetScript("OnLeave", Tooltip_Hide)
		local Stack_OnClick = MOD:RunSortingProcess(MOD.Stack, "bank")
		frame.stackButton:SetScript("OnClick", Stack_OnClick)

		frame.transferButton = CreateFrame("Button", nil, frame)
		frame.transferButton:Point("LEFT", frame.stackButton, "RIGHT", 10, 0)
		frame.transferButton:Size(25, 25)
		frame.transferButton:SetNormalTexture(ICON_TRANSFER)
		StyleBagToolButton(frame.transferButton)
		frame.transferButton.ttText = L["Stack Bank to Bags"]
		frame.transferButton:SetScript("OnEnter", Tooltip_Show)
		frame.transferButton:SetScript("OnLeave", Tooltip_Hide)
		local Transfer_OnClick = MOD:RunSortingProcess(MOD.Transfer, "bank bags")
		frame.transferButton:SetScript("OnClick", Transfer_OnClick)


		SV:AddToDisplayAudit(frame)
		--UISpecialFrames[uisCount] = bagName;
		self.BagFrames[bagsCount] = frame

		if(not isReagent) then
			frame.bagsButton = CreateFrame("Button", nil, frame)
			frame.bagsButton:Point("RIGHT", frame.sortButton, "LEFT", -10, 0)
			frame.bagsButton:Size(25, 25)
			frame.bagsButton:SetNormalTexture(ICON_BAGS)
			StyleBagToolButton(frame.bagsButton)
			frame.bagsButton.ttText = L["Toggle Bags"]
			frame.bagsButton:SetScript("OnEnter", Tooltip_Show)
			frame.bagsButton:SetScript("OnLeave", Tooltip_Hide)
			local BagBtn_OnClick = function()
				local numSlots, _ = GetNumBankSlots()
				if numSlots  >= 1 then
					ToggleFrame(frame.BagMenu)
				else
					SV:StaticPopup_Show("NO_BANK_BAGS")
				end
			end
			frame.bagsButton:SetScript("OnClick", BagBtn_OnClick)

			frame.purchaseBagButton = CreateFrame("Button", nil, frame)
			frame.purchaseBagButton:Size(25, 25)
			frame.purchaseBagButton:Point("RIGHT", frame.bagsButton, "LEFT", -10, 0)
			frame.purchaseBagButton:SetFrameLevel(frame.purchaseBagButton:GetFrameLevel()+2)
			frame.purchaseBagButton:SetNormalTexture(ICON_PURCHASE)
			StyleBagToolButton(frame.purchaseBagButton)
			frame.purchaseBagButton.ttText = L["Purchase"]
			frame.purchaseBagButton:SetScript("OnEnter", Tooltip_Show)
			frame.purchaseBagButton:SetScript("OnLeave", Tooltip_Hide)
			local PurchaseBtn_OnClick = function()
				local _, full = GetNumBankSlots()
				if not full then
					SV:StaticPopup_Show("BUY_BANK_SLOT")
				else
					SV:StaticPopup_Show("CANNOT_BUY_BANK_SLOT")
				end
			end
			frame.purchaseBagButton:SetScript("OnClick", PurchaseBtn_OnClick)

			if(SV.GameVersion >= 60000) then
				frame.swapButton = CreateFrame("Button", nil, frame)
				frame.swapButton:Point("TOPRIGHT", frame, "TOPRIGHT", -40, -10)
				frame.swapButton:Size(25, 25)
				frame.swapButton:SetNormalTexture(ICON_BAGS)
				StyleBagToolButton(frame.swapButton)
				frame.swapButton.ttText = isReagent and L["View Bank"] or L["View Reagents"]
				frame.swapButton:SetScript("OnEnter", Tooltip_Show)
				frame.swapButton:SetScript("OnLeave", Tooltip_Hide)
				frame.swapButton:SetScript("OnClick", function()
					if(_G["SVUI_ReagentContainerFrame"]:IsShown()) then
						_G["SVUI_ReagentContainerFrame"]:Hide()
					else
						_G["SVUI_ReagentContainerFrame"]:Show()
					end
				end)
			end
			frame:SetScript("OnHide", CloseBankFrame)
			self.BankFrame = frame
		else
			frame:SetPoint("TOPLEFT", self.BankFrame, "TOPRIGHT", 2, 0)
			self.ReagentFrame = frame
		end
	end
end

function MOD:RefreshTokens()
	local frame = MOD.BagFrame;
	local index = 0;

	for i=1,MAX_WATCHED_TOKENS do
		local name,count,icon,currencyID = GetBackpackCurrencyInfo(i)
		local set = frame.currencyButton[i]
		set:ClearAllPoints()
		if name then
			set.icon:SetTexture(icon)
			if SV.db.SVBag.currencyFormat == 'ICON_TEXT' then
				set.text:SetText(name..': '..count)
			elseif SV.db.SVBag.currencyFormat == 'ICON' then
				set.text:SetText(count)
			end
			set.currencyID = currencyID;
			set:Show()
			index = index + 1;
		else
			set:Hide()
		end
	end

	if index == 0 then
		frame.bottomOffset = 8;
		if frame.currencyButton:IsShown() then
			frame.currencyButton:Hide()
			MOD.BagFrame:UpdateLayout()
		end
		return
	elseif not frame.currencyButton:IsShown() then
		frame.bottomOffset = 28;
		frame.currencyButton:Show()
		MOD.BagFrame:UpdateLayout()
	end

	frame.bottomOffset = 28;
	local set = frame.currencyButton;
	if index == 1 then
		set[1]:Point("BOTTOM", set, "BOTTOM", -(set[1].text:GetWidth() / 2), 3)
	elseif index == 2 then
		set[1]:Point("BOTTOM", set, "BOTTOM", -set[1].text:GetWidth()-set[1]:GetWidth() / 2, 3)
		frame.currencyButton[2]:Point("BOTTOMLEFT", set, "BOTTOM", set[2]:GetWidth() / 2, 3)
	else
		set[1]:Point("BOTTOMLEFT", set, "BOTTOMLEFT", 3, 3)
		set[2]:Point("BOTTOM", set, "BOTTOM", -(set[2].text:GetWidth() / 3), 3)
		set[3]:Point("BOTTOMRIGHT", set, "BOTTOMRIGHT", -set[3].text:GetWidth()-set[3]:GetWidth() / 2, 3)
	end
end


local function _openBags()
	GameTooltip:Hide()
	MOD.BagFrame:Show()
	MOD.BagFrame:RefreshBags()
	TTIP.GameTooltip_SetDefaultAnchor(GameTooltip)
	MOD.BagFrame.editBox:SearchReset()
end

local function _closeBags()
	GameTooltip:Hide()
	MOD.BagFrame:Hide()
	if(MOD.BankFrame) then
		MOD.BankFrame:Hide()
	end
	if(MOD.ReagentFrame) then
		MOD.ReagentFrame:Hide()
	end
	if(BreakStuffHandler and BreakStuffButton and BreakStuffButton.icon) then
		BreakStuffHandler:MODIFIER_STATE_CHANGED()
		BreakStuffHandler.ReadyToSmash = false
		BreakStuffButton.ttText = "BreakStuff : OFF";
		BreakStuffButton.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1)
	end
	TTIP.GameTooltip_SetDefaultAnchor(GameTooltip)
	MOD.BagFrame.editBox:SearchReset()
end

local function _toggleBags(id)
	if id and GetContainerNumSlots(id)==0 then return end
	if MOD.BagFrame:IsShown()then
		_closeBags()
	else
		_openBags()
	end
end

local function _toggleBackpack()
	if IsOptionFrameOpen()then return end
	if IsBagOpen(0) then
		_openBags()
	else
		_closeBags()
	end
end

function MOD:BANKFRAME_OPENED()
	local hasReagent = (SV.GameVersion >= 60000)
	if not self.BankFrame then
		self:MakeBankOrReagent()
		self:ModifyBags()
	end
	self.BankFrame:UpdateLayout()

	if(hasReagent and not self.ReagentFrame) then
		self:MakeBankOrReagent(true)
		self.ReagentFrame:UpdateLayout()
	end

	self.BankFrame:Show()
	self.BankFrame:RefreshBags()
	self.BagFrame:Show()
	self.BagFrame:RefreshBags()
	self.RefreshTokens()
end

function MOD:BANKFRAME_CLOSED()
	if(self.BankFrame and self.BankFrame:IsShown()) then
		self.BankFrame:Hide()
	end
	if(self.ReagentFrame and self.ReagentFrame:IsShown()) then
		self.ReagentFrame:Hide()
	end
end

function MOD:PLAYERBANKBAGSLOTS_CHANGED()
	self.BankFrame:UpdateLayout()
end

function MOD:PLAYER_ENTERING_WORLD()
	self:UpdateGoldText()
	self.BagFrame:RefreshBags()
end
--[[
##########################################################
BUILD FUNCTION / UPDATE
##########################################################
]]--
function MOD:ReLoad()
	if not SV.db.SVBag.enable then return end
	self.BagFrame:UpdateLayout();
	self:ModifyBags();
	self:ModifyBagBar();
end

function MOD:Load()
	if IsAddOnLoaded("AdiBags") then
		return
	end
	if not SV.db.SVBag.enable then return end
	self:ModifyBagBar()
	self.BagFrames = {}
	self:MakeBags()
	self:ModifyBags()
	self.BagFrame:UpdateLayout()

	BankFrame:UnregisterAllEvents()
	for i = 1, NUM_CONTAINER_FRAMES do
		local frame = _G["ContainerFrame"..i]
		if(frame) then frame:Die() end
	end

	SV.Timers:ExecuteTimer(self.BreakStuffLoader, 5)

	hooksecurefunc("OpenAllBags", _openBags)
	hooksecurefunc("CloseAllBags", _closeBags)
	hooksecurefunc("ToggleBag", _toggleBags)
	hooksecurefunc("ToggleAllBags", _toggleBackpack)
	hooksecurefunc("ToggleBackpack", _toggleBackpack)
	hooksecurefunc("BackpackTokenFrame_Update", self.RefreshTokens)

	self:RegisterEvent("BANKFRAME_OPENED")
	self:RegisterEvent("BANKFRAME_CLOSED")
	self:RegisterEvent("INVENTORY_SEARCH_UPDATE")
	self:RegisterEvent("PLAYER_MONEY", "UpdateGoldText")
	self:RegisterEvent("PLAYER_ENTERING_WORLD")
	self:RegisterEvent("PLAYER_TRADE_MONEY", "UpdateGoldText")
	self:RegisterEvent("TRADE_MONEY_CHANGED", "UpdateGoldText")
	if(SV.GameVersion >= 60000) then self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED"); end

	StackSplitFrame:SetFrameStrata("DIALOG")

	self.BagFrame:RefreshBags()
end