-- version 00.00.07 du 20091210
	-- maj du .toc pour wow 3.3

-- version 00.00.06 du 20090831
	-- maj du .toc pour wow 3.2

-- version 00.00.05 du 20090501
	-- maj du .toc pour wow 3.1

-- version 00.00.04 du 20081221
	-- euh, je ne sais plus :)

-- version 00.00.03 du 20081020
	-- maj pour wow 3.0 et wotlk

-- version 00.00.02 du
	-- demande de confirmation de la ligne à ignorer, si vous la modifiez, cette suite de caractères est recherchée et les lignes sont masquées
	-- supprimé - vérifi la ligne et la ligne sans le premier caractère ( supprimé ) ( doit etre remplacé par la recherche d'un mot ds la ligne )
	-- supprimé - met en ignore la ligne et la ligne sans le premier caractère ( supprimé ) ( doit etre remplacé par la recherche d'un mot ds la ligne )

-- version 00.00.01 du 20080411
	-- addon anti spam
	-- ajoute dans le click droit sur lien de joueur , le choix : Ignorer ligne
	-- met en minuscule la ligne, et enlève tous les espaces
	-- si cette ligne est revue, elle n'est plus affichée
	-- mémorise 30 minutes de chat pendant lesquelles vous pouvez ignorer certaines lignes
	-- si une ligne n'est jamais relue ( et donc masquée ) pendant un mois, elle sera enlevée des lignes masquées, si elles reviennent, vous devrez de nouveau les masquer
	-- fonctionne aussi pour l'addon : ChatMondialServeur
	-- aucun report pour spam n'est envoyé à blizzard, ces lignes ne sont justes pas affichées

--http://wowui.worldofwar.net/?p=mod&m=6349
CMS_antispam_tablo = {};
CMS_antispam_nameplayer = nil;
CMS_antispam_lineid = nil;
CMS_antispam_exist = 1;

local Saved_CMS_antispam_ChatFrame_OnEvent = ChatFrame_OnEvent;
function ChatFrame_OnEvent(self,event,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20)
	if ( CMS_testerligne(arg1) ) then
	else
		return nil;
	end
	Saved_CMS_antispam_ChatFrame_OnEvent(self,event,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20);
end

local Saved_CMS_antispam_SetItemRef = SetItemRef;
function SetItemRef(link, text, button)

--DEFAULT_CHAT_FRAME:AddMessage("SetItemRef link = "..link);
	Saved_CMS_antispam_SetItemRef(link, text, button);
	if ( strsub(link, 1, 6) == "player" ) then
		local namelink = strsub(link, 8);
		local name, lineid = strsplit(":", namelink);
		if ( lineid and name and (strlen(name) > 0) ) then
			if ( IsModifiedClick("CHATLINK") ) then
			elseif ( button == "RightButton" ) then
				local info;
				info = {};
				if ( GetLocale() == "frFR" ) then
					info.text = "Ignorer ligne";
				else
					info.text = "Ignore line";
				end
				info.value = "IGNORERLIGNE";
				info.owner = "FRIEND";
				info.func = CMS_antispam_ignorerligne;
				--info.func = UnitPopup_OnClick;
				CMS_antispam_nameplayer = name;
				if ( strsub(lineid,1,1) == "%-" ) then
					CMS_antispam_lineid = tonumber(strsub(lineid,2)) * -1;
				else
					CMS_antispam_lineid = tonumber(lineid);
				end
				info.notCheckable = 1;
				info.tooltipTitle = info.text;
				UIDropDownMenu_AddButton(info);
			else
			end
		end
	end

end

function CMS_antispam_ignorerligne()

local sligne;
--local sligne_1;
local sligne_new;
local ipos;
local imax = 300;
local i = 0;
local idate;

--DEFAULT_CHAT_FRAME:AddMessage("ligne : "..(CMS_antispam_lineid or ""));
	if ( CMS_antispam_tablo[CMS_antispam_lineid] == nil ) then
DEFAULT_CHAT_FRAME:AddMessage("impossible, ligne vieille de plus de 30 minutes ou non m\195\169moris\195\169e.");
		return nil;
	end

	sligne = CMS_antispam_tablo[CMS_antispam_lineid].ligne;
	if ( sligne ) then
		sligne = strlower(sligne);
		ipos = strfind(sligne," ");
		while ( ipos and i < imax ) do
			i = i + 1;
			sligne_new = (strsub(sligne,1,ipos-1) or "")..strsub(sligne,ipos+1);
			sligne = sligne_new;
			ipos = strfind(sligne," ",ipos);
		end
		StaticPopupDialogs["CMS_antispam_STATICPOPUPDIALOG_IGNORERLIGNE"] = {
			text = "Etes-vous s\195\187r de vouloir ignorer cette ligne ? ( si vous la modifiez, les lignes ayant cette suite de lettres seront ignor\195\169es",
			button1 = TEXT(OKAY),
			button2 = TEXT(CANCEL),
			OnShow = function(self)
				self.editBox:SetText(sligne);
			end,
			OnAccept = function(self)
				sligne_new = strlower(self.editBox:GetText());
				if ( sligne == sligne_new ) then
					if ( GetLocale() == "frFR" ) then
DEFAULT_CHAT_FRAME:AddMessage("J'ignore : "..sligne);
					else
DEFAULT_CHAT_FRAME:AddMessage("I ignore : "..sligne);
					end
					idate = tonumber(date("%Y%m%d"));
					CMS_antispam[sligne] = idate;
				elseif ( strlen(sligne_new) > 5 ) then
					if ( GetLocale() == "frFR" ) then
DEFAULT_CHAT_FRAME:AddMessage("J'ignore mot : "..sligne_new);
					else
DEFAULT_CHAT_FRAME:AddMessage("I ignore word : "..sligne_new);
					end
					idate = tonumber(date("%Y%m%d"));
					CMS_antispam_mot[sligne_new] = idate;
				elseif ( strlen(sligne_new) < 6 ) then
					if ( GetLocale() == "frFR" ) then
DEFAULT_CHAT_FRAME:AddMessage("mot trop court (<6) : "..sligne_new);
					else
DEFAULT_CHAT_FRAME:AddMessage("too small word (<6) : "..sligne_new);
					end
				end
			end,
			hasEditBox = 1,
			timeout = 60,
			hideOnEscape = 1
		};
		StaticPopup_Show("CMS_antispam_STATICPOPUPDIALOG_IGNORERLIGNE");

		--sligne_1 = strsub(sligne,2);
		--CMS_antispam[sligne_1] = idate;
	end

end

function CMS_testerligne(sligne)

local bbon = 1;
local sligne_espace;
local sligne_new;
--local sligne_1;
local ipos;
local imax = 300;
local i = 0;
local idate;

	if ( ( type(sligne) == "string" ) and sligne ) then
		sligne_espace = strlower(sligne);
		ipos = strfind(sligne_espace," ",1,true);
		while ( ipos and i < imax ) do
			i = i + 1;
			sligne_new = (strsub(sligne_espace,1,ipos-1) or "")..strsub(sligne_espace,ipos+1);
			sligne_espace = sligne_new;
			ipos = strfind(sligne_espace," ",ipos,true);
		end
		--sligne_1 = strsub(sligne,2);
		if ( CMS_antispam[sligne_espace] ) then
			idate = tonumber(date("%Y%m%d"));
			for sligne_new , _ in pairs(CMS_antispam) do
				-- modifier cette ligne pour gérer le changement d'année
				if ( ( idate - CMS_antispam[sligne_new] ) > 100 ) then	-- ( 100 car la date est mémorisée en nombre à base 10 et non pas en jour à base 28-29-30-31 , et 100 représente donc 1 mois en numérique ) sauf quand on change d'année, hélas
					CMS_antispam[sligne_new] = nil;
				end
			end
			if ( CMS_antispam[sligne_espace] ) then
				bbon = nil;
				CMS_antispam[sligne_espace] = idate;
--if ( DBCS_debug and DBCS_debug > 1 ) then
--DEFAULT_CHAT_FRAME:AddMessage("spam : "..sligne);
--end
			end
--DEFAULT_CHAT_FRAME:AddMessage("mauvaise ligne : "..sligne);
		end
		if ( bbon == 1 ) then
			idate = tonumber(date("%Y%m%d"));
			for sligne_new , _ in pairs(CMS_antispam_mot) do
				-- modifier cette ligne pour gérer le changement d'année
				if ( ( idate - CMS_antispam_mot[sligne_new] ) > 100 ) then	-- ( 100 car la date est mémorisée en nombre à base 10 et non pas en jour à base 28-29-30-31 , et 100 représente donc 1 mois en numérique ) sauf quand on change d'année, hélas
					CMS_antispam_mot[sligne_new] = nil;
				end
			end
			for sligne_new , _ in pairs(CMS_antispam_mot) do
				if ( bbon == 1 ) then
					ipos = nil;
					ipos = strfind(sligne_espace,sligne_new,1,true);
					if ( ipos ) then
--DEFAULT_CHAT_FRAME:AddMessage("ipos : "..ipos);
						bbon = nil;
						CMS_antispam_mot[sligne_new] = idate;
--if ( DBCS_debug and DBCS_debug > 1 ) then
--DEFAULT_CHAT_FRAME:AddMessage("spam mot : "..sligne_new.." dans : "..sligne);
--end
					end
				end
			end
		end
		--if ( bbon == 1 ) then
		--	if ( CMS_antispam[sligne_1] ) then
		--		idate = tonumber(date("%Y%m%d"));
		--		bbon = nil;
		--		CMS_antispam[sligne_1] = idate;
		--	end
		--end
	end
	return bbon;

end

function CMS_antispam_OnLoad(self)

	self:RegisterEvent("CHAT_MSG_CHANNEL");
	self:RegisterEvent("CHAT_MSG_GUILD");
	self:RegisterEvent("CHAT_MSG_OFFICER");
	self:RegisterEvent("CHAT_MSG_PARTY");
	self:RegisterEvent("CHAT_MSG_RAID");
	self:RegisterEvent("CHAT_MSG_RAID_LEADER");
	self:RegisterEvent("CHAT_MSG_SAY");
	self:RegisterEvent("CHAT_MSG_YELL");
	self:RegisterEvent("CHAT_MSG_WHISPER");

	CMS_antispam = {};
	CMS_antispam_mot = {};
--/script CMS_antispam_mot = {}

end

function CMS_antispam_OnEvent(self,event,...)

local arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11 = ...;

local bbon;

	bbon = 1;
	--CMS_NOMCANAL
	if ( event == "" ) then
	elseif ( event == "CHAT_MSG_CHANNEL" ) then
		if ( arg9 ) then
			if ( CMS_NOMCANAL and strlower(arg9) == CMS_NOMCANAL ) then
				bbon = nil;
			end
		end
	end

	if ( bbon and arg11 and arg2 ) then
		CMS_antispam_tablo[arg11] = {};
		CMS_antispam_tablo[arg11].time = GetTime();
		CMS_antispam_tablo[arg11].ligne = arg1;
--DEFAULT_CHAT_FRAME:AddMessage("j'ajoute ligne : "..arg11);
		CMS_antispam_nettoyer_tablo();
	end

end

function CMS_antispam_ajoutligne(inumligne,sligne)

	CMS_antispam_tablo[inumligne] = {};
	CMS_antispam_tablo[inumligne].time = GetTime();
	CMS_antispam_tablo[inumligne].ligne = sligne;
--DEFAULT_CHAT_FRAME:AddMessage("j'ajoute ligne : "..inumligne);
	CMS_antispam_nettoyer_tablo();

end

function CMS_antispam_nettoyer_tablo()

local inumligne;
local itime;

	itime = GetTime();
	for inumligne , _ in pairs(CMS_antispam_tablo) do
		if ( ( itime - CMS_antispam_tablo[inumligne].time ) > 1800 ) then
			CMS_antispam_tablo[inumligne] = nil;
		end
	end

end
