diff Libs/DF/cooltip.lua @ 11:2f09fe4be15c

Added an Options Panel.
author Tercio
date Mon, 20 Apr 2015 16:34:18 -0300
parents
children dc1c77254f80
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/DF/cooltip.lua	Mon Apr 20 16:34:18 2015 -0300
@@ -0,0 +1,3008 @@
+
+local DF = _G ["DetailsFramework"]
+local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
+
+local _
+--lua locals
+local _math_floor= math.floor
+local _type = type
+local _math_abs = math.abs
+local _tinsert = tinsert
+local _unpack = unpack
+local _ipairs = ipairs
+local _table_wipe = table.wipe
+local _table_insert = table.insert
+local _math_max = math.max
+--api locals
+local _GetScreenWidth = GetScreenWidth
+local _GetScreenHeight = GetScreenHeight
+local _UIParent = UIParent
+local _CreateFrame = CreateFrame
+
+local version = 1
+
+function DF:CreateCoolTip()
+
+----------------------------------------------------------------------
+	--> Cooltip Startup
+----------------------------------------------------------------------
+
+	if (_G.GameCooltip2 and _G.GameCooltip2.version >= version) then
+		return
+	end
+
+	--> Start Cooltip Table
+		local CoolTip = {version = version}
+		_G.GameCooltip2 = CoolTip
+	
+	--> Containers
+		CoolTip.LeftTextTable = {}
+		CoolTip.LeftTextTableSub = {}
+		CoolTip.RightTextTable = {}
+		CoolTip.RightTextTableSub = {}
+		CoolTip.LeftIconTable = {}
+		CoolTip.LeftIconTableSub = {}
+		CoolTip.RightIconTable = {}
+		CoolTip.RightIconTableSub = {}
+		CoolTip.Banner = {false, false, false}
+		CoolTip.TopIconTableSub = {}
+		CoolTip.StatusBarTable = {}
+		CoolTip.StatusBarTableSub = {}
+		CoolTip.WallpaperTable = {}
+		CoolTip.WallpaperTableSub = {}
+		
+		CoolTip.FunctionsTableMain = {} --> menus
+		CoolTip.FunctionsTableSub = {} --> menus
+		CoolTip.ParametersTableMain = {} --> menus
+		CoolTip.ParametersTableSub = {} --> menus
+		
+		CoolTip.FixedValue = nil --> menus
+		CoolTip.SelectedIndexMain = nil --> menus
+		CoolTip.SelectedIndexSec = {} --> menus
+
+	--options table
+		CoolTip.OptionsList = {
+			["IconSize"] = true,
+			["HeightAnchorMod"] = true,
+			["WidthAnchorMod"] = true,
+			["MinWidth"] = true,
+			["FixedWidth"] = true,
+			["FixedHeight"] = true,
+			["FixedWidthSub"] = true,
+			["FixedHeightSub"] = true,
+			["AlignAsBlizzTooltip"] = true,
+			["IgnoreSubMenu"] = true,
+			["IgnoreButtonAutoHeight"] = true,
+			["TextHeightMod"] = true,
+			["ButtonHeightMod"] = true,
+			["ButtonHeightModSub"] = true,
+			["YSpacingMod"] = true,
+			["YSpacingModSub"] = true,
+			["ButtonsYMod"] = true,
+			["ButtonsYModSub"] = true,
+			["IconHeightMod"] = true,
+			["StatusBarHeightMod"] = true,
+			["StatusBarTexture"] = true,
+			["TextSize"] = true,
+			["TextFont"] = true,
+			["TextColor"] = true,
+			["TextColorRight"] = true,
+			["TextShadow"] = true,
+			["LeftTextWidth"] = true,
+			["RightTextWidth"] = true,
+			["LeftTextHeight"] = true,
+			["RightTextHeight"] = true,
+			["NoFade"] = true,
+			["MyAnchor"] = true,
+			["Anchor"] = true,
+			["RelativeAnchor"] = true,
+			["NoLastSelectedBar"] = true,
+			["SubMenuIsTooltip"] = true,
+			["LeftBorderSize"] = true,
+			["RightBorderSize"] = true,
+			["HeighMod"] = true,
+			["HeighModSub"] = true,
+			["IconBlendMode"] = true,
+			["IconBlendModeHover"] = true,
+			["SubFollowButton"] = true,
+			["IgnoreArrows"] = true,
+			["SelectedTopAnchorMod"] = true,
+			["SelectedBottomAnchorMod"] = true,
+			["SelectedLeftAnchorMod"] = true,
+			["SelectedRightAnchorMod"] = true,
+		}
+		
+		CoolTip.OptionsTable = {}
+	
+		--cprops
+		CoolTip.Indexes = 0 --> amount of lines current on shown
+		CoolTip.IndexesSub = {} --> amount of lines current on shown
+		CoolTip.HaveSubMenu = false --> amount of lines current on shown
+		CoolTip.SubIndexes = 0 --> amount of lines current on shown on sub menu
+		CoolTip.Type = 1 --> 1 tooltip 2 tooltip with bars 3 menu 4 menu + submenus
+		CoolTip.Host = nil --> frame to anchor
+		CoolTip.LastSize = 0 --> last size
+		
+		CoolTip.LastIndex = 0
+		
+		CoolTip.internal_x_mod = 0
+		CoolTip.internal_y_mod = 0
+		CoolTip.overlap_checked = false
+		
+		--defaults
+		CoolTip.default_height = 20
+		CoolTip.default_text_size = 10.5
+		CoolTip.default_text_font = "GameFontHighlight"
+		
+		CoolTip.selected_anchor = {}
+		CoolTip.selected_anchor.left = 2
+		CoolTip.selected_anchor.right = 0
+		CoolTip.selected_anchor.top = 0
+		CoolTip.selected_anchor.bottom = 0
+		
+		CoolTip._default_font = SharedMedia:Fetch ("font", "Friz Quadrata TT")
+		
+	--> Create Frames
+	
+		--> main frame
+		local frame1
+		if (not GameCooltipFrame1) then
+			frame1 = CreateFrame ("Frame", "GameCooltipFrame1", UIParent, "DFCooltipMainFrameTemplate")
+			tinsert (UISpecialFrames, "GameCooltipFrame1")
+			DF:CreateFlashAnimation (frame1)
+		else
+			frame1 = GameCooltipFrame1
+		end
+		
+		GameCooltipFrame1_FrameBackgroundCenter:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame1_FrameBackgroundCenter:SetTexCoord (0.10546875, 0.89453125, 0, 1)
+		GameCooltipFrame1_FrameBackgroundLeft:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame1_FrameBackgroundLeft:SetTexCoord (0, 0.103515625, 0, 1)
+		GameCooltipFrame1_FrameBackgroundRight:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame1_FrameBackgroundRight:SetTexCoord (0.896484375, 1, 0, 1)
+		
+		--> secondary frame
+		local frame2
+		if (not GameCooltipFrame2) then
+			frame2 = CreateFrame ("Frame", "GameCooltipFrame2", UIParent, "DFCooltipMainFrameTemplate")
+			tinsert (UISpecialFrames, "GameCooltipFrame2")
+			DF:CreateFlashAnimation (frame2)
+			frame2:SetClampedToScreen (true)
+		else
+			frame2 = GameCooltipFrame2
+		end
+
+		frame2:SetPoint ("bottomleft", frame1, "bottomright")
+		
+		GameCooltipFrame2_FrameBackgroundCenter:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame2_FrameBackgroundCenter:SetTexCoord (0.10546875, 0.89453125, 0, 1)
+		GameCooltipFrame2_FrameBackgroundLeft:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame2_FrameBackgroundLeft:SetTexCoord (0, 0.103515625, 0, 1)
+		GameCooltipFrame2_FrameBackgroundRight:SetTexture (DF.folder .. "cooltip_background")
+		GameCooltipFrame2_FrameBackgroundRight:SetTexCoord (0.896484375, 1, 0, 1)
+	
+		CoolTip.frame1 = frame1
+		CoolTip.frame2 = frame2
+		DF:Fade (frame1, 0)
+		DF:Fade (frame2, 0)
+
+		--> button containers
+		frame1.Lines = {}
+		frame2.Lines = {}
+
+----------------------------------------------------------------------
+	--> Title Function 
+----------------------------------------------------------------------
+
+		function CoolTip:SetTitle (_f, text)
+			if (_f == 1) then
+				CoolTip.title1 = true
+				CoolTip.title_text = text
+			end
+		end
+
+		function CoolTip:SetTitleAnchor (_f, _anchor, ...)
+			_anchor = string.lower (_anchor)
+			if (_f == 1) then
+				self.frame1.titleIcon:ClearAllPoints()
+				self.frame1.titleText:ClearAllPoints()
+				
+				if (_anchor == "left") then
+					self.frame1.titleIcon:SetPoint ("left", frame1, "left", ...)
+					self.frame1.titleText:SetPoint ("left", frame1.titleIcon, "right")
+					
+				elseif (_anchor == "center") then
+					self.frame1.titleIcon:SetPoint ("center", frame1, "center")
+					self.frame1.titleIcon:SetPoint ("bottom", frame1, "top")
+					self.frame1.titleText:SetPoint ("left", frame1.titleIcon, "right")
+					self.frame1.titleText:SetText ("TESTE")
+					
+					self.frame1.titleText:Show()
+					self.frame1.titleIcon:Show()
+					
+				elseif (_anchor == "right") then
+					self.frame1.titleIcon:SetPoint ("right", frame1, "right", ...)
+					self.frame1.titleText:SetPoint ("right", frame1.titleIcon, "left")
+					
+				end
+			elseif (_f == 2) then
+				self.frame2.titleIcon:ClearAllPoints()
+				self.frame2.titleText:ClearAllPoints()
+				if (_anchor == "left") then
+					self.frame2.titleIcon:SetPoint ("left", frame2, "left", ...)
+					self.frame2.titleText:SetPoint ("left", frame2.titleIcon, "right")
+				elseif (_anchor == "center") then
+					self.frame2.titleIcon:SetPoint ("center", frame2, "center", ...)
+					self.frame2.titleText:SetPoint ("left", frame2.titleIcon, "right")
+				elseif (_anchor == "right") then
+					self.frame2.titleIcon:SetPoint ("right", frame2, "right", ...)
+					self.frame2.titleText:SetPoint ("right", frame2.titleIcon, "left")
+				end
+			end
+		end
+		
+----------------------------------------------------------------------
+	--> Button Hide and Show Functions
+----------------------------------------------------------------------
+
+		local elapsedTime = 0
+	
+		CoolTip.mouseOver = false
+		CoolTip.buttonClicked = false
+		
+		frame1:SetScript ("OnEnter", function (self)
+			if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2) then --> menu
+				CoolTip.active = true
+				CoolTip.mouseOver = true
+				self:SetScript ("OnUpdate", nil)
+				DF:Fade (self, 0)
+				--rever
+				if (CoolTip.sub_menus) then
+					DF:Fade (frame2, 0)
+				end
+			end
+		end)
+		
+		frame2:SetScript ("OnEnter", function (self)
+			if (CoolTip.OptionsTable.SubMenuIsTooltip) then
+				return CoolTip:Close()
+			end
+			if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2) then
+				CoolTip.active = true
+				CoolTip.mouseOver = true
+				self:SetScript ("OnUpdate", nil)
+				DF:Fade (self, 0)
+				DF:Fade (frame1, 0)
+			end
+		end)
+
+		local OnLeaveUpdateFrame1 = function (self, elapsed)
+					elapsedTime = elapsedTime+elapsed
+					if (elapsedTime > 0.7) then
+						if (not CoolTip.active and not CoolTip.buttonClicked and self == CoolTip.Host) then
+							DF:Fade (self, 1)
+							DF:Fade (frame2, 1)
+						elseif (not CoolTip.active) then
+							DF:Fade (self, 1)
+							DF:Fade (frame2, 1)
+						end
+						self:SetScript ("OnUpdate", nil)
+						frame2:SetScript ("OnUpdate", nil)
+					end
+				end
+		
+		frame1:SetScript ("OnLeave", function (self)
+		
+			if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2) then
+				CoolTip.active = false
+				CoolTip.mouseOver = false
+				elapsedTime = 0
+				self:SetScript ("OnUpdate", OnLeaveUpdateFrame1)
+			else
+				CoolTip.active = false
+				CoolTip.mouseOver = false
+				elapsedTime = 0
+				self:SetScript ("OnUpdate", OnLeaveUpdateFrame1)
+			end
+		end)
+		
+		local OnLeaveUpdateFrame2 = function (self, elapsed)
+					elapsedTime = elapsedTime+elapsed
+					if (elapsedTime > 0.7) then
+						if (not CoolTip.active and not CoolTip.buttonClicked and self == CoolTip.Host) then
+							DF:Fade (self, 1)
+							DF:Fade (frame2, 1)
+						elseif (not CoolTip.active) then
+							DF:Fade (self, 1)
+							DF:Fade (frame2, 1)
+						end
+						self:SetScript ("OnUpdate", nil)
+						frame1:SetScript ("OnUpdate", nil)
+					end
+				end
+		
+		frame2:SetScript ("OnLeave", function (self)
+			if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2) then
+				CoolTip.active = false
+				CoolTip.mouseOver = false
+				elapsedTime = 0
+				self:SetScript ("OnUpdate", OnLeaveUpdateFrame2)
+			else
+				CoolTip.active = false
+				CoolTip.mouseOver = false
+				elapsedTime = 0
+				self:SetScript ("OnUpdate", OnLeaveUpdateFrame2)
+			
+			end
+		end)	
+
+		frame1:SetScript ("OnHide", function (self)
+			CoolTip.active = false
+			CoolTip.buttonClicked = false
+			CoolTip.mouseOver = false
+		end)
+	
+	
+----------------------------------------------------------------------
+	--> Button Creation Functions
+----------------------------------------------------------------------
+	
+		function GameCooltipButtonMouseDown (button)
+			local mod = CoolTip.OptionsTable.TextHeightMod or 0
+			button.leftText:SetPoint ("center", button.leftIcon, "center", 0, 0+mod)
+			button.leftText:SetPoint ("left", button.leftIcon, "right", 4, -1+mod)
+		end
+		
+		function GameCooltipButtonMouseUp (button)
+			local mod = CoolTip.OptionsTable.TextHeightMod or 0
+			button.leftText:SetPoint ("center", button.leftIcon, "center", 0, 0+mod)
+			button.leftText:SetPoint ("left", button.leftIcon, "right", 3, 0+mod)
+		end
+	
+		function CoolTip:CreateButton (index, frame, name)
+			local new_button = CreateFrame ("Button", name, frame, "DFCooltipButtonTemplate")
+			frame.Lines [index] = new_button
+			return new_button
+		end
+
+		local OnEnterUpdateButton = function (self, elapsed)
+									elapsedTime = elapsedTime+elapsed
+									if (elapsedTime > 0.001) then
+										--> search key: ~onenterupdatemain
+										CoolTip:ShowSub (self.index)
+										CoolTip.last_button = self.index
+										self:SetScript ("OnUpdate", nil)
+									end
+								end
+								
+		local OnLeaveUpdateButton = function (self, elapsed)
+								elapsedTime = elapsedTime+elapsed
+								if (elapsedTime > 0.7) then
+									if (not CoolTip.active and not CoolTip.buttonClicked) then
+										DF:Fade (frame1, 1)
+										DF:Fade (frame2, 1)
+							
+									elseif (not CoolTip.active) then
+										DF:Fade (frame1, 1)
+										DF:Fade (frame2, 1)
+									end
+									frame1:SetScript ("OnUpdate", nil)
+								end
+							end
+		
+		function CoolTip:NewMainButton (i)
+			local botao = CoolTip:CreateButton (i, frame1, "GameCooltipMainButton"..i)
+			
+			--> serach key: ~onenter
+			botao:SetScript ("OnEnter", function()
+							if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2 and not botao.isDiv) then
+								CoolTip.active = true
+								CoolTip.mouseOver = true
+
+								frame1:SetScript ("OnUpdate", nil)
+								frame2:SetScript ("OnUpdate", nil)
+
+								botao.background:Show()
+								
+								if (CoolTip.OptionsTable.IconBlendModeHover) then
+									botao.leftIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendModeHover)
+								else
+									botao.leftIcon:SetBlendMode ("BLEND")
+								end
+
+								if (CoolTip.IndexesSub [botao.index] and CoolTip.IndexesSub [botao.index] > 0) then
+									if (CoolTip.OptionsTable.SubMenuIsTooltip) then
+										CoolTip:ShowSub (botao.index)
+										botao.index = i
+									else
+										if (CoolTip.last_button) then
+											CoolTip:ShowSub (CoolTip.last_button)
+										else
+											CoolTip:ShowSub (botao.index)
+										end
+										elapsedTime = 0
+										botao.index = i
+										botao:SetScript ("OnUpdate", OnEnterUpdateButton)									
+									end
+
+								else
+									--hide second frame
+									DF:Fade (frame2, 1)
+									CoolTip.last_button = nil
+								end
+							else
+								CoolTip.mouseOver = true
+							end
+						end)
+						
+			botao:SetScript ("OnLeave", function()
+							if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2 and not botao.isDiv) then
+								CoolTip.active = false
+								CoolTip.mouseOver = false
+								botao:SetScript ("OnUpdate", nil)
+								
+								botao.background:Hide()
+								
+								if (CoolTip.OptionsTable.IconBlendMode) then
+									botao.leftIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+									botao.rightIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+								else
+									botao.leftIcon:SetBlendMode ("BLEND")
+									botao.rightIcon:SetBlendMode ("BLEND")
+								end
+								
+								elapsedTime = 0
+								frame1:SetScript ("OnUpdate", OnLeaveUpdateButton)
+								--CoolTip:HideSub (i)
+							else
+								CoolTip.active = false
+								elapsedTime = 0
+								frame1:SetScript ("OnUpdate", OnLeaveUpdateButton)
+								CoolTip.mouseOver = false
+							end
+			end)	
+			
+			return botao
+		end
+		
+		local OnLeaveUpdateButtonSec = function (self, elapsed)
+								elapsedTime = elapsedTime+elapsed
+								if (elapsedTime > 0.7) then
+									if (not CoolTip.active and not CoolTip.buttonClicked) then
+										DF:Fade (frame1, 1)
+										DF:Fade (frame2, 1)
+									elseif (not CoolTip.active) then
+										DF:Fade (frame1, 1)
+										DF:Fade (frame2, 1)
+									end
+									frame2:SetScript ("OnUpdate", nil)
+								end
+							end
+		
+		function CoolTip:NewSecondaryButton (i)
+			local botao = CoolTip:CreateButton (i, frame2, "GameCooltipSecButton"..i)
+			
+			botao:SetScript ("OnEnter", function()
+							if (CoolTip.OptionsTable.SubMenuIsTooltip) then
+								return CoolTip:Close()
+							end
+							if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2 and not botao.isDiv) then
+								CoolTip.active = true
+								CoolTip.mouseOver = true
+								
+								botao.background:Show()
+								
+								if (CoolTip.OptionsTable.IconBlendModeHover) then
+									botao.leftIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendModeHover)
+								else
+									botao.leftIcon:SetBlendMode ("BLEND")
+								end
+								
+								frame1:SetScript ("OnUpdate", nil)
+								frame2:SetScript ("OnUpdate", nil)
+								
+								DF:Fade (frame1, 0)
+								DF:Fade (frame2, 0)
+							else
+								CoolTip.mouseOver = true
+							end
+						end)
+
+			botao:SetScript ("OnLeave", function()
+							if (CoolTip.Type ~= 1 and CoolTip.Type ~= 2) then
+								CoolTip.active = false
+								CoolTip.mouseOver = false
+								
+								botao.background:Hide()
+								
+								if (CoolTip.OptionsTable.IconBlendMode) then
+									botao.leftIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+									botao.rightIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+								else
+									botao.leftIcon:SetBlendMode ("BLEND")
+									botao.rightIcon:SetBlendMode ("BLEND")
+								end
+								
+								elapsedTime = 0
+								frame2:SetScript ("OnUpdate", OnLeaveUpdateButtonSec)
+							else
+								CoolTip.active = false
+								CoolTip.mouseOver = false
+								elapsedTime = 0
+								frame2:SetScript ("OnUpdate", OnLeaveUpdateButtonSec)
+							end
+			end)
+			
+			return botao
+		end	
+		
+----------------------------------------------------------------------
+	--> Button Click Functions
+----------------------------------------------------------------------
+		
+		CoolTip.selected_anchor.left = 4
+		CoolTip.selected_anchor.right = -4
+		CoolTip.selected_anchor.top = 0
+		CoolTip.selected_anchor.bottom = 0
+		
+		function CoolTip:HideSelectedTexture (frame)
+			frame.selectedTop:Hide()
+			frame.selectedBottom:Hide()
+			frame.selectedMiddle:Hide()
+		end
+		
+		function CoolTip:ShowSelectedTexture (frame)
+			frame.selectedTop:Show()
+			frame.selectedBottom:Show()
+			frame.selectedMiddle:Show()
+		end
+		
+		function CoolTip:SetSelectedAnchor (frame, button)
+
+			local left = CoolTip.selected_anchor.left + (CoolTip.OptionsTable.SelectedLeftAnchorMod or 0)
+			local right = CoolTip.selected_anchor.right + (CoolTip.OptionsTable.SelectedRightAnchorMod or 0)
+			
+			local top = CoolTip.selected_anchor.top + (CoolTip.OptionsTable.SelectedTopAnchorMod or 0)
+			local bottom = CoolTip.selected_anchor.bottom + (CoolTip.OptionsTable.SelectedBottomAnchorMod or 0)
+		
+			frame.selectedTop:ClearAllPoints()
+			frame.selectedBottom:ClearAllPoints()
+		
+			frame.selectedTop:SetPoint ("topleft", button, "topleft", left, top) --
+			frame.selectedTop:SetPoint ("topright", button, "topright", right, top) --
+			
+			frame.selectedBottom:SetPoint ("bottomleft", button, "bottomleft", left, bottom) --
+			frame.selectedBottom:SetPoint ("bottomright", button, "bottomright", right, bottom) --
+
+			CoolTip:ShowSelectedTexture (frame)
+		end
+		
+		local OnClickFunctionButtonPrincipal = function (self)
+					if (CoolTip.IndexesSub [self.index] and CoolTip.IndexesSub [self.index] > 0) then
+						CoolTip:ShowSub (self.index)
+						CoolTip.last_button = self.index
+					end
+					
+					CoolTip.buttonClicked = true
+					CoolTip:SetSelectedAnchor (frame1, self)
+					
+					if (not CoolTip.OptionsTable.NoLastSelectedBar) then
+						CoolTip:ShowSelectedTexture (frame1)
+						
+					end
+					CoolTip.SelectedIndexMain = self.index
+					
+					if (CoolTip.FunctionsTableMain [self.index]) then
+						local parameterTable = CoolTip.ParametersTableMain [self.index]
+						CoolTip.FunctionsTableMain [self.index] (_, CoolTip.FixedValue, parameterTable [1], parameterTable [2], parameterTable [3])
+					end
+				end
+				
+		local OnClickFunctionButtonSecundario = function (self)
+					CoolTip.buttonClicked = true
+					
+					CoolTip:SetSelectedAnchor (frame2, self)
+					
+					if (CoolTip.FunctionsTableSub [self.mainIndex] and CoolTip.FunctionsTableSub [self.mainIndex] [self.index]) then
+						local parameterTable = CoolTip.ParametersTableSub [self.mainIndex] [self.index]
+						CoolTip.FunctionsTableSub [self.mainIndex] [self.index] (_, CoolTip.FixedValue, parameterTable [1], parameterTable [2], parameterTable [3])
+					end
+					
+					local botao_p = frame1.Lines [self.mainIndex]
+					CoolTip:SetSelectedAnchor (frame1, botao_p)
+
+					if (not CoolTip.OptionsTable.NoLastSelectedBar) then
+						CoolTip:ShowSelectedTexture (frame1)
+					end
+					
+					CoolTip.SelectedIndexMain = self.mainIndex
+					CoolTip.SelectedIndexSec [self.mainIndex] = self.index
+					
+				end
+		
+		function CoolTip:TextAndIcon (index, frame, menuButton, leftTextTable, rightTextTable, leftIconTable, rightIconTable, isSub)
+
+			--> reset width
+			menuButton.leftText:SetWidth (0)
+			menuButton.leftText:SetHeight (0)
+			menuButton.rightText:SetWidth (0)
+			menuButton.rightText:SetHeight (0)
+
+			--> set text
+			if (leftTextTable) then
+			
+				menuButton.leftText:SetText (leftTextTable [1])
+				
+				local r, g, b, a = leftTextTable [2], leftTextTable [3], leftTextTable [4], leftTextTable [5]
+				
+				if (r == 0 and g == 0 and b == 0 and a == 0) then
+					if (CoolTip.OptionsTable.TextColor) then
+						r, g, b, a = DF:ParseColors (CoolTip.OptionsTable.TextColor)
+						menuButton.leftText:SetTextColor (r, g, b, a)
+					else
+						menuButton.leftText:SetTextColor (1, 1, 1, 1)
+					end
+				else
+					menuButton.leftText:SetTextColor (r, g, b, a)
+				end
+				
+				if (CoolTip.OptionsTable.TextSize and not leftTextTable [6]) then
+					DF:SetFontSize (menuButton.leftText, CoolTip.OptionsTable.TextSize)
+				end
+				
+				if (CoolTip.OptionsTable.LeftTextWidth) then
+					menuButton.leftText:SetWidth (CoolTip.OptionsTable.LeftTextWidth)
+				else
+					menuButton.leftText:SetWidth (0)
+				end
+				
+				if (CoolTip.OptionsTable.LeftTextHeight) then
+					menuButton.leftText:SetHeight (CoolTip.OptionsTable.LeftTextHeight)
+				else
+					menuButton.leftText:SetHeight (0)
+				end
+				
+				if (CoolTip.OptionsTable.TextFont and not leftTextTable [7]) then --font
+				
+					if (_G [CoolTip.OptionsTable.TextFont]) then
+						menuButton.leftText:SetFontObject (GameFontRed or CoolTip.OptionsTable.TextFont)
+					else
+						local font = SharedMedia:Fetch ("font", CoolTip.OptionsTable.TextFont)
+						local _, size, flags = menuButton.leftText:GetFont()
+						flags = leftTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = leftTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.leftText:SetFont (font, size, flags)
+					end
+				
+				elseif (leftTextTable [7]) then
+					if (_G [leftTextTable [7]]) then
+						menuButton.leftText:SetFontObject (leftTextTable [7])
+						local face, size, flags = menuButton.leftText:GetFont()
+						flags = leftTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = leftTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.leftText:SetFont (face, size, flags)					
+					else
+						local font = SharedMedia:Fetch ("font", leftTextTable [7])
+						local face, size, flags = menuButton.leftText:GetFont()
+						flags = leftTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = leftTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.leftText:SetFont (face, size, flags)
+					end
+				else
+					menuButton.leftText:SetFont (CoolTip._default_font, leftTextTable [6] or CoolTip.OptionsTable.TextSize or 10, leftTextTable [8] or CoolTip.OptionsTable.TextShadow)
+				end
+				
+				local height_mod = CoolTip.OptionsTable.TextHeightMod or 0				
+				menuButton.leftText:SetPoint ("center", menuButton.leftIcon, "center", 0, 0+height_mod)
+				menuButton.leftText:SetPoint ("left", menuButton.leftIcon, "right", 3, 0+height_mod)
+
+			else
+				menuButton.leftText:SetText ("")
+			end
+
+			if (rightTextTable) then
+				menuButton.rightText:SetText (rightTextTable [1])
+				
+				local r, g, b, a = rightTextTable [2], rightTextTable [3], rightTextTable [4], rightTextTable [5]
+				
+				if (r == 0 and g == 0 and b == 0 and a == 0) then
+					
+					if (CoolTip.OptionsTable.TextColorRight) then
+						r, g, b, a = DF:ParseColors (CoolTip.OptionsTable.TextColorRight)
+						menuButton.rightText:SetTextColor (r, g, b, a)
+					elseif (CoolTip.OptionsTable.TextColor) then
+						r, g, b, a = DF:ParseColors (CoolTip.OptionsTable.TextColor)
+						menuButton.rightText:SetTextColor (r, g, b, a)
+					else
+						menuButton.rightText:SetTextColor (1, 1, 1, 1)
+					end
+				else
+					menuButton.rightText:SetTextColor (r, g, b, a)
+				end
+				
+				if (CoolTip.OptionsTable.TextSize and not rightTextTable [6]) then
+					DF:SetFontSize (menuButton.rightText, CoolTip.OptionsTable.TextSize)
+				end
+				
+				if (CoolTip.OptionsTable.RightTextWidth) then
+					menuButton.rightText:SetWidth (CoolTip.OptionsTable.RightTextWidth)
+				else
+					menuButton.rightText:SetWidth (0)
+				end
+				
+				if (CoolTip.OptionsTable.RightTextHeight) then
+					menuButton.rightText:SetHeight (CoolTip.OptionsTable.RightTextHeight)
+				else
+					menuButton.rightText:SetHeight (0)
+				end
+				
+				if (CoolTip.OptionsTable.TextFont and not rightTextTable [7]) then
+					if (_G [CoolTip.OptionsTable.TextFont]) then
+						menuButton.rightText:SetFontObject (CoolTip.OptionsTable.TextFont)
+					else
+						local font = SharedMedia:Fetch ("font", CoolTip.OptionsTable.TextFont)
+						local _, size, flags = menuButton.rightText:GetFont()
+						flags = rightTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = rightTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.rightText:SetFont (font, size, flags)
+					end
+				
+				elseif (rightTextTable [7]) then
+					if (_G [rightTextTable [7]]) then
+						menuButton.rightText:SetFontObject (rightTextTable [7])
+						local face, size, flags = menuButton.rightText:GetFont()
+						flags = rightTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = rightTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.rightText:SetFont (face, size, flags)					
+					else
+						local font = SharedMedia:Fetch ("font", rightTextTable [7])
+						local face, size, flags = menuButton.rightText:GetFont()
+						flags = rightTextTable [8] or CoolTip.OptionsTable.TextShadow or nil
+						size = rightTextTable [6] or CoolTip.OptionsTable.TextSize or size
+						menuButton.rightText:SetFont (face, size, flags)
+					end
+				
+				else
+					menuButton.rightText:SetFont (CoolTip._default_font, rightTextTable [6] or CoolTip.OptionsTable.TextSize or 10, rightTextTable [8] or CoolTip.OptionsTable.TextShadow)
+				end
+				
+
+			else
+				menuButton.rightText:SetText ("")
+			end
+
+			--> left icon
+			if (leftIconTable and leftIconTable [1]) then
+				menuButton.leftIcon:SetTexture (leftIconTable [1])
+				menuButton.leftIcon:SetWidth (leftIconTable [2])
+				menuButton.leftIcon:SetHeight (leftIconTable [3])
+				menuButton.leftIcon:SetTexCoord (leftIconTable [4], leftIconTable [5], leftIconTable [6], leftIconTable [7])
+				
+				local ColorR, ColorG, ColorB, ColorA = DF:ParseColors (leftIconTable [8])
+				menuButton.leftIcon:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				
+				if (CoolTip.OptionsTable.IconBlendMode) then
+					menuButton.leftIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+				else
+					menuButton.leftIcon:SetBlendMode ("BLEND")
+				end
+				
+				menuButton.leftIcon:SetDesaturated (leftIconTable [9])
+			else
+				menuButton.leftIcon:SetTexture (nil)
+				menuButton.leftIcon:SetWidth (1)
+				menuButton.leftIcon:SetHeight (1)
+			end
+			
+			--> right icon
+			if (rightIconTable and rightIconTable [1]) then
+				menuButton.rightIcon:SetTexture (rightIconTable [1])
+				menuButton.rightIcon:SetWidth (rightIconTable [2])
+				menuButton.rightIcon:SetHeight (rightIconTable [3])
+				menuButton.rightIcon:SetTexCoord (rightIconTable [4], rightIconTable [5], rightIconTable [6], rightIconTable [7])
+				
+				local ColorR, ColorG, ColorB, ColorA = DF:ParseColors (rightIconTable [8])
+				menuButton.rightIcon:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				
+				if (CoolTip.OptionsTable.IconBlendMode) then
+					menuButton.rightIcon:SetBlendMode (CoolTip.OptionsTable.IconBlendMode)
+				else
+					menuButton.rightIcon:SetBlendMode ("BLEND")
+				end
+				
+				menuButton.rightIcon:SetDesaturated (rightIconTable [9])
+			else
+				menuButton.rightIcon:SetTexture (nil)
+				menuButton.rightIcon:SetWidth (1)
+				menuButton.rightIcon:SetHeight (1)
+			end
+			
+			--> overwrite icon size
+			if (CoolTip.OptionsTable.IconSize) then
+				menuButton.leftIcon:SetWidth (CoolTip.OptionsTable.IconSize)
+				menuButton.leftIcon:SetHeight (CoolTip.OptionsTable.IconSize)
+				menuButton.rightIcon:SetWidth (CoolTip.OptionsTable.IconSize)
+				menuButton.rightIcon:SetHeight (CoolTip.OptionsTable.IconSize)
+			end
+			
+			if (CoolTip.Type == 2) then
+				CoolTip:LeftTextSpace (menuButton)
+			end
+			
+			--> string length
+			if (not isSub) then --> main frame
+				if (not CoolTip.OptionsTable.FixedWidth) then
+					if (CoolTip.Type == 1 or CoolTip.Type == 2) then
+						local stringWidth = menuButton.leftText:GetStringWidth() + menuButton.rightText:GetStringWidth() + menuButton.leftIcon:GetWidth() + menuButton.rightIcon:GetWidth() + 10
+						if (stringWidth > frame.w) then
+							frame.w = stringWidth
+						end
+					end
+				else
+					menuButton.leftText:SetWidth (CoolTip.OptionsTable.FixedWidth - menuButton.leftIcon:GetWidth() - menuButton.rightText:GetStringWidth() - menuButton.rightIcon:GetWidth() - 30)
+				end
+			else
+				if (not CoolTip.OptionsTable.FixedWidthSub) then
+					if (CoolTip.Type == 1 or CoolTip.Type == 2) then
+						local stringWidth = menuButton.leftText:GetStringWidth() + menuButton.rightText:GetStringWidth() + menuButton.leftIcon:GetWidth() + menuButton.rightIcon:GetWidth()
+						if (stringWidth > frame.w) then
+							frame.w = stringWidth
+						end
+					end
+				else
+					menuButton.leftText:SetWidth (CoolTip.OptionsTable.FixedWidthSub - menuButton.leftIcon:GetWidth() - 20)
+				end
+			end
+			
+			local height = _math_max ( menuButton.leftIcon:GetHeight(), menuButton.rightIcon:GetHeight(), menuButton.leftText:GetStringHeight(), menuButton.rightText:GetStringHeight() )
+			if (height > frame.hHeight) then
+				frame.hHeight = height
+			end
+			
+		end
+		
+		function CoolTip:RefreshSpark (menuButton)
+			menuButton.spark:ClearAllPoints()
+			menuButton.spark:SetPoint ("LEFT", menuButton.statusbar, "LEFT", (menuButton.statusbar:GetValue() * (menuButton.statusbar:GetWidth() / 100)) - 3, 0)
+			menuButton.spark2:ClearAllPoints()
+			menuButton.spark2:SetPoint ("left", menuButton.statusbar, "left", menuButton.statusbar:GetValue() * (menuButton.statusbar:GetWidth()/100) - 16, 0)
+		end
+		
+		function CoolTip:StatusBar (menuButton, StatusBar)
+
+			if (StatusBar) then
+			
+				menuButton.statusbar:SetValue (StatusBar [1])
+				menuButton.statusbar:SetStatusBarColor (StatusBar [2], StatusBar [3], StatusBar [4], StatusBar [5])
+				menuButton.statusbar:SetHeight (20 + (CoolTip.OptionsTable.StatusBarHeightMod or 0))
+				
+				menuButton.spark2:Hide()
+				if (StatusBar [6]) then
+					menuButton.spark:Show()
+					--menuButton.spark:ClearAllPoints()
+					--menuButton.spark:SetPoint ("LEFT", menuButton.statusbar, "LEFT", (StatusBar [1] * (menuButton.statusbar:GetWidth() / 100)) - 3, 0)
+				else
+					menuButton.spark:Hide()
+				end
+				
+				if (StatusBar [7]) then
+					menuButton.statusbar2:SetValue (StatusBar[7].value)
+					menuButton.statusbar2.texture:SetTexture (StatusBar[7].texture or [[Interface\RaidFrame\Raid-Bar-Hp-Fill]])
+					if (StatusBar[7].specialSpark) then
+						menuButton.spark2:Show()
+					end
+					if (StatusBar[7].color) then
+						local ColorR, ColorG, ColorB, ColorA = DF:ParseColors (StatusBar[7].color)
+						menuButton.statusbar2:SetStatusBarColor (ColorR, ColorG, ColorB, ColorA)
+					else
+						menuButton.statusbar2:SetStatusBarColor (1, 1, 1, 1)
+					end
+				else
+					menuButton.statusbar2:SetValue (0)
+					menuButton.spark2:Hide()
+				end
+				
+				if (CoolTip.OptionsTable.StatusBarTexture) then
+					menuButton.statusbar.texture:SetTexture (CoolTip.OptionsTable.StatusBarTexture)
+				else
+					menuButton.statusbar.texture:SetTexture ("Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar")
+				end
+
+			else
+				menuButton.statusbar:SetValue (0)
+				menuButton.statusbar2:SetValue (0)
+				menuButton.spark:Hide()
+				menuButton.spark2:Hide()
+			end
+
+			if (CoolTip.OptionsTable.LeftBorderSize) then
+				menuButton.statusbar:SetPoint ("left", menuButton, "left", 10 + CoolTip.OptionsTable.LeftBorderSize, 0)
+			else
+				menuButton.statusbar:SetPoint ("left", menuButton, "left", 10, 0)
+			end
+			
+			if (CoolTip.OptionsTable.RightBorderSize) then
+				menuButton.statusbar:SetPoint ("right", menuButton, "right", CoolTip.OptionsTable.RightBorderSize + (- 10), 0)
+			else
+				menuButton.statusbar:SetPoint ("right", menuButton, "right", -10, 0)
+			end
+		end
+		
+		function CoolTip:SetupMainButton (menuButton, index)
+			menuButton.index = index
+			
+			--> setup texts and icons
+			CoolTip:TextAndIcon (index, frame1, menuButton, CoolTip.LeftTextTable [index], CoolTip.RightTextTable [index], CoolTip.LeftIconTable [index], CoolTip.RightIconTable [index])
+			--> setup statusbar
+			CoolTip:StatusBar (menuButton, CoolTip.StatusBarTable [index])
+
+			--> click
+			menuButton:RegisterForClicks ("LeftButtonDown")
+			
+			--> string length
+			if (not CoolTip.OptionsTable.FixedWidth) then
+				local stringWidth = menuButton.leftText:GetStringWidth() + menuButton.rightText:GetStringWidth() + menuButton.leftIcon:GetWidth() + menuButton.rightIcon:GetWidth()
+				if (stringWidth > frame1.w) then
+					frame1.w = stringWidth
+				end
+			end
+			
+			--> register click function
+			menuButton:SetScript ("OnClick", OnClickFunctionButtonPrincipal)
+			menuButton:Show()
+		end
+
+		function CoolTip:SetupSecondaryButton (menuButton, index, mainMenuIndex)
+			
+			menuButton.index = index
+			menuButton.mainIndex = mainMenuIndex
+			
+			--> setup texts and icons
+			CoolTip:TextAndIcon (index, frame2, menuButton, CoolTip.LeftTextTableSub [mainMenuIndex] and CoolTip.LeftTextTableSub [mainMenuIndex] [index],
+			CoolTip.RightTextTableSub [mainMenuIndex] and CoolTip.RightTextTableSub [mainMenuIndex] [index], 
+			CoolTip.LeftIconTableSub [mainMenuIndex] and CoolTip.LeftIconTableSub [mainMenuIndex] [index], 
+			CoolTip.RightIconTableSub [mainMenuIndex] and CoolTip.RightIconTableSub [mainMenuIndex] [index], true)
+			--> setup statusbar
+			CoolTip:StatusBar (menuButton, CoolTip.StatusBarTableSub [mainMenuIndex] and CoolTip.StatusBarTableSub [mainMenuIndex] [index])
+
+
+			--> click
+			menuButton:RegisterForClicks ("LeftButtonDown")
+			
+			menuButton:ClearAllPoints()
+			menuButton:SetPoint ("center", frame2, "center")
+			menuButton:SetPoint ("top", frame2, "top", 0, (((index-1)*20)*-1)-3)
+			menuButton:SetPoint ("left", frame2, "left")
+			menuButton:SetPoint ("right", frame2, "right")
+			
+			DF:Fade (menuButton, 0)
+			
+			--> string length
+			local stringWidth = menuButton.leftText:GetStringWidth() + menuButton.rightText:GetStringWidth() + menuButton.leftIcon:GetWidth() + menuButton.rightIcon:GetWidth()
+			if (stringWidth > frame2.w) then
+				frame2.w = stringWidth
+			end
+
+			menuButton:SetScript ("OnClick", OnClickFunctionButtonSecundario)
+			menuButton:Show()
+
+			return true
+		end
+	
+	-- -- --------------------------------------------------------------------------------------------------------------
+	
+		function CoolTip:SetupWallpaper (wallpaperTable, wallpaper)
+			local texture = wallpaperTable [1]
+			if (DF:IsHtmlColor (texture) or type (texture) == "table") then
+				local r, g, b, a = DF:ParseColors (texture)
+				wallpaper:SetTexture (r, g, b, a)
+			else
+				wallpaper:SetTexture (texture)
+			end
+			
+			wallpaper:SetTexCoord (wallpaperTable[2], wallpaperTable[3], wallpaperTable[4], wallpaperTable[5])
+			
+			local color = wallpaperTable[6]
+			if (color) then
+				local r, g, b, a = DF:ParseColors (color)
+				wallpaper:SetVertexColor (r, g, b, a)
+			else
+				wallpaper:SetVertexColor (1, 1, 1, 1)
+			end
+			
+			if (wallpaperTable[7]) then
+				wallpaper:SetDesaturated (true)
+			else
+				wallpaper:SetDesaturated (false)
+			end
+
+			wallpaper:Show()
+		end
+	
+	-- -- --------------------------------------------------------------------------------------------------------------
+	
+	function CoolTip:ShowSub (index)
+	
+		if (CoolTip.OptionsTable.IgnoreSubMenu) then
+			DF:Fade (frame2, 1)
+			return
+		end
+	
+		frame2:SetHeight (6)
+		
+		local amtIndexes = CoolTip.IndexesSub [index]
+		if (not amtIndexes) then
+			--print ("Sub menu called but sub menu indexes is nil")
+			return
+		end
+
+		if (CoolTip.OptionsTable.FixedWidthSub) then
+			frame2:SetWidth (CoolTip.OptionsTable.FixedWidthSub)
+		end
+		
+		frame2.h = CoolTip.IndexesSub [index] * 20
+		frame2.hHeight = 0
+		frame2.w = 0
+		
+		--> pegar a fontsize da label principal
+		local mainButton = frame1.Lines [index]
+		local fontSize = DF:GetFontSize (mainButton.leftText)
+		
+		local GotChecked = false
+		
+		local IsTooltip = CoolTip.OptionsTable.SubMenuIsTooltip
+		if (IsTooltip) then
+			frame2:EnableMouse (false)
+		else
+			frame2:EnableMouse (true)
+		end
+		
+		for i = 1, CoolTip.IndexesSub [index] do
+		
+			local button = frame2.Lines [i]
+			
+			if (not button) then
+				button = CoolTip:NewSecondaryButton (i)
+			end
+			
+			local checked = CoolTip:SetupSecondaryButton (button, i, index)
+			if (checked) then
+				GotChecked = true
+			end
+			
+			if (IsTooltip) then
+				button:EnableMouse (false)
+			else
+				button:EnableMouse (true)
+			end
+		end
+		
+		local selected = CoolTip.SelectedIndexSec [index]
+		if (selected) then
+		
+			CoolTip:SetSelectedAnchor (frame2, frame2.Lines [selected])
+
+			if (not CoolTip.OptionsTable.NoLastSelectedBar) then
+				CoolTip:ShowSelectedTexture (frame2)
+			end
+		else
+			CoolTip:HideSelectedTexture (frame2)
+		end
+		
+		for i = CoolTip.IndexesSub [index] + 1, #frame2.Lines do 
+			DF:Fade (frame2.Lines[i], 1)
+		end
+
+		local spacing = 0
+		if (CoolTip.OptionsTable.YSpacingModSub) then
+			spacing = CoolTip.OptionsTable.YSpacingModSub
+		end
+		
+		--> normalize height of all rows
+		for i = 1, CoolTip.IndexesSub [index] do
+		
+			local menuButton = frame2.Lines [i]
+			
+			-- CoolTipFrame2.Lines [2].divbar
+			
+			if (menuButton.leftText:GetText() == "$div") then
+			
+				--> height
+				menuButton:SetHeight (4)
+				
+				--> points
+				menuButton:ClearAllPoints()
+				
+				menuButton:SetPoint ("center", frame2, "center")
+				menuButton:SetPoint ("left", frame2, "left")
+				menuButton:SetPoint ("right", frame2, "right")
+				
+				menuButton.rightText:SetText ("")
+				
+				local div_size_up = tonumber (CoolTip.RightTextTableSub [index] [i] [2])
+				if (not div_size_up) then
+					div_size_up = 0
+				end
+				local div_size_down = tonumber (CoolTip.RightTextTableSub [index] [i] [3])
+				if (not div_size_down) then
+					div_size_down = 0
+				end
+				
+				menuButton:SetPoint ("top", frame2, "top", 0, ( ( (i-1) * frame2.hHeight) * -1) - 4 + (CoolTip.OptionsTable.ButtonsYModSub or 0) + spacing + (2 + (div_size_up or 0)))
+				
+				if (CoolTip.OptionsTable.YSpacingModSub) then
+					spacing = spacing + CoolTip.OptionsTable.YSpacingModSub
+				end
+				
+				spacing = spacing + 17 + (div_size_down or 0)
+
+				menuButton.leftText:SetText ("")
+				menuButton.isDiv = true
+				
+				if (not menuButton.divbar) then
+					CoolTip:CreateDivBar (menuButton)
+				else
+					menuButton.divbar:Show()
+				end
+
+				menuButton.divbar:SetPoint ("left", menuButton, "left", frame1:GetWidth()*0.10, 0)
+				menuButton.divbar:SetPoint ("right", menuButton, "right", -frame1:GetWidth()*0.10, 0)
+
+			else
+				--> height
+				menuButton:SetHeight (frame2.hHeight + (CoolTip.OptionsTable.ButtonHeightModSub or 0))
+				--> points
+				menuButton:ClearAllPoints()
+				menuButton:SetPoint ("center", frame2, "center")
+				menuButton:SetPoint ("top", frame2, "top", 0, ( ( (i-1) * frame2.hHeight) * -1) - 4 + (CoolTip.OptionsTable.ButtonsYModSub or 0) + spacing)
+				if (CoolTip.OptionsTable.YSpacingModSub) then
+					spacing = spacing + CoolTip.OptionsTable.YSpacingModSub
+				end
+				menuButton:SetPoint ("left", frame2, "left")
+				menuButton:SetPoint ("right", frame2, "right")
+				
+				if (menuButton.divbar) then
+					menuButton.divbar:Hide()
+					menuButton.isDiv = false
+				end
+			end				
+			
+		end
+		
+		local mod = CoolTip.OptionsTable.HeighModSub or 0
+		frame2:SetHeight ( (frame2.hHeight * CoolTip.IndexesSub [index]) + 12 + (-spacing) + mod)
+		
+		if (CoolTip.TopIconTableSub [index]) then
+			local upperImageTable = CoolTip.TopIconTableSub [index]
+			frame2.upperImage:SetTexture (upperImageTable [1])
+			frame2.upperImage:SetWidth (upperImageTable [2])
+			frame2.upperImage:SetHeight (upperImageTable [3])
+			frame2.upperImage:SetTexCoord (upperImageTable[4], upperImageTable[5], upperImageTable[6], upperImageTable[7])
+			frame2.upperImage:Show()
+		else
+			frame2.upperImage:Hide()
+		end
+		
+		if (CoolTip.WallpaperTableSub [index]) then
+			CoolTip:SetupWallpaper (CoolTip.WallpaperTableSub [index], frame2.frameWallpaper)
+		else
+			frame2.frameWallpaper:Hide()
+		end
+
+		if (not CoolTip.OptionsTable.FixedWidthSub) then
+			frame2:SetWidth (frame2.w + 44)
+		end
+		
+		DF:Fade (frame2, 0)
+		
+		CoolTip:CheckOverlap()
+		
+		if (CoolTip.OptionsTable.SubFollowButton and not CoolTip.frame2_leftside) then
+		
+			local button = frame1.Lines [index]
+		
+			frame2:ClearAllPoints()
+			frame2:SetPoint ("left", button, "right")
+			
+		elseif (CoolTip.OptionsTable.SubFollowButton and CoolTip.frame2_leftside) then
+		
+			local button = frame1.Lines [index]
+		
+			frame2:ClearAllPoints()
+			frame2:SetPoint ("right", button, "left")
+			
+		elseif (CoolTip.frame2_leftside) then
+			frame2:ClearAllPoints()
+			frame2:SetPoint ("bottomright", frame1, "bottomleft")
+		else
+			frame2:ClearAllPoints()
+			frame2:SetPoint ("bottomleft", frame1, "bottomright")
+		end
+		
+	end
+	
+	function CoolTip:HideSub()
+		DF:Fade (frame2, 1)
+	end	
+	
+
+	function CoolTip:LeftTextSpace (row)
+		row.leftText:SetWidth (row:GetWidth() - 30 - row.leftIcon:GetWidth() - row.rightIcon:GetWidth() - row.rightText:GetStringWidth())
+		row.leftText:SetHeight (10)
+	end
+
+	--> ~inicio ~start
+	function CoolTip:monta_tooltip()
+		
+		--> hide sub frame
+		DF:Fade (frame2, 1)
+		--> hide select bar
+		CoolTip:HideSelectedTexture (frame1)
+
+		frame1:EnableMouse (false)
+		
+		--> elevator
+		local yDown = 5
+		--> width
+		if (CoolTip.OptionsTable.FixedWidth) then
+			frame1:SetWidth (CoolTip.OptionsTable.FixedWidth)
+		end
+		
+		frame1.w = CoolTip.OptionsTable.FixedWidth or 0
+		frame1.hHeight = 0
+		frame2.hHeight = 0
+		
+		CoolTip.active = true
+
+		for i = 1, CoolTip.Indexes do
+		
+			local button = frame1.Lines [i]
+			if (not button) then
+				button = CoolTip:NewMainButton (i)
+			end
+			
+			button.index = i
+			
+			--> basic stuff
+			button:Show()
+			button.background:Hide()
+			button:SetHeight (CoolTip.OptionsTable.ButtonHeightMod or CoolTip.default_height)
+			button:RegisterForClicks()
+
+			--> setup texts and icons
+			CoolTip:TextAndIcon (i, frame1, button, CoolTip.LeftTextTable [i], CoolTip.RightTextTable [i], CoolTip.LeftIconTable [i], CoolTip.RightIconTable [i])
+			--> setup statusbar
+			CoolTip:StatusBar (button, CoolTip.StatusBarTable [i])
+		end
+		
+		--> hide unused lines
+		for i = CoolTip.Indexes+1, #frame1.Lines do 
+			frame1.Lines[i]:Hide()
+		end
+		CoolTip.NumLines = CoolTip.Indexes
+
+		local spacing = 0
+		if (CoolTip.OptionsTable.YSpacingMod) then
+			spacing = CoolTip.OptionsTable.YSpacingMod
+		end
+		
+		--> normalize height of all rows
+		local temp = -6 + spacing + (CoolTip.OptionsTable.ButtonsYMod or 0)
+		for i = 1, CoolTip.Indexes do 
+			local menuButton = frame1.Lines [i]
+			
+			menuButton:ClearAllPoints()
+			menuButton:SetPoint ("center", frame1, "center")
+			menuButton:SetPoint ("left", frame1, "left")
+			menuButton:SetPoint ("right", frame1, "right")
+			
+			--> height
+			if (CoolTip.OptionsTable.AlignAsBlizzTooltip) then
+				local height = _math_max (8, menuButton.leftText:GetStringHeight(), menuButton.rightText:GetStringHeight(), menuButton.leftIcon:GetHeight(), menuButton.rightIcon:GetHeight())
+				menuButton:SetHeight (height)
+				menuButton:SetPoint ("top", frame1, "top", 0, temp)
+				temp = temp + ( height * -1)
+				
+			elseif (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then
+			
+				local height = _math_max (menuButton.leftText:GetStringHeight(), menuButton.rightText:GetStringHeight(), menuButton.leftIcon:GetHeight(), menuButton.rightIcon:GetHeight())
+				menuButton:SetHeight (height)
+				menuButton:SetPoint ("top", frame1, "top", 0, temp)
+				
+				temp = temp + ( height * -1) + spacing + (CoolTip.OptionsTable.ButtonsYMod or 0)
+				
+			else
+				menuButton:SetHeight (frame1.hHeight + (CoolTip.OptionsTable.ButtonHeightMod or 0))
+				menuButton:SetPoint ("top", frame1, "top", 0, ( ( (i-1) * frame1.hHeight) * -1) - 6 + (CoolTip.OptionsTable.ButtonsYMod or 0) + spacing)
+			end
+			
+			--> points
+			
+			if (CoolTip.OptionsTable.YSpacingMod and not CoolTip.OptionsTable.IgnoreButtonAutoHeight) then
+				spacing = spacing + CoolTip.OptionsTable.YSpacingMod
+			end
+			
+			menuButton:EnableMouse (false)
+		end
+		
+		if (not CoolTip.OptionsTable.FixedWidth) then
+			if (CoolTip.Type == 2) then --> with bars
+				if (CoolTip.OptionsTable.MinWidth) then
+					local w = frame1.w + 34
+					frame1:SetWidth (math.max (w, CoolTip.OptionsTable.MinWidth))
+				else
+					frame1:SetWidth (frame1.w + 34)
+				end
+			else
+				--> width stability check
+				local width = frame1.w + 24
+				if (width > CoolTip.LastSize-5 and width < CoolTip.LastSize+5) then
+					width = CoolTip.LastSize
+				else
+					CoolTip.LastSize = width
+				end
+				
+				if (CoolTip.OptionsTable.MinWidth) then
+					frame1:SetWidth (math.max (width, CoolTip.OptionsTable.MinWidth))
+				else
+					frame1:SetWidth (width)
+				end
+			end
+		end
+		
+		if (CoolTip.OptionsTable.FixedHeight) then
+			frame1:SetHeight (CoolTip.OptionsTable.FixedHeight)
+		else
+			if (CoolTip.OptionsTable.AlignAsBlizzTooltip) then
+				frame1:SetHeight ( (temp-10) * -1)
+			elseif (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then
+				frame1:SetHeight ( (temp+spacing) * -1)
+			else
+				frame1:SetHeight ( _math_max ( (frame1.hHeight * CoolTip.Indexes) + 12, 22 ))
+			end
+		end
+
+		if (CoolTip.WallpaperTable [1]) then
+			CoolTip:SetupWallpaper (CoolTip.WallpaperTable, frame1.frameWallpaper)
+		else
+			frame1.frameWallpaper:Hide()
+		end
+		
+		--> unhide frame
+		DF:Fade (frame1, 0)
+		CoolTip:SetMyPoint (host)
+		
+		--> fix sparks
+		for i = 1, CoolTip.Indexes do 
+			local menuButton = frame1.Lines [i]
+			if (menuButton.spark:IsShown() or menuButton.spark2:IsShown()) then
+				CoolTip:RefreshSpark (menuButton)
+			end
+		end
+	end
+
+	function CoolTip:CreateDivBar (button)
+		button.divbar = button:CreateTexture (nil, "overlay")
+		
+		button.divbar:SetTexture ([[Interface\QUESTFRAME\AutoQuest-Parts]])
+		button.divbar:SetTexCoord (238/512, 445/512, 0/64, 4/64)
+		
+		button.divbar:SetHeight (3)
+		button.divbar:SetAlpha (0.1)
+		
+		button.divbar:SetDesaturated (true)
+	end
+	
+	--> ~inicio ~start
+	function CoolTip:monta_cooltip (host, instancia, options, sub_menus, icones, tamanho1, tamanho2, font, fontsize)
+
+		if (CoolTip.Indexes == 0) then
+			CoolTip:Reset()
+			CoolTip:SetType ("tooltip")
+			CoolTip:AddLine ("There is no options.")
+			CoolTip:ShowCooltip()
+			return
+		end
+		
+		if (CoolTip.OptionsTable.FixedWidth) then
+			frame1:SetWidth (CoolTip.OptionsTable.FixedWidth)
+		end	
+		
+		frame1.w = CoolTip.OptionsTable.FixedWidth or 0
+		frame1.hHeight = 0
+		frame2.hHeight = 0
+		
+		frame1:EnableMouse (true)
+		
+		if (CoolTip.HaveSubMenu) then --> zera o segundo frame
+			frame2.w = 0
+			frame2:SetHeight (6)
+			if (CoolTip.SelectedIndexMain and CoolTip.IndexesSub [CoolTip.SelectedIndexMain] and CoolTip.IndexesSub [CoolTip.SelectedIndexMain] > 0) then
+				DF:Fade (frame2, 0)
+			else
+				DF:Fade (frame2, 1)
+			end
+		else
+			DF:Fade (frame2, 1)
+		end
+		
+		CoolTip.active = true
+		
+		for i = 1, CoolTip.Indexes do
+			local menuButton = frame1.Lines [i]
+			if (not menuButton) then
+				menuButton = CoolTip:NewMainButton (i)
+			end
+			
+			CoolTip:SetupMainButton (menuButton, i)
+		
+			menuButton.background:Hide()
+		end
+
+		--> selected texture
+		if (CoolTip.SelectedIndexMain) then
+			CoolTip:SetSelectedAnchor (frame1, frame1.Lines [CoolTip.SelectedIndexMain])
+
+			if (CoolTip.OptionsTable.NoLastSelectedBar) then
+				CoolTip:HideSelectedTexture (frame1)
+			else
+				CoolTip:ShowSelectedTexture (frame1)
+			end
+		else
+			CoolTip:HideSelectedTexture (frame1)
+		end
+
+		if (CoolTip.Indexes < #frame1.Lines) then
+			for i = CoolTip.Indexes+1, #frame1.Lines do
+				frame1.Lines[i]:Hide()
+			end
+		end
+		
+		CoolTip.NumLines = CoolTip.Indexes
+
+		local spacing = 0
+		if (CoolTip.OptionsTable.YSpacingMod) then
+			spacing = CoolTip.OptionsTable.YSpacingMod
+		end
+		
+		if (not CoolTip.OptionsTable.FixedWidth) then
+			if (CoolTip.OptionsTable.MinWidth) then
+				local w = frame1.w + 24
+				frame1:SetWidth (math.max (w, CoolTip.OptionsTable.MinWidth))
+			else
+				frame1:SetWidth (frame1.w + 24)
+			end
+		end
+		
+		--> normalize height of all rows
+		for i = 1, CoolTip.Indexes do 
+			local menuButton = frame1.Lines [i]
+			menuButton:EnableMouse (true)
+			
+			if (menuButton.leftText:GetText() == "$div") then
+			
+				--> height
+				menuButton:SetHeight (4)
+				--> points
+				menuButton:ClearAllPoints()				
+				menuButton:SetPoint ("left", frame1, "left")
+				menuButton:SetPoint ("right", frame1, "right")
+				menuButton:SetPoint ("center", frame1, "center")
+				
+				local div_size_up = tonumber (CoolTip.LeftTextTable [i] [2])
+				if (not div_size_up) then
+					div_size_up = 0
+				end
+				local div_size_down = tonumber (CoolTip.LeftTextTable [i] [3])
+				if (not div_size_down) then
+					div_size_down = 0
+				end
+				
+				menuButton:SetPoint ("top", frame1, "top", 0, ( ( (i-1) * frame1.hHeight) * -1) - 4 + (CoolTip.OptionsTable.ButtonsYMod or 0) + spacing - 4 + div_size_up)
+				if (CoolTip.OptionsTable.YSpacingMod) then
+					spacing = spacing + CoolTip.OptionsTable.YSpacingMod
+				end
+				
+				spacing = spacing + 4 + div_size_down
+			
+				menuButton.leftText:SetText ("")
+				menuButton.isDiv = true
+				
+				if (not menuButton.divbar) then
+					CoolTip:CreateDivBar (menuButton)
+				else
+					menuButton.divbar:Show()
+				end
+				
+				menuButton.divbar:SetPoint ("left", menuButton, "left", frame1:GetWidth()*0.10, 0)
+				menuButton.divbar:SetPoint ("right", menuButton, "right", -frame1:GetWidth()*0.10, 0)
+
+			else
+			
+				--> height
+				menuButton:SetHeight (frame1.hHeight + (CoolTip.OptionsTable.ButtonHeightMod or 0))
+				--> points
+				menuButton:ClearAllPoints()
+				menuButton:SetPoint ("center", frame1, "center")
+				menuButton:SetPoint ("top", frame1, "top", 0, ( ( (i-1) * frame1.hHeight) * -1) - 4 + (CoolTip.OptionsTable.ButtonsYMod or 0) + spacing)
+				if (CoolTip.OptionsTable.YSpacingMod) then
+					spacing = spacing + CoolTip.OptionsTable.YSpacingMod
+				end
+				menuButton:SetPoint ("left", frame1, "left")
+				menuButton:SetPoint ("right", frame1, "right")
+			
+				if (menuButton.divbar) then
+					menuButton.divbar:Hide()
+					menuButton.isDiv = false
+				end
+			end
+
+		end
+
+		if (CoolTip.OptionsTable.FixedHeight) then
+			frame1:SetHeight (CoolTip.OptionsTable.FixedHeight)
+		else
+			local mod = CoolTip.OptionsTable.HeighMod or 0
+			frame1:SetHeight (_math_max ( (frame1.hHeight * CoolTip.Indexes) + 12 + (-spacing) + mod, 22 ))
+		end
+		
+		--> sub menu arrows
+		if (CoolTip.HaveSubMenu and not CoolTip.OptionsTable.IgnoreArrows and not CoolTip.OptionsTable.SubMenuIsTooltip) then
+			for i = 1, CoolTip.Indexes do
+				if (CoolTip.IndexesSub [i] and CoolTip.IndexesSub [i] > 0) then
+					frame1.Lines [i].statusbar.subMenuArrow:Show()
+				else
+					frame1.Lines [i].statusbar.subMenuArrow:Hide()
+				end
+			end
+			
+			frame1:SetWidth (frame1:GetWidth() + 16)
+		end
+		
+		frame1:ClearAllPoints()
+		CoolTip:SetMyPoint (host)
+		
+		if (CoolTip.title1) then
+			CoolTip.frame1.titleText:Show()
+			CoolTip.frame1.titleIcon:Show()
+			CoolTip.frame1.titleText:SetText (CoolTip.title_text)
+			CoolTip.frame1.titleIcon:SetWidth (frame1:GetWidth())
+			CoolTip.frame1.titleIcon:SetHeight (40)
+		end
+	
+		if (CoolTip.WallpaperTable [1]) then
+			CoolTip:SetupWallpaper (CoolTip.WallpaperTable, frame1.frameWallpaper)
+		else
+			frame1.frameWallpaper:Hide()
+		end
+	
+		DF:Fade (frame1, 0)
+
+		for i = 1, CoolTip.Indexes do
+			if (CoolTip.SelectedIndexMain and CoolTip.SelectedIndexMain == i) then
+				if (CoolTip.HaveSubMenu and CoolTip.IndexesSub [i] and CoolTip.IndexesSub [i] > 0) then
+					CoolTip:ShowSub (i)
+				end
+			end
+		end
+		
+		return true
+	end
+	
+	function CoolTip:SetMyPoint (host, x_mod, y_mod)
+	
+		local moveX = x_mod or 0
+		local moveY = y_mod or 0
+		
+		--> clear all points
+		frame1:ClearAllPoints()
+		
+		local anchor = CoolTip.OptionsTable.Anchor or CoolTip.Host
+		frame1:SetPoint (CoolTip.OptionsTable.MyAnchor, anchor, CoolTip.OptionsTable.RelativeAnchor, 0 + moveX + CoolTip.OptionsTable.WidthAnchorMod, 10 + CoolTip.OptionsTable.HeightAnchorMod + moveY)
+		
+		if (not x_mod) then
+			--> check if cooltip is out of screen bounds
+			local center_x = frame1:GetCenter()
+			
+			if (center_x) then
+				local screen_x_res = GetScreenWidth()
+				local half_x = frame1:GetWidth() / 2
+				
+				if (center_x+half_x > screen_x_res) then
+					--> out of right side
+					local move_to_left = (center_x + half_x) - screen_x_res
+					CoolTip.internal_x_mod = -move_to_left
+					return CoolTip:SetMyPoint (host, -move_to_left, 0)
+					
+				elseif (center_x-half_x < 0) then
+					--> out of left side
+					local move_to_right = center_x - half_x
+					CoolTip.internal_x_mod = move_to_right*-1
+					return CoolTip:SetMyPoint (host, move_to_right*-1, 0)
+				end
+			end
+		end
+		
+		if (not y_mod) then
+			--> check if cooltip is out of screen bounds
+			local _, center_y = frame1:GetCenter()
+			local screen_y_res = GetScreenHeight()
+			local half_y = frame1:GetHeight() / 2
+			
+			if (center_y) then
+				if (center_y+half_y > screen_y_res) then
+					--> out of top side
+					local move_to_down = (center_y + half_y) - screen_y_res
+					CoolTip.internal_y_mod = -move_to_down
+					return CoolTip:SetMyPoint (host, 0, -move_to_down)
+				
+				elseif (center_y-half_y < 0) then
+					--> out of bottom side
+					local move_to_up = center_y - half_y
+					CoolTip.internal_y_mod = move_to_up*-1
+					return CoolTip:SetMyPoint (host, 0, move_to_up*-1)
+					
+				end
+			end
+		end
+		
+		if (frame2:IsShown() and not CoolTip.overlap_checked) then
+
+			local frame_2_center_x = frame2:GetCenter()
+			if (frame_2_center_x) then
+				local frame_2_half_x = frame2:GetWidth() / 2
+				
+				local frame_1_center_x = frame1:GetCenter()
+				if (frame_1_center_x) then
+				
+					local frame_1_half_x = frame1:GetWidth() / 2
+				
+					local f1_end_point = frame_1_center_x + frame_1_half_x - 3
+					local f2_start_point = frame_2_center_x - frame_2_half_x
+				
+					if (f2_start_point < f1_end_point) then
+						local diff = f2_start_point - f1_end_point
+						CoolTip.overlap_checked = true
+						
+						frame2:ClearAllPoints()
+						frame2:SetPoint ("bottomright", frame1, "bottomleft")
+						CoolTip.frame2_leftside = true
+						--> diff
+						return CoolTip:SetMyPoint (host, CoolTip.internal_x_mod , CoolTip.internal_y_mod)
+					end
+				
+				end
+			end
+			
+		end
+		
+	end
+	
+	function CoolTip:CheckOverlap()
+		if (frame2:IsShown()) then
+
+			local frame_2_center_x = frame2:GetCenter()
+			if (frame_2_center_x) then
+				local frame_2_half_x = frame2:GetWidth() / 2
+				
+				local frame_1_center_x = frame1:GetCenter()
+				if (frame_1_center_x) then
+				
+					local frame_1_half_x = frame1:GetWidth() / 2
+				
+					local f1_end_point = frame_1_center_x + frame_1_half_x - 3
+					local f2_start_point = frame_2_center_x - frame_2_half_x
+				
+					if (f2_start_point < f1_end_point) then
+						local diff = f2_start_point - f1_end_point
+
+						frame2:ClearAllPoints()
+						frame2:SetPoint ("bottomright", frame1, "bottomleft")
+						CoolTip.frame2_leftside = true
+					end
+				
+				end
+			end
+			
+		end
+	end
+	
+	function CoolTip:GetText (buttonIndex)
+		local button1 = frame1.Lines [buttonIndex]
+		if (not button1) then
+			return "", ""
+		else
+			return button1.leftText:GetText() or "", button1.rightText:GetText() or ""
+		end
+	end
+	
+----------------------------------------------------------------------
+	--> Get the number of lines current shown on cooltip
+	
+	function CoolTip:GetNumLines()
+		return CoolTip.NumLines or 0
+	end
+
+----------------------------------------------------------------------
+	--> Remove all options actived
+	--> Set a option on current cooltip
+	
+		function CoolTip:ClearAllOptions()
+			for option, _ in pairs (CoolTip.OptionsTable) do 
+				CoolTip.OptionsTable [option] = nil
+			end
+			
+			CoolTip:SetOption ("MyAnchor", "bottom")
+			CoolTip:SetOption ("RelativeAnchor", "top")
+			CoolTip:SetOption ("WidthAnchorMod", 0)
+			CoolTip:SetOption ("HeightAnchorMod", 0)
+		end
+		
+		function CoolTip:SetOption (option, value)
+			--> check if this options exists
+			if (not CoolTip.OptionsList [option]) then
+				return --> error
+			end
+			
+			--> set options
+			CoolTip.OptionsTable [option] = value
+		end
+
+----------------------------------------------------------------------
+	--> set the anchor of cooltip
+	--> parameters: frame  [, cooltip anchor point, frame anchor point [, x mod, y mod]]
+	--> frame [, x mod, y mod]
+	
+		--> alias
+		function CoolTip:GetOwner()
+			return CoolTip.Host
+		end
+		
+		function CoolTip:SetOwner (frame, myPoint, hisPoint, x, y)
+			return CoolTip:SetHost (frame, myPoint, hisPoint, x, y)
+		end
+	
+		function CoolTip:SetHost (frame, myPoint, hisPoint, x, y)
+			--> check data integrity
+			if (type (frame) ~= "table" or not frame.GetObjectType) then
+				print ("host need to be a frame")
+				return --> error
+			end
+			
+			CoolTip.Host = frame
+
+			CoolTip.frame1:SetFrameLevel (frame:GetFrameLevel()+1)
+			
+			--> defaults
+			myPoint = myPoint or CoolTip.OptionsTable.MyAnchor or "bottom"
+			hisPoint = hisPoint or CoolTip.OptionsTable.hisPoint or "top"
+
+			x = x or CoolTip.OptionsTable.WidthAnchorMod or 0
+			y = y or CoolTip.OptionsTable.HeightAnchorMod or 0
+			
+			--> check options
+			if (type (myPoint) == "string") then
+				CoolTip:SetOption ("MyAnchor", myPoint)
+				CoolTip:SetOption ("WidthAnchorMod", x)
+			elseif (type (myPoint) == "number") then
+				CoolTip:SetOption ("HeightAnchorMod", myPoint)
+			end
+			
+			if (type (hisPoint) == "string") then
+				CoolTip:SetOption ("RelativeAnchor", hisPoint)
+				CoolTip:SetOption ("HeightAnchorMod", y)
+			elseif (type (hisPoint) == "number") then
+				CoolTip:SetOption ("WidthAnchorMod", hisPoint)
+			end
+		end
+
+----------------------------------------------------------------------
+	--> set cooltip type
+	--> parameters: type (1 = tooltip | 2 = tooltip with bars | 3 = menu)
+	
+		function CoolTip:IsMenu()
+			return CoolTip.frame1:IsShown() and CoolTip.Type == 3
+		end
+		
+		function CoolTip:IsTooltip()
+			return CoolTip.frame1:IsShown() and (CoolTip.Type == 1 or CoolTip.Type == 2)
+		end
+	
+		function CoolTip:GetType()
+			if (CoolTip.Type == 1 or CoolTip.Type == 2) then
+				return "tooltip"
+			elseif (CoolTip.Type == 3) then
+				return "menu"
+			else
+				return "none"
+			end
+		end
+	
+		function CoolTip:SetType (newType)
+			if (type (newType) == "string") then
+				if (newType == "tooltip") then
+					CoolTip.Type = 1
+				elseif (newType == "tooltipbar") then
+					CoolTip.Type = 2
+				elseif (newType == "menu") then
+					CoolTip.Type = 3
+				else
+					--> error
+				end
+			elseif (type (newType) == "number") then
+				if (newType == 1) then
+					CoolTip.Type = 1
+				elseif (newType == 2) then
+					CoolTip.Type = 2
+				elseif (newType == 3) then
+					CoolTip.Type = 3
+				else
+					--> error
+				end
+			else
+				--> error
+			end
+		end
+	
+	--> Set a fixed value for menu
+		function CoolTip:SetFixedParameter (value, injected)
+			if (injected ~= nil) then
+				local frame = value
+				if (frame.dframework) then
+					frame = frame.widget
+				end
+				if (frame.CoolTip) then
+					frame.CoolTip.FixedValue = injected
+				else
+					--debug
+				end
+			end
+			CoolTip.FixedValue = value
+		end
+		
+		function CoolTip:SetColor (menuType, ...)
+			local ColorR, ColorG, ColorB, ColorA = DF:ParseColors (...)
+			if ((type (menuType) == "string" and menuType == "main") or (type (menuType) == "number" and menuType == 1)) then
+				frame1.framebackgroundLeft:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				frame1.framebackgroundRight:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				frame1.framebackgroundCenter:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				
+			elseif ((type (menuType) == "string" and menuType == "sec") or (type (menuType) == "number" and menuType == 2)) then
+				frame2.framebackgroundLeft:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				frame2.framebackgroundRight:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				frame2.framebackgroundCenter:SetVertexColor (ColorR, ColorG, ColorB, ColorA)
+				
+			else
+				return --> error
+			end
+		end
+		
+	--> Set last selected option
+		function CoolTip:SetLastSelected (menuType, index, index2)
+		
+			if (CoolTip.Type == 3) then
+				if ((type (menuType) == "string" and menuType == "main") or (type (menuType) == "number" and menuType == 1)) then
+					CoolTip.SelectedIndexMain = index
+				elseif ((type (menuType) == "string" and menuType == "sec") or (type (menuType) == "number" and menuType == 2)) then
+					CoolTip.SelectedIndexSec [index] = index2
+				else
+					return --> error
+				end
+			else
+				return --> error
+			end
+		end
+
+		--> serack key: ~select
+		function CoolTip:Select (menuType, option, mainIndex)
+			if (menuType == 1) then --main menu
+				local botao = frame1.Lines [option]
+				CoolTip.buttonClicked = true
+				CoolTip:SetSelectedAnchor (frame1, botao)
+
+				--UIFrameFlash (frame1.selected, 0.05, 0.05, 0.2, true, 0, 0)
+				
+			elseif (menuType == 2) then --sub menu
+				CoolTip:ShowSub (mainIndex)
+				local botao = frame2.Lines [option]
+				CoolTip.buttonClicked = true
+				
+				CoolTip:SetSelectedAnchor (frame2, botao)
+			end
+		end
+	
+----------------------------------------------------------------------
+	--> Reset cooltip
+	
+	local default_backdrop = {bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]], edgeFile=[[Interface\Tooltips\UI-Tooltip-Border]], tile=true,
+	edgeSize=16, tileSize=16, insets = {left=3, right=3, top=4, bottom=4}}
+	local default_backdrop_color = {0.09019, 0.09019, 0.18823, 1}
+	local default_backdropborder_color = {1, 1, 1, 1}
+	
+	--borda preta sem usar unpack
+	
+		--> wipe all data ~reset
+		function CoolTip:Reset()
+
+			frame2:ClearAllPoints()
+			frame2:SetPoint ("bottomleft", frame1, "bottomright")
+		
+			CoolTip:HideSelectedTexture (frame1)
+			CoolTip:HideSelectedTexture (frame2)
+		
+			CoolTip.FixedValue = nil
+			CoolTip.HaveSubMenu = false
+			
+			CoolTip.SelectedIndexMain = nil
+			_table_wipe (CoolTip.SelectedIndexSec)
+			
+			CoolTip.Indexes =  0
+			CoolTip.SubIndexes = 0
+			_table_wipe (CoolTip.IndexesSub)
+			
+			CoolTip.internal_x_mod = 0
+			CoolTip.internal_y_mod = 0
+			CoolTip.current_anchor = nil
+			CoolTip.overlap_checked = false
+			
+			CoolTip.frame2_leftside = nil
+
+			frame1:SetBackdrop (default_backdrop)
+			frame1:SetBackdropColor (unpack (default_backdrop_color))
+			frame1:SetBackdropBorderColor (unpack (default_backdropborder_color))
+			
+			frame2:SetBackdrop (default_backdrop)
+			frame2:SetBackdropColor (unpack (default_backdrop_color))
+			frame2:SetBackdropBorderColor (unpack (default_backdropborder_color))
+
+			--[
+			_table_wipe (CoolTip.LeftTextTable)
+			_table_wipe (CoolTip.LeftTextTableSub)
+			_table_wipe (CoolTip.RightTextTable)
+			_table_wipe (CoolTip.RightTextTableSub)
+			
+			_table_wipe (CoolTip.LeftIconTable)
+			_table_wipe (CoolTip.LeftIconTableSub)
+			_table_wipe (CoolTip.RightIconTable)
+			_table_wipe (CoolTip.RightIconTableSub)
+
+			_table_wipe (CoolTip.StatusBarTable)
+			_table_wipe (CoolTip.StatusBarTableSub)
+			
+			_table_wipe (CoolTip.FunctionsTableMain)
+			_table_wipe (CoolTip.FunctionsTableSub)
+			
+			_table_wipe (CoolTip.ParametersTableMain)
+			_table_wipe (CoolTip.ParametersTableSub)
+			
+			_table_wipe (CoolTip.WallpaperTable)
+			_table_wipe (CoolTip.WallpaperTableSub)
+			--]]
+			
+			_table_wipe (CoolTip.TopIconTableSub)
+			CoolTip.Banner [1] = false
+			CoolTip.Banner [2] = false
+			CoolTip.Banner [3] = false
+			
+			frame1.upperImage:Hide()
+			frame1.upperImage2:Hide()
+			frame1.upperImageText:Hide()
+			frame1.upperImageText2:Hide()
+			
+			frame1.frameWallpaper:Hide()
+			frame2.frameWallpaper:Hide()
+			
+			frame2.upperImage:Hide()
+
+			CoolTip.title1 = nil
+			CoolTip.title_text = nil
+			
+			CoolTip.frame1.titleText:Hide()
+			CoolTip.frame1.titleIcon:Hide()
+			
+			CoolTip:ClearAllOptions()
+			CoolTip:SetColor (1, "transparent")
+			CoolTip:SetColor (2, "transparent")
+			
+			local f1Lines = frame1.Lines
+			for i = 1, #f1Lines do
+				f1Lines [i].statusbar.subMenuArrow:Hide()
+			end
+		end
+
+----------------------------------------------------------------------
+	--> Menu functions
+	
+		local _default_color = {1, 1, 1}
+		local _default_point = {"center", "center", 0, -3}
+		
+		function CoolTip:AddMenu (menuType, func, param1, param2, param3, leftText, leftIcon, indexUp)
+		
+			if (leftText and indexUp and ((type (menuType) == "string" and menuType == "main") or (type (menuType) == "number" and menuType == 1))) then
+				CoolTip.Indexes = CoolTip.Indexes + 1
+				
+				if (not CoolTip.IndexesSub [CoolTip.Indexes]) then
+					CoolTip.IndexesSub [CoolTip.Indexes] = 0
+				end
+				
+				CoolTip.SubIndexes = 0
+			end
+		
+			--> need a previous line
+			if (CoolTip.Indexes == 0) then
+				print ("Indexes are 0")
+				return --> return error
+			end
+			
+			--> check data integrity
+			if (type (func) ~= "function") then
+				print ("No function")
+				return --> erroe
+			end
+			
+			--> add
+			
+				if ((type (menuType) == "string" and menuType == "main") or (type (menuType) == "number" and menuType == 1)) then
+
+					local parameterTable
+					if (CoolTip.isSpecial) then
+						parameterTable = {}
+						_table_insert (CoolTip.FunctionsTableMain, CoolTip.Indexes, func)
+						_table_insert (CoolTip.ParametersTableMain, CoolTip.Indexes, parameterTable)
+					else
+					
+						CoolTip.FunctionsTableMain [CoolTip.Indexes] = func
+						
+						parameterTable = CoolTip.ParametersTableMain [CoolTip.Indexes]
+						if (not parameterTable) then
+							parameterTable = {}
+							CoolTip.ParametersTableMain [CoolTip.Indexes] = parameterTable
+						end
+					end
+					
+					parameterTable [1] = param1
+					parameterTable [2] = param2
+					parameterTable [3] = param3
+					
+					if (leftIcon) then
+						local iconTable = CoolTip.LeftIconTable [CoolTip.Indexes]
+						
+						if (not iconTable or CoolTip.isSpecial) then
+							iconTable = {}
+							CoolTip.LeftIconTable [CoolTip.Indexes] = iconTable
+						end
+						
+						iconTable [1] = leftIcon
+						iconTable [2] = 16 --> default 16
+						iconTable [3] = 16 --> default 16
+						iconTable [4] = 0 --> default 0
+						iconTable [5] = 1 --> default 1
+						iconTable [6] = 0 --> default 0
+						iconTable [7] = 1 --> default 1
+						iconTable [8] = _default_color
+					end
+					
+					if (leftText) then
+						local lineTable_left = CoolTip.LeftTextTable [CoolTip.Indexes]
+
+						if (not lineTable_left or CoolTip.isSpecial) then
+							lineTable_left = {}
+							CoolTip.LeftTextTable [CoolTip.Indexes] = lineTable_left
+						end
+
+						lineTable_left [1] = leftText --> line text
+						lineTable_left [2] = 0
+						lineTable_left [3] = 0
+						lineTable_left [4] = 0
+						lineTable_left [5] = 0
+						lineTable_left [6] = false
+						lineTable_left [7] = false
+						lineTable_left [8] = false
+
+					end
+					
+				elseif ((type (menuType) == "string" and menuType == "sec") or (type (menuType) == "number" and menuType == 2)) then
+					
+					if (CoolTip.SubIndexes == 0) then
+						if (not indexUp or not leftText) then
+							print ("not indexUp or not leftText")
+							return --> error
+						end
+					end
+					
+					if (indexUp and leftText) then
+						CoolTip.SubIndexes = CoolTip.SubIndexes + 1
+						CoolTip.IndexesSub [CoolTip.Indexes] = CoolTip.IndexesSub [CoolTip.Indexes] + 1
+					elseif (indexUp and not leftText) then
+						print ("indexUp and not leftText")
+						return --> error [leftText can't be nil if indexUp are true]
+					end
+					
+					--> menu container
+					local subMenuContainerParameters = CoolTip.ParametersTableSub [CoolTip.Indexes]
+					if (not subMenuContainerParameters) then
+						subMenuContainerParameters = {}
+						CoolTip.ParametersTableSub [CoolTip.Indexes] = subMenuContainerParameters
+					end
+					
+					local subMenuContainerFunctions = CoolTip.FunctionsTableSub [CoolTip.Indexes]
+					if (not subMenuContainerFunctions or CoolTip.isSpecial) then
+						subMenuContainerFunctions = {}
+						CoolTip.FunctionsTableSub [CoolTip.Indexes] = subMenuContainerFunctions
+					end
+					
+					--> menu table
+					local subMenuTablesParameters = subMenuContainerParameters [CoolTip.SubIndexes]
+					if (not subMenuTablesParameters or CoolTip.isSpecial) then
+						subMenuTablesParameters = {}
+						subMenuContainerParameters [CoolTip.SubIndexes] = subMenuTablesParameters
+					end
+
+					--> add
+					subMenuContainerFunctions [CoolTip.SubIndexes] = func
+					
+					subMenuTablesParameters [1] = param1
+					subMenuTablesParameters [2] = param2
+					subMenuTablesParameters [3] = param3
+					
+					--> text and icon
+					if (leftIcon) then
+					
+						local subMenuContainerIcons = CoolTip.LeftIconTableSub [CoolTip.Indexes]
+						if (not subMenuContainerIcons) then
+							subMenuContainerIcons = {}
+							CoolTip.LeftIconTableSub [CoolTip.Indexes] = subMenuContainerIcons
+						end
+						local subMenuTablesIcons = subMenuContainerIcons [CoolTip.SubIndexes]
+						if (not subMenuTablesIcons or CoolTip.isSpecial) then
+							subMenuTablesIcons = {}
+							subMenuContainerIcons [CoolTip.SubIndexes] = subMenuTablesIcons
+						end
+					
+						subMenuTablesIcons [1] = leftIcon
+						subMenuTablesIcons [2] = 16 --> default 16
+						subMenuTablesIcons [3] = 16 --> default 16
+						subMenuTablesIcons [4] = 0 --> default 0
+						subMenuTablesIcons [5] = 1 --> default 1
+						subMenuTablesIcons [6] = 0 --> default 0
+						subMenuTablesIcons [7] = 1 --> default 1
+						subMenuTablesIcons [8] = _default_color
+					end
+					
+					if (leftText) then
+					
+						local subMenuContainerTexts = CoolTip.LeftTextTableSub [CoolTip.Indexes]
+						if (not subMenuContainerTexts) then
+							subMenuContainerTexts = {}
+							CoolTip.LeftTextTableSub [CoolTip.Indexes] = subMenuContainerTexts
+						end
+						local subMenuTablesTexts = subMenuContainerTexts [CoolTip.SubIndexes]
+						if (not subMenuTablesTexts or CoolTip.isSpecial) then
+							subMenuTablesTexts = {}
+							subMenuContainerTexts [CoolTip.SubIndexes] = subMenuTablesTexts
+						end
+						
+						subMenuTablesTexts [1] = leftText --> line text
+						subMenuTablesTexts [2] = 0
+						subMenuTablesTexts [3] = 0
+						subMenuTablesTexts [4] = 0
+						subMenuTablesTexts [5] = 0
+						subMenuTablesTexts [6] = false
+						subMenuTablesTexts [7] = false
+						subMenuTablesTexts [8] = false
+						
+					end
+					
+					CoolTip.HaveSubMenu = true
+
+				else
+					return --> error
+				end
+		end
+
+----------------------------------------------------------------------
+	--> adds a statusbar to the last line added.
+	--> only works with cooltip type 2 (tooltip with bars)
+	--> parameters: value [, color red, color green, color blue, color alpha [, glow]]
+	--> can also use a table or html color name in color red and send glow in color green
+	
+		function CoolTip:AddStatusBar (statusbarValue, frame, ColorR, ColorG, ColorB, ColorA, statusbarGlow, backgroundBar)
+		
+			--> need a previous line
+			if (CoolTip.Indexes == 0) then
+				return --> return error
+			end
+		
+			--> check data integrity
+			if (type (statusbarValue) ~= "number") then
+				return --> error
+			end
+		
+			if (type (ColorR) == "table" or type (ColorR) == "string") then
+				statusbarGlow, backgroundBar, ColorR, ColorG, ColorB, ColorA = ColorG, ColorB, DF:ParseColors (ColorR)
+			elseif (type (ColorR) == "boolean") then
+				backgroundBar = ColorG
+				statusbarGlow = ColorR
+				ColorR, ColorG, ColorB, ColorA = 1, 1, 1, 1
+			else
+				--> error
+			end
+			
+			--> add
+			local frameTable
+			local statusbarTable
+			
+			if (not frame or (type (frame) == "string" and frame == "main") or (type (frame) == "number" and frame == 1)) then
+				frameTable = CoolTip.StatusBarTable
+				
+				if (CoolTip.isSpecial) then
+					statusbarTable = {}
+					_table_insert (frameTable, CoolTip.Indexes, statusbarTable)
+				else
+					statusbarTable = frameTable [CoolTip.Indexes]
+					if (not statusbarTable) then
+						statusbarTable = {}
+						_table_insert (frameTable, CoolTip.Indexes, statusbarTable)
+						--frameTable [CoolTip.Indexes] = statusbarTable
+					end
+				end
+				
+			elseif ((type (frame) == "string" and frame == "sub") or (type (frame) == "number" and frame == 2)) then
+			
+				frameTable = CoolTip.StatusBarTableSub
+				
+				local subMenuContainerStatusBar = frameTable [CoolTip.Indexes]
+				if (not subMenuContainerStatusBar) then
+					subMenuContainerStatusBar = {}
+					frameTable [CoolTip.Indexes] = subMenuContainerStatusBar
+				end
+				
+				if (CoolTip.isSpecial) then
+					statusbarTable = {}
+					_table_insert (subMenuContainerStatusBar, CoolTip.SubIndexes, statusbarTable)
+				else
+					statusbarTable = subMenuContainerStatusBar [CoolTip.SubIndexes]
+					if (not statusbarTable) then
+						statusbarTable = {}
+						_table_insert (subMenuContainerStatusBar, CoolTip.SubIndexes, statusbarTable)
+					end
+				end
+			else
+				print ("unknow frame")
+				return --> error
+			end
+
+			statusbarTable [1] = statusbarValue
+			statusbarTable [2] = ColorR
+			statusbarTable [3] = ColorG
+			statusbarTable [4] = ColorB
+			statusbarTable [5] = ColorA
+			statusbarTable [6] = statusbarGlow
+			statusbarTable [7] = backgroundBar
+			
+		end
+
+		frame1.frameWallpaper:Hide()
+		frame2.frameWallpaper:Hide()
+		
+		function CoolTip:SetWallpaper (index, texture, texcoord, color, desaturate)
+		
+			if (CoolTip.Indexes == 0) then
+				return --> return error
+			end
+		
+			local frameTable
+			local wallpaperTable
+			
+			if ( (type (index) == "number" and index == 1) or (type (index) == "string" and index == "main") ) then
+				wallpaperTable = CoolTip.WallpaperTable
+
+			elseif ( (type (index) == "number" and index == 2) or (type (index) == "string" and index == "sub") ) then
+				frameTable = CoolTip.WallpaperTableSub
+				
+				local subMenuContainerWallpapers = frameTable [CoolTip.Indexes]
+				if (not subMenuContainerWallpapers) then
+					subMenuContainerWallpapers = {}
+					frameTable [CoolTip.Indexes] = subMenuContainerWallpapers
+				end
+				
+				wallpaperTable = subMenuContainerWallpapers
+			end
+			
+			wallpaperTable [1] = texture
+			if (texcoord) then
+				wallpaperTable [2] = texcoord [1]
+				wallpaperTable [3] = texcoord [2]
+				wallpaperTable [4] = texcoord [3]
+				wallpaperTable [5] = texcoord [4]
+			else
+				wallpaperTable [2] = 0
+				wallpaperTable [3] = 1
+				wallpaperTable [4] = 0
+				wallpaperTable [5] = 1
+			end
+			wallpaperTable [6] = color
+			wallpaperTable [7] = desaturate
+		end
+		
+		function CoolTip:SetBannerText (index, text, anchor, color, fontsize, fontface, fontflag)
+			local fontstring
+			
+			if (index == 1) then
+				fontstring = frame1.upperImageText
+			elseif (index == 2) then
+				fontstring = frame1.upperImageText2
+			end
+			
+			fontstring:SetText (text or "")
+			
+			if (anchor and index == 1) then
+				local myAnchor, hisAnchor, x, y = unpack (anchor)
+				fontstring:SetPoint (myAnchor, frame1.upperImage, hisAnchor or myAnchor, x or 0, y or 0)
+			elseif (anchor and index == 2) then
+				local myAnchor, hisAnchor, x, y = unpack (anchor)
+				fontstring:SetPoint (myAnchor, frame1, hisAnchor or myAnchor, x or 0, y or 0)
+			end
+			
+			if (color) then
+				local r, g, b, a = DF:ParseColors (color)
+				fontstring:SetTextColor (r, g, b, a)
+			end
+			
+			local face, size, flags = fontstring:GetFont()
+			face = fontface or [[Fonts\FRIZQT__.TTF]]
+			size = fontsize or 13
+			flags = fontflag or nil
+			fontstring:SetFont (face, size, flags)
+			fontstring:Show()
+		end
+		
+		function CoolTip:SetBackdrop (index, backdrop, backdropcolor, bordercolor)
+			
+			local f
+			if (index == 1) then
+				f = frame1
+			elseif (index == 2) then
+				f = frame2
+			end
+			
+			if (backdrop) then
+				f:SetBackdrop (backdrop)
+			end
+			if (backdropcolor) then
+				local r, g, b, a = DF:ParseColors (backdropcolor)
+				f:SetBackdropColor (r, g, b, a)
+			end
+			if (bordercolor) then
+				local r, g, b, a = DF:ParseColors (bordercolor)
+				f:SetBackdropBorderColor (r, g, b, a)
+			end
+			
+		end
+		
+		function CoolTip:SetBannerImage (index, texturepath, width, height, anchor, texcoord, overlay)
+			
+			local texture
+		
+			if (index == 1) then
+				texture = frame1.upperImage
+			elseif (index == 2) then
+				texture = frame1.upperImage2
+			end
+			
+			if (texturepath) then
+				texture:SetTexture (texturepath)
+			end
+			
+			if (width) then
+				texture:SetWidth (width)
+			end
+			if (height) then
+				texture:SetHeight (height)
+			end
+			
+			if (anchor) then
+				if (type (anchor[1]) == "table") then
+					for _, t in _ipairs (anchor) do
+						local myAnchor, hisAnchor, x, y = unpack (t)
+						texture:SetPoint (myAnchor, frame1, hisAnchor or myAnchor, x or 0, y or 0)
+					end
+				else
+					local myAnchor, hisAnchor, x, y = unpack (anchor)
+					texture:SetPoint (myAnchor, frame1, hisAnchor or myAnchor, x or 0, y or 0)
+				end
+			end
+			
+			if (texcoord) then
+				local L, R, T, B = unpack (texcoord)
+				texture:SetTexCoord (L, R, T, B)
+			end
+			
+			if (overlay) then
+				texture:SetVertexColor (unpack (overlay))
+			end
+			
+			CoolTip.Banner [index] = true
+			texture:Show()
+
+		end
+		
+----------------------------------------------------------------------
+	--> adds a icon to the last line added.
+	--> only works with cooltip type 1 and 2 (tooltip and tooltip with bars)
+	--> parameters: icon [, width [, height [, TexCoords L R T B ]]]
+	--> texture support string path or texture object
+	
+		function CoolTip:AddTexture (iconTexture, frame, side, iconWidth, iconHeight, L, R, T, B, overlayColor, point, desaturated)
+			return CoolTip:AddIcon (iconTexture, frame, side, iconWidth, iconHeight, L, R, T, B, overlayColor, point, desaturated)
+		end
+		function CoolTip:AddIcon (iconTexture, frame, side, iconWidth, iconHeight, L, R, T, B, overlayColor, point, desaturated)
+
+			--> need a previous line
+			if (CoolTip.Indexes == 0) then
+				return --> return error
+			end
+			
+			--> check data integrity
+			if (type (iconTexture) ~= "string" and (type (iconTexture) ~= "table" or not iconTexture.GetObjectType or iconTexture:GetObjectType() ~= "Texture") ) then
+				return --> return error
+			end
+			
+			side = side or 1
+
+			local frameTable
+			local iconTable
+
+			if (not frame or (type (frame) == "string" and frame == "main") or (type (frame) == "number" and frame == 1)) then
+			
+				if (not side or (type (side) == "string" and side == "left") or (type (side) == "number" and side == 1)) then
+					frameTable = CoolTip.LeftIconTable
+					
+				elseif ((type (side) == "string" and side == "right") or (type (side) == "number" and side == 2)) then
+					frameTable = CoolTip.RightIconTable
+					
+				end
+				
+				if (CoolTip.isSpecial) then
+					iconTable = {}
+					_table_insert (frameTable, CoolTip.Indexes, iconTable)
+				else
+					iconTable = frameTable [CoolTip.Indexes]
+					if (not iconTable) then
+						iconTable = {}
+						_table_insert (frameTable, CoolTip.Indexes, iconTable)
+						--frameTable [CoolTip.Indexes] = iconTable
+					end
+				end
+				
+			elseif ((type (frame) == "string" and frame == "sub") or (type (frame) == "number" and frame == 2)) then
+			
+				if ((type (side) == "string" and side == "left") or (type (side) == "number" and side == 1)) then
+					frameTable = CoolTip.LeftIconTableSub
+				elseif ((type (side) == "string" and side == "right") or (type (side) == "number" and side == 2)) then
+					frameTable = CoolTip.RightIconTableSub
+				elseif ((type (side) == "string" and side == "top") or (type (side) == "number" and side == 3)) then
+					CoolTip.TopIconTableSub [CoolTip.Indexes] = CoolTip.TopIconTableSub [CoolTip.Indexes] or {}
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [1] = iconTexture
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [2] = iconWidth or 16
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [3] = iconHeight or 16
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [4] = L or 0 
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [5] = R or 1 
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [6] = T or 0 
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [7] = B or 1
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [8] = overlayColor or _default_color
+					CoolTip.TopIconTableSub [CoolTip.Indexes] [9] = desaturated
+					return
+				end
+				
+				local subMenuContainerIcons = frameTable [CoolTip.Indexes]
+				if (not subMenuContainerIcons) then
+					subMenuContainerIcons = {}
+					frameTable [CoolTip.Indexes] = subMenuContainerIcons
+				end
+				
+				if (CoolTip.isSpecial) then
+					iconTable = {}
+					subMenuContainerIcons [CoolTip.SubIndexes] = iconTable
+				else
+					iconTable = subMenuContainerIcons [CoolTip.SubIndexes]
+					if (not iconTable) then
+						iconTable = {}
+						subMenuContainerIcons [CoolTip.SubIndexes] = iconTable
+					end
+				end
+				
+			else
+				return --> error
+			end
+
+			iconTable [1] = iconTexture
+			iconTable [2] = iconWidth or 16 --> default 16
+			iconTable [3] = iconHeight or 16 --> default 16
+			iconTable [4] = L or 0 --> default 0
+			iconTable [5] = R or 1 --> default 1
+			iconTable [6] = T or 0 --> default 0
+			iconTable [7] = B or 1 --> default 1
+			iconTable [8] = overlayColor or _default_color --> default 1, 1, 1
+			iconTable [9] = desaturated
+			
+			return true
+		end
+	
+----------------------------------------------------------------------
+	--> adds a line.
+	--> only works with cooltip type 1 and 2 (tooltip and tooltip with bars)
+	--> parameters: left text, right text [, L color R, L color G, L color B, L color A [, R color R, R color G, R color B, R color A [, wrap]]] 
+	
+		--> alias
+		function CoolTip:AddDoubleLine (leftText, rightText, frame, ColorR1, ColorG1, ColorB1, ColorA1, ColorR2, ColorG2, ColorB2, ColorA2, fontSize, fontFace, fontFlag)
+			return CoolTip:AddLine (leftText, rightText, frame, ColorR1, ColorG1, ColorB1, ColorA1, ColorR2, ColorG2, ColorB2, ColorA2, fontSize, fontFace, fontFlag)
+		end
+		
+		--> adds a line for tooltips
+		function CoolTip:AddLine (leftText, rightText, frame, ColorR1, ColorG1, ColorB1, ColorA1, ColorR2, ColorG2, ColorB2, ColorA2, fontSize, fontFace, fontFlag)
+			
+			--> check data integrity
+			local t = type (leftText)
+			if (t ~= "string") then
+				if (t == "number") then
+					leftText = tostring (leftText)
+				else
+					leftText = ""
+				end
+			end
+			
+			local t = type (rightText)
+			if (t ~= "string") then
+				if (t == "number") then
+					rightText = tostring (rightText)
+				else
+					rightText = ""
+				end
+			end
+			
+			if (type (ColorR1) ~= "number") then
+				ColorR2, ColorG2, ColorB2, ColorA2, fontSize, fontFace, fontFlag = ColorG1, ColorB1, ColorA1, ColorR2, ColorG2, ColorB2, ColorA2
+				
+				if (type (ColorR1) == "boolean" or not ColorR1) then
+					ColorR1, ColorG1, ColorB1, ColorA1 = 0, 0, 0, 0
+				else
+					ColorR1, ColorG1, ColorB1, ColorA1 = DF:ParseColors (ColorR1)
+				end
+			end
+			
+			if (type (ColorR2) ~= "number") then
+				fontSize, fontFace, fontFlag = ColorG2, ColorB2, ColorA2
+				
+				if (type (ColorR2) == "boolean" or not ColorR2) then
+					ColorR2, ColorG2, ColorB2, ColorA2 = 0, 0, 0, 0
+				else
+					ColorR2, ColorG2, ColorB2, ColorA2 = DF:ParseColors (ColorR2)
+				end
+			end
+			
+			local frameTableLeft
+			local frameTableRight
+			local lineTable_left
+			local lineTable_right
+			
+			if (not frame or (type (frame) == "string" and frame == "main") or (type (frame) == "number" and frame == 1)) then
+			
+				CoolTip.Indexes = CoolTip.Indexes + 1
+			
+				if (not CoolTip.IndexesSub [CoolTip.Indexes]) then
+					CoolTip.IndexesSub [CoolTip.Indexes] = 0
+				end
+			
+				CoolTip.SubIndexes = 0
+			
+				frameTableLeft = CoolTip.LeftTextTable
+				frameTableRight = CoolTip.RightTextTable
+				
+				if (CoolTip.isSpecial) then
+					lineTable_left = {}
+					_table_insert (frameTableLeft, CoolTip.Indexes, lineTable_left)
+					lineTable_right = {}
+					_table_insert (frameTableRight, CoolTip.Indexes, lineTable_right)
+				else
+					lineTable_left = frameTableLeft [CoolTip.Indexes]
+					lineTable_right = frameTableRight [CoolTip.Indexes]
+					
+					if (not lineTable_left) then
+						lineTable_left = {}
+						_table_insert (frameTableLeft, CoolTip.Indexes, lineTable_left)
+					end
+					if (not lineTable_right) then
+						lineTable_right = {}
+						_table_insert (frameTableRight, CoolTip.Indexes, lineTable_right)
+					end
+				end
+
+			elseif ((type (frame) == "string" and frame == "sub") or (type (frame) == "number" and frame == 2)) then
+			
+				CoolTip.SubIndexes = CoolTip.SubIndexes + 1
+				CoolTip.IndexesSub [CoolTip.Indexes] = CoolTip.IndexesSub [CoolTip.Indexes] + 1
+				CoolTip.HaveSubMenu = true
+				
+				frameTableLeft = CoolTip.LeftTextTableSub
+				frameTableRight = CoolTip.RightTextTableSub
+				
+				local subMenuContainerTexts = frameTableLeft [CoolTip.Indexes]
+				if (not subMenuContainerTexts) then
+					subMenuContainerTexts = {}
+					_table_insert (frameTableLeft, CoolTip.Indexes, subMenuContainerTexts)
+				end
+				
+				if (CoolTip.isSpecial) then
+					lineTable_left = {}
+					_table_insert (subMenuContainerTexts, CoolTip.SubIndexes, lineTable_left)
+				else
+					lineTable_left = subMenuContainerTexts [CoolTip.SubIndexes]
+					if (not lineTable_left) then
+						lineTable_left = {}
+						--subMenuContainerTexts [CoolTip.SubIndexes] = lineTable_left
+						_table_insert (subMenuContainerTexts, CoolTip.SubIndexes, lineTable_left)
+					end
+				end
+
+				local subMenuContainerTexts = frameTableRight [CoolTip.Indexes]
+				if (not subMenuContainerTexts) then
+					subMenuContainerTexts = {}
+					_table_insert (frameTableRight, CoolTip.Indexes, subMenuContainerTexts)
+					--frameTableRight [CoolTip.Indexes] = subMenuContainerTexts
+				end
+				
+				if (CoolTip.isSpecial) then
+					lineTable_right = {}
+					_table_insert (subMenuContainerTexts, CoolTip.SubIndexes, lineTable_right)
+				else
+					lineTable_right = subMenuContainerTexts [CoolTip.SubIndexes]
+					if (not lineTable_right) then
+						lineTable_right = {}
+						_table_insert (subMenuContainerTexts, CoolTip.SubIndexes, lineTable_right)
+						--subMenuContainerTexts [CoolTip.SubIndexes] = lineTable_right
+					end
+				end
+			else
+				return --> error
+			end
+			
+			lineTable_left [1] = leftText --> line text
+			lineTable_left [2] = ColorR1
+			lineTable_left [3] = ColorG1
+			lineTable_left [4] = ColorB1
+			lineTable_left [5] = ColorA1
+			lineTable_left [6] = fontSize
+			lineTable_left [7] = fontFace
+			lineTable_left [8] = fontFlag
+			
+			lineTable_right [1] = rightText --> line text
+			lineTable_right [2] = ColorR2
+			lineTable_right [3] = ColorG2
+			lineTable_right [4] = ColorB2
+			lineTable_right [5] = ColorA2
+			lineTable_right [6] = fontSize
+			lineTable_right [7] = fontFace
+			lineTable_right [8] = fontFlag
+		end
+		
+		function CoolTip:AddSpecial (widgetType, index, subIndex, ...)
+		
+			local currentIndex = CoolTip.Indexes
+			local currentSubIndex = CoolTip.SubIndexes
+			CoolTip.isSpecial = true
+		
+			widgetType = string.lower (widgetType)
+			
+			if (widgetType == "line") then
+
+				if (subIndex) then
+					CoolTip.Indexes = index
+					CoolTip.SubIndexes = subIndex-1
+				else
+					CoolTip.Indexes = index-1
+				end
+				
+				CoolTip:AddLine (...)
+
+				if (subIndex) then
+					CoolTip.Indexes = currentIndex
+					CoolTip.SubIndexes = currentSubIndex+1
+				else
+					CoolTip.Indexes = currentIndex+1
+				end
+				
+			elseif (widgetType == "icon") then
+			
+				CoolTip.Indexes = index
+				if (subIndex) then
+					CoolTip.SubIndexes = subIndex
+				end		
+				
+				CoolTip:AddIcon (...)
+
+				CoolTip.Indexes = currentIndex
+				if (subIndex) then
+					CoolTip.SubIndexes = currentSubIndex
+				end
+				
+			elseif (widgetType == "statusbar") then
+			
+				CoolTip.Indexes = index
+				if (subIndex) then
+					CoolTip.SubIndexes = subIndex
+				end	
+				
+				CoolTip:AddStatusBar (...)
+				
+				CoolTip.Indexes = currentIndex
+				if (subIndex) then
+					CoolTip.SubIndexes = currentSubIndex
+				end
+				
+			elseif (widgetType == "menu") then
+			
+				CoolTip.Indexes = index
+				if (subIndex) then
+					CoolTip.SubIndexes = subIndex
+				end
+				
+				CoolTip:AddMenu (...)
+				
+				CoolTip.Indexes = currentIndex
+				if (subIndex) then
+					CoolTip.SubIndexes = currentSubIndex
+				end
+				
+			end
+			
+			CoolTip.isSpecial = false
+			
+		end
+		
+		--> search key: ~fromline
+		function CoolTip:AddFromTable (_table)
+			for index, menu in _ipairs (_table) do 
+				if (menu.func) then
+					CoolTip:AddMenu (menu.type or 1, menu.func, menu.param1, menu.param2, menu.param3, nil, menu.icon)
+				elseif (menu.statusbar) then
+					CoolTip:AddStatusBar (menu.value, menu.type or 1, menu.color, true)
+				elseif (menu.icon) then
+					CoolTip:AddIcon (menu.icon, menu.type or 1, menu.side or 1, menu.width, menu.height, menu.l, menu.r, menu.t, menu.b, menu.color)
+				elseif (menu.textleft or menu.textright or menu.text) then
+					CoolTip:AddLine (menu.text, "", menu.type, menu.color, menu.color)
+				end
+			end
+		end
+
+----------------------------------------------------------------------
+	--> show cooltip
+	
+		--> serach key: ~start
+		function CoolTip:Show (frame, menuType, color)
+			return CoolTip:ShowCooltip (frame, menuType, color)
+		end
+		
+		function CoolTip:ShowCooltip (frame, menuType, color)
+
+			if (frame) then
+				--> details framework
+				if (frame.dframework) then
+					frame = frame.widget
+				end
+				CoolTip:SetHost (frame)
+			end
+			if (menuType) then
+				CoolTip:SetType (menuType)
+			end
+			if (color) then
+				CoolTip:SetColor (1, color)
+				CoolTip:SetColor (2, color)
+			end
+		
+			if (CoolTip.Type == 1 or CoolTip.Type == 2) then
+				return CoolTip:monta_tooltip()
+				
+			elseif (CoolTip.Type == 3) then
+				return CoolTip:monta_cooltip()
+				
+			end
+		end
+	
+	local emptyOptions = {}
+	
+	function CoolTip:Hide()
+		return CoolTip:Close()
+	end
+	
+	function CoolTip:Close()
+		CoolTip.active = false
+		CoolTip.Host = nil
+		DF:Fade (frame1, 1)
+		DF:Fade (frame2, 1)
+		
+	end
+	
+	--> old function call
+	function CoolTip:ShowMe (host, arg2)
+		--> ignore if mouse is up me
+		if (CoolTip.mouseOver) then
+			return
+		end
+	
+		if (not host or not arg2) then --> hideme
+			CoolTip:Close()
+		end
+	end
+	
+	--> search key: ~inject
+	function CoolTip:ExecFunc (host, fromClick)
+	
+		if (host.dframework) then
+			if (not host.widget.CoolTip) then
+				host.widget.CoolTip = host.CoolTip
+			end
+			host = host.widget
+		end
+	
+		CoolTip:Reset()
+		CoolTip:SetType (host.CoolTip.Type)
+		CoolTip:SetFixedParameter (host.CoolTip.FixedValue)
+		CoolTip:SetColor ("main", host.CoolTip.MainColor or "transparent")
+		CoolTip:SetColor ("sec", host.CoolTip.SubColor or "transparent")
+		
+		CoolTip:SetOwner (host, host.CoolTip.MyAnchor, host.CoolTip.HisAnchor, host.CoolTip.X, host.CoolTip.Y)
+		
+		local options = host.CoolTip.Options
+		if (type (options) == "function") then
+			options = options()
+		end
+		if (options) then
+			for optionName, optionValue in pairs (options) do 
+				CoolTip:SetOption (optionName, optionValue)
+			end
+		end
+		
+		host.CoolTip.BuildFunc()
+		
+		if (CoolTip.Indexes == 0) then
+			if (host.CoolTip.Default) then
+				CoolTip:SetType ("tooltip")
+				CoolTip:AddLine (host.CoolTip.Default, nil, 1, "white")
+			end
+		end
+		
+		CoolTip:ShowCooltip()
+		
+		if (fromClick) then
+			--UIFrameFlash (frame1, )
+			frame1:Flash (0.05, 0.05, 0.2, true, 0, 0)
+		end
+	end
+	
+	local wait = 0.2
+	
+	local InjectOnUpdateEnter = function (self, elapsed)  
+		elapsedTime = elapsedTime+elapsed
+		if (elapsedTime > wait) then
+			self:SetScript ("OnUpdate", nil)
+			CoolTip:ExecFunc (self)
+		end
+	end
+
+	local InjectOnUpdateLeave = function (self, elapsed)  
+		elapsedTime = elapsedTime+elapsed
+		if (elapsedTime > 0.2) then
+			if (not CoolTip.mouseOver and not CoolTip.buttonOver and self == CoolTip.Host) then
+				CoolTip:ShowMe (false)
+			end
+			self:SetScript ("OnUpdate", nil)
+		end
+	end
+	
+	local InjectOnLeave = function (self) 	
+		CoolTip.buttonOver = false
+		
+		if (CoolTip.active) then
+			elapsedTime = 0
+			self:SetScript ("OnUpdate", InjectOnUpdateLeave)
+		else
+			self:SetScript ("OnUpdate", nil)
+		end
+	
+		if (self.CoolTip.OnLeaveFunc) then
+			self.CoolTip.OnLeaveFunc (self)
+		end
+		
+		if (self.OldOnLeaveScript) then
+			self:OldOnLeaveScript()
+		end		
+	end
+
+	local InjectOnEnter = function (self) 
+		CoolTip.buttonOver = true
+		if (CoolTip.active) then
+			CoolTip:ExecFunc (self)
+		else
+			elapsedTime = 0
+			wait = self.CoolTip.ShowSpeed or 0.2
+			self:SetScript ("OnUpdate", InjectOnUpdateEnter)
+		end
+
+		if (self.CoolTip.OnEnterFunc) then
+			self.CoolTip.OnEnterFunc (self)
+		end
+		
+		if (self.OldOnEnterScript) then
+			self:OldOnEnterScript()
+		end
+	end
+	
+	function CoolTip:CoolTipInject (host, openOnClick)
+		if (host.dframework) then
+			if (not host.widget.CoolTip) then
+				host.widget.CoolTip = host.CoolTip
+			end
+			host = host.widget
+		end
+		
+		local coolTable = host.CoolTip
+		if (not coolTable) then
+			print ("Host nao tem uma CoolTable.")
+			return false
+		end
+
+		host.OldOnEnterScript = host:GetScript ("OnEnter")
+		host.OldOnLeaveScript = host:GetScript ("OnLeave")
+		
+		host:SetScript ("OnEnter", InjectOnEnter)
+		host:SetScript ("OnLeave", InjectOnLeave)
+		
+		if (openOnClick) then
+			if (host:GetObjectType() == "Button") then
+				host:SetScript ("OnClick", function() CoolTip:ExecFunc (host, true) end)
+			end
+		end
+		
+		return ture
+	end
+	
+	--> all done
+	CoolTip:ClearAllOptions()
+
+	local preset2_backdrop = {bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], edgeFile = DF.folder .. "border_3", tile=true,
+	edgeSize = 16, tileSize = 64, insets = {left = 3, right = 3, top = 4, bottom = 4}}
+
+	local white_table = {1, 1, 1, 1}
+	
+	function CoolTip:Preset (number)
+		self:Reset()
+		
+		if (number == 1) then
+			self:SetOption ("TextFont", "Friz Quadrata TT")
+			self:SetOption ("TextColor", "orange")
+			self:SetOption ("TextSize", 12)
+			self:SetOption ("ButtonsYMod", -4)
+			self:SetOption ("YSpacingMod", -4)
+			self:SetOption ("IgnoreButtonAutoHeight", true)
+			self:SetColor (1, 0.5, 0.5, 0.5, 0.5)
+			
+		elseif (number == 2) then
+			self:SetOption ("TextFont", "Friz Quadrata TT")
+			self:SetOption ("TextColor", "orange")
+			self:SetOption ("TextSize", 12)
+			self:SetOption ("FixedWidth", 220)
+			self:SetOption ("ButtonsYMod", -4)
+			self:SetOption ("YSpacingMod", -4)
+			self:SetOption ("IgnoreButtonAutoHeight", true)
+			self:SetColor (1, 0.5, 0.5, 0.5, 0.5)
+			
+			self:SetBackdrop (1, preset2_backdrop, nil, white_table)
+		end
+	end
+	
+	return CoolTip
+	
+end
+
+DF:CreateCoolTip()
\ No newline at end of file