local addonName, addon = ...
addon = LibStub("AceAddon-3.0"):GetAddon(addonName)

local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
local CollectionList = {}
addon.CollectionList = CollectionList
CollectionList.showAll = true

local MogItLoaded = false

function  addon.Init:initCollectionList()
	local f = CreateFrame("Frame", "BW_ColectionListFrame", BetterWardrobeCollectionFrame, "BW_ColectionListFrameTemplate")
	local ContextMenu = CreateFrame("Frame", addonName .. "ContextMenuFrame", UIParent, "BW_UIDropDownMenuTemplate")
	addon.ContextMenu = ContextMenu
end

function CollectionList:BuildCollectionList(complete)
	local list = {}
	local searchString = string.lower(WardrobeCollectionFrameSearchBox:GetText())
	local filterCollected = C_TransmogCollection.GetCollectedShown()
	local filterUncollected = C_TransmogCollection.GetUncollectedShown()
	local filterSource = {}
	local selectedCategory = BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory()

	for i = 1, 6 do
		filterSource[i] = C_TransmogCollection.IsSourceTypeFilterChecked(i)
	end

	local collectionList = addon.CollectionList:CurrentList()
	for visualID, _ in pairs(collectionList["item"]) do
		local sources = C_TransmogCollection.GetAllAppearanceSources(visualID)

		if sources then
			local sourceInfo = C_TransmogCollection.GetSourceInfo(sources[1])
			local camera = C_TransmogCollection.GetAppearanceCameraID(visualID)	
			sourceInfo.camera = camera
			local isCollected =  false
			local sourceTypes = {}

			for i,d in pairs(sources)do
				local info = C_TransmogCollection.GetSourceInfo(d)
				 if info.sourceType then
				 	sourceTypes[info.sourceType] = true
				 end
				 local collected = select(5,C_TransmogCollection.GetAppearanceSourceInfo(d))

				 if collected then
				 	isCollected = true
				 end
			end

			local filter = false
			for i in pairs(sourceTypes) do
				if  filterSource[i] then
					filter = true
					break
				end
			end

			if #sourceTypes == 0 then
				filter = true
			end

			local catType = sourceInfo.categoryID
			local invTypeMatch = false
			if CollectionList.showAll then
				invTypeMatch = true

			elseif (CollectionList.Category == 117  and catType == 19)  then
				invTypeMatch = true

			elseif 	(CollectionList.Category == 116  and catType > 11 and catType ~= 19)  then
				invTypeMatch = true

			else
				invTypeMatch = 	catType == CollectionList.Category
			end

			if complete then
				tinsert(list, sourceInfo)
			elseif ((not isCollected and filterUncollected) or (isCollected and filterCollected)) and filter  and invTypeMatch  then
				if searchString then
					for i, data in pairs(sources) do
						local source_info = C_TransmogCollection.GetSourceInfo(data)
						local match = string.find(string.lower(source_info.name or ""), searchString) or string.find(string.lower(baseSet.label or ""), searchString) or string.find(string.lower(baseSet.description or ""), searchString)
						if match then
							tinsert(list, source_info)
							break
						end
					end
				else
					tinsert(list, sourceInfo)
				end
			end
		end
	end

	return list
end

function CollectionList:BuildShoppingList()
	local collectionList = self:BuildCollectionList(true)
	local shoppingList = {}
	for _, data in ipairs(collectionList) do
		local sources = C_TransmogCollection.GetAllAppearanceSources(data.visualID)
		--local sources = C_TransmogCollection.GetAppearanceSources(data.visualID)
		for _, data in pairs(sources) do
			local sourceInfo = C_TransmogCollection.GetSourceInfo(data)
			tinsert(shoppingList, sourceInfo)
		end
	end

	return shoppingList
end

--Needs to to take account of variant
function CollectionList:UpdateList(type, typeID, add, sourceID)
	typeID = tonumber(typeID)
	if not typeID then return end
	local addSet = false
	local setName, setInfo, itemModID
	local selectedList = CollectionList:SelectedCollectionList()
	if selectedList == "MOGIT" then
		return addon.MogIt.UpdateWishlistItem(type, typeID, add, sourceID)
	end

	local collectionList = addon.CollectionList:CurrentList()
print(addon.CollectionList:CurrentList())
	if type == "item" then --TypeID is visualID
		collectionList[type][typeID] = add or nil
		if BetterWardrobeCollectionFrame.ItemsCollectionFrame:IsShown() then
			BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
			BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
			print(add and L["Appearance added."] or L["Appearance removed."])
		end
		
		return collectionList[type][typeID]
	else
		local sources
		if type == "set" then
			sources = addon.GetSetSources(typeID)
			setName = C_TransmogSets.GetSetInfo(typeID).name
		else
			setInfo = addon.GetSetInfo(typeID)
			sources = addon.GetSetsources(typeID)
			setName = "name"
			itemModID = setInfo.mod or 0
		end

		collectionList[type][typeID] = (add and {}) or nil

		for sourceID, isCollected in pairs(sources) do

			local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
			local visualID = C_TransmogCollection.GetItemInfo(sourceInfo.itemID, itemModID or sourceInfo.itemModID)--(type == "set" and sourceInfo.visualID) or addon.GetItemSource(sourceID, setInfo.mod)

			if add and visualID then
				collectionList[type][typeID][visualID] = add
			end

			addSet = self:UpdateList("item", visualID, add or nil)	
		end

		----if type == "set" then
			BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate()
			BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
		----else
		----	BW_SetsTransmogFrame:OnSearchUpdate()
		----	BW_SetsCollectionFrame:OnSearchUpdate()
		-----end

		--print(addSet and L["%s: Uncollected items added"]:format(setName) or L["No new appearces needed."])
		return addSet
	end	
end


BetterWardrobeSetsCollectionListMixin = {}
function BetterWardrobeSetsCollectionListMixin:Toggle(toggleState)
	if (IsShiftKeyDown()) then
		CollectionList:GenerateListView()
	else
		local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
		local transmogLocation = TransmogUtil.GetTransmogLocation("HEADSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetActiveSlot(transmogLocation)
		--BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetActiveSlot("HEADSLOT", Enum.TransmogType.Appearance)
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
		BetterWardrobeCollectionFrame.ItemsCollectionFrame.SlotsFrame:SetShown(not toggleState and not atTransmogrifier)
		--WardrobeCollectionFrameWeaponDropDown:SetShown(not toggleState)
		self.CollectionListTitle:SetShown(toggleState)
		local listcount = CollectionList:ListCount("item")
		self.CollectionListHelpText:SetShown(toggleState and listcount == 0)
		self.SlotsFrame:SetShown(toggleState)
	end
end

function BetterWardrobeSetsCollectionListMixin:SetTitle()
	self.CollectionListTitle.Name:SetText(L["Collection List"])
	self.CollectionListHelpText.Name:SetText(L["COLLECTION_LIST_HELP"])
end

function addon.Init:BuildCollectionList()
	CollectionList:AddMogItData()
	CollectionList:CreateDropdown()
end

local spacingNoSmallButton = 2
local spacingWithSmallButton = 12
local defaultSectionSpacing = 24
local shorterSectionSpacing = 19

function addon:GetActiveCategory()
	return CollectionList.Category
end

function addon:IsWeaponCat()
	return BW_CollectionListButton.ToggleState and CollectionList.Category and CollectionList.Category > 100
end

local catchAll = TransmogUtil.GetTransmogLocation("HEADSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
--function WardrobeItemsCollectionMixin:SetActiveSlot(transmogLocation, category, ignorePreviousSlot)
local function slotOnClick(self, transmogLocation)
	local slotButtons = self.parent.Buttons
	for i = 1, #slotButtons do
		local button = slotButtons[i]
		button.SelectedTexture:SetShown(button.transmogLocation:IsEqual(self.transmogLocation))
	end


	if self.transmogLocation:IsAppearance() then
		CollectionList.Category = transmogLocation and self.transmogLocation:GetArmorCategoryID() or self.transmogLocation:GetSlotID() + 100
		CollectionList.showAll = false
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:ChangeModelsSlot(transmogLocation)
	else

		CollectionList.Category = catchAll and catchAll:GetArmorCategoryID()
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:ChangeModelsSlot(catchAll)
		CollectionList.showAll = true
	end

	CloseDropDownMenus()
	BW_CloseDropDownMenus()
	PlaySound(SOUNDKIT.UI_TRANSMOG_GEAR_SLOT_CLICK)
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
end

function BetterWardrobeSetsCollectionListMixin:CreateSlotButtons()
	local slots = { "head", "shoulder", "back", "chest", "shirt", "tabard", "wrist",  "hands", "waist", "legs", "feet",  "mainhand", "secondaryhand" }
	local parentFrame = self.SlotsFrame
	local lastButton
	local xOffset = spacingNoSmallButton

	local button = CreateFrame("BUTTON", nil, parentFrame, "WardrobeSlotButtonTemplate")
	button:SetSize(40,40)
	button.NormalTexture:ClearAllPoints()
	button.NormalTexture:SetAllPoints()
	button.NormalTexture:SetAtlas("transmog-nav-slot-enchant", false)
	button.transmogLocation = TransmogUtil.GetTransmogLocation("MAINHANDSLOT", Enum.TransmogType.Illusion, Enum.TransmogModification.Main)
	button.parent = parentFrame
	button.SelectedTexture:SetShown(true)

	button:SetPoint("TOPLEFT")
	button:SetScript("OnEnter", function(button) GameTooltip:SetOwner(button, "ANCHOR_RIGHT"); GameTooltip:SetText(L["View All"]); end)
	button:SetScript("OnClick", function(button) slotOnClick(button, button.transmogLocation) end)
	lastButton = button

	for i = 1, #slots do
		local value = tonumber(slots[i])
		if (value) then
			-- this is a spacer
			xOffset = value
		else
			local slotString = slots[i]
			local button = CreateFrame("BUTTON", nil, parentFrame, "WardrobeSlotButtonTemplate")
			button.NormalTexture:SetAtlas("transmog-nav-slot-"..slotString, true)
			if (lastButton) then
				button:SetPoint("LEFT", lastButton, "RIGHT", xOffset, 0)
			else
				button:SetPoint("TOPLEFT")
			end
			button.slot = string.upper(slotString).."SLOT"
			xOffset = spacingNoSmallButton
			lastButton = button
			button.parent = parentFrame
			button.transmogLocation = TransmogUtil.GetTransmogLocation(button.slot, button.transmogType, button.modification)
			button:SetScript("OnClick", function(button)  slotOnClick(button , button.transmogLocation) end)
		end
	end
end



function CollectionList:Dropdown_OnClick(arg1, arg2, checked)
		CollectionList:SelectedCollectionList(arg1)
		--BW_UIDropDownMenu_SetSelectedID(BW_CollectionList_Dropdown, arg1)
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
		BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
end

local MogItKey
function CollectionList:Dropdown_Initialize(frame, level, menuList)
	local list = addon.collectionListDB.profile.lists
	local info = BW_UIDropDownMenu_CreateInfo()

	for i, data in pairs(list) do
		 info.func = CollectionList.Dropdown_OnClick
		 info.text, info.arg1 = data.name, i
		 info.value = i
		 info.checked = false
		  BW_UIDropDownMenu_AddButton(info)
		if i == CollectionList:SelectedCollectionList() then
			--BW_UIDropDownMenu_SetSelectedValue(self, data.name)
		end
	end

	if MogItLoaded then
		--key["MOGIT"] = "MogIt Wishlist"
		--local info = BW_UIDropDownMenu_CreateInfo()
		info.func = CollectionList.Dropdown_OnClick
		info.text, info.arg1 = "MogIt Wishlist", #list + 1
		info.checked = false
		MogItKey = info.arg1

		BW_UIDropDownMenu_AddButton(info)
	end
end


local function GeneratorFunction(owner, rootDescription)
	rootDescription:CreateTitle("Collection Lists");
			rootDescription:SetTag("MENU_COLLECTION_LIST");

		local list = addon.collectionListDB.profile.lists
		for index, data in pairs(list) do
			rootDescription:CreateRadio(data.name, function() return index == CollectionList:SelectedCollectionList()  end, function()
				CollectionList:SelectedCollectionList(index)
				--BW_UIDropDownMenu_SetSelectedID(BW_CollectionList_Dropdown, arg1)
				BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
				BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
			end,index);

		end

		if MogItLoaded then
			rootDescription:CreateButton( "MogIt Wishlist", function()
				CollectionList:SelectedCollectionList(#list + 1)
				--BW_UIDropDownMenu_SetSelectedID(BW_CollectionList_Dropdown, arg1)
				BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
				BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
			end);

		end
end

--Dropdownmenu for the Collection List
function CollectionList:CreateDropdown()
	BW_CollectionList_Dropdown = CreateFrame("DropdownButton", "BW_CollectionList_Dropdown", BW_ColectionListFrame, "WowStyle1DropdownTemplate")
	BW_CollectionList_Dropdown:SetPoint("BOTTOM", -80, 15)
	--BW_CollectionList_Dropdown:SetScript("OnMouseUp", function(button) 
BW_CollectionList_Dropdown:SetupMenu(GeneratorFunction);


--end)
	local level = BW_ColectionListFrame:GetFrameLevel()
	BW_CollectionList_Dropdown:SetFrameLevel(level+1)
	--BW_UIDropDownMenu_Initialize(BW_CollectionList_Dropdown, CollectionList.Dropdown_Initialize)
	--BW_UIDropDownMenu_SetText(BW_CollectionList_Dropdown, "")

	--BW_UIDropDownMenu_SetSelectedID(BW_CollectionList_Dropdown, CollectionList:SelectedCollectionList())

	BW_ColectionListFrame.dropdownFrame = BW_CollectionList_Dropdown

	local button = CreateFrame("Button", "BW_CollectionListOptionsButton", BW_CollectionList_Dropdown, "SquareIconButtonTemplate")
	button:SetSize(30,30)
	button:SetPoint("LEFT", "BW_CollectionList_Dropdown", "RIGHT", 1, -2)
	button.Icon:SetTexture("Interface\\Buttons\\UI-OptionsButton")
	button.Icon:SetSize(15,15)
	button:SetScript("OnClick", function(button) CollectionList:OptionButton_OnClick(button) end)
end


local action
function CollectionList:OptionButton_OnClick(button)
	local  ContextMenu = addon.ContextMenu
	local Profile = addon.Profile
	local name  = addon.QueueList[3]
	local disable = CollectionList:SelectedCollectionList() == "MOGIT"
	local contextMenuData = {
		{
			text =  L["Add List"],
			func = function()
				action = "add"
				BetterWardrobeOutfitManager:ShowPopup("BW_NAME_COLLECTION")
			end,
			isNotRadio = true,
			notCheckable = true,
		},
		{
			text = L["Rename"],
			func = function()
				action = "rename"
				BetterWardrobeOutfitManager:ShowPopup("BW_NAME_COLLECTION")
			end,
			isNotRadio = true,
			notCheckable = true,
			disabled = disable,
		},
		{
			text = L["Delete"],
			func = function()
				CollectionList:DeleteList()
			end,
			isNotRadio = true,
			notCheckable = true,
			disabled = disable,
		},
		{
			text = L["Add by Item ID"],
			func = function()
				BetterWardrobeOutfitManager:ShowPopup("BETTER_WARDROBE_COLLECTIONLIST_ITEM_POPUP")
			end,
			isNotRadio = true,
			notCheckable = true,
			disabled = disable,
		},
	}

	BW_UIDropDownMenu_SetAnchor(ContextMenu, 0, 0, "BOTTOMLEFT", button, "BOTTOMLEFT")
	BW_EasyMenu(contextMenuData, ContextMenu, ContextMenu, 0, 0, "MENU")	
end


function CollectionList:AddMogItData()
	MogItLoaded = IsAddOnLoaded("MogIt")
	 if not MogItLoaded and CollectionList:SelectedCollectionList() == "MOGIT" then
	 	CollectionList:SelectedCollectionList(1)
	 end
end


function CollectionList:AddList(name)
	if not name then return false end

	local profile = addon.collectionListDB.profile
	local default = {item = {}, set = {}, extraset = {}, name = name}
	tinsert(profile.lists, default)
	local list = CollectionList:SelectedCollectionList(#profile.lists)
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
	BW_CollectionList_Dropdown:SetupMenu(GeneratorFunction);

	return true
end


function CollectionList:RenameList(name)
	if not name then return false end

	local profile = addon.collectionListDB.profile
	local list = CollectionList:CurrentList()
	list.name = name
	--BW_CollectionList_DropdownText:SetText(list.name)
	BW_CollectionList_Dropdown:SetupMenu(GeneratorFunction);

	return true
end


function CollectionList:DeleteList()
	local profile = addon.collectionListDB.profile
	if #profile.lists == 1 then
		--Error cant delete last list
		return false
	end

	tremove(profile.lists, CollectionList:SelectedCollectionList())
	CollectionList:SelectedCollectionList(1)
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList()
	BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems()
	BW_CollectionList_Dropdown:SetupMenu(GeneratorFunction);

	return true
end


function CollectionList:IsInList(itemID, itemType, full)
	itemType = itemType or "item"
	if full then
		local profile = addon.collectionListDB.profile.lists
		local count = 0

		for i, data in ipairs(profile) do
			local collectionList = profile[i]
			if not collectionList then return end
			local isInList = collectionList[itemType][itemID]
			if isInList then count = count + 1 end
		end
		return count ~= 0, count
	else
		local collectionList = addon.CollectionList:CurrentList()
		local isInList = collectionList[itemType][itemID] or false
		return isInList	
	end
end

--[[	if Wow.IsAddonEnabled("TheUndermineJournal") and TUJMarketInfo then
		local function GetTUJPrice(itemLink, arg)
			local data = TUJMarketInfo(itemLink)
			return data and data[arg] or nil
		end
]]
function CollectionList:ListCount(type)
	local list = CollectionList:CurrentList()
	local counter = 0
	if not list then return counter end

	type = type or "item"
	list = list[type]
	
	for i in pairs(list) do
		counter = counter + 1
	end
	return counter
end

function CollectionList:CurrentList()
	local selectedList = CollectionList:SelectedCollectionList()
	if selectedList == MogItKey then
		return addon.MogIt.GetMogitWishlist()
	else
		return addon.collectionListDB.profile.lists[selectedList]
	end
end

--Returns selected list and  sets list if value is included
function CollectionList:SelectedCollectionList(value)
	if value then
		addon.collectionListDB.profile.selectedCollectionList = value
		local list = CollectionList:CurrentList()
		if not list then return end
	end

	return addon.collectionListDB.profile.selectedCollectionList
end

local function GetCustomPriceValue(source, itemID)
	return TSM_API.GetCustomPriceValue(source, itemID)
end

local function MoneyToString(priceMarket)
	return TSM_API.FormatMoneyString(priceMarket)
end

local TSMSources
local function TSMPricelookup(itemID)
	if (not IsAddOnLoaded("TradeSkillMaster")) then return "" end

	if not TSMSources  then
		TSMSources = {}
		TSM_API.GetPriceSourceKeys(TSMSources)
	end

	local source = TSMSources[addon.db.profile["TSM_Market"]] or "DBMarket"
	return MoneyToString((GetCustomPriceValue(source, "i:"..itemID) or 0))
end

local function GetBossInfo(itemID)
	local drops = C_TransmogCollection.GetAppearanceSourceDrops(itemID)
	local sourceText = ""
	if (#drops == 1) then
		sourceText = _G["TRANSMOG_SOURCE_"..TRANSMOG_SOURCE_BOSS_DROP]..": "..string.format(WARDROBE_TOOLTIP_ENCOUNTER_SOURCE, drops[1].encounter, drops[1].instance)
		showDifficulty = true
	end
	return sourceText
end


local  LISTWINDOW
local AceGUI = LibStub("AceGUI-3.0")
function CollectionList:GenerateListView()
	if self.LISTWINDOW then self.LISTWINDOW:Hide() end

	-- Create a container frame
	local f = AceGUI:Create("Window")
	f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
	f:SetTitle("Collection List")
	f:SetLayout("Flow")
	--f:SetAutoAdjustHeight(true)
	f:EnableResize(false)
	_G["BetterWardrobeCollectionListWindow"] = f.frame
	self.LISTWINDOW = f
	tinsert(UISpecialFrames, "BetterWardrobeCollectionListWindow")

	local scrollcontainer = AceGUI:Create("SimpleGroup")
	scrollcontainer:SetFullWidth(true)
	scrollcontainer:SetHeight(f.frame:GetHeight()-75)
	scrollcontainer:SetLayout("Fill") -- important!
	f:AddChild(scrollcontainer)

	local scroll = AceGUI:Create("ScrollFrame")
	scroll:SetLayout("Flow")
	scroll:SetFullWidth(true)
	scroll:SetFullHeight(true)
	scrollcontainer:AddChild(scroll)	

	local btn = AceGUI:Create("Button")
	btn:SetWidth(170)
	btn:SetHeight(25)
	btn:SetText(L["Export TSM Groups"])
	btn:SetCallback("OnClick", function()  CollectionList:TSMGroupExport() end)
	f:AddChild(btn)
	btn:ClearAllPoints()
	btn:SetPoint("BOTTOMRIGHT")

	local list = CollectionList:BuildShoppingList()
	for i, data in ipairs(list) do
		if data then
			local _, itemLink, _, _, _, _, _, _, _, itemIcon, _, _, _, _, expacID = GetItemInfo(data.itemID)
			local nameColor = ITEM_QUALITY_COLORS[data.quality] or ""
			local transmogSource = data.sourceType and _G["TRANSMOG_SOURCE_"..(data.sourceType)] or L.OM_GOLD..L["Collected"]..L.ENDCOLOR
			local bossInfo = ""

			local CheckBox = AceGUI:Create("InteractiveLabel")
			local priceText = TSMPricelookup(data.itemID)
			local name = data.name and nameColor.hex..data.name..L.ENDCOLOR or ""

			if data.sourceType and data.sourceType == 1 then
				bossinfo = GetBossInfo(data.sourceID)
				CheckBox:SetText(L.COLLECTIONLIST_TEXT:format(name, bossinfo))
			elseif data.sourceType and (data.sourceType == 3 or data.sourceType == 4 or data.sourceType == 6) then
				CheckBox:SetText(L.SHOPPINGLIST_TEXT:format(name, transmogSource, priceText))
			else
				CheckBox:SetText(L.COLLECTIONLIST_TEXT:format(name, transmogSource))
			end

			CheckBox:SetImage(itemIcon)
			CheckBox:SetImageSize(20,20)
			CheckBox:SetFullWidth(true)

			if i == 1 or list[i-1].visualID ~= data.visualID then
				local Heading = AceGUI:Create("Heading")
				Heading:SetFullWidth(true)
				scroll:AddChild(Heading)
			end

			CheckBox:SetCallback("OnClick", function()
				if IsModifiedClick("CHATLINK") then
						if (itemLink) then
							HandleModifiedItemClick(itemLink)
						end
				elseif IsModifiedClick("DRESSUP") then
					DressUpVisual(data.sourceID)
				end
			end)

			CheckBox:SetCallback("OnEnter", function()
				GameTooltip:SetOwner(UIParent, "ANCHOR_CURSOR", 0, 0)
				if itemLink then
				GameTooltip:SetHyperlink(itemLink)
				GameTooltip:Show()
			end
			end)
			
			CheckBox:SetCallback("OnLeave", function()
				GameTooltip:Hide()
			end)
			scroll:AddChild(CheckBox)
		end
	end
end

function CollectionList:TSMGroupExport()
	if self.LISTWINDOW then self.LISTWINDOW:Hide() end
	local f = AceGUI:Create("Window")
	f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
	--f:SetTitle("TSM Export")
	f:SetLayout("Fill")
	--f:SetAutoAdjustHeight(true)
	f:EnableResize(false)
	_G["BetterWardrobeCollectionExportWindow"] = f.frame
	LISTWINDOW = f
	tinsert(UISpecialFrames, "BetterWardrobeCollectionExportWindow")

	local CheckBox = AceGUI:Create("MultiLineEditBox")
	CheckBox:SetFullHeight(true)
	CheckBox:SetFullWidth(true)
	CheckBox:DisableButton(true)
	CheckBox:SetLabel("")
	f:AddChild(CheckBox)

	local list = CollectionList:BuildShoppingList()
	local itemString = ""
	local groupCount = 1
	local lastVisual
	for i, data in ipairs(list) do
		if data.sourceType and (data.sourceType == 3 or data.sourceType == 4 or data.sourceType == 6) then
			if i == 1 or lastVisual ~= data.visualID then
				itemString = L["%sgroup:Appearance Group %s,"]:format(itemString, groupCount)
				groupCount = groupCount + 1
				lastVisual = data.visualID
			end	
			itemString = itemString.."i:"..data.itemID..","
		end

	end
	CheckBox:SetText(itemString)
end

function CollectionListTooltip_OnEnter(self)
	GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
	GameTooltip:SetText(L["Click: Show Collection List"])
	GameTooltip:AddLine(L["Shift Click: Show Detail List"])
	GameTooltip:Show()
end

BW_CollectionListDropDownMixin = {}

function BW_CollectionListDropDownMixin:OnLoad()
	local button = _G[self:GetName().."Button"]
	button:Hide()
end

StaticPopupDialogs["BETTER_WARDROBE_COLLECTIONLIST_ITEM_POPUP"] = {
	text = L["Type the item ID in the text box below"],
	preferredIndex = 3,
	button1 = ADD,
	button2 = CANCEL,
	hasEditBox = true,
	maxLetters = 512,
	editBoxWidth = 260,
	OnShow = function() if LISTWINDOW then LISTWINDOW:Hide() end end,
	OnAccept = function(self)

		local itemID = self.editBox:GetText()
		if not itemID then  return false end
		local appearanceID, sourceID = C_TransmogCollection.GetItemInfo(tonumber(itemID))
		if not appearanceID then return false end

		CollectionList:UpdateList("item", appearanceID, true)
		end,
	EditBoxOnEnterPressed = function(self)
		if self:GetParent().button1:IsEnabled() then
			StaticPopup_OnClick(self:GetParent(), 1)
		end
	end,
	EditBoxOnEscapePressed = HideParentPanel,
	exclusive = true,
	whileDead = true,
}

StaticPopupDialogs["BW_NAME_COLLECTION"] = {
	preferredIndex = 3,
	text = L["List Name"],
	button1 = SAVE,
	button2 = CANCEL,
	OnAccept = function(self)
		local name = self.editBox:GetText()
		if action == "add" then
			CollectionList:AddList(name)
		elseif action == "rename" then
			CollectionList:RenameList(name)
		end
		action = nil
	end,
	timeout = 0,
	whileDead = 1,
	hideOnEscape = 1,
	hasEditBox = 1,
	maxLetters = 31,
	OnShow = function(self)
		self.button1:Disable()
		self.button2:Enable()
		self.editBox:SetFocus()
	end,
	OnHide = function(self)
		self.editBox:SetText("")
	end,
	EditBoxOnEnterPressed = function(self)
		if self:GetParent().button1:IsEnabled() then
			StaticPopup_OnClick(self:GetParent(), 1)
		end
	end,
	EditBoxOnTextChanged = function (self)
		local parent = self:GetParent()
		if parent.editBox:GetText() ~= "" then
			parent.button1:Enable()
		else
			parent.button1:Disable()
		end
	end,
	EditBoxOnEscapePressed = function(self)
		self:GetParent():Hide()
	end
}