	
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

	local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
	local _detalhes = _G.Details
	local PixelUtil = PixelUtil or DFPixelUtil

	DETAILSPLUGIN_ALWAYSENABLED = 0x1
	
	--consts
		local CONST_PLUGINWINDOW_MENU_WIDTH = 150
		local CONST_PLUGINWINDOW_MENU_HEIGHT = 22
		local CONST_PLUGINWINDOW_MENU_X = -5
		local CONST_PLUGINWINDOW_MENU_Y = -26
		local CONST_PLUGINWINDOW_WIDTH = 925
		local CONST_PLUGINWINDOW_HEIGHT = 600
	
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--details api functions
	function _detalhes:GetPlugin (PAN) --plugin absolute name
		return _detalhes.SoloTables.NameTable [PAN] or _detalhes.RaidTables.NameTable [PAN] or _detalhes.ToolBar.NameTable [PAN] or _detalhes.StatusBar.NameTable [PAN] or _detalhes.PluginsLocalizedNames [PAN] or _detalhes.PluginsGlobalNames [PAN]
	end
	
	function _detalhes:GetPluginSavedTable (PluginAbsoluteName)
		return _detalhes.plugin_database [PluginAbsoluteName]
	end
	
	function _detalhes:UpdatePluginBarsConfig()
		local instance = self:GetPluginInstance()
		if (instance) then
			self.row_info = self.row_info or {}
			_detalhes.table.copy(self.row_info, instance.row_info)
			self.bars_grow_direction = instance.bars_grow_direction
			self.row_height = instance.row_height
			self:SetBarGrowDirection()
		end
	end
	
	function _detalhes:AttachToInstance()
		local instance = self:GetPluginInstance()
		if (instance) then
			local w, h = instance:GetSize()
			self.Frame:SetSize(w, h)
		end
	end
	
	function _detalhes:GetPluginInstance (PluginAbsoluteName)
		local plugin = self
		if (PluginAbsoluteName) then
			plugin = _detalhes:GetPlugin (PluginAbsoluteName)
		end
		
		local id = plugin.instance_id
		if (id) then
			return _detalhes:GetInstance(id)
		end
	end
	
	function _detalhes:IsPluginEnabled (PluginAbsoluteName)
		if (PluginAbsoluteName) then
			local plugin = _detalhes.plugin_database [PluginAbsoluteName]
			if (plugin) then
				return plugin.enabled
			end
		else
			return self.__enabled
		end
	end
	
	function _detalhes:SetPluginDescription (desc)
		self.__description = desc
	end
	function _detalhes:GetPluginDescription()
		return self.__description or ""
	end
	
	function _detalhes:DisablePlugin (AbsoluteName)
		local plugin = _detalhes:GetPlugin (AbsoluteName)
		
		if (plugin) then
			local saved_table = _detalhes:GetPluginSavedTable (AbsoluteName)
			
			saved_table.enabled = false
			plugin.__enabled = false
		
			_detalhes:SendEvent("PLUGIN_DISABLED", plugin)
			
			_detalhes:DelayOptionsRefresh()
			return true
		end
	end
	
	function _detalhes:CheckDefaultTable (current, default)
		for key, value in pairs(default) do 
			if (type(value) == "table") then
				if (type(current [key]) ~= "table") then
					current [key] = Details.CopyTable(value)
				else
					_detalhes:CheckDefaultTable (current [key], value)
				end
			else
				if (current [key] == nil) then
					current [key] = value
				--elseif (type(current [key]) ~= type(value)) then
				--	current [key] = value
				end
			end
		end
	end

	function _detalhes:InstallPlugin (PluginType, PluginName, PluginIcon, PluginObject, PluginAbsoluteName, MinVersion, Author, Version, DefaultSavedTable)

		if (MinVersion and MinVersion > _detalhes.realversion) then
			print(PluginName, Loc ["STRING_TOOOLD"])
			return _detalhes:NewError ("Details version is out of date.")
		end
		
		if (_detalhes.FILEBROKEN) then
			return _detalhes:NewError ("Game client needs to be restarted in order to finish Details! update.")
		end
		
		if (PluginType == "TANK") then
			PluginType = "RAID"
		end
	
		if (not PluginType) then
			return _detalhes:NewError ("InstallPlugin parameter 1 (plugin type) not especified")
		elseif (not PluginName) then
			return _detalhes:NewError ("InstallPlugin parameter 2 (plugin name) can't be nil")
		elseif (not PluginIcon) then
			return _detalhes:NewError ("InstallPlugin parameter 3 (plugin icon) can't be nil")
		elseif (not PluginObject) then
			return _detalhes:NewError ("InstallPlugin parameter 4 (plugin object) can't be nil")
		elseif (not PluginAbsoluteName) then
			return _detalhes:NewError ("InstallPlugin parameter 5 (plugin absolut name) can't be nil")
		end
		
		if (_G [PluginAbsoluteName]) then
			print(Loc ["STRING_PLUGIN_NAMEALREADYTAKEN"] .. ": " .. PluginName .. " name: " .. PluginAbsoluteName)
			return
		else
			_G [PluginAbsoluteName] = PluginObject
			PluginObject.real_name = PluginAbsoluteName
		end
		
		PluginObject.__name = PluginName
		PluginObject.__author = Author or "--------"
		PluginObject.__version = Version or "v1.0.0"
		PluginObject.__icon = PluginIcon or [[Interface\ICONS\Trade_Engineering]]
		PluginObject.real_name = PluginAbsoluteName
		
		_detalhes.PluginsGlobalNames [PluginAbsoluteName] = PluginObject
		_detalhes.PluginsLocalizedNames [PluginName] = PluginObject
		
		local saved_table
		
		if (PluginType ~= "STATUSBAR") then
			saved_table = _detalhes.plugin_database [PluginAbsoluteName]
			
			if (not saved_table) then
				saved_table = {enabled = true, author = Author or "--------"}
				_detalhes.plugin_database [PluginAbsoluteName] = saved_table
			end
			
			if (DefaultSavedTable) then
				_detalhes:CheckDefaultTable (saved_table, DefaultSavedTable)
			end
			
			PluginObject.__enabled = saved_table.enabled
		end
		
		if (PluginType == "SOLO") then
			if (not PluginObject.Frame) then
				return _detalhes:NewError ("plugin doesn't have a Frame, please check case-sensitive member name: Frame")
			end
			
			--Install Plugin
			_detalhes.SoloTables.Plugins [#_detalhes.SoloTables.Plugins+1] = PluginObject
			_detalhes.SoloTables.Menu [#_detalhes.SoloTables.Menu+1] = {PluginName, PluginIcon, PluginObject, PluginAbsoluteName}
			_detalhes.SoloTables.NameTable [PluginAbsoluteName] = PluginObject
			_detalhes:SendEvent("INSTALL_OKEY", PluginObject)
			
			_detalhes.PluginCount.SOLO = _detalhes.PluginCount.SOLO + 1

		elseif (PluginType == "RAID") then
			
			--Install Plugin
			_detalhes.RaidTables.Plugins [#_detalhes.RaidTables.Plugins+1] = PluginObject
			_detalhes.RaidTables.Menu [#_detalhes.RaidTables.Menu+1] = {PluginName, PluginIcon, PluginObject, PluginAbsoluteName}
			_detalhes.RaidTables.NameTable [PluginAbsoluteName] = PluginObject
			_detalhes:SendEvent("INSTALL_OKEY", PluginObject)
			
			_detalhes.PluginCount.RAID = _detalhes.PluginCount.RAID + 1
			
			_detalhes:InstanceCall("RaidPluginInstalled", PluginAbsoluteName)
			
		elseif (PluginType == "TOOLBAR") then
			
			--Install Plugin
			_detalhes.ToolBar.Plugins [#_detalhes.ToolBar.Plugins+1] = PluginObject
			_detalhes.ToolBar.Menu [#_detalhes.ToolBar.Menu+1] = {PluginName, PluginIcon, PluginObject, PluginAbsoluteName}
			_detalhes.ToolBar.NameTable [PluginAbsoluteName] = PluginObject
			_detalhes:SendEvent("INSTALL_OKEY", PluginObject)
			
			_detalhes.PluginCount.TOOLBAR = _detalhes.PluginCount.TOOLBAR + 1
			
		elseif (PluginType == "STATUSBAR") then	
		
			--Install Plugin
			_detalhes.StatusBar.Plugins [#_detalhes.StatusBar.Plugins+1] = PluginObject
			_detalhes.StatusBar.Menu [#_detalhes.StatusBar.Menu+1] = {PluginName, PluginIcon}
			_detalhes.StatusBar.NameTable [PluginAbsoluteName] = PluginObject
			_detalhes:SendEvent("INSTALL_OKEY", PluginObject)
			
			_detalhes.PluginCount.STATUSBAR = _detalhes.PluginCount.STATUSBAR + 1
		end
		
		if (saved_table) then
			PluginObject.db = saved_table
		end
		
		if (PluginObject.__enabled) then
			return true, saved_table, true
		else
			return true, saved_table, false
		end
		
	end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--internal functions
	
	_detalhes.PluginCount = {
		["SOLO"] = 0,
		["RAID"] = 0,
		["TOOLBAR"] = 0,
		["STATUSBAR"] = 0
	}	
		
	local OnEnableFunction = function(self)
		self.__parent.Enabled = true
		--self = frame __parent = plugin object
		local instance = _detalhes:GetInstance(self.__parent.instance_id)
		if (instance) then
			self:SetParent(instance.baseframe)
		end
		_detalhes:SendEvent("SHOW", self.__parent)
	end

	local OnDisableFunction = function(self)
		_detalhes:SendEvent("HIDE", self.__parent)
		if (bit.band(self.__parent.__options, DETAILSPLUGIN_ALWAYSENABLED) == 0) then
			self.__parent.Enabled = false
		end
	end

	local BuildDefaultStatusBarMembers = function(self)
		self.childs = {}
		self.__index = self
		function self:Setup()
			_detalhes.StatusBar:OpenOptionsForChild (self)
		end
	end
	
	local temp_event_function = function()
		print("=====================")
		print("Hello There plugin developer!")
		print("Please make sure you are declaring")
		print("A member called 'OnDetailsEvent' on your plugin object")
		print("With a function to receive the events like bellow:")
		print("function PluginObject:OnDetailsEvent (event, ...) end")
		print("Thank You Sir!===================")
	end

	local register_event_func = function(self, event)
		self.Frame:RegisterEvent(event)
	end
	local unregister_event_func = function(self, event)
		self.Frame:UnregisterEvent (event)
	end
	
	function _detalhes:NewPluginObject (FrameName, PluginOptions, PluginType)

		PluginOptions = PluginOptions or 0x0
		local NewPlugin = {__options = PluginOptions, __enabled = true, RegisterEvent = register_event_func, UnregisterEvent = unregister_event_func}
		
		local Frame = CreateFrame("Frame", FrameName, UIParent,"BackdropTemplate")
		Frame:RegisterEvent("PLAYER_LOGIN")
		Frame:RegisterEvent("PLAYER_LOGOUT")
		
		Frame:SetScript("OnEvent", function(self, event, ...) 
			if (NewPlugin.OnEvent) then
				if (event == "PLAYER_LOGIN") then
					NewPlugin:OnEvent (self, "ADDON_LOADED", NewPlugin.Frame:GetName())
					NewPlugin.Frame:Hide()
					return
				end
				return NewPlugin:OnEvent (self, event, ...) 
			end
		end)
		
		Frame:SetFrameStrata("HIGH")
		Frame:SetFrameLevel(6)

		Frame:Hide()
		Frame.__parent = NewPlugin
		
		if (bit.band(PluginOptions, DETAILSPLUGIN_ALWAYSENABLED) ~= 0) then
			NewPlugin.Enabled = true
		else
			NewPlugin.Enabled = false
		end
		
		--default members
		if (PluginType == "STATUSBAR") then
			BuildDefaultStatusBarMembers (NewPlugin)
		end
		
		NewPlugin.Frame = Frame
		
		Frame:SetScript("OnShow", OnEnableFunction)
		Frame:SetScript("OnHide", OnDisableFunction)
		
		--temporary details event function
		NewPlugin.OnDetailsEvent = temp_event_function
		
		setmetatable(NewPlugin, _detalhes)
		
		return NewPlugin
	end

	function _detalhes:CreatePluginOptionsFrame (name, title, template)
	
		template = template or 1
	
		if (template == 2) then
			local options_frame = CreateFrame("frame", name, UIParent, "ButtonFrameTemplate,BackdropTemplate")
			tinsert(UISpecialFrames, name)
			options_frame:SetSize(500, 200)
			
			options_frame:SetScript("OnMouseDown", function(self, button)
				if (button == "RightButton") then
					if (self.moving) then 
						self.moving = false
						self:StopMovingOrSizing()
					end
					return options_frame:Hide()
				elseif (button == "LeftButton" and not self.moving) then
					self.moving = true
					self:StartMoving()
				end
			end)
			options_frame:SetScript("OnMouseUp", function(self)
				if (self.moving) then 
					self.moving = false
					self:StopMovingOrSizing()
				end
			end)
			
			options_frame:SetMovable(true)
			options_frame:EnableMouse(true)
			options_frame:SetFrameStrata("DIALOG")
			options_frame:SetToplevel(true)
			
			options_frame:Hide()
			
			options_frame:SetPoint("center", UIParent, "center")
			--options_frame.TitleText:SetText(title) --10.0 fuck
			--options_frame.portrait:SetTexture([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-BLOODELF]])
			
			return options_frame
	
		elseif (template == 1) then
		
			local options_frame = CreateFrame("frame", name, UIParent,"BackdropTemplate")
			tinsert(UISpecialFrames, name)
			options_frame:SetSize(500, 200)

			options_frame:SetScript("OnMouseDown", function(self, button)
				if (button == "RightButton") then
					if (self.moving) then 
						self.moving = false
						self:StopMovingOrSizing()
					end
					return options_frame:Hide()
				elseif (button == "LeftButton" and not self.moving) then
					self.moving = true
					self:StartMoving()
				end
			end)
			options_frame:SetScript("OnMouseUp", function(self)
				if (self.moving) then 
					self.moving = false
					self:StopMovingOrSizing()
				end
			end)
			
			options_frame:SetMovable(true)
			options_frame:EnableMouse(true)
			options_frame:SetFrameStrata("DIALOG")
			options_frame:SetToplevel(true)
			
			options_frame:Hide()
			
			options_frame:SetPoint("center", UIParent, "center")
			
			options_frame:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16,
			edgeFile = [[Interface\AddOns\Details\images\border_2]], edgeSize = 32,
			insets = {left = 1, right = 1, top = 1, bottom = 1}})
			options_frame:SetBackdropColor(0, 0, 0, .7)

			Details.gump:ApplyStandardBackdrop(options_frame)
			Details.gump:CreateTitleBar (options_frame, title)

			local bigdog = _detalhes.gump:NewImage(options_frame, [[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]], 110, 120, nil, {1, 0, 0, 1}, "backgroundBigDog", "$parentBackgroundBigDog")
			bigdog:SetPoint("bottomright", options_frame, "bottomright", -3, 0)
			bigdog:SetAlpha(.25)
			
			return options_frame
		end
	end

	function _detalhes:CreatePluginWindowContainer()

		local f = CreateFrame("frame", "DetailsPluginContainerWindow", UIParent,"BackdropTemplate")
		f:EnableMouse(true)
		f:SetMovable(true)
		f:SetPoint("center", UIParent, "center")
		f:SetBackdrop(_detalhes.PluginDefaults and _detalhes.PluginDefaults.Backdrop or {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1})
		f:SetBackdropColor(0, 0, 0, 0.3)
		f:SetBackdropBorderColor(0, 0, 0, 1)
		tinsert(UISpecialFrames, "DetailsPluginContainerWindow")


		local scaleBar = DetailsFramework:CreateScaleBar(f, Details.options_window)
		scaleBar:SetFrameStrata("fullscreen")
		f:SetScale(Details.options_window.scale)

		f:Hide()

		--members
			f.MenuX = CONST_PLUGINWINDOW_MENU_X
			f.MenuY = CONST_PLUGINWINDOW_MENU_Y
			f.MenuButtonWidth = CONST_PLUGINWINDOW_MENU_WIDTH
			f.MenuButtonHeight = CONST_PLUGINWINDOW_MENU_HEIGHT
			f.FrameWidth = CONST_PLUGINWINDOW_WIDTH
			f.FrameHeight = CONST_PLUGINWINDOW_HEIGHT
			f.TitleHeight = 20
			
			--store button references for the left menu
			f.MenuButtons = {}
			--store all plugins embed
			f.EmbedPlugins = {}
		
		--lib window
			f:SetSize(f.FrameWidth, f.FrameHeight)
			local LibWindow = LibStub("LibWindow-1.1")
			LibWindow.RegisterConfig(f, _detalhes.plugin_window_pos)
			LibWindow.RestorePosition(f)
			LibWindow.MakeDraggable(f)
			LibWindow.SavePosition(f)
			
		--menu background
			local menuBackground = CreateFrame("frame", "$parentMenuFrame", f, "BackdropTemplate")
			DetailsFramework:ApplyStandardBackdrop(menuBackground)

		--statusbar
			local statusBar = CreateFrame("frame", nil, menuBackground,"BackdropTemplate")
			statusBar:SetPoint("topleft", menuBackground, "bottomleft", 0, 1)
			statusBar:SetPoint("topright", f, "bottomright", 0, 1)
			statusBar:SetHeight(20)
			statusBar:SetAlpha(1)

			DetailsFramework:BuildStatusbarAuthorInfo(statusBar)
			DetailsFramework:ApplyStandardBackdrop(statusBar)

			local extraDarkTexture = statusBar:CreateTexture(nil, "background")
			extraDarkTexture:SetAllPoints()
			extraDarkTexture:SetColorTexture(.2, .2, .2, .8)

			--
			local right_click_to_back = _detalhes.gump:CreateLabel(statusBar, "right click to close", 10, "gray")
			right_click_to_back:SetPoint("bottomright", statusBar, "bottomright", -1, 5)
			right_click_to_back:SetAlpha(.4)

			--point
			menuBackground:SetPoint("topright", f, "topleft", -2, 0)
			menuBackground:SetPoint("bottomright", f, "bottomleft", -2, 0)
			menuBackground:SetWidth(f.MenuButtonWidth + 6)
			
			local bigdog = _detalhes.gump:NewImage(menuBackground, [[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]], 180*0.7, 200*0.7, "overlay", {0, 1, 0, 1}, "backgroundBigDog", "$parentBackgroundBigDog")
			bigdog:SetPoint("bottomleft", custom_window, "bottomleft", 0, 1)
			bigdog:SetAlpha(0.3)

			local gradientBelowTheLine = DetailsFramework:CreateTexture(menuBackground, {gradient = "vertical", fromColor = {0, 0, 0, 0.45}, toColor = "transparent"}, 1, 95, "artwork", {0, 1, 0, 1}, "dogGradient")
			gradientBelowTheLine:SetPoint("bottoms")

			local bigdogRow = menuBackground:CreateTexture(nil, "artwork")
			bigdogRow:SetPoint("bottomleft", menuBackground, "bottomleft", 1, 1)
			bigdogRow:SetPoint("bottomright", menuBackground, "bottomright", -1, 1)
			bigdogRow:SetHeight(20)
			bigdogRow:SetColorTexture(.5, .5, .5, .1)
			bigdogRow:Hide()

			--
		--plugins menu title bar
			local titlebar_plugins = CreateFrame("frame", nil, menuBackground,"BackdropTemplate")
			PixelUtil.SetPoint(titlebar_plugins, "topleft", menuBackground, "topleft", 2, -3)
			PixelUtil.SetPoint(titlebar_plugins, "topright", menuBackground, "topright", -2, -3)
			titlebar_plugins:SetHeight(f.TitleHeight)
			titlebar_plugins:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
			titlebar_plugins:SetBackdropColor(.5, .5, .5, 1)
			titlebar_plugins:SetBackdropBorderColor(0, 0, 0, 1)
			--title
			local titleLabel = _detalhes.gump:NewLabel(titlebar_plugins, titlebar_plugins, nil, "titulo", "Plugins", "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255})
			PixelUtil.SetPoint(titleLabel, "center", titlebar_plugins , "center", 0, 0)
			PixelUtil.SetPoint(titleLabel, "top", titlebar_plugins , "top", 0, -5)
			
		--plugins menu title bar
			local titlebar_tools = CreateFrame("frame", nil, menuBackground,"BackdropTemplate")
			titlebar_tools:SetHeight(f.TitleHeight)
			titlebar_tools:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
			titlebar_tools:SetBackdropColor(.5, .5, .5, 1)
			titlebar_tools:SetBackdropBorderColor(0, 0, 0, 1)
			--title
			local titleLabel = _detalhes.gump:NewLabel(titlebar_tools, titlebar_tools, nil, "titulo", "Tools", "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255})
			PixelUtil.SetPoint(titleLabel, "center", titlebar_tools , "center", 0, 0)
			PixelUtil.SetPoint(titleLabel, "top", titlebar_tools , "top", 0, -5)
		
		--scripts
			f:SetScript("OnShow", function()
				--check if the window isn't out of screen
				C_Timer.After(1, function()
					local right = f:GetRight()
					if (right and right > GetScreenWidth() + 500) then
						f:ClearAllPoints()
						f:SetPoint("center", UIParent, "center", 0, 0)
						LibWindow.SavePosition(f)
						_detalhes:Msg("detected options panel out of screen, position has reset")
					end
				end)
			end)
			
			f:SetScript("OnHide", function()
				
			end)
			
			f:SetScript("OnMouseDown", function(self, button)
				if (button == "RightButton") then
					f.ClosePlugin()
				end
			end)
			
			f.Debug = false
			function f.DebugMsg (...)
				if (f.Debug) then
					print("[Details! Debug]", ...)
				end
			end
		

		
		function f.OnMenuClick (_, _, pluginAbsName, callRefresh)

			--get the plugin
			local pluginObject = _detalhes:GetPlugin (pluginAbsName)
			if (not pluginObject) then
				for index, plugin in ipairs(f.EmbedPlugins) do
					if (plugin.real_name == pluginAbsName) then
						pluginObject = plugin
					end
				end
				
				if (not pluginObject) then
					f.DebugMsg ("Plugin not found")
					return
				end
			end

			--hide or show plugin windows
			for index, plugin in ipairs(f.EmbedPlugins) do
				if (plugin ~= pluginObject) then
					--hide this plugin
					if (plugin.Frame:IsShown()) then
						plugin.Frame:Hide()
					end
				end
			end

			--re set the point of the frame within the main plugin window
			f.RefreshFrame (pluginObject.__var_Frame)
			C_Timer.After(0.016, function()
				f.RefreshFrame (pluginObject.__var_Frame)
			end)

			--show the plugin window
			if (pluginObject.RefreshWindow and callRefresh) then
				DetailsFramework:QuickDispatch(pluginObject.RefreshWindow)
			end

			--highlight the plugin button on the menu
			for index, button in ipairs(f.MenuButtons) do
				button:Show()
				
				if (button.PluginAbsName == pluginAbsName) then
					--emphatizate this button
					button:SetTemplate(_detalhes.gump:GetTemplate("button", "DETAILS_PLUGINPANEL_BUTTONSELECTED_TEMPLATE"))
				else
					--make this button regular
					button:SetTemplate(_detalhes.gump:GetTemplate("button", "DETAILS_PLUGINPANEL_BUTTON_TEMPLATE"))
				end
			end

			--show the container
			f:Show()

			--check if the plugin has a callback for when showing the frame
			if (pluginObject.__OnClickFromOptionsCallback) then
				--safe run the plugin callback
				DetailsFramework:QuickDispatch(pluginObject.__OnClickFromOptionsCallback)
			end

			return true
		end
		
		function f.CreatePluginMenuButton (pluginObject, isUtility)
			--create the button
			local newButton = _detalhes.gump:CreateButton(f, f.OnMenuClick, f.MenuButtonWidth, f.MenuButtonHeight, pluginObject.__name, pluginObject.real_name, true)
			newButton.PluginAbsName = pluginObject.real_name
			newButton.PluginName = pluginObject.__name
			newButton.IsUtility = isUtility
			
			--add a template
			newButton:SetTemplate(_detalhes.gump:GetTemplate("button", "DETAILS_PLUGINPANEL_BUTTON_TEMPLATE"))
			newButton:SetText(pluginObject.__name)
			newButton.textsize = 10
			
			--set icon
			newButton:SetIcon (pluginObject.__icon, nil, nil, nil, pluginObject.__iconcoords, pluginObject.__iconcolor, 4)
			
			--add it to menu table
			tinsert(f.MenuButtons, newButton)
			
			return newButton
		end

		local on_hide = function(self)
			DetailsPluginContainerWindow.ClosePlugin()
		end

		local setup_frame_functions = function(frame)
			frame:SetScript("OnMouseDown", nil)
			frame:SetScript("OnMouseUp", nil)
			--frame:SetScript("OnHide", on_hide)
			frame:HookScript ("OnHide", on_hide)
		end
		
		function f.RefreshFrame (frame)
			frame:EnableMouse(false)
			frame:SetSize(f.FrameWidth, f.FrameHeight)
			frame:ClearAllPoints()
			PixelUtil.SetPoint(frame, "topleft", f, "topleft", 0, 0)
			frame:Show()
		end

		--a plugin request to be embed into the main plugin window
		function f.EmbedPlugin(pluginObject, frame, isUtility, callback)

			--check if the plugin has a frame
			if (not pluginObject.Frame) then
				f.DebugMsg ("plugin doesn't have a frame.")
				return
			end

			--create a button for this plugin
			local newMenuButtom = f.CreatePluginMenuButton(pluginObject, isUtility)

			--utility is true when the object isn't a real plugin, but instead a tool frame from the main addon being embed on this panel
			if (isUtility) then
				pluginObject.__var_Utility = true
			end
			pluginObject.__var_Frame = frame

			--sort buttons alphabetically, put utilities at the end
			table.sort (f.MenuButtons, function(t1, t2)
				if (t1.IsUtility and t2.IsUtility) then
					return t1.PluginName < t2.PluginName
				elseif (t1.IsUtility) then
					return false
				elseif (t2.IsUtility) then
					return true
				else
					return t1.PluginName < t2.PluginName
				end
			end)

			--reset the buttons points
			local addingTools = false
			for index, button in ipairs(f.MenuButtons) do
				button:ClearAllPoints()
				PixelUtil.SetPoint(button, "center", menuBackground, "center", 0, 0)

				if (button.IsUtility) then
					--add -20 to add a gap between plugins and utilities

					if (not addingTools) then
						--add the header
						addingTools = true
						PixelUtil.SetPoint(titlebar_tools, "topleft", menuBackground, "topleft", 2, f.MenuY + ( (index-1) * -f.MenuButtonHeight ) - index - 20)
						PixelUtil.SetPoint(titlebar_tools, "topright", menuBackground, "topright", -2, f.MenuY + ( (index-1) * -f.MenuButtonHeight ) - index - 20)
					end

					PixelUtil.SetPoint(button, "top", menuBackground, "top", 0, f.MenuY + ( (index-1) * -f.MenuButtonHeight ) - index - 40)
				else
					PixelUtil.SetPoint(button, "top", menuBackground, "top", 0, f.MenuY + ( (index-1) * -f.MenuButtonHeight ) - index)
				end
			end

			--format the plugin main frame
			f.RefreshFrame(frame)
			setup_frame_functions(frame)

			--save the callback function for when clicking in the button from the options panel
			pluginObject.__OnClickFromOptionsCallback = callback

			--add the plugin to embed table
			tinsert(f.EmbedPlugins, pluginObject)
			frame:SetParent(f)

			f.DebugMsg("plugin added", pluginObject.__name)
		end

		function f.OpenPlugin (pluginObject)
			--just simulate a click on the menu button
			f.OnMenuClick (_, _, pluginObject.real_name)
		end
		
		function f.ClosePlugin()
			--hide all embed plugins
			for index, plugin in ipairs(f.EmbedPlugins) do 
				plugin.Frame:Hide()
			end
			--hide the main frame
			f:Hide()
		end
		
		--[=[
			Function to be used on macros to open a plugin, signature:
			Details:OpenPlugin (PLUGIN_ABSOLUTE_NAME)
			Details:OpenPlugin (PluginObject)
			Details:OpenPlugin ("Plugin Name")
			
			Example: /run Details:OpenPlugin ("Time Line")
		--]=]
		
		function _detalhes:OpenPlugin (wildcard)
			local originalName = wildcard
			
			if (type(wildcard) == "string") then
			
				--check if passed a plugin absolute name
				local pluginObject = _detalhes:GetPlugin (wildcard)
				if (pluginObject) then
					f.OpenPlugin (pluginObject)
					return true
				end
				
				--check if passed a plugin name, remove spaces and make it lower case
				wildcard = string.lower(wildcard)
				wildcard = wildcard:gsub("%s", "")
				
				for index, pluginInfoTable in ipairs(_detalhes.ToolBar.Menu) do
					local pluginName = pluginInfoTable [1]
					pluginName = string.lower(pluginName)
					pluginName = pluginName:gsub("%s", "")
					
					if (pluginName ==  wildcard) then
						local pluginObject = pluginInfoTable [3]
						f.OpenPlugin (pluginObject)
						return true
					end
				end
			
			--check if passed a plugin object
			elseif (type(wildcard) == "table") then
				if (wildcard.__name) then
					f.OpenPlugin (wildcard)
					return true
				end
			end
			
			Details:Msg("|cFFFF7700plugin not found|r:|cFFFFFF00", (originalName or wildcard), "|rcheck if it is enabled in the addons control panel.") --localize-me
		end
		
		
	end
	
	
	
	
	
--stop auto complete: doe enda endb
