
function tradeDispenserOnLoad()
	--math.randomseed(floor(GetTime()));			-- initialize the randomizer
	tradeDispenser:RegisterEvent("VARIABLES_LOADED")
	tradeDispenser:RegisterEvent("TRADE_SHOW")			-- used to activate the automated trade
	tD_Temp.timeSlice = 0
	tD_Temp.broadcastSlice = 0
	tD_Temp.Target = {
		["Name"]=nil,
		["EnglishClass"]=nil,
		["Class"]=nil,
		["Level"]=nil,
	};		
end


function tradeDispenser_Eventhandler()
	if (tD_Temp.isEnabled) then
		tradeDispenserVerbose(1,"Gonna activate some events");
		--tradeDispenser:RegisterEvent("TRADE_SHOW")			-- used to activate the automated trade
		tradeDispenser:RegisterEvent("TRADE_CLOSED")
		tradeDispenser:RegisterEvent("TRADE_ACCEPT_UPDATE")   -- used, if the opposite player changes the items -> re-accept
		tradeDispenser:RegisterEvent("UI_ERROR_MESSAGE")
		tradeDispenser:RegisterEvent("UI_INFO_MESSAGE")
		tD_Temp.InitiateTrade=nil;
		tD_Temp.Countdown=-1;		
	else
		tradeDispenserVerbose(1,"Gonna deactivate some events");
		--tradeDispenser:UnregisterEvent("TRADE_SHOW")			-- used to activate the automated trade
		tradeDispenser:UnregisterEvent("TRADE_CLOSED")
		tradeDispenser:UnregisterEvent("TRADE_ACCEPT_UPDATE")   -- used, if the opposite player changes the items -> re-accept
		tradeDispenser:UnregisterEvent("UI_ERROR_MESSAGE")
		tradeDispenser:UnregisterEvent("UI_INFO_MESSAGE")
		tradeDispenser:UnregisterEvent("PLAYER_TARGET_CHANGED")
	end
	tradeDispenserVerbose(2,"TRADE_SHOW, TRADE_CLOSED, TRADE_ACCEPT_UPDATE, UI_ERROR_MESSAGE, UI_INFO_MESSAGE");
end


function tradeDispenserSetFaction() 
	--tradeDispenserVerbose(0,"Players Faction is: "..UnitFactionGroup("player"));
	if (tradeDispenserProfileDDframe) then
		tradeDispenserProfileDDframeSub9:SetText(tD_Loc.profile[UnitFactionGroup("player")]);
	end
	if (tD_CharDatas.ActualProfile==9) then
		tradeDispenserProfileDDTitleLbL:SetText(tD_Loc.profile[UnitFactionGroup("player")]);
	end
	
end



function tradeDispenserOnEvent(event)
	if (event == "VARIABLES_LOADED") then
		tradeDispenserVerbose(0,tD_Loc.logon.welcome);
		tradeDispenser_OnVariablesLoaded()			-- found in tradeDispenser_initialize
	end
	if (event == "PLAYER_TARGET_CHANGED") then
		if (UnitIsPlayer("target") and UnitIsFriend("target", "player")) then
			tradeDispenserBanlistName:SetText(UnitName("target"));
		end
	end
	
	if (event=="TRADE_SHOW" and (tD_Temp.isEnabled or tD_CharDatas.ClientInfos) and WorldMapFrame:IsVisible()) then
		ToggleWorldMap();
		tradeDispenserVerbose(1, " Closed the Map to avoid bugs. Sorry");
	end
		
	if (event == "TRADE_SHOW" and (not tD_Temp.isEnabled) and tD_CharDatas.ClientInfos) then
		local targetClass, targetEnglishClass = UnitClass("NPC");
		local guildName2, guildRankName2, guildRankIndex2 = GetGuildInfo("NPC");		
		local guildName3 = "";
		if (guildName2~=nil) then guildName3 = "<"..guildName2.."> ";	end		
		DEFAULT_CHAT_FRAME:AddMessage(tD_Loc.Opposite.." "..UnitName("NPC").." "..guildName3.." -  "..targetClass.." Level "..UnitLevel("NPC"),1,1,0);
	end
	
	
	if (not tD_Temp.isEnabled) then
		return
	end
	
	if ((event=="UI_ERROR_MESSAGE" or event=="UI_INFO_MESSAGE") and tD_Temp.Target.Name and arg1) then
		if (strfind(arg1,tD_Loc.UImessages.cancelled)~=nil or strfind(arg1,tD_Loc.UImessages.failed)~=nil) then
			tradeDispenserVerbose(2,arg1);
			tD_Temp.Target.Name=nil;
		end
		if (strfind(arg1,tD_Loc.UImessages.complete)~=nil) then
			tradeDispenserVerbose(2,arg1);
			tradeDispenserVerbose(1,"Gonna Registrate the Player "..tD_Temp.Target.Name);
			tradeDispenserAddClient(tD_Temp.Target.Name);
		end
	end


	if (event == "TRADE_SHOW" and tD_Temp.isEnabled and tD_Temp.InitiateTrade==nil) then
		if (CursorHasItem()) then   PutItemInBackpack()  end	-- if the player's got an item on the cursor, tD's not running correctly
		if (UnitAffectingCombat("Player")==nil) then TargetUnit("NPC") end	-- target player, if you're not in combat
		tD_Temp.Target = {};
		tD_Temp.Target.Name 	= UnitName("NPC");
		tD_Temp.Target.Level	= UnitLevel("NPC");
		tD_Temp.Target.Class, tD_Temp.Target.EnglishClass = UnitClass("NPC");
		
		if (not tradeDispenserTradeControlChecker()) then
			tD_Temp.Target.Name=nil;
			CloseTrade();
		else
			local itemsToTrade = tradeDispenserCompileProfile();
			if (itemsToTrade) then
				if (itemsToTrade==0) then		-- no items to trade - tradeDispenser should be inactive
					tradeDispenserVerbose(0,tD_Loc.noItemsToTrade);
					tD_Temp.Target.Name=nil;
				else
					tD_Temp.timeSlice = 0
					tD_Temp.tradeState = "populate"
					tD_Temp.tradeData = {}
					tD_Temp.tradeData.slotID = 1
					tD_Temp.tradeData.numAttempts = 0
					tD_Temp.tradeData.containerLocation = nil
				end
			end
		end
	end
	if (event == "TRADE_ACCEPT_UPDATE") then
		tradeDispenserVerbose(1,"TRADE_ACCEPT_UPDATE: Player="..arg1.." - Target="..arg2);
		if (arg1==0 and arg2==1 and tD_CharDatas.AutoAccept) then 
			tradeDispenserAccept()
		end
		if (arg1==1 and arg2==0 and tD_CharDatas.TimelimitCheck) then
			tradeDispenserStartTimelimiter()
		end
	end
	if (event == "TRADE_CLOSED") then
		tD_Temp.tradeState = nil
		tD_Temp.tradeData = nil
		tD_Temp.InitiateTrade=nil;
		tD_Temp.Countdown=-1;
		tradeDispenserVerbose(1,"Trade Closed")

		--if (UnitIsPlayer("target")) then TargetLastEnemy() end
	end
end


function tradeDispenserAddClient(name)
	if (not name) then return end
	
	local i=0
	local index=nil;
	while (tD_Temp.RegUser[i]~=nil) do
		tradeDispenserVerbose(3,"Registred Player at index "..i.." is: "..tD_Temp.RegUser[i].name);
		if (tD_Temp.RegUser[i].name == name) then
			tradeDispenserVerbose(2,name.." found in the List at position "..i);
			index=i;
		end
		i=i+1;
	end
	
	if (index==nil) then
		tradeDispenserVerbose(2,name.." was unregistred!  New Registration-Index is: "..i);
		tD_Temp.RegUser[i]= {
			["name"] = name,  	["trades"] = 1
		}
	else
		tD_Temp.RegUser[index].trades = tD_Temp.RegUser[index].trades+1;
	end
end



function tradeDispenserClick(slotID)
	MoneyInputFrame_ClearFocus(tradeDispenserMoneyFrame)
		
	ClickTradeButton(slotID)
	local itemName, itemTexture, itemCount = GetTradePlayerItemInfo(slotID)
	local itemLink = GetTradePlayerItemLink(slotID)

	if ( itemName ) then
		ClickTradeButton(slotID)
		local i=tD_CharDatas.ActualProfile;		
		tD_CharDatas.profile[tD_CharDatas.ActualRack][i][slotID] = {}
		tD_CharDatas.profile[tD_CharDatas.ActualRack][i][slotID].itemLink = itemLink
		tD_CharDatas.profile[tD_CharDatas.ActualRack][i][slotID].itemName = itemName
		tD_CharDatas.profile[tD_CharDatas.ActualRack][i][slotID].itemTexture = itemTexture
		tD_CharDatas.profile[tD_CharDatas.ActualRack][i][slotID].itemCount = itemCount
	else
		tD_CharDatas.profile[tD_CharDatas.ActualRack][tD_CharDatas.ActualProfile][slotID]=nil
	end
	tradeDispenserVerbose(2, "Recieved Item on Slot "..slotID);
	tradeDispenserUpdate()
end


function tradeDispenserUpdate()
	local ActPro=tD_CharDatas.ActualProfile;

	MoneyInputFrame_ClearFocus(tradeDispenserMoneyFrame)
	if (tradeDispenserProfileDDframe) then tradeDispenserProfileDDframe:Hide(); end
	if (tradeDispenserRackDDframe) then tradeDispenserRackDDframe:Hide(); end
	
	
	if (tradeDispenserSettingsChannelDDframe) then tradeDispenserSettingsChannelDDframe:Hide(); end
	for slotID=1,6 do
		local buttonText = getglobal("tradeDispenserItem"..slotID.."Name")
		local itemButton = getglobal("tradeDispenserItem"..slotID.."ItemButton")
		
		if ( tD_CharDatas.profile and tD_CharDatas.profile[tD_CharDatas.ActualRack] and 
			 tD_CharDatas.profile[tD_CharDatas.ActualRack][ActPro] and
		     tD_CharDatas.profile[tD_CharDatas.ActualRack][ActPro][slotID] and 
			 tD_CharDatas.profile[tD_CharDatas.ActualRack][ActPro][slotID].itemName ) then
			local temp = tD_CharDatas.profile[tD_CharDatas.ActualRack][ActPro][slotID];
			tradeDispenserVerbose(3,"tradeDispenserUpdate: slotID '"..slotID.."' is used")
			buttonText:SetText(temp.itemName)
			SetItemButtonTexture(itemButton, temp.itemTexture)
			SetItemButtonCount(itemButton, temp.itemCount)
		else
			tradeDispenserVerbose(3,"tradeDispenserUpdate: slotID '"..slotID.."' is free")
			buttonText:SetText("")
			SetItemButtonTexture(itemButton, nil)
			SetItemButtonCount(itemButton, nil)
		end
	end
	
	if (tD_Temp.isVisible) then	tradeDispenser:Show()  
	else
		if (tradeDispenserTradeControl) then
			tradeDispenser:Hide()	
			if (not tradeDispenserMessages:IsShown()) then
				tradeDispenserSettings:Hide();
				tradeDispenserTradeControl:Hide()
				tradeDispenserSettingsBtn:UnlockHighlight();
				tradeDispenserTradeControlBtn:UnlockHighlight();
			end
		end
	end
	
	if (tD_Temp.isEnabled) then	
		tradeDispenserState:SetText(tD_Loc.buttons.enabled)
		tradeDispenserState:LockHighlight();
	else	
		tradeDispenserState:SetText(tD_Loc.buttons.disabled)
		tradeDispenserState:UnlockHighlight();
	end
		
	if (tD_CharDatas.broadcastSlice) then
		if (tD_CharDatas.broadcastSlice < 0) then
			tD_CharDatas.broadcastSlice = 0
		elseif (tD_CharDatas.broadcastSlice > tradeDispenser_MaxBroadcastLength*60) then
			tD_CharDatas.broadcastSlice = tradeDispenser_MaxBroadcastLength*60
		end
	else
		tD_CharDatas.broadcastSlice = math.floor(tradeDispenser_MaxBroadcastLength/2)
	end
	
	if (tD_CharDatas.AutoBroadcast) then
		tradeDispenserSettingsBroadcastTimer:Show();
		tradeDispenserSettingsBroadcastCheck:SetChecked(1);
	else
		tradeDispenserSettingsBroadcastTimer:Hide();
		tradeDispenserSettingsBroadcastCheck:SetChecked(0);
	end
	
	local tmp = tD_CharDatas.ActualProfile;
	if (tD_CharDatas.profile and tD_CharDatas.profile[tD_CharDatas.ActualRack] and tmp and tD_CharDatas.profile[tD_CharDatas.ActualRack][tmp].Charge) then
		MoneyInputFrame_SetCopper(tradeDispenserMoneyFrame, tD_CharDatas.profile[tD_CharDatas.ActualRack][tmp].Charge)
	end
	
	local s = 1
	if (tD_CharDatas.ActualRack) then
		s = tradeDispenserRackColor[tD_CharDatas.ActualRack]
	end
	local r,g,b = 0.8,0.8,0.8;
	if (tD_Temp.isEnabled) then
		r=s.r; g=s.g; b=s.b;
	end
			
	tradeDispenserBkg1:SetVertexColor(r,g,b,1);
	tradeDispenserBkg2:SetVertexColor(r,g,b,1);
	tradeDispenserBkg3:SetVertexColor(r,g,b,1);
end


function tradeDispenser_ResetFrames()
	tradeDispenser:ClearAllPoints()
	tradeDispenser:SetPoint("CENTER", "UIParent", "CENTER", 0, 0)
	tradeDispenserMessages:ClearAllPoints()
	tradeDispenserMessages:SetPoint("CENTER", "UIParent", "CENTER", 0, 0)
	tradeDispenserOSD:ClearAllPoints()
	tradeDispenserOSD:SetPoint("LEFT", "UIParent", "LEFT", 15, 0)
	tradeDispenserVerbose(0,tD_Loc.resetframes)
end



SLASH_TRADE_DISPENSER1 = "/tradeDispenser"
SLASH_TRADE_DISPENSER2 = "/td"
SlashCmdList["TRADE_DISPENSER"] = function(msg)	
	tradeDispenser_SlashCommand(msg)
end


function tradeDispenser_SlashCommand(msg)
	if (not msg) then tradeDispenser_Print(tD_Loc.help) 
	else
		local command=string.lower(msg);
		if (command=="config") then
			tD_Temp.isVisible = not tD_Temp.isVisible;
			tradeDispenserMessages:Hide();
			tradeDispenserUpdate();
			tradeDispenserOSD_OnUpdate();
		elseif (command=="toggle") then
			tD_Temp.isEnabled = not tD_Temp.isEnabled;
			if (tD_Temp.isEnabled) then
				DEFAULT_CHAT_FRAME:AddMessage(tD_Loc.activated)
			else
				DEFAULT_CHAT_FRAME:AddMessage(tD_Loc.deactivated)
			end
			tradeDispenser_Eventhandler();
			tradeDispenserUpdate();
			tradeDispenserOSD_OnUpdate();
		elseif (command=="broadcast") then
			if (tD_Temp.isEnabled) then
				tradeDispenserBroadcastItems()
			else
				DEFAULT_CHAT_FRAME:AddMessage(tD_Loc.OSD.notenabled)
			end
		elseif (command=="osd") then
			tD_CharDatas.OSD.isEnabled = not tD_CharDatas.OSD.isEnabled;
			tradeDispenserUpdate();
			tradeDispenserSettings_OnUpdate();
			tradeDispenserOSD_OnUpdate();
		elseif (command=="about") then tradeDispenser_Print(tD_Loc.about)
		elseif (command=="resetpos") then tradeDispenser_ResetFrames()
		elseif (string.sub(command, 1,7)=="verbose") then
			local temp=tonumber(string.sub(command, 8,10));
			if (not temp) then
				tradeDispenserVerbose(0, tD_Loc.verbose.isset..tD_GlobalDatas.Verbose);
			else 
				tD_GlobalDatas.Verbose=temp;
				tradeDispenserVerbose(0,tD_Loc.verbose.setto..tD_GlobalDatas.Verbose);
			end
		else 	tradeDispenser_Print(tD_Loc.help);
		end		-- no correct command was found
	end
end
