// ==UserScript==
// @name MFC Buy Links
// @namespace https://myfigurecollection.net/profile/tharglet
// @version 1.2
// @description Adds a box for direct links to shop's searches
// @author Tharglet
// @match https://myfigurecollection.net/item/*
// @require http://code.jquery.com/jquery-2.1.3.min.js
// @grant GM_addStyle
// @grant GM.getValue
// @grant GM.setValue
// ==/UserScript==
////////LICENCE////////
//This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/.
//Please credit 'Tharglet' for the original code, and provide a link to my MFC profile: https://myfigurecollection.net/profile/tharglet
///////////////////////
//Polyfill for GM_addStyle for Greasemonkey...
if(typeof GM_addStyle == 'undefined') {
GM_addStyle = (aCss) => {
'use strict';
let head = document.getElementsByTagName('head')[0];
if (head) {
let style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.textContent = aCss;
head.appendChild(style);
return style;
}
return null;
};
}
GM_addStyle(`
h4 {
font-style: italic;
padding-bottom: 5px;
padding-top: 10px;
}
.cols {
column-count: 3;
}
.cols .form-field {
break-inside: avoid-column;
}
.form .form-field--nomargin {
margin-top: 0;
}
.buylinks__search-button {
margin-right: 5px;
margin-bottom: 5px;
}
#buylinks__jan-search {
margin-top: 10px;
}
#buylinks__jan-search li {
padding-bottom: 10px;
}
.hidden {
display: none;
}
`);
(async () => {
'use strict';
//The added div containing the buy links
var buyBox = `<section><h2>Buy!<nav class="actions"><a href="#" id="buylinks-save" title="Save selected checkboxes"><span class="tiny-icon-only icon-archive"></span></a></h2>
<div class='form'>
<h3>Keyword search</h3>
<div id='buylinks__keyword-search' class='form-field'></div>
<div>
<h4>Search in English</h4>
<ul id='buylinks__search-buttons-en'></ul>
<h4>Search in Japanese</h4>
<ul id='buylinks__search-buttons-ja'></ul>
<p id='buylinks__keyword-search-error' class='action object-is-alerted hidden'>No data found for keywords selected - please select more and try again</p>
</div>
<h3>JAN search</h3>
<ul id='buylinks__jan-search'></ul></div>
</section>`;
//Stick above box into the DOM
$("#wide .wrapper section:first").after(buyBox);
//References the setting name for which checkboxes the user wants to use as default
const SAVE_CHECKBOX_PREFERENCE = "buylinks-checkboxes-default";
//The Big Magic! Store list and its abilities.
//For the section name, keep to letters, as this is used in element names, and other characters MAY break it.
//display_name: Name displayed next to the checkbox
//url: the base URL for the search
//JAN: The url part used for JAN searching
//keyword_en: The url param used for searching in English
//keyword_ja: The url param used for searching in Japanese
//bonus_params: Other URL params to append to a search (e.g. for setting language, category, anything the site doesn't do by default).
var shops = {
"amiami": {
"display_name": "AmiAmi",
"url": "https://www.amiami.com/eng/search/list/",
"JAN" : "?s_keywords",
"keyword_en" : "s_keywords"
},
"mandarakeint": {
"display_name": "Mandarake",
"url": "https://order.mandarake.co.jp/order/listPage/serchKeyWord",
"keyword_en" : "keyword",
"keyword_ja" : "keyword",
"bonus_params": "&lang=en"
},
"surujp": {
"display_name": "Suruga-ya.jp",
"url": "https://www.suruga-ya.jp/search",
"JAN": "?gtin",
"keyword_ja" : "search_word"
},
"surucom": {
"display_name": "Suruga-ya.com",
"url": "https://www.suruga-ya.com/en/products",
"keyword_en" : "keyword"
},
"milestone": {
"display_name": "Milestone",
"url": "https://b2b.mile-stone.jp/en/search/0/",
"JAN": "jan",
"bonus_params":"/"
},
"amazonjp": {
"display_name": "Amazon JP",
"url": "https://www.amazon.co.jp/s",
"keyword_ja": "k",
"JAN": "?k",
}
}
var searchParams = {
origin: {
label: "Origin"
},
character: {
label: "Character"
},
manufacturer: {
label: "Manufacturer"
}
}
var defaultCheckboxes = ["character", "manufacturer"];
var savedCheckboxes = await GM.getValue(SAVE_CHECKBOX_PREFERENCE, null);
if(savedCheckboxes) {
defaultCheckboxes = JSON.parse(savedCheckboxes);
}
const setSearchParams = (searchParams, field, en, ja) => {
searchParams[field].en = en;
searchParams[field].ja = ja;
};
const performSearch = (shop, lang) => {
$("#buylinks__keyword-search-error").hide();
let searchUrl = shops[shop].url + "?" + shops[shop]["keyword_" + lang] + "=";
let searchFields = $("#buylinks__keyword-search input[type=checkbox]:checked");
let searchTerms = [];
searchFields.each((idx, searchField) => {
let searchTerm = searchParams[$(searchField).attr("data-field")];
if(searchTerm && searchTerm[lang]) {
searchTerms.push(encodeURIComponent(searchTerm[lang]));
}
});
if(searchTerms.length > 0) {
searchUrl += searchTerms.join("%20");
if(shops[shop].bonus_params) {
searchUrl += shops[shop].bonus_params;
}
window.open(searchUrl, '_blank');
} else {
$("#buylinks__keyword-search-error").show();
}
};
GM.getValue(SAVE_CHECKBOX_PREFERENCE, null).then(() => {
$().ready(function() {
//Save button event
$("#buylinks-save").click((evt) => {
evt.preventDefault();
let newCheckboxSet = [];
let searchFields = $("#buylinks__keyword-search input[type=checkbox]:checked");
searchFields.each((idx, searchField) => {
let searchTerm = $(searchField).attr("data-field");
newCheckboxSet.push(searchTerm);
});
GM.setValue(SAVE_CHECKBOX_PREFERENCE, JSON.stringify(newCheckboxSet));
});
//Set JAN
let JAN = $("meta[itemprop='productID']").attr("content");
if(JAN) {
JAN = JAN.substring(4);
} else {
$("#buylinks__jan-search").append("<em>No JAN for this item</em>");
}
//Set up text search data
let origin = $(".form-label:contains('Origin')");
if(origin) {
let originSpan = origin.parent().find("span");
setSearchParams(searchParams, "origin", originSpan.text(), originSpan.attr("switch"));
}
let char = $(".form-label:contains('Character')");
if(char) {
let charSpan = char.parent().find("span").first();
setSearchParams(searchParams, "character", charSpan.text(), charSpan.attr("switch"));
}
let mfr = $("small:contains(As Manufacturer)").first();
if(mfr) {
let mfrSpan = mfr.parent().find("span").first();
setSearchParams(searchParams, "manufacturer", mfrSpan.text(), mfrSpan.attr("switch"));
}
//Set up checkboxes
for(let searchParam in searchParams) {
let thisSearchParam = searchParams[searchParam];
let isChecked = "";
if(defaultCheckboxes.includes(searchParam)) {
isChecked = "checked='checked'";
}
$("#buylinks__keyword-search").append(`<div class='form-input'><input id='buylinks-search-${searchParam}' data-field="${searchParam}" type='checkbox' ${isChecked}/><label for='buylinks-search-${searchParam}'>${thisSearchParam.label}</label></div>`);
}
//Set up shop-related fields
for(let shop in shops) {
let thisShop = shops[shop];
//Add JAN link
if(thisShop.JAN !== undefined && JAN !== undefined) {
$("#buylinks__jan-search").append(`<li><a target="_blank" href="${thisShop.url}${thisShop.JAN}=${JAN}${thisShop.bonus_params ? thisShop.bonus_params : ""}">${thisShop.display_name}</a></li>`);
}
if(thisShop.keyword_en) {
$("#buylinks__search-buttons-en").append(`<button id='buylinks__search-button-${shop}-en' class='buylinks__search-button'>${thisShop.display_name}</button>`);
$(`#buylinks__search-button-${shop}-en`).click(() => {
performSearch(shop, "en");
});
}
if(thisShop.keyword_ja) {
$("#buylinks__search-buttons-ja").append(`<button id='buylinks__search-button-${shop}-ja' class='buylinks__search-button'>${thisShop.display_name}</button>`);
$(`#buylinks__search-button-${shop}-ja`).click(() => {
performSearch(shop, "ja");
});
}
}
});
});
})();