--[[
LICENSE
	cargBags: An inventory framework addon for World of Warcraft

	Copyright (C) 2010  Constantin "Cargor" Schomburg <xconstruct@gmail.com>

	cargBags is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	cargBags is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with cargBags; if not, write to the Free Software
	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

DESCRIPTION:
	Provides a searchbar for your containers.
	If you specify a frame as arg #2, it will serve as a clickable placeholder to open it

DEPENDENCIES
	mixins/textFilter.lua
]]

local _, ns = ...
local cargBags = ns.cargBags

local function apply(self, container, text)
	if(text == "" or not text) then
		container:ApplyToButtons(self.highlightFunction, true)
	else
		container:FilterForFunction(self.highlightFunction, self.currFilters)
	end
end

local function doSearch(self, text)
	if(type(text) == "string") then
		self:SetText(text)
	else
		text = self:GetText()
	end

	if(self.currFilters) then
		self.currFilters:Empty()
	end

	self.currFilters = self.parent.implementation:ParseTextFilter(text, self.currFilters, self.textFilters)

	if(self.isGlobal) then
		for _, container in pairs(self.parent.implementation.contByName) do
			apply(self, container, text)
		end
	else
		apply(self, self.parent, text)
	end

	self.parent.implementation:OnEvent("BAG_UPDATE")
end

local function target_openSearch(target)
	target:Hide()
	target.search:Show()
end

local function target_closeSearch(search)
	search.target:Show()
	search:Hide()
end

local function onEscape(search)
	doSearch(search, "")
	search:ClearFocus()
	if(search.OnEscapePressed) then search:OnEscapePressed() end
end

local function onEnter(search)
	search:ClearFocus()
	if(search.OnEnterPressed) then search:OnEnterPressed() end
end

local function onHide(self)
	onEscape(self.Search)
end

cargBags:RegisterPlugin("SearchBar", function(self, target)
	local search = CreateFrame("EditBox", nil, self)
	search:SetFontObject(GameFontHighlight)
	self.Search = search

	search.Clear = onEscape
	search.DoSearch = search.doSearch

	local left = search:CreateTexture(nil, "BACKGROUND")
	left:SetTexture("Interface\\Common\\Common-Input-Border")
	left:SetTexCoord(0, 0.0625, 0, 0.625)
	left:SetWidth(8)
	left:SetHeight(20)
	left:SetPoint("LEFT", -5, 0)
	search.Left = left

	local right = search:CreateTexture(nil, "BACKGROUND")
	right:SetTexture("Interface\\Common\\Common-Input-Border")
	right:SetTexCoord(0.9375, 1, 0, 0.625)
	right:SetWidth(8)
	right:SetHeight(20)
	right:SetPoint("RIGHT", 0, 0)
	search.Right = right

	local center = search:CreateTexture(nil, "BACKGROUND")
	center:SetTexture("Interface\\Common\\Common-Input-Border")
	center:SetTexCoord(0.0625, 0.9375, 0, 0.625)
	center:SetHeight(20)
	center:SetPoint("RIGHT", right, "LEFT", 0, 0)
	center:SetPoint("LEFT", left, "RIGHT", 0, 0)
	search.Center = center

	search:SetScript("OnTextChanged", doSearch)
	search:SetScript("OnEscapePressed", onEscape)
	search:SetScript("OnEnterPressed", onEnter)
	self:HookScript("OnHide", onHide)

	if(target) then
		search:SetAutoFocus(true)
		search:SetAllPoints(target)
		search:Hide()

		target.search, search.target = search, target
		target:RegisterForClicks("anyUp")
		target:SetScript("OnClick", target_openSearch)
		search:SetScript("OnEditFocusLost", target_closeSearch)
	end

	return search
end)
