forked from OpenNeo/impress
Emi Matchu
0e314482f7
I haven't been running Prettier consistently on things in this project. Now, it's quick-runnable, and I've got it on everything! Also, I just think tabs are the right default for this kind of thing, and I'm glad to get to switch over to it! (In `package.json`.)
208 lines
5 KiB
JavaScript
208 lines
5 KiB
JavaScript
var DEBUG = document.location.search.substr(0, 6) == "?debug";
|
|
|
|
function petThumbnailUrl(pet_name) {
|
|
// if first character is "@", use the hash url
|
|
if (pet_name[0] == "@") {
|
|
return "https://pets.neopets.com/cp/" + pet_name.substr(1) + "/1/1.png";
|
|
}
|
|
|
|
return "https://pets.neopets.com/cpn/" + pet_name + "/1/1.png";
|
|
}
|
|
|
|
/* Needed items form */
|
|
(function () {
|
|
var UI = {};
|
|
UI.form = $("#needed-items-form");
|
|
UI.alert = $("#needed-items-alert");
|
|
UI.pet_name_field = $("#needed-items-pet-name-field");
|
|
UI.pet_thumbnail = $("#needed-items-pet-thumbnail");
|
|
UI.pet_header = $("#needed-items-pet-header");
|
|
UI.reload = $("#needed-items-reload");
|
|
UI.pet_items = $("#needed-items-pet-items");
|
|
UI.item_template = $("#item-template");
|
|
|
|
var current_request = { abort: function () {} };
|
|
function sendRequest(options) {
|
|
current_request = $.ajax(options);
|
|
}
|
|
|
|
function cancelRequest() {
|
|
if (DEBUG) console.log("Canceling request", current_request);
|
|
current_request.abort();
|
|
}
|
|
|
|
/* Pet */
|
|
|
|
var last_successful_pet_name = null;
|
|
|
|
function loadPet(pet_name) {
|
|
// If there is a request in progress, kill it. Our new pet request takes
|
|
// priority, and, if I submit a name while the previous name is loading, I
|
|
// don't want to process both responses.
|
|
cancelRequest();
|
|
|
|
sendRequest({
|
|
url: UI.form.attr("action") + ".json",
|
|
dataType: "json",
|
|
data: { name: pet_name },
|
|
error: petError,
|
|
success: function (data) {
|
|
petSuccess(data, pet_name);
|
|
},
|
|
complete: petComplete,
|
|
});
|
|
|
|
UI.form.removeClass("failed").addClass("loading-pet");
|
|
}
|
|
|
|
function petComplete() {
|
|
UI.form.removeClass("loading-pet");
|
|
}
|
|
|
|
function petError(xhr) {
|
|
UI.alert.text(xhr.responseText);
|
|
UI.form.addClass("failed");
|
|
}
|
|
|
|
function petSuccess(data, pet_name) {
|
|
last_successful_pet_name = pet_name;
|
|
UI.pet_thumbnail.attr("src", petThumbnailUrl(pet_name));
|
|
UI.pet_header.empty();
|
|
$("#needed-items-pet-header-template")
|
|
.tmpl({ pet_name: pet_name })
|
|
.appendTo(UI.pet_header);
|
|
loadItems(data.query);
|
|
}
|
|
|
|
/* Items */
|
|
|
|
function loadItems(query) {
|
|
UI.form.addClass("loading-items");
|
|
sendRequest({
|
|
url: "/items/needed.json",
|
|
dataType: "json",
|
|
data: query,
|
|
success: itemsSuccess,
|
|
});
|
|
}
|
|
|
|
function itemsSuccess(items) {
|
|
if (DEBUG) {
|
|
// The dev server is missing lots of data, so sends me 2000+ needed
|
|
// items. We don't need that many for styling, so limit it to 100 to make
|
|
// my browser happier.
|
|
items = items.slice(0, 100);
|
|
}
|
|
|
|
UI.pet_items.empty();
|
|
UI.item_template.tmpl(items).appendTo(UI.pet_items);
|
|
|
|
UI.form.removeClass("loading-items").addClass("loaded");
|
|
}
|
|
|
|
UI.form.submit(function (e) {
|
|
e.preventDefault();
|
|
loadPet(UI.pet_name_field.val());
|
|
});
|
|
|
|
UI.reload.click(function (e) {
|
|
e.preventDefault();
|
|
loadPet(last_successful_pet_name);
|
|
});
|
|
})();
|
|
|
|
/* Bulk pets form */
|
|
(function () {
|
|
var form = $("#bulk-pets-form"),
|
|
queue_el = form.find("ul"),
|
|
names_el = form.find("textarea"),
|
|
add_el = $("#bulk-pets-form-add"),
|
|
clear_el = $("#bulk-pets-form-clear"),
|
|
bulk_load_queue;
|
|
|
|
$(document.body).addClass("js");
|
|
|
|
bulk_load_queue = new (function BulkLoadQueue() {
|
|
var RECENTLY_SENT_INTERVAL_IN_SECONDS = 30;
|
|
var RECENTLY_SENT_MAX = 3;
|
|
var pets = [],
|
|
url = form.attr("action") + ".json",
|
|
recently_sent_count = 0,
|
|
loading = false;
|
|
|
|
function Pet(name) {
|
|
var el = $("#bulk-pets-submission-template")
|
|
.tmpl({ pet_name: name, pet_thumbnail: petThumbnailUrl(name) })
|
|
.appendTo(queue_el);
|
|
|
|
this.load = function () {
|
|
el.removeClass("waiting").addClass("loading");
|
|
var response_el = el.find("span.response");
|
|
pets.shift();
|
|
loading = true;
|
|
$.ajax({
|
|
complete: function (data) {
|
|
loading = false;
|
|
loadNextIfReady();
|
|
},
|
|
data: { name: name },
|
|
dataType: "json",
|
|
error: function (xhr) {
|
|
el.removeClass("loading").addClass("failed");
|
|
response_el.text(xhr.responseText);
|
|
},
|
|
success: function (data) {
|
|
var points = data.points;
|
|
el.removeClass("loading").addClass("loaded");
|
|
$("#bulk-pets-submission-success-template")
|
|
.tmpl({ points: points })
|
|
.appendTo(response_el);
|
|
},
|
|
type: "post",
|
|
url: url,
|
|
});
|
|
|
|
recently_sent_count++;
|
|
setTimeout(function () {
|
|
recently_sent_count--;
|
|
loadNextIfReady();
|
|
}, RECENTLY_SENT_INTERVAL_IN_SECONDS * 1000);
|
|
};
|
|
}
|
|
|
|
this.add = function (name) {
|
|
name = name.replace(/^\s+|\s+$/g, "");
|
|
if (name.length) {
|
|
var pet = new Pet(name);
|
|
pets.push(pet);
|
|
if (pets.length == 1) loadNextIfReady();
|
|
}
|
|
};
|
|
|
|
function loadNextIfReady() {
|
|
if (!loading && recently_sent_count < RECENTLY_SENT_MAX && pets.length) {
|
|
pets[0].load();
|
|
}
|
|
}
|
|
})();
|
|
|
|
names_el.keyup(function () {
|
|
var names = this.value.split("\n"),
|
|
x = names.length - 1,
|
|
i,
|
|
name;
|
|
for (i = 0; i < x; i++) {
|
|
bulk_load_queue.add(names[i]);
|
|
}
|
|
this.value = x >= 0 ? names[x] : "";
|
|
});
|
|
|
|
add_el.click(function () {
|
|
bulk_load_queue.add(names_el.val());
|
|
names_el.val("");
|
|
});
|
|
|
|
clear_el.click(function () {
|
|
queue_el.children("li.loaded, li.failed").remove();
|
|
});
|
|
})();
|