
function oSkin:Defaults()
	self:RegisterDefaults("profile", {
		BackdropBorder	= {r = 0.5, g = 0.5, b = 0.5, a = 1},
		Backdrop		= {r = 0, g = 0, b = 0, a = 0.9},

		CharacterFrames = true,
		PetStableFrame	= true,
		SpellBookFrame  = true,
		TalentFrame		= true,

		Inspect			= true,
		FriendsFrame	= true,
		TradeFrame		= true,
		QuestLog		= true,

		Tooltips		= true,
		MirrorTimers	= true,
		CastingBar		= true,
		StaticPopups	= true,
		ChatTabs		= false,
		ChatFrames		= false,
		ChatEditBox		= true,
		LootFrame		= true,
		GroupLoot		= {shown=true, small=false},
		ContainerFrames	= true,
		StackSplit		= true,
		ItemText		= true,
		WorldMap		= true,

		MenuFrames		= true,
		BankFrame       = true,
		MailFrame		= true,
		AuctionFrame	= true,

		MerchantFrames	= true,
		GossipFrame		= true,
		ClassTrainer	= true,
		TradeSkill		= true,
		CraftFrame		= true,
		TaxiFrame		= true,
		QuestFrame		= true,
		Battlefields	= true,

		ViewPort		= {top = 64, bottom=64, YResolution=1050, scaling = 768/1050, shown=false},
		TopFrame		= {height = 64, width=1920, shown=false, fheight=50, xyOff = true},
		BottomFrame		= {height = 200, width=1920, shown=false, fheight=50, xyOff = true},
	})
	
end

function oSkin:SetBackdrop(a1, a2, a3, a4)
	if (type(a1) == "string") then
		local _, _, r, g, b, a = string.find(a1, "([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)")
		r = tonumber(r)
		g = tonumber(g)
		b = tonumber(b)
		a = tonumber(a)

		if (not a or not b or not r or not g) then return end
		if (a > 255 or b > 255 or r > 255 or g > 255) then return end

		if (g > 1) then g = (g or 0) / 255 end
		if (r > 1) then r = (r or 0) / 255 end
		if (b > 1) then b = (b or 0) / 255 end
		if (a > 1) then a = (a or 0) / 255 end

		self:SetBackdrop(r, g, b, a)
	elseif (type(a1) == "number") then
		if (not a2) then a2 = 0 end
		if (not a3) then a3 = 0 end
		if (not a4) then a4 = 0.9 end

		if (not self.db.profile.Backdrop) then self.db.profile.Backdrop = {} end
		self.db.profile.Backdrop.r = a1
		self.db.profile.Backdrop.g = a2
		self.db.profile.Backdrop.b = a3
		self.db.profile.Backdrop.a = a4
	end
end

function oSkin:GetBackdrop()
    return string.format("%0.2f %0.2f %0.2f %0.2f", self.db.profile.Backdrop.r, self.db.profile.Backdrop.g, self.db.profile.Backdrop.b, self.db.profile.Backdrop.a)
end

function oSkin:Options()
	oSkin.options = {
		type = "group",
		args = {
			backdrop = {
				type = "text",
				name = "Backdrop Colors",
				desc = "Set Backdrop Colors",
				usage = "r g b a",
				get = function() return self:GetBackdrop() end,
				set = function(v) self:SetBackdrop(v) end,
			},

			character = {
				name = "Character Frames",
				type = "toggle",
				desc = "Toggle the skin of the Character Frames",
				get = function()
					return self.db.profile.CharacterFrames
				end,
				set = function(v)
					self.db.profile.CharacterFrames = v
					self:characterFrames()
				end,
			},
			stable = {
				name = "Stable Frame",
				type = "toggle",
				desc = "Toggle the skin of the Stable Frame",
				get = function()
					return self.db.profile.PetStableFrame
				end,
				set = function(v)
					self.db.profile.PetStableFrame = v
					self:PetStableFrame()
				end,
			},
			spellbook = {
				name = "SpellBook Frame",
				type = "toggle",
				desc = "Toggle the skin of the SpellBook Frame",
				get = function()
					return self.db.profile.SpellBookFrame
				end,
				set = function(v)
					self.db.profile.SpellBookFrame = v
					self:SpellBookFrame()
				end,
			},
			talent = {
				name = "Talent Frame",
				type = "toggle",
				desc = "Toggle the skin of the Talent Frame",
				get = function()
					return self.db.profile.TalentFrame
				end,
				set = function(v)
					self.db.profile.TalentFrame = v
					self:TalentFrame()
				end,
			},

			inspect = {
				name = "Inspect Frame",
				type = "toggle",
				desc = "Toggle the skin of the Inspect Frame",
				get = function()
					return self.db.profile.Inspect
				end,
				set = function(v)
					self.db.profile.Inspect = v
					self:InspectFrame()
					if IsAddOnLoaded("SuperInspect_UI") then self:SuperInspectFrame() end
				end,
			},
			friends = {
				name = "Friends Frame",
				type = "toggle",
				desc = "Toggle the skin of the Friends Frame",
				get = function()
					return self.db.profile.FriendsFrame
				end,
				set = function(v)
					self.db.profile.FriendsFrame = v
					self:FriendsFrame()
				end,
			},
			trade = {
				name = "Trade Frame",
				type = "toggle",
				desc = "Toggle the skin of the Trade Frame",
				get = function()
					return self.db.profile.TradeFrame
				end,
				set = function(v)
					self.db.profile.TradeFrame = v
					self:TradeFrame()
				end,
			},
			questlog = {
				name = "Quest Log Frame",
				type = "toggle",
				desc = "Toggle the skin of the Quest Log Frame",
				get = function()
					return self.db.profile.QuestLog
				end,
				set = function(v)
					self.db.profile.QuestLog = v
					self:QuestLog()
				end,
			},

			tooltips = {
				name = "Tooltips",
				type = "toggle",
				desc = "Toggle the skin of the Tooltips",
				get = function()
					return self.db.profile.Tooltips
				end,
				set = function(v)
					self.db.profile.Tooltips = v
					self:Tooltips()
				end,
			},
			timers = {
				name = "Timer Frames",
				type = "toggle",
				desc = "Toggle the skin of the Timer Frames",
				get = function()
					return self.db.profile.MirrorTimers
				end,
				set = function(v)
					self.db.profile.MirrorTimers = v
					self:MirrorTimers()
				end,
			},
			castbar = {
				name = "Casting Bar Frame",
				type = "toggle",
				desc = "Toggle the skin of the Casting Bar Frame",
				get = function()
					return self.db.profile.CastingBar
				end,
				set = function(v)
					self.db.profile.CastingBar = v
					self:CastingBar()
				end,
			},
			popups = {
				name = "Static Popups",
				type = "toggle",
				desc = "Toggle the skin of Static Popups",
				get = function()
					return self.db.profile.StaticPopups
				end,
				set = function(v)
					self.db.profile.StaticPopups = v
					self:StaticPopups()
					if IsAddOnLoaded("Blizzard_RaidUI") then self:ReadyCheckFrame() end
				end,
			},
			chattabs = {
				name = "Chat Tabs",
				type = "toggle",
				desc = "Toggle the skin of the Chat Tabs",
				get = function()
					return self.db.profile.ChatTabs
				end,
				set = function(v)
					self.db.profile.ChatTabs = v
					self:ChatTabs()
				end,
			},
			chatframes = {
				name = "Chat Frames",
				type = "toggle",
				desc = "Toggle the skin of the Chat Frames",
				get = function()
					return self.db.profile.ChatFrames
				end,
				set = function(v)
					self.db.profile.ChatFrames = v
					self:ChatFrames()
				end,
			},
			editbox = {
				name = "Chat Edit Box",
				type = "toggle",
				desc = "Toggle the skin of the Chat Edit Box",
				get = function()
					return self.db.profile.ChatEditBox
				end,
				set = function(v)
					self.db.profile.ChatEditBox = v
					self:ChatEditBox()
				end,
			},
			loot = {
				name = "Loot Frame",
				type = "toggle",
				desc = "Toggle the skin of the Loot Frame",
				get = function()
					return self.db.profile.LootFrame
				end,
				set = function(v)
					self.db.profile.LootFrame = v
					self:LootFrame()
				end,
			},
			grouploot = {
				name = "Group Loot Frame",
				desc = "Edit the GroupLoot settings",
				type = "group",
				args = {
					show = {
						name = "GroupLoot Show",
						type = "toggle",
						desc = "Toggle the GroupLoot frame on/off",
						get = function()
							return self.db.profile.GroupLoot.shown
						end,
						set = function (v)
							self.db.profile.GroupLoot.shown = v
							self:GroupLoot()						
						end,
					},
					small = {
						name = "GroupLoot Size",
						type = "toggle",
						desc = "Toggle the GroupLoot size",
						get = function()
							return self.db.profile.GroupLoot.small
						end,
						set = function (v)
							self.db.profile.GroupLoot.small = v
							self:GroupLoot()
						end,
					},
				},
			},
			container = {
				name = "Container Frames",
				type = "toggle",
				desc = "Toggle the skin of the Container Frames",
				get = function()
					return self.db.profile.ContainerFrames
				end,
				set = function(v)
					self.db.profile.ContainerFrames = v
					self:containerFrames()
					if IsAddOnLoaded("OneBank") then self:Skin_OneBank() end
					if IsAddOnLoaded("OneBag") then self:Skin_OneBag() end
				end,
			},
			stack = {
				name = "Stack Split Frame",
				type = "toggle",
				desc = "Toggle the skin of the Stack Split Frame",
				get = function()
					return self.db.profile.StackSplit
				end,
				set = function(v)
					self.db.profile.StackSplit = v
					self:StackSplit()
					if IsAddOnLoaded("EnhancedStackSplit") then self:EnhancedStackSplit() end
				end,
			},
			itemtext = {
				name = "Item Text Frame",
				type = "toggle",
				desc = "Toggle the skin of the Item Text Frame",
				get = function()
					return self.db.profile.ItemText
				end,
				set = function(v)
					self.db.profile.ItemText = v
					self:ItemText()
				end,
			},
			map = {
				name = "World Map Frame",
				type = "toggle",
				desc = "Toggle the skin of the World Map Frame",
				get = function()
					return self.db.profile.WorldMap
				end,
				set = function(v)
					self.db.profile.WorldMap = v
					self:WorldMap()
					if IsAddOnLoaded("MetaMap") then self:MetaMap() end
				end,
			},

			menu = {
				name = "Menu Frames",
				type = "toggle",
				desc = "Toggle the skin of the Menu Frames",
				get = function()
					return self.db.profile.MenuFrames
				end,
				set = function(v)
					self.db.profile.MenuFrames = v
					self:menuFrames()
				end,
			},
			bank = {
				name = "Bank Frame",
				type = "toggle",
				desc = "Toggle the skin of the Bank Frame",
				get = function()
					return self.db.profile.BankFrame
				end,
				set = function(v)
					self.db.profile.BankFrame = v
					self:BankFrame()
				end,
			},
			mail = {
				name = "Mail Frame",
				type = "toggle",
				desc = "Toggle the skin of the Mail Frame",
				get = function()
					return self.db.profile.MailFrame
				end,
				set = function(v)
					self.db.profile.MailFrame = v
					self:MailFrame()
				end,
			},
			auction = {
				name = "Auction Frame",
				type = "toggle",
				desc = "Toggle the skin of the Auction Frame",
				get = function()
					return self.db.profile.AuctionFrame
				end,
				set = function(v)
					self.db.profile.AuctionFrame = v
					self:AuctionFrame()
				end,
			},

			merchant = {
				name = "Merchant Frames",
				type = "toggle",
				desc = "Toggle the skin of the Merchant Frames",
				get = function()
					return self.db.profile.MerchantFrames
				end,
				set = function(v)
					self.db.profile.MerchantFrames = v
					self:merchantFrames()
				end,
			},
			gossip = {
				name = "Gossip Frame",
				type = "toggle",
				desc = "Toggle the skin of the Gossip Frame",
				get = function()
					return self.db.profile.GossipFrame
				end,
				set = function(v)
					self.db.profile.GossipFrame = v
					self:GossipFrame()
				end,
			},
			trainer = {
				name = "Class Trainer Frame",
				type = "toggle",
				desc = "Toggle the skin of the Class Trainer Frame",
				get = function()
					return self.db.profile.ClassTrainer
				end,
				set = function(v)
					self.db.profile.ClassTrainer = v
					self:ClassTrainer()
				end,
			},
			tradeskill = {
				name = "Trade Skill Frame",
				type = "toggle",
				desc = "Toggle the skin of the Trade Skill Frame",
				get = function()
					return self.db.profile.TradeSkill
				end,
				set = function(v)
					self.db.profile.TradeSkill = v
					self:TradeSkill()
				end,
			},
			craft = {
				name = "Craft Frame",
				type = "toggle",
				desc = "Toggle the skin of the Craft Frame",
				get = function()
					return self.db.profile.CraftFrame
				end,
				set = function(v)
					self.db.profile.CraftFrame = v
					self:CraftFrame()
				end,
			},
			taxi = {
				name = "Taxi Frame",
				type = "toggle",
				desc = "Toggle the skin of the Taxi Frame",
				get = function()
					return self.db.profile.TaxiFrame
				end,
				set = function(v)
					self.db.profile.TaxiFrame = v
					self:TaxiFrame()
				end,
			},
			quest = {
				name = "Quest Frame",
				type = "toggle",
				desc = "Toggle the skin of the Quest Frame",
				get = function()
					return self.db.profile.QuestFrame
				end,
				set = function(v)
					self.db.profile.QuestFrame = v
					self:QuestFrame()
				end,
			},
			battles = {
				name = "Battlefields Frame",
				type = "toggle",
				desc = "Toggle the skin of the Battlefields Frame",
				get = function()
					return self.db.profile.Battlefields
				end,
				set = function(v)
					self.db.profile.Battlefields = v
					self:Battlefields()
				end,
			},

			viewport = {
				name = "View Port",
				desc = "Edit the ViewPort settings",
				type = "group",
				args = {
					top = {
						name = "VP Top",
						desc = "Change Height of the Top Band",
						type = "range",
						step = 1,
						min = 0,
						max = 256,
						get = function ()
							return self.db.profile.ViewPort.top
						end,
						set = function (v)
							self.db.profile.ViewPort.top = v
							self:ViewPort_top()
						end,
					},
					bottom = {
						name = "VP Bottom",
						desc = "Change Height of the Bottom Band",
						type = "range",
						step = 1,
						min = 0,
						max = 256,
						get = function ()
							return self.db.profile.ViewPort.bottom
						end,
						set = function (v)
							self.db.profile.ViewPort.bottom = v
							self:ViewPort_bottom()
						end,
					},
					yres = {
						name = "VP YResolution",
						desc = "Change Y Resolution",
						type = "range",
						step = 2,
						min = 0,
						max = 1600,
						get = function ()
							return self.db.profile.ViewPort.YResolution
						end,
						set = function (v)
							self.db.profile.ViewPort.YResolution = v
							self.db.profile.ViewPort.scaling = 768 / self.db.profile.ViewPort.YResolution
				            self.initialized.ViewPort = nil
				            self:ViewPort()
						end,
					},
					show = {
						name = "ViewPort Show",
						type = "toggle",
						desc = "Toggle the ViewPort on/off",
						get = function()
							return self.db.profile.ViewPort.shown
						end,
						set = function (v)
							self.db.profile.ViewPort.shown = v
							if self.initialized.ViewPort then
                                self:ViewPort_reset()
							else
								self:ViewPort()						
							end
						end,
					},
				},
			},
			topframe = {
				name = "Top Frame",
				desc = "Edit the TopFrame settings",
				type = "group",
				args = {
					xyOff = {
						name = "TF Move Origin offscreen",
						desc = "Hide Border on Left and Top",
						type = "toggle",
						get = function ()
							return self.db.profile.TopFrame.xyOff
						end,
						set = function (v)
							self.db.profile.TopFrame.xyOff = v
							if self.initialized.TopFrame then
								if self.db.profile.TopFrame.xyOff then 
									self.topframe:SetPoint("TOPLEFT", UIParent, "TOPLEFT", -6, 6)
								else
									self.topframe:SetPoint("TOPLEFT", UIParent, "TOPLEFT", -3, 3)
								end
							end
						end,
					},
					height = {
						name = "TF Height",
						desc = "Change Height of the TopFrame",
						type = "range",
						step = 1,
						min = 0,
						max = 500,
						get = function ()
							return self.db.profile.TopFrame.height
						end,
						set = function (v)
							self.db.profile.TopFrame.height = v
							if self.initialized.TopFrame then
								self.topframe:SetHeight(v)
							end
						end,
					},
					width = {
						name = "TF Width",
						desc = "Change Width of the TopFrame",
						type = "range",
						step = 1,
						min = 0,
						max = 3000,
						get = function ()
							return self.db.profile.TopFrame.width
						end,
						set = function (v)
							self.db.profile.TopFrame.width = v
							if self.initialized.TopFrame then
								self.topframe:SetWidth(v)
							end
						end,
					},
					fadeheight = {
						name = "TF Fade Height",
						desc = "Change the Height of the Fade Effect",
						type = "range",
						step = 1,
						min = 0,
						max = 500,
						get = function ()
							return self.db.profile.TopFrame.fheight
						end,
						set = function (v)
							self.db.profile.TopFrame.fheight = v
							if self.initialized.TopFrame then
								self.topframe.tfade:SetPoint("BOTTOMRIGHT", self.topframe, "TOPRIGHT", -4, -v)
							end
						end,
					},
					show = {
						name = "TopFrame Show",
						type = "toggle",
						desc = "Toggle the TopFrame on/off",
						get = function()
							return self.db.profile.TopFrame.shown
						end,
						set = function (v)
							self.db.profile.TopFrame.shown = v
							if self.initialized.TopFrame then
								if self.topframe:IsVisible() then 
									self.topframe:Hide()
								else
									self.topframe:Show()
								end
							else
								self:TopFrame()
							end
						end,
					},
				},
			},
			bottomframe = {
				name = "Bottom Frame",
				desc = "Edit the BottomFrame settings",
				type = "group",
				args = {
					xyOff = {
						name = "BF Move Origin offscreen",
						desc = "Hide Border on Left and Bottom",
						type = "toggle",
						get = function ()
							return self.db.profile.BottomFrame.xyOff
						end,
						set = function (v)
							self.db.profile.BottomFrame.xyOff = v
							if self.initialized.BottomFrame then
								if self.db.profile.BottomFrame.xyOff then 
									self.bottomframe:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", -6, -6)
								else
									self.bottomframe:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", -3, -3)
								end
							end
						end,
					},
					height = {
						name = "BF Height",
						desc = "Change Height of the BottomFrame",
						type = "range",
						step = 1,
						min = 0,
						max = 500,
						get = function ()
							return self.db.profile.BottomFrame.height
						end,
						set = function (v)
							self.db.profile.BottomFrame.height = v
							if self.initialized.BottomFrame then
								self.bottomframe:SetHeight(v)
							end
						end,
					},
					width = {
						name = "BF Width",
						desc = "Change Width of the BottomFrame",
						type = "range",
						step = 1,
						min = 0,
						max = 3000,
						get = function ()
							return self.db.profile.BottomFrame.width
						end,
						set = function (v)
							self.db.profile.BottomFrame.width = v
							if self.initialized.BottomFrame then
								self.bottomframe:SetWidth(v)
							end
						end,
					},
					fadeheight = {
						name = "BF Fade Height",
						desc = "Change the Height of the Fade Effect",
						type = "range",
						step = 1,
						min = 0,
						max = 500,
						get = function ()
							return self.db.profile.BottomFrame.fheight
						end,
						set = function (v)
							self.db.profile.BottomFrame.fheight = v
							if self.initialized.BottomFrame then
								self.bottomframe.tfade:SetPoint("BOTTOMRIGHT", self.bottomframe, "TOPRIGHT", -4, -v)
							end
						end,
					},
					show = {
						name = "BottomFrame Show",
						type = "toggle",
						desc = "Toggle the BottomFrame on/off",
						get = function()
							return self.db.profile.BottomFrame.shown
						end,
						set = function (v)
							self.db.profile.BottomFrame.shown = v
							if self.initialized.BottomFrame then
								if self.bottomframe:IsVisible() then 
									self.bottomframe:Hide()
								else
									self.bottomframe:Show()
								end
							else
								self:BottomFrame()
							end
						end,
					},
				},
			},
		}	
	}
end
