NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Starpoints per Dollar // @version 1.4 // @updateURL https://openuserjs.org/meta/noahzark/Starpoints_per_Dollar.meta.js // @description calculates the value of starpoints when redeeming to free nights, yellow suggests to redeem and green suggests to use cash // @author Feliciano Long // @match *://www.starwoodhotels.com/preferredguest/search/results/detail.html* // @match *://www.marriott.com/search/* // @match *://www.marriott.com/reservation/* // @match *://www.marriott.com.cn/search/* // @match *://www.marriott.com.cn/reservation/* // @run-at document-end // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; var tax_and_fee = 1; var marriot_redemption_chart = [ 1, // Handles error 7500, // Cat1 12500, // Cat2 17500, // Cat3 25000, // Cat4 35000, // Cat5 50000, // Cat6 60000, // Cat7 85000 // Cat8 ]; const buy_points_rate = 437.5 * 100 / 50000; function isNull(A) { if (A === null || typeof A == 'undefined') { A = ""; } return (A.length === 0); } function getRatio(price, points, currency) { var ratio = (price * tax_and_fee / currency / points * 100).toPrecision(5) console.log(price * tax_and_fee / currency + " : " + points + " = " + ratio); return ratio; } function getValueColor(ratio, scale) { var color = (ratio > buy_points_rate / scale) ? "orange" : "red"; color = (ratio < 0.4 / scale) ? "green" : color; return color; } window.addEventListener('load', function () { var dollars; var ratio; var color; var i; var rewardpoints; console.log("Page loaded."); var brand = ''; if (location.href.indexOf('/search/') > -1) { console.log("Analyzing Marriot Prices"); var marriott_entries = $('.rate-block.with-points'); console.log("found " + marriott_entries.length + " marriott entries"); if (marriott_entries !== null) { // Load the nights of this stay var nights_html = $(".l-stay-dates")[0].getElementsByClassName("label")[0].innerHTML.replace(/\D/g, ""); var nights = isNull(nights_html) ? 1 : parseInt(nights_html); for (i = 0; i < marriott_entries.length; i++) { var price = marriott_entries[i].getElementsByClassName("t-price")[0]; var currencyExchange = marriott_entries[i].getElementsByClassName("t-font-weight-bold")[0].innerText; console.log("currency:" + currencyExchange); if (currencyExchange.indexOf('CNY') > -1) { currencyExchange = 6.7; } else if (currencyExchange.indexOf('HKD') > -1) { currencyExchange = 7.85; } else { currencyExchange = 1; } var rewardpoint = marriott_entries[i].getElementsByClassName("t-points")[0]; // Load adjusted points rewardpoint = isNull(rewardpoint) ? marriott_entries[i].getElementsByClassName("l-rewards-points")[0] : rewardpoint; if (isNull(price) || isNull(rewardpoint)) { console.log("No." + i + " is not valid"); continue; } console.log(price.innerHTML + " " + rewardpoint.innerHTML); ratio = getRatio(parseInt(price.innerHTML.replace(/,/g, '')), parseInt(rewardpoint.innerHTML.replace(/,/g, '')) * 1.0 / nights, currencyExchange); console.log(dollars + " : " + rewardpoints + " = " + ratio); color = getValueColor(ratio, 1); var node = document.createElement("span"); node.style = "color:" + (color) + "; font-weight:bold\""; var textnode = document.createTextNode(ratio + " c/p"); node.appendChild(textnode); marriott_entries[i].appendChild(node); } } } else if (location.href.indexOf('/reservation/') > -1) { var catLink = $("a.t-line-height-m.t-color-brand.t-font-s.t-color-brand")[1].href; const regex = /category=(\d)/gm; let m = regex.exec(catLink); var cat = parseInt(m[1]); if (cat > 0) { console.log("category: " + cat); rewardpoints = marriot_redemption_chart[cat]; var calendar_etnries = $(".t-rate.l-s-text-align-right.l-l-text-align-center.t-color-black.l-margin-none.l-float-right.l-l-float-none"); for (i = 0; i < calendar_etnries.length; i++) { dollars = calendar_etnries[i].getElementsByClassName("t-font-l")[0]; if (isNull(dollars)) { console.log("No." + i + " is not valid"); continue; } ratio = getRatio(parseInt(dollars.innerHTML.replace(/,/g, '')), rewardpoints, 1); color = getValueColor(ratio, 3); var appendHtml = "<a style=\"color:" + (color) + "; font-weight:bold\">" + ratio + " c/p</a>"; calendar_etnries[i].innerHTML += appendHtml; } } } }); })();