vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
assert( oRA, "oRA not found!")

------------------------------
--      Are you local?      --
------------------------------

local L = AceLibrary("AceLocale-2.2"):new("oRAOPlayerTarget")
local roster = AceLibrary("RosterLib-2.0")
local paintchips = AceLibrary("PaintChips-2.0")
local tablet = AceLibrary("Tablet-2.0")

----------------------------
--      Localization      --
----------------------------

L:RegisterTranslations("enUS", function() return {
        ["playertargetoptional"] = true,
        ["pt"] = true,
        ["Player"] = true,
        ["PlayerTarget"] = true,
        ["Optional/PlayerTarget"] = true,
        ["Options for the playertargets."] = true,
        ["Targettarget"] = true,
        ["Toggle TargetTarget frames."] = true,
        ["Scale"] = true,
        ["Set frame scale."] = true,
        ["Alpha"] = true,
        ["Set frame alpha."] = true,
        ["Raidicon"] = true,
        ["Toggle raid icons."] = true,
        ["Frames"] = true,
        ["Options for the playertarget frames."] = true,
        ["Growup"] = true,
        ["Toggle growup."] = true,
        ["Inverse"] = true,
        ["Toggle inverse healthbar."] = true,
        ["Deficit"] = true,
        ["Toggle deficit health."] = true,
        ["Clickcast"] = true,
        ["Toggle clickcast support."] = true,
        ["Clicktarget"] = true,
        ["Define clicktargets."] = true,
        ["Define the clicktarget for player."] = true,
        ["Define the clicktarget for target."] = true,
        ["Define the clicktarget for targettarget."] = true,
        ["Target"] = true,
        ["TargetTarget"] = true,
        ["Nr of Players shown."] = true,
        ["Nr Players"] = true,
        ["Nr"] = true,
        ["Classcolor"] = true,
        ["Color healthbars by class."] = true,
        ["Enemycolor"] = true,
        ["Set the color for enemies. (used when classcolor is enabled)"] = true,
        ["Coloraggro"] = true,
        ["Color Aggro"] = true,
        ["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."] = true,
        ["Backdrop"] = true,
        ["Toggle the backdrop."] = true,
        ["Highlight"] = true,
        ["Toggle highlighting your target."] = true,
        ["Reverse"] = true,
        ["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."] = true,
        ["Numbers"] = true,
        ["Toggle showing of PT numbers."] = true,
        ["Tooltips"] = true,
        ["Toggle showing of tooltips."] = true,
        ["Show"] = true,
        ["Show player."] = true,
        ["Show target."] = true,
        ["Show targettarget."] = true,
        ["Define which frames you want to see."] = true,
        ["Layout"] = true,
        ["Set the layout for the PT frames."] = true,
        ["Vertical"] = true,
        ["Horizontal"] = true,
        
        ["set"] = true,
        ["Set Player"] = true,
        ["Set a player."]= true,
        ["<nr> <name>"] = true,
        ["<nr>"] = true,
        ["<name>"] = true,
        ["Remove Player"] = true,
        ["remove"] = true,
        ["Remove a player."] = true,
        ["Removed player: "] = true,
        ["Set player: "] = true,
        
        ["(%S+)%s*(.*)"] = true,

        ["<Not Assigned>"] = true,

} end )


L:RegisterTranslations("koKR", function() return {
        ["Player"] = "플레이어탱커",
        ["PlayerTarget"] = "플레이어탱커대상",
        ["Optional/PlayerTarget"] = "부가/플레이어탱커",
        ["Options for the playertargets."] = "플레이어 탱커에 대한 설정을 변경합니다.",
        ["Targettarget"] = "대상의대상",
        ["Toggle TargetTarget frames."] = "대상의 대상창을 토글합니다.",
        ["Scale"] = "크기",
        ["Set frame scale."] = "창의 크기를 설정합니다.",
        ["Alpha"] = "투명도",
        ["Set frame alpha."] = "창의 투명도를 설정합니다.",
        ["Raidicon"] = "공격대아이콘",
        ["Toggle raid icons."] = "공격대 아이콘 표시를 토글합니다.",
        ["Frames"] = "창",
        ["Options for the playertarget frames."] = "플레이어탱커 창에 관한 설정을 변경합니다.",
        ["Growup"] = "방향",
        ["Toggle growup."] = "창의 진행 방향을 토글합니다.",
        ["Inverse"] = "반전",
        ["Toggle inverse healthbar."] = "생명력바 반전기능을 토글합니다.",
        ["Deficit"] = "결손치",
        ["Toggle deficit health."] = "생명력바 결손치 표시기능을 토글합니다.",
        ["Clickcast"] = "시전",
        ["Toggle clickcast support."] = "클릭캐스트 기능 지원을 토글합니다.",
        ["Clicktarget"] = "클릭시대상선정",
        ["Define clicktargets."] = "클릭시 선택 대상을 정의합니다.",
        ["Define the clicktarget for player."] = "플레이어탱커를 클릭시 선택 대상을 정의힙니다.",
        ["Define the clicktarget for target."] = "대상 클릭시 선택 대상을 정의합니다.",
        ["Define the clicktarget for targettarget."] = "대상의 대상을 클릭시 선택 대상을 정의합니다.",
        ["Target"] = "대상",
        ["TargetTarget"] = "대상의대상",
        ["Nr of Players shown."] = "플레이어탱커의 번호를 표시힙니다.",
        ["Nr Players"] = "플레이어탱커의 수",
        ["Nr"] = "수",
        ["Classcolor"] = "직업별색상",
        ["Color healthbars by class."] = "직업별로 생명력바의 색상을 변경합니다.",
        ["Enemycolor"] = "적색상",
        ["Set the color for enemies. (used when classcolor is enabled)"] = "적의 경우의 색상을 설정합니다. (직업별색상 기능을 사용할 때)",
        ["Color Aggro"] = "어그로 색상",
        ["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."] = "현재 상태에 따라서 플레이어 탱커를 위한 어그로 색상을 표시힙니다. 오렌지는 대상, 녹색은 탱커, 적색은 어그로 없읍니다.",
        ["Backdrop"] = "배경",
        ["Toggle the backdrop."] = "배경 토글",
        ["Highlight"] = "강조",
        ["Toggle highlighting your target."] = "대상 강조 기능 토글",
        ["Reverse"] = "반전",
        ["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."] = "플레이어탱커목록의 순서를 반대로표시합니다.",
        ["Numbers"] = "플레이어탱커번호",
        ["Toggle showing of PT numbers."] = "플레이어탱커의 번호의 표시를 토글합니다.",
        ["Tooltips"] = "툴팁",
        ["Toggle showing of tooltips."] = "툴팁의 표시를 토글합니다.",
        ["Show"] = "표시",
        ["Show player."] = "플레이어탱커 표시",
        ["Show target."] = "대상 표시",
        ["Show targettarget."] = "대상의 대상 표시",
        ["Define which frames you want to see."] = "표시하길 원하는 창을 정의합니다.",
        ["Layout"] = "레이아웃",
        ["Set the layout for the PT frames."] = "플레이어탱커창의 레이아웃을 설정합니다.",
        ["Vertical"] = "수직",
        ["Horizontal"] = "수평",
        
--      ["set"] = true,
        ["Set Player"] = "플레이어 선택",
        ["Set a player."]= "플레이어를 선택합니다",
        ["<nr> <name>"] = "<번호> <이름>",
        ["<nr>"] = "<번호>",
        ["<name>"] = "<이름>",
        ["Remove Player"] = "플레이어 삭제",
        ["remove"] = "삭제",
        ["Remove a player."] = "플레이어를 목록에서 삭제합니다.",
        ["Removed player: "] = "삭제된 플레이어: ",
        ["Set player: "] = "설정된 플레이어: ",
        
        ["(%S+)%s*(.*)"] = "(%S+)%s*(.*)",

        ["<Not Assigned>"] = "<미정의됨>",

} end )

L:RegisterTranslations("zhCN", function() return {
        ["playertargetoptional"] = "playertargetoptional",
        ["pt"] = "玩家目标",
        ["Player"] = "玩家",
        ["PlayerTarget"] = "玩家目标",
        ["Optional/PlayerTarget"] = "Optional/PlayerTarget",
        ["Options for the playertargets."] = "玩家目标选项",
        ["Targettarget"] = "目标的目标",
        ["Toggle TargetTarget frames."] = "显示目标的目标框体",
        ["Scale"] = "大小",
        ["Set frame scale."] = "设定框体大小",
        ["Alpha"] = "透明度",
        ["Set frame alpha."] = "设置框体透明度",
        ["Raidicon"] = "raid图标",
        ["Toggle raid icons."] = "显示raid图标",
        ["Frames"] = "框体",
        ["Options for the playertarget frames."] = "玩家目标框体选项",
        ["Growup"] = "往上增添",
        ["Toggle growup."] = "选择往上增添",
        ["Inverse"] = "翻转",
        ["Toggle inverse healthbar."] = "选择翻转血条",
        ["Deficit"] = "亏损血量",
        ["Toggle deficit health."] = "显示亏损血量",
        ["Clickcast"] = "点击施法",
        ["Toggle clickcast support."] = "选择点击施法支持",
        ["Clicktarget"] = "点击设定目标",
        ["Define clicktargets."] = "定义点击设定目标",
        ["Define the clicktarget for player."] = "定义点击PT设定的目标",
        ["Define the clicktarget for target."] = "定义点击PTT设定的目标",
        ["Define the clicktarget for targettarget."] = "定义点击PTTT设定的目标",
        ["Target"] = "目标",
        ["TargetTarget"] = "目标的目标",
        ["Nr of Players shown."] = "显示的PT数量",
        ["Nr Players"] = "PT数量",
        ["Nr"] = "数量",
        ["Classcolor"] = "职业颜色",
        ["Color healthbars by class."] = "把血条着色为职业颜色",
        ["Enemycolor"] = "敌人颜色",
        ["Set the color for enemies. (used when classcolor is enabled)"] = "为敌人设置颜色(需要激活职业颜色)",
        ["Coloraggro"] = "仇恨颜色",
        ["Color Aggro"] = "仇恨颜色",
        ["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."] = "PT的名字边框用颜色来显示仇恨的状态。橘红是有目标,绿色是正在坦克,红色是没有仇恨",
        ["Backdrop"] = "背景",
        ["Toggle the backdrop."] = "显示背景",
        ["Highlight"] = "高亮",
        ["Toggle highlighting your target."] = "高亮显示你的目标",
        ["Reverse"] = "逆转",
        ["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."] = "逆转顺序:MT|MTT|MTTT 或 MTTT|MTT|MT",
        ["Numbers"] = "数量",
        ["Toggle showing of PT numbers."] = "显示PT的数量",
        ["Tooltips"] = "提示",
        ["Toggle showing of tooltips."] = "顯示提示",
        ["Show"] = "显示",
        ["Show player."] = "显示PT",
        ["Show target."] = "显示目标",
        ["Show targettarget."] = "显示目标的目标",
        ["Define which frames you want to see."] = "定义想要看到的框架",
        ["Layout"] = "布局",
        ["Set the layout for the PT frames."] = "设置PT框架的布局",
        ["Vertical"] = "垂直",
        ["Horizontal"] = "水平",
        
        ["set"] = "设置",
        ["Set Player"] = "设定PT",
        ["Set a player."]= "设定PT",
        ["<nr> <name>"] = "<数量> <名字>",
        ["<nr>"] = "<数量>",
        ["<name>"] = "<姓名>",
        ["Remove Player"] = "移除PT",
        ["remove"] = "移除",
        ["Remove a player."] = "移除PT",
        ["Removed player: "] = "移除PT:",
        ["Set player: "] = "设置PT:",
        
        ["(%S+)%s*(.*)"] = "(%d+)%s*(.*)",

        ["<Not Assigned>"] = "<还未设定>",
} end )

L:RegisterTranslations("zhTW", function() return {
        ["playertargetoptional"] = "玩家自訂目標",
        ["pt"] = "玩家目標",
        ["Player"] = "玩家",
        ["PlayerTarget"] = "玩家目標",
        ["Optional/PlayerTarget"] = "可選/玩家目標",
        ["Options for the playertargets."] = "玩家目標選項",
        ["Targettarget"] = "目標的目標",
        ["Toggle TargetTarget frames."] = "顯示目標的目標框架",
        ["Scale"] = "大小",
        ["Set frame scale."] = "設定框架大小",
        ["Alpha"] = "透明度",
        ["Set frame alpha."] = "設定框架的透明度",
        ["Raidicon"] = "團隊圖示",
        ["Toggle raid icons."] = "切換團隊圖示",
        ["Frames"] = "框架",
        ["Options for the playertarget frames."] = "玩家目標的框架選項",
        ["Growup"] = "往上排列",
        ["Toggle growup."] = "切換往上排列",
        ["Inverse"] = "倒轉",
        ["Toggle inverse healthbar."] = "切換倒轉血條",
        ["Deficit"] = "減少血量",
        ["Toggle deficit health."] = "顯示減少血量",
        ["Clickcast"] = "點擊施法",
        ["Toggle clickcast support."] = "切換點擊施法支援",
        ["Clicktarget"] = "點擊設定目標",
        ["Define clicktargets."] = "定義點擊設定目標",
        ["Define the clicktarget for player."] = "定義點擊PT設定的目標",
        ["Define the clicktarget for target."] = "定義點擊PTT設定的目標",
        ["Define the clicktarget for targettarget."] = "定義點擊PTTT設定的目標",
        ["Target"] = "目標",
        ["TargetTarget"] = "目標的目標",
        ["Nr of Players shown."] = "顯示的玩家數量",
        ["Nr Players"] = "玩家數量",
        ["Nr"] = "數量",
        ["Classcolor"] = "職業顏色",
        ["Color healthbars by class."] = "依職業設定血條顏色",
        ["Enemycolor"] = "敵人顏色",
        ["Set the color for enemies. (used when classcolor is enabled)"] = "為敵人設定顏色(需要使用職業顏色)",
        ["Coloraggro"] = "仇恨顏色",
        ["Color Aggro"] = "仇恨顏色",
        ["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."] = "玩家目標的名字邊框用顏色來顯示仇恨的狀態。橘紅是有目標,綠色是正在坦怪,紅色是沒有仇恨。",
        ["Backdrop"] = "背景",
        ["Toggle the backdrop."] = "顯示背景",
        ["Highlight"] = "高亮度",
        ["Toggle highlighting your target."] = "高亮度顯示你的目標",
        ["Reverse"] = "反轉",
        ["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."] = "反轉順序:PT|PTT|PTTT 或 PTTT|PTT|PT",
        ["Numbers"] = "數量",
        ["Toggle showing of PT numbers."] = "顯示玩家目標的數量",
        ["Tooltips"] = "提示",
        ["Toggle showing of tooltips."] = "顯示提示",
        ["Show"] = "顯示",
        ["Show player."] = "顯示玩家",
        ["Show target."] = "顯示目標",
        ["Show targettarget."] = "顯示目標的目標",
        ["Define which frames you want to see."] = "定義想要看到的框架",
        ["Layout"] = "佈置",
        ["Set the layout for the PT frames."] = "設定玩家目標框架的佈置",
        ["Vertical"] = "垂直",
        ["Horizontal"] = "水平",
        
        ["set"] = "設置",
        ["Set Player"] = "設置玩家",
        ["Set a player."]= "設置一位玩家",
        ["<nr> <name>"] = "<數量> <姓名>",
        ["<nr>"] = "<數量>",
        ["<name>"] = "<姓名>",
        ["Remove Player"] = "移除玩家",
        ["remove"] = "移除",
        ["Remove a player."] = "移除一位玩家",
        ["Removed player: "] = "移除玩家:",
        ["Set player: "] = "設置玩家:",
        
        ["(%S+)%s*(.*)"] = "(%S+)%s*(.*)",

        ["<Not Assigned>"] = "<尚未設置>",

} end )

L:RegisterTranslations("frFR", function() return {
        --["playertargetoptional"] = true,
        --["pt"] = true,
        ["Player"] = "Joueur",
        ["PlayerTarget"] = "Cibles Joueurs (PT)",
        ["Optional/PlayerTarget"] = "Optionnel/Cibles Joueurs",
        ["Options for the playertargets."] = "Optons concernant les cibles des joueurs.",
        --["Targettarget"] = true,
        ["Toggle TargetTarget frames."] = "Affiche ou non les cadres de la cible de la cible.",
        ["Scale"] = "Taille",
        ["Set frame scale."] = "D\195\169termine la taille des cadres.",
        ["Alpha"] = "Transparence",
        ["Set frame alpha."] = "D\195\169termine la transparence des cadres.",
        ["Raidicon"] = "Ic\195\180nedeRaid",
        ["Toggle raid icons."] = "Affiche ou non les ic\195\180nes de raid.",
        ["Frames"] = "Cadres",
        ["Options for the playertarget frames."] = "Options concernant les cadres des cibles des joueurs.",
        ["Growup"] = "VersleHaut",
        ["Toggle growup."] = "Ajoute ou non les PTs vers le haut.",
        ["Inverse"] = "Inverser",
        ["Toggle inverse healthbar."] = "Inverse ou non le sens de remplissage des barres de vie.",
        ["Deficit"] = "D\195\169ficit",
        ["Toggle deficit health."] = "Affiche ou non le d\195\169ficit en vie.",
        --["Clickcast"] = true,
        ["Toggle clickcast support."] = "Active ou non le support des addons de \"clickcasting\".",
        --["Clicktarget"] = true,
        ["Define clicktargets."] = "D\195\169termine la cible des clics.",
        ["Define the clicktarget for player."] = "D\195\169termine la cible lors du clic sur le cadre du joueur.",
        ["Define the clicktarget for target."] = "D\195\169termine la cible lors du clic sur le cadre de la cible.",
        ["Define the clicktarget for targettarget."] = "D\195\169termine la cible lors du clic sur le cadre de la cible de la cible.",
        ["Target"] = "Cible",
        ["TargetTarget"] = "CibledelaCible",
        ["Nr of Players shown."] = "Nombre de joueurs \195\160 afficher.",
        ["Nr Players"] = "Nbre de joueurs",
        ["Nr"] = "N\194\176",
        ["Classcolor"] = "CouleurdeClasse",
        ["Color healthbars by class."] = "Colore les barres de vie selon la classe.",
        ["Enemycolor"] = "CouleurEnnemi",
        ["Set the color for enemies. (used when classcolor is enabled)"] = "D\195\169termine la couleur pour les ennemis. (utilis\195\169 si CouleurdeClasse est activ\195\169)",
        --["Coloraggro"] = true,
        ["Color Aggro"] = "Couleur d'aggro",
        ["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."] = "Indique le statut de l'aggro des PTs selon la couleur de leurs noms. Orange s'ils ont la cible, Vert s'ils tankent, Rouge s'ils n'ont pas l'aggro.",
        ["Backdrop"] = "Fond",
        ["Toggle the backdrop."] = "Affiche ou non le fond.",
        ["Highlight"] = "Surbrillance",
        ["Toggle highlighting your target."] = "Met ou non en surbrillance votre cible.",
        ["Reverse"] = "Inverser",
        ["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."] = "Inverse ou non l'ordre d'affichage. (PT|PTT|PTTT ou PTTT|PTT|PT)",
        ["Numbers"] = "Num\195\169ros",
        ["Toggle showing of PT numbers."] = "Affiche ou non les num\195\169ros des PTs.",
        ["Tooltips"] = "Infobulles",
        ["Toggle showing of tooltips."] = "Affiche ou non les infobulles.",
        ["Show"] = "Afficher",
        ["Show player."] = "Affiche le joueur.",
        ["Show target."] = "Affiche la cible.",
        ["Show targettarget."] = "Affiche la cible de la cible.",
        ["Define which frames you want to see."] = "D\195\169termine les cadres que vous souhaitez voir.",
        ["Layout"] = "Style",
        ["Set the layout for the PT frames."] = "D\195\169termine le style des cadres des PTs.",
        --["Vertical"] = true,
        --["Horizontal"] = true,

        --["set"] = true,
        ["Set Player"] = "Ajouter un joueur",
        ["Set a player."]= "Ajoute un joueur.",
        ["<nr> <name>"] = "<n\194\176> <nom>",
        ["<nr>"] = "<n\194\176>",
        ["<name>"] = "<nom>",
        ["Remove Player"] = "Enlever un joueur",
        --["remove"] = true,
        ["Remove a player."] = "Enl\195\168ve un joueur",
        ["Removed player: "] = "Joueur enlev\195\169 : ",
        ["Set player: "] = "Joueur ajout\195\169 : ",

        --["(%S+)%s*(.*)"] = true,

        ["<Not Assigned>"] = "<Non assign\195\169>",
} end )

----------------------------------
--      Module Declaration      --
----------------------------------

oRAOPlayerTarget = oRA:NewModule(L["playertargetoptional"])
oRAOPlayerTarget.defaults = {
        raidicon = true,
        alpha = 1,
        scale = 1,
        growup = false,
        inverse = false,
        deficit = false,
        clickcast = true,
        ctplayer = L["Player"],
        cttarget = L["Target"],
        cttargettarget = L["TargetTarget"],
        nrpts = 10,
        classcolor = true,
        enemycolor = "cc2200",
        coloraggro = true,
        backdrop = true,
        highlight = true,
        reverse = false,
        numbers = true,
        tooltips = true,
        showpt = true,
        showptt = true,
        showpttt = true,
        layout = L["Vertical"],
        playertable = {},
}
oRAOPlayerTarget.optional = true
oRAOPlayerTarget.name = L["Optional/PlayerTarget"]
oRAOPlayerTarget.consoleCmd = L["pt"]
oRAOPlayerTarget.consoleOptions = {
        type = "group",
        desc = L["Options for the playertargets."],
        name = L["PlayerTarget"],
        args = {
                [L["Nr"]] = {
                        type = "range",
                        name = L["Nr Players"],
                        desc = L["Nr of Players shown."],
                        get = function() return oRAOPlayerTarget.db.profile.nrpts end,
                        set = function(v) oRAOPlayerTarget:SetNrPlayers(v) end,
                        min = 0, max = 10, step = 1,
                },
                [L["set"]] = {
                        name = L["Set Player"], type = "group",
                        desc = L["Set a player."],
                        -- disabled = function() return not oRAOPlayerTarget:IsValidRequest(UnitName("player"), true) end,
                        disabled = function() return not oRA:IsModuleActive(oRAOPlayerTarget) end,
                        args = {
                                ["1"] = {
                                        name = "1.", type = "text", desc = L["Set Player"].." 1",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[1] then return oRAOPlayerTarget.db.profile.playertable[1]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(1, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 1,
                                },
                                ["2"] = {
                                        name = "2.", type = "text", desc = L["Set Player"].." 2",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[2] then return oRAOPlayerTarget.db.profile.playertable[2]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(2, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 2,
                                },
                                ["3"] = {
                                        name = "3.", type = "text", desc = L["Set Player"].." 3",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[3] then return oRAOPlayerTarget.db.profile.playertable[3]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(3, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 3,
                                },
                                ["4"] = {
                                        name = "4.", type = "text", desc = L["Set Player"].." 4",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[4] then return oRAOPlayerTarget.db.profile.playertable[4]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(4, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 4,
                                },
                                ["5"] = {
                                        name = "5.", type = "text", desc = L["Set Player"].." 5",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[5] then return oRAOPlayerTarget.db.profile.playertable[5]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(5, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 5,
                                },
                                ["6"] = {
                                        name = "6.", type = "text", desc = L["Set Player"].." 6",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[6] then return oRAOPlayerTarget.db.profile.playertable[6]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(6, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 6,
                                },
                                ["7"] = {
                                        name = "7.", type = "text", desc = L["Set Player"].." 7",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[7] then return oRAOPlayerTarget.db.profile.playertable[7]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(7, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 7,
                                },
                                ["8"] = {
                                        name = "8.", type = "text", desc = L["Set Player"].." 8",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[8] then return oRAOPlayerTarget.db.profile.playertable[8]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(8, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 8,
                                },
                                ["9"] = {
                                        name = "9.", type = "text", desc = L["Set Player"].." 9",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[9] then return oRAOPlayerTarget.db.profile.playertable[9]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(9, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 9,
                                },
                                ["10"] = {
                                        name = "10.", type = "text", desc = L["Set Player"].." 10",
                                        get = function() 
                                                if oRAOPlayerTarget.db.profile.playertable[10] then return oRAOPlayerTarget.db.profile.playertable[10]
                                                else return "" end
                                        end,
                                        set = function(v) oRAOPlayerTarget:Set(10, v) end,
                                        validate = function(v) return string.find(v, "^(%S+)$") end,
                                        usage = L["<name>"],
                                        order = 10,
                                },
                        }
                },
                [L["remove"]] = {
                        name = L["Remove Player"], type = "group",
                        desc = L["Remove a player."],
                        -- disabled = function() return not oRAOPlayerTarget:IsValidRequest(UnitName("player"), true) end,
                        disabled = function() return not oRA:IsModuleActive(oRAOPlayerTarget) end,
                        args = {
                                ["1"] = {
                                        name = "1.", type = "execute", desc = L["Remove Player"].." 1",
                                        func = function() oRAOPlayerTarget:Remove("1") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[1] end,
                                        order = 1,
                                },                              
                                ["2"] = {
                                        name = "2.", type = "execute", desc = L["Remove Player"].." 2",
                                        func = function() oRAOPlayerTarget:Remove("2") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[2] end,
                                        order = 2,
                                },
                                ["3"] = {
                                        name = "3.", type = "execute", desc = L["Remove Player"].." 3",
                                        func = function() oRAOPlayerTarget:Remove("3") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[3] end,
                                        order = 3,
                                },
                                ["4"] = {
                                        name = "4.", type = "execute", desc = L["Remove Player"].." 4",
                                        func = function() oRAOPlayerTarget:Remove("4") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[4] end,
                                        order = 4,
                                },
                                ["5"] = {
                                        name = "5.", type = "execute", desc = L["Remove Player"].." 5",
                                        func = function() oRAOPlayerTarget:Remove("5") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[5] end,
                                        order = 5,
                                },
                                ["6"] = {
                                        name = "6.", type = "execute", desc = L["Remove Player"].." 6",
                                        func = function() oRAOPlayerTarget:Remove("6") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[6] end,
                                        order = 6,
                                },
                                ["7"] = {
                                        name = "7.", type = "execute", desc = L["Remove Player"].." 7",
                                        func = function() oRAOPlayerTarget:Remove("7") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[7] end,
                                        order = 7,
                                },
                                ["8"] = {
                                        name = "8.", type = "execute", desc = L["Remove Player"].." 8",
                                        func = function() oRAOPlayerTarget:Remove("8") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[8] end,
                                        order = 8,
                                },
                                ["9"] = {
                                        name = "9.", type = "execute", desc = L["Remove Player"].." 9",
                                        func = function() oRAOPlayerTarget:Remove("9") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[9] end,
                                        order = 9,
                                },
                                ["10"] = {
                                        name = "10.", type = "execute", desc = L["Remove Player"].." 10",
                                        func = function() oRAOPlayerTarget:Remove("10") end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.playertable[10] end,
                                        order = 10,
                                },
                        }
                },      
                [L["Frames"]] = {
                        type = "group",
                        desc = L["Options for the playertarget frames."],
                        name = L["Frames"],
                        args = {
                                [L["Classcolor"]] = {
                                        type = "toggle",
                                        name = L["Classcolor"],
                                        desc = L["Color healthbars by class."],
                                        get = function() return oRAOPlayerTarget.db.profile.classcolor end,
                                        set = function(v) oRAOPlayerTarget:SetClassColor(v) end,
                                },
                                [L["Enemycolor"]] = {
                                        type = "color",
                                        name = L["Enemycolor"],
                                        desc = L["Set the color for enemies. (used when classcolor is enabled)"],
                                        get = function()
                                                local _, r, g, b = paintchips:GetRGBPercent( oRAOPlayerTarget.db.profile.enemycolor )
                                                return r, g, b
                                        end,
                                        set = function(r, g, b)
                                                local hex = format("%02x%02x%02x", r*255, g*255, b*255)
                                                paintchips:RegisterHex( hex )
                                                oRAOPlayerTarget.db.profile.enemycolor = hex
                                        end,
                                        disabled = function() return not oRAOPlayerTarget.db.profile.classcolor end,                                    
                                },
                                [L["Coloraggro"]] = {
                                        type = "toggle",
                                        name = L["Color Aggro"],
                                        desc = L["Color aggro status for PTs on their names. Orange has target, Green is tanking, Red has no aggro."],
                                        get = function() return oRAOPlayerTarget.db.profile.coloraggro end,
                                        set = function(v) oRAOPlayerTarget.db.profile.coloraggro = v end,
                                },
                                [L["Backdrop"]] = {
                                        type = "toggle",
                                        name = L["Backdrop"],
                                        desc = L["Toggle the backdrop."],
                                        get = function() return oRAOPlayerTarget.db.profile.backdrop end,
                                        set = function(v) oRAOPlayerTarget.db.profile.backdrop = v end,
                                },
                                [L["Highlight"]] = {
                                        type = "toggle",
                                        name = L["Highlight"],
                                        desc = L["Toggle highlighting your target."],
                                        get = function() return oRAOPlayerTarget.db.profile.highlight end,
                                        set = function(v) oRAOPlayerTarget.db.profile.highlight = v end,
                                },
                
                                [L["Scale"]] = {
                                        type = "range",
                                        name = L["Scale"],
                                        desc = L["Set frame scale."],
                                        get = function() return oRAOPlayerTarget.db.profile.scale end,
                                        set = function(v) oRAOPlayerTarget:SetScale(v) end,
                                        min = 0.1,
                                        max = 2,
                                },                              

                                [L["Alpha"]] = {
                                        type = "range",
                                        name = L["Alpha"],
                                        desc = L["Set frame alpha."],
                                        get = function() return oRAOPlayerTarget.db.profile.alpha end,
                                        set = function(v) oRAOPlayerTarget:SetAlpha(v) end,
                                        min = 0.1,
                                        max = 1,
                                },
        
                                [L["Raidicon"]] = {
                                        type = "toggle",
                                        name = L["Raidicon"],
                                        desc = L["Toggle raid icons."],
                                        get = function() return oRAOPlayerTarget.db.profile.raidicon end,
                                        set = function(v) oRAOPlayerTarget:ToggleRaidIcon(v) end,
                                },

                                [L["Growup"]] = {
                                        type = "toggle",
                                        name = L["Growup"],
                                        desc = L["Toggle growup."],
                                        get = function() return oRAOPlayerTarget.db.profile.growup end,
                                        set = function(v) oRAOPlayerTarget:ToggleGrowup(v) end,
                                },

                                [L["Inverse"]] = {
                                        type = "toggle",
                                        name = L["Inverse"],
                                        desc = L["Toggle inverse healthbar."],
                                        get = function() return oRAOPlayerTarget.db.profile.inverse end,
                                        set = function(v) oRAOPlayerTarget:ToggleInverse(v) end,
                                },
                                [L["Reverse"]] = {
                                        type = "toggle",
                                        name = L["Reverse"],
                                        desc = L["Toggle reverse order PT|PTT|PTTT or PTTT|PTT|PT."],
                                        get = function() return oRAOPlayerTarget.db.profile.reverse end,
                                        set = function(v) oRAOPlayerTarget:ToggleReverse(v) end,
                                },
                                [L["Numbers"]] = {
                                        type = "toggle",
                                        name = L["Numbers"],
                                        desc = L["Toggle showing of PT numbers."],
                                        get = function() return oRAOPlayerTarget.db.profile.numbers end,
                                        set = function(v) oRAOPlayerTarget:ToggleNumbers(v) end,
                                },
                                [L["Tooltips"]] = {
                                        type = "toggle",
                                        name = L["Tooltips"],
                                        desc = L["Toggle showing of tooltips."],
                                        get = function() return oRAOPlayerTarget.db.profile.tooltips end,
                                        set = function(v) oRAOPlayerTarget.db.profile.tooltips = v end,
                                },                              
                                [L["Deficit"]] = {
                                        type = "toggle",
                                        name = L["Deficit"],
                                        desc = L["Toggle deficit health."],
                                        get = function() return oRAOPlayerTarget.db.profile.deficit end,
                                        set = function(v) oRAOPlayerTarget:ToggleDeficit(v) end,
                                },
                                
                                [L["Clickcast"]] = {
                                        type = "toggle",
                                        name = L["Clickcast"],
                                        desc = L["Toggle clickcast support."],
                                        get = function() return oRAOPlayerTarget.db.profile.clickcast end,
                                        set = function(v) oRAOPlayerTarget.db.profile.clickcast = v end,
                                },
                                [L["Layout"]] = {
                                        type = "text",
                                        name = L["Layout"],
                                        desc = L["Set the layout for the PT frames."],
                                        get = function() return oRAOPlayerTarget.db.profile.layout end,
                                        set = function(v) oRAOPlayerTarget:SetLayout(v) end,
                                        validate = {L["Vertical"], L["Horizontal"]}
                                },
                                [L["Clicktarget"]] = {
                                        type = "group", name = L["Clicktarget"], desc = L["Define clicktargets."],
                                        args = {
                                                [L["Player"]] = {
                                                        name = L["Player"], type = "text", desc = L["Define the clicktarget for player."],
                                                        get = function() return oRAOPlayerTarget.db.profile.ctplayer end,
                                                        set = function(v) oRAOPlayerTarget.db.profile.ctplayer = v end,
                                                        validate = { L["Player"], L["Target"], L["TargetTarget"] }
                                                },
                                                [L["Target"]] = {
                                                        name = L["Target"], type = "text", desc = L["Define the clicktarget for target."],
                                                        get = function() return oRAOPlayerTarget.db.profile.cttarget end,
                                                        set = function(v) oRAOPlayerTarget.db.profile.cttarget = v end,
                                                        validate = { L["Player"], L["Target"], L["TargetTarget"] }
                                                },
                                                [L["TargetTarget"]] = {
                                                        name = L["TargetTarget"], type = "text", desc = L["Define the clicktarget for targettarget."],
                                                        get = function() return oRAOPlayerTarget.db.profile.cttargettarget end,
                                                        set = function(v) oRAOPlayerTarget.db.profile.cttargettarget = v end,
                                                        validate = { L["Player"], L["Target"], L["TargetTarget"] }
                                                },
                                        },
                                },
                                [L["Show"]] = {
                                        type = "group", name = L["Show"], desc = L["Define which frames you want to see."],
                                        args = {
                                                [L["Player"]] = {
                                                        name = L["Player"], type = "toggle", desc = L["Show player."],
                                                        get = function() return oRAOPlayerTarget.db.profile.showpt end,
                                                        set = function(v)
                                                                oRAOPlayerTarget.db.profile.showpt = v
                                                                oRAOPlayerTarget:UpdateFrameShow()
                                                        end,
                                                },
                                                [L["Target"]] = {
                                                        name = L["Target"], type = "toggle", desc = L["Show target."],
                                                        get = function() return oRAOPlayerTarget.db.profile.showptt end,
                                                        set = function(v)
                                                                oRAOPlayerTarget.db.profile.showptt = v
                                                                oRAOPlayerTarget:UpdateFrameShow()
                                                        end,
                                                },
                                                [L["TargetTarget"]] = {
                                                        name = L["TargetTarget"], type = "toggle", desc = L["Show targettarget."],
                                                        get = function() return oRAOPlayerTarget.db.profile.showpttt end,
                                                        set = function(v)
                                                                oRAOPlayerTarget.db.profile.showpttt = v
                                                                oRAOPlayerTarget:UpdateFrameShow()
                                                        end,
                                                },
                                        },
                                },

                        },
                },      
        }       
}


------------------------------
--      Initialization      --
------------------------------

function oRAOPlayerTarget:OnEnable()
        self.ptf = {}
        self.pttf = {}
        self.ptttf = {}
        self.enabled = nil
        
        if not self.db.profile.playertable then self.db.profile.playertable = {} end

        paintchips:RegisterHex(self.db.profile.enemycolor or "cc2200" )

        self:SetupFrames()

        self:RegisterEvent("oRA_LeftRaid")
        self:RegisterEvent("oRA_JoinedRaid")
        self:RegisterEvent("RosterLib_RosterChanged", function() self:oRA_PlayerTargetUpdate() end)

        self:RegisterEvent("oRA_BarTexture")

        -- Check for Watchdog
        if (WatchDog_OnClick) then
                oRA_PlayerTargetFramesCustomClick = WatchDog_OnClick
        end
end


function oRAOPlayerTarget:OnDisable()
        self:UnregisterAllEvents()
end



------------------------------
--      Event Handlers      --
------------------------------

function oRAOPlayerTarget:oRA_LeftRaid()
        self.enabled = nil
        self.mainframe:Hide()
end

function oRAOPlayerTarget:oRA_JoinedRaid()
        if not self.enabled then
                self.enabled = true
                self:oRA_PlayerTargetUpdate()
        end
end


function oRAOPlayerTarget:oRA_PlayerTargetUpdate()
        
        if not self.db.profile.playertable then return end
        if not self.enabled then return end
        
        self:UpdateConsole()
        
        local showpt, unitid

        for i = 1, self.db.profile.nrpts do
                unitid = roster:GetUnitIDFromName(self.db.profile.playertable[i])

                if unitid then
                        if self.db.profile.showpt then
                                if not self.ptf[i] then self.ptf[i] = self:CreateUnitFrame( self.mainframe, i, "pt" ) end
                                self.ptf[i].unit = unitid
                        end
                        if self.db.profile.showptt then
                                if not self.pttf[i] then self.pttf[i] = self:CreateUnitFrame( self.mainframe, i, "ptt" ) end
                                self.pttf[i].unit = unitid
                        end

                        if self.db.profile.showpttt then
                                if not self.ptttf[i] then self.ptttf[i] = self:CreateUnitFrame( self.mainframe, i, "pttt" ) end
                                self.ptttf[i].unit = unitid
                        end

                        showpt = true

                else -- unit nolonger in the raid or unknown
                        if self.ptf[i] then self.ptf[i].unit = nil end
                        if self.pttf[i] then self.pttf[i].unit = nil end
                        if self.ptttf[i] then self.ptttf[i].unit = nil end
                end
        end


        if showpt then
                self.mainframe:Show()
        else
                self.mainframe:Hide()
        end
end

function oRAOPlayerTarget:oRA_BarTexture( texture )
        for _, f in pairs({ self.ptf, self.pttf, self.ptttf }) do
                for _, f in pairs(f) do
                        f.bar:SetStatusBarTexture(self.core.bartextures[texture])
                        f.bar.texture:SetTexture(self.core.bartextures[texture])
                end
        end
end

------------------------------
-- ConsoleOption Functions  --
------------------------------

function oRAOPlayerTarget:SetScale(scale)
        self.db.profile.scale = scale

        if self.mainframe then
                self.mainframe:SetScale(scale)
        end
        self:RestorePosition()
end


function oRAOPlayerTarget:SetAlpha(alpha)
        self.db.profile.alpha = alpha

        if self.mainframe then
                self.mainframe:SetAlpha(alpha)
        end
end

function oRAOPlayerTarget:SetClassColor(state)
        self.db.profile.classcolor = state
        if self.ptf then
                for _, f in pairs(self.ptf) do
                        self:UpdateHealthBar(f.bar, self:GetUnit(f))
                end
        end
        if self.pttf then
                for _, f in pairs(self.pttf) do
                        self:UpdateHealthBar(f.bar, self:GetUnit(f))
                end
        end
        if self.ptttf then
                for _, f in pairs(self.ptttf) do
                        self:UpdateHealthBar(f.bar, self:GetUnit(f))
                end
        end
end


function oRAOPlayerTarget:UpdateFrameShow()
        for _, f in pairs({self.ptf, self.pttf, self.ptttf}) do
                if f then
                        for _, f in pairs(f) do
                                if f then
                                        self:SetStyle(f)
                                        if f.type == "pt" then
                                                if self.db.profile.showpt then f:Show() else f:Hide() end
                                        elseif f.type == "ptt" then
                                                if self.db.profile.showptt then f:Show() else f:Hide() end
                                        else 
                                                if self.db.profile.showpttt then f:Show() else f:Hide() end
                                        end
                                end
                        end
                end
        end
        self:ToggleNumbers(self.db.profile.numbers)
end


function oRAOPlayerTarget:ToggleRaidIcon(state)
        self.db.profile.raidicon = state

        if state then return end

        for _, f in pairs({ self.ptf, self.pttf, self.ptttf }) do
                if f then
                        for _, f in pairs(f) do
                                if f then f.raidicon:Hide() end
                        end
                end
        end
end

function oRAOPlayerTarget:ToggleNumbers(state)
        self.db.profile.numbers = state

        local ff = self.ptttf

        if self.db.profile.showptt then ff = self.pttf end
        if self.db.profile.showpt then ff = self.ptf end

        if not ff then return end

        for _, f in pairs(ff) do
                if state and f.number then
                        f.number:Show()
                elseif f.number then
                        f.number:Hide()
                end
        end
end

function oRAOPlayerTarget:SetLayout(state)
        self.db.profile.layout = state
        for _, f in pairs({self.ptf, self.pttf, self.ptttf}) do
                if f then
                        for _, f in pairs(f) do
                                if f then self:SetStyle(f) end
                        end
                end
        end     
end


function oRAOPlayerTarget:ToggleGrowup(state)
        self.db.profile.growup = state
        for _, f in pairs({self.ptf, self.pttf, self.ptttf}) do
                if f then
                        for _, f in pairs(f) do
                                if f then self:SetStyle(f) end
                        end
                end
        end     
end

function oRAOPlayerTarget:ToggleInverse(state)
        self.db.profile.inverse = state
end

function oRAOPlayerTarget:ToggleReverse(state)
        self.db.profile.reverse = state
        
        for _, f in pairs({self.ptf, self.pttf, self.ptttf}) do
                if f then
                        for _, f in pairs(f) do
                                if f then self:SetStyle(f) end
                        end
                end
        end     
end

function oRAOPlayerTarget:ToggleDeficit(state)
        self.db.profile.deficit = state

        for _, f in pairs({self.ptf, self.pttf, self.ptttf}) do
                if f then
                        for _, f in pairs(f) do
                                if f then self:UpdateHealthBar(f.bar, self:GetUnit(f)) end
                        end
                end
        end

end

function oRAOPlayerTarget:SetNrPlayers( nr )
        self.db.profile.nrpts = nr

        for i = ( nr + 1 ), 10 do
                if self.ptf and self.ptf[i] then self.ptf[i].unit = nil end
                if self.pttf and self.pttf[i] then self.pttf[i].unit = nil end
                if self.ptttf and self.ptttf[i] then self.ptttf[i].unit = nil end
        end

        -- Make sure to update the tablet in case it's detached.
        self:TriggerEvent("oRA_UpdateConfigGUI")
        self:oRA_PlayerTargetUpdate()
end

------------------------------
--     Utility Functions    --
------------------------------

function oRAOPlayerTarget:SavePosition()
        local f = self.mainframe
        if not f then return end

        local s = f:GetEffectiveScale()
                
        self.db.profile.posx = f:GetLeft() * s
        self.db.profile.posy = f:GetTop() * s   
end


function oRAOPlayerTarget:RestorePosition()
        local x = self.db.profile.posx
        local y = self.db.profile.posy

        if not x or not y then return end

        local f = self.mainframe
        if not f then return end
        local s = f:GetEffectiveScale()

        f:ClearAllPoints()
        f:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x / s, y / s)
end


function oRAOPlayerTarget:SetupFrames()
        local f = CreateFrame("Frame", nil, UIParent)
        f:Hide()
        f:SetMovable(true)
        f:SetScript("OnUpdate", function() self:OnUpdate() end)
        f:SetWidth(100)
        f:SetHeight(100)
        f:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
        f:SetAlpha(self.db.profile.alpha)
        f:SetScale(self.db.profile.scale)

        f.update = 0

        self.mainframe = f
        self:RestorePosition()
end


function oRAOPlayerTarget:CreateUnitFrame( parent, id, type )
        -- Main frame
        -- local f = CreateFrame("Button", "oRA_PlayerTargetFrames_" .. type .. id, parent)
        local f = CreateFrame("Button", nil, parent)
        f:Hide()
        f:EnableMouse(true)
        f:SetMovable(true)
        f:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up")
        f:RegisterForDrag("LeftButton")
        f:SetScript("OnEnter", function() self:OnEnter() end)
        f:SetScript("OnLeave", function() GameTooltip:Hide() end)
        f:SetScript("OnClick", function() self:OnClick() end)
        f:SetScript("OnDragStart", function() if IsAltKeyDown() then parent:StartMoving() end end)
        f:SetScript("OnDragStop", function() parent:StopMovingOrSizing() self:SavePosition() end)

        -- Tank Statusbar
        f.bar = CreateFrame("StatusBar", nil, f)
        f.bar:SetMinMaxValues(0,100)

        -- Tank Statusbar background texture, visible when the bar depleats
        f.bar.texture = f.bar:CreateTexture(nil, "BORDER")
        f.bar.texture:SetVertexColor(1, 0, 0, 0.5)

        -- Tank Statusbar text
        f.bar.text = f.bar:CreateFontString(nil, "OVERLAY")
        f.bar.text:SetFontObject(GameFontHighlightSmall)
        f.bar.text:SetJustifyH("RIGHT")

        -- Tank Number
        f.number = f.bar:CreateFontString(nil, "OVERLAY")
        f.number:SetFontObject(GameFontHighlightSmall)
        f.number:SetJustifyH("RIGHT")

        -- Tank Name
        f.name = f.bar:CreateFontString(nil, "OVERLAY")
        f.name:SetFontObject(GameFontHighlightSmall)
        f.name:SetJustifyH("LEFT")

        -- Raid Icons
        f.raidicon = f.bar:CreateTexture(nil, "OVERLAY")
        f.raidicon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
        f.raidicon:Hide()

        -- Set static stuff and style
        f.number:SetText(id..".")
        f.type = type
        f:SetID(id)

        self:SetStyle(f)

        return f
end

function oRAOPlayerTarget:GetPosition( f )
        local relframe, relx, rely
        
        if self.db.profile.layout == L["Horizontal"] then -- HORIZONTAL POSITIONING
                -- default positioning
                relframe = self.mainframe
                relx = 136 * (f:GetID() - 1)
                if self.db.profile.reverse then relx = relx * -1 end
                rely = 0
                
                if f.type == "ptt" and self.db.profile.showpt then
                        relframe = self.ptf[f:GetID()]
                        relx = 0
                        rely = -21
                        if self.db.profile.growup then rely = 21 end
                end
                
                -- same deal for pttt adjust if ptt or pt is shown
                if f.type == "pttt" then
                        if self.db.profile.showptt then
                                relframe = self.pttf[f:GetID()]
                                relx = 0
                                rely = -21
                                if self.db.profile.growup then rely = 21 end
                        elseif self.db.profile.showpt then
                                relframe = self.ptf[f:GetID()]
                                relx = 0
                                rely = -21
                                if self.db.profile.growup then rely = 21 end
                        end
                end
                                        
        else -- VERTICAL POSITIONING
                -- default positioning
                relframe = self.mainframe
                relx = 0
                if self.db.profile.growup then
                        rely = 21 * (f:GetID() - 1)
                else 
                        rely = -21 * (f:GetID() - 1)
                end     
                
          -- adjust positioning for ptt if pt is shown
                if f.type == "ptt" and self.db.profile.showpt then
                        relframe = self.ptf[f:GetID()]
                        relx = 120
                        if self.db.profile.reverse then relx = -120 end
                        rely = 0
                end
        
                -- same deal for pttt adjust if ptt or pt is shown
                if f.type == "pttt" then
                        if self.db.profile.showptt then
                                relframe = self.pttf[f:GetID()]
                                relx = 120
                                if self.db.profile.reverse then relx = -120 end
                                rely = 0
                        elseif self.db.profile.showpt then
                                relframe = self.ptf[f:GetID()]
                                relx = 120
                                if self.db.profile.reverse then relx = -120 end
                                rely = 0                        
                        end
                end     
        end
        return relframe, relx, rely
end


function oRAOPlayerTarget:SetStyle(f)
        local relframe, relx, rely = self:GetPosition(f)
        
        self:SetWHP(f, 120, 21, "TOPLEFT", relframe, "TOPLEFT", relx , rely)

        f:SetBackdrop({ bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})

        if self.db.profile.backdrop then
                f:SetBackdropColor(0, 0, 0, .5)
        else 
                f:SetBackdropColor(0, 0, 0, 0)
        end
        
        f.bar:SetStatusBarTexture(self.core.bartextures[self.core.db.profile.bartexture])
        f.bar.texture:SetTexture(self.core.bartextures[self.core.db.profile.bartexture])
        f.bar.texture:SetVertexColor(.5, .5, .5, .5)
        
        self:SetWHP(f.bar, 112, 16, "LEFT", f, "LEFT", 4, 0)
        self:SetWHP(f.bar.texture, 112, 16, "CENTER", f.bar, "CENTER", 0, 0)
        if self.db.profile.reverse then
                f.number:SetJustifyH("LEFT")
        else
                f.number:SetJustifyH("RIGHT")
        end
        
        self:SetWHP(f.number, 32, 14, self.db.profile.reverse and "LEFT" or "RIGHT", f, self.db.profile.reverse and "RIGHT" or "LEFT", 0, 0)

        if not self.db.profile.numbers then
                f.number:Hide()
        else
                if f.type == "pt" and self.db.profile.showpt then
                        f.number:Show()
                elseif f.type == "ptt" and not self.db.profile.showpt and self.db.profile.showptt then
                        f.number:Show()
                elseif f.type == "pttt" and not self.db.profile.showpt and not self.db.profile.showptt and self.db.profile.showpttt then
                        f.number:Show()
                else
                        f.number:Hide()
                end
        end

        self:SetWHP(f.raidicon, 14, 14, "LEFT", f.bar, "LEFT", 1, 0)            
        self:SetWHP(f.name, 62, 14, "LEFT", f.bar, "LEFT", 18, 0)
        self:SetWHP(f.bar.text, 32, 14, "RIGHT", f.bar, "RIGHT", 0, 0)

end


function oRAOPlayerTarget:SetWHP(f, width, height, p1, relative, p2, x, y)
        if not f then return end

        f:SetWidth(width)
        f:SetHeight(height)

        if p1 then
                f:ClearAllPoints()
                f:SetPoint(p1, relative, p2, x, y)
        end
end


function oRAOPlayerTarget:GetUnit(f, click)
        if not f or not f.type then return end

        if not click then
                if f.type == "pt" then return f.unit end
                if f.type == "ptt" then return f.unit .. "target" end
                if f.type == "pttt" then return f.unit .. "targettarget" end
        else
                local c
                if f.type == "pt" then c = self.db.profile.ctplayer end
                if f.type == "ptt" then c = self.db.profile.cttarget end
                if f.type == "pttt" then c = self.db.profile.cttargettarget end
                if c == L["Player"] then return f.unit end
                if c == L["Target"] then return f.unit .. "target" end
                if c == L["TargetTarget"] then return f.unit .. "targettarget" end
        end
end


function oRAOPlayerTarget:UpdateFrames(f)
        for _, f in pairs(f) do
                if f.unit then
                        local unit = self:GetUnit(f)

                        if UnitExists(unit) then
                                f.name:SetText(UnitName(unit))

                                self:UpdateHealthBar(f.bar, unit)

                                if self.db.profile.raidicon then
                                        self:UpdateRaidIcon(f, unit)
                                end

                                if f.type == "pt" and self.db.profile.coloraggro then
                                        if UnitExists( unit .. "target" ) then
                                                f.name:SetTextColor( 1, 0.5, 0.25, 1 )
                                                if UnitExists( unit .. "targettarget") then
                                                        if UnitIsUnit(unit, unit .. "targettarget") then
                                                                f.name:SetTextColor(0.5, 1, 0.5, 1)
                                                        else
                                                                f.name:SetTextColor(1, 0, 0, 1)
                                                        end
                                                end
                                        else
                                                f.name:SetTextColor( 1, 1, 1, 1)
                                        end
                                else 
                                        if UnitIsEnemy(unit, "player") then f.name:SetTextColor( 1, 0, 0, 1)
                                        else f.name:SetTextColor( 1, 1, 1, 1) end
                                end
                                
                                if UnitIsUnit( unit, "target") and self.db.profile.highlight then
                                        f:SetBackdropColor(1, .84, 0, 1 )
                                elseif self.db.profile.backdrop then
                                        f:SetBackdropColor(0, 0, 0, .5)
                                else
                                        f:SetBackdropColor(0, 0, 0, 0)
                                end
                                
                                f:Show()
                        else
                                f:Hide()
                        end

                else
                        f:Hide()
                end
        end
end


function oRAOPlayerTarget:UpdateHealthBar(bar, unit)
        if not unit then return end
        local cur, max = UnitHealth(unit) or 0, UnitHealthMax(unit) or 0
        local perc = cur / max

        bar:SetMinMaxValues(0, max)
        
        if self.db.profile.inverse then
                bar:SetValue(max - cur)
        else
                bar:SetValue(cur)
        end

        if self.db.profile.classcolor then
                if not UnitIsEnemy(unit, "player") then 
                        local _, class = UnitClass( unit )
                        local _, r,g,b = paintchips:GetRGBPercent( class )
                        bar:SetStatusBarColor(r,g,b)
                else
                        local _, r,g,b = paintchips:GetRGBPercent( self.db.profile.enemycolor )
                        bar:SetStatusBarColor(r,g,b)
                end
        else
                bar:SetStatusBarColor(self:GetHealthBarColor(perc))
        end
        
        if self.db.profile.deficit then
                local val = max - cur
                if val > 1000 then
                        val = ceil(val/100)/10 .. "k"
                elseif val == 0 then
                        val = ""
                end
                
                bar.text:SetText(val)
        else
                bar.text:SetText(ceil(perc * 100) .. "%")
        end

        bar:Show()
end


function oRAOPlayerTarget:GetHealthBarColor(perc)
        local r, g

        if perc > 0.5 then
                r = (1.0 - perc) * 2
                g = 1.0
        else
                r = 1.0
                g = perc * 2
        end

        return r, g, 0
end


function oRAOPlayerTarget:UpdateRaidIcon(f, unit)
        local icon = GetRaidTargetIndex(unit)

        if icon then
                SetRaidTargetIconTexture(f.raidicon, icon)
                f.raidicon:Show()
        else
                f.raidicon:Hide()
        end
end

-------------------------------
--    Key Binding Handlers   --
-------------------------------

function oRAOPlayerTarget:BindingAssist( nr )
        if self.ptf and self.ptf[nr] and self.ptf[nr].unit then
                local unit = self:GetUnit( self.ptf[nr] )
                if unit and UnitExists( unit .."target") then
                        AssistUnit(unit)
                end
        end
end

function oRAOPlayerTarget:BindingTarget( nr )
        if self.ptf and self.ptf[nr] and self.ptf[nr].unit then
                local unit = self:GetUnit( self.ptf[nr] )
                if unit then 
                        TargetUnit(unit)
                end
        end
end

-------------------------------
--   Frame Script Functions  --
-------------------------------

function oRAOPlayerTarget:OnUpdate()
        this.update = this.update + arg1

        if this.update >= 0.3 then
                if self.db.profile.showpt then self:UpdateFrames(self.ptf) end
                if self.db.profile.showptt then self:UpdateFrames(self.pttf) end
                if self.db.profile.showpttt then self:UpdateFrames(self.ptttf) end

                this.update = 0
        end
end


function oRAOPlayerTarget:OnEnter()
        if not self.db.profile.tooltips then return end
        local unit = self:GetUnit(this)

        GameTooltip_SetDefaultAnchor(GameTooltip, this)

        if unit and GameTooltip:SetUnit(unit) then
                this.updateTooltip = TOOLTIP_UPDATE_TIME
        else
                this.updateTooltip = nil
        end
end


function oRAOPlayerTarget:OnClick()
        local unit = self:GetUnit(this,true)
        if self.db.profile.clickcast and oRA_PlayerTargetFramesCustomClick then
                oRA_PlayerTargetFramesCustomClick(arg1, unit)
        elseif UnitExists(unit) then
                TargetUnit(unit)
        end
        -- this following piece of code is specifically for attack on assist.
--      if unit == this.unit .. "target" and UnitExists( this.unit ) then
--                      AssistUnit("player")
--      end

end
 
---------------------------
-- Setting and Removing  --
---------------------------


function oRAOPlayerTarget:Set( num, name )
        if not num then return end
        if not name or name == "" then name = UnitName("target") end
        
        -- lower the name and upper the first letter, not for chinese and korean though
        if GetLocale() ~= "zhTW" and GetLocale() ~= "zhCN" and GetLocale() ~= "koKR" then
                local _, len = string.find(name, "[%z\1-\127\194-\244][\128-\191]*")
                name = string.upper(string.sub(name, 1, len)) .. string.lower(string.sub(name, len + 1))
        end

        if not self:IsValidRequest(name, true) then return end

        for k,v in pairs( self.db.profile.playertable ) do
                if v == name then self.db.profile.playertable[k] = nil end
        end
        
        self.db.profile.playertable[num] = name
        self:UpdateConsole()
        self:oRA_PlayerTargetUpdate()
        
        self:Print(L["Set player: "] .. "[".. num .. "] [" .. name .."]")
end

function oRAOPlayerTarget:Remove( num )
        if not num then return end
        num = tonumber(num)
        local name = self.db.profile.playertable[num]
        if not name then return end
        self.db.profile.playertable[num] = nil
        self:UpdateConsole()
        self:oRA_PlayerTargetUpdate()
        self:Print(L["Removed player: "] .. num .." "..name )
end

function oRAOPlayerTarget:TooltipClick( num )
        if not num then return end
        num = tonumber(num)
        local name = UnitName("target")
        if self.db.profile.playertable[num] then
                if not name then self:Remove(num)
                else self:Set( num, name ) end  
        else
                if name then self:Set( num, name ) end
        end
end

function oRAOPlayerTarget:UpdateConsole()
        for k = 1, 10, 1 do
                                self.core.consoleOptions.args[L["pt"]].args[L["remove"]].args[tostring(k)].name = tostring(k).."."
                                self.core.consoleOptions.args[L["pt"]].args[L["set"]].args[tostring(k)].name = tostring(k).."."
        end
        for k,v in pairs(self.db.profile.playertable) do
                if self:IsValidRequest(v,true) then
                                self.core.consoleOptions.args[L["pt"]].args[L["remove"]].args[tostring(k)].name = tostring(k)..". "..v
                                self.core.consoleOptions.args[L["pt"]].args[L["set"]].args[tostring(k)].name = tostring(k)..". "..v
                end
        end
end

------------------------------
--      Tooltip Updating    --
------------------------------

function oRAOPlayerTarget:OnTooltipUpdate()
        local cat = tablet:AddCategory("columns", 2, "text", "#", "justify", "LEFT", "text2", L["PlayerTarget"], "justify2", "LEFT", "child_justify", "LEFT", "child_justify2", "LEFT" )
        local p 
        for k = 1, self.db.profile.nrpts, 1 do
                p = self.db.profile.playertable[k]
                if p then
                        if self:IsValidRequest( p, true ) then
                                local unit = self.core.roster:GetUnitIDFromName(p)
                                local _, class = UnitClass( unit )
                                cat:AddLine( "text", tostring(k)..". ", "text2", "|cff"..paintchips:GetHex(class) .. p.."|r", "func", self.TooltipClick, "arg1", self, "arg2", k)
                        else
                                cat:AddLine( "text", tostring(k)..". ", "text2", "|cffcccccc<"..p..">|r", "func", self.TooltipClick, "arg1", self, "arg2", k)
                        end
                else
                        cat:AddLine( "text", tostring(k)..". ", "text2", "|cffcccccc"..L["<Not Assigned>"].."|r", "func", self.TooltipClick, "arg1", self, "arg2", k)
                end
        end
end