| Zerotorescue@62 | 1 local addon = select(2, ...); | 
| Zerotorescue@62 | 2 local mod = addon:NewModule("Config"); | 
| Zerotorescue@62 | 3 | 
| Zerotorescue@62 | 4 local options, groupIdToName, groupIsVirtual, temp, count, includeTradeSkillItems, currentGroupType = {}, {}, {}, {}, 0, 500, "Normal"; | 
| Zerotorescue@62 | 5 local AceConfigDialog, AceConfigRegistry, AceSerializer; | 
| Zerotorescue@62 | 6 | 
| Zerotorescue@76 | 7 local unknownItemName = "Unknown (#%d)"; | 
| Zerotorescue@76 | 8 | 
| Zerotorescue@62 | 9 -- Private functions and tables | 
| Zerotorescue@62 | 10 | 
| Zerotorescue@62 | 11 local function SetOption(info, value, multiSelectEnabled) | 
| Zerotorescue@62 | 12 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 13 	local optionName = info[#info]; | 
| Zerotorescue@62 | 14 | 
| Zerotorescue@62 | 15 	-- Special treatment for override toggle boxes | 
| Zerotorescue@62 | 16 	if optionName:find("override") then | 
| Zerotorescue@62 | 17 		if not value and info.arg then | 
| Zerotorescue@62 | 18 			-- If this override was disabled and a saved variable name was provided, set it to nil rather than false | 
| Zerotorescue@62 | 19 | 
| Zerotorescue@62 | 20 			value = nil; | 
| Zerotorescue@62 | 21 | 
| Zerotorescue@62 | 22 			-- If this is an override toggler then also set the related field to nil | 
| Zerotorescue@62 | 23 			addon.db.profile.groups[groupName][info.arg] = nil; | 
| Zerotorescue@62 | 24 		elseif value and info.arg then | 
| Zerotorescue@62 | 25 			-- If this override is now enabled, we need to copy the default into this field (unless it is not nil (which is supposed to be impossible), in which case we'll use the already selected value) | 
| Zerotorescue@62 | 26 | 
| Zerotorescue@68 | 27 			local inheritedValue = addon:GetOptionByKey(groupName, info.arg); | 
| Zerotorescue@68 | 28 | 
| Zerotorescue@75 | 29 			addon.db.profile.groups[groupName][info.arg] = (type(inheritedValue) == "table" and CopyTable(inheritedValue)) or inheritedValue; -- copying defaults by reference would let one (unintendedly) change the defaults | 
| Zerotorescue@62 | 30 		end | 
| Zerotorescue@62 | 31 	end | 
| Zerotorescue@62 | 32 | 
| Zerotorescue@62 | 33 	if multiSelectEnabled ~= nil then | 
| Zerotorescue@62 | 34 		-- The saved vars for a multiselect will always be an array, it may not yet exist in which case it must be created. | 
| Zerotorescue@62 | 35 		if not addon.db.profile.groups[groupName][optionName] then | 
| Zerotorescue@62 | 36 			addon.db.profile.groups[groupName][optionName] = {}; | 
| Zerotorescue@62 | 37 		end | 
| Zerotorescue@62 | 38 | 
| Zerotorescue@62 | 39 		addon.db.profile.groups[groupName][optionName][value] = multiSelectEnabled or nil; | 
| Zerotorescue@62 | 40 	else | 
| Zerotorescue@62 | 41 		addon.db.profile.groups[groupName][optionName] = value; | 
| Zerotorescue@62 | 42 	end | 
| Zerotorescue@62 | 43 end | 
| Zerotorescue@62 | 44 | 
| Zerotorescue@62 | 45 local function GetOption(info) | 
| Zerotorescue@62 | 46 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 47 	local optionName = info[#info]; | 
| Zerotorescue@62 | 48 | 
| Zerotorescue@62 | 49 	local noDefault; | 
| Zerotorescue@62 | 50 | 
| Zerotorescue@62 | 51 	if optionName:find("override") then | 
| Zerotorescue@62 | 52 		noDefault = true; | 
| Zerotorescue@62 | 53 	end | 
| Zerotorescue@62 | 54 | 
| Zerotorescue@62 | 55 	return addon:GetOptionByKey(groupName, optionName, noDefault); | 
| Zerotorescue@62 | 56 end | 
| Zerotorescue@62 | 57 | 
| Zerotorescue@62 | 58 local function GetMultiOption(info, value) | 
| Zerotorescue@62 | 59 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 60 	local optionName = info[#info]; | 
| Zerotorescue@62 | 61 | 
| Zerotorescue@68 | 62 	local multiSelectValue = addon:GetOptionByKey(groupName, optionName); | 
| Zerotorescue@68 | 63 | 
| Zerotorescue@68 | 64 	return multiSelectValue and multiSelectValue[value]; | 
| Zerotorescue@62 | 65 end | 
| Zerotorescue@62 | 66 | 
| Zerotorescue@62 | 67 local function GetDisabled(info) | 
| Zerotorescue@62 | 68 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 69 	local optionName = info[#info]; | 
| Zerotorescue@62 | 70 | 
| Zerotorescue@62 | 71 	if optionName:find("override") or not info.arg then | 
| Zerotorescue@62 | 72 		return false; | 
| Zerotorescue@62 | 73 	end | 
| Zerotorescue@62 | 74 | 
| Zerotorescue@62 | 75 	return (addon:GetOptionByKey(groupName, info.arg, true) == nil); | 
| Zerotorescue@62 | 76 end | 
| Zerotorescue@62 | 77 | 
| Zerotorescue@62 | 78 local function ValidateGroupName(_, value) | 
| Zerotorescue@62 | 79 	value = string.lower(string.trim(value or "")); | 
| Zerotorescue@62 | 80 | 
| Zerotorescue@62 | 81 	for name, _ in pairs(addon.db.profile.groups) do | 
| Zerotorescue@62 | 82 		if string.lower(name) == value then | 
| Zerotorescue@62 | 83 			return ("A group named \"%s\" already exists."):format(name); | 
| Zerotorescue@62 | 84 		end | 
| Zerotorescue@62 | 85 	end | 
| Zerotorescue@62 | 86 | 
| Zerotorescue@62 | 87 	return true; | 
| Zerotorescue@62 | 88 end | 
| Zerotorescue@62 | 89 | 
| Zerotorescue@62 | 90 local tblAddItemTemplate = { | 
| Zerotorescue@62 | 91 	order = 0, | 
| Zerotorescue@62 | 92 	type = "input", | 
| Zerotorescue@62 | 93 	name = function(info) | 
| Zerotorescue@62 | 94 		local itemName, _, itemRarity = GetItemInfo(info[#info]); | 
| Zerotorescue@62 | 95 		return tostring( 7 - (itemRarity or 0) ) .. (itemName or ""); | 
| Zerotorescue@62 | 96 	end, | 
| Zerotorescue@62 | 97 	get = function(info) | 
| Zerotorescue@140 | 98 		return tostring(info[#info]); -- Ace is going to be bitching about this if it's a numeric value, so we transmute it into a string here then back to a number on the other side | 
| Zerotorescue@62 | 99 	end, | 
| Zerotorescue@75 | 100 	set = function(groupId, itemData) | 
| Zerotorescue@62 | 101     	-- This is NOT a real "set", we pass the widget reference to this function which contains similar, but not the same, info. | 
| Zerotorescue@62 | 102 | 
| Zerotorescue@76 | 103     	if itemData then | 
| Zerotorescue@76 | 104 			local groupName = groupIdToName[groupId]; | 
| Zerotorescue@76 | 105 | 
| Zerotorescue@76 | 106 			if not itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 107 				addon:Print("Couldn't add the item with itemId (" .. itemData.id .. ") because it is already in a group.", addon.Colors.Red); | 
| Zerotorescue@76 | 108 			end | 
| Zerotorescue@76 | 109 | 
| Zerotorescue@76 | 110 			if AceConfigRegistry then | 
| Zerotorescue@76 | 111 				-- Now rebuild the list | 
| Zerotorescue@76 | 112 				AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 113 			end | 
| Zerotorescue@62 | 114     	end | 
| Zerotorescue@62 | 115 	end, | 
| Zerotorescue@62 | 116 	width = "double", | 
| Zerotorescue@62 | 117 	dialogControl = "ConfigItemLinkButton", | 
| Zerotorescue@62 | 118 }; | 
| Zerotorescue@62 | 119 | 
| Zerotorescue@62 | 120 local tblRemoveItemTemplate = { | 
| Zerotorescue@62 | 121 	order = 0, | 
| Zerotorescue@62 | 122 	type = "input", | 
| Zerotorescue@62 | 123 	name = function(info) | 
| Zerotorescue@62 | 124 		local itemName, _, itemRarity = GetItemInfo(info[#info]); | 
| Zerotorescue@62 | 125 		return tostring( 7 - (itemRarity or 0) ) .. (itemName or ""); | 
| Zerotorescue@62 | 126 	end, | 
| Zerotorescue@62 | 127 	get = function(info) | 
| Zerotorescue@62 | 128 		return tostring(info[#info]); -- Ace is going to be anal about this if it's a numeric value, so we transmute it into a string here then back to a number on the other side | 
| Zerotorescue@62 | 129 	end, | 
| Zerotorescue@75 | 130 	set = function(groupId, itemData) | 
| Zerotorescue@62 | 131     	-- This is NOT a real "set", we pass the widget reference to this function which contains similar, but not the same, info. | 
| Zerotorescue@62 | 132 | 
| Zerotorescue@76 | 133     	if itemData then | 
| Zerotorescue@62 | 134 	    	local groupName = groupIdToName[groupId]; | 
| Zerotorescue@62 | 135 | 
| Zerotorescue@76 | 136 	    	itemData:RemoveFromGroup(groupName); | 
| Zerotorescue@62 | 137 | 
| Zerotorescue@76 | 138 			if AceConfigRegistry then | 
| Zerotorescue@76 | 139 				-- Now rebuild the list | 
| Zerotorescue@76 | 140 				AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 141 			end | 
| Zerotorescue@62 | 142     	end | 
| Zerotorescue@62 | 143 	end, | 
| Zerotorescue@62 | 144 	width = "double", | 
| Zerotorescue@62 | 145 	dialogControl = "ConfigItemLinkButton", | 
| Zerotorescue@62 | 146 }; | 
| Zerotorescue@62 | 147 | 
| Zerotorescue@62 | 148 local function UpdateAddItemList(info) | 
| Zerotorescue@62 | 149 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 150 | 
| Zerotorescue@62 | 151 	if not addon.db.profile.groups[groupName].items then | 
| Zerotorescue@62 | 152 		addon.db.profile.groups[groupName].items = {}; | 
| Zerotorescue@62 | 153 	end | 
| Zerotorescue@62 | 154 | 
| Zerotorescue@140 | 155 	-- Merge all items from all groups together (we only use this to check if an item is already in a group) | 
| Zerotorescue@62 | 156 	local items = {}; | 
| Zerotorescue@62 | 157 	for groupName, values in pairs(addon.db.profile.groups) do | 
| Zerotorescue@62 | 158 		if values.items then | 
| Zerotorescue@140 | 159 			for itemId, count in pairs(values.items) do | 
| Zerotorescue@140 | 160 				items[itemId] = tonumber(count) or 0; | 
| Zerotorescue@62 | 161 			end | 
| Zerotorescue@62 | 162 		end | 
| Zerotorescue@62 | 163 	end | 
| Zerotorescue@62 | 164 | 
| Zerotorescue@62 | 165 	local ref = options.args.groups.args[info[2]].args.add.args.list.args; | 
| Zerotorescue@62 | 166 | 
| Zerotorescue@62 | 167 	-- Remaking the list, so out with the old, in with the new | 
| Zerotorescue@62 | 168 	table.wipe(ref); | 
| Zerotorescue@62 | 169 | 
| Zerotorescue@62 | 170 	-- Parse bags and show these | 
| Zerotorescue@62 | 171 	for bagID = 4, 0, -1 do | 
| Zerotorescue@62 | 172 		for slot = 1, GetContainerNumSlots(bagID) do | 
| Zerotorescue@62 | 173 			local itemId = addon:GetItemId(GetContainerItemLink(bagID, slot)); | 
| Zerotorescue@62 | 174 | 
| Zerotorescue@62 | 175 			if itemId then | 
| Zerotorescue@62 | 176 				if not items[itemId] then | 
| Zerotorescue@62 | 177 					-- If this item isn't used in any group yet | 
| Zerotorescue@62 | 178 					ref[itemId] = tblAddItemTemplate; | 
| Zerotorescue@62 | 179 				else | 
| Zerotorescue@62 | 180 					-- It's already used in a group, don't show it | 
| Zerotorescue@62 | 181 					ref[itemId] = nil; | 
| Zerotorescue@62 | 182 				end | 
| Zerotorescue@62 | 183 			end | 
| Zerotorescue@62 | 184 		end | 
| Zerotorescue@62 | 185 	end | 
| Zerotorescue@62 | 186 | 
| Zerotorescue@62 | 187 	if includeTradeSkillItems ~= 500 then | 
| Zerotorescue@62 | 188 		-- Include tradeskill items | 
| Zerotorescue@62 | 189 | 
| Zerotorescue@62 | 190 		-- Go through all trade skills for the profession | 
| Zerotorescue@62 | 191 		for i = 1, GetNumTradeSkills() do | 
| Zerotorescue@62 | 192 			-- Try to retrieve the itemlink, this will be nil if current item is a group instead | 
| Zerotorescue@62 | 193 			local itemLink = GetTradeSkillItemLink(i); | 
| Zerotorescue@62 | 194 | 
| Zerotorescue@62 | 195 			if itemLink then | 
| Zerotorescue@62 | 196 				local itemId = addon:GetItemId(itemLink); | 
| Zerotorescue@62 | 197 				if not itemId then | 
| Zerotorescue@62 | 198 					-- If this isn't an item, it can only be an enchant instead | 
| Zerotorescue@62 | 199 					itemId = tonumber(itemLink:match("|Henchant:([-0-9]+)|h")); | 
| Zerotorescue@62 | 200 | 
| Zerotorescue@62 | 201 					itemId = addon.scrollIds[itemId]; -- change enchantIds into scrollIds | 
| Zerotorescue@62 | 202 				end | 
| Zerotorescue@62 | 203 | 
| Zerotorescue@62 | 204 				if itemId then | 
| Zerotorescue@62 | 205 					local itemLevel = select(4, GetItemInfo(itemId)) or 0; | 
| Zerotorescue@62 | 206 | 
| Zerotorescue@62 | 207 					if includeTradeSkillItems == 0 or itemLevel >= includeTradeSkillItems then | 
| Zerotorescue@62 | 208 						if not items[itemId] then | 
| Zerotorescue@62 | 209 							-- If this item isn't used in any group yet | 
| Zerotorescue@62 | 210 							ref[itemId] = tblAddItemTemplate; | 
| Zerotorescue@62 | 211 						else | 
| Zerotorescue@62 | 212 							-- It's already used in a group, don't show it | 
| Zerotorescue@62 | 213 							ref[itemId] = nil; | 
| Zerotorescue@62 | 214 						end | 
| Zerotorescue@62 | 215 					end | 
| Zerotorescue@62 | 216 				else | 
| Zerotorescue@89 | 217 					addon:Debug("|cffff0000ERROR|r: Couldn't find proper item id for %s", itemLink); | 
| Zerotorescue@62 | 218 				end | 
| Zerotorescue@62 | 219 			end | 
| Zerotorescue@62 | 220 		end | 
| Zerotorescue@62 | 221 	end | 
| Zerotorescue@62 | 222 end | 
| Zerotorescue@62 | 223 | 
| Zerotorescue@62 | 224 local function UpdateRemoveItemList(info) | 
| Zerotorescue@62 | 225 	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 226 | 
| Zerotorescue@62 | 227 	if not addon.db.profile.groups[groupName].items then | 
| Zerotorescue@62 | 228 		addon.db.profile.groups[groupName].items = {}; | 
| Zerotorescue@62 | 229 	end | 
| Zerotorescue@62 | 230 | 
| Zerotorescue@62 | 231 	local ref = options.args.groups.args[info[2]].args.remove.args.list.args; | 
| Zerotorescue@62 | 232 | 
| Zerotorescue@62 | 233 	-- Unset all | 
| Zerotorescue@62 | 234 	for itemId, _ in pairs(ref) do | 
| Zerotorescue@62 | 235 		ref[itemId] = nil; | 
| Zerotorescue@62 | 236 	end | 
| Zerotorescue@62 | 237 | 
| Zerotorescue@62 | 238 	-- Parse items in group and show these | 
| Zerotorescue@62 | 239 	for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do | 
| Zerotorescue@62 | 240 		ref[itemId] = tblRemoveItemTemplate; | 
| Zerotorescue@62 | 241 	end | 
| Zerotorescue@62 | 242 end | 
| Zerotorescue@62 | 243 | 
| Zerotorescue@62 | 244 -- Default group | 
| Zerotorescue@62 | 245 local defaultGroup = { | 
| Zerotorescue@62 | 246 	order = 0, | 
| Zerotorescue@62 | 247 	type = "group", | 
| Zerotorescue@62 | 248 	childGroups = "tab", | 
| Zerotorescue@62 | 249 	name = function(info) | 
| Zerotorescue@62 | 250 		local groupId = info[#info]; | 
| Zerotorescue@62 | 251 		if groupIsVirtual[groupId] then | 
| Zerotorescue@62 | 252 			return ("%s  |cfffed000Virtual|r"):format(groupIdToName[groupId]); | 
| Zerotorescue@62 | 253 		else | 
| Zerotorescue@62 | 254 			return groupIdToName[groupId]; | 
| Zerotorescue@62 | 255 		end | 
| Zerotorescue@62 | 256 	end, | 
| Zerotorescue@62 | 257 	desc = function(info) | 
| Zerotorescue@62 | 258 		local groupId = info[#info]; | 
| Zerotorescue@62 | 259 		if groupIsVirtual[groupId] then | 
| Zerotorescue@62 | 260 			return "This is a virtual group, you can use it to override the defaults for other groups."; | 
| Zerotorescue@62 | 261 		end | 
| Zerotorescue@62 | 262 	end, | 
| Zerotorescue@62 | 263 	args = { | 
| Zerotorescue@62 | 264 		general = { | 
| Zerotorescue@62 | 265 			order = 10, | 
| Zerotorescue@62 | 266 			type = "group", | 
| Zerotorescue@62 | 267 			name = "General", | 
| Zerotorescue@62 | 268 			desc = "Change the general settings for just this group.", | 
| Zerotorescue@62 | 269 			args = { | 
| Zerotorescue@62 | 270 				general = { | 
| Zerotorescue@62 | 271 					order = 0, | 
| Zerotorescue@62 | 272 					type = "group", | 
| Zerotorescue@62 | 273 					inline = true, | 
| Zerotorescue@62 | 274 					name = "General", | 
| Zerotorescue@62 | 275 					set = SetOption, | 
| Zerotorescue@62 | 276 					get = GetOption, | 
| Zerotorescue@62 | 277 					disabled = GetDisabled, | 
| Zerotorescue@62 | 278 					args = { | 
| Zerotorescue@62 | 279 						description = { | 
| Zerotorescue@62 | 280 							order = 0, | 
| Zerotorescue@62 | 281 							type = "description", | 
| Zerotorescue@62 | 282 							name = function(info) | 
| Zerotorescue@62 | 283 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 284 | 
| Zerotorescue@106 | 285 								local t = ""; | 
| Zerotorescue@106 | 286 								if not addon.db.profile.defaults.hideHelp then | 
| Zerotorescue@155 | 287 									t = "Here you can set general settings for the currently selected group. If you do not wish to override a setting, the default setting specified in the general group will be used."; | 
| Zerotorescue@62 | 288 								end | 
| Zerotorescue@62 | 289 | 
| Zerotorescue@62 | 290 								return t; | 
| Zerotorescue@62 | 291 							end, | 
| Zerotorescue@62 | 292 						}, | 
| Zerotorescue@62 | 293 						header = { | 
| Zerotorescue@62 | 294 							order = 5, | 
| Zerotorescue@62 | 295 							type = "header", | 
| Zerotorescue@62 | 296 							name = "", | 
| Zerotorescue@106 | 297 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 298 						}, | 
| Zerotorescue@155 | 299 						overrideTrackAtCharacters = { | 
| Zerotorescue@155 | 300 							order = 19, | 
| Zerotorescue@62 | 301 							type = "toggle", | 
| Zerotorescue@155 | 302 							name = "Override track at", | 
| Zerotorescue@155 | 303 							desc = "Allows you to override at which characters items in this group should appear in the summary and generate alerts.", | 
| Zerotorescue@155 | 304 							arg = "trackAtCharacters", | 
| Zerotorescue@62 | 305 						}, | 
| Zerotorescue@155 | 306 						trackAtCharacters = { | 
| Zerotorescue@155 | 307 							order = 20, | 
| Zerotorescue@155 | 308 							type = "multiselect", | 
| Zerotorescue@155 | 309 							name = "Track at", | 
| Zerotorescue@155 | 310 							desc = "Select at which characters this should appear in the summary and generate alerts.", | 
| Zerotorescue@62 | 311 							values = function() | 
| Zerotorescue@62 | 312 								local temp = {}; | 
| Zerotorescue@155 | 313 								for charName in pairs(addon.db.factionrealm.characters) do | 
| Zerotorescue@155 | 314 									temp[charName] = charName; | 
| Zerotorescue@62 | 315 								end | 
| Zerotorescue@62 | 316 | 
| Zerotorescue@62 | 317 								return temp; | 
| Zerotorescue@62 | 318 							end, | 
| Zerotorescue@155 | 319 							get = GetMultiOption, | 
| Zerotorescue@155 | 320 							dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead. | 
| Zerotorescue@155 | 321 							arg = "overrideTrackAtCharacters", | 
| Zerotorescue@62 | 322 						}, | 
| Zerotorescue@62 | 323 						overrideLocalItemData = { | 
| Zerotorescue@62 | 324 							order = 39, | 
| Zerotorescue@62 | 325 							type = "toggle", | 
| Zerotorescue@62 | 326 							name = "Override local item data", | 
| Zerotorescue@62 | 327 							desc = "Allows you to override the local item data setting for this group.", | 
| Zerotorescue@62 | 328 							arg = "localItemData", | 
| Zerotorescue@62 | 329 						}, | 
| Zerotorescue@62 | 330 						localItemData = { | 
| Zerotorescue@62 | 331 							order = 40, | 
| Zerotorescue@62 | 332 							type = "multiselect", | 
| Zerotorescue@62 | 333 							name = "Include in local item data", | 
| Zerotorescue@62 | 334 							desc = "Select which data should be included in the local item data.", | 
| Zerotorescue@62 | 335 							values = { | 
| Zerotorescue@62 | 336 								["Bag"] = "Bag", | 
| Zerotorescue@62 | 337 								["Bank"] = "Bank", | 
| Zerotorescue@62 | 338 								["Auction House"] = "Auction House", | 
| Zerotorescue@62 | 339 								["Mailbox"] = "Mailbox", | 
| Zerotorescue@62 | 340 							}, | 
| Zerotorescue@62 | 341 							get = GetMultiOption, | 
| Zerotorescue@65 | 342 							dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead. | 
| Zerotorescue@62 | 343 							arg = "overrideLocalItemData", | 
| Zerotorescue@62 | 344 						}, | 
| Zerotorescue@62 | 345 						virtualGroup = { | 
| Zerotorescue@62 | 346 							order = 50, | 
| Zerotorescue@62 | 347 							type = "select", | 
| Zerotorescue@62 | 348 							name = "Use virtual group settings", | 
| Zerotorescue@62 | 349 							desc = "Use the settings from a virtual group before using the general defaults.\n\n|cffff9933This is an advanced option, you will probably not need it unless you manage a lot of groups.|r\n\n|cfffed000Off|r: Use the overridden options in this group and then the defaults.\n\n|cfffed000On|r: Use the overridden options in this group, then the ones in the selected virtual group and then the defaults.", | 
| Zerotorescue@62 | 350 							values = function(info) | 
| Zerotorescue@62 | 351 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 352 | 
| Zerotorescue@62 | 353 								local temp = {}; | 
| Zerotorescue@62 | 354 | 
| Zerotorescue@62 | 355 								temp[""] = ""; | 
| Zerotorescue@62 | 356 								for name, values in pairs(addon.db.profile.groups) do | 
| Zerotorescue@62 | 357 									if values.isVirtual and name ~= groupName then | 
| Zerotorescue@62 | 358 										temp[name] = name; | 
| Zerotorescue@62 | 359 									end | 
| Zerotorescue@62 | 360 								end | 
| Zerotorescue@62 | 361 | 
| Zerotorescue@62 | 362 								return temp; | 
| Zerotorescue@62 | 363 							end, | 
| Zerotorescue@62 | 364 							set = function(info, value) | 
| Zerotorescue@62 | 365 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 366 								local optionName = info[#info]; | 
| Zerotorescue@62 | 367 | 
| Zerotorescue@62 | 368 								addon.db.profile.groups[groupName][optionName] = value ~= "" and value; | 
| Zerotorescue@62 | 369 							end, | 
| Zerotorescue@62 | 370 							disabled = false, | 
| Zerotorescue@62 | 371 						}, | 
| Zerotorescue@62 | 372 					}, | 
| Zerotorescue@62 | 373 				}, | 
| Zerotorescue@62 | 374 				minimumStock = { | 
| Zerotorescue@62 | 375 					order = 10, | 
| Zerotorescue@62 | 376 					type = "group", | 
| Zerotorescue@62 | 377 					inline = true, | 
| Zerotorescue@62 | 378 					name = "Minimum stock", | 
| Zerotorescue@62 | 379 					set = SetOption, | 
| Zerotorescue@62 | 380 					get = GetOption, | 
| Zerotorescue@62 | 381 					disabled = GetDisabled, | 
| Zerotorescue@62 | 382 					args = { | 
| Zerotorescue@62 | 383 						description = { | 
| Zerotorescue@62 | 384 							order = 0, | 
| Zerotorescue@62 | 385 							type = "description", | 
| Zerotorescue@62 | 386 							name = "Here you can specify the minimum amount of items you wish to keep in stock and related settings for the currently selected group. Please note the values entered here do not affect the queued quantities, you must set settings for that in the area below.", | 
| Zerotorescue@106 | 387 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 388 						}, | 
| Zerotorescue@62 | 389 						header = { | 
| Zerotorescue@62 | 390 							order = 5, | 
| Zerotorescue@62 | 391 							type = "header", | 
| Zerotorescue@62 | 392 							name = "", | 
| Zerotorescue@106 | 393 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 394 						}, | 
| Zerotorescue@62 | 395 | 
| Zerotorescue@62 | 396 						overrideMinLocalStock = { | 
| Zerotorescue@62 | 397 							order = 10, | 
| Zerotorescue@62 | 398 							type = "toggle", | 
| Zerotorescue@62 | 399 							name = "Override min local stock", | 
| Zerotorescue@62 | 400 							desc = "Allows you to override the minimum local stock setting for this group.", | 
| Zerotorescue@62 | 401 							arg = "minLocalStock", | 
| Zerotorescue@62 | 402 						}, | 
| Zerotorescue@62 | 403 						minLocalStock = { | 
| Zerotorescue@62 | 404 							order = 11, | 
| Zerotorescue@62 | 405 							type = "range", | 
| Zerotorescue@62 | 406 							min = 0, | 
| Zerotorescue@62 | 407 							max = 100000, | 
| Zerotorescue@62 | 408 							softMax = 100, | 
| Zerotorescue@62 | 409 							step = 1, | 
| Zerotorescue@62 | 410 							name = "Minimum local stock", | 
| Zerotorescue@62 | 411 							desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.", | 
| Zerotorescue@62 | 412 							arg = "overrideMinLocalStock", | 
| Zerotorescue@62 | 413 						}, | 
| Zerotorescue@62 | 414 						overrideAlertBelowLocalMinimum = { | 
| Zerotorescue@62 | 415 							order = 15, | 
| Zerotorescue@62 | 416 							type = "toggle", | 
| Zerotorescue@62 | 417 							name = "Override local minimum alert", | 
| Zerotorescue@62 | 418 							desc = "Allows you to override wether an alert should be shown when an item in this group gets below the local minimum stock threshold.", | 
| Zerotorescue@62 | 419 							arg = "alertBelowLocalMinimum", | 
| Zerotorescue@62 | 420 						}, | 
| Zerotorescue@62 | 421 						alertBelowLocalMinimum = { | 
| Zerotorescue@62 | 422 							order = 16, | 
| Zerotorescue@62 | 423 							type = "toggle", | 
| Zerotorescue@62 | 424 							name = "Alert when below local minimum (NYI)", | 
| Zerotorescue@62 | 425 							desc = "Show an alert when an item in this group gets below the local minimum stock threshold.", | 
| Zerotorescue@62 | 426 							arg = "overrideAlertBelowLocalMinimum", | 
| Zerotorescue@62 | 427 						}, | 
| Zerotorescue@82 | 428 						overrideAutoRefill = { | 
| Zerotorescue@82 | 429 							order = 17, | 
| Zerotorescue@82 | 430 							type = "toggle", | 
| Zerotorescue@82 | 431 							name = "Override auto refill", | 
| Zerotorescue@82 | 432 							desc = "Allows you to override wether you want to automatically refill items when below the minimum local stock.", | 
| Zerotorescue@82 | 433 							arg = "autoRefill", | 
| Zerotorescue@82 | 434 						}, | 
| Zerotorescue@82 | 435 						autoRefill = { | 
| Zerotorescue@82 | 436 							order = 18, | 
| Zerotorescue@82 | 437 							type = "toggle", | 
| Zerotorescue@131 | 438 							name = "Auto refill from storage", | 
| Zerotorescue@131 | 439 							desc = "Automatically refill items from your storage (bank/mailbox - unless this is included in the local count - or the guild bank) when below the minimum local stock.", | 
| Zerotorescue@82 | 440 							arg = "overrideAutoRefill", | 
| Zerotorescue@82 | 441 						}, | 
| Zerotorescue@62 | 442 | 
| Zerotorescue@62 | 443 						overrideMinGlobalStock = { | 
| Zerotorescue@62 | 444 							order = 20, | 
| Zerotorescue@62 | 445 							type = "toggle", | 
| Zerotorescue@62 | 446 							name = "Override min global stock", | 
| Zerotorescue@62 | 447 							desc = "Allows you to override the minimum global stock setting for this group.", | 
| Zerotorescue@62 | 448 							arg = "minGlobalStock", | 
| Zerotorescue@62 | 449 						}, | 
| Zerotorescue@62 | 450 						minGlobalStock = { | 
| Zerotorescue@62 | 451 							order = 21, | 
| Zerotorescue@62 | 452 							type = "range", | 
| Zerotorescue@62 | 453 							min = 0, | 
| Zerotorescue@62 | 454 							max = 100000, | 
| Zerotorescue@62 | 455 							softMax = 100, | 
| Zerotorescue@62 | 456 							step = 1, | 
| Zerotorescue@62 | 457 							name = "Minimum global stock", | 
| Zerotorescue@62 | 458 							desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.", | 
| Zerotorescue@62 | 459 							arg = "overrideMinGlobalStock", | 
| Zerotorescue@62 | 460 						}, | 
| Zerotorescue@62 | 461 						overrideAlertBelowGlobalMinimum = { | 
| Zerotorescue@62 | 462 							order = 25, | 
| Zerotorescue@62 | 463 							type = "toggle", | 
| Zerotorescue@62 | 464 							name = "Override global minimum alert", | 
| Zerotorescue@62 | 465 							desc = "Allows you to override wether an alert should be shown when an item in this group gets below the global minimum stock threshold.", | 
| Zerotorescue@62 | 466 							arg = "alertBelowGlobalMinimum", | 
| Zerotorescue@62 | 467 						}, | 
| Zerotorescue@62 | 468 						alertBelowGlobalMinimum = { | 
| Zerotorescue@62 | 469 							order = 26, | 
| Zerotorescue@62 | 470 							type = "toggle", | 
| Zerotorescue@62 | 471 							name = "Alert when below global minimum (NYI)", | 
| Zerotorescue@62 | 472 							desc = "Show an alert when an item in this group gets below the global minimum stock threshold.", | 
| Zerotorescue@62 | 473 							arg = "overrideAlertBelowGlobalMinimum", | 
| Zerotorescue@62 | 474 						}, | 
| Zerotorescue@62 | 475 | 
| Zerotorescue@62 | 476 						overrideSummaryThresholdShow = { | 
| Zerotorescue@62 | 477 							order = 34, | 
| Zerotorescue@62 | 478 							type = "toggle", | 
| Zerotorescue@62 | 479 							name = "Override summary showing", | 
| Zerotorescue@62 | 480 							desc = "Allows you to override when this group should appear in the summary.", | 
| Zerotorescue@62 | 481 							arg = "summaryThresholdShow", | 
| Zerotorescue@62 | 482 						}, | 
| Zerotorescue@62 | 483 						summaryThresholdShow = { | 
| Zerotorescue@62 | 484 							order = 35, | 
| Zerotorescue@62 | 485 							type = "range", | 
| Zerotorescue@62 | 486 							min = 0, | 
| Zerotorescue@62 | 487 							max = 10, | 
| Zerotorescue@62 | 488 							softMax = 100, | 
| Zerotorescue@62 | 489 							step = 0.05, | 
| Zerotorescue@62 | 490 							isPercent = true, | 
| Zerotorescue@62 | 491 							name = "Show in summary when below", | 
| Zerotorescue@62 | 492 							desc = "Show items in the summary when below the specified percentage of the minimum stock.\n\nYou can manually enter a value between 1.000% and 10.000% in the edit box if the provided range is insufficient.", | 
| Zerotorescue@62 | 493 							arg = "overrideSummaryThresholdShow", | 
| Zerotorescue@62 | 494 						}, | 
| Zerotorescue@62 | 495 					}, | 
| Zerotorescue@62 | 496 				}, | 
| Zerotorescue@62 | 497 				refill = { | 
| Zerotorescue@62 | 498 					order = 20, | 
| Zerotorescue@62 | 499 					type = "group", | 
| Zerotorescue@62 | 500 					inline = true, | 
| Zerotorescue@62 | 501 					name = "Replenishing stock", | 
| Zerotorescue@62 | 502 					set = SetOption, | 
| Zerotorescue@62 | 503 					get = GetOption, | 
| Zerotorescue@62 | 504 					disabled = GetDisabled, | 
| Zerotorescue@62 | 505 					args = { | 
| Zerotorescue@62 | 506 						description = { | 
| Zerotorescue@62 | 507 							order = 0, | 
| Zerotorescue@62 | 508 							type = "description", | 
| Zerotorescue@62 | 509 							name = function(info) | 
| Zerotorescue@62 | 510 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 511 								local r = "Here you can specify the amount of items to which you wish to restock when you are collecting new items for the currently selected group. This may be higher than the minimum stock.\n\n"; | 
| Zerotorescue@62 | 512 | 
| Zerotorescue@62 | 513 								r = r .. "When restocking the target amount is |cfffed000" .. addon:GetOptionByKey(groupName, "restockTarget") .. "|r of every item. Not queueing craftable items when only missing |cfffed000" .. floor( addon:GetOptionByKey(groupName, "minCraftingQueue") * addon:GetOptionByKey(groupName, "restockTarget") ) .. "|r (|cfffed000" .. ( addon:GetOptionByKey(groupName, "minCraftingQueue") * 100 ) .. "%|r) of the restock target and making |cfffed000" .. floor( ( addon:GetOptionByKey(groupName, "bonusQueue") * addon:GetOptionByKey(groupName, "restockTarget") ) + .5 ) .. "|r (|cfffed000" .. ( addon:GetOptionByKey(groupName, "bonusQueue") * 100 ) .. "%|r) extra items when you completely ran out. "; | 
| Zerotorescue@62 | 514 | 
| Zerotorescue@62 | 515 								if addon:GetOptionByKey(groupName, "priceThreshold") == 0 then | 
| Zerotorescue@62 | 516 									r = r .. "Queueing items at |cfffed000any|r auction value."; | 
| Zerotorescue@62 | 517 								else | 
| Zerotorescue@62 | 518 									r = r .. "Queueing items worth |cfffed000" .. addon:ReadableMoney(addon:GetOptionByKey(groupName, "priceThreshold")) .. "|r or more."; | 
| Zerotorescue@62 | 519 								end | 
| Zerotorescue@62 | 520 | 
| Zerotorescue@62 | 521 								return r; | 
| Zerotorescue@62 | 522 							end, | 
| Zerotorescue@106 | 523 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 524 						}, | 
| Zerotorescue@62 | 525 						header = { | 
| Zerotorescue@62 | 526 							order = 5, | 
| Zerotorescue@62 | 527 							type = "header", | 
| Zerotorescue@62 | 528 							name = "", | 
| Zerotorescue@106 | 529 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 530 						}, | 
| Zerotorescue@62 | 531 						overrideRestockTarget = { | 
| Zerotorescue@62 | 532 							order = 9, | 
| Zerotorescue@62 | 533 							type = "toggle", | 
| Zerotorescue@62 | 534 							name = "Override restock target", | 
| Zerotorescue@62 | 535 							desc = "Allows you to override the restock target setting for this group.", | 
| Zerotorescue@62 | 536 							arg = "restockTarget", | 
| Zerotorescue@62 | 537 						}, | 
| Zerotorescue@62 | 538 						restockTarget = { | 
| Zerotorescue@62 | 539 							order = 10, | 
| Zerotorescue@62 | 540 							type = "range", | 
| Zerotorescue@62 | 541 							min = 0, | 
| Zerotorescue@62 | 542 							max = 100000, | 
| Zerotorescue@62 | 543 							softMax = 100, | 
| Zerotorescue@62 | 544 							step = 1, | 
| Zerotorescue@62 | 545 							name = "Restock target", | 
| Zerotorescue@62 | 546 							desc = "You can manually enter a value between 100 and 100.000 in the edit box if the provided range is insufficient.", | 
| Zerotorescue@62 | 547 							arg = "overrideRestockTarget", | 
| Zerotorescue@62 | 548 						}, | 
| Zerotorescue@62 | 549 						overrideMinCraftingQueue = { | 
| Zerotorescue@62 | 550 							order = 19, | 
| Zerotorescue@62 | 551 							type = "toggle", | 
| Zerotorescue@62 | 552 							name = "Override min queue", | 
| Zerotorescue@62 | 553 							desc = "Allows you to override the minimum craftable items queue setting for this group.", | 
| Zerotorescue@62 | 554 							arg = "minCraftingQueue", | 
| Zerotorescue@62 | 555 						}, | 
| Zerotorescue@62 | 556 						minCraftingQueue = { | 
| Zerotorescue@62 | 557 							order = 20, | 
| Zerotorescue@62 | 558 							type = "range", | 
| Zerotorescue@62 | 559 							min = 0, | 
| Zerotorescue@62 | 560 							max = 1, | 
| Zerotorescue@62 | 561 							step = 0.01, | 
| Zerotorescue@62 | 562 							isPercent = true, | 
| Zerotorescue@154 | 563 							name = "Don't queue when only missing...", | 
| Zerotorescue@154 | 564 							desc = "Don't add a craftable item to the queue when only missing this much or less of the restock target.\n\nExample: if your restock target is set to 60 and this is set to 5%, an item won't be queued unless you are missing more than 3 of it.", | 
| Zerotorescue@62 | 565 							arg = "overrideMinCraftingQueue", | 
| Zerotorescue@62 | 566 						}, | 
| Zerotorescue@62 | 567 						overrideBonusQueue = { | 
| Zerotorescue@62 | 568 							order = 29, | 
| Zerotorescue@62 | 569 							type = "toggle", | 
| Zerotorescue@62 | 570 							name = "Override bonus queue", | 
| Zerotorescue@62 | 571 							desc = "Allows you to override the bonus craftable items queue setting for this group.", | 
| Zerotorescue@62 | 572 							arg = "bonusQueue", | 
| Zerotorescue@62 | 573 						}, | 
| Zerotorescue@62 | 574 						bonusQueue = { | 
| Zerotorescue@62 | 575 							order = 30, | 
| Zerotorescue@62 | 576 							type = "range", | 
| Zerotorescue@62 | 577 							min = 0, | 
| Zerotorescue@62 | 578 							max = 10, -- 1000% | 
| Zerotorescue@62 | 579 							step = 0.01, -- 1% | 
| Zerotorescue@62 | 580 							isPercent = true, | 
| Zerotorescue@62 | 581 							name = "Bonus queue", | 
| Zerotorescue@62 | 582 							desc = "Get additional items when there are none left.\n\nExample: if your restock target is set to 60 and this is set to 10%, you will get 66 items instead of just 60 if you end up with none left while queueing.", | 
| Zerotorescue@62 | 583 							arg = "overrideBonusQueue", | 
| Zerotorescue@62 | 584 						}, | 
| Zerotorescue@62 | 585 						overridePriceThreshold = { | 
| Zerotorescue@62 | 586 							order = 39, | 
| Zerotorescue@62 | 587 							type = "toggle", | 
| Zerotorescue@62 | 588 							name = "Override price threshold", | 
| Zerotorescue@62 | 589 							desc = "Allows you to override the price threshold setting for this group.", | 
| Zerotorescue@62 | 590 							arg = "priceThreshold", | 
| Zerotorescue@62 | 591 						}, | 
| Zerotorescue@62 | 592 						priceThreshold = { | 
| Zerotorescue@62 | 593 							order = 40, | 
| Zerotorescue@62 | 594 							type = "input", | 
| Zerotorescue@62 | 595 							name = "Price threshold", | 
| Zerotorescue@62 | 596 							desc = "Only queue craftable items when they are worth at least this much according to your auction house addon.\n\nSet to 0 to ignore auction prices.", | 
| Zerotorescue@62 | 597 							validate = function(info, value) return addon:ValidateReadableMoney(info, value); end, | 
| Zerotorescue@62 | 598 							get = function(i) return addon:ReadableMoney(GetOption(i)); end, | 
| Zerotorescue@62 | 599 							set = function(i, v) SetOption(i, addon:ReadableMoneyToCopper(v)); end, | 
| Zerotorescue@62 | 600 							arg = "overridePriceThreshold", | 
| Zerotorescue@62 | 601 						}, | 
| Zerotorescue@62 | 602 						overrideSummaryHidePriceThreshold = { | 
| Zerotorescue@62 | 603 							order = 49, | 
| Zerotorescue@62 | 604 							type = "toggle", | 
| Zerotorescue@62 | 605 							name = "Override summary showing", | 
| Zerotorescue@62 | 606 							desc = "Allows you to override if items in this group should be hidden from the summary while their value is below the price threshold.", | 
| Zerotorescue@62 | 607 							arg = "summaryHidePriceThreshold", | 
| Zerotorescue@62 | 608 						}, | 
| Zerotorescue@62 | 609 						summaryHidePriceThreshold = { | 
| Zerotorescue@62 | 610 							order = 50, | 
| Zerotorescue@62 | 611 							type = "toggle", | 
| Zerotorescue@62 | 612 							name = "Hide when below threshold", | 
| Zerotorescue@62 | 613 							desc = "Hide items from the summary when their value is below the set price threshold.", | 
| Zerotorescue@62 | 614 							arg = "overrideSummaryHidePriceThreshold", | 
| Zerotorescue@62 | 615 						}, | 
| Zerotorescue@62 | 616 						overrideAlwaysGetAuctionValue = { | 
| Zerotorescue@62 | 617 							order = 59, | 
| Zerotorescue@62 | 618 							type = "toggle", | 
| Zerotorescue@62 | 619 							name = "Override auction value showing", | 
| Zerotorescue@62 | 620 							desc = "Allows you to override if the auction value of items in this group should be cached and displayed even when the price threshold is set to 0|cffeda55fc|r.", | 
| Zerotorescue@62 | 621 							arg = "alwaysGetAuctionValue", | 
| Zerotorescue@62 | 622 						}, | 
| Zerotorescue@62 | 623 						alwaysGetAuctionValue = { | 
| Zerotorescue@62 | 624 							order = 60, | 
| Zerotorescue@62 | 625 							type = "toggle", | 
| Zerotorescue@62 | 626 							name = "Always show auction value", | 
| Zerotorescue@62 | 627 							desc = "Always cache and show the auction value of items in this group, even if the price threshold is set to 0|cffeda55fc|r.", | 
| Zerotorescue@62 | 628 							arg = "overrideAlwaysGetAuctionValue", | 
| Zerotorescue@62 | 629 						}, | 
| Zerotorescue@62 | 630 					}, | 
| Zerotorescue@62 | 631 				}, | 
| Zerotorescue@155 | 632 				addons = { | 
| Zerotorescue@155 | 633 					order = 30, | 
| Zerotorescue@155 | 634 					type = "group", | 
| Zerotorescue@155 | 635 					inline = true, | 
| Zerotorescue@155 | 636 					name = "Prefered addons", | 
| Zerotorescue@155 | 637 					set = SetOption, | 
| Zerotorescue@155 | 638 					get = GetOption, | 
| Zerotorescue@155 | 639 					disabled = GetDisabled, | 
| Zerotorescue@155 | 640 					args = { | 
| Zerotorescue@155 | 641 						description = { | 
| Zerotorescue@155 | 642 							order = 0, | 
| Zerotorescue@155 | 643 							type = "description", | 
| Zerotorescue@155 | 644 							name = function(info) | 
| Zerotorescue@155 | 645 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@155 | 646 | 
| Zerotorescue@155 | 647 								local t = ""; | 
| Zerotorescue@155 | 648 								if not addon.db.profile.defaults.hideHelp then | 
| Zerotorescue@155 | 649 									t = "Selecting your prefered addons is optional, the first working addon will be used if the selected addon doesn't exist. You only need to set this when you are running multiple addons of a kind and wish to specify which addons to use for what groups.\n\n"; | 
| Zerotorescue@155 | 650 								end | 
| Zerotorescue@155 | 651 | 
| Zerotorescue@155 | 652 								local currentAddon, selectedAddonName = addon:GetItemCountAddon(groupName); | 
| Zerotorescue@155 | 653 								local preferedAddon = addon:GetOptionByKey(groupName, "itemCountAddon"); | 
| Zerotorescue@155 | 654 | 
| Zerotorescue@155 | 655 								if currentAddon then | 
| Zerotorescue@155 | 656 									--GetCharacterCount | 
| Zerotorescue@155 | 657 									--addon.supportedAddons.itemCount[selectedExternalAddon] | 
| Zerotorescue@155 | 658 									t = t .. "Currently using |cfffed000" .. selectedAddonName .. "|r as your item count addon. This addon is " .. ((currentAddon.IsEnabled() and "|cff00ff00enabled|r") or "|cffff0000disabled|r") .. "."; | 
| Zerotorescue@155 | 659 | 
| Zerotorescue@155 | 660 									if currentAddon.GetTotalCount and currentAddon.GetCharacterCount then | 
| Zerotorescue@155 | 661 										t = t .. " This addon supports |cfffed000both total as local|r item counts."; | 
| Zerotorescue@155 | 662 									elseif currentAddon.GetTotalCount then | 
| Zerotorescue@155 | 663 										t = t .. " This addon supports |cfffed000only total|r item counts."; | 
| Zerotorescue@155 | 664 									elseif currentAddon.GetCharacterCount then | 
| Zerotorescue@155 | 665 										t = t .. " This addon supports |cfffed000only local|r item counts."; | 
| Zerotorescue@155 | 666 									end | 
| Zerotorescue@155 | 667 | 
| Zerotorescue@155 | 668 									if preferedAddon ~= selectedAddonName then | 
| Zerotorescue@155 | 669 										t = t .. "\n\n|cffff0000You have selected |cfffed000" .. preferedAddon .. "|r|cffff0000 as your item count addon, but this appears to be disabled and thus a random alternative was selected.|r"; | 
| Zerotorescue@155 | 670 									end | 
| Zerotorescue@155 | 671 								end | 
| Zerotorescue@155 | 672 | 
| Zerotorescue@155 | 673 								return t; | 
| Zerotorescue@155 | 674 							end, | 
| Zerotorescue@155 | 675 						}, | 
| Zerotorescue@155 | 676 						header = { | 
| Zerotorescue@155 | 677 							order = 5, | 
| Zerotorescue@155 | 678 							type = "header", | 
| Zerotorescue@155 | 679 							name = "", | 
| Zerotorescue@155 | 680 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@155 | 681 						}, | 
| Zerotorescue@155 | 682 						overrideAuctionPricingAddon = { | 
| Zerotorescue@155 | 683 							order = 9, | 
| Zerotorescue@155 | 684 							type = "toggle", | 
| Zerotorescue@155 | 685 							name = "Override pricing addon", | 
| Zerotorescue@155 | 686 							desc = "Allows you to override the pricing addon setting for this group.", | 
| Zerotorescue@155 | 687 							arg = "auctionPricingAddon", | 
| Zerotorescue@155 | 688 						}, | 
| Zerotorescue@155 | 689 						auctionPricingAddon = { | 
| Zerotorescue@155 | 690 							order = 10, | 
| Zerotorescue@155 | 691 							type = "select", | 
| Zerotorescue@155 | 692 							name = "Prefered pricing addon", | 
| Zerotorescue@155 | 693 							desc = "Select the addon you prefer data for this group to be retrieved from. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@155 | 694 							values = function() | 
| Zerotorescue@155 | 695 								local temp = {}; | 
| Zerotorescue@155 | 696 								for name, value in pairs(addon.supportedAddons.auctionPricing) do | 
| Zerotorescue@155 | 697 									temp[name] = name; | 
| Zerotorescue@155 | 698 								end | 
| Zerotorescue@155 | 699 | 
| Zerotorescue@155 | 700 								return temp; | 
| Zerotorescue@155 | 701 							end, | 
| Zerotorescue@155 | 702 							set = function(info, value) | 
| Zerotorescue@155 | 703 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@155 | 704 								local optionName = info[#info]; | 
| Zerotorescue@155 | 705 | 
| Zerotorescue@155 | 706 								addon.db.profile.groups[groupName][optionName] = value ~= "" and value; | 
| Zerotorescue@155 | 707 | 
| Zerotorescue@155 | 708 								if addon.supportedAddons.auctionPricing[value].OnSelect then | 
| Zerotorescue@155 | 709 									addon.supportedAddons.auctionPricing[value].OnSelect(); | 
| Zerotorescue@155 | 710 								end | 
| Zerotorescue@155 | 711 							end, | 
| Zerotorescue@155 | 712 							arg = "overrideAuctionPricingAddon", | 
| Zerotorescue@155 | 713 						}, | 
| Zerotorescue@155 | 714 						overrideItemCountAddon = { | 
| Zerotorescue@155 | 715 							order = 19, | 
| Zerotorescue@155 | 716 							type = "toggle", | 
| Zerotorescue@155 | 717 							name = "Override item count addon", | 
| Zerotorescue@155 | 718 							desc = "Allows you to override the item count addon setting for this group.", | 
| Zerotorescue@155 | 719 							arg = "itemCountAddon", | 
| Zerotorescue@155 | 720 						}, | 
| Zerotorescue@155 | 721 						itemCountAddon = { | 
| Zerotorescue@155 | 722 							order = 20, | 
| Zerotorescue@155 | 723 							type = "select", | 
| Zerotorescue@155 | 724 							name = "Prefered item count addon", | 
| Zerotorescue@155 | 725 							desc = "Select the addon you prefer data for this group to be retrieved from. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@155 | 726 							values = function() | 
| Zerotorescue@155 | 727 								local temp = {}; | 
| Zerotorescue@155 | 728 								for name, value in pairs(addon.supportedAddons.itemCount) do | 
| Zerotorescue@155 | 729 									temp[name] = name; | 
| Zerotorescue@155 | 730 								end | 
| Zerotorescue@155 | 731 | 
| Zerotorescue@155 | 732 								return temp; | 
| Zerotorescue@155 | 733 							end, | 
| Zerotorescue@155 | 734 							set = function(info, value) | 
| Zerotorescue@155 | 735 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@155 | 736 								local optionName = info[#info]; | 
| Zerotorescue@155 | 737 | 
| Zerotorescue@155 | 738 								addon.db.profile.groups[groupName][optionName] = value ~= "" and value; | 
| Zerotorescue@155 | 739 | 
| Zerotorescue@155 | 740 								if addon.supportedAddons.itemCount[value].OnSelect then | 
| Zerotorescue@155 | 741 									addon.supportedAddons.itemCount[value].OnSelect(); | 
| Zerotorescue@155 | 742 								end | 
| Zerotorescue@155 | 743 							end, | 
| Zerotorescue@155 | 744 							arg = "overrideItemCountAddon", | 
| Zerotorescue@155 | 745 						}, | 
| Zerotorescue@155 | 746 						overrideCraftingAddon = { | 
| Zerotorescue@155 | 747 							order = 29, | 
| Zerotorescue@155 | 748 							type = "toggle", | 
| Zerotorescue@155 | 749 							name = "Override crafting addon", | 
| Zerotorescue@155 | 750 							desc = "Allows you to override the crafting addon setting for this group.", | 
| Zerotorescue@155 | 751 							arg = "craftingAddon", | 
| Zerotorescue@155 | 752 						}, | 
| Zerotorescue@155 | 753 						craftingAddon = { | 
| Zerotorescue@155 | 754 							order = 30, | 
| Zerotorescue@155 | 755 							type = "select", | 
| Zerotorescue@155 | 756 							name = "Prefered crafting addon", | 
| Zerotorescue@155 | 757 							desc = "Select the addon you prefer data from this group to be queued into. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@155 | 758 							values = function() | 
| Zerotorescue@155 | 759 								local temp = {}; | 
| Zerotorescue@155 | 760 								for name, value in pairs(addon.supportedAddons.crafting) do | 
| Zerotorescue@155 | 761 									temp[name] = name; | 
| Zerotorescue@155 | 762 								end | 
| Zerotorescue@155 | 763 | 
| Zerotorescue@155 | 764 								return temp; | 
| Zerotorescue@155 | 765 							end, | 
| Zerotorescue@155 | 766 							set = function(info, value) | 
| Zerotorescue@155 | 767 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@155 | 768 								local optionName = info[#info]; | 
| Zerotorescue@155 | 769 | 
| Zerotorescue@155 | 770 								addon.db.profile.groups[groupName][optionName] = value ~= "" and value; | 
| Zerotorescue@155 | 771 | 
| Zerotorescue@155 | 772 								if addon.supportedAddons.crafting[value].OnSelect then | 
| Zerotorescue@155 | 773 									addon.supportedAddons.crafting[value].OnSelect(); | 
| Zerotorescue@155 | 774 								end | 
| Zerotorescue@155 | 775 							end, | 
| Zerotorescue@155 | 776 							arg = "overrideCraftingAddon", | 
| Zerotorescue@155 | 777 						}, | 
| Zerotorescue@155 | 778 					}, | 
| Zerotorescue@155 | 779 				}, | 
| Zerotorescue@62 | 780 			}, | 
| Zerotorescue@62 | 781 		}, | 
| Zerotorescue@62 | 782 		group = { | 
| Zerotorescue@62 | 783 			order = 20, | 
| Zerotorescue@62 | 784 			type = "group", | 
| Zerotorescue@62 | 785 			name = "Management", | 
| Zerotorescue@62 | 786 			desc = "Rename, delete, duplicate or export this group.", | 
| Zerotorescue@62 | 787 			args = { | 
| Zerotorescue@62 | 788 				actions = { | 
| Zerotorescue@62 | 789 					order = 10, | 
| Zerotorescue@62 | 790 					type = "group", | 
| Zerotorescue@62 | 791 					name = "Actions", | 
| Zerotorescue@62 | 792 					inline = true, | 
| Zerotorescue@62 | 793 					args = { | 
| Zerotorescue@62 | 794 						rename = { | 
| Zerotorescue@62 | 795 							order = 10, | 
| Zerotorescue@62 | 796 							type = "input", | 
| Zerotorescue@62 | 797 							name = "Rename group - New name", | 
| Zerotorescue@62 | 798 							desc = "Change the name of this group to something else. You can also use item links here as you wish.", | 
| Zerotorescue@62 | 799 							validate = ValidateGroupName, | 
| Zerotorescue@62 | 800 							set = function(info, value) | 
| Zerotorescue@62 | 801 								local oldGroupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 802 | 
| Zerotorescue@62 | 803 								addon.db.profile.groups[value] = CopyTable(addon.db.profile.groups[oldGroupName]); | 
| Zerotorescue@62 | 804 								addon.db.profile.groups[oldGroupName] = nil; | 
| Zerotorescue@62 | 805 | 
| Zerotorescue@62 | 806 								groupIdToName[info[2]] = value; | 
| Zerotorescue@62 | 807 								groupIdToName[value] = true; | 
| Zerotorescue@62 | 808 								groupIdToName[oldGroupName] = nil; | 
| Zerotorescue@62 | 809 | 
| Zerotorescue@62 | 810 								mod:FillGroupOptions(); | 
| Zerotorescue@62 | 811 							end, | 
| Zerotorescue@62 | 812 							get = function(info) | 
| Zerotorescue@62 | 813 								return groupIdToName[info[2]]; | 
| Zerotorescue@62 | 814 							end, | 
| Zerotorescue@62 | 815 						}, | 
| Zerotorescue@62 | 816 						duplicate = { | 
| Zerotorescue@62 | 817 							order = 20, | 
| Zerotorescue@62 | 818 							type = "input", | 
| Zerotorescue@62 | 819 							name = "Duplicate group - New name", | 
| Zerotorescue@62 | 820 							desc = "Duplicate this group. You can also use item links here as you wish.\n\nAll item data will be erased.", | 
| Zerotorescue@62 | 821 							validate = ValidateGroupName, | 
| Zerotorescue@62 | 822 							set = function(info, value) | 
| Zerotorescue@62 | 823 								local oldGroupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 824 | 
| Zerotorescue@62 | 825 								addon.db.profile.groups[value] = CopyTable(addon.db.profile.groups[oldGroupName]); | 
| Zerotorescue@62 | 826 | 
| Zerotorescue@62 | 827 								-- Reset item data (duplicate items me no want) | 
| Zerotorescue@62 | 828 								addon.db.profile.groups[value].items = nil; | 
| Zerotorescue@62 | 829 | 
| Zerotorescue@62 | 830 								mod:FillGroupOptions(); | 
| Zerotorescue@62 | 831 							end, | 
| Zerotorescue@62 | 832 							get = false, | 
| Zerotorescue@62 | 833 						}, | 
| Zerotorescue@62 | 834 						delete = { | 
| Zerotorescue@62 | 835 							order = 30, | 
| Zerotorescue@62 | 836 							type = "execute", | 
| Zerotorescue@62 | 837 							name = "Delete group", | 
| Zerotorescue@62 | 838 							desc = "Delete the currently selected group.", | 
| Zerotorescue@62 | 839 							confirm = true, | 
| Zerotorescue@62 | 840 							confirmText = "Are you sure you wish to |cffff0000DELETE|r this group? This action is not reversable!", | 
| Zerotorescue@62 | 841 							func = function(info) | 
| Zerotorescue@62 | 842 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 843 | 
| Zerotorescue@62 | 844 								addon.db.profile.groups[groupName] = nil; | 
| Zerotorescue@62 | 845 | 
| Zerotorescue@62 | 846 								mod:FillGroupOptions(); | 
| Zerotorescue@62 | 847 							end, | 
| Zerotorescue@62 | 848 						}, | 
| Zerotorescue@62 | 849 					}, | 
| Zerotorescue@62 | 850 				}, | 
| Zerotorescue@62 | 851 				export = { | 
| Zerotorescue@62 | 852 					order = 40, | 
| Zerotorescue@62 | 853 					type = "group", | 
| Zerotorescue@62 | 854 					name = "Export", | 
| Zerotorescue@62 | 855 					inline = true, | 
| Zerotorescue@62 | 856 					args = { | 
| Zerotorescue@62 | 857 						input = { | 
| Zerotorescue@62 | 858 							order = 10, | 
| Zerotorescue@62 | 859 							type = "input", | 
| Zerotorescue@62 | 860 							multiline = true, | 
| Zerotorescue@62 | 861 							name = "Group data", | 
| Zerotorescue@62 | 862 							width = "full", | 
| Zerotorescue@62 | 863 							desc = "Export the group data for the currently selected group. Press CTRL-A to select all and CTRL-C to copy the text.", | 
| Zerotorescue@62 | 864 							set = false, | 
| Zerotorescue@62 | 865 							get = function(info) | 
| Zerotorescue@62 | 866 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 867 | 
| Zerotorescue@152 | 868 								return mod:ExportGroup(groupName); | 
| Zerotorescue@62 | 869 							end, | 
| Zerotorescue@62 | 870 						}, | 
| Zerotorescue@62 | 871 					}, | 
| Zerotorescue@62 | 872 				}, | 
| Zerotorescue@62 | 873 			}, | 
| Zerotorescue@62 | 874 		}, | 
| Zerotorescue@62 | 875 		add = { | 
| Zerotorescue@62 | 876 			order = 30, | 
| Zerotorescue@62 | 877 			type = "group", | 
| Zerotorescue@62 | 878 			name = "Add items", | 
| Zerotorescue@62 | 879 			desc = "Add new items to this group.", | 
| Zerotorescue@62 | 880 			hidden = function(info) return groupIsVirtual[info[2]]; end, | 
| Zerotorescue@62 | 881 			args = { | 
| Zerotorescue@62 | 882 				singleAdd = { | 
| Zerotorescue@62 | 883 					order = 10, | 
| Zerotorescue@62 | 884 					type = "group", | 
| Zerotorescue@62 | 885 					inline = true, | 
| Zerotorescue@62 | 886 					name = "Add items", | 
| Zerotorescue@62 | 887 					args = { | 
| Zerotorescue@62 | 888 						help = { | 
| Zerotorescue@62 | 889 							order = 10, | 
| Zerotorescue@62 | 890 							type = "description", | 
| Zerotorescue@62 | 891 							name = "You can add a single item to this group at a time by pasting the item-id or an item-link in the field to the left or you can also import multiple items at once by pasting exported item data in the field to the right. Scroll further down to add items based on your inventory contents.", | 
| Zerotorescue@106 | 892 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 893 						}, | 
| Zerotorescue@62 | 894 						itemLink = { | 
| Zerotorescue@62 | 895 							order = 20, | 
| Zerotorescue@62 | 896 							type = "input", | 
| Zerotorescue@62 | 897 							name = "Single item add (item-link or item-id)", | 
| Zerotorescue@62 | 898 							desc = "Shift-click an item-link or enter an item-id to add the related item to this group. You can only add one item link or item id at a time.", | 
| Zerotorescue@62 | 899 							validate = function(info, value) | 
| Zerotorescue@62 | 900 								-- If the value is empty we'll allow passing to clear the carret | 
| Zerotorescue@62 | 901 								if value == "" then return true; end | 
| Zerotorescue@62 | 902 | 
| Zerotorescue@62 | 903 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 904 | 
| Zerotorescue@76 | 905 								local itemId = (addon:GetItemId(string.trim(value)) or tonumber(string.trim(value))); | 
| Zerotorescue@76 | 906 | 
| Zerotorescue@76 | 907 								local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@62 | 908 | 
| Zerotorescue@62 | 909 								if not itemId then | 
| Zerotorescue@76 | 910 									return "This is not a valid item link or id."; | 
| Zerotorescue@76 | 911 								elseif itemData:InGroup() then | 
| Zerotorescue@76 | 912 									return ("This item is already in the group |cfffed000%s|r."):format(itemData:InGroup()); | 
| Zerotorescue@62 | 913 								end | 
| Zerotorescue@62 | 914 | 
| Zerotorescue@62 | 915 								return true; | 
| Zerotorescue@62 | 916 							end, | 
| Zerotorescue@62 | 917 							set = function(info, value) | 
| Zerotorescue@62 | 918 								if value and value ~= "" then | 
| Zerotorescue@62 | 919 									local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 920 | 
| Zerotorescue@76 | 921 									local itemId = (addon:GetItemId(string.trim(value)) or tonumber(string.trim(value))); | 
| Zerotorescue@62 | 922 | 
| Zerotorescue@76 | 923 									local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@76 | 924 | 
| Zerotorescue@76 | 925 									if itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 926 										addon:Print(("Added %s to the selected group."):format( (itemData.link or unknownItemName:format(itemId)) ), addon.Colors.Green); | 
| Zerotorescue@76 | 927 | 
| Zerotorescue@76 | 928 										if AceConfigRegistry then | 
| Zerotorescue@76 | 929 											-- Now rebuild the list | 
| Zerotorescue@76 | 930 											AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 931 										end | 
| Zerotorescue@76 | 932 									else | 
| Zerotorescue@98 | 933 										addon:Print(("%s is already in the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() ), addon.Colors.Red); | 
| Zerotorescue@76 | 934 									end | 
| Zerotorescue@62 | 935 								end | 
| Zerotorescue@62 | 936 							end, | 
| Zerotorescue@62 | 937 							get = false, | 
| Zerotorescue@62 | 938 						}, | 
| Zerotorescue@62 | 939 						importItemData = { | 
| Zerotorescue@62 | 940 							order = 30, | 
| Zerotorescue@62 | 941 							type = "input", | 
| Zerotorescue@62 | 942 							name = "Import item data", | 
| Zerotorescue@62 | 943 							desc = "Import item data from an exported item data-string. Any items already grouped will be skipped.", | 
| Zerotorescue@62 | 944 							set = function(info, value) | 
| Zerotorescue@62 | 945 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 946 | 
| Zerotorescue@62 | 947 								local allItemIds = { string.split(";", value or "") }; | 
| Zerotorescue@62 | 948 | 
| Zerotorescue@62 | 949 								for _, value in pairs(allItemIds) do | 
| Zerotorescue@62 | 950 									local itemId = tonumber(value); | 
| Zerotorescue@62 | 951 | 
| Zerotorescue@76 | 952 									if itemId then | 
| Zerotorescue@76 | 953 										local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@76 | 954 | 
| Zerotorescue@76 | 955 										if itemData:InGroup() then | 
| Zerotorescue@98 | 956 											addon:Print(("Skipping %s (#%d) as it is already in the group |cfffed000%s|r."):format(itemData.link or "Unknown", itemId, itemData:InGroup()), addon.Colors.Red); | 
| Zerotorescue@98 | 957 											addon:Print(("Skipping %s (#%d) as it is already in the group |cfffed000%s|r."):format(itemData.link or "Unknown", itemId, itemData:InGroup()), addon.Colors.Red); | 
| Zerotorescue@76 | 958 										elseif itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 959 											addon:Print(("Added %s to the group |cfffed000%s|r."):format(itemData.link or unknownItemName:format(itemId), groupName), addon.Colors.Green); | 
| Zerotorescue@76 | 960 										end | 
| Zerotorescue@62 | 961 									else | 
| Zerotorescue@98 | 962 										addon:Print(("\"%s\" is not a number."):format(value), addon.Colors.Red); | 
| Zerotorescue@62 | 963 									end | 
| Zerotorescue@62 | 964 								end | 
| Zerotorescue@76 | 965 | 
| Zerotorescue@76 | 966 								if AceConfigRegistry then | 
| Zerotorescue@76 | 967 									-- Now rebuild the list | 
| Zerotorescue@76 | 968 									AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 969 								end | 
| Zerotorescue@62 | 970 							end, | 
| Zerotorescue@62 | 971 							get = false, | 
| Zerotorescue@62 | 972 						}, | 
| Zerotorescue@62 | 973 						importPremadeData = { | 
| Zerotorescue@62 | 974 							order = 40, | 
| Zerotorescue@62 | 975 							type = "select", | 
| Zerotorescue@106 | 976 							width = "double", | 
| Zerotorescue@62 | 977 							name = "Import premade data", | 
| Zerotorescue@62 | 978 							desc = "Import item data from a premade item-group. Any items already grouped will be skipped.", | 
| Zerotorescue@62 | 979 							values = function() | 
| Zerotorescue@62 | 980 								local temp = {}; | 
| Zerotorescue@62 | 981 								for key, group in pairs(addon.defaultGroups) do | 
| Zerotorescue@62 | 982 									temp[key] = key; | 
| Zerotorescue@62 | 983 								end | 
| Zerotorescue@62 | 984 | 
| Zerotorescue@62 | 985 								return temp; | 
| Zerotorescue@62 | 986 							end, | 
| Zerotorescue@62 | 987 							set = function(info, value) | 
| Zerotorescue@62 | 988 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 989 | 
| Zerotorescue@98 | 990 								addon:Print(("Importing items from the premade group \"|cfffed000%s|r\"."):format(value)); | 
| Zerotorescue@62 | 991 | 
| Zerotorescue@62 | 992 								-- Remember we imported this group and it's version so if it is ever changed, people can be notified | 
| Zerotorescue@62 | 993 								if not addon.db.profile.groups[groupName].premadeGroups then | 
| Zerotorescue@62 | 994 									addon.db.profile.groups[groupName].premadeGroups = {}; | 
| Zerotorescue@62 | 995 								end | 
| Zerotorescue@62 | 996 								addon.db.profile.groups[groupName].premadeGroups[value] = addon.defaultGroups[value].version; | 
| Zerotorescue@62 | 997 | 
| Zerotorescue@62 | 998 								for itemId, version in pairs(addon.defaultGroups[value].items) do | 
| Zerotorescue@62 | 999 									if version > 0 then | 
| Zerotorescue@76 | 1000 										-- Sanity check | 
| Zerotorescue@62 | 1001 										itemId = itemId and tonumber(itemId); | 
| Zerotorescue@62 | 1002 | 
| Zerotorescue@76 | 1003 										local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@76 | 1004 | 
| Zerotorescue@62 | 1005 										if not itemId then | 
| Zerotorescue@98 | 1006 											addon:Print(("\"|cfffed000%s|r\" is not a number."):format(value), addon.Colors.Red); | 
| Zerotorescue@76 | 1007 										elseif itemData:InGroup() then | 
| Zerotorescue@98 | 1008 											addon:Print(("Skipping |cfffed000%s|r as it is already in the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() ), addon.Colors.Red); | 
| Zerotorescue@76 | 1009 										elseif itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 1010 											addon:Print(("Added %s to the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), groupName ), addon.Colors.Green); | 
| Zerotorescue@62 | 1011 										end | 
| Zerotorescue@62 | 1012 									end | 
| Zerotorescue@62 | 1013 								end | 
| Zerotorescue@76 | 1014 | 
| Zerotorescue@76 | 1015 								if AceConfigRegistry then | 
| Zerotorescue@76 | 1016 									-- Now rebuild the list | 
| Zerotorescue@76 | 1017 									AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 1018 								end | 
| Zerotorescue@62 | 1019 							end, | 
| Zerotorescue@62 | 1020 							get = false, | 
| Zerotorescue@62 | 1021 						}, | 
| Zerotorescue@62 | 1022 					}, | 
| Zerotorescue@62 | 1023 				}, | 
| Zerotorescue@62 | 1024 				massAdd = { | 
| Zerotorescue@62 | 1025 					order = 20, | 
| Zerotorescue@62 | 1026 					type = "group", | 
| Zerotorescue@62 | 1027 					inline = true, | 
| Zerotorescue@62 | 1028 					name = "Mass add", | 
| Zerotorescue@62 | 1029 					args = { | 
| Zerotorescue@62 | 1030 						help = { | 
| Zerotorescue@62 | 1031 							order = 10, | 
| Zerotorescue@62 | 1032 							type = "description", | 
| Zerotorescue@62 | 1033 							name = "Click the items you wish to add to this group or add multiple of these items at once by providing a name filter in the field below.", | 
| Zerotorescue@106 | 1034 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 1035 						}, | 
| Zerotorescue@62 | 1036 						massAdd = { | 
| Zerotorescue@62 | 1037 							order = 20, | 
| Zerotorescue@62 | 1038 							type = "input", | 
| Zerotorescue@62 | 1039 							name = "Add all items matching...", | 
| Zerotorescue@62 | 1040 							desc = "Add every item in your inventory matching the name entered in this field. If you enter \"Glyph\" as a filter, any items in your inventory containing this in their name will be added to this group.", | 
| Zerotorescue@62 | 1041 							set = function(info, value) | 
| Zerotorescue@62 | 1042 						    	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 1043 | 
| Zerotorescue@62 | 1044 								if not value then return; end | 
| Zerotorescue@62 | 1045 | 
| Zerotorescue@62 | 1046 								value = value:lower(); | 
| Zerotorescue@62 | 1047 | 
| Zerotorescue@62 | 1048 								local ref = options.args.groups.args[info[2]].args.add.args.list.args; | 
| Zerotorescue@62 | 1049 | 
| Zerotorescue@62 | 1050 								for itemId, test in pairs(ref) do | 
| Zerotorescue@62 | 1051 									if test then | 
| Zerotorescue@76 | 1052 										local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@62 | 1053 | 
| Zerotorescue@76 | 1054 										if itemData.name:lower():find(value) then | 
| Zerotorescue@76 | 1055 									    	if itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 1056 												addon:Print(("Added %s to the selected group."):format( (itemData.link or unknownItemName:format(itemId)) ), addon.Colors.Green); | 
| Zerotorescue@76 | 1057 									    	else | 
| Zerotorescue@98 | 1058 									    		addon:Print(("Couldn't add %s because it is already in a group."):format(itemData.link or unknownItemName:format(itemId)), addon.Colors.Red); | 
| Zerotorescue@62 | 1059 									    	end | 
| Zerotorescue@62 | 1060 										end | 
| Zerotorescue@62 | 1061 									end | 
| Zerotorescue@62 | 1062 								end | 
| Zerotorescue@76 | 1063 | 
| Zerotorescue@76 | 1064 								if AceConfigRegistry then | 
| Zerotorescue@76 | 1065 									-- Now rebuild the list | 
| Zerotorescue@76 | 1066 									AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 1067 								end | 
| Zerotorescue@62 | 1068 							end, | 
| Zerotorescue@62 | 1069 							get = false, | 
| Zerotorescue@62 | 1070 						}, | 
| Zerotorescue@62 | 1071 						minItemLevel = { | 
| Zerotorescue@62 | 1072 							order = 40, | 
| Zerotorescue@62 | 1073 							type = "select", | 
| Zerotorescue@62 | 1074 							values = function() | 
| Zerotorescue@62 | 1075 								local temp = {}; | 
| Zerotorescue@62 | 1076 | 
| Zerotorescue@62 | 1077 								temp[0] = "Include everything"; | 
| Zerotorescue@62 | 1078 | 
| Zerotorescue@62 | 1079 								local itemLevelTemplate = "Itemlevel >= %d"; | 
| Zerotorescue@62 | 1080 | 
| Zerotorescue@62 | 1081 								for i = 1, 49 do | 
| Zerotorescue@62 | 1082 									temp[( i * 10 )] = itemLevelTemplate:format(( i * 10 )); | 
| Zerotorescue@62 | 1083 								end | 
| Zerotorescue@62 | 1084 | 
| Zerotorescue@62 | 1085 								temp[500] = "Include nothing"; | 
| Zerotorescue@62 | 1086 | 
| Zerotorescue@62 | 1087 								return temp; | 
| Zerotorescue@62 | 1088 							end, | 
| Zerotorescue@62 | 1089 							name = "Include tradeskill items", | 
| Zerotorescue@62 | 1090 							desc = "Include all items above this item level from the currently opened tradeskill window in the below item list.\n\nSetting this very low this might considerably slow down this config window.\n\nSet to 500 to disable showing of items completely.", | 
| Zerotorescue@62 | 1091 							set = function(i, v) includeTradeSkillItems = v; end, | 
| Zerotorescue@62 | 1092 							get = function() return includeTradeSkillItems; end, | 
| Zerotorescue@62 | 1093 							disabled = function() | 
| Zerotorescue@62 | 1094 								if GetTradeSkillLine() == "UNKNOWN" then | 
| Zerotorescue@62 | 1095 									includeTradeSkillItems = 500; | 
| Zerotorescue@62 | 1096 									return true; -- disabled | 
| Zerotorescue@62 | 1097 								else | 
| Zerotorescue@62 | 1098 									return false; | 
| Zerotorescue@62 | 1099 								end | 
| Zerotorescue@62 | 1100 							end, | 
| Zerotorescue@62 | 1101 						}, | 
| Zerotorescue@62 | 1102 					}, | 
| Zerotorescue@62 | 1103 				}, | 
| Zerotorescue@62 | 1104 				list = { | 
| Zerotorescue@62 | 1105 					order = 30, | 
| Zerotorescue@62 | 1106 					type = "group", | 
| Zerotorescue@62 | 1107 					inline = true, | 
| Zerotorescue@62 | 1108 					name = "Item list", | 
| Zerotorescue@62 | 1109 					hidden = UpdateAddItemList, | 
| Zerotorescue@62 | 1110 					args = { | 
| Zerotorescue@62 | 1111 | 
| Zerotorescue@62 | 1112 					}, | 
| Zerotorescue@62 | 1113 				}, | 
| Zerotorescue@62 | 1114 			}, | 
| Zerotorescue@62 | 1115 		}, | 
| Zerotorescue@62 | 1116 		remove = { | 
| Zerotorescue@62 | 1117 			order = 40, | 
| Zerotorescue@62 | 1118 			type = "group", | 
| Zerotorescue@62 | 1119 			name = "Current items", | 
| Zerotorescue@62 | 1120 			desc = "View, export or remove items from this group.", | 
| Zerotorescue@62 | 1121 			hidden = function(info) return groupIsVirtual[info[2]]; end, | 
| Zerotorescue@62 | 1122 			args = { | 
| Zerotorescue@62 | 1123 				help = { | 
| Zerotorescue@62 | 1124 					order = 10, | 
| Zerotorescue@62 | 1125 					type = "group", | 
| Zerotorescue@62 | 1126 					inline = true, | 
| Zerotorescue@106 | 1127 					name = "Remove items", | 
| Zerotorescue@62 | 1128 					hidden = false, | 
| Zerotorescue@62 | 1129 					args = { | 
| Zerotorescue@62 | 1130 						help = { | 
| Zerotorescue@62 | 1131 							order = 10, | 
| Zerotorescue@62 | 1132 							type = "description", | 
| Zerotorescue@62 | 1133 							name = "Click the items you wish to remove from this group.", | 
| Zerotorescue@106 | 1134 							hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 1135 						}, | 
| Zerotorescue@62 | 1136 						massRemove = { | 
| Zerotorescue@62 | 1137 							order = 20, | 
| Zerotorescue@62 | 1138 							type = "input", | 
| Zerotorescue@62 | 1139 							name = "Remove all items matching...", | 
| Zerotorescue@62 | 1140 							desc = "Remove every item in this group matching the name entered in this field. If you enter \"Glyph\" as a filter, any items in this group containing this in their name will be removed from this group.", | 
| Zerotorescue@62 | 1141 							set = function(info, value) | 
| Zerotorescue@62 | 1142 						    	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 1143 | 
| Zerotorescue@62 | 1144 								if not value then return; end | 
| Zerotorescue@62 | 1145 | 
| Zerotorescue@62 | 1146 								value = value:lower(); | 
| Zerotorescue@62 | 1147 | 
| Zerotorescue@62 | 1148 								local ref = options.args.groups.args[info[2]].args.remove.args.list.args; | 
| Zerotorescue@62 | 1149 | 
| Zerotorescue@62 | 1150 								for itemId, test in pairs(ref) do | 
| Zerotorescue@62 | 1151 									if test then | 
| Zerotorescue@76 | 1152 										local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@62 | 1153 | 
| Zerotorescue@76 | 1154 										if itemData.name:lower():find(value) then | 
| Zerotorescue@76 | 1155 											itemData:RemoveFromGroup(groupName); | 
| Zerotorescue@76 | 1156 | 
| Zerotorescue@98 | 1157 											addon:Print(("Removed %s from the selected group."):format( (itemData.link or unknownItemName:format(itemId)) ), addon.Colors.Red); | 
| Zerotorescue@62 | 1158 										end | 
| Zerotorescue@62 | 1159 									end | 
| Zerotorescue@62 | 1160 								end | 
| Zerotorescue@62 | 1161 | 
| Zerotorescue@76 | 1162 								if AceConfigRegistry then | 
| Zerotorescue@76 | 1163 									-- Now rebuild the list | 
| Zerotorescue@76 | 1164 									AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 1165 								end | 
| Zerotorescue@62 | 1166 							end, | 
| Zerotorescue@62 | 1167 							get = false, | 
| Zerotorescue@62 | 1168 						}, | 
| Zerotorescue@62 | 1169 						premadeGroups = { | 
| Zerotorescue@62 | 1170 							order = 30, | 
| Zerotorescue@62 | 1171 							type = "select", | 
| Zerotorescue@106 | 1172 							width = "double", | 
| Zerotorescue@62 | 1173 							name = "Imported premade groups", | 
| Zerotorescue@62 | 1174 							desc = "This is a list of all premade groups that were imported into this group. You will be notified when any of these premade groups have changed and you will be able to import these changes.\n\nSelect a group to stop reminding you of changes to the premade group (the item list will be unaffected). Doing so will require you to manually update this when new items are added to the game.", | 
| Zerotorescue@62 | 1175 							values = function(info) | 
| Zerotorescue@62 | 1176 						    	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 1177 | 
| Zerotorescue@62 | 1178 						    	local temp = {}; | 
| Zerotorescue@76 | 1179 								temp[""] = ""; | 
| Zerotorescue@62 | 1180 						    	if addon.db.profile.groups[groupName].premadeGroups then | 
| Zerotorescue@62 | 1181 							    	for name, version in pairs(addon.db.profile.groups[groupName].premadeGroups) do | 
| Zerotorescue@62 | 1182 							    		temp[name] = name; | 
| Zerotorescue@62 | 1183 							    	end | 
| Zerotorescue@62 | 1184 						    	end | 
| Zerotorescue@62 | 1185 | 
| Zerotorescue@62 | 1186 						    	return temp; | 
| Zerotorescue@62 | 1187 							end, | 
| Zerotorescue@62 | 1188 							set = function(info, value) | 
| Zerotorescue@76 | 1189 								if value and value ~= "" then | 
| Zerotorescue@76 | 1190 									-- Remove premade group from this group | 
| Zerotorescue@76 | 1191 							    	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@76 | 1192 | 
| Zerotorescue@76 | 1193 							    	addon.db.profile.groups[groupName].premadeGroups[value] = nil; | 
| Zerotorescue@76 | 1194 | 
| Zerotorescue@98 | 1195 							    	addon:Print(("No longer notifying you about changes made to the premade group named \"|cfffed000%s|r\"."):format(value)); | 
| Zerotorescue@76 | 1196 						    	end | 
| Zerotorescue@62 | 1197 							end, | 
| Zerotorescue@62 | 1198 							get = false, | 
| Zerotorescue@62 | 1199 							disabled = function(info) | 
| Zerotorescue@62 | 1200 						    	local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 1201 | 
| Zerotorescue@62 | 1202 								return (not addon.db.profile.groups[groupName].premadeGroups); | 
| Zerotorescue@62 | 1203 							end, | 
| Zerotorescue@62 | 1204 						}, | 
| Zerotorescue@62 | 1205 					}, | 
| Zerotorescue@62 | 1206 				}, | 
| Zerotorescue@62 | 1207 				list = { | 
| Zerotorescue@62 | 1208 					order = 20, | 
| Zerotorescue@62 | 1209 					type = "group", | 
| Zerotorescue@62 | 1210 					inline = true, | 
| Zerotorescue@62 | 1211 					name = "Item list", | 
| Zerotorescue@62 | 1212 					hidden = UpdateRemoveItemList, | 
| Zerotorescue@62 | 1213 					args = { | 
| Zerotorescue@62 | 1214 | 
| Zerotorescue@62 | 1215 					}, | 
| Zerotorescue@62 | 1216 				}, | 
| Zerotorescue@62 | 1217 				export = { | 
| Zerotorescue@62 | 1218 					order = 30, | 
| Zerotorescue@62 | 1219 					type = "group", | 
| Zerotorescue@62 | 1220 					name = "Export", | 
| Zerotorescue@62 | 1221 					inline = true, | 
| Zerotorescue@62 | 1222 					args = { | 
| Zerotorescue@62 | 1223 						input = { | 
| Zerotorescue@62 | 1224 							order = 10, | 
| Zerotorescue@62 | 1225 							type = "input", | 
| Zerotorescue@62 | 1226 							name = "Item data", | 
| Zerotorescue@62 | 1227 							width = "full", | 
| Zerotorescue@62 | 1228 							desc = "Export the item data for the currently selected group. Press CTRL-A to select all and CTRL-C to copy the text.", | 
| Zerotorescue@62 | 1229 							set = false, | 
| Zerotorescue@62 | 1230 							get = function(info) | 
| Zerotorescue@62 | 1231 								local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@62 | 1232 | 
| Zerotorescue@62 | 1233 								local combinedItemIds; | 
| Zerotorescue@62 | 1234 								-- Parse items in group and show these | 
| Zerotorescue@62 | 1235 								for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do | 
| Zerotorescue@62 | 1236 									if not combinedItemIds then | 
| Zerotorescue@62 | 1237 										combinedItemIds = tostring(itemId); | 
| Zerotorescue@62 | 1238 									else | 
| Zerotorescue@62 | 1239 										combinedItemIds = combinedItemIds .. (";%d"):format(itemId); | 
| Zerotorescue@62 | 1240 									end | 
| Zerotorescue@62 | 1241 								end | 
| Zerotorescue@62 | 1242 | 
| Zerotorescue@62 | 1243 								return combinedItemIds; -- We don't serialize this because we actually DO want people to be able to manually modify it - besides, parsing it isn't going to be hard | 
| Zerotorescue@62 | 1244 							end, | 
| Zerotorescue@62 | 1245 						}, | 
| Zerotorescue@62 | 1246 					}, | 
| Zerotorescue@62 | 1247 				}, | 
| Zerotorescue@62 | 1248 			}, | 
| Zerotorescue@62 | 1249 		}, | 
| Zerotorescue@62 | 1250 	}, | 
| Zerotorescue@62 | 1251 }; | 
| Zerotorescue@62 | 1252 | 
| Zerotorescue@62 | 1253 | 
| Zerotorescue@62 | 1254 | 
| Zerotorescue@62 | 1255 | 
| Zerotorescue@62 | 1256 | 
| Zerotorescue@62 | 1257 | 
| Zerotorescue@62 | 1258 | 
| Zerotorescue@62 | 1259 | 
| Zerotorescue@62 | 1260 | 
| Zerotorescue@62 | 1261 -- Object functions | 
| Zerotorescue@62 | 1262 | 
| Zerotorescue@62 | 1263 function mod:OnEnable() | 
| Zerotorescue@62 | 1264 	-- Register our config slash command | 
| Zerotorescue@62 | 1265 	-- /im config | 
| Zerotorescue@62 | 1266 	addon:RegisterSlash(function(this) | 
| Zerotorescue@62 | 1267 		-- We don't want any other windows open at this time. | 
| Zerotorescue@62 | 1268 		for name, module in this:IterateModules() do | 
| Zerotorescue@62 | 1269 			if module.CloseFrame then | 
| Zerotorescue@62 | 1270 				module:CloseFrame(); | 
| Zerotorescue@62 | 1271 			end | 
| Zerotorescue@62 | 1272 		end | 
| Zerotorescue@62 | 1273 | 
| Zerotorescue@62 | 1274 		this:GetModule("Config"):Show(); | 
| Zerotorescue@62 | 1275 	end, { "c", "config", "conf", "option", "options", "opt", "setting", "settings" }, "|Hfunction:InventoriumCommandHandler:config|h|cff00fff7/im config|r|h (or /im c) - Open the config window to change the settings and manage groups."); | 
| Zerotorescue@62 | 1276 | 
| Zerotorescue@62 | 1277 	-- Whenever the profile is changed, update the groups | args: (object for the functionName, eventName, functionName) | 
| Zerotorescue@62 | 1278 	addon.db.RegisterCallback(self, "OnProfileChanged", "RefreshConfig"); | 
| Zerotorescue@62 | 1279 	addon.db.RegisterCallback(self, "OnProfileCopied", "RefreshConfig"); | 
| Zerotorescue@62 | 1280 	addon.db.RegisterCallback(self, "OnProfileReset", "RefreshConfig"); | 
| Zerotorescue@62 | 1281 | 
| Zerotorescue@62 | 1282 	-- Register our custom widgets | 
| Zerotorescue@62 | 1283 	local Widgets = addon:GetModule("Widgets"); | 
| Zerotorescue@62 | 1284 	Widgets:ItemLinkButton(); | 
| Zerotorescue@62 | 1285 	Widgets:ConfigItemLinkButton(); | 
| Zerotorescue@62 | 1286 end | 
| Zerotorescue@62 | 1287 | 
| Zerotorescue@152 | 1288 function mod:ExportGroup(groupName) | 
| Zerotorescue@152 | 1289 	-- We want to include the group name, so we copy the table then set another value | 
| Zerotorescue@152 | 1290 	local temp = CopyTable(addon.db.profile.groups[groupName]); | 
| Zerotorescue@152 | 1291 	temp.name = groupName; | 
| Zerotorescue@152 | 1292 	temp.trackAtCharacters = nil; | 
| Zerotorescue@152 | 1293 	temp.overrideTrackAtCharacters = nil; | 
| Zerotorescue@152 | 1294 | 
| Zerotorescue@152 | 1295 	if not AceSerializer then | 
| Zerotorescue@152 | 1296 		AceSerializer = LibStub("AceSerializer-3.0"); | 
| Zerotorescue@152 | 1297 	end | 
| Zerotorescue@152 | 1298 | 
| Zerotorescue@152 | 1299 	return AceSerializer:Serialize(temp); | 
| Zerotorescue@152 | 1300 end | 
| Zerotorescue@152 | 1301 | 
| Zerotorescue@62 | 1302 function mod:RefreshConfig() | 
| Zerotorescue@65 | 1303 	self:PremadeGroupsCheck(); | 
| Zerotorescue@65 | 1304 | 
| Zerotorescue@62 | 1305 	self:FillGroupOptions(); | 
| Zerotorescue@62 | 1306 end | 
| Zerotorescue@62 | 1307 | 
| Zerotorescue@62 | 1308 function mod:Load() | 
| Zerotorescue@62 | 1309 	if not AceConfigDialog and not AceConfigRegistry then | 
| Zerotorescue@65 | 1310 		self:PremadeGroupsCheck(); | 
| Zerotorescue@65 | 1311 | 
| Zerotorescue@62 | 1312 		self:FillOptions(); | 
| Zerotorescue@62 | 1313 | 
| Zerotorescue@62 | 1314 		-- Build options dialog | 
| Zerotorescue@62 | 1315 		AceConfigDialog = LibStub("AceConfigDialog-3.0"); | 
| Zerotorescue@62 | 1316 		AceConfigRegistry = LibStub("AceConfigRegistry-3.0"); | 
| Zerotorescue@62 | 1317 		-- Register options table | 
| Zerotorescue@62 | 1318 		LibStub("AceConfig-3.0"):RegisterOptionsTable("InventoriumOptions", options); | 
| Zerotorescue@62 | 1319 		-- Set a nice default size (so that 4 normal sized elements fit next to eachother) | 
| Zerotorescue@62 | 1320 		AceConfigDialog:SetDefaultSize("InventoriumOptions", 975, 600); | 
| Zerotorescue@62 | 1321 | 
| Zerotorescue@62 | 1322 		 -- In case the addon is loaded from another condition, always call the remove interface options | 
| Zerotorescue@62 | 1323 		if AddonLoader and AddonLoader.RemoveInterfaceOptions then | 
| Zerotorescue@62 | 1324 			AddonLoader:RemoveInterfaceOptions("Inventorium"); | 
| Zerotorescue@62 | 1325 		end | 
| Zerotorescue@62 | 1326 | 
| Zerotorescue@62 | 1327 		-- Add to the blizzard addons options thing | 
| Zerotorescue@62 | 1328 		AceConfigDialog:AddToBlizOptions("InventoriumOptions"); | 
| Zerotorescue@62 | 1329 	end | 
| Zerotorescue@62 | 1330 end | 
| Zerotorescue@62 | 1331 | 
| Zerotorescue@62 | 1332 function mod:Show() | 
| Zerotorescue@62 | 1333 	self:Load(); | 
| Zerotorescue@62 | 1334 | 
| Zerotorescue@62 | 1335 	AceConfigDialog:Open("InventoriumOptions"); | 
| Zerotorescue@62 | 1336 end | 
| Zerotorescue@62 | 1337 | 
| Zerotorescue@62 | 1338 function mod:FillOptions() | 
| Zerotorescue@62 | 1339 	options = { | 
| Zerotorescue@62 | 1340 		type = "group", | 
| Zerotorescue@62 | 1341 		name = "Inventorium Config", | 
| Zerotorescue@62 | 1342 		childGroups = "tree", | 
| Zerotorescue@62 | 1343 		args = { | 
| Zerotorescue@62 | 1344 		}, | 
| Zerotorescue@62 | 1345 	}; | 
| Zerotorescue@62 | 1346 | 
| Zerotorescue@62 | 1347 	-- General | 
| Zerotorescue@62 | 1348 	self:FillGeneralOptions(); | 
| Zerotorescue@62 | 1349 | 
| Zerotorescue@62 | 1350 	-- Help | 
| Zerotorescue@62 | 1351 	self:FillHelpOptions(); | 
| Zerotorescue@62 | 1352 | 
| Zerotorescue@62 | 1353 	-- Profile | 
| Zerotorescue@62 | 1354 	options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db, true); | 
| Zerotorescue@62 | 1355 	options.args.profiles.order = 200; | 
| Zerotorescue@62 | 1356 | 
| Zerotorescue@106 | 1357 	-- Extra | 
| Zerotorescue@106 | 1358 	self:FillExtraOptions(); | 
| Zerotorescue@106 | 1359 | 
| Zerotorescue@62 | 1360 	-- Groups | 
| Zerotorescue@62 | 1361 	self:MakeGroupOptions(); | 
| Zerotorescue@62 | 1362 | 
| Zerotorescue@62 | 1363 	-- Groups-contents | 
| Zerotorescue@62 | 1364 	self:FillGroupOptions(); | 
| Zerotorescue@62 | 1365 end | 
| Zerotorescue@62 | 1366 | 
| Zerotorescue@62 | 1367 function mod:FillGeneralOptions() | 
| Zerotorescue@62 | 1368 	options.args.general = { | 
| Zerotorescue@62 | 1369 		order = 100, | 
| Zerotorescue@62 | 1370 		type = "group", | 
| Zerotorescue@62 | 1371 		name = "General", | 
| Zerotorescue@62 | 1372 		desc = "Change general Inventorium settings.", | 
| Zerotorescue@62 | 1373 		args = { | 
| Zerotorescue@62 | 1374 			general = { | 
| Zerotorescue@62 | 1375 				order = 1, | 
| Zerotorescue@62 | 1376 				type = "group", | 
| Zerotorescue@62 | 1377 				inline = true, | 
| Zerotorescue@62 | 1378 				name = "General", | 
| Zerotorescue@62 | 1379 				args = { | 
| Zerotorescue@62 | 1380 					description = { | 
| Zerotorescue@62 | 1381 						order = 0, | 
| Zerotorescue@62 | 1382 						type = "description", | 
| Zerotorescue@62 | 1383 						name = function() | 
| Zerotorescue@106 | 1384 							local t = ""; | 
| Zerotorescue@106 | 1385 							if not addon.db.profile.defaults.hideHelp then | 
| Zerotorescue@155 | 1386 								t = "Here you can set general settings. The settings entered here will be used when you choose not to override the settings within an individual group."; | 
| Zerotorescue@155 | 1387 							end | 
| Zerotorescue@155 | 1388 | 
| Zerotorescue@155 | 1389 							return t; | 
| Zerotorescue@155 | 1390 						end, | 
| Zerotorescue@155 | 1391 					}, | 
| Zerotorescue@155 | 1392 					header = { | 
| Zerotorescue@155 | 1393 						order = 5, | 
| Zerotorescue@155 | 1394 						type = "header", | 
| Zerotorescue@155 | 1395 						name = "", | 
| Zerotorescue@155 | 1396 					}, | 
| Zerotorescue@155 | 1397 					trackAtCharacters = { | 
| Zerotorescue@155 | 1398 						order = 10, | 
| Zerotorescue@155 | 1399 						type = "multiselect", | 
| Zerotorescue@155 | 1400 						width = "double", | 
| Zerotorescue@155 | 1401 						name = "Track at these characters:", | 
| Zerotorescue@155 | 1402 						desc = "Select at which characters this should appear in the summary and generate alerts.", | 
| Zerotorescue@155 | 1403 						values = function() | 
| Zerotorescue@155 | 1404 							local temp = {}; | 
| Zerotorescue@155 | 1405 							for charName in pairs(addon.db.factionrealm.characters) do | 
| Zerotorescue@155 | 1406 								temp[charName] = charName; | 
| Zerotorescue@155 | 1407 							end | 
| Zerotorescue@155 | 1408 | 
| Zerotorescue@155 | 1409 							return temp; | 
| Zerotorescue@155 | 1410 						end, | 
| Zerotorescue@155 | 1411 						get = function(i, v) | 
| Zerotorescue@155 | 1412 							return addon.db.profile.defaults.trackAtCharacters[v]; | 
| Zerotorescue@155 | 1413 						end, | 
| Zerotorescue@155 | 1414 						set = function(i, v, e) | 
| Zerotorescue@155 | 1415 							addon.db.profile.defaults.trackAtCharacters[v] = e or nil; | 
| Zerotorescue@155 | 1416 						end, | 
| Zerotorescue@155 | 1417 						dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead. | 
| Zerotorescue@155 | 1418 					}, | 
| Zerotorescue@155 | 1419 					localItemData = { | 
| Zerotorescue@155 | 1420 						order = 20, | 
| Zerotorescue@155 | 1421 						type = "multiselect", | 
| Zerotorescue@155 | 1422 						width = "double", | 
| Zerotorescue@155 | 1423 						name = "Include in local item data", | 
| Zerotorescue@155 | 1424 						desc = "Select which data should be included in the local item data.", | 
| Zerotorescue@155 | 1425 						values = { | 
| Zerotorescue@155 | 1426 							["Bag"] = "Bag", | 
| Zerotorescue@155 | 1427 							["Bank"] = "Bank", | 
| Zerotorescue@155 | 1428 							["Auction House"] = "Auction House", | 
| Zerotorescue@155 | 1429 							["Mailbox"] = "Mailbox", | 
| Zerotorescue@155 | 1430 						}, | 
| Zerotorescue@155 | 1431 						get = function(i, v) return addon.db.profile.defaults.localItemData and addon.db.profile.defaults.localItemData[v]; end, | 
| Zerotorescue@155 | 1432 						set = function(i, v, e) addon.db.profile.defaults.localItemData[v] = e; end, -- can't be nil or the defaults will be used | 
| Zerotorescue@155 | 1433 						dialogControl = "Dropdown", -- this is not standard, normal multiselect control gives us a list of all chars with toggle-boxes. UGLY! We want a multiselect-box instead. | 
| Zerotorescue@155 | 1434 					}, | 
| Zerotorescue@155 | 1435 				}, | 
| Zerotorescue@155 | 1436 			}, | 
| Zerotorescue@155 | 1437 			minimumStock = { | 
| Zerotorescue@155 | 1438 				order = 10, | 
| Zerotorescue@155 | 1439 				type = "group", | 
| Zerotorescue@155 | 1440 				inline = true, | 
| Zerotorescue@155 | 1441 				name = "Minimum stock", | 
| Zerotorescue@155 | 1442 				args = { | 
| Zerotorescue@155 | 1443 					description = { | 
| Zerotorescue@155 | 1444 						order = 0, | 
| Zerotorescue@155 | 1445 						type = "description", | 
| Zerotorescue@155 | 1446 						name = "Here you can specify the default minimum amount of items you wish to keep in stock and related settings. The settings entered here will be used when you choose not to override the settings within an individual group.", | 
| Zerotorescue@155 | 1447 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@155 | 1448 					}, | 
| Zerotorescue@155 | 1449 					header = { | 
| Zerotorescue@155 | 1450 						order = 5, | 
| Zerotorescue@155 | 1451 						type = "header", | 
| Zerotorescue@155 | 1452 						name = "", | 
| Zerotorescue@155 | 1453 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@155 | 1454 					}, | 
| Zerotorescue@155 | 1455 					minLocalStock = { | 
| Zerotorescue@155 | 1456 						order = 10, | 
| Zerotorescue@155 | 1457 						type = "range", | 
| Zerotorescue@155 | 1458 						min = 0, | 
| Zerotorescue@155 | 1459 						max = 100000, | 
| Zerotorescue@155 | 1460 						softMax = 100, | 
| Zerotorescue@155 | 1461 						step = 1, | 
| Zerotorescue@155 | 1462 						name = "Minimum local stock", | 
| Zerotorescue@155 | 1463 						desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.", | 
| Zerotorescue@155 | 1464 						get = function() return addon.db.profile.defaults.minLocalStock; end, | 
| Zerotorescue@155 | 1465 						set = function(i, v) addon.db.profile.defaults.minLocalStock = v; end, | 
| Zerotorescue@155 | 1466 					}, | 
| Zerotorescue@155 | 1467 					alertBelowLocalMinimum = { | 
| Zerotorescue@155 | 1468 						order = 11, | 
| Zerotorescue@155 | 1469 						type = "toggle", | 
| Zerotorescue@155 | 1470 						name = "Alert when below local minimum (NYI)", | 
| Zerotorescue@155 | 1471 						desc = "Show an alert when this item gets below this threshold.", | 
| Zerotorescue@155 | 1472 						get = function() return addon.db.profile.defaults.alertBelowLocalMinimum; end, | 
| Zerotorescue@155 | 1473 						set = function(i, v) addon.db.profile.defaults.alertBelowLocalMinimum = v; end, | 
| Zerotorescue@155 | 1474 					}, | 
| Zerotorescue@155 | 1475 					autoRefill = { | 
| Zerotorescue@155 | 1476 						order = 12, | 
| Zerotorescue@155 | 1477 						type = "toggle", | 
| Zerotorescue@155 | 1478 						name = "Auto refill from storage", | 
| Zerotorescue@155 | 1479 						desc = "Automatically refill items from your storage (bank/mailbox - unless this is included in the local count - or the guild bank) when below the minimum local stock.", | 
| Zerotorescue@155 | 1480 						get = function() return addon.db.profile.defaults.autoRefill; end, | 
| Zerotorescue@155 | 1481 						set = function(i, v) addon.db.profile.defaults.autoRefill = v; end, | 
| Zerotorescue@155 | 1482 					}, | 
| Zerotorescue@155 | 1483 					minGlobalStock = { | 
| Zerotorescue@155 | 1484 						order = 20, | 
| Zerotorescue@155 | 1485 						type = "range", | 
| Zerotorescue@155 | 1486 						min = 0, | 
| Zerotorescue@155 | 1487 						max = 100000, | 
| Zerotorescue@155 | 1488 						softMax = 100, | 
| Zerotorescue@155 | 1489 						step = 1, | 
| Zerotorescue@155 | 1490 						name = "Minimum global stock", | 
| Zerotorescue@155 | 1491 						desc = "You can manually enter a value between 100 and 100.000 in the text box below if the provided range is insufficient.", | 
| Zerotorescue@155 | 1492 						get = function() return addon.db.profile.defaults.minGlobalStock; end, | 
| Zerotorescue@155 | 1493 						set = function(i, v) addon.db.profile.defaults.minGlobalStock = v; end, | 
| Zerotorescue@155 | 1494 					}, | 
| Zerotorescue@155 | 1495 					alertBelowGlobalMinimum = { | 
| Zerotorescue@155 | 1496 						order = 21, | 
| Zerotorescue@155 | 1497 						type = "toggle", | 
| Zerotorescue@155 | 1498 						name = "Alert when below global minimum (NYI)", | 
| Zerotorescue@155 | 1499 						desc = "Show an alert when this item gets below this threshold.", | 
| Zerotorescue@155 | 1500 						get = function() return addon.db.profile.defaults.alertBelowGlobalMinimum; end, | 
| Zerotorescue@155 | 1501 						set = function(i, v) addon.db.profile.defaults.alertBelowGlobalMinimum = v; end, | 
| Zerotorescue@155 | 1502 					}, | 
| Zerotorescue@155 | 1503 					summaryThresholdShow = { | 
| Zerotorescue@155 | 1504 						order = 30, | 
| Zerotorescue@155 | 1505 						type = "range", | 
| Zerotorescue@155 | 1506 						min = 0, | 
| Zerotorescue@155 | 1507 						max = 100, | 
| Zerotorescue@155 | 1508 						softMax = 100, | 
| Zerotorescue@155 | 1509 						step = 0.05, | 
| Zerotorescue@155 | 1510 						isPercent = true, | 
| Zerotorescue@155 | 1511 						name = "Show in summary when below", | 
| Zerotorescue@155 | 1512 						desc = "Show items in the summary when below this percentage of the minimum stock. This can be either below the minimum or the global stock.", | 
| Zerotorescue@155 | 1513 						get = function() return addon.db.profile.defaults.summaryThresholdShow; end, | 
| Zerotorescue@155 | 1514 						set = function(i, v) addon.db.profile.defaults.summaryThresholdShow = v; end, | 
| Zerotorescue@155 | 1515 					}, | 
| Zerotorescue@155 | 1516 				}, | 
| Zerotorescue@155 | 1517 			}, | 
| Zerotorescue@155 | 1518 			refill = { | 
| Zerotorescue@155 | 1519 				order = 20, | 
| Zerotorescue@155 | 1520 				type = "group", | 
| Zerotorescue@155 | 1521 				inline = true, | 
| Zerotorescue@155 | 1522 				name = "Replenishing stock", | 
| Zerotorescue@155 | 1523 				args = { | 
| Zerotorescue@155 | 1524 					description = { | 
| Zerotorescue@155 | 1525 						order = 0, | 
| Zerotorescue@155 | 1526 						type = "description", | 
| Zerotorescue@155 | 1527 						name = function() | 
| Zerotorescue@155 | 1528 							local r = "Here you can specify the default amount of items to which you wish to restock when you are collecting new items. This may be higher than the minimum stock. The settings entered here will be used when you choose not to override the settings within an individual group.\n\n"; | 
| Zerotorescue@155 | 1529 | 
| Zerotorescue@155 | 1530 							r = r .. "When restocking the target amount is |cfffed000" .. addon.db.profile.defaults.restockTarget .. "|r of every item. Not queueing craftable items when only missing |cfffed000" .. floor( addon.db.profile.defaults.minCraftingQueue * addon.db.profile.defaults.restockTarget ) .. "|r (|cfffed000" .. ( addon.db.profile.defaults.minCraftingQueue * 100 ) .. "%|r) of the restock target."; | 
| Zerotorescue@155 | 1531 | 
| Zerotorescue@155 | 1532 							return r; | 
| Zerotorescue@155 | 1533 						end, | 
| Zerotorescue@155 | 1534 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@155 | 1535 					}, | 
| Zerotorescue@155 | 1536 					header = { | 
| Zerotorescue@155 | 1537 						order = 5, | 
| Zerotorescue@155 | 1538 						type = "header", | 
| Zerotorescue@155 | 1539 						name = "", | 
| Zerotorescue@155 | 1540 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@155 | 1541 					}, | 
| Zerotorescue@155 | 1542 					restockTarget = { | 
| Zerotorescue@155 | 1543 						order = 10, | 
| Zerotorescue@155 | 1544 						type = "range", | 
| Zerotorescue@155 | 1545 						min = 0, | 
| Zerotorescue@155 | 1546 						max = 100000, | 
| Zerotorescue@155 | 1547 						softMax = 100, | 
| Zerotorescue@155 | 1548 						step = 1, | 
| Zerotorescue@155 | 1549 						name = "Restock target", | 
| Zerotorescue@155 | 1550 						desc = "You can manually enter a value between 100 and 100.000 in the edit box if the provided range is insufficient.", | 
| Zerotorescue@155 | 1551 						get = function() return addon.db.profile.defaults.restockTarget; end, | 
| Zerotorescue@155 | 1552 						set = function(i, v) addon.db.profile.defaults.restockTarget = v; end, | 
| Zerotorescue@155 | 1553 					}, | 
| Zerotorescue@155 | 1554 					minCraftingQueue = { | 
| Zerotorescue@155 | 1555 						order = 20, | 
| Zerotorescue@155 | 1556 						type = "range", | 
| Zerotorescue@155 | 1557 						min = 0, | 
| Zerotorescue@155 | 1558 						max = 1, | 
| Zerotorescue@155 | 1559 						step = 0.01, -- 1% | 
| Zerotorescue@155 | 1560 						isPercent = true, | 
| Zerotorescue@155 | 1561 						name = "Don't queue if I only miss", | 
| Zerotorescue@155 | 1562 						desc = "Don't add a craftable item to the queue if I only miss this much or less of the restock target.\n\nExample: if your restock target is set to 60 and this is set to 5%, an item won't be queued unless you are missing more than 3 of it.", | 
| Zerotorescue@155 | 1563 						get = function() return addon.db.profile.defaults.minCraftingQueue; end, | 
| Zerotorescue@155 | 1564 						set = function(i, v) addon.db.profile.defaults.minCraftingQueue = v; end, | 
| Zerotorescue@155 | 1565 					}, | 
| Zerotorescue@155 | 1566 					bonusQueue = { | 
| Zerotorescue@155 | 1567 						order = 30, | 
| Zerotorescue@155 | 1568 						type = "range", | 
| Zerotorescue@155 | 1569 						min = 0, | 
| Zerotorescue@155 | 1570 						max = 10, -- 1000% | 
| Zerotorescue@155 | 1571 						step = 0.01, -- 1% | 
| Zerotorescue@155 | 1572 						isPercent = true, | 
| Zerotorescue@155 | 1573 						name = "Bonus queue", | 
| Zerotorescue@155 | 1574 						desc = "Get additional items when there are none left.\n\nExample: if your restock target is set to 60 and this is set to 10%, you will get 66 items instead of just 60 if you end up with none left while queueing.", | 
| Zerotorescue@155 | 1575 						get = function() return addon.db.profile.defaults.bonusQueue; end, | 
| Zerotorescue@155 | 1576 						set = function(i, v) addon.db.profile.defaults.bonusQueue = v; end, | 
| Zerotorescue@155 | 1577 					}, | 
| Zerotorescue@155 | 1578 					priceThreshold = { | 
| Zerotorescue@155 | 1579 						order = 40, | 
| Zerotorescue@155 | 1580 						type = "input", | 
| Zerotorescue@155 | 1581 						name = "Price threshold", | 
| Zerotorescue@155 | 1582 						desc = "Only queue craftable items when they are worth at least this much according to your auction house addon.\n\nSet to 0 to ignore auction prices.", | 
| Zerotorescue@155 | 1583 						validate = function(info, value) return addon:ValidateReadableMoney(info, value); end, | 
| Zerotorescue@155 | 1584 						get = function() return addon:ReadableMoney(addon.db.profile.defaults.priceThreshold); end, | 
| Zerotorescue@155 | 1585 						set = function(i, v) addon.db.profile.defaults.priceThreshold = addon:ReadableMoneyToCopper(v); end, | 
| Zerotorescue@155 | 1586 					}, | 
| Zerotorescue@155 | 1587 					summaryHidePriceThreshold = { | 
| Zerotorescue@155 | 1588 						order = 50, | 
| Zerotorescue@155 | 1589 						type = "toggle", | 
| Zerotorescue@155 | 1590 						name = "Hide when below threshold", | 
| Zerotorescue@155 | 1591 						desc = "Hide items from the summary when their value is below the set price threshold.", | 
| Zerotorescue@155 | 1592 						get = function() return addon.db.profile.defaults.summaryHidePriceThreshold; end, | 
| Zerotorescue@155 | 1593 						set = function(i, v) addon.db.profile.defaults.summaryHidePriceThreshold = v; end, | 
| Zerotorescue@155 | 1594 					}, | 
| Zerotorescue@155 | 1595 					alwaysGetAuctionValue = { | 
| Zerotorescue@155 | 1596 						order = 60, | 
| Zerotorescue@155 | 1597 						type = "toggle", | 
| Zerotorescue@155 | 1598 						name = "Always show auction value", | 
| Zerotorescue@155 | 1599 						desc = "Always cache and show the auction value of items, even if the price threshold is set to 0|cffeda55fc|r.", | 
| Zerotorescue@155 | 1600 						get = function() return addon.db.profile.defaults.alwaysGetAuctionValue; end, | 
| Zerotorescue@155 | 1601 						set = function(i, v) addon.db.profile.defaults.alwaysGetAuctionValue = v; end, | 
| Zerotorescue@155 | 1602 					}, | 
| Zerotorescue@155 | 1603 				}, | 
| Zerotorescue@155 | 1604 			}, | 
| Zerotorescue@155 | 1605 			addon = { | 
| Zerotorescue@155 | 1606 				order = 30, | 
| Zerotorescue@155 | 1607 				type = "group", | 
| Zerotorescue@155 | 1608 				inline = true, | 
| Zerotorescue@155 | 1609 				name = "Prefered addons", | 
| Zerotorescue@155 | 1610 				args = { | 
| Zerotorescue@155 | 1611 					description = { | 
| Zerotorescue@155 | 1612 						order = 0, | 
| Zerotorescue@155 | 1613 						type = "description", | 
| Zerotorescue@155 | 1614 						name = function() | 
| Zerotorescue@155 | 1615 							local t = ""; | 
| Zerotorescue@155 | 1616 							if not addon.db.profile.defaults.hideHelp then | 
| Zerotorescue@155 | 1617 								t = "Selecting your prefered addons is optional, the first working addon will be used if the selected addon doesn't exist. You only need to set this when you are running multiple addons of a kind and wish to specify which addons to use for what groups.\n\n"; | 
| Zerotorescue@106 | 1618 							end | 
| Zerotorescue@62 | 1619 | 
| Zerotorescue@62 | 1620 							local currentAddon, selectedAddonName = addon:GetItemCountAddon(); | 
| Zerotorescue@62 | 1621 							local preferedAddon = addon.db.profile.defaults.itemCountAddon; | 
| Zerotorescue@62 | 1622 | 
| Zerotorescue@62 | 1623 							if currentAddon then | 
| Zerotorescue@62 | 1624 								t = t .. "Currently using |cfffed000" .. selectedAddonName .. "|r as your item count addon. This addon is " .. ((currentAddon.IsEnabled() and "|cff00ff00enabled|r") or "|cffff0000disabled|r") .. "."; | 
| Zerotorescue@62 | 1625 | 
| Zerotorescue@62 | 1626 								if currentAddon.GetTotalCount and currentAddon.GetCharacterCount then | 
| Zerotorescue@62 | 1627 									t = t .. " This addon supports |cfffed000both total as local|r item counts."; | 
| Zerotorescue@62 | 1628 								elseif currentAddon.GetTotalCount then | 
| Zerotorescue@62 | 1629 									t = t .. " This addon supports |cfffed000only total|r item counts."; | 
| Zerotorescue@62 | 1630 								elseif currentAddon.GetCharacterCount then | 
| Zerotorescue@62 | 1631 									t = t .. " This addon supports |cfffed000only local|r item counts."; | 
| Zerotorescue@62 | 1632 								end | 
| Zerotorescue@62 | 1633 | 
| Zerotorescue@62 | 1634 								if preferedAddon ~= selectedAddonName then | 
| Zerotorescue@62 | 1635 									t = t .. "\n\n|cffff0000You have selected |cfffed000" .. preferedAddon .. "|r|cffff0000 as your item count addon, but this appears to be disabled and thus a random alternative was selected.|r"; | 
| Zerotorescue@62 | 1636 								end | 
| Zerotorescue@62 | 1637 							end | 
| Zerotorescue@62 | 1638 | 
| Zerotorescue@62 | 1639 							return t; | 
| Zerotorescue@62 | 1640 						end, | 
| Zerotorescue@62 | 1641 					}, | 
| Zerotorescue@62 | 1642 					header = { | 
| Zerotorescue@62 | 1643 						order = 5, | 
| Zerotorescue@62 | 1644 						type = "header", | 
| Zerotorescue@62 | 1645 						name = "", | 
| Zerotorescue@62 | 1646 					}, | 
| Zerotorescue@62 | 1647 					auctionPricingAddon = { | 
| Zerotorescue@62 | 1648 						order = 10, | 
| Zerotorescue@62 | 1649 						type = "select", | 
| Zerotorescue@62 | 1650 						name = "Prefered pricing addon", | 
| Zerotorescue@62 | 1651 						desc = "Select the addon you prefer data to be retrieved from. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@62 | 1652 						values = function() | 
| Zerotorescue@62 | 1653 							local temp = {}; | 
| Zerotorescue@62 | 1654 							for name, value in pairs(addon.supportedAddons.auctionPricing) do | 
| Zerotorescue@62 | 1655 								temp[name] = name; | 
| Zerotorescue@62 | 1656 							end | 
| Zerotorescue@62 | 1657 | 
| Zerotorescue@62 | 1658 							return temp; | 
| Zerotorescue@62 | 1659 						end, | 
| Zerotorescue@62 | 1660 						get = function() return addon.db.profile.defaults.auctionPricingAddon; end, | 
| Zerotorescue@62 | 1661 						set = function(i, v) | 
| Zerotorescue@62 | 1662 							addon.db.profile.defaults.auctionPricingAddon = v; | 
| Zerotorescue@62 | 1663 | 
| Zerotorescue@62 | 1664 							if addon.supportedAddons.auctionPricing[v].OnSelect then | 
| Zerotorescue@62 | 1665 								addon.supportedAddons.auctionPricing[v].OnSelect(); | 
| Zerotorescue@62 | 1666 							end | 
| Zerotorescue@62 | 1667 						end, | 
| Zerotorescue@62 | 1668 					}, | 
| Zerotorescue@62 | 1669 					itemCountAddon = { | 
| Zerotorescue@62 | 1670 						order = 20, | 
| Zerotorescue@62 | 1671 						type = "select", | 
| Zerotorescue@62 | 1672 						name = "Prefered item count addon", | 
| Zerotorescue@62 | 1673 						desc = "Select the addon you prefer data to be retrieved from. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@62 | 1674 						values = function() | 
| Zerotorescue@62 | 1675 							local temp = {}; | 
| Zerotorescue@62 | 1676 							for name, value in pairs(addon.supportedAddons.itemCount) do | 
| Zerotorescue@62 | 1677 								temp[name] = name; | 
| Zerotorescue@62 | 1678 							end | 
| Zerotorescue@62 | 1679 | 
| Zerotorescue@62 | 1680 							return temp; | 
| Zerotorescue@62 | 1681 						end, | 
| Zerotorescue@62 | 1682 						get = function() return addon.db.profile.defaults.itemCountAddon; end, | 
| Zerotorescue@62 | 1683 						set = function(i, v) | 
| Zerotorescue@62 | 1684 							addon.db.profile.defaults.itemCountAddon = v; | 
| Zerotorescue@62 | 1685 | 
| Zerotorescue@62 | 1686 							if addon.supportedAddons.itemCount[v].OnSelect then | 
| Zerotorescue@62 | 1687 								addon.supportedAddons.itemCount[v].OnSelect(); | 
| Zerotorescue@62 | 1688 							end | 
| Zerotorescue@62 | 1689 						end, | 
| Zerotorescue@62 | 1690 					}, | 
| Zerotorescue@62 | 1691 					craftingAddon = { | 
| Zerotorescue@62 | 1692 						order = 30, | 
| Zerotorescue@62 | 1693 						type = "select", | 
| Zerotorescue@62 | 1694 						name = "Prefered crafting addon", | 
| Zerotorescue@62 | 1695 						desc = "Select the addon you prefer data to be queued into. A random supported addon will be used if the selected addon can not be found.", | 
| Zerotorescue@62 | 1696 						values = function() | 
| Zerotorescue@62 | 1697 							local temp = {}; | 
| Zerotorescue@62 | 1698 							for name, value in pairs(addon.supportedAddons.crafting) do | 
| Zerotorescue@62 | 1699 								temp[name] = name; | 
| Zerotorescue@62 | 1700 							end | 
| Zerotorescue@62 | 1701 | 
| Zerotorescue@62 | 1702 							return temp; | 
| Zerotorescue@62 | 1703 						end, | 
| Zerotorescue@62 | 1704 						get = function() return addon.db.profile.defaults.craftingAddon; end, | 
| Zerotorescue@62 | 1705 						set = function(i, v) | 
| Zerotorescue@62 | 1706 							addon.db.profile.defaults.craftingAddon = v; | 
| Zerotorescue@62 | 1707 | 
| Zerotorescue@62 | 1708 							if addon.supportedAddons.crafting[v].OnSelect then | 
| Zerotorescue@62 | 1709 								addon.supportedAddons.crafting[v].OnSelect(); | 
| Zerotorescue@62 | 1710 							end | 
| Zerotorescue@62 | 1711 						end, | 
| Zerotorescue@62 | 1712 					}, | 
| Zerotorescue@62 | 1713 				}, | 
| Zerotorescue@62 | 1714 			}, | 
| Zerotorescue@106 | 1715 		}, | 
| Zerotorescue@106 | 1716 	}; | 
| Zerotorescue@106 | 1717 end | 
| Zerotorescue@106 | 1718 | 
| Zerotorescue@106 | 1719 function mod:FillExtraOptions() | 
| Zerotorescue@152 | 1720 	local selectedExportGroups = {}; | 
| Zerotorescue@106 | 1721 	options.args.extra = { | 
| Zerotorescue@106 | 1722 		order = 300, | 
| Zerotorescue@106 | 1723 		type = "group", | 
| Zerotorescue@106 | 1724 		name = "Extra", | 
| Zerotorescue@106 | 1725 		desc = "Change additional (but completely optional) settings.", | 
| Zerotorescue@106 | 1726 		args = { | 
| Zerotorescue@106 | 1727 			misc = { | 
| Zerotorescue@106 | 1728 				order = 10, | 
| Zerotorescue@62 | 1729 				type = "group", | 
| Zerotorescue@62 | 1730 				inline = true, | 
| Zerotorescue@106 | 1731 				name = "Miscellaneous", | 
| Zerotorescue@62 | 1732 				args = { | 
| Zerotorescue@106 | 1733 					hideHelp = { | 
| Zerotorescue@106 | 1734 						order = 10, | 
| Zerotorescue@106 | 1735 						type = "toggle", | 
| Zerotorescue@106 | 1736 						width = "full", | 
| Zerotorescue@106 | 1737 						name = "Hide any help tooltips, descriptions and the help config category", | 
| Zerotorescue@106 | 1738 						desc = "Hide any optional help tooltips, descriptions and the help config category.\n\nPlease note some tooltips may not disappear until next login.", | 
| Zerotorescue@106 | 1739 						get = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@106 | 1740 						set = function(i, v) addon.db.profile.defaults.hideHelp = v; end, | 
| Zerotorescue@62 | 1741 					}, | 
| Zerotorescue@106 | 1742 					autoRefillSkipConfirm = { | 
| Zerotorescue@62 | 1743 						order = 20, | 
| Zerotorescue@106 | 1744 						type = "toggle", | 
| Zerotorescue@106 | 1745 						width = "full", | 
| Zerotorescue@131 | 1746 						name = "Skip the confirmation window for storage refilling", | 
| Zerotorescue@131 | 1747 						desc = "Automatically start moving items from the storage (bank, guild bank or mailbox) without showing the confirmation window.", | 
| Zerotorescue@106 | 1748 						get = function() return addon.db.profile.defaults.autoRefillSkipConfirm; end, | 
| Zerotorescue@106 | 1749 						set = function(i, v) addon.db.profile.defaults.autoRefillSkipConfirm = v; end, | 
| Zerotorescue@76 | 1750 					}, | 
| Zerotorescue@76 | 1751 					removeCharacter = { | 
| Zerotorescue@106 | 1752 						order = 30, | 
| Zerotorescue@76 | 1753 						type = "select", | 
| Zerotorescue@106 | 1754 						width = "double", | 
| Zerotorescue@106 | 1755 						name = "Remove a character from Inventorium's memory", | 
| Zerotorescue@76 | 1756 						desc = "Select a character to remove all traces of it from Inventorium's memory.\n\nYour current character can not be removed, you must login to a different character to do so.", | 
| Zerotorescue@76 | 1757 						values = function() | 
| Zerotorescue@76 | 1758 							local temp = {}; | 
| Zerotorescue@76 | 1759 | 
| Zerotorescue@76 | 1760 							temp[""] = ""; | 
| Zerotorescue@76 | 1761 | 
| Zerotorescue@76 | 1762 							local playerName = UnitName("player"); | 
| Zerotorescue@76 | 1763 							for charName in pairs(addon.db.factionrealm.characters) do | 
| Zerotorescue@76 | 1764 								if playerName ~= charName then | 
| Zerotorescue@76 | 1765 									temp[charName] = charName; | 
| Zerotorescue@76 | 1766 								end | 
| Zerotorescue@76 | 1767 							end | 
| Zerotorescue@76 | 1768 | 
| Zerotorescue@76 | 1769 							return temp; | 
| Zerotorescue@76 | 1770 						end, | 
| Zerotorescue@76 | 1771 						set = function(i, value) | 
| Zerotorescue@76 | 1772 							if value and value ~= "" then | 
| Zerotorescue@76 | 1773 								addon.db.factionrealm.characters[value] = nil; | 
| Zerotorescue@76 | 1774 								addon.db.profile.defaults.trackAtCharacters[value] = nil; | 
| Zerotorescue@76 | 1775 								for name, values in pairs(addon.db.profile.groups) do | 
| Zerotorescue@76 | 1776 									if values.trackAtCharacters then | 
| Zerotorescue@76 | 1777 										values.trackAtCharacters[name] = nil; | 
| Zerotorescue@76 | 1778 									end | 
| Zerotorescue@76 | 1779 								end | 
| Zerotorescue@76 | 1780 							end | 
| Zerotorescue@76 | 1781 						end, | 
| Zerotorescue@76 | 1782 					}, | 
| Zerotorescue@76 | 1783 				}, | 
| Zerotorescue@76 | 1784 			}, | 
| Zerotorescue@152 | 1785 			export = { | 
| Zerotorescue@152 | 1786 				order = 30, | 
| Zerotorescue@152 | 1787 				type = "group", | 
| Zerotorescue@152 | 1788 				inline = true, | 
| Zerotorescue@152 | 1789 				name = "Export groups", | 
| Zerotorescue@152 | 1790 				args = { | 
| Zerotorescue@152 | 1791 					localItemData = { | 
| Zerotorescue@152 | 1792 						order = 0, | 
| Zerotorescue@152 | 1793 						type = "multiselect", | 
| Zerotorescue@152 | 1794 						name = "Select groups", | 
| Zerotorescue@152 | 1795 						desc = "Select which groups should be included in the export.", | 
| Zerotorescue@152 | 1796 						values = function() | 
| Zerotorescue@152 | 1797 							local temp = {}; | 
| Zerotorescue@152 | 1798 | 
| Zerotorescue@152 | 1799 							if addon.db.profile.groups then | 
| Zerotorescue@152 | 1800 								temp["*InverseAll"] = "Inverse"; | 
| Zerotorescue@152 | 1801 | 
| Zerotorescue@152 | 1802 								for groupName, _ in pairs(addon.db.profile.groups) do | 
| Zerotorescue@152 | 1803 									temp[groupName] = groupName; | 
| Zerotorescue@152 | 1804 								end | 
| Zerotorescue@152 | 1805 							end | 
| Zerotorescue@152 | 1806 | 
| Zerotorescue@152 | 1807 							return temp; | 
| Zerotorescue@152 | 1808 						end, | 
| Zerotorescue@152 | 1809 						get = function(info, value) | 
| Zerotorescue@152 | 1810 							--local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@152 | 1811 							--local optionName = info[#info]; | 
| Zerotorescue@152 | 1812 | 
| Zerotorescue@152 | 1813 							return selectedExportGroups[value]; | 
| Zerotorescue@152 | 1814 						end, | 
| Zerotorescue@152 | 1815 						set = function(info, name, value) | 
| Zerotorescue@152 | 1816 							--local groupName = groupIdToName[info[2]]; | 
| Zerotorescue@152 | 1817 							--local optionName = info[#info]; | 
| Zerotorescue@152 | 1818 | 
| Zerotorescue@152 | 1819 							if name == "*InverseAll" then | 
| Zerotorescue@152 | 1820 								for groupName, _ in pairs(addon.db.profile.groups) do | 
| Zerotorescue@152 | 1821 									if selectedExportGroups[groupName] then | 
| Zerotorescue@152 | 1822 										selectedExportGroups[groupName] = nil; | 
| Zerotorescue@152 | 1823 									else | 
| Zerotorescue@152 | 1824 										selectedExportGroups[groupName] = true; | 
| Zerotorescue@152 | 1825 									end | 
| Zerotorescue@152 | 1826 								end | 
| Zerotorescue@152 | 1827 							else | 
| Zerotorescue@152 | 1828 								if selectedExportGroups[name] then | 
| Zerotorescue@152 | 1829 									selectedExportGroups[name] = nil; | 
| Zerotorescue@152 | 1830 								else | 
| Zerotorescue@152 | 1831 									selectedExportGroups[name] = true; | 
| Zerotorescue@152 | 1832 								end | 
| Zerotorescue@152 | 1833 							end | 
| Zerotorescue@152 | 1834 						end, | 
| Zerotorescue@152 | 1835 					}, | 
| Zerotorescue@152 | 1836 					input = { | 
| Zerotorescue@152 | 1837 						order = 10, | 
| Zerotorescue@152 | 1838 						type = "input", | 
| Zerotorescue@152 | 1839 						multiline = true, | 
| Zerotorescue@152 | 1840 						width = "full", | 
| Zerotorescue@152 | 1841 						name = "Exported data", | 
| Zerotorescue@152 | 1842 						desc = "Export the group data for the currently selected group. Press CTRL-A to select all and CTRL-C to copy the text.", | 
| Zerotorescue@152 | 1843 						set = false, | 
| Zerotorescue@152 | 1844 						get = function(info) | 
| Zerotorescue@152 | 1845 							local result = ""; | 
| Zerotorescue@152 | 1846 							for groupName, v in pairs(selectedExportGroups) do | 
| Zerotorescue@152 | 1847 								if v then | 
| Zerotorescue@152 | 1848 									result = result .. mod:ExportGroup(groupName) .. "\n"; | 
| Zerotorescue@152 | 1849 								end | 
| Zerotorescue@152 | 1850 							end | 
| Zerotorescue@152 | 1851 | 
| Zerotorescue@152 | 1852 							return result; | 
| Zerotorescue@152 | 1853 						end, | 
| Zerotorescue@152 | 1854 					}, | 
| Zerotorescue@152 | 1855 				}, | 
| Zerotorescue@152 | 1856 			}, | 
| Zerotorescue@106 | 1857 			colorCodes = { | 
| Zerotorescue@106 | 1858 				order = 30, | 
| Zerotorescue@106 | 1859 				type = "group", | 
| Zerotorescue@106 | 1860 				inline = true, | 
| Zerotorescue@106 | 1861 				name = "Color codes", | 
| Zerotorescue@106 | 1862 				args = { | 
| Zerotorescue@106 | 1863 					description = { | 
| Zerotorescue@106 | 1864 						order = 0, | 
| Zerotorescue@106 | 1865 						type = "description", | 
| Zerotorescue@106 | 1866 						name = "Change the color code thresholds based on the current stock remaining of the required minimum stock.", | 
| Zerotorescue@106 | 1867 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@106 | 1868 					}, | 
| Zerotorescue@106 | 1869 					header = { | 
| Zerotorescue@106 | 1870 						order = 5, | 
| Zerotorescue@106 | 1871 						type = "header", | 
| Zerotorescue@106 | 1872 						name = "", | 
| Zerotorescue@106 | 1873 						hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@106 | 1874 					}, | 
| Zerotorescue@106 | 1875 					green = { | 
| Zerotorescue@106 | 1876 						order = 10, | 
| Zerotorescue@106 | 1877 						type = "range", | 
| Zerotorescue@106 | 1878 						min = 0, | 
| Zerotorescue@106 | 1879 						max = 1, | 
| Zerotorescue@106 | 1880 						step = 0.01, | 
| Zerotorescue@106 | 1881 						isPercent = true, | 
| Zerotorescue@106 | 1882 						name = "|cff00ff00Green|r", | 
| Zerotorescue@106 | 1883 						desc = "Show quantity in green when at least this much of the minimum stock is available.", | 
| Zerotorescue@106 | 1884 						get = function() return addon.db.profile.defaults.colors.green; end, | 
| Zerotorescue@106 | 1885 						set = function(i, v) addon.db.profile.defaults.colors.green = v; end, | 
| Zerotorescue@106 | 1886 					}, | 
| Zerotorescue@106 | 1887 					yellow = { | 
| Zerotorescue@106 | 1888 						order = 20, | 
| Zerotorescue@106 | 1889 						type = "range", | 
| Zerotorescue@106 | 1890 						min = 0, | 
| Zerotorescue@106 | 1891 						max = 1, | 
| Zerotorescue@106 | 1892 						step = 0.01, | 
| Zerotorescue@106 | 1893 						isPercent = true, | 
| Zerotorescue@106 | 1894 						name = "|cffffff00Yellow|r", | 
| Zerotorescue@106 | 1895 						desc = "Show quantity in yellow when at least this much of the minimum stock is available.", | 
| Zerotorescue@106 | 1896 						get = function() return addon.db.profile.defaults.colors.yellow; end, | 
| Zerotorescue@106 | 1897 						set = function(i, v) addon.db.profile.defaults.colors.yellow = v; end, | 
| Zerotorescue@106 | 1898 					}, | 
| Zerotorescue@106 | 1899 					orange = { | 
| Zerotorescue@106 | 1900 						order = 30, | 
| Zerotorescue@106 | 1901 						type = "range", | 
| Zerotorescue@106 | 1902 						min = 0, | 
| Zerotorescue@106 | 1903 						max = 1, | 
| Zerotorescue@106 | 1904 						step = 0.01, | 
| Zerotorescue@106 | 1905 						isPercent = true, | 
| Zerotorescue@106 | 1906 						name = "|cffff9933Orange|r", | 
| Zerotorescue@106 | 1907 						desc = "Show quantity in orange when at least this much of the minimum stock is available.", | 
| Zerotorescue@106 | 1908 						get = function() return addon.db.profile.defaults.colors.orange; end, | 
| Zerotorescue@106 | 1909 						set = function(i, v) addon.db.profile.defaults.colors.orange = v; end, | 
| Zerotorescue@106 | 1910 					}, | 
| Zerotorescue@106 | 1911 					red = { | 
| Zerotorescue@106 | 1912 						order = 40, | 
| Zerotorescue@106 | 1913 						type = "range", | 
| Zerotorescue@106 | 1914 						min = 0, | 
| Zerotorescue@106 | 1915 						max = 1, | 
| Zerotorescue@106 | 1916 						step = 0.01, | 
| Zerotorescue@106 | 1917 						isPercent = true, | 
| Zerotorescue@106 | 1918 						name = "|cffff0000Red|r", | 
| Zerotorescue@106 | 1919 						desc = "Show quantity in red when at least this much of the minimum stock is available.", | 
| Zerotorescue@106 | 1920 						get = function() return addon.db.profile.defaults.colors.red; end, | 
| Zerotorescue@106 | 1921 						set = function(i, v) addon.db.profile.defaults.colors.red = v; end, | 
| Zerotorescue@106 | 1922 					}, | 
| Zerotorescue@106 | 1923 				}, | 
| Zerotorescue@106 | 1924 			}, | 
| Zerotorescue@62 | 1925 		}, | 
| Zerotorescue@62 | 1926 	}; | 
| Zerotorescue@62 | 1927 end | 
| Zerotorescue@62 | 1928 | 
| Zerotorescue@62 | 1929 function mod:FillHelpOptions() | 
| Zerotorescue@62 | 1930 	options.args.help = { | 
| Zerotorescue@62 | 1931 		order = 150, | 
| Zerotorescue@62 | 1932 		type = "group", | 
| Zerotorescue@106 | 1933 		hidden = function() return addon.db.profile.defaults.hideHelp; end, | 
| Zerotorescue@62 | 1934 		childGroups = "tab", | 
| Zerotorescue@62 | 1935 		name = "Help", | 
| Zerotorescue@62 | 1936 		desc = "Useful information for if you're unfamiliar with a part of the addon.", | 
| Zerotorescue@62 | 1937 		args = { | 
| Zerotorescue@62 | 1938 			general = { | 
| Zerotorescue@62 | 1939 				order = 1, | 
| Zerotorescue@62 | 1940 				type = "group", | 
| Zerotorescue@62 | 1941 				name = "General", | 
| Zerotorescue@62 | 1942 				args = { | 
| Zerotorescue@62 | 1943 					description = { | 
| Zerotorescue@62 | 1944 						order = 0, | 
| Zerotorescue@62 | 1945 						type = "description", | 
| Zerotorescue@62 | 1946 						name = "Please note that all multi-select |cfffed000dropdown|r boxes were turned into multi-select |cfffed000toggle|r boxes. I do not intend to keep it this way, however it can not yet be reverted due to a major bug in one of the libraries used by Inventorium. The layout of this config may look terribly organized in it's current state.\n\n" .. | 
| Zerotorescue@62 | 1947 								"Since this is a beta some functionality might not be implemented yet while the options are available (usually - but not always - tagged as \"NYI\"). These options are used to indicate a feature is on the way and will be implemented before Inventorium is tagged as a release.\n\n" .. | 
| Zerotorescue@62 | 1948 								"Please request things you want and report anything that's clunky, weird, vague or otherwise buggy at |cfffed000the Inventorium development addon page|r. You can find this by searching for \"|cfffed000Inventorium|r\" at |cfffed000CurseForge.com|r.\n\n" .. | 
| Zerotorescue@62 | 1949 								"Tutorials for Inventorium will be created after the first stable release. If you require any help before that you can always contact me in the |cfffed000#JMTC|r IRC channel at |cfffed000QuakeNet.org|r. You may also report issues and request things there if you wish.\n\n" .. | 
| Zerotorescue@62 | 1950 								"You might notice the summary window currently gets very slow when refreshed once you get over 100-200 items in the list, this is a known issue and will be fixed in |cfffed000version 1.1|r or a little later (which is after the initial release).", | 
| Zerotorescue@62 | 1951 					}, | 
| Zerotorescue@62 | 1952 				}, | 
| Zerotorescue@62 | 1953 			}, | 
| Zerotorescue@62 | 1954 			manual = { | 
| Zerotorescue@62 | 1955 				order = 2, | 
| Zerotorescue@62 | 1956 				type = "group", | 
| Zerotorescue@62 | 1957 				name = "Manual", | 
| Zerotorescue@62 | 1958 				args = { | 
| Zerotorescue@62 | 1959 					intro = { | 
| Zerotorescue@62 | 1960 						order = 1, | 
| Zerotorescue@62 | 1961 						type = "group", | 
| Zerotorescue@62 | 1962 						inline = true, | 
| Zerotorescue@62 | 1963 						name = "Intro", | 
| Zerotorescue@62 | 1964 						args = { | 
| Zerotorescue@62 | 1965 							description = { | 
| Zerotorescue@62 | 1966 								order = 0, | 
| Zerotorescue@62 | 1967 								type = "description", | 
| Zerotorescue@62 | 1968 								name = "|cfffed000Inventorium|r is an inventory tracking and restocking addon aimed towards making it extremely easy to keep enough stock of specific items at your characters. It provides a quick overview where you can see your current stock compared to the required stock and the current item value at the auction house whenever you find this relevant. From this overview you can queue craftable items into your favorite crafting profession addon and even restock from a vendor.", | 
| Zerotorescue@62 | 1969 							}, | 
| Zerotorescue@62 | 1970 						}, | 
| Zerotorescue@62 | 1971 					}, | 
| Zerotorescue@62 | 1972 					Overview = { | 
| Zerotorescue@62 | 1973 						order = 2, | 
| Zerotorescue@62 | 1974 						type = "group", | 
| Zerotorescue@62 | 1975 						inline = true, | 
| Zerotorescue@62 | 1976 						name = "Overview", | 
| Zerotorescue@62 | 1977 						args = { | 
| Zerotorescue@62 | 1978 							description = { | 
| Zerotorescue@62 | 1979 								order = 0, | 
| Zerotorescue@62 | 1980 								type = "description", | 
| Zerotorescue@62 | 1981 								name = "In the stock overview, which is called the summary, you can view a list with all items relevant to your current character with their updated stock and auction house values. You can sort this list on item quality, current stock, percentage of stock missing, and item values and this way easily manually find the items you wish to process. If you prefer to automate the process, you can also configure the groups exactly as you wish and hit the queue button to process everything in that group.\n\n" .. | 
| Zerotorescue@62 | 1982 | 
| Zerotorescue@62 | 1983 										"The item count data can be retrieved from most popular item count addons. This includes |cfffed000ItemCount|r and |cfffed000DataStore|r, but also |cfffed000Altoholic|r (even though this is not really a proper item count addon).\n" .. | 
| Zerotorescue@62 | 1984 										"The auction house values data can also be retrieved from most popular auction house addons. This includes |cfffed000Auctionator|r, |cfffed000Auctioneer|r, |cfffed000AuctionLite|r, |cfffed000AuctionMaster|r and any other addon implementing the standard for retrieving item values. Item values from the summary windows of |cfffed000AuctionProfitMaster|r and |cfffed000ZeroAuctions|r are also supported, but not recommended.", | 
| Zerotorescue@62 | 1985 							}, | 
| Zerotorescue@62 | 1986 						}, | 
| Zerotorescue@62 | 1987 					}, | 
| Zerotorescue@62 | 1988 					Groups = { | 
| Zerotorescue@62 | 1989 						order = 3, | 
| Zerotorescue@62 | 1990 						type = "group", | 
| Zerotorescue@62 | 1991 						inline = true, | 
| Zerotorescue@62 | 1992 						name = "Groups", | 
| Zerotorescue@62 | 1993 						args = { | 
| Zerotorescue@62 | 1994 							description = { | 
| Zerotorescue@62 | 1995 								order = 0, | 
| Zerotorescue@62 | 1996 								type = "description", | 
| Zerotorescue@62 | 1997 								name = "All items can be distributed over multiple groups to configure them exactly as you want. You can put all your glyphs in one group, gems in another and scrolls in a third with every single one of them having it's own set of unique settings. Per group you can set a price threshold, required item count, relevant characters and much more. The setup will feel very familiar to anyone that has used Quick Auctions to some extend as it uses a similar standard (though with many enhancements).", | 
| Zerotorescue@62 | 1998 							}, | 
| Zerotorescue@62 | 1999 						}, | 
| Zerotorescue@62 | 2000 					}, | 
| Zerotorescue@62 | 2001 					Queueing = { | 
| Zerotorescue@62 | 2002 						order = 4, | 
| Zerotorescue@62 | 2003 						type = "group", | 
| Zerotorescue@62 | 2004 						inline = true, | 
| Zerotorescue@62 | 2005 						name = "Queueing", | 
| Zerotorescue@62 | 2006 						args = { | 
| Zerotorescue@62 | 2007 							description = { | 
| Zerotorescue@62 | 2008 								order = 0, | 
| Zerotorescue@62 | 2009 								type = "description", | 
| Zerotorescue@62 | 2010 								name = "Queueing items into your crafting profession addon can be done per group or for all visible groups at once. This requires the relevant profession window to be open. All queueing is done based on the filters set in the config for the related group, any items falling outside will be ignored.\n\n" .. | 
| Zerotorescue@62 | 2011 | 
| Zerotorescue@62 | 2012 										"The queueing can be done into most popular crafting profession window replacing addons. This includes |cfffed000AdvancedTradeSkillWindow|r, |cfffed000GnomeWorks|r and |cfffed000Skillet|r.", | 
| Zerotorescue@62 | 2013 							}, | 
| Zerotorescue@62 | 2014 						}, | 
| Zerotorescue@62 | 2015 					}, | 
| Zerotorescue@62 | 2016 					Configuring = { | 
| Zerotorescue@62 | 2017 						order = 5, | 
| Zerotorescue@62 | 2018 						type = "group", | 
| Zerotorescue@62 | 2019 						inline = true, | 
| Zerotorescue@62 | 2020 						name = "Configuring", | 
| Zerotorescue@62 | 2021 						args = { | 
| Zerotorescue@62 | 2022 							description = { | 
| Zerotorescue@62 | 2023 								order = 0, | 
| Zerotorescue@62 | 2024 								type = "description", | 
| Zerotorescue@62 | 2025 								name = "The system resources used by this addon while it is stand-by are at a minimum, so you can just leave it enabled for all your characters unless you wish otherwise.\n\n" .. | 
| Zerotorescue@62 | 2026 | 
| Zerotorescue@62 | 2027 										"To start using Inventorium write |cfffed000/im|r in your chat. This will show a list of all available commands; |cfffed000/im config|r, |cfffed000summary|r and some others. Tip: Most of these commands have short alternatives, such as |cfffed000c|r for |cfffed000config|r and |cfffed000s|r for |cfffed000summary|r.\n\n" .. | 
| Zerotorescue@62 | 2028 | 
| Zerotorescue@62 | 2029 										"Write |cfffed000/im c|r to open the config window to start configuring your groups. The first tab you will find opened is the |cfffed000General|r config. Go ahead and select your prefered item count, crafting and pricing addons. Scroll down and quickly take note of all other options there, you won't really need everything (yet) but knowing it is available will save you from searching later on.\n\n" .. | 
| Zerotorescue@62 | 2030 | 
| Zerotorescue@62 | 2031 										"Click on the |cfffed000Groups|r tab. Here you will see a view handy options, in the future you might be able to find complete groups to import at popular blogs or forums making Inventorium very easy to import and initially setup, but for now we will have to make one manually. Quickly think about an easy-to-use and handy naming pattern and enter a name for your new group (e.g. |cfffed000Glyphs (Hunter)|r) and hit enter (leave the group type to the default). This group will be created and added to the list under the groups tab. Open the config for this group by clicking the group name.\n\n" .. | 
| Zerotorescue@62 | 2032 | 
| Zerotorescue@62 | 2033 										"You are now seeing a copy of the general config with override boxes next to everything. Configure this as you wish, for example override the |cfffed000minimum global stock|r to 20, |cfffed000track at|r to your banker and crafter (ensure your current char is also included) and the |cfffed000price threshold|r to 5g or so. Once done go to the \"add items\" tab to add items to this group so this group manages them. Again observice the available functionality so you know what you can do. Based on our previous example of Hunter glyphs we have three possibilities: one is to get all Hunter glyphs in our bags and add these, the second is to open the profession window and include everything above or equal to an item level of 0 and the third and in this case best possibility is to add items from a premade group. Select |cfffed000Glyphs (Hunter)|r from the |cfffed000premade groups|r select box to import all Hunter glyphs into this group. After doing so you can close the config window to check the results. Write |cfffed000/im s|r to view the summary window.\n\n" .. | 
| Zerotorescue@62 | 2034 | 
| Zerotorescue@62 | 2035 										"You can now copy this group and repeat the same steps to add all other groups you require. Think of things like one group per class for glyphs, one group per color for gems, one group per type of scroll (e.g. Heirloom, Twinks and Popular), one group for craftable epics, one group for flasks, one group for inks, one for parchments, etc.", | 
| Zerotorescue@62 | 2036 							}, | 
| Zerotorescue@62 | 2037 						}, | 
| Zerotorescue@62 | 2038 					}, | 
| Zerotorescue@62 | 2039 					VirtualGroups = { | 
| Zerotorescue@62 | 2040 						order = 6, | 
| Zerotorescue@62 | 2041 						type = "group", | 
| Zerotorescue@62 | 2042 						inline = true, | 
| Zerotorescue@62 | 2043 						name = "Virtual groups", | 
| Zerotorescue@62 | 2044 						args = { | 
| Zerotorescue@62 | 2045 							description = { | 
| Zerotorescue@62 | 2046 								order = 0, | 
| Zerotorescue@62 | 2047 								type = "description", | 
| Zerotorescue@62 | 2048 								name = "|cffccccccThis is advanced optional functionality. I recommend skipping this paragraph if you are new to Inventorium.|r\n\n" .. | 
| Zerotorescue@62 | 2049 | 
| Zerotorescue@62 | 2050 										"To allow changing the settings of multiple groups at once you can make virtual groups. These groups are basically like the general tab as their values are used when you aren't overriding a setting in a more specific group. After making a virtual group you still have to select it in all the \"child\"-groups so these groups know where to look for their settings when they are empty. Going back to our |cfffed000Glyphs (Hunter)|r group, we could make a virtual group called |cfffed000Glyphs|r which contained info like a default price threshold of 5g and a minimum crafting queue for all glyph groups. In each specific group you can then further specify that you would - for example - want 20 Hunter glyphs but 40 Druid glyphs as these might just sell a lot more often.", | 
| Zerotorescue@62 | 2051 							}, | 
| Zerotorescue@62 | 2052 						}, | 
| Zerotorescue@62 | 2053 					}, | 
| Zerotorescue@62 | 2054 				}, | 
| Zerotorescue@62 | 2055 			}, | 
| Zerotorescue@62 | 2056 			FAQ = { | 
| Zerotorescue@62 | 2057 				order = 3, | 
| Zerotorescue@62 | 2058 				type = "group", | 
| Zerotorescue@62 | 2059 				name = "FAQ", | 
| Zerotorescue@62 | 2060 				args = { | 
| Zerotorescue@62 | 2061 					description = { | 
| Zerotorescue@62 | 2062 						order = 0, | 
| Zerotorescue@62 | 2063 						type = "description", | 
| Zerotorescue@62 | 2064 						name = "|cfffed000My groups don't appear in the summary window.|r\nPlease ensure your current character is toggled on at the \"track at\" option beneath the \"minimum stock\" category within a group or the defaults.\n\n" .. | 
| Zerotorescue@62 | 2065 								"|cfffed000The auction value collumn always shows a \"-\".|r\nThe auction value will not be cached when you set the \"price threshold\" beneath the \"replenishing stock\" category to |cfffed0000c|r. You can change this behavior by adjusting this value or toggling the \"Always show auction value\" option on.\n\n" .. | 
| Zerotorescue@131 | 2066 								"|cfffed000Some items appear in the \"unqueueable\" frame while I can find them in the profession.|r\nOld items from before Cataclysm (such as any old gems) may have been renamed and their crafting skill removed. This might have resulted in certain items having the same name as others but with different ids, for example for Smooth King's Amber (search that at Wowhead for more info). Remove both items with the same name and add the one in your profession window again and this should no longer occur.\n\n" .. | 
| Zerotorescue@62 | 2067 								"|cfffed000What relation does Inventorium have to ZeroAuctions or AuctionProfitMaster?|r\nNone. ZA/APM and IM are two completely seperate addons and do not interfere with eachother. At best you can use the auction pricing data displayed at the ZA/APM summary window as pricing source by selecting either addon as pricing addon, but neither IM nor ZA/APM will adjust any settings nor execute any other actions at one another. ZA/APM is an auction house addon. IM is a stock management addon. We are not related. We do not work together. We probably never will.\n\n" .. | 
| Zerotorescue@62 | 2068 								"|cfffed000What use do profiles have?|r\nBecause there is already the \"track at\" option, profiles may not be useful to anyone. Nevertheless someone might find a use for it in some way and thus it is left available. You can use it to test certain things for example without the risk of your main groups being destroyed (although this should never be an excuse not to back up your settings from time to time).\n\n" .. | 
| Zerotorescue@62 | 2069 								"|cfffed000Can you provide me with a sample scenario for virtual groups?|r\nNot really. If you are just getting to know Inventorium then I suggest leaving this functionality for the moment. It only makes things more complicated.\n\nAnyway, the simplest (and possibly most popular) setup to imagine are glyphs. There are over 300 glyphs available distributed over 10 classes. Glyphs for certain classes (such as the tribrids; Druids & Paladins) might sell a lot more often than those for others (such as pure DPS; Hunters, etc.).\n\nTo get an easily adjustable setup you can make one virtual group, called \"Glyphs\" and override all your prefered settings in there. After you are done, make a glyph-group for each class (such as \"Glyphs (Death Knight)\" etc.) and select \"Glyphs\" as virtual group for every one of them (you can easily insert item data to these class specific groups by selecting premade data).\n\nNow, to change the settings for all glyph groups you can just change the settings within the virtual \"Glyph\" group. To change the settings for one class in particular, such as Paladins because they sell more often than others, you can click this group and override the appropriate settings for just that group. There are many more possibilities for you to find out.\n\n" .. | 
| Zerotorescue@62 | 2070 								"", | 
| Zerotorescue@62 | 2071 					}, | 
| Zerotorescue@62 | 2072 				}, | 
| Zerotorescue@62 | 2073 			}, | 
| Zerotorescue@62 | 2074 		}, | 
| Zerotorescue@62 | 2075 	}; | 
| Zerotorescue@62 | 2076 end | 
| Zerotorescue@62 | 2077 | 
| Zerotorescue@62 | 2078 function mod:MakeGroupOptions() | 
| Zerotorescue@62 | 2079 	options.args.groups = { | 
| Zerotorescue@62 | 2080 		order = 1100, | 
| Zerotorescue@62 | 2081 		type = "group", | 
| Zerotorescue@62 | 2082 		name = "Groups", | 
| Zerotorescue@62 | 2083 		desc = "Change a group.", | 
| Zerotorescue@62 | 2084 		args = { | 
| Zerotorescue@62 | 2085 			create = { | 
| Zerotorescue@62 | 2086 				order = 10, | 
| Zerotorescue@62 | 2087 				type = "group", | 
| Zerotorescue@62 | 2088 				inline = true, | 
| Zerotorescue@62 | 2089 				name = "Create a brand new group", | 
| Zerotorescue@62 | 2090 				args = { | 
| Zerotorescue@62 | 2091 					name = { | 
| Zerotorescue@62 | 2092 						order = 10, | 
| Zerotorescue@62 | 2093 						type = "input", | 
| Zerotorescue@62 | 2094 						name = "Group name", | 
| Zerotorescue@62 | 2095 						desc = "The name of the group. You can also use item links as you wish.", | 
| Zerotorescue@62 | 2096 						validate = ValidateGroupName, | 
| Zerotorescue@62 | 2097 						set = function(_, value) | 
| Zerotorescue@62 | 2098 							addon.db.profile.groups[value] = {}; | 
| Zerotorescue@62 | 2099 							if currentGroupType == "Virtual" then | 
| Zerotorescue@62 | 2100 								addon.db.profile.groups[value].isVirtual = true; | 
| Zerotorescue@62 | 2101 							end | 
| Zerotorescue@62 | 2102 | 
| Zerotorescue@62 | 2103 							mod:FillGroupOptions(); | 
| Zerotorescue@62 | 2104 						end, | 
| Zerotorescue@62 | 2105 						get = false, | 
| Zerotorescue@62 | 2106 						width = "double", | 
| Zerotorescue@62 | 2107 					}, | 
| Zerotorescue@62 | 2108 					type = { | 
| Zerotorescue@62 | 2109 						order = 20, | 
| Zerotorescue@62 | 2110 						type = "select", | 
| Zerotorescue@62 | 2111 						name = "Type (advanced)", | 
| Zerotorescue@62 | 2112 						desc = "The type of the new group. This can not be changed at a later time.\n\n|cffff9933This is an advanced option, you will probably not need it unless you manage a lot of groups.|r\n\n|cfffed000Normal|r: A normal group with complete functionality.\n\n|cfffed000Virtual|r: A virtual group which you can use to override the defaults for a set of groups. You can not add items to virtual groups.", | 
| Zerotorescue@62 | 2113 						values = { | 
| Zerotorescue@62 | 2114 							["Normal"] = "Normal", | 
| Zerotorescue@62 | 2115 							["Virtual"] = "Virtual", | 
| Zerotorescue@62 | 2116 						}, | 
| Zerotorescue@62 | 2117 						set = function(_, value) currentGroupType = value; end, | 
| Zerotorescue@62 | 2118 						get = function() return currentGroupType; end, | 
| Zerotorescue@62 | 2119 					}, | 
| Zerotorescue@62 | 2120 				}, | 
| Zerotorescue@62 | 2121 			}, | 
| Zerotorescue@62 | 2122 			import = { | 
| Zerotorescue@62 | 2123 				order = 20, | 
| Zerotorescue@62 | 2124 				type = "group", | 
| Zerotorescue@62 | 2125 				inline = true, | 
| Zerotorescue@62 | 2126 				name = "Import a group", | 
| Zerotorescue@62 | 2127 				args = { | 
| Zerotorescue@62 | 2128 					input = { | 
| Zerotorescue@62 | 2129 						order = 10, | 
| Zerotorescue@62 | 2130 						type = "input", | 
| Zerotorescue@62 | 2131 						multiline = true, | 
| Zerotorescue@62 | 2132 						name = "Group data", | 
| Zerotorescue@62 | 2133 						desc = "Paste the group data as provided by a group export. If you are trying to import multiple groups at the same time, make sure to use newlines to seperate them.", | 
| Zerotorescue@62 | 2134 						set = function(info, value) | 
| Zerotorescue@62 | 2135 							local data = { string.split("\n", value or "") }; | 
| Zerotorescue@62 | 2136 | 
| Zerotorescue@62 | 2137 							for _, current in pairs(data) do | 
| Zerotorescue@152 | 2138 								if current and string.trim(current) ~= "" then | 
| Zerotorescue@152 | 2139 									if not AceSerializer then | 
| Zerotorescue@152 | 2140 										AceSerializer = LibStub("AceSerializer-3.0"); | 
| Zerotorescue@152 | 2141 									end | 
| Zerotorescue@62 | 2142 | 
| Zerotorescue@152 | 2143 									local result, temp = AceSerializer:Deserialize(current); | 
| Zerotorescue@152 | 2144 | 
| Zerotorescue@152 | 2145 									if not temp.name then | 
| Zerotorescue@152 | 2146 										addon:Print("The provided data is not supported.", addon.Colors.Red); | 
| Zerotorescue@152 | 2147 									elseif ValidateGroupName(nil, temp.name) ~= true then | 
| Zerotorescue@152 | 2148 										addon:Print(("Aborting: A group named \"%s\" already exists."):format(temp.name), addon.Colors.Red); | 
| Zerotorescue@152 | 2149 									else | 
| Zerotorescue@152 | 2150 										local name = temp.name; | 
| Zerotorescue@152 | 2151 										temp.name = nil; | 
| Zerotorescue@152 | 2152 										addon:Print(("Importing %s..."):format(name)); | 
| Zerotorescue@152 | 2153 | 
| Zerotorescue@152 | 2154 										if temp.items then | 
| Zerotorescue@152 | 2155 											-- Remove items that are already in another group | 
| Zerotorescue@152 | 2156 											for value, count in pairs(temp.items) do | 
| Zerotorescue@152 | 2157 												local itemId = tonumber(value); | 
| Zerotorescue@152 | 2158 | 
| Zerotorescue@152 | 2159 												local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@152 | 2160 | 
| Zerotorescue@152 | 2161 												if not itemId then | 
| Zerotorescue@152 | 2162 													addon:Print(("\"%s\" is not a number."):format(value), addon.Colors.Red); | 
| Zerotorescue@152 | 2163 													temp.items[value] = nil; | 
| Zerotorescue@152 | 2164 												elseif itemData:InGroup() then | 
| Zerotorescue@152 | 2165 													addon:Print(("Skipping %s as it is already in the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() ), addon.Colors.Red); | 
| Zerotorescue@152 | 2166 													temp.items[value] = nil; | 
| Zerotorescue@152 | 2167 												else | 
| Zerotorescue@152 | 2168 													-- Ensure the keys are numeric | 
| Zerotorescue@152 | 2169 													temp.items[value] = nil; | 
| Zerotorescue@152 | 2170 													temp.items[itemId] = tonumber(count) or 0; | 
| Zerotorescue@152 | 2171 												end | 
| Zerotorescue@62 | 2172 											end | 
| Zerotorescue@62 | 2173 										end | 
| Zerotorescue@152 | 2174 | 
| Zerotorescue@152 | 2175 										-- Ensure this data isn't received (this would be silly/buggy as exports from other accounts - with different characters - won't know what to do with this) | 
| Zerotorescue@152 | 2176 										temp.trackAtCharacters = nil; | 
| Zerotorescue@152 | 2177 										temp.overrideTrackAtCharacters = nil; | 
| Zerotorescue@152 | 2178 | 
| Zerotorescue@152 | 2179 										addon.db.profile.groups[name] = temp; | 
| Zerotorescue@62 | 2180 									end | 
| Zerotorescue@62 | 2181 								end | 
| Zerotorescue@62 | 2182 							end | 
| Zerotorescue@62 | 2183 | 
| Zerotorescue@62 | 2184 							self:FillGroupOptions(); | 
| Zerotorescue@62 | 2185 						end, | 
| Zerotorescue@62 | 2186 						get = false, | 
| Zerotorescue@62 | 2187 						width = "full", | 
| Zerotorescue@62 | 2188 					}, | 
| Zerotorescue@62 | 2189 				}, | 
| Zerotorescue@62 | 2190 			}, | 
| Zerotorescue@62 | 2191 		}, | 
| Zerotorescue@62 | 2192 	}; | 
| Zerotorescue@62 | 2193 end | 
| Zerotorescue@62 | 2194 | 
| Zerotorescue@62 | 2195 function mod:FillGroupOptions() | 
| Zerotorescue@62 | 2196 	for id, name in pairs(groupIdToName) do | 
| Zerotorescue@62 | 2197 		if type(name) == "string" and not addon.db.profile.groups[name] then | 
| Zerotorescue@62 | 2198 			options.args.groups.args[id] = nil; | 
| Zerotorescue@62 | 2199 			groupIdToName[id] = nil; | 
| Zerotorescue@62 | 2200 			groupIdToName[name] = nil; | 
| Zerotorescue@62 | 2201 			groupIsVirtual[id] = nil; | 
| Zerotorescue@62 | 2202 		end | 
| Zerotorescue@62 | 2203 	end | 
| Zerotorescue@62 | 2204 | 
| Zerotorescue@62 | 2205 	for name, values in pairs(addon.db.profile.groups) do | 
| Zerotorescue@62 | 2206 		if not groupIdToName[name] then | 
| Zerotorescue@62 | 2207 			options.args.groups.args[tostring(count)] = defaultGroup; | 
| Zerotorescue@62 | 2208 | 
| Zerotorescue@62 | 2209 			groupIdToName[tostring(count)] = name; | 
| Zerotorescue@62 | 2210 			groupIdToName[name] = true; | 
| Zerotorescue@62 | 2211 			if values.isVirtual then | 
| Zerotorescue@62 | 2212 				groupIsVirtual[tostring(count)] = true; | 
| Zerotorescue@62 | 2213 			end | 
| Zerotorescue@62 | 2214 | 
| Zerotorescue@62 | 2215 			count = ( count + 1 ); | 
| Zerotorescue@62 | 2216 		end | 
| Zerotorescue@62 | 2217 	end | 
| Zerotorescue@62 | 2218 end | 
| Zerotorescue@65 | 2219 | 
| Zerotorescue@65 | 2220 | 
| Zerotorescue@65 | 2221 | 
| Zerotorescue@65 | 2222 | 
| Zerotorescue@65 | 2223 | 
| Zerotorescue@65 | 2224 | 
| Zerotorescue@65 | 2225 -- Verify premade groups | 
| Zerotorescue@65 | 2226 | 
| Zerotorescue@65 | 2227 function mod:PremadeGroupsCheck(updateGroupName, updateKey, accept) | 
| Zerotorescue@65 | 2228 	-- Compare the current premade groups with those used, notify about changes | 
| Zerotorescue@65 | 2229 	if addon.defaultGroups then | 
| Zerotorescue@65 | 2230 		for premadeGroupName, groupInfo in pairs(addon.defaultGroups) do | 
| Zerotorescue@65 | 2231 			-- Go through all default groups | 
| Zerotorescue@65 | 2232 | 
| Zerotorescue@65 | 2233 			for groupName, values in pairs(addon.db.profile.groups) do | 
| Zerotorescue@65 | 2234 				-- Go through all groups to find those with this premade group | 
| Zerotorescue@65 | 2235 | 
| Zerotorescue@65 | 2236 				if values.premadeGroups and values.premadeGroups[premadeGroupName] and values.premadeGroups[premadeGroupName] < groupInfo.version then | 
| Zerotorescue@65 | 2237 					-- Outdated group | 
| Zerotorescue@65 | 2238 | 
| Zerotorescue@65 | 2239 					if updateGroupName and updateKey then | 
| Zerotorescue@65 | 2240 						-- This function was called after pressing yes or no in a confirm box | 
| Zerotorescue@65 | 2241 | 
| Zerotorescue@65 | 2242 						if accept then | 
| Zerotorescue@65 | 2243 							-- Yes was clicked | 
| Zerotorescue@65 | 2244 | 
| Zerotorescue@65 | 2245 							for itemId, version in pairs(groupInfo.items) do | 
| Zerotorescue@65 | 2246 								-- Go through all items in this premade group | 
| Zerotorescue@65 | 2247 | 
| Zerotorescue@76 | 2248 								local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@76 | 2249 | 
| Zerotorescue@65 | 2250 								if version > values.premadeGroups[premadeGroupName] then | 
| Zerotorescue@65 | 2251 									-- This item was added in a more recent version than this group: Add item | 
| Zerotorescue@65 | 2252 | 
| Zerotorescue@76 | 2253 									if itemData:InGroup() then | 
| Zerotorescue@98 | 2254 										addon:Print(("Skipping %s as it is already in the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() )); | 
| Zerotorescue@76 | 2255 									elseif itemData:AddToGroup(groupName) then | 
| Zerotorescue@98 | 2256 										addon:Print(("Added %s found in the premade group |cfffed000%s|r to the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), premadeGroupName, itemData:InGroup() ), addon.Colors.Green); | 
| Zerotorescue@65 | 2257 									end | 
| Zerotorescue@65 | 2258 								elseif ( version * -1 ) > values.premadeGroups[premadeGroupName] then | 
| Zerotorescue@76 | 2259 									if itemData:InGroup() == groupName then | 
| Zerotorescue@76 | 2260 										itemData:RemoveFromGroup(groupName); | 
| Zerotorescue@76 | 2261 | 
| Zerotorescue@98 | 2262 										addon:Print(("Removed %s from the group |cfffed000%s|r as it was removed from the premade group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup(), premadeGroupName ), addon.Colors.Red); | 
| Zerotorescue@65 | 2263 									else | 
| Zerotorescue@98 | 2264 										addon:Print(("Skipping the removal of %s as it isn't in the group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() )); | 
| Zerotorescue@65 | 2265 									end | 
| Zerotorescue@65 | 2266 								end | 
| Zerotorescue@65 | 2267 							end | 
| Zerotorescue@65 | 2268 | 
| Zerotorescue@76 | 2269 							if AceConfigRegistry then | 
| Zerotorescue@76 | 2270 								-- Now rebuild the list | 
| Zerotorescue@76 | 2271 								AceConfigRegistry:NotifyChange("InventoriumOptions"); | 
| Zerotorescue@76 | 2272 							end | 
| Zerotorescue@76 | 2273 | 
| Zerotorescue@65 | 2274 							-- Remember the new version | 
| Zerotorescue@65 | 2275 							values.premadeGroups[premadeGroupName] = groupInfo.version; | 
| Zerotorescue@65 | 2276 						else | 
| Zerotorescue@65 | 2277 							-- No was clicked | 
| Zerotorescue@65 | 2278 | 
| Zerotorescue@65 | 2279 							-- Let user know what was not added | 
| Zerotorescue@65 | 2280 							for itemId, version in pairs(groupInfo.items) do | 
| Zerotorescue@65 | 2281 								-- Go through all items in this premade group | 
| Zerotorescue@65 | 2282 | 
| Zerotorescue@76 | 2283 								local itemData = addon.ItemData:New(itemId); | 
| Zerotorescue@76 | 2284 | 
| Zerotorescue@65 | 2285 								if version > values.premadeGroups[premadeGroupName] then | 
| Zerotorescue@65 | 2286 									-- This item was added in a more recent version than this group: don't add (since we clicked no), but announce it | 
| Zerotorescue@65 | 2287 | 
| Zerotorescue@98 | 2288 									addon:Print(("Skipping %s found in the premade group |cfffed000%s|r."):format( (itemData.link or unknownItemName:format(itemId)), itemData:InGroup() )); | 
| Zerotorescue@65 | 2289 								end | 
| Zerotorescue@65 | 2290 							end | 
| Zerotorescue@65 | 2291 | 
| Zerotorescue@65 | 2292 							-- Remember the new version | 
| Zerotorescue@65 | 2293 							values.premadeGroups[premadeGroupName] = groupInfo.version; | 
| Zerotorescue@65 | 2294 						end | 
| Zerotorescue@65 | 2295 					else | 
| Zerotorescue@65 | 2296 						StaticPopupDialogs["InventoriumConfirmUpdatePremadeGroup"] = { | 
| Zerotorescue@65 | 2297 							text = "The premade group |cfffed000%s|r used in the group |cfffed000%s|r has been changed. Do you wish to copy these changes?", | 
| Zerotorescue@65 | 2298 							button1 = YES, | 
| Zerotorescue@65 | 2299 							button2 = NO, | 
| Zerotorescue@65 | 2300 							OnAccept = function() | 
| Zerotorescue@131 | 2301 								mod:PremadeGroupsCheck(groupName, premadeGroupName, true); | 
| Zerotorescue@65 | 2302 							end, | 
| Zerotorescue@65 | 2303 							OnCancel = function(_, _, reason) | 
| Zerotorescue@65 | 2304 								if reason == "clicked" then | 
| Zerotorescue@131 | 2305 									mod:PremadeGroupsCheck(groupName, premadeGroupName, false); | 
| Zerotorescue@65 | 2306 								end | 
| Zerotorescue@65 | 2307 							end, | 
| Zerotorescue@65 | 2308 							timeout = 0, | 
| Zerotorescue@65 | 2309 							whileDead = 1, | 
| Zerotorescue@65 | 2310 							hideOnEscape = 1, | 
| Zerotorescue@65 | 2311 						}; | 
| Zerotorescue@65 | 2312 						StaticPopup_Show("InventoriumConfirmUpdatePremadeGroup", premadeGroupName, groupName); | 
| Zerotorescue@65 | 2313 | 
| Zerotorescue@65 | 2314 						return; | 
| Zerotorescue@65 | 2315 					end | 
| Zerotorescue@65 | 2316 				end | 
| Zerotorescue@65 | 2317 			end | 
| Zerotorescue@65 | 2318 		end | 
| Zerotorescue@65 | 2319 	end | 
| Zerotorescue@65 | 2320 end |