// ==UserScript==
// @name Amazon - Highlight resellers
// @namespace graphen
// @version 1.8.0
// @description See instantly if the product really comes from Amazon or from a reseller
// @license MIT
// @author Graphen
// @include /^https?:\/\/www\.amazon\.(cn|in|sg|se|ae|fr|de|pl|it|nl|es|ca|com(\.(mx|au|br|tr|be))?|co\.(uk|jp))\/.*(dp|gp\/(product|video)|exec\/obidos\/ASIN|o\/ASIN|product-reviews)\/.*$/
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @noframes
// @icon https://www.amazon.com/favicon.ico
// ==/UserScript==
/* jshint esversion: 6 */
(function (doc) {
'use strict';
/***** User preferences start *****/
/* Uncomment the lines you need (remove "//") and refresh
the target website to reload the script */
/* Set and save color preference: */
//GM_setValue("pureAmazonColor", "#RRGGBB");
//GM_setValue("resellerColor", "#RRGGBB");
/* Reset colors to default: */
//GM_deleteValue("pureAmazonColor");
//GM_deleteValue("resellerColor");
/***** User preferences end *****/
const amazonIsSellerByBuyBox = [
//American English
"Ships from Amazon US Sold by Amazon US",
//British English .co.uk
"Dispatches from Amazon Sold by Amazon",
//Belgian - English .com.be
"Dispatches from Amazon.com.be Sold by Amazon.com.be",
//Belgian - Netherlands .com.be
"Verzonden vanuit Amazon.com.be Verkocht door Amazon.com.be",
//Belgian - French .com.be
"Expédié par Amazon.com.be Vendu par Amazon.com.be",
//Brazilian / Portuguese
"Enviado por Amazon.com.br Vendido por Amazon.com.br",
//Canadian
"Ships from Amazon.ca Sold by Amazon.ca",
//Czech
"Odesílatel Amazon Prodejce Amazon",
//Dutch
"Verzonden vanuit Amazon Verkocht door Amazon",
//French
"Expédié par Amazon Vendu par Amazon",
//German
"Versand Amazon Verkäufer Amazon",
//Italian
"Spedizione Amazon Venditore Amazon",
//Japanese
"Ships from Amazon.co.jp Sold by Amazon.co.jp",
"出荷元 Amazon.co.jp 販売元 Amazon.co.jp",
"配送方 Amazon.co.jp 卖家 Amazon.co.jp",
//Mexican / Spanish
"Envío desde Amazon Estados Unidos Vendido por Amazon Estados Unidos",
//Polish
"Wysyłka z Amazon Sprzedane przez Amazon",
//Portuguese
"Enviado de Amazon Vendido por Amazon",
//Spanish
"Envío desde Amazon Vendido por Amazon",
//Swedish
"Skickas från Amazon Säljs av Amazon",
//Turkish
"Gönderici Amazon Satıcı Amazon",
//UAE
"Ships from Amazon.ae Sold by Amazon.ae"
];
const amazonIsSellerByMerchInfo = [
//British English
"Dispatched from and sold by Amazon.",
"Dispatched from and sold by Amazon EU Sarl.",
//Canadian English
"Ships from and sold by Amazon.ca.",
//American English
"Ships from and sold by Amazon.com Services LLC.",
//Australian English
"Ships from and sold by Amazon US.",
//United Arab Emirates English
"Ships from and sold by Amazon.ae.",
//German
"Verkauf und Versand durch Amazon.",
"Verkauf und Versand durch Amazon EU Sarl.",
"Verkauf und Versand durch amazon.de.",
//Spanish
"Vendido y enviado por Amazon.",
"Vendido y enviado por Amazon EU Sarl.",
//French
"Expédié et vendu par Amazon.",
"Expédié et vendu par Amazon EU Sarl.",
//Italian
"Venduto e spedito da Amazon.",
"Venduto e spedito da Amazon EU Sarl.",
//Dutch
"Verzonden en verkocht door Amazon.",
"Verzonden en verkocht door Amazon EU Sarl.",
//Mexican / Spanish
"Vendido y enviado por Amazon México.",
//Brazilian / Portuguese
"Enviado e vendido por Amazon.com.br.",
//Japanese
"この商品は、Amazon.co.jp が販売、発送します。",
//Polish
"Wysyłka i sprzedaż przez Amazon."
];
const pureAmazonColor = GM_getValue("pureAmazonColor", "limegreen");
const resellerColor = GM_getValue("resellerColor", "fuchsia");
function keywordsInText(keywords, text) {
for (const words of keywords) {
if (text.includes(words)) {
return true;
}
}
return false;
}
function highlight() {
// Two different box designs possible: tabularBuybox and mechInfo
var merchInfo = doc.getElementById("merchant-info");
var tabularBuybox = doc.getElementById("tabular-buybox");
if (tabularBuybox) {
let shippingText = tabularBuybox.innerText.trim();
// console.log("#AZHR Tabular Buybox shippingText raw:\n" + shippingText);
// Remove blank lines
shippingText = shippingText.replace(/^\s*\n/gm, "");
// Remove details after seller / shipping info
shippingText = shippingText.split("\n", 6);
// Remove whitespace
shippingText.forEach((line, index) => { shippingText[index] = line.trim(); });
shippingText = shippingText.join(" ");
// console.log("#AZHR Tabular Buybox shippingText:\n" + shippingText);
if (keywordsInText(amazonIsSellerByBuyBox, shippingText)) {
GM_addStyle(`#tabular_feature_div > #tabular-buybox > .tabular-buybox-container *,
#shipsFromSoldByMessage_feature_div *
{ color: ${pureAmazonColor} !important;
font-weight: bold !important; }`);
}
else {
GM_addStyle(`#tabular_feature_div > #tabular-buybox > .tabular-buybox-container *,
#shipsFromSoldByMessage_feature_div *
{ color: ${resellerColor} !important;
font-weight: bold !important; }`);
}
}
else if (merchInfo) {
let shippingText = merchInfo.innerText.trim();
//console.log("#AZHR Merchant Info: " + shippingText);
if (amazonIsSellerByMerchInfo.includes(shippingText)) {
merchInfo.style.color = pureAmazonColor;
}
else {
merchInfo.style.color = resellerColor;
}
}
}
highlight();
// Execute again when item variation is selected
var buyboxParent = doc.getElementById('desktop_buybox');
if (buyboxParent) {
var MO = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
mutation.addedNodes.forEach(function(nodeElement) {
if (nodeElement.id === "buybox") {
highlight();
}
});
});
});
MO.observe(buyboxParent, { childList: true, subtree: true });
}
})(document);