function DAB_Add_ButtonOrPage(id)
	if (not id) then
		id = this:GetParent():GetID();
	end
	local freeButtons = table.getn(DAB_Settings[DAB_INDEX].FreeButtons);
	if (id < 11) then
		local needed = 1;
		if (needed > freeButtons) then
			DAB_NumButtons_SetWarning(needed - freeButtons);
			return;
		end
		local button = DAB_Get_FreeButton();
		local action = DAB_Get_UnusedAction();
		DAB_Settings[DAB_INDEX].Buttons[button].Bar = id;
		DAB_Settings[DAB_INDEX].Buttons[button].Bar2 = i;
		DAB_Settings[DAB_INDEX].Buttons[button].action = action;
		DAB_Settings[DAB_INDEX].Bar[id].numButtons = DAB_Settings[DAB_INDEX].Bar[id].numButtons + 1;
		for p = 1, DAB_Settings[DAB_INDEX].Bar[id].numBars do
			DAB_Settings[DAB_INDEX].Bar[id].pages[p][DAB_Settings[DAB_INDEX].Bar[id].numButtons] = action;
			action = DAB_Get_UnusedAction();
			DAB_Settings[DAB_INDEX].Bar[id].pageconditions[p][DAB_Settings[DAB_INDEX].Bar[id].numButtons] = {};
		end
	else
		id = id - 10;
		local needed = DAB_Settings[DAB_INDEX].Bar[id].numButtons;
		DAB_Settings[DAB_INDEX].Bar[id].numBars = DAB_Settings[DAB_INDEX].Bar[id].numBars + 1;
		local page = DAB_Settings[DAB_INDEX].Bar[id].numBars;
		DAB_Settings[DAB_INDEX].Bar[id].pages[page] = {};
		DAB_Settings[DAB_INDEX].Bar[id].pageconditions[page] = {};
		for i=1,needed do
			local action = DAB_Get_UnusedAction();
			DAB_Settings[DAB_INDEX].Bar[id].pages[page][i] = action;
			DAB_Settings[DAB_INDEX].Bar[id].pageconditions[page][i] = {};
		end
	end
	DAB_Init_ButtonLayout();
	DAB_Bar_Initialize(id);
	DAB_Bar_ButtonTextures(id);
	DAB_Bar_ButtonText(id);
	DAB_Bar_ButtonSize(id);
	DAB_Bar_ButtonAlpha(id);
	if (DAB_Settings[DAB_INDEX].AutoConfigureKB) then
		DAB_AutoConfigure_Keybindings();
	end
	DAB_Update_Keybindings();
end

function DAB_Add_Condition()
	if (not DAB_CONDITION_BUFFER) then return; end
	local baseOptions;
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		baseOptions = "DAB_BarOptions_ButtonControl_";
	elseif (DAB_OBJECT_TYPE == "Bar") then
		baseOptions = "DAB_BarOptions_BarControl_";
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		baseOptions = "DAB_FloaterOptions_Control_";
	end

	local option = getglobal(baseOptions.."Buff");
	if (option:IsShown()) then
		DAB_CONDITION_BUFFER.buff = option:GetText();
		if (not DAB_CONDITION_BUFFER.buff) then DAB_CONDITION_BUFFER.buff = ""; end
	end
	option = getglobal(baseOptions.."Text");
	if (option:IsShown()) then
		DAB_CONDITION_BUFFER.text = option:GetText();
		if (not DAB_CONDITION_BUFFER.text) then DAB_CONDITION_BUFFER.text = ""; end
	end
	option = getglobal(baseOptions.."Number");
	if (option:IsShown()) then
		DAB_CONDITION_BUFFER.number = option:GetNumber();
		if (not DAB_CONDITION_BUFFER.number) then DAB_CONDITION_BUFFER.number = 1; end
	end
	option = getglobal(baseOptions.."ResponseText");
	if (option:IsShown()) then
		DAB_CONDITION_BUFFER.rtext = option:GetText();
		if (not DAB_CONDITION_BUFFER.rtext) then DAB_CONDITION_BUFFER.rtext = ""; end
	end
	option = getglobal(baseOptions.."ResponseNumber");
	if (option:IsShown()) then
		DAB_CONDITION_BUFFER.rnumber = option:GetNumber();
		if (not DAB_CONDITION_BUFFER.rnumber) then DAB_CONDITION_BUFFER.rnumber = 1; end
	end
	option = getglobal(baseOptions.."ResponseX");
	if (option and option:IsShown()) then
		DAB_CONDITION_BUFFER.rx = option:GetNumber();
		if (not DAB_CONDITION_BUFFER.rx) then DAB_CONDITION_BUFFER.rx = 0; end
	end
	option = getglobal(baseOptions.."ResponseY");
	if (option and option:IsShown()) then
		DAB_CONDITION_BUFFER.ry = option:GetNumber();
		if (not DAB_CONDITION_BUFFER.ry) then DAB_CONDITION_BUFFER.ry = 0; end
	end

	local orbox = getglobal(baseOptions.."Overrides");
	DAB_CONDITION_BUFFER.overrides = orbox:GetText();
	orbox:SetText("");
	orbox:ClearFocus();
	if (DAB_CONDITION_BUFFER.overrides and DAB_CONDITION_BUFFER.overrides ~= "") then
		local overrides = {};
		local num = "";
		local index = 1;
		local char;
		for i=1, string.len(DAB_CONDITION_BUFFER.overrides) do
			char = string.sub(DAB_CONDITION_BUFFER.overrides, i, i);
			if (char == ",") then
				num = tonumber(num);
				if (num) then
					overrides[index] = num;
					index = index + 1;
				end
				num = "";
			else
				num = num..char;
			end
		end
		num = tonumber(num);
		if (num) then
			overrides[index] = num;
		end
		DAB_CONDITION_BUFFER.overrides = {};
		DL_Copy_Table(overrides, DAB_CONDITION_BUFFER.overrides);
	else
		DAB_CONDITION_BUFFER.overrides = {};
	end
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		local index = table.getn(DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button]) + 1;
		if (DAB_CONDITION_EDITTING) then
			index = DAB_CONDITION_EDITTING;
		end
		DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button][index] = {};
		DL_Copy_Table(DAB_CONDITION_BUFFER, DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button][index]);
		DAB_BarOptions_ButtonControl_Condition_Setting:SetText("");
		DAB_BarOptions_ButtonControl_Response_Setting:SetText("");
		DAB_Reset_Parameters("DAB_BarOptions_ButtonControl");
		local id = DAB_Get_BarButtonID(bar, page, button);
		getglobal("DAB_ActionButton_"..id).activeConditions = {};
	elseif (DAB_OBJECT_TYPE == "Bar") then
		local index = table.getn(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions) + 1;
		if (DAB_CONDITION_EDITTING) then
			index = DAB_CONDITION_EDITTING;
		end
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions[index] = {};
		DL_Copy_Table(DAB_CONDITION_BUFFER, DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions[index]);
		DAB_BarOptions_BarControl_Condition_Setting:SetText("");
		DAB_BarOptions_BarControl_Response_Setting:SetText("");
		DAB_Reset_Parameters("DAB_BarOptions_BarControl");
		getglobal("DAB_ActionBar_"..DAB_OBJECT_SUBINDEX).activeConditions = {};
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		local index = table.getn(DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions) + 1;
		if (DAB_CONDITION_EDITTING) then
			index = DAB_CONDITION_EDITTING;
		end
		DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions[index] = {};
		DL_Copy_Table(DAB_CONDITION_BUFFER, DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions[index]);
		DAB_FloaterOptions_Control_Condition_Setting:SetText("");
		DAB_FloaterOptions_Control_Response_Setting:SetText("");
		DAB_Reset_Parameters("DAB_FloaterOptions_Control");
		getglobal("DAB_ActionButton_"..DAB_OBJECT_SUBINDEX).activeConditions = {};
	end
	DAB_ConditionMenu_Update();
	DAB_CONDITION_BUFFER = nil;
	DAB_CONDITION_EDITTING = nil;
end

function DAB_Add_Event()
	DAB_NewEvent:Hide();
	local event = DAB_NewEvent_Event:GetText();
	local name = DAB_NewEvent_Name:GetText();
	local desc = DAB_NewEvent_Desc:GetText();
	DAB_NewEvent_Event:SetText("");
	DAB_NewEvent_Name:SetText("");
	DAB_NewEvent_Desc:SetText("");
	if ((not event) or event == "") then return; end
	if ((not name) or name == "") then name = event; end
	if (not desc) then desc = ""; end
	DAB_Settings[DAB_INDEX].CustomEvents[event] = {text=name, desc=desc};
	DAB_Update_EventList();
end

function DAB_Add_Floater()
	if (table.getn(DAB_Settings[DAB_INDEX].FreeButtons) == 0) then
		DAB_NumButtons_SetWarning(1);
		return;
	end
	local id = DAB_Get_FreeButton();
	local action = DAB_Get_UnusedAction();
	DAB_Floater_SetDefaults(id, action);
	DAB_Settings[DAB_INDEX].Buttons[id].action = action;
	DAB_Floater_Initialize(id);
	DAB_Init_ButtonLayout();
	DAB_Update_ObjectList();
	DAB_Update_FloaterList();
	DAB_Update_AnchorsList();
	DAB_BarBrowser_Update();
	if (DAB_Settings[DAB_INDEX].AutoConfigureKB) then
		DAB_AutoConfigure_Keybindings();
	end
	DAB_Update_Keybindings();
end

function DAB_AddFloater_OnMouseWheel()
	if (arg1 > 0) then
		DAB_Add_Floater();
	end
end

function DAB_AnchorFrameEditBox_OnEnterPressed()
	DAB_MenuEditBox_OnEnterPressed();
	DAB_Update_AnchorsList();
end

function DAB_Apply_IDRange()
	DAB_SetActionIDs_Min:ClearFocus();
	DAB_SetActionIDs_Max:ClearFocus();
	local min = DAB_SetActionIDs_Min:GetNumber();
	local max = DAB_SetActionIDs_Max:GetNumber();
	if (not min) then return; end
	if (not max or max == 0) then max = 120; end
	if (min < 1 or min > 120 or max < 1 or max > 120) then
		DL_Debug("Action IDs can only be a number between 1 and 120.");
		return;
	end
	local step = 1;
	if (min > max) then
		step = -1;
	end
	local index = 0;
	for action=min,max,step do
		index = index + 1;
		if (DAB_ACTIONIDS_LIST[index]) then
			local bar = DAB_ACTIONIDS_LIST[index].bar;
			local button = DAB_ACTIONIDS_LIST[index].button;
			if (bar == "F") then
				DAB_Settings[DAB_INDEX].Buttons[button].action = action;
				DAB_ActionButton_Update(button);
			else
				local page = DAB_ACTIONIDS_LIST[index].page;
				DAB_Settings[DAB_INDEX].Bar[bar].pages[page][button] = action;
				DAB_Bar_SetPage(bar, DAB_Settings[DAB_INDEX].Bar[bar].page, 1);
			end
			DAB_ACTIONIDS_LIST[index].action = action;
		end
	end
	DAB_SetActionIDsMenu_Update();
	DAB_Update_FloaterList();
	DAB_Update_ObjectList();
	DAB_BarBrowser_Update();
end

function DAB_AutoConfigure_Keybindings()
	local count = 0;
	for bar = 1,5 do
		for button = 1,DAB_Settings[DAB_INDEX].Bar[bar].numButtons do
			count = count + 1;
			local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
			local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
			DAB_Settings[DAB_INDEX].Keybindings[count] = {option=1, suboption=bar, suboption2=button, down=1, key1=key1, key2=key2};
		end
	end
	for f=1,120 do
		if (DAB_Settings[DAB_INDEX].Floaters[f]) then
			count = count + 1;
			if (count > 120) then return; end
			local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
			local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
			DAB_Settings[DAB_INDEX].Keybindings[count] = {option=3, suboption=f, down=1, key1=key1, key2=key2};
		end
	end
	for b=1,10 do
		count = count + 1;
		if (count > 120) then return; end
		local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
		local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
		DAB_Settings[DAB_INDEX].Keybindings[count] = {option=4, suboption=b, down=1, key1=key1, key2=key2};
	end
	for bar=1,10 do
		if (DAB_Settings[DAB_INDEX].Bar[bar].numBars > 1) then
			count = count + 1;
			if (count > 120) then return; end
			local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
			local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
			DAB_Settings[DAB_INDEX].Keybindings[count] = {option=7, suboption=bar, down=1, key1=key1, key2=key2};
			count = count + 1;
			if (count > 120) then return; end
			local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
			local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
			DAB_Settings[DAB_INDEX].Keybindings[count] = {option=8, suboption=bar, down=1, key1=key1, key2=key2};
		end
	end
	for group=1,2 do
		for button=1,12 do
			count = count + 1;
			if (count > 120) then return; end
			local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
			local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
			DAB_Settings[DAB_INDEX].Keybindings[count] = {option=2, suboption=group, suboption2=button, down=1, key1=key1, key2=key2};
		end
	end

	count = count + 1;
	for i=count,120 do
		local key1 = DAB_Settings[DAB_INDEX].Keybindings[count].key1;
		local key2 = DAB_Settings[DAB_INDEX].Keybindings[count].key2;
		DAB_Settings[DAB_INDEX].Keybindings[i] = {option=0, down=1, key1=key1, key2=key2};
	end

	DAB_Save_Keybindings();
end

function DAB_BarBrowser_OnClick()
	this:SetChecked(1);
	DAB_Show_Window(this.index);
	DAB_BarBrowser_Update();
end

function DAB_BarBrowser_Update()
	local numOptions = table.getn(DAB_BAR_LIST);
	local offset = FauxScrollFrame_GetOffset(DAB_Options_BarBrowser);
	if (not offset) then offset = 0; end
	local index, button;
	
	for i=1, 15 do
		button = getglobal("DAB_Options_BarBrowser_Button"..i);
		buttontext = getglobal("DAB_Options_BarBrowser_Button"..i.."Text");
		index = offset + i;
		button.index = index;
		if ( DAB_BAR_LIST[index] ) then
			buttontext:SetText(DAB_BAR_LIST[index].text);
			buttontext:SetJustifyH("LEFT");
			button:Enable();
			button:Show();
			if (DAB_BAR_LIST[index].header) then
				button:Disable();
				buttontext:SetJustifyH("CENTER");
				button:SetChecked(0);
				buttontext:SetTextColor(1, .82, 0);
				buttontext:SetFont("Fonts\\MORPHEUS.ttf", 13);
			elseif (DAB_OBJECT_INDEX == button.index) then
				button:SetChecked(1);
				buttontext:SetTextColor(1, 0, 0);
				buttontext:SetFont("Fonts\\FRIZQT__.TTF", 12);
			else
				button:SetChecked(0);
				buttontext:SetTextColor(1, 1, 1);
				buttontext:SetFont("Fonts\\ARIALN.TTF", 12);
			end
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(DAB_Options_BarBrowser, numOptions, 15, 20 );
end

function DAB_BarOptions_OnMouseWheel(direction)
	if (direction > 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX - 1;
	elseif (direction < 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX + 1;
	end
	if (DAB_OBJECT_INDEX > 11) then
		DAB_OBJECT_INDEX = 2;
	elseif (DAB_OBJECT_INDEX < 2) then
		DAB_OBJECT_INDEX = 11;
	end
	DAB_OBJECT_SUBINDEX = DAB_OBJECT_INDEX - 1;
	DAB_Init_BarOptions();
	DAB_BarBrowser_Update();
end

function DAB_BarButtonsMenu_Update()
	local numOptions = table.getn(DAB_BAR_BUTTONS);
	local offset = FauxScrollFrame_GetOffset(DAB_BarOptions_ButtonControl_ButtonsMenu);
	if (not offset) then offset = 0; end
	local index, button;
	
	for i=1, 4 do
		buttonName = "DAB_BarOptions_ButtonControl_ButtonsMenu_Button"..i;
		button = getglobal(buttonName);
		index = offset + i;
		button.action = nil;
		if ( DAB_BAR_BUTTONS[index] ) then
			button:Show();
			button:SetChecked(0);
			button.button = DAB_BAR_BUTTONS[index].button;
			button.page = DAB_BAR_BUTTONS[index].page;
			button.index = index;
			local action = DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].pages[button.page][button.button];
			getglobal(buttonName.."_Icon"):SetTexture(GetActionTexture(action));
			getglobal(buttonName.."_Button"):SetText(DAB_TEXT.Button..": "..DAB_BAR_BUTTONS[index].page.."/"..DAB_BAR_BUTTONS[index].button);
			getglobal(buttonName.."_ActionID"):SetText(DAB_TEXT.Action..": "..action);
			getglobal(buttonName.."_Action"):SetText(DAB_Get_ActionName(action));
			if (DAB_SELECTED_BARBUTTON == index) then
				button:SetChecked(1);
			end
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(DAB_BarOptions_ButtonControl_ButtonsMenu, numOptions, 4, 20 );
	DAB_BarOptions_ButtonControl_ButtonsMenu:Show();
end

function DAB_CBoxOptions_OnMouseWheel(direction)
	if (direction > 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX - 1;
	elseif (direction < 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX + 1;
	end
	if (DAB_OBJECT_INDEX > 27) then
		DAB_OBJECT_INDEX = 18;
	elseif (DAB_OBJECT_INDEX < 18) then
		DAB_OBJECT_INDEX = 27;
	end
	DAB_OBJECT_SUBINDEX = DAB_BAR_LIST[DAB_OBJECT_INDEX].value;
	DAB_Init_ControlBoxOptions();
	DAB_BarBrowser_Update();
end

function DAB_Change_PageControlBar()
	DAB_CONTROL_PAGES = {};
	for i=1, DAB_Settings[DAB_INDEX].Bar[this.value].numBars do
		DAB_CONTROL_PAGES[i] = {text=i, value=i};
	end
	if (DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].changePagePage > DAB_Settings[DAB_INDEX].Bar[this.value].numBars) then
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].changePagePage = 1;
		DL_Init_MenuControl(DAB_CBoxOptions_Control_PageControlPage, DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].changePagePage);
	end
	DAB_Update_Setting(DAB_DropMenu.settingType, this.value, DAB_DropMenu.index, DAB_DropMenu.subindex, DAB_DropMenu.subindex2);
end

function DAB_Change_PageControlType()
	if (this.value == 3) then
		DAB_CBoxOptions_Control_PageControlPage:Show();
	else
		DAB_CBoxOptions_Control_PageControlPage:Hide();
	end
	DAB_Update_Setting(DAB_DropMenu.settingType, this.value, DAB_DropMenu.index, DAB_DropMenu.subindex, DAB_DropMenu.subindex2);
end

function DAB_ChangeActionsMenu_Update()
	local numOptions = 120;
	local offset = FauxScrollFrame_GetOffset(DAB_ChangeActions_ScrollMenu);
	if (not offset) then offset = 0; end
	local index, button, buttontext, icon, idtext;
	
	for i=1, 13 do
		button = getglobal("DAB_ChangeActions_ScrollMenu_Button"..i);
		buttontext = getglobal("DAB_ChangeActions_ScrollMenu_Button"..i.."_Text");
		actionbutton = getglobal("DAB_ChangeActions_ScrollMenu_Button"..i.."_Button");
		icon = getglobal("DAB_ChangeActions_ScrollMenu_Button"..i.."_Button_Icon");
		idtext = getglobal("DAB_ChangeActions_ScrollMenu_Button"..i.."_ID");
		index = offset + i;
		if ( index <= 120 ) then
			idtext:SetText(index..":");
			actionbutton.action = index;
			if (HasAction(index)) then
				icon:SetTexture(GetActionTexture(index));
			else
				icon:SetTexture("Interface\\AddOns\\DiscordLibrary\\EmptyButton");
			end
			buttontext:SetText(DAB_Get_ActionName(index));
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(DAB_ChangeActions_ScrollMenu, numOptions, 13, 40 );
end

function DAB_CheckBox_OnClick()
	local value;
	if (this:GetChecked()) then
		value = 1;
	end
	DAB_Update_Setting(this.settingType, value, this.index, this.subindex, this.subindex2);
end

function DAB_ColorPicker_OnClick()
	local basecolor = DAB_Get_Setting(this.index, this.subindex);
	local color = {};
	color.r = basecolor.r;
	color.g = basecolor.g;
	color.b = basecolor.b;
	ColorPickerFrame.hasOpacity = nil;
	ColorPickerFrame.previousValues = color;
	ColorPickerFrame.cancelFunc = DAB_ColorPicker_ColorCancelled;
	ColorPickerFrame.opacityFunc = DAB_ColorPicker_ColorChanged;
	ColorPickerFrame.func = DAB_ColorPicker_ColorChanged;
	ColorPickerFrame.colorBox = this:GetName();
	ColorPickerFrame.index = this.index;
	ColorPickerFrame.subindex = this.subindex;
	ColorPickerFrame.settingType = this.settingType;
	ColorPickerFrame:SetColorRGB(color.r, color.g, color.b);
	ColorPickerFrame:ClearAllPoints();
	if (DAB_Options:GetRight() < UIParent:GetWidth() / 2) then
		ColorPickerFrame:SetPoint("LEFT", "DAB_Options", "RIGHT", 10, 0);
	else
		ColorPickerFrame:SetPoint("RIGHT", "DAB_Options", "LEFT", -10, 0);
	end
	ColorPickerFrame:Show();
end

function DAB_ColorPicker_ColorCancelled()
	local color = ColorPickerFrame.previousValues;
	getglobal(ColorPickerFrame.colorBox):SetBackdropColor(color.r, color.g, color.b);
	DAB_Update_Setting(ColorPickerFrame.settingType, color, ColorPickerFrame.index, ColorPickerFrame.subindex);
end

function DAB_ColorPicker_ColorChanged()
	local r, g, b = ColorPickerFrame:GetColorRGB();
	local color = { r=r, g=g, b=b };
	getglobal(ColorPickerFrame.colorBox):SetBackdropColor(color.r, color.g, color.b);
	DAB_Update_Setting(ColorPickerFrame.settingType, color, ColorPickerFrame.index, ColorPickerFrame.subindex);
end

function DAB_Condition_Delete()
	local list;
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		list = DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button];
		getglobal("DAB_ActionButton_"..DAB_SELECTED_BARBUTTON).activeConditions = {};
	elseif (DAB_OBJECT_TYPE == "Bar") then
		list = DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions;
		getglobal("DAB_ActionBar_"..DAB_OBJECT_SUBINDEX).activeConditions = {};
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		list = DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions;
		getglobal("DAB_ActionButton_"..DAB_OBJECT_SUBINDEX).activeConditions = {};
	end
	for i=1, table.getn(list) do
		if (i > this:GetParent().index and i > 1) then
			list[i - 1] = {};
			DL_Copy_Table(list[i], list[i - 1]);
		end
	end
	list[table.getn(list)] = nil;
	DAB_ConditionMenu_Update();
end

function DAB_Condition_Edit()
	local ci = this:GetParent().index;
	DAB_Select_Condition(ci, this:GetParent().cboxbase);
	DAB_Select_Response(DAB_CONDITION_BUFFER.response, this:GetParent().cboxbase);
end

function DAB_Condition_MoveDown()
	local list;
	local index = this:GetParent().index;
	local newindex = index + 1;

	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		list = DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button];
	elseif (DAB_OBJECT_TYPE == "Bar") then
		list = DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions;
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		list = DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions;
	end
	if (newindex > table.getn(list)) then return; end

	local buffer = {};
	DL_Copy_Table(list[index], buffer);
	local buffer2 = {};
	DL_Copy_Table(list[newindex], buffer2);

	DL_Copy_Table(buffer2, list[index]);
	DL_Copy_Table(buffer, list[newindex]);
	DAB_ConditionMenu_Update();
end

function DAB_Condition_MoveUp()
	local list;
	local index = this:GetParent().index;
	local newindex = index - 1;
	if (newindex == 0) then return; end

	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		list = DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button];
	elseif (DAB_OBJECT_TYPE == "Bar") then
		list = DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions;
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		list = DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions;
	end

	local buffer = {};
	DL_Copy_Table(list[index], buffer);
	local buffer2 = {};
	DL_Copy_Table(list[newindex], buffer2);

	DL_Copy_Table(buffer2, list[index]);
	DL_Copy_Table(buffer, list[newindex]);
	DAB_ConditionMenu_Update();
end

function DAB_ConditionMenu_Update()
	local list, frame, numButtons;
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local bar = DAB_OBJECT_SUBINDEX;
		if (DAB_Settings[DAB_INDEX].Bar[bar].numButtons == 0) then return; end
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		list = DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button];
		frame = DAB_BarOptions_ButtonControl_ConditionMenu;
		numButtons = 2;
	elseif (DAB_OBJECT_TYPE == "Bar") then
		list = DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions;
		frame = DAB_BarOptions_BarControl_ConditionMenu;
		numButtons = 5;
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		list = DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions;
		frame = DAB_FloaterOptions_Control_ConditionMenu;
		numButtons = 5;
	end
	local numOptions = table.getn(list);
	local offset = FauxScrollFrame_GetOffset(frame);
	if (not offset) then offset = 0; end
	local index, button, text;
	
	for i=1, numButtons do
		button = getglobal(frame:GetName().."_Button"..i);
		index = offset + i;
		if ( list[index] ) then
			button:Disable();
			button:Show();
			button.index = index;
			button.cboxbase = frame:GetName();
			text = DL_Get_MenuText(DL_CONDITIONS_MENU, list[index].condition);
			if (not text) then text = ""; end
			local conditionsIndex;
			for cindex, value in DL_CONDITIONS_MENU do
				if (value.value == list[index].condition) then
					conditionsIndex = cindex;
					break;
				end
			end
			local params = DL_CONDITIONS_MENU[conditionsIndex].params;
			if (params == 1 or params == 2) then
				text = text..": |cFFFFFFFF"..DL_Get_MenuText(DAB_ACTIONS, list[index].action);
				if (list[index].ignoreGlobal) then
					text = text..",|cFFCCCCCC "..DAB_TEXT.IgnoreGlobal;
				end
			elseif (params == 3) then
				text = text.." on "..list[index].unit..": |cFFFFFFFF"..list[index].buff;
			elseif (params == 4) then
				text = text.." |cFFFFFFFF"..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number;
			elseif (params == 5) then
				text = text..": |cFFFFFFFF"..list[index].unit..", "..list[index].text;
			elseif (params == 6) then
				text = text.." Applications "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number.." on "..list[index].unit..": |cFFFFFFFF"..list[index].text;
			elseif (params == 7) then
				local number = list[index].number;
				if (number < 1) then
					number = (number * 100).."%";
				end
				text = text.." "..list[index].unit.." "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..number;
			elseif (params == 8) then
				local form = DL_Get_MenuText(DL_FORMS, list[index].form);
				if (form == "") then
					form = list[index].form;
				end
				text = text..": |cFFFFFFFF"..form;
			elseif (params == 9) then
				text = text..": |cFFFFFFFF"..DL_Get_MenuText(DL_TARGET_PARAMS, list[index].target);
			elseif (params == 10) then
				text = text..": |cFFFFFFFF"..list[index].number;
			elseif (params == 11) then
				text = text..": |cFFFFFFFF"..DL_Get_MenuText(DAB_ACTIONS, list[index].action).." "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number;
			elseif (params == 12) then
				text = text..": |cFFFFFFFF"..list[index].text;
			elseif (params == 13) then
				text = text..": |cFFFFFFFF"..list[index].unit;
			elseif (params == 14) then
				text = text..": |cFFFFFFFF"..list[index].unit.." and "..list[index].unit2;
			elseif (params == 200) then
				text = text..": |cFFFFFFFFBar "..list[index].bar.."'s Page "..DL_Get_MenuText(DL_COMPARE_MENU, list[index].compare).." "..list[index].number;
			end
			getglobal(frame:GetName().."_Button"..i.."ConditionText"):SetText(text);

			text = DAB_TEXT.Response.." |cFFFFFF00"..DL_Get_MenuText(getglobal(frame.responsemenu), list[index].response);
			if (list[index].response == 1) then
				text = text.." to "..list[index].page;
			elseif (list[index].response == 4 or list[index].response == 5 or list[index].response == 7) then
				text = text.." to "..(list[index].alpha * 100).."%";
			elseif (list[index].response == 6 or list[index].response == 8 or list[index].response == 20 or (list[index].response == 22 and list[index].color)) then
				local hex = DL_Get_HexColor(list[index].color.r, list[index].color.g, list[index].color.b);
				text = text.." to "..hex.."this color";
			elseif (list[index].response == 19 or (list[index].response > 10 and list[index].response < 19)) then
				text = text..": |cFFFFFFFF"..list[index].amount;
			elseif (list[index].response == 100 or list[index].response == 101 or list[index].response == 108 or list[index].response == 109 or list[index].response == 114 or list[index].response == 115) then
				text = text..": |cFFFFFFFF"..list[index].rtext;
			elseif (list[index].response == 23 or (list[index].response > 101 and list[index].response < 108)) then
				text = text..": |cFFFFFFFF"..list[index].rnumber;
			elseif (list[index].response == 29 or list[index].response == 111) then
				text = text..": |cFFFFFFFF"..DL_Get_MenuText(DAB_ACTIONS, list[index].raction);
			elseif (list[index].response == 110) then
				text = text..": |cFFFFFFFF"..DL_Get_MenuText(DAB_ACTIONS, list[index].raction).." on "..list[index].runit;
			elseif (list[index].response == 32) then
				text = text.." "..list[index].page2.." to "..list[index].page;
			elseif (list[index].response == 33) then
				text = text..": |cFFFFFFFF"..list[index].runit;
			elseif (list[index].response == 35) then
				text = text..": |cFFFFFFFF"..list[index].rx..", "..list[index].ry;
			elseif (list[index].response == 113) then
				text = text.." "..list[index].rtext.." for "..list[index].rnumber.." seconds";
			end
			getglobal(frame:GetName().."_Button"..i.."ResponseText"):SetText(text);

			text = DAB_TEXT.Overrides.." |cFFFFFFFF";
			for i,o in list[index].overrides do
				if (i == table.getn(list[index].overrides)) then
					text = text..o;
				else
					text = text..o..", ";
				end
			end
			getglobal(frame:GetName().."_Button"..i.."OverrideText"):SetText(text);
			getglobal(frame:GetName().."_Button"..i.."Index"):SetText(index);
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(frame, numOptions, numButtons, 40);
	frame:Show();
end

function DAB_Copy_ControlSettings()
	DAB_CONTROL_BUFFER = {};
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button], DAB_CONTROL_BUFFER);
	elseif (DAB_OBJECT_TYPE == "Bar") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions, DAB_CONTROL_BUFFER);
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions, DAB_CONTROL_BUFFER);
	end
end

function DAB_Copy_Settings()
	DAB_BUFFER = {};
	if (DAB_OBJECT_TYPE == "Bar") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX], DAB_BUFFER);
		DAB_Options_Paste:SetText(DL_PASTETEXT.." (Bar "..DAB_OBJECT_SUBINDEX..")");
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX], DAB_BUFFER);
		DAB_Options_Paste:SetText(DL_PASTETEXT.." (Floater "..DAB_OBJECT_SUBINDEX..")");
	elseif (DAB_OBJECT_TYPE == "ControlBox") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX], DAB_BUFFER);
		DAB_Options_Paste:SetText(DL_PASTETEXT.." (Control Box "..DAB_OBJECT_SUBINDEX..")");
	elseif (DAB_OBJECT_TYPE == "OtherBar") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX], DAB_BUFFER);
		DAB_Options_Paste:SetText(DL_PASTETEXT.." Other Bar");
	end
	DAB_BUFFER_TYPE = DAB_OBJECT_TYPE;
	DAB_Options_Paste:Enable();
end

function DAB_DropMenu_OnClick()
	getglobal(DAB_DropMenu.controlbox):SetText(getglobal(this:GetName().."_Text"):GetText());
	DAB_DropMenu:Hide();
	if (DAB_DropMenu.initFunc) then
		DAB_DropMenu.initFunc();
	else
		DAB_Update_Setting(DAB_DropMenu.settingType, this.value, DAB_DropMenu.index, DAB_DropMenu.subindex, DAB_DropMenu.subindex2);
	end
end

function DAB_EditBox_Update()
	local value = this:GetText();
	if (not value) then value = ""; end
	if (this.number) then
		value = this:GetNumber();
		if (not value) then
			value = 0;
			this:SetText("0");
		end
	end
	this:ClearFocus();
	this.prevvalue = value;
	DAB_Update_Setting(this.settingType, value, this.index, this.subindex);
end

function DAB_Filter_ActionIDs()
	if (DAB_DropMenu.index == "filter1") then
		DAB_ACTIONIDS_FILTER1 = this.value;
		DAB_ACTIONIDS_FILTER2 = 1;
		if (DAB_ACTIONIDS_FILTER1 > 2) then
			DAB_ACTIONID_FILTERS2 = { {text="All Pages", value=1} };
			local bar = this.value - 2;
			for page=1, DAB_Settings[DAB_INDEX].Bar[bar].numBars do
				DAB_ACTIONID_FILTERS2[page + 1] = {text="Page "..page, value=page + 1};
			end
			DAB_SetActionIDs_FilterMenu2_Setting:SetText("All Pages");
		else
			DAB_ACTIONID_FILTERS2 = {};
			DAB_SetActionIDs_FilterMenu2_Setting:SetText("");
		end
	else
		DAB_ACTIONIDS_FILTER2 = this.value;
	end
	DAB_Update_ActionIDsList();
end

function DAB_FloaterOptions_OnMouseWheel(direction)
	if (direction > 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX - 1;
	elseif (direction < 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX + 1;
	end
	if (DAB_OBJECT_INDEX > table.getn(DAB_BAR_LIST)) then
		DAB_OBJECT_INDEX = 29;
	elseif (DAB_OBJECT_INDEX < 29) then
		DAB_OBJECT_INDEX = table.getn(DAB_BAR_LIST);
	end
	DAB_OBJECT_SUBINDEX = DAB_BAR_LIST[DAB_OBJECT_INDEX].value;
	DAB_Init_FloaterOptions();
	DAB_BarBrowser_Update();
end

function DAB_FontEditBox_OnEnterPressed()
	DAB_MenuEditBox_OnEnterPressed();
	DAB_Update_FontList();
end

function DAB_Get_FreeButton()
	local low = 999;
	for i, b in DAB_Settings[DAB_INDEX].FreeButtons do
		if (b < low) then
			low = b;
		end
	end
	local oldFree = {};
	DL_Copy_Table(DAB_Settings[DAB_INDEX].FreeButtons, oldFree);
	DAB_Settings[DAB_INDEX].FreeButtons = {};
	local index = 0;
	for i, b in oldFree do
		if (b ~= low) then
			index = index + 1;
			DAB_Settings[DAB_INDEX].FreeButtons[index] = b;
		end
	end
	return low;
end

function DAB_Get_Setting(index, subindex, subindex2)
	if (index == "Misc") then
		return DAB_Settings[DAB_INDEX][subindex];
	elseif (index == "CONDITION") then
		return DAB_CONDITION_BUFFER[subindex];
	elseif (index == "MainMenuBar") then
		return DAB_Settings[DAB_INDEX].MainMenuBar[subindex];
	else
		if (subindex2) then
			return DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index][subindex][subindex2];
		elseif (subindex) then
			return DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index][subindex];
		else
			return DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index];
		end
	end
end

function DAB_Get_UnusedAction()
	local unusedAction;
	local usedactions = {};
	for bar = 1, DAB_NUM_BARS do
		for page = 1, DAB_Settings[DAB_INDEX].Bar[bar].numBars do
			if (DAB_Settings[DAB_INDEX].Bar[bar].pages[page]) then
				for _, pageAction in DAB_Settings[DAB_INDEX].Bar[bar].pages[page] do
					usedactions[pageAction] = 1;
				end
			end
		end
	end
	for button = 1, 120 do
		if (DAB_Settings[DAB_INDEX].Buttons[button].Bar) then
			usedactions[DAB_Settings[DAB_INDEX].Buttons[button].action] = 1;
		end
	end
	for i = 1, 120 do
		if (not usedactions[i]) then
			unusedAction = i;
			break;
		end
	end
	if (not unusedAction) then
		if (DAB_LAST_USED) then
			DAB_LAST_USED = DAB_LAST_USED + 1;
			unusedAction = DAB_LAST_USED;
		else
			DAB_LAST_USED = 1;
			unusedAction = 1;
		end
	end
	return unusedAction;
end

function DAB_GroupEditBox_OnEnterPressed()
	DAB_MenuEditBox_OnEnterPressed();
	DAB_Update_GroupList();
end

function DAB_HideAllOptions()
	DAB_BarOptions:Hide();
	DAB_OtherBarOptions:Hide();
	DAB_ButtonLayout:Hide();
	DAB_FloaterOptions:Hide();
	DAB_OnEventMacros:Hide();
	DAB_MainBarOptions:Hide();
	DAB_CBoxOptions:Hide();
	DAB_ScriptOptions:Hide();
	DAB_KeybindingOptions:Hide();
	DAB_MiscOptions:Hide();
	DAB_ChangeActions:Hide();
end

function DAB_KeybindingBrowser_Update()
	local numOptions = 120;
	local offset = FauxScrollFrame_GetOffset(DAB_KeybindingOptions_KeybindingBrowser);
	local index, button;
	
	for i=1, 10 do
		button = "DAB_KeybindingOptions_KeybindingBrowser_Button"..i;
		index = offset + i;
		local option = DAB_Settings[DAB_INDEX].Keybindings[index].option;
		local suboption = DAB_Settings[DAB_INDEX].Keybindings[index].suboption;
		local suboption2 = DAB_Settings[DAB_INDEX].Keybindings[index].suboption2;
		getglobal(button).index = index;
		getglobal(button.."Index"):SetText(index);
		DL_Init_MenuControl(getglobal(button.."_Option"), option);
		setglobal("DAB_KEYBINDING_SUBOPTIONS_"..i, {});
		setglobal("DAB_KEYBINDING_SUBOPTIONS2_"..i, {});
		local suboptiontable = getglobal("DAB_KEYBINDING_SUBOPTIONS_"..i);
		local suboption2table = getglobal("DAB_KEYBINDING_SUBOPTIONS2_"..i);
		
		if (option == 0) then
			getglobal(button.."_Suboption_Label"):SetText("");
			getglobal(button.."_Suboption2_Label"):SetText("");
		elseif (option == 1 or option == 10) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Bar);
			getglobal(button.."_Suboption2_Label"):SetText(DAB_TEXT.Button);
			for i=1,10 do
				suboptiontable[i] = {text=i, value=i};
			end
			for i=1,DAB_Settings[DAB_INDEX].Bar[suboption].numButtons do
				local button = DAB_Settings[DAB_INDEX].Bar[suboption].pages[DAB_Settings[DAB_INDEX].Bar[suboption].page][i];
				suboption2table[i] = {text="["..i.."] "..DAB_Get_ActionName(button), value=i};
			end
		elseif (option == 2) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Group);
			getglobal(button.."_Suboption2_Label"):SetText(DAB_TEXT.Button);
			for i=1,120 do
				suboptiontable[i] = {text=i, value=i};
				suboption2table[i] = {text=i, value=i};
			end
		elseif (option == 3 or option == 11) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Floater);
			getglobal(button.."_Suboption2_Label"):SetText("");
			local count = 0;
			for i in DAB_Settings[DAB_INDEX].Floaters do
				count = count + 1;
				suboptiontable[count] = {text="["..i.."] "..DAB_Get_ActionName(DAB_Settings[DAB_INDEX].Buttons[i].action), value=i};
			end
		elseif (option == 4) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.CtrlBox);
			getglobal(button.."_Suboption2_Label"):SetText("");
			for i=1,10 do
				suboptiontable[i] = {text=i, value=i};
			end
		elseif (option == 5) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Group);
			getglobal(button.."_Suboption2_Label"):SetText(DAB_TEXT.Bar);
			for i=1,120 do
				suboptiontable[i] = {text=i, value=i};
			end
			for i=1,10 do
				suboption2table[i] = {text=i, value=i};
			end
		elseif (option == 6) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Bar);
			getglobal(button.."_Suboption2_Label"):SetText(DAB_TEXT.Page);
			for i=1,10 do
				suboptiontable[i] = {text=i, value=i};
			end
			for i=1,DAB_Settings[DAB_INDEX].Bar[suboption].numBars do
				suboption2table[i] = {text=i, value=i};
			end
		elseif (option == 7 or option == 8) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Bar);
			getglobal(button.."_Suboption2_Label"):SetText("");
			for i=1,10 do
				suboptiontable[i] = {text=i, value=i};
			end
		elseif (option == 9) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Number);
			getglobal(button.."_Suboption2_Label"):SetText("");
			for i=1,120 do
				suboptiontable[i] = {text=i, value=i};
			end
		elseif (option == 12) then
			local _, _, bar, page = string.find(suboption, "(%d*)_(%d*)");
			bar = tonumber(bar);
			page = tonumber(page);
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Bar);
			getglobal(button.."_Suboption2_Label"):SetText(DAB_TEXT.Button);
			local index = 0;
			for i=1,10 do
				for page=1, DAB_Settings[DAB_INDEX].Bar[i].numBars do
					index = index + 1;
					suboptiontable[index] = {text=DAB_TEXT.Bar.." "..i..", "..DAB_TEXT.Page.." "..page, value=i.."_"..page};
				end
			end
			for i=1,DAB_Settings[DAB_INDEX].Bar[bar].numButtons do
				local button = DAB_Settings[DAB_INDEX].Bar[bar].pages[page][i];
				suboption2table[i] = {text="["..i.."] "..DAB_Get_ActionName(button), value=i};
			end
		elseif (option == 13 or option == 14) then
			getglobal(button.."_Suboption_Label"):SetText(DAB_TEXT.Action);
			getglobal(button.."_Suboption2_Label"):SetText("");
			for i=1,120 do
				suboptiontable[i] = {text="["..i.."] "..DAB_Get_ActionName(i), value=i};
			end
		end
		DL_Init_MenuControl(getglobal(button.."_Suboption"), suboption);
		DL_Init_MenuControl(getglobal(button.."_Suboption2"), suboption2);
		local key1, key2 = DL_Get_KeybindingText("DAB_"..index, nil, 1);
		if (key1) then
			getglobal(button.."_Key1"):SetText(key1);
		else
			getglobal(button.."_Key1"):SetText("");
		end
		if (key2) then
			getglobal(button.."_Key2"):SetText(key2);
		else
			getglobal(button.."_Key2"):SetText("");
		end
		getglobal(button.."_Key1"):UnlockHighlight();
		getglobal(button.."_Key2"):UnlockHighlight();
		if (DAB_SELECTED_KEYBINDING.index == index) then
			if (DAB_SELECTED_KEYBINDING.keyID == 1) then
				getglobal(button.."_Key1"):LockHighlight();
			else
				getglobal(button.."_Key2"):LockHighlight();
			end
		end
		if (DAB_Settings[DAB_INDEX].Keybindings[index].down) then
			getglobal(button.."_Down"):SetChecked(1);
		else
			getglobal(button.."_Down"):SetChecked(0);
		end
		if (DAB_Settings[DAB_INDEX].Keybindings[index].up) then
			getglobal(button.."_Up"):SetChecked(1);
		else
			getglobal(button.."_Up"):SetChecked(0);
		end
	end
	
	FauxScrollFrame_Update(DAB_KeybindingOptions_KeybindingBrowser, numOptions, 10, 50);
end

function DAB_KeybindingButton_OnClick(button, key)
	local index = this:GetParent().index;
	if (DAB_SELECTED_KEYBINDING) then
		if ( button == "LeftButton" or button == "RightButton" ) then
			if (DAB_SELECTED_KEYBINDING.index == index) then
				DAB_SELECTED_KEYBINDING.index = nil;
			else
				DAB_SELECTED_KEYBINDING.index = index;
				DAB_SELECTED_KEYBINDING.button = this;
				DAB_SELECTED_KEYBINDING.keyID = key;
			end
			DAB_KeybindingBrowser_Update();
			return;
		end
		DAB_KeyBindingFrame_OnKeyDown(button);
	else
		if (DAB_SELECTED_KEYBINDING.button) then
			DAB_SELECTED_KEYBINDING.button:UnlockHighlight();
		end
		DAB_SELECTED_KEYBINDING.index = index;
		DAB_SELECTED_KEYBINDING.button = this;
		DAB_SELECTED_KEYBINDING.keyID = key;
	end
end

function DAB_KeyBindingFrame_OnKeyDown(button)
	if ( not IsMacClient() ) then
		if ( arg1 == "PRINTSCREEN" ) then
			Screenshot();
			return;
		end
	end
	if ( button == "LeftButton" ) then
		button = "BUTTON1";
	elseif ( button == "RightButton" ) then
		button = "BUTTON2";
	elseif ( button == "MiddleButton" ) then
		button = "BUTTON3";
	elseif ( button == "Button4" ) then
		button = "BUTTON4"
	elseif ( button == "Button5" ) then
		button = "BUTTON5"
	end
	if (DAB_SELECTED_KEYBINDING.index) then
		local keybinding = "DAB_"..DAB_SELECTED_KEYBINDING.index;
		local keyPressed;
		if ( button ) then
			if ( button == "BUTTON1" or button == "BUTTON2" ) then
				return;
			end
			keyPressed = button;
		else
			keyPressed = arg1;
		end
		if ( keyPressed == "UNKNOWN" ) then
			return;
		end
		if ( keyPressed == "SHIFT" or keyPressed == "CTRL" or keyPressed == "ALT") then
			return;
		end
		if ( IsShiftKeyDown() ) then
			keyPressed = "SHIFT-"..keyPressed;
		end
		if ( IsControlKeyDown() ) then
			keyPressed = "CTRL-"..keyPressed;
		end
		if ( IsAltKeyDown() ) then
			keyPressed = "ALT-"..keyPressed;
		end
		local key1, key2 = GetBindingKey(keybinding);
		if ( key1 ) then
			SetBinding(key1);
		end
		if ( key2 ) then
			SetBinding(key2);
		end
		if ( DAB_SELECTED_KEYBINDING.keyID == 1 ) then
			DAB_SetBinding(keyPressed, keybinding, key1);
			if ( key2 ) then
				SetBinding(key2, keybinding);
			end
		else
			if ( key1 ) then
				DAB_SetBinding(key1, keybinding);
			end
			DAB_SetBinding(keyPressed, keybinding, key2);
		end
		DAB_Save_Keybindings();
		DAB_Update_Keybindings();
		DAB_KeybindingBrowser_Update();
		DAB_SELECTED_KEYBINDING.index = nil;
		DAB_SELECTED_KEYBINDING.button:UnlockHighlight();
	end
end

function DAB_Load_PresetBackdrop()
	local bgtexture, bordertexture, tile, tileSize, edgeSize, left, right, top, bottom = DL_Get_Backdrop(this.value);
	if (DAB_BAR_OPTIONS == "DAB_BarOptions_LabelTab") then
		DAB_Update_Setting("Label", bgtexture, "Label", "texture", nil, 1);
		DAB_Update_Setting("Label", bordertexture, "Label", "btexture", nil, 1);
		DAB_Update_Setting("Label", tile, "Label", "tile", nil, 1);
		DAB_Update_Setting("Label", tileSize, "Label", "tileSize", nil, 1);
		DAB_Update_Setting("Label", edgeSize, "Label", "edgeSize", nil, 1);
		DAB_Update_Setting("Label", left, "Label", "left", nil, 1);
		DAB_Update_Setting("Label", right, "Label", "right", nil, 1);
		DAB_Update_Setting("Label", top, "Label", "top", nil, 1);
		DAB_Update_Setting("Label", bottom, "Label", "bottom");
	else
		DAB_Update_Setting("Backdrop", bgtexture, "Background", "texture", nil, 1);
		DAB_Update_Setting("Backdrop", bordertexture, "Background", "btexture", nil, 1);
		DAB_Update_Setting("Backdrop", tile, "Background", "tile", nil, 1);
		DAB_Update_Setting("Backdrop", tileSize, "Background", "tileSize", nil, 1);
		DAB_Update_Setting("Backdrop", edgeSize, "Background", "edgeSize", nil, 1);
		DAB_Update_Setting("Backdrop", left, "Background", "left", nil, 1);
		DAB_Update_Setting("Backdrop", right, "Background", "right", nil, 1);
		DAB_Update_Setting("Backdrop", top, "Background", "top", nil, 1);
		DAB_Update_Setting("Backdrop", bottom, "Background", "bottom");
	end
	if (DAB_OBJECT_TYPE == "Bar") then
		DAB_Init_BarOptions();
	else
		DAB_Init_OtherBarOptions();
	end
	DAB_Update_TextureList();
end

function DAB_MenuEditBox_OnEnterPressed()
	this:ClearFocus();
	DAB_Update_Setting(this:GetParent().settingType, this:GetText(), this:GetParent().index, this:GetParent().subindex);
end

function DAB_Nudge(button, dragframe)
	local dir = this:GetID();
	local amt = 1;
	if (button == "RightButton") then
		amt = 10;
	elseif (button == "MiddleButton") then
		amt = 3;
	end
	local x = DAB_Get_Setting("Anchor", "x");
	local y = DAB_Get_Setting("Anchor", "y");
	if (dir == 1) then
		getglobal(this.updateFrame):SetText(y + amt);
		DAB_Update_Setting("Location", y + amt, "Anchor", "y");
	elseif (dir == 2) then
		getglobal(this.updateFrame):SetText(y - amt);
		DAB_Update_Setting("Location", y - amt, "Anchor", "y");
	elseif (dir == 3) then
		getglobal(this.updateFrame):SetText(x - amt);
		DAB_Update_Setting("Location", x - amt, "Anchor", "x");
	elseif (dir == 4) then
		getglobal(this.updateFrame):SetText(x + amt);
		DAB_Update_Setting("Location", x + amt, "Anchor", "x");
	end
end

function DAB_Nudge_OnUpdate(elapsed, dragframe)
	if (not this.timer) then
		this.timer = 1 / 30;
	end
	if (this.movingframe) then
		this.timer = this.timer - elapsed;
		if (this.timer < 0) then
			this.timer = 1 / 30;
			DAB_Nudge("MiddleButton");
		end
	end
end

function DAB_NumButtons_OnMouseWheel()
	if (arg1 < 0) then
		DAB_Remove_ButtonOrPage(this:GetID());
	elseif (arg1 > 0) then
		DAB_Add_ButtonOrPage(this:GetID());
	end
end

function DAB_NumButtons_SetWarning(num)
	local warning = string.gsub(DAB_TEXT.Warning, "$n", num);
	DAB_NumButtons_Warning:SetText(warning);
	DAB_NumButtons_Warning:SetTextColor(1, 1, 0, 1);
	DAB_NumButtons.timer = 3;
end

function DAB_NumButtons_WarningTimeOut(elapsed)
	if (not this.timer) then return; end
	this.timer = this.timer - elapsed;
	if (this.timer < 0) then
		this.timer = nil;
		DAB_NumButtons_Warning:SetText("");
	elseif (this.timer < .5) then
		DAB_NumButtons_Warning:SetTextColor(1, 1, 0, this.timer * 2);
	end
end

function DAB_Options_OnShow()
	 DAB_Update_FloaterList();
	 DAB_Update_ObjectList();
	 DAB_BarBrowser_Update();
end

function DAB_OtherBarOptions_OnMouseWheel(direction)
	if (direction > 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX - 1;
	elseif (direction < 0) then
		DAB_OBJECT_INDEX = DAB_OBJECT_INDEX + 1;
	end
	if (DAB_OBJECT_INDEX > 16) then
		DAB_OBJECT_INDEX = 13;
	elseif (DAB_OBJECT_INDEX < 13) then
		DAB_OBJECT_INDEX = 16;
	end
	DAB_OBJECT_SUBINDEX = DAB_BAR_LIST[DAB_OBJECT_INDEX].value;
	DAB_Init_OtherBarOptions();
	DAB_BarBrowser_Update();
end

function DAB_Paste_ControlSettings()
	if (not DAB_CONTROL_BUFFER) then return; end
	if (DAB_BarOptions_ButtonControl:IsVisible()) then
		local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
		local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
		local bar = DAB_OBJECT_SUBINDEX;
		DL_Copy_Table(DAB_CONTROL_BUFFER, DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button]);
	elseif (DAB_OBJECT_TYPE == "Bar") then
		DL_Copy_Table(DAB_CONTROL_BUFFER, DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions);
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		DL_Copy_Table(DAB_CONTROL_BUFFER, DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions);
	end
	DAB_ConditionMenu_Update();
end

function DAB_Paste_Settings()
	if (DAB_BUFFER_TYPE ~= DAB_OBJECT_TYPE) then return; end
	local initType;
	local oldSettings = {};
	if (DAB_OBJECT_TYPE == "Bar") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX], oldSettings);
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX] = {};
		DL_Copy_Table(DAB_BUFFER, DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX]);
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].numBars = oldSettings.numBars;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].numButtons = oldSettings.numButtons;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].page = oldSettings.page;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].middleClick = oldSettings.middleClick;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].rightClick = oldSettings.rightClick;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].rows = oldSettings.rows;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Label.text = oldSettings.Label.text;
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Anchor = {
				frame = oldSettings.Anchor.frame,
				to = oldSettings.Anchor.to,
				point = oldSettings.Anchor.point,
				x = oldSettings.Anchor.x,
				y = oldSettings.Anchor.y
			};
		DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Scripts = {};
		DL_Copy_Table(oldSettings.Scripts, DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Scripts);
		DAB_Init_BarOptions();
		DAB_Bar_Location(DAB_OBJECT_SUBINDEX);
		DAB_Bar_Initialize(DAB_OBJECT_SUBINDEX);
		DAB_Bar_Label(DAB_OBJECT_SUBINDEX);
		DAB_Bar_Backdrop(DAB_OBJECT_SUBINDEX);
		DAB_Bar_ButtonTextures(DAB_OBJECT_SUBINDEX);
		DAB_Bar_ButtonText(DAB_OBJECT_SUBINDEX);
		DAB_Bar_ButtonSize(DAB_OBJECT_SUBINDEX);
		DAB_Bar_ButtonAlpha(DAB_OBJECT_SUBINDEX);
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX], oldSettings);
		DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX] = {};
		DL_Copy_Table(DAB_BUFFER, DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX]);
		DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX].middleClick = oldSettings.middleClick;
		DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX].rightClick = oldSettings.rightClick;
		DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX].Anchor = {
				frame = oldSettings.Anchor.frame,
				to = oldSettings.Anchor.to,
				point = oldSettings.Anchor.point,
				x = oldSettings.Anchor.x,
				y = oldSettings.Anchor.y
			};
		DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX].Scripts = {};
		DL_Copy_Table(oldSettings.Scripts, DAB_Settings[DAB_INDEX].Floaters[DAB_OBJECT_SUBINDEX].Scripts);
		DAB_Floater_Initialize(DAB_OBJECT_SUBINDEX);
		DAB_Init_FloaterOptions();
	elseif (DAB_OBJECT_TYPE == "ControlBox") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX], oldSettings);
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX] = {};
		DL_Copy_Table(DAB_BUFFER, DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX]);
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].Anchor = {};
		DL_Copy_Table(oldSettings.Anchor, DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].Anchor);
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].group = oldSettings.group;
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].rcgroup = oldSettings.rcgroup;
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].mcgroup = oldSettings.mcgroup;
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].text = oldSettings.text;
		DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].Scripts = {};
		DL_Copy_Table(oldSettings.Scripts, DAB_Settings[DAB_INDEX].ControlBox[DAB_OBJECT_SUBINDEX].Scripts);
		DAB_ControlBox_Initialize(DAB_OBJECT_SUBINDEX);
		DAB_Init_ControlBoxOptions();
	elseif (DAB_OBJECT_TYPE == "OtherBar") then
		DL_Copy_Table(DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX], oldSettings);
		DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX] = {};
		DL_Copy_Table(DAB_BUFFER, DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX]);
		DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX].Anchor = {};
		DL_Copy_Table(oldSettings.Anchor, DAB_Settings[DAB_INDEX].OtherBar[DAB_OBJECT_SUBINDEX].Anchor);
		DAB_OtherBar_Initialize(DAB_OBJECT_SUBINDEX);
		DAB_Init_OtherBarOptions();
	end
end

function DAB_Remove_ButtonOrPage(id)
	if (not id) then
		id = this:GetParent():GetID();
	end
	if (id < 11) then
		if (DAB_Settings[DAB_INDEX].Bar[id].numButtons == 0) then return; end
		local button;
		for i=1, 120 do
			if (DAB_Settings[DAB_INDEX].Buttons[i].Bar == id) then
				button = i;
			end
		end
		DAB_Settings[DAB_INDEX].Buttons[button] = {Conditions={}, Scripts={}, action=button};
		getglobal("DAB_FloaterBox_"..button):ClearAllPoints();
		getglobal("DAB_FloaterBox_"..button):SetPoint("CENTER", UIParent, "CENTER", 0, 0);
		DAB_Settings[DAB_INDEX].FreeButtons[table.getn(DAB_Settings[DAB_INDEX].FreeButtons) + 1] = button;
		for page=1, DAB_Settings[DAB_INDEX].Bar[id].numBars do
			DAB_Settings[DAB_INDEX].Bar[id].pages[page][DAB_Settings[DAB_INDEX].Bar[id].numButtons] = nil;
			DAB_Settings[DAB_INDEX].Bar[id].pageconditions[page][DAB_Settings[DAB_INDEX].Bar[id].numButtons] = nil;
		end
		DAB_Settings[DAB_INDEX].Bar[id].numButtons = DAB_Settings[DAB_INDEX].Bar[id].numButtons - 1;
	else
		id = id - 10;
		if (DAB_Settings[DAB_INDEX].Bar[id].numBars == 1) then return; end
		local p = DAB_Settings[DAB_INDEX].Bar[id].numBars;
		DAB_Settings[DAB_INDEX].Bar[id].pages[p] = nil;
		DAB_Settings[DAB_INDEX].Bar[id].pageconditions[p] = nil;
		getglobal("DAB_ActionBar_"..id).pagemap[DAB_Settings[DAB_INDEX].Bar[id].numBars] = nil;
		DAB_Settings[DAB_INDEX].Bar[id].numBars = DAB_Settings[DAB_INDEX].Bar[id].numBars - 1;
		if (DAB_Settings[DAB_INDEX].Bar[id].page > DAB_Settings[DAB_INDEX].Bar[id].numBars) then
			DAB_Settings[DAB_INDEX].Bar[id].page = DAB_Settings[DAB_INDEX].Bar[id].numBars;
		end
		DAB_Bar_SetPage(id, 1, 1);
	end
	if (DAB_Settings[DAB_INDEX].Bar[id].rows > DAB_Settings[DAB_INDEX].Bar[id].numButtons) then
		DAB_Settings[DAB_INDEX].Bar[id].rows = DAB_Settings[DAB_INDEX].Bar[id].numButtons;
		if (DAB_Settings[DAB_INDEX].Bar[id].rows == 0) then
			DAB_Settings[DAB_INDEX].Bar[id].rows = 1;
		end
	end
	DAB_Init_ButtonLayout();
	DAB_Bar_Initialize(id);
	if (DAB_Settings[DAB_INDEX].AutoConfigureKB) then
		DAB_AutoConfigure_Keybindings();
	end
	DAB_Update_Keybindings();
end

function DAB_Remove_Floater(id)
	if (not id) then
		id = this.value;
	end
	DAB_Settings[DAB_INDEX].Floaters[id] = nil;
	DAB_Settings[DAB_INDEX].FreeButtons[table.getn(DAB_Settings[DAB_INDEX].FreeButtons) + 1] = id;
	DAB_Settings[DAB_INDEX].Buttons[id] = {Conditions={}, Scripts={}, action=id};
	getglobal("DAB_FloaterBox_"..id):ClearAllPoints();
	getglobal("DAB_FloaterBox_"..id):SetPoint("CENTER", UIParent, "CENTER", 0, 0);
	DAB_Init_ButtonLayout();
	DAB_Update_ObjectList();
	DAB_Update_FloaterList();
	DAB_Update_AnchorsList();
	DAB_BarBrowser_Update();
	if (DAB_Settings[DAB_INDEX].AutoConfigureKB) then
		DAB_AutoConfigure_Keybindings();
	end
	DAB_Update_Keybindings();
end

function DAB_Reset_Parameters(options, toggle)
	if (not toggle) then
		getglobal(options.."_ActionID"):Hide();
		getglobal(options.."_ActionID_Setting"):SetText("");
		getglobal(options.."_Bars"):Hide();
		getglobal(options.."_Bars_Setting"):SetText("");
		getglobal(options.."_IgnoreGlobal"):Hide();
		getglobal(options.."_IgnoreGlobal"):SetChecked(0);
		getglobal(options.."_Unit"):Hide();
		getglobal(options.."_Unit_Setting"):SetText("");
		getglobal(options.."_Unit2"):Hide();
		getglobal(options.."_Unit2_Setting"):SetText("");
		getglobal(options.."_Buff"):Hide();
		getglobal(options.."_Buff"):SetText("");
		getglobal(options.."_Comparison"):Hide();
		getglobal(options.."_Comparison_Setting"):SetText("");
		getglobal(options.."_Number"):Hide();
		getglobal(options.."_Number"):SetText("");
		getglobal(options.."_Text"):Hide();
		getglobal(options.."_Text"):SetText("");
		getglobal(options.."_Forms"):Hide();
		getglobal(options.."_Forms_Setting"):SetText("");
		getglobal(options.."_Targets"):Hide();
		getglobal(options.."_Targets_Setting"):SetText("");
	end
	if (DAB_OBJECT_TYPE == "Bar") then
		getglobal(options.."_Page"):Hide();
		getglobal(options.."_Page_Setting"):SetText("");
		if (getglobal(options.."_Page2")) then
			getglobal(options.."_Page2"):Hide();
			getglobal(options.."_Page2_Setting"):SetText("");
		end
	end
	getglobal(options.."_Alpha"):Hide();
	getglobal(options.."_Alpha_Display"):SetText("");
	getglobal(options.."_Color"):Hide();
	getglobal(options.."_Amount"):Hide();
	getglobal(options.."_Amount_Display"):SetText("");
	getglobal(options.."_ResponseNumber"):Hide();
	getglobal(options.."_ResponseNumber"):SetText("");
	getglobal(options.."_ResponseText"):Hide();
	getglobal(options.."_ResponseText"):SetText("");
	getglobal(options.."_ResponseUnit"):Hide();
	getglobal(options.."_ResponseUnit_Setting"):SetText("");
	if (getglobal(options.."_ResponseActionID")) then
		getglobal(options.."_ResponseActionID"):Hide();
		getglobal(options.."_ResponseActionID_Setting"):SetText("");
	end
	if (getglobal(options.."_ResponseX")) then
		getglobal(options.."_ResponseX"):Hide();
		getglobal(options.."_ResponseX"):SetText("");
		getglobal(options.."_ResponseY"):Hide();
		getglobal(options.."_ResponseY"):SetText("");
	end
end

function DAB_Scripts_Compile()
	DAB_Compile_Scripts(DAB_OBJECT_TYPE, DAB_OBJECT_SUBINDEX);
end

function DAB_Scripts_Update()
	if (DAB_CURRENT_SCRIPT) then
		DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX].Scripts[DAB_CURRENT_SCRIPT] = DAB_ScriptOptions_EditBox_Text:GetText();
		DAB_Update_ScriptsList();
	end
end

function DAB_ScrollMenu_OnClick()
	this:GetParent():Hide();
	local text = "";
	local list = getglobal(DAB_ScrollMenu.table);
	for _, value in list do
		if (value.value == this.value) then
			text = value.text;
		end
	end
	getglobal(DAB_ScrollMenu.controlbox):SetText(text);
	if (DAB_ScrollMenu.initFunc) then
		DAB_ScrollMenu.initFunc();
	else
		DAB_Update_Setting(DAB_ScrollMenu.settingType, this.value, DAB_ScrollMenu.index, DAB_ScrollMenu.subindex, DAB_ScrollMenu.subindex2);
	end
end

function DAB_ScrollMenu_Update()
	local list = getglobal(this:GetParent().table);
	if (not list) then return; end
	local numOptions = table.getn(list);
	local offset = FauxScrollFrame_GetOffset(DAB_ScrollMenu_ScrollFrame);
	if (not offset) then offset = 0; end
	local index, button;
	
	for i=1, 10 do
		button = getglobal("DAB_ScrollMenu_Button"..i);
		buttontext = getglobal("DAB_ScrollMenu_Button"..i.."Text");
		index = offset + i;
		if ( list[index] ) then
			buttontext:SetText(list[index].text);
			button:Show();
			button:SetChecked(0);
			button.value = list[index].value;
			button.desc = list[index].desc;
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(DAB_ScrollMenu_ScrollFrame, numOptions, 10, 20 );
end

function DAB_Select_BarButton()
	DAB_SELECTED_BARBUTTON = this.index;
	DAB_BarButtonsMenu_Update();
	DAB_ConditionMenu_Update();
end

function DAB_Select_BarOptions(index)
	DAB_BarOptions_BarAppearance:Hide();
	DAB_BarOptions_ButtonAppearance:Hide();
	DAB_BarOptions_BarControl:Hide();
	DAB_BarOptions_Label:Hide();
	DAB_ScriptOptions:Hide();
	DAB_BarOptions_ButtonControl:Hide();
	if (index == 1) then
		DAB_BarOptions_BarAppearance:Show();
	elseif (index == 2) then
		DAB_BarOptions_BarControl:Show();
		DAB_ConditionMenu_Update();
	elseif (index == 3) then
		DAB_BarOptions_ButtonAppearance:Show();
	elseif (index == 4) then
		DAB_BarOptions_ButtonControl:Show();
		DAB_BarButtonsMenu_Update();
		DAB_ConditionMenu_Update();
	elseif (index == 5) then
		DAB_BarOptions_Label:Show();
	elseif (index == 6) then
		DAB_ScriptOptions:Show();
		DAB_Update_ScriptsList();
	end
end

function DAB_Select_ButtonLayoutOptions(index)
	DAB_NumButtons:Hide();
	DAB_SetActionIDs:Hide();
	if (index == 1) then
		DAB_NumButtons:Show();
	else
		DAB_SetActionIDs:Show();
		DAB_Update_ActionIDsList();
	end
end

function DAB_Select_CboxOptions(index)
	DAB_CBoxOptions_Config:Hide();
	DAB_CBoxOptions_Control:Hide();
	DAB_ScriptOptions:Hide();
	if (index == 1) then
		DAB_CBoxOptions_Config:Show();
	elseif (index == 2) then
		DAB_CBoxOptions_Control:Show();
	elseif (index == 3) then
		DAB_ScriptOptions:Show();
		DAB_Update_ScriptsList();
	end
end

function DAB_Select_Condition(condition, menucontrol)
	if (not condition) then
		DAB_CONDITION_EDITTING = nil;
		condition = this.value;
		DAB_CONDITION_BUFFER = { condition = condition };
	else
		DAB_CONDITION_EDITTING = condition;
		DAB_CONDITION_BUFFER = {};
		if (DAB_BarOptions_ButtonControl:IsVisible()) then
			local page = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].page;
			local button = DAB_BAR_BUTTONS[DAB_SELECTED_BARBUTTON].button;
			local bar = DAB_OBJECT_SUBINDEX;
			DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button][condition], DAB_CONDITION_BUFFER);
			DL_Init_MenuControl(DAB_BarOptions_ButtonControl_Condition, DAB_CONDITION_BUFFER.condition);
			DAB_CONDITION_BUFFER.overrides = "";
			for i,o in DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button][condition].overrides do
				if (i == table.getn(DAB_Settings[DAB_INDEX].Bar[bar].pageconditions[page][button][condition].overrides)) then
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o;
				else
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o..", ";
				end
				DAB_BarOptions_ButtonControl_Overrides:SetText(DAB_CONDITION_BUFFER.overrides);
			end
		elseif (DAB_OBJECT_TYPE == "Bar") then
			DL_Copy_Table(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions[condition], DAB_CONDITION_BUFFER);
			DL_Init_MenuControl(DAB_BarOptions_BarControl_Condition, DAB_CONDITION_BUFFER.condition);
			DAB_CONDITION_BUFFER.overrides = "";
			for i,o in DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions[condition].overrides do
				if (i == table.getn(DAB_Settings[DAB_INDEX].Bar[DAB_OBJECT_SUBINDEX].Conditions[condition].overrides)) then
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o;
				else
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o..", ";
				end
				DAB_BarOptions_BarControl_Overrides:SetText(DAB_CONDITION_BUFFER.overrides);
			end
		elseif (DAB_OBJECT_TYPE == "Floaters") then
			DL_Copy_Table(DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions[condition], DAB_CONDITION_BUFFER);
			DL_Init_MenuControl(DAB_FloaterOptions_Control_Condition, DAB_CONDITION_BUFFER.condition);
			DAB_CONDITION_BUFFER.overrides = "";
			for i,o in DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions[condition].overrides do
				if (i == table.getn(DAB_Settings[DAB_INDEX].Buttons[DAB_OBJECT_SUBINDEX].Conditions[condition].overrides)) then
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o;
				else
					DAB_CONDITION_BUFFER.overrides = DAB_CONDITION_BUFFER.overrides..o..", ";
				end
				DAB_FloaterOptions_Control_Overrides:SetText(DAB_CONDITION_BUFFER.overrides);
			end
		end
		condition = DAB_CONDITION_BUFFER.condition;
	end
	if (not menucontrol) then menucontrol = DAB_ScrollMenu.cboxbase; end
	local options = getglobal(menucontrol):GetParent():GetName();
	DAB_Reset_Parameters(options);
	local conditionsIndex;
	for index, value in DL_CONDITIONS_MENU do
		if (value.value == condition) then
			conditionsIndex = index;
			break;
		end
	end
	local params = DL_CONDITIONS_MENU[conditionsIndex].params;
	if (params == 1) then
		DAB_Show_Parameters({"_ActionID", "_IgnoreGlobal"}, {1, 2}, options);
	elseif (params == 2) then
		DAB_Show_Parameters({"_ActionID"}, {1}, options);
	elseif (params == 3) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
		end
		DAB_Show_Parameters({"_Unit", "_Buff"}, {1, 3}, options);
	elseif (params == 4) then
		DL_Set_Anchor("_ConditionMenu", 0, -50, nil, nil, nil, getglobal(options.."_Comparison"));
		DL_Set_Anchor("_ConditionMenu", 0, -75, nil, nil, nil, getglobal(options.."_Number"));
		DAB_Show_Parameters({"_Comparison", "_Number"}, {1, 3}, options);
	elseif (params == 5) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
		end
		DAB_Show_Parameters({"_Unit", "_Text"}, {1, 3}, options);
	elseif (params == 6) then
		DL_Set_Anchor("_ConditionMenu", 0, -100, nil, nil, nil, getglobal(options.."_Comparison"));
		DL_Set_Anchor("_Comparison", 5, 0, "LEFT", "RIGHT", nil, getglobal(options.."_Number"));
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
		end
		DAB_Show_Parameters({"_Unit", "_Text", "_Comparison", "_Number"}, {1, 3, 1, 3}, options);
	elseif (params == 7) then
		DL_Set_Anchor("_ConditionMenu", 0, -75, nil, nil, nil, getglobal(options.."_Comparison"));
		DL_Set_Anchor("_ConditionMenu", 0, -100, nil, nil, nil, getglobal(options.."_Number"));
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
		end
		DAB_Show_Parameters({"_Unit", "_Comparison", "_Number"}, {1, 1, 3}, options);
	elseif (params == 8) then
		DAB_Show_Parameters({"_Forms"}, {1}, options);
	elseif (params == 9) then
		DAB_Show_Parameters({"_Targets"}, {1}, options);
	elseif (params == 10) then
		DL_Set_Anchor("_ConditionMenu", 0, -50, nil, nil, nil, getglobal(options.."_Number"));
		DAB_Show_Parameters({"_Number"}, {3}, options);
	elseif (params == 11) then
		DL_Set_Anchor("_ConditionMenu", 0, -75, nil, nil, nil, getglobal(options.."_Comparison"));
		DL_Set_Anchor("_ConditionMenu", 0, -100, nil, nil, nil, getglobal(options.."_Number"));
		DAB_Show_Parameters({"_ActionID", "_Comparison", "_Number"}, {1, 1, 3}, options);
	elseif (params == 12) then
		DAB_Show_Parameters({"_Text"}, {3}, options);
	elseif (params == 13) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
		end
		DAB_Show_Parameters({"_Unit"}, {1}, options);
	elseif (params == 14) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.unit = "player";
			DAB_CONDITION_BUFFER.unit2 = "player";
		end
		DAB_Show_Parameters({"_Unit", "_Unit2"}, {1, 1}, options);
	elseif (params == 200) then
		DL_Set_Anchor("_ConditionMenu", 0, -75, nil, nil, nil, getglobal(options.."_Comparison"));
		DL_Set_Anchor("_ConditionMenu", 0, -100, nil, nil, nil, getglobal(options.."_Number"));
		DAB_Show_Parameters({"_Bars", "_Comparison", "_Number"}, {1, 1, 3}, options);
	end
end

function DAB_Select_Event()
	DAB_MACRO_EVENT = this.value;
	local desc = "";
	for _,v in DAB_EVENTS do
		if (v.value == DAB_MACRO_EVENT) then
			desc = v.desc;
			break;
		end
	end
	DAB_OnEventMacros_Description:SetText(desc);
	if (DAB_Settings[DAB_INDEX].EventMacros[DAB_MACRO_EVENT]) then
		DAB_OnEventMacros_EditBox_Text:SetText(DAB_Settings[DAB_INDEX].EventMacros[DAB_MACRO_EVENT]);
	else
		DAB_OnEventMacros_EditBox_Text:SetText("");
	end
end

function DAB_Select_FloaterOptions(index)
	DAB_FloaterOptions_Config:Hide();
	DAB_FloaterOptions_AdvConfig:Hide();
	DAB_FloaterOptions_Control:Hide();
	DAB_ScriptOptions:Hide();
	if (index == 1) then
		DAB_FloaterOptions_Config:Show();
	elseif (index == 2) then
		DAB_FloaterOptions_AdvConfig:Show();
	elseif (index == 3) then
		DAB_FloaterOptions_Control:Show();
	elseif (index == 4) then
		DAB_ScriptOptions:Show();
		DAB_Update_ScriptsList();
	end
end

function DAB_Select_Response(response, menucontrol)
	if (not DAB_CONDITION_BUFFER) then return; end
	if (not menucontrol) then menucontrol = DAB_ScrollMenu.cboxbase; end
	local options = getglobal(menucontrol):GetParent():GetName();
	if (not response) then
		response = this.value;
		DAB_CONDITION_BUFFER.response = response;
	else
		response = DAB_CONDITION_BUFFER.response;
		DL_Init_MenuControl(getglobal(options.."_Response"), response);
	end
	DAB_Reset_Parameters(options, 1);
	if (response == 1) then
		DAB_Show_Parameters({"_Page"}, {1}, options);
	elseif (response == 4 or response == 5 or response == 7) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.alpha = 1;
			DL_Init_Slider(getglobal(options.."_Alpha"), 1);
		end
		DAB_Show_Parameters({"_Alpha"}, {4}, options);
	elseif (response == 6 or response == 8 or response == 20 or response == 22) then
		if (response ~= 22 or (not DAB_BarOptions_BarControl:IsShown())) then
			DAB_CONDITION_BUFFER.color = {r=1, g=1, b=1};
			DL_Init_ColorPicker(getglobal(options.."_Color"), DAB_CONDITION_BUFFER.color);
			DAB_Show_Parameters({"_Color"}, {5}, options);
		end
	elseif (response == 10) then
		DAB_Show_Parameters({"_ResponseNumber"}, {3}, options);
	elseif (response == 19 or (response > 10 and response < 19)) then
		if (not DAB_CONDITION_EDITTING) then
			DAB_CONDITION_BUFFER.amount = 50;
			DL_Init_Slider(getglobal(options.."_Amount"), 50);
		end
		DAB_Show_Parameters({"_Amount"}, {4}, options);
	elseif (response == 100 or response == 101 or response == 108 or response == 109 or response == 114 or response == 115) then
		DAB_Show_Parameters({"_ResponseText"}, {3}, options);
	elseif (response == 23 or (response > 101 and response < 108)) then
		DAB_Show_Parameters({"_ResponseNumber"}, {3}, options);
	elseif (response == 29 or response == 111) then
		DAB_Show_Parameters({"_ResponseActionID"}, {1}, options);
	elseif (response == 32) then
		DAB_Show_Parameters({"_Page", "_Page2"}, {1, 1}, options);
	elseif (response == 33) then
		DAB_Show_Parameters({"_ResponseUnit"}, {1}, options);
	elseif (response == 35) then
		DAB_Show_Parameters({"_ResponseX", "_ResponseY"}, {3,3}, options);
	elseif (response == 110) then
		DAB_Show_Parameters({"_ResponseActionID", "_ResponseUnit"}, {1,1}, options);
	elseif (response == 113) then
		DAB_Show_Parameters({"_ResponseNumber", "_ResponseText"}, {3,3}, options);
	end
end

function DAB_Select_Script(value)
	if (not value) then
		value = this.value;
	end
	DAB_CURRENT_SCRIPT = value;
	local desc = "";
	for _,v in DAB_SCRIPTS do
		if (v.value == DAB_CURRENT_SCRIPT) then
			desc = v.desc;
			break;
		end
	end
	DAB_ScriptOptions_Description:SetText(desc);
	local text = DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX].Scripts[DAB_CURRENT_SCRIPT];
	if (text) then
		DAB_ScriptOptions_EditBox_Text:SetText(text);
	else
		DAB_ScriptOptions_EditBox_Text:SetText("");
	end
end

function DAB_Set_OptionsScale(override)
	if (override) then
		DAB_Settings[DAB_INDEX].optionsScale = override;
	else
		DAB_Settings[DAB_INDEX].optionsScale = this.value;
	end
	DAB_Options:SetScale(DAB_Settings[DAB_INDEX].optionsScale / 100);
	DAB_Options:ClearAllPoints();
	DAB_Options:SetPoint("CENTER", UIParent, "CENTER", 0, 0);
end

function DAB_SetActionIDsMenu_Update()
	local numOptions = table.getn(DAB_ACTIONIDS_LIST);
	local offset = FauxScrollFrame_GetOffset(DAB_SetActionIDs_ScrollMenu);
	if (not offset) then offset = 0; end
	local index, button, buttontext, menucontrol;
	
	for i=1, 19 do
		button = getglobal("DAB_SetActionIDs_ScrollMenu_Button"..i);
		buttontext = getglobal("DAB_SetActionIDs_ScrollMenu_Button"..i.."_Text");
		menucontrol = getglobal("DAB_SetActionIDs_ScrollMenu_Button"..i.."_ActionMenu");
		index = offset + i;
		if ( DAB_ACTIONIDS_LIST[index] ) then
			button:Show();
			menucontrol.subindex = DAB_ACTIONIDS_LIST[index].bar;
			if (DAB_ACTIONIDS_LIST[index].bar == "F") then
				buttontext:SetText("Floater "..DAB_ACTIONIDS_LIST[index].button);
				menucontrol.subindex2 = DAB_ACTIONIDS_LIST[index].button;
			else
				buttontext:SetText("Bar "..DAB_ACTIONIDS_LIST[index].bar..", Page "..DAB_ACTIONIDS_LIST[index].page..", Button "..DAB_ACTIONIDS_LIST[index].button);
				menucontrol.subindex2 = index;
			end
			DL_Init_MenuControl(menucontrol, DAB_ACTIONIDS_LIST[index].action);
		else
			button:Hide();
		end
	end
	
	FauxScrollFrame_Update(DAB_SetActionIDs_ScrollMenu, numOptions, 19, 25 );
	DAB_SetActionIDs_ScrollMenu:Show();
end

function DAB_SetBinding(key, selectedBinding, oldKey)
	if ( SetBinding(key, selectedBinding) ) then
		return;
	else
		if ( oldKey ) then
			SetBinding(oldKey, selectedBinding);
		end
		DL_Error("Can't bind mousewheel to actions with up and down states");
	end
end

function DAB_Show_Parameters(parameters, types, base)
	for i, param in parameters do
		local frame = getglobal(base..param);
		frame:Show();
		if (DAB_CONDITION_EDITTING) then
			if (types[i] == 1) then
				DL_Init_MenuControl(frame, DAB_CONDITION_BUFFER[frame.subindex]);
			elseif (types[i] == 2) then
				DL_Init_CheckBox(frame, DAB_CONDITION_BUFFER[frame.subindex]);
			elseif (types[i] == 3) then
				DL_Init_EditBox(frame, DAB_CONDITION_BUFFER[frame.subindex]);
			elseif (types[i] == 4) then
				if (not DAB_CONDITION_BUFFER[frame.subindex]) then
					local min, max = frame:GetMinMaxValues();
					if (frame.scale) then
						max = max / frame.scale;
					end
					DAB_CONDITION_BUFFER[frame.subindex] = max;
				end
				DL_Init_Slider(frame, DAB_CONDITION_BUFFER[frame.subindex]);
			elseif (types[i] == 5) then
				if (not DAB_CONDITION_BUFFER[frame.subindex]) then
					DAB_CONDITION_BUFFER[frame.subindex] = {r=1, g=1, b=1};
				end
				DL_Init_ColorPicker(frame, DAB_CONDITION_BUFFER[frame.subindex]);
			end
		elseif (param == "_Unit" or param == "_Unit2") then
			DL_Init_MenuControl(frame, "player");
		end
	end
end

function DAB_Show_Window(index)
	DAB_HideAllOptions();

	DAB_OBJECT_INDEX = index;
	if (index < 12) then
		DAB_OBJECT_TYPE = "Bar";
	elseif (index > 12 and index < 17) then
		DAB_OBJECT_TYPE = "OtherBar";
	elseif (index < 28) then
		DAB_OBJECT_TYPE = "ControlBox";
	else
		DAB_OBJECT_TYPE = "Floaters";
	end
	DAB_OBJECT_SUBINDEX = DAB_BAR_LIST[index].value;

	if (DAB_OBJECT_TYPE == "Bar") then
		DAB_BarOptions:Show();
		DAB_Init_BarOptions();
		if (DAB_BAR_OPTIONS == "DAB_BarOptions_ScriptsTab") then
			DAB_ScriptOptions:Show();
			DAB_Update_ScriptsList();
		end
	elseif (DAB_OBJECT_TYPE == "Floaters") then
		DAB_FloaterOptions:Show();
		DAB_Init_FloaterOptions();
		if (DAB_FLOATER_OPTIONS == "DAB_FloaterOptions_ScriptsTab") then
			DAB_ScriptOptions:Show();
			DAB_Update_ScriptsList();
		end
	elseif (DAB_OBJECT_TYPE == "ControlBox") then
		DAB_CBoxOptions:Show();
		DAB_Init_ControlBoxOptions();
		if (DAB_CBOX_OPTIONS == "DAB_CBoxOptions_ScriptsTab") then
			DAB_ScriptOptions:Show();
			DAB_Update_ScriptsList();
		end
	elseif (DAB_OBJECT_TYPE == "OtherBar") then
		DAB_OtherBarOptions:Show();
		DAB_Init_OtherBarOptions();
	end
end

function DAB_Slider_Update()
	if (not DAB_INITIALIZED) then return; end
	if (not this.minmaxset) then return; end
	local setting = DAB_Get_Setting(this.index, this.subindex);
	if (this.scale) then
		setting = setting * this.scale;
	end
	if (setting == this:GetValue()) then return; end
	local min, max = this:GetMinMaxValues();
	if (setting < min or setting > max) then
		return;
	end
	local value = this:GetValue();
	getglobal(this:GetName().."_Display"):SetText(value);
	if (this.scale) then
		value = value / this.scale;
	end
	DAB_Update_Setting(this.settingType, value, this.index, this.subindex, this.subindex2);
end

function DAB_Slider_UpdateFromEditBox()
	local value = this:GetNumber();
	if (not value) then value = 0; end
	local min, max = this:GetParent():GetMinMaxValues();
	if (this:GetParent().minlocked and value < min) then value = min; end
	if (this:GetParent().maxlocked and value > max) then value = max; end
	this:SetText(value);
	if (value >= min and value <= max) then
		this:GetParent():SetValue(value);
	end
	this:ClearFocus();
	if (this:GetParent().scale) then
		value = value / this:GetParent().scale;
	end
	DAB_Update_Setting(this:GetParent().settingType, value, this:GetParent().index, this:GetParent().subindex);
end

function DAB_TextureEditBox_OnEnterPressed()
	DAB_MenuEditBox_OnEnterPressed();
	DAB_Update_TextureList();
end

function DAB_UnitEditBox_OnEnterPressed()
	DAB_MenuEditBox_OnEnterPressed();
	DAB_Update_UnitList();
end

function DAB_Update_ActionIDsList()
	DAB_ACTIONIDS_LIST = {};
	local index = 0;
	if (DAB_ACTIONIDS_FILTER1 ~= 2) then
		for bar = 1, DAB_NUM_BARS do
			if (DAB_ACTIONIDS_FILTER1 == 1 or bar == DAB_ACTIONIDS_FILTER1 - 2) then
				for page = 1, DAB_Settings[DAB_INDEX].Bar[bar].numBars do
					if (DAB_ACTIONIDS_FILTER2 == 1 or page == DAB_ACTIONIDS_FILTER2 - 1) then
						for button = 1, DAB_Settings[DAB_INDEX].Bar[bar].numButtons do
							index = index + 1;
							DAB_ACTIONIDS_LIST[index] = {bar = bar, page = page, button = button, action = DAB_Settings[DAB_INDEX].Bar[bar].pages[page][button]};
						end
					end
				end
			end
		end
	end
	if (DAB_ACTIONIDS_FILTER1 < 3) then
		for i=1,DAB_NUM_BUTTONS do
			if (DAB_Settings[DAB_INDEX].Floaters[i]) then
				index = index + 1;
				DAB_ACTIONIDS_LIST[index] = {bar = "F", button = i, action = DAB_Settings[DAB_INDEX].Buttons[i].action};
			end
		end
	end
	DAB_SetActionIDsMenu_Update();
end

function DAB_Update_ScriptsList()
	for index, val in DAB_SCRIPTS do
		if (DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX].Scripts[val.value] and DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX].Scripts[val.value] ~= "") then
			if (string.sub(DAB_SCRIPTS[index].text, -2) ~= " *") then
				DAB_SCRIPTS[index].text = DAB_SCRIPTS[index].text.." *";
			end
		elseif (string.sub(DAB_SCRIPTS[index].text, -2) == " *") then
			DAB_SCRIPTS[index].text = string.sub(DAB_SCRIPTS[index].text, 1, -2);
		end
	end
end

function DAB_Update_Setting(settingType, value, index, subindex, subindex2, override)
	if (subindex == "font") then
		if (not string.find(value, "\\")) then
			value = DAB_Settings[DAB_INDEX].defaultFont..value;
		end
	end
	if ((index and string.find(index, "texture")) or (subindex and string.find(subindex, "texture"))) then
		if (not string.find(value, "\\")) then
			value = DAB_Settings[DAB_INDEX].defaultTexture..value;
		end
	end
	if (index == "Misc") then
		if (subindex == "UpdateSpeed") then
			DAB_Settings[DAB_INDEX].UpdateSpeed = value;
			DAB_UPDATE_SPEED = 1 / DAB_Settings[DAB_INDEX].UpdateSpeed;
		else
			DAB_Settings[DAB_INDEX][subindex] = value;
			if (subindex2) then
				subindex2();
			end
		end
		return;
	elseif (index == "SETACTIONID") then
		if (subindex == "F") then
			DAB_Settings[DAB_INDEX].Buttons[subindex2].action = value;
			DAB_ActionButton_Update(subindex2);
			DAB_Update_FloaterList();
			DAB_Update_ObjectList();
			DAB_BarBrowser_Update();
		else
			DAB_Settings[DAB_INDEX].Bar[subindex].pages[DAB_ACTIONIDS_LIST[subindex2].page][DAB_ACTIONIDS_LIST[subindex2].button] = value;
			DAB_Bar_SetPage(subindex, DAB_ACTIONIDS_LIST[subindex2].page, 1);
		end
		DAB_Update_ActionIDsList();
		DAB_SetActionIDsMenu_Update();
		return;
	elseif (index == "CONDITION") then
		DAB_CONDITION_BUFFER[subindex] = value;
	elseif (index == "MainMenuBar") then
		DAB_Settings[DAB_INDEX].MainMenuBar[subindex] = value;
		DAB_Update_MainMenuBar();
		return;
	elseif (index == "KEYBINDING") then
		local kbindex;
		if (subindex2 == "CheckBox") then
			kbindex = this:GetParent().index;
		elseif (subindex2 == "DropMenu") then
			local cbox = string.gsub(DAB_DropMenu.controlbox, "_Setting", "");
			kbindex = getglobal(cbox):GetParent().index;
		else
			local cbox = string.gsub(DAB_ScrollMenu.controlbox, "_Setting", "");
			kbindex = getglobal(cbox):GetParent().index;
		end
		DAB_Settings[DAB_INDEX].Keybindings[kbindex][subindex] = value;
		if (subindex2 == "DropMenu") then
			if (value == 12) then
				DAB_Settings[DAB_INDEX].Keybindings[kbindex].suboption = "1_1";
				DAB_Settings[DAB_INDEX].Keybindings[kbindex].suboption2 = 1;
			else
				DAB_Settings[DAB_INDEX].Keybindings[kbindex].suboption = 1;
				DAB_Settings[DAB_INDEX].Keybindings[kbindex].suboption2 = 1;
			end
		end
		DAB_KeybindingBrowser_Update();
		DAB_Update_Keybindings();
		return;
	else
		if (subindex2) then
			DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index][subindex][subindex2] = value;
		elseif (subindex) then
			DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index][subindex] = value;
		else
			DAB_Settings[DAB_INDEX][DAB_OBJECT_TYPE][DAB_OBJECT_SUBINDEX][index] = value;
		end
	end
	if ((not override) and settingType ~= 0) then
		local func;
		if (DAB_OBJECT_TYPE == "Bar") then
			func = "DAB_Bar_";
		elseif (DAB_OBJECT_TYPE == "Floaters") then
			func = "DAB_Floater_";
		elseif (DAB_OBJECT_TYPE == "ControlBox") then
			func = "DAB_ControlBox_";
			settingType = nil;
		elseif (DAB_OBJECT_TYPE == "OtherBar") then
			func = "DAB_OtherBar_";
			settingType = nil;
		end
		if (not settingType) then
			settingType = "Initialize";
		end
		getglobal(func..settingType)(DAB_OBJECT_SUBINDEX);
	end
	if (index == "Label" and subindex == "text") then
		DAB_Update_ObjectList();
		DAB_BarBrowser_Update();
	end
end