--[[
Name: SpecialEvents-Bags-2.0
Revision: $Rev: 8112 $
Author: Tekkub Stoutwrithe (tekkub@gmail.com)
Website: http://wiki.wowace.com/index.php/SpecialEvents_Addon
Documentation: http://wiki.wowace.com/index.php/SpecialEvents-Bags-2.0
SVN: svn://svn.wowace.com/root/trunk/SpecialEventsEmbed/SpecialEvents-Bags-2.0
Description: Special events for bag/slot changes
Dependencies: AceLibrary, AceEvent-2.0
]]


local vmajor, vminor = "SpecialEvents-Bags-2.0", "$Revision: 8112 $"

if not AceLibrary then error(vmajor .. " requires AceLibrary.") end
if not AceLibrary:HasInstance("AceEvent-2.0") then error(vmajor .. " requires AceEvent-2.0.") end
if not AceLibrary:IsNewVersion(vmajor, vminor) then return end

local lib = {}
AceLibrary("AceEvent-2.0"):embed(lib)


----------------------------
--     Initializaiton     --
----------------------------

-- Activate a new instance of this library
function activate(self, oldLib, oldDeactivate)
	if oldLib then
		self.vars = oldLib.vars
		if oldLib:IsEventRegistered("BAG_UPDATE") then self:RegisterEvent("BAG_UPDATE") end
		oldLib:UnregisterAllEvents()
	else
		self.vars = {}
		self:InitBagScan()
--~~ 		self:RegisterEvent("BAG_UPDATE")
	end

	self:RegisterEvent("PLAYER_ENTERING_WORLD")
	self:RegisterEvent("PLAYER_LEAVING_WORLD")

	if oldDeactivate then oldDeactivate(oldLib) end
end


function lib:PLAYER_ENTERING_WORLD()
	self:RegisterEvent("BAG_UPDATE")
end


function lib:PLAYER_LEAVING_WORLD()
	self:UnregisterEvent("BAG_UPDATE")
end


--------------------------------
--      Tracking methods      --
--------------------------------

function lib:InitBagScan()
	self.vars.bags = {}

	for bag=0,4 do
		self.vars.bags[bag] = {}

		for slot=1,GetContainerNumSlots(bag) do
			local itemlink = GetContainerItemLink(bag, slot)
			local _, stack = GetContainerItemInfo(bag, slot)

			self.vars.bags[bag][slot] = {itemlink, stack}
		end
	end
end


function lib:BAG_UPDATE(bag)
	if not bag then self:TriggerEvent("SpecialEvents_WTFNoBag") return end
	if bag < 0 or bag > 4 then return end

	for slot=1,self:GetNumSlots(bag) do
		local itemlink = GetContainerItemLink(bag, slot)
		local _, stack = GetContainerItemInfo(bag, slot)

		if not self.vars.bags[bag] then self.vars.bags[bag] = {} end
		if not self.vars.bags[bag][slot] then self.vars.bags[bag][slot] = {} end
		local oldlink, oldstack = self.vars.bags[bag][slot][1], self.vars.bags[bag][slot][2]

		if oldlink ~= itemlink or oldstack ~= stack then
			self:TriggerEvent("SpecialEvents_BagSlotUpdate", bag, slot, itemlink, stack, oldlink, oldstack)
			self.vars.bags[bag][slot][1], self.vars.bags[bag][slot][2] = itemlink, stack
		end
	end
end


function lib:GetNumSlots(bag)
	if not self.vars.bags[bag] then return GetContainerNumSlots(bag) end

	local n = 0
	for i in pairs(self.vars.bags[bag]) do n = n + 1 end
	return math.max(n, GetContainerNumSlots(bag))
end


--------------------------------
--      Load this bitch!      --
--------------------------------
AceLibrary:Register(lib, vmajor, vminor, activate)



