// ==UserScript==
// @name Show Price as Hours of your Life
// @description Gets the price displayed on shopping sites and shows the equivalent hours of your life spent to earn that money.
// @author navchandar
// @version 0.5
// @run-at document-end
// @copyright 2019, navchandar(https://github.com/navchandar)
// @icon https://www.seaicons.com/wp-content/uploads/2015/09/Money-Graph-icon.png
// @license MIT
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @include https://play.google.com/store/*
// @include https://play.google.com/store*
// @include http://play.google.com/store*
// @include http://www.amazon.com/*
// @include https://www.amazon.com/*
// @include http://www.amazon.in/*
// @include https://www.amazon.in/*
// @include https://www.flipkart.com*
// @include http://www.flipkart.com*
// @include https://paytm.com*
// @include http://paytm.com*
// @include https://paytmmall.com*
// @include http://paytmmall.com*
// @namespace https://greasyfork.org/users/302262
// @downloadURL none
// ==/UserScript==
function updateValuesINR(){
var approxHourlySalary = Number(GM_getValue("approxAnnualSalary", ""))/(9*22*12) ;
if(!approxHourlySalary){
console.log("Error calculating approxHourlySalary.")
}
if (approxHourlySalary > 0){
var items, separator;
// These xpaths cover most of the price elements shown. Feel free to comment/fork to update if required.
var amazonINRxpath = "//span[contains(@class, 'CurrencyINR')]//following-sibling::span" + " | " +
"//span[@class='currencyINR']/parent::*" + " | " +
"//*[contains(@class, 'rice')][contains(text(), '₹')]" + " | " +
"//*[contains(@class, 'price')]//*[contains(text(), '₹')]" + " | " +
"//*[contains(@class, 'price-whole')]" + " | " +
"//h2/span[contains(text(), '₹')]";
var amazonUSDxpath = "//*[@class='dealPrice']" + " | " +
"//*[@class='buyingPrice']" + " | " +
"//*[contains(@class,'-price-whole')]" + " | " +
"(//span[@class='dv-conditional-linebreak']//following-sibling::text())[1]" + " | " +
"(//span[@class='dv-conditional-linebreak']//following-sibling::text())[2]" + " | " +
"//span[contains(@class, 'price')][contains(text(), '$')]" + " | " +
"//h2[contains(@class, 'headline') and contains(text(), '₹')]" + " | " +
"//a[@id='dealTitle']" + " | " + "//div[contains(@class, 'priceBlock')]" ;
var flipkartINRxpath = "//*[contains(@title, '₹')]/div[3]" + " | " +
"//div[contains(text(), '₹')]";
var paytmINRxpath = "//span/span[contains(text(), 'Rs')]" + " | " +
"//a//*[contains(@class, 'iconRupess')]//.." + " | " +
"//*[contains(@class, 'iconRupess')]//..";
var playStoreINRxpath = "//*[@class='display-price' and contains(text(), '₹')]" + " | " +
"//button[@jsmodel]//span[contains(text(), '₹')]" + " | " +
"//button[contains(text(), '₹')]//text()";
var hostURL = window.location.href;
if (hostURL.indexOf('amazon.in') >= 0){
items = document.evaluate(amazonINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = " "; }
else if (hostURL.indexOf('amazon.com') >= 0){
items = document.evaluate(amazonUSDxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = " "; }
else if (hostURL.indexOf('flipkart') >= 0){
items = document.evaluate(flipkartINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = " "; }
else if (hostURL.indexOf('paytm') >= 0){
items = document.evaluate(paytmINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = "
"; }
else if ((hostURL.indexOf('google') >= 0) && (hostURL.indexOf('details') >= 0)){
items = document.evaluate(playStoreINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = " "; }
else if ((hostURL.indexOf('google') >= 0) && (hostURL.indexOf('store') >= 0)){
items = document.evaluate(playStoreINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
separator = "
"; }
else { console.log("Show Price Hours script didnt match with the current site."); }
if(!items){
console.log("No items found with the xpath in this page.");
} else if(items.snapshotLength <= 0){
console.log("No items found with the xpath in this page.");
} else {
var passCount = 0;
for (let i = 0; i < items.snapshotLength; i++) {
var thisitem = items.snapshotItem(i);
var txt = thisitem.innerText;
var alreadyUpdated = false;
try { if (txt.indexOf('hrs') >= 0) { alreadyUpdated = true; } } catch (err) {}
try { if (thisitem.innerHTML.indexOf('hrs') >= 0) { alreadyUpdated = true; } } catch (err) {}
if(!alreadyUpdated){
try{
// to remove +10% offers from flipkart
if(txt.indexOf('+') >= 0){
txt = txt.split('+')[0];
}
// to remove hidden text from paytm
if(txt.indexOf('%') >= 0 && txt.indexOf('-') >= 0){
txt = txt.split('-')[0]
}
// to remove 100-200 range from amazon
if(txt.indexOf('-') >= 0){ txt = txt.split('-')[1]; }
if(txt.indexOf('to') >= 0){ txt = txt.split('to')[1]; }
txt = (txt.replace(/\d+ Used/i, "").replace(/\d+ New/i, "")).replace(/\(\d+%\)/g, "");
txt = txt.replace(/[a-z]/gi, "");
// remove unneccessary text and convert to number.
var amount = Number(txt.replace(",","").replace("Rs.","").replace("₹", "").replace("$", "").replace(".00", "").replace(" ", ""));
if(!amount || amount <= 0){
amount = Number((txt.replace(".00", "").replace(/\.\d+/, "")).replace(/\D+/g,""));
}
//console.log(amount, txt);
if(amount > 0) {
var calculated = (amount/approxHourlySalary).toFixed(2);
if(calculated){
thisitem.innerHTML += (separator + "(" + calculated + " hrs)");
passCount++;
} else {
console.log("Error calculating amount : " + amount);
}
}
} catch (err) {}
}
}
console.log("Updated hours to " + passCount +" items.");
items = "";
}
}
}
function ButtonClickAction(zEvent){
GM_setValue("approxAnnualSalary", "");
var approxAnnualSalary = prompt ('To calculate how many hours of your life, each item will cost, add an approximate Annual Salary/Wage Amount :', '');
if(approxAnnualSalary){
GM_setValue("approxAnnualSalary", approxAnnualSalary);
console.log("Stored approxAnnualSalary : " + approxAnnualSalary);
GM_setValue("UserCancelledPrompt", false);
self.location.assign(location);
} else {
GM_setValue("UserCancelledPrompt", true);
console.log("User Cancelled prompt to update approxAnnualSalary.");
}
}
function AddButton(){
// Add a button element on div
var zNode = document.createElement('div');
zNode.innerHTML = '';
zNode.setAttribute ('id', 'myContainer');
document.body.appendChild(zNode);
//--- Activate the newly added button.
document.getElementById ("myButton").addEventListener ("click", ButtonClickAction, false);
//--- Style our newly added element using CSS.
GM_addStyle ( `
#myContainer {
position: fixed;
bottom: 0;
left: 0;
font-size: 11px;
margin: 0px;
opacity: 0.75;
}
#myButton {
cursor: pointer;
background-color: lightgrey;
color: black;
}
#myButton:hover {
background-color: #555;
color: white;
box-shadow: 0 2px 6px 0 rgba(0,0,0,.24), 0 5px 10px 0 rgba(0,0,0,.19);
opacity: 1;
}
` );
}
(function() {
'use strict';
//GM_setValue("approxAnnualSalary", ""); // Reset here for test.
var approxAnnualSalary = GM_getValue("approxAnnualSalary", "");
var checkPriorCancellation = GM_getValue("UserCancelledPrompt");
if((approxAnnualSalary=="" || !approxAnnualSalary) && !checkPriorCancellation) {
approxAnnualSalary = prompt ('To calculate how many hours of your life, each item will cost, add an approximate Annual Salary/Wage Amount :', '');
if(approxAnnualSalary){
GM_setValue("approxAnnualSalary", approxAnnualSalary);
GM_setValue("UserCancelledPrompt", false);
console.log("Stored approxAnnualSalary : " + approxAnnualSalary);
} else {
GM_setValue("UserCancelledPrompt", true);
console.log("User Cancelled prompt to update approxAnnualSalary.");
}
} else {
console.log("Retrieved approxAnnualSalary : " + approxAnnualSalary);
}
// call this function once
AddButton();
// call this every 2 seconds to update according to page load
setInterval(function() {
updateValuesINR();
}, 2000);
})();