---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2007  Prat Development Team
--
-- This program 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.
--
-- This program 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 this program; if not, write to:
--
-- Free Software Foundation, Inc., 
-- 51 Franklin Street, Fifth Floor, 
-- Boston, MA  02110-1301, USA.
--
--
-------------------------------------------------------------------------------



--[[
Name: PratCopyChat
Revision: $Revision: 44429 $
Author(s): Sylvanaar
Website: http://www.wowace.com/files/index.php?path=Prat/
Documentation: http://www.wowace.com/wiki/Prat/Integrated_Modules#CopyChat
SVN: http://svn.wowace.com/wowace/trunk/Prat/
Description: Module for Prat that allows you to copy text from the active chat window.
Dependencies: Prat
]]

-- Get Utility Libraries
local util, DBG, CLR = GetPratUtils()

local PRAT_MODULE = Prat:RequestModuleName("PratCopyChat")

if PRAT_MODULE == nil then 
    return 
end

local L = AceLibrary("AceLocale-2.2"):new(PRAT_MODULE)


L:RegisterTranslations("enUS", function() return {
	["CopyChat"] = true,
	["Copy text from the active chat window."] = true,
	["Copy Text"] = true,
	["Copy all of the text in the selected chat frame into an edit box"] = true,
	["showbutton_name"] = "Copy Button",
	["showbutton_desc"] = "Show a button on the chatframe",
	["showbutton_perframename"] = "%s Button",
	["showbutton_perframedesc"] = "Show a button on %s.",

} end)

L:RegisterTranslations("deDE", function() return {
	["CopyChat"] = "Chat Kopieren",
	["Copy text from the active chat window."] = "Ein Modul das dich Text aus dem Chat kopieren l\195\164\195\159t.",
	["Copy Text"] = "Kopieren",
	["Copy all of the text in the selected chat frame into an edit box"] = "Kopiert den gesammten Text im ausgew\195\164hlten Chatfenster in das Editierfeld.",
	["showbutton_name"] = "Kopieren Taste",
	["showbutton_desc"] = "Zeige einen Taste auf dem Chatfenster.",
	["showbutton_perframename"] = "Fenster %s  Taste",
	["showbutton_perframedesc"] = "Zeige eine Taste auf dem %s ",
} end)

L:RegisterTranslations("koKR", function() return {
	["CopyChat"] = "대화 복사",
	["Copy text from the active chat window."] = "활성화된 대화창의 대화를 복사합니다.",
	["Copy Text"] = "대화글 복사",
	["Copy all of the text in the selected chat frame into an edit box"] = "입력창에 선택된 대화창의 모든 대화글을 복사합니다.",
	["showbutton_name"] = "복사 버튼",
	["showbutton_desc"] = "대화창에 복사 버튼을 표시합니다.",
	["showbutton_perframename"] = "%s 버튼",
	["showbutton_perframedesc"] = "%s에 버튼을 표시합니다.",
} end)

L:RegisterTranslations("frFR", function() return {
	["CopyChat"] = "Copier un chat",
	["Copy text from the active chat window."] = "Copier le texte depuis la fenêtre de chat active.",
	["Copy Text"] = "Copier le texte",
	["Copy all of the text in the selected chat frame into an edit box"] = "Copie tout le texte de la fenêtre sélectionner dans une boite d'édition.",
	["showbutton_name"] = "Bouton Copier",
	["showbutton_desc"] = "Affiche un bouton sur la fenêtre de chat.",
	["showbutton_perframename"] = "Bouton de la fenêtre %s ",
	["showbutton_perframedesc"] = "Affiche un bouton sur la fenêtre %s .",

} end)

L:RegisterTranslations("esES", function() return {
	["CopyChat"] = "Copiar Chat",
	["Copy text from the active chat window."] = "Copia el texto de la ventana de chat activa",
	["Copy Text"] = "Copiar Texto",
	["Copy all of the text in the selected chat frame into an edit box"] = "Copia todo el texto de la ventana de chat seleccionada a una caja de edici\195\179n",
	["showbutton_name"] = "Bot\195\179n de Copiar",
	["showbutton_desc"] = "Muestra un bot\195\179n en la ventana de chat",
	["showbutton_perframename"] = "Bot\195\179n en ventana %s ",
	["showbutton_perframedesc"] = "Muestra un bot\195\179n en la ventana de %s ",

} end)

L:RegisterTranslations("zhTW", function() return {
	["CopyChat"] = "複製聊天訊息",
	["Copy text from the active chat window."] = "從作用中的對話視窗複製文字",
	["Copy Text"] = "複製文字",
	["Copy all of the text in the selected chat frame into an edit box"] = "複製選取的聊天視窗中所有的文字到輸入列中",
	["showbutton_name"] = "複製按鈕",
	["showbutton_desc"] = "在聊天視窗顯示按鈕",
	["showbutton_perframename"] = "視窗 %s  按鈕",
	["showbutton_perframedesc"] = "在聊天視窗 %s  顯示按鈕",
} end)
--Chinese Translation: 月色狼影@CWDG
--CWDG site: http://Cwowaddon.com
L:RegisterTranslations("zhCN", function() return {
	["CopyChat"] = "复制聊天信息",
	["Copy text from the active chat window."] = "从聊天窗复制文字",
	["Copy Text"] = "复制文字",
	["Copy all of the text in the selected chat frame into an edit box"] = "复制你在聊天窗口中所选取的文字到输入框中",
	["showbutton_name"] = "复制按钮",
	["showbutton_desc"] = "在聊天框体显示按钮",
	["showbutton_perframename"] = "%s 按钮",
	["showbutton_perframedesc"] = "在%s显示按钮.",

} end)

Prat_CopyChat = Prat:NewModule(PRAT_MODULE)

Prat_CopyChat.revision = tonumber(string.sub("$Revision: 44429 $", 12, -3))

-- Prat categories relevant to this module. list at: http://groups.google.com/group/wow-prat/web/prat-categories
local cat = Prat.Categories
Prat_CopyChat.Categories	= { cat.DEV, cat.INFO, cat.TEXT, cat.BUTTON, cat.FRAME }	-- eg { cat.TEXT, cat.INFO }

Prat_CopyChat.defaultDB = {
	on  = true,
	showbutton = {false, false, false, false, false, false, false},
}

Prat_CopyChat.moduleName = L["CopyChat"] 	
Prat_CopyChat.consoleName = string.lower(Prat_CopyChat.moduleName)

Prat_CopyChat.toggleOptions = {showbutton_handler = true}
Prat_CopyChat.moduleOptions = {}

function Prat_CopyChat:GetModuleOptions()
    self.moduleOptions = {
        name = L["CopyChat"],
        desc = L["Copy text from the active chat window."],
        type = "group",
        args = {
	        copy = {
	            name = L["Copy Text"],
	            desc = L["Copy all of the text in the selected chat frame into an edit box"],
	            type = "execute",
	            order = 190,
	            func = function() Prat_CopyChat:ScrapeChatFrame(SELECTED_CHAT_FRAME) HideDropDownMenu(1) end
	        },
        }
    }
   	return self.moduleOptions
end



function Prat_CopyChat:OnModuleEnable()
    self.buttons = {}
    for i = 1,NUM_CHAT_WINDOWS do
        table.insert(self.buttons, self:MakeReminder(i))
        self:showbutton(i, self.db.profile.showbutton[i])
    end
end

function Prat_CopyChat:OnModuleDisable()
    self:hidebuttons()
	PratCCFrame:Hide()
end

--[[------------------------------------------------
	Core Functions
------------------------------------------------]]--

Prat_CopyChat.lines = {}
Prat_CopyChat.str = nil

function Prat_CopyChat:ScrapeChatFrame(frame)
    local _, oldsize, _ = frame:GetFont()

    
    FCF_SetChatWindowFontSize(frame, 1)

    self:ScheduleEvent("Prat_DoCopyChat", self.DoCopyChat, 0.1, self, frame, oldsize)
end
     


function Prat_CopyChat:DoCopyChat(frame, oldsize)
	for i=1, #self.lines do
		self.lines[i] = nil
	end



	self:AddLines(self.lines, frame:GetRegions())

	self.str = table.concat(self.lines, "\n")

    FCF_SetChatWindowFontSize(frame, oldsize)

	PratCCText:SetText(frame:GetName().." Text", lines)
	PratCCFrameScrollText:SetText(self.str)
	PratCCFrame:Show()
end

function Prat_CopyChat:CopyChat()
	Prat_CopyChat:ScrapeChatFrame(SELECTED_CHAT_FRAME)
end

function Prat_CopyChat:AddLines(lines, ...)
  for i=select("#", ...),1,-1 do
    local x = select(i, ...)
	if x:GetObjectType() == "FontString" then
		table.insert(lines, x:GetText())
	end
  end
end

function Prat_CopyChat:OnTextChanged()
	if this:GetText() ~= self.str then
		this:SetText(self.str)
	end
	local s = PratCCFrameScrollScrollBar
	this:GetParent():UpdateScrollChildRect()
	local _, m = s:GetMinMaxValues()
	if m > 0 and this.max ~= m then
		this.max = m
		s:SetValue(m)
	end
end

function Prat_CopyChat:Hide()
	PratCCFrame:Hide()
    
end

function Prat_CopyChat:hidebuttons()
    for _,v in ipairs(self.buttons) do
        v:Hide()
    end
end

function Prat_CopyChat:showbutton(id, show)
    Prat_CopyChat:Debug(id, show)
    local b = Prat_CopyChat.buttons[id]
    if show then  b:Show() else b:Hide() end
end

function Prat_CopyChat:MakeReminder(id)
    local cf = getglobal("ChatFrame"..id)
    local name = "ChatFrame"..id.."PratCCReminder"
--     sylvanaar: this would try to create a button that buttons.lua is already creating
--     local b = CreateFrame("Button","ChatFrame"..id.."ScrollDownReminder",cf)
    local b = getglobal(name) 
    if b then return b end

    b = CreateFrame("Button", name ,cf)
    b:SetFrameStrata("BACKGROUND")
    b:SetWidth(24)
    b:SetHeight(24)
    b:SetNormalTexture("Interface\\Addons\\Prat\\textures\\prat-chatcopy2")
    b:SetPushedTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollEnd-Down")
    b:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight")
    b:SetPoint("TOPLEFT", cf, "TOPLEFT", 0, 0)
    b:SetScript("OnClick", function() PlaySound("igChatBottom"); Prat_CopyChat:ScrapeChatFrame(cf) end)
    b:SetScript("OnEnter", function() this:SetAlpha(0.9) end)
    b:SetScript("OnLeave", function() this:SetAlpha(0.2) end)
    b:SetAlpha(0.2)
    b:Hide()


    return b
end