NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name TORN: Item Favorite
// @version 1.0.0
// @author DeKleineKobini
// @description Favorite items and put them at the top
// @namespace dekleinekobini.itemvalue
// @match https://www.torn.com/item.php
// @grant none
// @license MIT
// @updateURL https://openuserjs.org/meta/DeKleineKobini/TORN_Item_Favorite.meta.js
// ==/UserScript==
var logging = {
enabled: {
regular: true,
debug: true
},
prefix: {
regular: "[IF] ",
debug: "[IF DEBUG] "
}
}
logging.log = logging.enabled.regular ? function(message) { console.log(logging.prefix.regular + message); } : function(){};
logging.debug = logging.enabled.debug ? function(message) { console.log(logging.prefix.debug + message); } : function(){};
logging.debugObj = logging.enabled.debug ? function(message, obj) { logging.debug(message); console.log(obj); } : function(){};
var favorites = localStorage.getItem("itemfavorite_favorites");
if (favorites) favorites = favorites.split(",");
else favorites = [];
(function(scope) {
"use strict";
Number.prototype.format = function(n, x) {
var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';
return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');
};
setupCss(scope);
new MutationObserver(function(mutations, me) {
var last = document.getElementsByClassName("last-row")[0];
if (last) {
loadData();
me.disconnect();
}
}).observe(document, {
childList: true,
subtree: true
});
})(window);
(function(open) {
XMLHttpRequest.prototype.open = function() {
this.addEventListener("readystatechange", function() {
if (this.readyState > 3 && this.status == 200) {
var page = this.responseURL.substring(this.responseURL.indexOf("torn.com/") + "torn.com/".length, this.responseURL.indexOf(".php"));
if (page !== "item" || !isJsonString(this.response)) return;
var res = JSON.parse(this.response);
var stripped = stripHtml(res.text);
setTimeout(loadData, 250)
}
}, false);
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
function loadData() {
logging.log("loadData()");
var list = $("ul[aria-hidden=false]").find("li[data-item]");
list.each(function() {
var favorite = $(this).find(".actions-wrap > .left").last();
favorite.html("<span class='icon-h' title='Favorite this Item'>" +
"<button aria-label='Favorite Combat Boots' class='favorite-icon-off'></button>" +
"<span class='opt-name'>Favorite <span class='t-hide'>this Item</span></span>");
var favButton = favorite.find("button");
favButton.addClass(isFavorited($(this)) ? "favorite-icon-on" : "favorite-icon-off");
favButton.click(function(){
var favorite = $(this);
var item = favorite.parents("li").eq(1);
var wasFavorited = isFavorited(item);
favorite.toggleClass("favorite-icon-on", !wasFavorited);
favorite.toggleClass("favorite-icon-off", wasFavorited);
setFavorited(item, !wasFavorited);
});
});
list.not(".favorite")
.filter(function() { return isFavorited($(this)); })
.each(function(index){
$(this).detach().prependTo("ul[aria-hidden=false]")
$(this).addClass("favorite");
});
}
function setupCss(scope) {
var style = document.createElement('style');
document.head.appendChild(style);
style.type = "text/css";
style.id = "tes";
var stylesheet = style.sheet;
scope.css = function(selector, property, value) {
// Append the rule (Major browsers)
try {
stylesheet.insertRule(selector + ' {' + property + ':' + value + '}', stylesheet.cssRules.length);
} catch (err) {
try {
stylesheet.addRule(selector, property + ':' + value); // (pre IE9)
} catch (err) {
console.log("Couldn't add style");
}
} // (alien browsers)
}
css("button[class^=favorite-icon-]", "background", "url(/images/v2/items/icons_dark_bg.png) left top no-repeat");
css("button[class^=favorite-icon-]", "width", "28px");
css("button[class^=favorite-icon-]", "height", "32px");
css("button[class^=favorite-icon-]", "display", "block");
css("button[class^=favorite-icon-]", "margin-left", "-1px");
css("button[class^=favorite-icon-]", "vertical-align", "middle");
css("button[class^=favorite-icon-]", "border", "0px solid transparent");
css(".favorite-icon-off", "background-position", "-36px -783px !important");
css(".favorite-icon-on", "background-position", "-2px -783px !important");
}
function isFavorited(element) {
return favorites.includes(element.attr("data-rowkey"));
}
function setFavorited(element, val) {
let armoryId = element.attr("data-armoryid");
if (armoryId) {
_setFavorited("u" + armoryId, val);
_setFavorited("g" + element.attr("data-item"), val);
} else {
_setFavorited(element.attr("data-rowkey"), val);
}
}
function _setFavorited(key, val) {
logging.debugObj("old: " , favorites)
logging.debug("set: " + key + " = " + val)
if (val) {
favorites.push(key);
} else {
let index = favorites.indexOf(key);
if (index > -1) favorites.splice(index, 1)
}
localStorage.setItem("itemfavorite_favorites", favorites);
}
function formatCurrency(value, decimals, currency) {
if (!decimals) decimals = 0;
if (!currency) currency = "$";
return currency + value.format(decimals);
}
function isJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
function stripHtml(html) {
var tmp = document.createElement("div");
tmp.innerHTML = html;
var stripped = tmp.textContent || tmp.innerText || "";
stripped = replaceAll(stripped, "\n", "");
stripped = replaceAll(stripped, "\t", "");
stripped = replaceAll(stripped, " ", " ");
return stripped;
}
function replaceAll(str, text, replace) {
while (contains(str, text)) {
str = str.replace(text, replace);
}
return str;
}
function contains(str, text) {
return str.indexOf(text) >= 0;
}