Shop Wizard Beta Refresh

You'll never want to use it without the script after this

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Shop Wizard Beta Refresh
// @namespace    neopets
// @version      2020.01.16
// @description  You'll never want to use it without the script after this
// @author       Rippy
// @match        http://www.neopets.com/shops/wizard.phtml*
// @grant        none
// ==/UserScript==

/******************************************************************
 * Adapted from Rippy's script. Main changes:
 *
 * - You can now use the Shop Wizard when you're on a Faerie Quest.
 *
 * - Nicer styling
 *
 * - Original search form now remains on page upon a search.
 *    Useful for starting a new search immediately.
 *
 * - Auto toggle to "Identical to my phrase"
 *
 * - Minor fix for compatibility with diceroll's Search Helper.
 ******************************************************************/

// On regular SW, there is no server-side check for whether or not you're on a Faerie Quest.
if (!$(".wizard-faeriequest__2020").length) {
    // Hide the original form
    $("#shopWizardFormResults").hide();
}

// Replace it with our own
$("#pageDesc").html(`
<div id="userscriptSWResult" class="wizard-results__2020">
    <div class="wizard__2020">
        <div class="wizard-header">
            <div class="wizard-char wizard-char-img"></div>
            <h2>What are you looking for?</h2>
        </div>
        <div class="wizard-body">
            <div class="wizard-char-container">
                <div class="wizard-char wizard-char-img"></div>
            </div>

            <div>
                <input type="hidden" name="type" value="process_wizard">
                <input type="hidden" name="feedset" id="feedset" value="0">
                <div class="wizard-search">
                    <input type="text" id="shopwizard" value="" size="50" maxlength="60">
                    <button class="wizard-button-search button-default__2020 button-green__2020" id="submit_wizard">
                        <div class="button-search-white"></div>
                    </button>
                </div>
                <div class="wizard-filters">
                    <select id="criteria">
                        <option value="containing">Containing my phrase
                        </option>
                        <option value="exact">Identical to
                        </option>
                    </select>
                    <select name="wizard-area" id="wizard-area">
                        <option value="shop">In Shops</option>
                        <option value="gallery">In Galleries</option>
                    </select>
                </div>
                <div class="wizard-price">
                    <p class="wizard-price-text">Price:</p>
                    <input type="text" id="min_price" size="6" maxlength="6" value="0" placeholder="Min">
                    <div class="wizard-dash"></div>
                    <input type="text" id="max_price" size="6" maxlength="6" value="999999" placeholder="Max">
                </div>
            </div>
        </div>
    </div>
</div>
<div id="divRefresh" style="display:none;"><br><button id="refreshresults" style="margin: auto;" type="button" class="button-default__2020 button-green__2020 btn-single__2020 wizard-button__2020">Refresh Results</button></div>
<div id="bypassResults" class="wizard-results__2020"></div>
<br>
`);

// Initialise values, and search string if any
$("#criteria").val("exact");
if (location.search) {
    $("#shopwizard").val(
        (qs => {
            qs = qs.split("+").join(" ");
            let params = {}, tokens, re = /[?&]?([^=]+)=([^&]*)/g;
            while (tokens = re.exec(qs)) {
                params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
            }
            return params;
        })(location.search)["string"]
    );
}
$("h1:contains('Shop Wizard')").html("Cheat Shop Wizard").parent().after(`<br><div style="font-size: 11pt; font-family: MuseoSansRounded500, Arial, sans-serif; width: 90%; margin: 5px auto; text-align: center;">Userscript is active! You can now refresh search results after a search.<br><br>Also, this wizard doesn't give a shit about "Ancient laws of magic" and<br>allows you to use him during a quest anyway. Fuck the faerie queen!<br><br>This userscript was originally written by <b>Rippy</b> of the r/neopets discord server.</div>`);

// Handlers
$("#shopwizard").on("keydown", function (e) {
    // Submit on pressing enter
    if (e.which === 13) {
        $("#submit_wizard").click();
    }
});

let resultsMaxHeight = 0;
$("#submit_wizard, #refreshresults").on("click", function () {

    $("#divRefresh").show();

    toggleButton($("#refreshresults"), "disable");
    toggleButton($("#submit_wizard"), "disable");

    $.ajax({
        type : "POST",
        url : "/np-templates/ajax/wizard.php",
        dataType : "html",
        data : {
            "type" : "process_wizard",
            "feedset" : 0,
            "shopwizard" : $("#shopwizard").val(),
            "table" : $("#wizard-area option:selected").val(),
            "criteria" : $("#criteria option:selected").val(),
            "min_price" : $("#min_price").val(),
            "max_price" : $("#max_price").val()
        },
        success : function (response) {
            $("#bypassResults").html(response);
            toggleButton($("#refreshresults"), "enable");
            toggleButton($("#submit_wizard"), "enable");

            // Retain max height of the search results so the window doesn't shift
            let height = parseFloat($("#bypassResults").css("height"));
            if (height > resultsMaxHeight) {
                resultsMaxHeight = height;
            }
            $("#bypassResults").css({"height" : resultsMaxHeight});

            // scroll to results (comment out if annoying)
            $("html, body").animate({
                scrollTop : $("#divRefresh").offset().top - 70
            }, 200);
        },
        error : function () {
            alert("Error");
            toggleButton($("#refreshresults"), "enable");
            toggleButton($("#submit_wizard"), "enable");
        }
    });
});

function toggleButton(selector, mode) {
    let thisClass = $(selector).attr("class");
    if (mode === 1 || mode === "enable") {
        $(selector).attr("class", thisClass.replace(/red/g, "green"));
        $(selector).prop("disabled", false);
    } else if (mode === 0 || mode === "disable") {
        $(selector).attr("class", thisClass.replace(/green/g, "red"));
        $(selector).prop("disabled", true);
    }
}