vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Enchantrix Addon for World of Warcraft(tm).
        Version: 3.6.1 (Platypus)
        Revision: $Id: EnxCommand.lua 944 2006-07-11 03:31:50Z mentalpower $

        Slash command and GUI functions.

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GLP.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
]]

-- Global functions
local addonLoaded                               -- Enchantrix.Command.AddonLoaded()
local auctioneerLoaded                  -- Enchantrix.Command.AuctioneerLoaded()
local handleCommand                             -- Enchantrix.Command.HandleCommand()
local register                                  -- Enchantrix.Command.Register()
local resetKhaos                                -- Enchantrix.Command.ResetKhaos()
local setKhaosSetKeyValue               -- Enchantrix.Command.SetKhaosSetKeyValue()
local setKhaosSetKeyParameter   -- Enchantrix.Command.SetKhaosSetKeyParameter()

-- Local functions
local getKhaosLocaleList
local getKhaosLoadList
local registerKhaos
local registerAuctioneerOptions
local chatPrintHelp
local onOff
local clear
local default
local genVarSet
local percentLessFilter
local bidBrokerFilter
local profitComparisonSort
local bidBrokerSort
local doBidBroker
local doPercentLess
local getAuctionItemDisenchants

-- GUI Init Variables (Added by MentalPower)
Enchantrix.State.GUI_Registered = nil
Enchantrix.State.Khaos_Registered = nil

-- Local variables
local optionSet
local profitMargins

-- Local constants
local MAX_BUYOUT_PRICE = 800000;
local MIN_PROFIT_MARGIN = 1000;
local MIN_PERCENT_LESS_THAN_HSP = 20; -- 20% default
local MIN_PROFIT_PRICE_PERCENT = 10; -- 10% default

function addonLoaded()
        if IsAddOnLoaded("Khaos") then
                registerKhaos()
        end
end

function getKhaosLocaleList()
        local options = { [_ENCH('CmdDefault')] = 'default' };
        for locale, data in EnchantrixLocalizations do
                options[locale] = locale;
        end
        return options
end

function getKhaosLoadList()
        return {
                [_ENCH('GuiLoad_Always')] = 'always',
                [_ENCH('GuiLoad_Never')] = 'never',
        }
end

function registerKhaos()
        optionSet = {
                id="Enchantrix";
                text="Enchantrix";
                helptext=function()
                        return _ENCH('GuiMainHelp');
                end;
                difficulty=1;
                default={checked=true};
                options={
                        {
                                id="Header";
                                text="Enchantrix";
                                helptext=function()
                                        return _ENCH('GuiMainHelp')
                                end;
                                type=K_HEADER;
                                difficulty=1;
                        };
                        {
                                id="all";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiMainEnable')
                                end;
                                helptext=function()
                                        return _ENCH('HelpOnoff')
                                end;
                                callback=function(state)
                                        if (state.checked) then
                                                onOff('on');
                                        else
                                                onOff('off');
                                        end
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return _ENCH('StatOn');
                                        else
                                                return _ENCH('StatOff');
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('all')};
                                disabled={checked=false};
                                difficulty=1;
                        };
                        {
                                id="barker";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiBarker') -- "Enable Barker"
                                end;
                                helptext=function()
                                        return _ENCH('HelpBarker') -- "Turn Enchantrix Barker on or off"
                                end;
                                callback=function(state)
                                        genVarSet('barker', state.checked)
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return _ENCH('BarkerOn')
                                        else
                                                return _ENCH('BarkerOff')
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('barker')};
                                disabled={checked=false};
                                difficulty=1;
                        };
                        {
                                id="locale";
                                type=K_PULLDOWN;
                                setup = {
                                        options = getKhaosLocaleList;
                                        multiSelect = false;
                                };
                                text=function()
                                        return _ENCH('GuiLocale')
                                end;
                                helptext=function()
                                        return _ENCH('HelpLocale')
                                end;
                                callback = function(state)
                                end;
                                feedback = function (state)
                                        Enchantrix.Config.SetLocale(state.value);
                                        return string.format(_ENCH('FrmtActSet'), _ENCH('CmdLocale'), state.value);
                                end;
                                default = {
                                        value = Enchantrix.Config.GetLocale();
                                };
                                disabled = {
                                        value = Enchantrix.Config.GetLocale();
                                };
                                dependencies={all={checked=true;}};
                                difficulty=2;
                        };
                        {
                                id="LoadSettings";
                                type=K_PULLDOWN;
                                setup = {
                                        options = getKhaosLoadList;
                                        multiSelect = false;
                                };
                                text=function()
                                        return _ENCH('GuiLoad')
                                end;
                                helptext=function()
                                        return _ENCH('HelpLoad')
                                end;
                                callback=function(state) end;
                                feedback=function(state)
                                        handleCommand("load " .. state.value, "GUI");
                                end;
                                default={value = 'always'};
                                disabled={value = 'never'};
                                difficulty=1;
                        };
                        {
                                id="embed";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiEmbed')
                                end;
                                helptext=function()
                                        return _ENCH('HelpEmbed')
                                end;
                                callback=function(state)
                                        genVarSet('embed', state.checked);
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowEmbed')));
                                        else
                                                return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowEmbed')));
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('embed')};
                                disabled={checked=false};
                                dependencies={all={checked=true;}};
                                difficulty=1;
                        };
                        {
                                id="terse";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiTerse')
                                end;
                                helptext=function()
                                        return _ENCH('HelpTerse')
                                end;
                                callback=function(state)
                                        genVarSet('terse', state.checked);
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowTerse')));
                                        else
                                                return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowTerse')));
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('terse')};
                                disabled={checked=false};
                                dependencies={all={checked=true;}};
                                difficulty=2;
                        };
                        {
                                id="counts";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiCount')
                                end;
                                helptext=function()
                                        return _ENCH('HelpCount')
                                end;
                                callback=function(state)
                                        genVarSet('counts', state.checked);
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowCount')));
                                        else
                                                return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowCount')));
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('counts')};
                                disabled={checked=false};
                                dependencies={all={checked=true;}};
                                difficulty=3;
                        };
                        {
                                id="EnchantrixValuateHeader";
                                type=K_HEADER;
                                text=function()
                                        return _ENCH('GuiValuateHeader')
                                end;
                                helptext=function()
                                        return _ENCH('HelpValue')
                                end;
                                difficulty=2;
                        };
                        {
                                id="valuate";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiValuateEnable')
                                end;
                                helptext=function()
                                        return _ENCH('HelpValue').."\n".._ENCH('HelpGuessNoauctioneer')
                                end;
                                callback=function(state)
                                        genVarSet('valuate', state.checked);
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowValue')));
                                        else
                                                return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowValue')));
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('valuate')};
                                disabled={checked=false};
                                dependencies={all={checked=true;}};
                                difficulty=1;
                        };
                        {
                                id="valuate-baseline";
                                type=K_TEXT;
                                text=function()
                                        return _ENCH('GuiValuateBaseline')
                                end;
                                helptext=function()
                                        return _ENCH('HelpGuessBaseline')
                                end;
                                callback=function(state)
                                        genVarSet('valuate-baseline', state.checked);
                                end;
                                feedback=function(state)
                                        if (state.checked) then
                                                return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowGuessBaseline')));
                                        else
                                                return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowGuessBaseline')));
                                        end
                                end;
                                check=true;
                                default={checked=Enchantrix.Config.GetFilterDefaults('valuate-baseline')};
                                disabled={checked=false};
                                dependencies={valuate={checked=true;}, all={checked=true;}};
                                difficulty=2;
                        };
                        {
                                id="EnchantrixOtherHeader";
                                type=K_HEADER;
                                text=function()
                                        return _ENCH('GuiOtherHeader')
                                end;
                                helptext=function()
                                        return _ENCH('GuiOtherHelp')
                                end;
                                difficulty=1;
                        };
                        {
                                id="EnchantrixClearAll";
                                type=K_BUTTON;
                                setup={
                                        buttonText = function()
                                                return _ENCH('GuiClearallButton')
                                        end;
                                };
                                text=function()
                                        return _ENCH('GuiClearall')
                                end;
                                helptext=function()
                                        return _ENCH('GuiClearallHelp')
                                end;
                                callback=function()
                                        clear(_ENCH('CmdClearAll'));
                                end;
                                feedback=function()
                                        return string.format(_ENCH('FrmtActClearall'),  _ENCH('GuiClearallNote'));
                                end;
                                dependencies={all={checked=true;}};
                                difficulty=3;
                        };
                        {
                                id="DefaultAll";
                                type=K_BUTTON;
                                setup={
                                        buttonText = function()
                                                return _ENCH('GuiDefaultAllButton')
                                        end;
                                };
                                text=function()
                                        return _ENCH('GuiDefaultAll')
                                end;
                                helptext=function()
                                        return _ENCH('GuiDefaultAllHelp')
                                end;
                                callback=function()
                                        default(_ENCH('CmdClearAll'));
                                end;
                                feedback=function()
                                        return _ENCH('FrmtActDefaultAll');
                                end;
                                dependencies={all={checked=true;}};
                                difficulty=1;
                        };
                        {
                                id="printframe";
                                type=K_PULLDOWN;
                                setup = {
                                        options = Enchantrix.Config.GetFrameNames;
                                        multiSelect = false;
                                };
                                text=function()
                                        return _ENCH('GuiPrintin')
                                end;
                                helptext=function()
                                        return _ENCH('HelpPrintin')
                                end;
                                callback=function(state)
                                        Enchantrix.Config.SetFrame(state.value);
                                end;
                                feedback=function(state)
                                        local _, frameName = Enchantrix.Config.GetFrameNames(state.value)
                                        return string.format(_ENCH('FrmtPrintin'), frameName);
                                end;
                                default = {
                                        value=Enchantrix.Config.GetFrameIndex();
                                };
                                disabled = {
                                        value=Enchantrix.Config.GetFrameIndex();
                                };
                                dependencies={all={checked=true;}};
                                difficulty=3;
                        };
                        {
                                id="DefaultOption";
                                type=K_EDITBOX;
                                setup = {
                                        callOn = {"tab", "escape", "enter"};
                                };
                                text=function()
                                        return _ENCH('GuiDefaultOption')
                                end;
                                helptext=function()
                                        return _ENCH('HelpDefault')
                                end;
                                callback = function(state)
                                        default(state.value);
                                end;
                                feedback = function (state)
                                        if (state.value == _ENCH('CmdClearAll')) then
                                                return _ENCH('FrmtActDefaultAll');
                                        else
                                                return string.format(_ENCH('FrmtActDefault'), state.value);
                                        end
                                end;
                                default = {
                                        value = "";
                                };
                                disabled = {
                                        value = "";
                                };
                                dependencies={all={checked=true;}};
                                difficulty=4;
                        };
                };
        };

        Khaos.registerOptionSet("tooltip",optionSet);
        Enchantrix.State.Khaos_Registered = true;
        Khaos.refresh();

        return true;
end

function registerAuctioneerOptions()
        local insertPos
        for key, value in ipairs(optionSet.options) do
                if value.id == "valuate" then
                        insertPos = key + 1
                end
        end

        if (optionSet.options[insertPos].id == 'valuate-hsp') then
                return
        end

        local AuctioneerOptions = {
                {
                        id="valuate-hsp";
                        type=K_TEXT;
                        text=function()
                                return _ENCH('GuiValuateAverages')
                        end;
                        helptext=function()
                                return _ENCH('HelpGuessAuctioneerHsp')
                        end;
                        callback=function(state)
                                genVarSet('valuate-hsp', state.checked);
                        end;
                        feedback=function(state)
                                if (state.checked) then
                                        return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowGuessAuctioneerHsp')));
                                else
                                        return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowGuessAuctioneerHsp')));
                                end
                        end;
                        check=true;
                        default={checked = Enchantrix.Config.GetFilterDefaults('valuate-hsp')};
                        disabled={checked = false};
                        dependencies={valuate={checked=true;}, all={checked=true;}};
                        difficulty=2;
                };
                {
                        id="valuate-median";
                        type=K_TEXT;
                        text=function()
                                return _ENCH('GuiValuateMedian')
                        end;
                        helptext=function()
                                return _ENCH('HelpGuessAuctioneerMedian')
                        end;
                        callback=function(state)
                                genVarSet('valuate-median', state.checked);
                        end;
                        feedback=function(state)
                                if (state.checked) then
                                        return (string.format(_ENCH('FrmtActEnable'), _ENCH('ShowGuessAuctioneerMed')));
                                else
                                        return (string.format(_ENCH('FrmtActDisable'), _ENCH('ShowGuessAuctioneerMed')));
                                end
                        end;
                        check=true;
                        default={checked = Enchantrix.Config.GetFilterDefaults('valuate-median')};
                        disabled={checked = false};
                        dependencies={valuate={checked=true;}, all={checked=true;}};
                        difficulty=2;
                };
        };

        optionSet.options[insertPos - 1].helptext = function() return _ENCH('HelpValue') end;

        for i, opt in ipairs(AuctioneerOptions) do
                tinsert(optionSet.options, insertPos + i - 1, opt);
        end

        Khaos.unregisterOptionSet("Enchantrix");
        Khaos.registerOptionSet("tooltip", optionSet);
        Khaos.refresh();
end

function auctioneerLoaded()
        Stubby.UnregisterAddOnHook("Auctioneer", "Enchantrix")

        -- Make sure we have a usable version of Auctioneer loaded (3.4 or higher)
        if Auctioneer and Auctioneer.Version then
                local ver = Enchantrix.Util.Split(Auctioneer.Version, ".")
                local major = tonumber(ver[1]) or 0
                local minor = tonumber(ver[2]) or 0
                if ver[3] == "DEV" then minor = minor + 1 end

                if major > 3 or (major >= 3 and minor >= 4) then
                        Enchantrix.State.Auctioneer_Loaded = true
                end
        end

        if not Enchantrix.State.Auctioneer_Loaded then
                -- Old version of Auctioneer
                if not EnchantConfig.displayedAuctioneerWarning then
                        -- Yell at the user, but only once
                        message(_ENCH('MesgAuctVersion'))
                        EnchantConfig.displayedAuctioneerWarning = true
                else
                        Enchantrix.Util.ChatPrint(_ENCH('MesgAuctVersion'))
                end
                return
        end
        EnchantConfig.displayedAuctioneerWarning = nil

        if Enchantrix.State.Khaos_Registered then
                registerAuctioneerOptions()
        end
end

function setKhaosSetKeyParameter(key, parameter, value)
        if (Enchantrix.State.Khaos_Registered) then
                if (Khaos.getSetKey("Enchantrix", key)) then
                        Khaos.setSetKeyParameter("Enchantrix", key, parameter, value)
                else
                        EnhTooltip.DebugPrint("setKhaosSetKeyParameter(): key " .. key .. " does not exist")
                end
        end
end

function setKhaosSetKeyValue(key, value)
        if (Enchantrix.State.Khaos_Registered) then
                local kKey = Khaos.getSetKey("Enchantrix", key)

                if (not kKey) then
                        EnhTooltip.DebugPrint("setKhaosSetKeyParameter(): key " .. key .. " does not exist")
                elseif (kKey.checked ~= nil) then
                        -- EnhTooltip.DebugPrint("setKhaosSetKeyParameter(): setting ", value, " for key ", key)
                        Khaos.setSetKeyParameter("Enchantrix", key, "checked", value)
                elseif (kKey.value ~= nil) then
                        Khaos.setSetKeyParameter("Enchantrix", key, "value", value)
                else
                        EnhTooltip.DebugPrint("setKhaosSetKeyParameter(): don't know how to update key ", key)
                end
        end
end

-- Cleaner Command Handling Functions (added by MentalPower)
function handleCommand(command, source)

        -- To print or not to print, that is the question...
        local chatprint = nil;
        if (source == "GUI") then
                chatprint = false;
        else
                chatprint = true;
        end;

        -- Divide the large command into smaller logical sections (Shameless copy from the original function)
        local i,j, cmd, param = string.find(command, "^([^ ]+) (.+)$")
        if (not cmd) then cmd = command end
        if (not cmd) then cmd = "" end
        if (not param) then param = "" end
        cmd = Enchantrix.Locale.DelocalizeCommand(cmd)

        if ((cmd == "") or (cmd == "help")) then
                -- /enchantrix help
                chatPrintHelp();
                return;

        elseif ((cmd == "on") or (cmd == "off") or (cmd == "toggle")) then
                -- /enchantrix on|off|toggle
                onOff(cmd, chatprint);

        elseif (cmd == 'disable') then
                -- /enchantrix disable
                Enchantrix.Util.ChatPrint(_ENCH('MesgDisable'));
                Stubby.SetConfig("Enchantrix", "LoadType", "never");

        elseif (cmd == 'load') then
                -- /enchantrix load always|never
                if (param == "always") or (param == "never") then
                        Stubby.SetConfig("Enchantrix", "LoadType", param);
                        if (chatprint) then
                                Enchantrix.Util.ChatPrint("Setting Enchantrix to "..param.." load for this toon");
                                setKhaosSetKeyValue("LoadSettings", param)
                        end
                end

        elseif (cmd == 'clear') then
                -- /enchantrix clear
                clear(param, chatprint);

        elseif (cmd == 'locale') then
                -- /enchantrix locale
                Enchantrix.Config.SetLocale(param, chatprint);

        elseif (cmd == 'default') then
                -- /enchantrix default
                default(param, chatprint);

        elseif (cmd == 'print-in') then
                -- /enchantrix print-in
                Enchantrix.Config.SetFrame(param, chatprint)

        elseif (cmd == 'bidbroker' or cmd == 'bb') then
                -- /enchantrix bidbroker
                doBidBroker(param);

        elseif (cmd == 'percentless' or cmd == 'pl') then
                doPercentLess(param);

        elseif (Enchantrix.Config.GetFilterDefaults(cmd) ~= nil) then
                genVarSet(cmd, param, chatprint);

        elseif (chatprint) then
                Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtActUnknown'), cmd));
        end
end

-- Help ME!! (The Handler) (Another shameless copy from the original function)
function chatPrintHelp()
        Enchantrix.Util.ChatPrint(_ENCH('FrmtUsage'));
        local onOffToggle = " (".._ENCH('CmdOn').."|".._ENCH('CmdOff').."|".._ENCH('CmdToggle')..")";
        local lineFormat = "  |cffffffff/enchantrix %s "..onOffToggle.."|r |cff2040ff[%s]|r - %s";

        Enchantrix.Util.ChatPrint("  |cffffffff/enchantrix "..onOffToggle.."|r |cff2040ff["..Enchantrix.Locale.GetLocalizedFilterVal('all').."]|r - " .. _ENCH('HelpOnoff'));

        Enchantrix.Util.ChatPrint("  |cffffffff/enchantrix ".._ENCH('CmdDisable').."|r - " .. _ENCH('HelpDisable'));

        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdBarker'), Enchantrix.Locale.GetLocalizedFilterVal('barker'), _ENCH('HelpBarker')));

        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowCount'), Enchantrix.Locale.GetLocalizedFilterVal('counts'), _ENCH('HelpCount')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowTerse'), Enchantrix.Locale.GetLocalizedFilterVal('terse'), _ENCH('HelpTerse')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowEmbed'), Enchantrix.Locale.GetLocalizedFilterVal('embed'), _ENCH('HelpEmbed')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowValue'), Enchantrix.Locale.GetLocalizedFilterVal('valuate'), _ENCH('HelpValue')));
        if Enchantrix.State.Auctioneer_Loaded then
                Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowGuessAuctioneerHsp'), Enchantrix.Locale.GetLocalizedFilterVal('valuate-hsp'), _ENCH('HelpGuessAuctioneerHsp')));
                Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowGuessAuctioneerMed'), Enchantrix.Locale.GetLocalizedFilterVal('valuate-median'), _ENCH('HelpGuessAuctioneerMedian')));
        else
                Enchantrix.Util.ChatPrint(_ENCH('HelpGuessNoauctioneer'));
        end
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('ShowGuessBaseline'), Enchantrix.Locale.GetLocalizedFilterVal('valuate-baseline'), _ENCH('HelpGuessBaseline')));

        lineFormat = "  |cffffffff/enchantrix %s %s|r - %s";
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdLocale'), _ENCH('OptLocale'), _ENCH('HelpLocale')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdClear'), _ENCH('OptClear'), _ENCH('HelpClear')));

        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdFindBidauct'), _ENCH('OptFindBidauct'), _ENCH('HelpFindBidauct')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdFindBuyauct'), _ENCH('OptFindBuyauct'), _ENCH('HelpFindBuyauct')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdDefault'), _ENCH('OptDefault'), _ENCH('HelpDefault')));
        Enchantrix.Util.ChatPrint(string.format(lineFormat, _ENCH('CmdPrintin'), _ENCH('OptPrintin'), _ENCH('HelpPrintin')));
end
--[[
        The onOff(state, chatprint) function handles the state of the Enchantrix AddOn (whether it is currently on or off)
        If "on" or "off" is specified in the "state" variable then Enchantrix's state is changed to that value,
        If "toggle" is specified then it will toggle Enchantrix's state (if currently on then it will be turned off and vice-versa)

        If a boolean (or nil) value is passed as the first argument the conversion is as follows:
        "true" is the same as "on"
        "false" is the same as "off"
        "nil" is the same as "toggle"

        If chatprint is "true" then the state will also be printed to the user.
]]
function onOff(state, chatprint)
        if (type(state) == "string") then
                state = Enchantrix.Locale.DelocalizeFilterVal(state)

        elseif (state == true) then
                state = 'on'

        elseif (state == false) then
                state = 'off'

        elseif (state == nil) then
                state = 'toggle'
        end

        if (state == 'on') or (state == 'off') then
                Enchantrix.Config.SetFilter('all', state);
        elseif (state == "toggle") then
                Enchantrix.Config.SetFilter('all', not Enchantrix.Config.GetFilter('all'))
        end

        -- Print the change and alert the GUI if the command came from slash commands. Do nothing if they came from the GUI.
        if (chatprint) then
                state = Enchantrix.Config.GetFilter('all')
                setKhaosSetKeyParameter('all', "checked", state);

                if (state) then
                        Enchantrix.Util.ChatPrint(_ENCH('StatOn'));

                else
                        Enchantrix.Util.ChatPrint(_ENCH('StatOff'));
                end
        end

        return state;
end

-- The following functions are almost verbatim copies of the original functions but modified in order to make them compatible with direct GUI access.
function clear(param, chatprint)
        if (param == _ENCH('CmdClearAll')) or (param == "all") then
                EnchantedLocal = {}
                if (chatprint) then
                        Enchantrix.Util.ChatPrint(_ENCH('FrmtActClearall'));
                end
        else
                for link in string.gfind(param, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%b[]|h|r") do
                        local sig = Enchantrix.Util.GetSigFromLink(link)
                        EnchantedLocal[sig] = nil

                        if (chatprint) then
                                Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtActClearOk'), link))
                        end
                end
        end
end

-- This function was added by MentalPower to implement the /enx default command
function default(param, chatprint)
        local paramLocalized

        if (param == nil) or (param == "") then
                return
        elseif (param == _ENCH('CmdClearAll')) or (param == "all") then
                param = "all"
                EnchantConfig.filters = {}
        else
                paramLocalized = param
                param = Enchantrix.Locale.DelocalizeCommand(param)
                Enchantrix.Config.SetFilter(param, nil)
        end

        if (chatprint) then
                if (param == "all") then
                        Enchantrix.Util.ChatPrint(_ENCH('FrmtActDefaultAll'));

                        for k,v in pairs(EnchantConfig.filters) do
                                setKhaosSetKeyValue(k, Enchantrix.Config.GetFilter(k));
                        end

                else
                        Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtActDefault'), paramLocalized));
                        setKhaosSetKeyValue(param, Enchantrix.Config.GetFilter(param));
                end
        end
end

function genVarSet(variable, param, chatprint)

        param = Enchantrix.Locale.DelocalizeFilterVal(param);

        if (param == 'on' or param == 'off' or param == true or param == false) then
                Enchantrix.Config.SetFilter(variable, param);

        elseif (param == 'toggle' or param == nil or param == "") then
                Enchantrix.Config.SetFilter(variable, not Enchantrix.Config.GetFilter(variable))
        end

        if (chatprint) then
                if (Enchantrix.Config.GetFilter(variable)) then
                        Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtActEnable'), Enchantrix.Locale.LocalizeCommand(variable)));
                        setKhaosSetKeyParameter(variable, "checked", true);

                else
                        Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtActDisable'), Enchantrix.Locale.LocalizeCommand(variable)));
                        setKhaosSetKeyParameter(variable, "checked", false);
                end
        end
end

---------------------------------------
--   Auctioneer dependant commands   --
---------------------------------------

function percentLessFilter(percentLess, signature)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local disenchantsTo = getAuctionItemDisenchants(signature, true);
        if not disenchantsTo.totals then return filterAuction; end

        local hspValue = disenchantsTo.totals.hspValue or 0;
        local medValue = disenchantsTo.totals.medValue or 0;
        local mktValue = disenchantsTo.totals.mktValue or 0;
        local confidence = disenchantsTo.totals.conf or 0;

        local myValue = confidence * (hspValue + medValue + mktValue) / 3;
        local margin = Auctioneer.Statistic.PercentLessThan(myValue, buyout/count);
        local profit = (myValue * count) - buyout;

        local results = {
                buyout = buyout,
                count = count,
                value = myValue,
                margin = margin,
                profit = profit,
                conf = confidence
        };
        if (buyout > 0) and (margin >= tonumber(percentLess)) and (profit >= MIN_PROFIT_MARGIN) then
                filterAuction = false;
                profitMargins[signature] = results;
        end

        return filterAuction;
end

function bidBrokerFilter(minProfit, signature)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local currentBid = Auctioneer.Statistic.GetCurrentBid(signature);
        local disenchantsTo = getAuctionItemDisenchants(signature, true);
        if not disenchantsTo.totals then return filterAuction; end

        local hspValue = disenchantsTo.totals.hspValue or 0;
        local medValue = disenchantsTo.totals.medValue or 0;
        local mktValue = disenchantsTo.totals.mktValue or 0;
        local confidence = disenchantsTo.totals.conf or 0;

        local myValue = confidence * (hspValue + medValue + mktValue) / 3;
        local margin = Auctioneer.Statistic.PercentLessThan(myValue, currentBid/count);
        local profit = (myValue * count) - currentBid;
        local profitPricePercent = math.floor((profit / currentBid) * 100);

        local results = {
                buyout = buyout,
                count = count,
                value = myValue,
                margin = margin,
                profit = profit,
                conf = confidence
        };
        if (currentBid <= MAX_BUYOUT_PRICE) and (profit >= tonumber(minProfit)) and (profit >= MIN_PROFIT_MARGIN) and (profitPricePercent >= MIN_PROFIT_PRICE_PERCENT) then
                filterAuction = false;
                profitMargins[signature] = results;
        end
        return filterAuction;
end

function profitComparisonSort(a, b)
        if (not a) or (not b) then return false; end
        local aSig = a.signature;
        local bSig = b.signature;
        if (not aSig) or (not bSig) then return false; end
        local aEpm = profitMargins[aSig];
        local bEpm = profitMargins[bSig];
        if (not aEpm) and (not bEpm) then return false; end
        local aProfit = aEpm.profit or 0;
        local bProfit = bEpm.profit or 0;
        local aMargin = aEpm.margin or 0;
        local bMargin = bEpm.margin or 0;
        local aValue  = aEpm.value or 0;
        local bValue  = bEpm.value or 0;
        if (aProfit > bProfit) then return true; end
        if (aProfit < bProfit) then return false; end
        if (aMargin > bMargin) then return true; end
        if (aMargin < bMargin) then return false; end
        if (aValue > bValue) then return true; end
        if (aValue < bValue) then return false; end
        return false;
end

function bidBrokerSort(a, b)
        if (not a) or (not b) then return false; end
        local aTime = a.timeLeft or 0;
        local bTime = b.timeLeft or 0;
        if (aTime > bTime) then return true; end
        if (aTime < bTime) then return false; end
        return profitComparisonSort(a, b);
end

function doPercentLess(percentLess)
        if not Auctioneer then
                Enchantrix.Util.ChatPrint("You do not have Auctioneer installed. Auctioneer must be installed to do an enchanting percentless scan");
                return;
        elseif not (Auctioneer.Filter or Auctioneer.Filter.QuerySnapshot) then
                Enchantrix.Util.ChatPrint("You do not have the correct version of Auctioneer installed, this feature requires Auctioneer v3.3.0.0675 or later");
                return;
        end

        if not percentLess or percentLess == "" then percentLess = MIN_PERCENT_LESS_THAN_HSP end
        local output = string.format(_ENCH('FrmtPctlessHeader'), percentLess);
        Enchantrix.Util.ChatPrint(output);

        Enchantrix.Storage.Price_Cache = {t=time()};
        profitMargins = {};
        local targetAuctions = Auctioneer.Filter.QuerySnapshot(percentLessFilter, percentLess);

        -- sort by profit based on median
        table.sort(targetAuctions, profitComparisonSort);

        -- output the list of auctions
        for _,a in targetAuctions do
                if (a.signature and profitMargins[a.signature]) then
                        local quality = EnhTooltip.QualityFromLink(a.itemLink);
                        if (quality and quality >= 2) then
                                local id,rprop,enchant, name, count,_,buyout,_ = Auctioneer.Core.GetItemSignature(a.signature);
                                local value = profitMargins[a.signature].value;
                                local margin = profitMargins[a.signature].margin;
                                local profit = profitMargins[a.signature].profit;
                                local output = string.format(_ENCH('FrmtPctlessLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, EnhTooltip.GetTextGSC(value * count), EnhTooltip.GetTextGSC(buyout), EnhTooltip.GetTextGSC(profit * count), Auctioneer.Util.ColorTextWhite(margin.."%"));
                                Enchantrix.Util.ChatPrint(output);
                        end
                end
        end

        Enchantrix.Util.ChatPrint(_ENCH('FrmtPctlessDone'));
end

function doBidBroker(minProfit)
        if not Auctioneer then
                Enchantrix.Util.ChatPrint("You do not have Auctioneer installed. Auctioneer must be installed to do an enchanting percentless scan");
                return;
        elseif not (Auctioneer.Filter and Auctioneer.Filter.QuerySnapshot) then
                Enchantrix.Util.ChatPrint("You do not have the correct version of Auctioneer installed, this feature requires Auctioneer v3.3.0.0675 or later");
                return;
        end

        if not minProfit or minProfit == "" then minProfit = MIN_PROFIT_MARGIN; else minProfit = tonumber(minProfit) * 100; end
        local output = string.format(_ENCH('FrmtBidbrokerHeader'), EnhTooltip.GetTextGSC(minProfit));
        Enchantrix.Util.ChatPrint(output);

        Enchantrix.Storage.Price_Cache = {t=time()};
        profitMargins = {};
        local targetAuctions = Auctioneer.Filter.QuerySnapshot(bidBrokerFilter, minProfit);

        -- sort by profit based on median
        table.sort(targetAuctions, bidBrokerSort);

        -- output the list of auctions
        for _,a in targetAuctions do
                if (a.signature and profitMargins[a.signature]) then
                        local quality = EnhTooltip.QualityFromLink(a.itemLink);
                        if (quality and quality >= 2) then
                                local id,rprop,enchant, name, count, min, buyout,_ = Auctioneer.Core.GetItemSignature(a.signature);
                                local currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);
                                local value = profitMargins[a.signature].value;
                                local margin = profitMargins[a.signature].margin;
                                local profit = profitMargins[a.signature].profit;
                                local bidText = _ENCH('FrmtBidbrokerCurbid');
                                if (currentBid == min) then
                                        bidText = _ENCH('FrmtBidbrokerMinbid');
                                end
                                local output = string.format(_ENCH('FrmtBidbrokerLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, EnhTooltip.GetTextGSC(value * count), bidText, EnhTooltip.GetTextGSC(currentBid), EnhTooltip.GetTextGSC(profit * count), Auctioneer.Util.ColorTextWhite(margin.."%"), Auctioneer.Util.ColorTextWhite(Auctioneer.Util.GetTimeLeftString(a.timeLeft)));
                                Enchantrix.Util.ChatPrint(output);
                        end
                end
        end

        Enchantrix.Util.ChatPrint(_ENCH('FrmtBidbrokerDone'));
end

function getAuctionItemDisenchants(auctionSignature, useCache)
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(auctionSignature);
        local sig = string.format("%d:%d:%d", id, enchant, rprop);
        return Enchantrix.Storage.GetItemDisenchants(sig, name, useCache);
end

Enchantrix.Command = {
        Revision                                        = "$Revision: 944 $",

        AddonLoaded                             = addonLoaded,
        AuctioneerLoaded                        = auctioneerLoaded,

        HandleCommand                   = handleCommand,

        Register                                        = register,
        SetKhaosSetKeyValue             = setKhaosSetKeyValue,
        SetKhaosSetKeyParameter = setKhaosSetKeyParameter,
        SetKhaosSetKeyValue             = setKhaosSetKeyValue,
}