alpe / SteamGifts Steam Ratings

// ==UserScript==
// @name        SteamGifts Steam Ratings
// @namespace   SG Ratings
// @include     *://www.steamgifts.com/
// @include     *://www.steamgifts.com/giveaways/search?*
// @include     *://www.steamgifts.com/giveaway/*
// @include     *://www.steamgifts.com/group/*
// @version     1.6.9.2
// @require     https://code.jquery.com/jquery-3.2.1.min.js
// @grant       GM_xmlhttpRequest
// @grant       GM.xmlHttpRequest
// @grant       GM_addStyle
// @grant       GM.addStyle
// @grant       GM_registerMenuCommand
// @grant       GM.registerMenuCommand
// @grant       GM_getValue
// @grant       GM.getValue
// @grant       GM_setValue
// @grant       GM.setValue
// @grant       GM_listValues
// @grant       GM.listValues
// @grant       GM_deleteValue
// @grant       GM.deleteValue
// @connect     store.steampowered.com
// @connect     query.yahooapis.com
// @run-at      document-end
// @license MIT
// @description:en Show Steam ratings on SteamGifts.
// @description Show Steam ratings on SteamGifts.
// ==/UserScript==

// GM4+ compatiblity code adapted from https://github.com/StigNygaard/GMCommonAPI.js STARTS HERE //
let info = (GM_info ? GM_info : GM.info);
if (info.scriptHandler === 'Greasemonkey' && parseInt(info.version,10)>=4){
    console.log("Using compatibility mode for GM4+");
    var GM4 = true;
} else {
    var GM4 = false;
}

function GM__registerMenuCommand(caption, commandFunc, options) {
    if (!GM4){
        GM_registerMenuCommand(caption, commandFunc, options);
    } else {
        if (typeof options === 'string') {
            options = {'accessKey': options};
        } else if (typeof options === 'undefined') {
            options = {};
        }
        if (!options['disabled']) {
            let prefix = '';
            if (options['type'] === 'radio') {
                prefix = options['checked'] ? '\u26AB ' : '\u26AA ';
            } else if (options['type'] === 'checkbox') {
                prefix = options['checked'] ? '\u2B1B ' : '\u2B1C ';
            }
        }
        let oMenu = document.createElement('menu');
        if (oMenu.type !== 'undefined') {
            if (!document.body) {
                return;
            }
            let topMenu = null;
            if (document.body.getAttribute('contextmenu')) {
                topMenu = document.querySelector('menu#' + document.body.getAttribute('contextmenu'));
            }
            if (!topMenu) {
                topMenu = document.createElement('menu');
                topMenu.setAttribute('type', 'context');
                topMenu.setAttribute('id', 'gm-registered-menu');
                document.body.appendChild(topMenu);
                document.body.setAttribute('contextmenu', topMenu.getAttribute('id'));
            }
            let menuItem = document.createElement('menuitem');
            menuItem.setAttribute('type', options['type'] ? options['type'] : 'command');
            menuItem.setAttribute('label', caption);
            if (options['id']) menuItem.setAttribute('id', options['id']);
            if (options['name']) menuItem.setAttribute('name', options['name']);
            if (options['checked']) menuItem.setAttribute('checked', 'checked');
            if (options['disabled']) menuItem.setAttribute('disabled', 'disabled');
            if (options['icon']) menuItem.setAttribute('icon', options['icon']);
            if (options['topLevel']) {
                topMenu.appendChild(menuItem);
            } else {
                let scriptMenu = topMenu.querySelector('menu[label="SteamGifts Steam Ratings"]');
                if (!scriptMenu) {
                    scriptMenu = document.createElement('menu');
                    scriptMenu.setAttribute('label', "SteamGifts Steam Ratings");
                    topMenu.appendChild(scriptMenu);
                }
                scriptMenu.appendChild(menuItem);
            }
            menuItem.addEventListener('click', commandFunc, false);
        }
    }
}

function GM__setValue(name, value) {
    if (!GM4){
        GM_setValue(name, value);
    } else {
        localStorage.setItem("SGSR" + '_' + name, value);
    }
}

function GM__getValue(name, defvalue) {
    if (!GM4){
        return GM_getValue(name, defvalue);
    } else {
        if (("SGSR"+'_'+name) in localStorage) {
            return localStorage.getItem("SGSR"+'_'+name);
        } else {
            return defvalue;
        }
    }
}

function GM__deleteValue(name) {
    if (!GM4){
        GM_deleteValue(name);
    } else {
        localStorage.removeItem("SGSR" + '_' + name);
    }
}

function GM__listValues() {
    if (!GM4){
        return GM_listValues();
    } else {
        let values = [];
        let prefix = "SGSR";
        let prelen = 4;
        for (let i = 0; i < localStorage.length; i++) {
            if (localStorage.key(i).substr(0, prelen) === prefix) {
                values.push(localStorage.key(i).substr(prelen+1));
            }
        }
        return values;
    }
}

function GM__addStyle(style) {
    if (!GM4){
        return GM_addStyle(style);
    } else {
        let head = document.getElementsByTagName('head')[0];
        if (head) {
            let styleElem = document.createElement('style');
            styleElem.setAttribute('type', 'text/css');
            styleElem.textContent = style;
            head.appendChild(styleElem);
            return styleElem;
        }
    }
}

function GM__xmlhttpRequest(details) {
    if (!GM4){
        return GM_xmlhttpRequest(details);
    } else {
        return GM.xmlHttpRequest(details);
    }
}
// GM4+ compatiblity code adapted from https://github.com/StigNygaard/GMCommonAPI.js ENDS HERE //

defaults = {
  expiretime:3*24*60*60,
  expiretimeenabled:true,
  GAratings:true,
  GAfeatures:2,
  GAtags:2,
  GASratings:true,
  GASfeatures:true,
  GAStags:true,
  GASmeta:false,
  timer:false,
  iconsid:2,
  hidereviews:0,
  betaTitle:false,
  usesteamdb:false,
  delayscan:0.3*1000,
  dbversion:8
};

function savedata(a,b){
  GM__setValue(a, JSON.stringify(b));
}

function loaddata(a,b){
  var val = GM__getValue(a,null);
  return (val !== null ? JSON.parse(val) : (b !== undefined ? b : false));
}

function setdefault(restoredefault){
  $.each(defaults, function( name, value ) {
    if (restoredefault===true){ GM__deleteValue(name); }
    if (name!=="dbversion"){
      window[name] = loaddata(name,value);
    } else {
      window[name] = value;
    }
  });
}
setdefault();

if(timer){ console.time('SG Ratings Internal'); console.time('SG Ratings'); }
var run = 0;

function log(text) {
	if(window.console && console.log) {
		console.log("SG Ratings: " + text);
	}
}

function clearstorage(a){
  var toscan = [];
  e = GM__listValues();
  for (var i=0; i<e.length; i++){ if(!isNaN(e[i])){ GM__deleteValue(e[i]); } }
  log((typeof(a)!=='undefined'?a+' ':'') + "Cleaning database.");
}

function toggleconfig(name,e){
  e = e||!GM__getValue(name,defaults[name]);
  GM__setValue(name,e);
  alert(name + ': ' + e);
}

function betaTitleIn(a,b,c){
  var tab = document.createElement("table");
  tab.style.position = "absolute";
  tab.style.display = "inline";
  tab.style.padding = "0 8px";
  tab.style.marginLeft = "4px"
  tab.style.border = "1px solid #d2d6e0";
  tab.style.backgroundImage = "linear-gradient(rgb(255, 255, 255) 0%, rgba(255, 255, 255, 0.98) 100%)";
  tab.style.zIndex = "1000";
  tab.style.lineHeight = "20px";
  if (a.offsetWidth < a.scrollWidth){ tab.style.left = a.getBoundingClientRect().left+105+4 + "px"; }
  if (!!b){
      var b = b.split('\n');
      var b2 = [];
      for (var bb=0; bb<b.length; bb++){
          var featuresid = b[bb].split('::')[0];
          var img = (featuresid!=='0'&&!isNaN(featuresid)?'<img class="category ' + featuresicons[featuresid].replace('_','-').toLowerCase() + '"></img> ':'');
          b2.push(img + b[bb].split('::')[1]);
      }
      var b = b2.join("<br>");
  }
  tab.innerHTML = (!!b ? '<td style="padding-right: 8px;">' + b + '</td><td style="padding-left: 8px;border-left: 1px solid;">' : "<td>") + c.replace(/\b.+:/g,'').split('\n').join("<br>") + "</td>";
  a.appendChild(tab);
}

function betaTitleOut(a){
  a.removeChild(a.lastChild);
}

$.each([
        ["List current settings", function(){
            var set = [];
            $.each(defaults, function( name, value ) {
                if (name==='dbversion'){
                    set.push('\nDatabase version: ' + GM__getValue(name,value));
                } else {
                    set.push(name + ' = ' + GM__getValue(name,value) + ((GM__getValue(name,value)!=defaults[name])?" [default is " + defaults[name] + "]":""));
                }
            });
            set.push('Database entries: '+GM__listValues().length);
            alert(set.join('\n'));
        }],
        ["GA page: Show ratings",function(){ toggleconfig('GAratings'); }],
        ["GA page: Choose method to show features",function(){
            var temp = prompt("Default: " + defaults['GAfeatures'] + "\n\n0 = Disabled\n1 = Show on mouseover\n2 = Show on page", GM__getValue('GAfeatures',GAfeatures));
            if (!!temp.match(/0|1|2/)){ toggleconfig('GAfeatures',temp); } else { alert("invalid option"); }
        }],
        ["GA page: Choose method to show tags",function(){
            var temp = prompt("Default: " + defaults['GAtags'] + "\n\n0 = Disabled\n1 = Show on mouseover [default]\n2 = Show on page", GM__getValue('GAtags',GAtags));
            if (!!temp.match(/0|1|2/)){ toggleconfig('GAtags',temp); } else { alert("invalid option"); }
        }],
        ["GAS page: Show ratings",function(){ toggleconfig('GASratings'); }],
        ["GAS page: Show features",function(){ toggleconfig('GASfeatures'); }],
        ["GAS page: Show tags", function(){ toggleconfig('GAStags'); }],
        ["GAS page: Alternative mode to show features and tags [BETA]", function(){ toggleconfig('betaTitle'); }],
        ["GAS page: Show metascore", function(){ toggleconfig('GASmeta'); }],
        ["GAS page: Use SteamDB formula for ratings", function(){ toggleconfig('usesteamdb'); }],
        ["Choose icons",function(){
            var temp = prompt("Default: " + defaults['iconsid'] + "\n\n-1 = auto\n0 = Thumbs up/down (unicode)\n1 = Alternative unicode icons\n2 = Thumbs up/down (images)", GM__getValue('iconsid',iconsid));
            if (!!temp.match(/-1|0|1|2/)){ toggleconfig('iconsid',temp); } else { alert("invalid option"); }
        }],
        ["Choose which games to hide",function(){
            var temp = prompt("Default: " + defaults['hidereviews'] + "\n\n0 = None\n1 = Very negative\n2 = Negative and Very negative\n3 = Mixed and below", GM__getValue('hidereviews',hidereviews));
            if (!!temp.match(/0|1|2|3/)){ toggleconfig('hidereviews',temp); } else { alert("invalid option"); }
        }],
        ["Set time between queries to Steam Store", function(){
            var temp = prompt("Time in milliseconds\n\nDefault: " + defaults['delayscan'] + "\nMinimum: 100 (0,1s)\nMaximum: 15000 (15s)\n\nAnything lower than 100 = off", GM__getValue('delayscan',delayscan));
            if (isNaN(temp)){ alert('Not a number'); return false; } else if (temp!==null){ GM__setValue('delayscan',Math.min(temp,15000)); }
        }],
        ["Clear storage", function(){ clearstorage(); alert('Storage cleaned'); }],
        ["Restore default settings", function(){ setdefault(true); alert('Settings restored to defaults'); }]
    ], function(a,b){ GM__registerMenuCommand(b[0],b[1]); }
);

if(loaddata('dbversion') !== false){ clearstorage("Old version."); restoredefault(); }

if (window.location.pathname.match(/^\/giveaways/) || window.location.pathname === "/" || window.location.pathname.length === 0 || window.location.pathname.match(/^\/group\//)){ var isgaspage = true; } else { var isgaspage = false; }
if (isgaspage){ var isgapage = false; var issearchpage = !!document.URL.match(/type=(wishlist|recommended)|q=.+/); } else { var isgapage = !!window.location.pathname.match(/^\/giveaway\//); var issearchpage = false; }
var icons = [["\uD83D\uDC4D","\uD83D\uDC4D","\u25FC","\uD83D\uDC4E","\uD83D\uDC4E"],["\u25B2","\u25B2","\u25AC ","\u25BC","\u25BC"],['','','','','']];
var toscan = [];

if (iconsid !== 2 && (icons[iconsid] === undefined || icons[iconsid].length !== 5)){
  var canvas = document.createElement("canvas");
  var context = canvas.getContext("2d");
  var text = "abcdefghijklmnopqrstuvwxyz0123456789";
  context.font = "72px monospace";
  var baselineSize = context.measureText(text).width;
  context.font = "72px 'Segoe UI Symbol', monospace";
  var newSize = context.measureText(text).width;
  delete canvas;
  if (newSize == baselineSize) {
    iconsid = 2;
    log('Font "Segoe UI Symbol" not found. Using image as fallback.');
  } else {
    iconsid = 0;
  }
}

{
  var styles = [];
  if (iconsid===2){
    styles.push(".rating{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAABNCAYAAAB9s+4QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEXUlEQVRIie2Xf2iUdRzH35/vPXc772xrt3Ydm8y5yVCzXCr+WJJhhHNF2djUMEUYZGVKsvwjDWT4iyFB9gskIvKfYIcoW8xi4WQkFs1ao/yRguKP6Swnd9vdc7t7nufdP3ptt7vbMwhJ6A3fP57v8319Pz++z+fh80X88ZK5ZhH2mZOhE2DakeP/ibMb/Lin4T0bbhNIEDAzQlAm/c8332MUXZqPgAZAIaMshXD3C1yxtwLZF6Yo1j8DZ7o2TQwCFK6ermYrPYq3Q70EogCscTEZ8mP3h084tv852OoK60Gr3BWQAaMCgGSEaAFu86/kc2Rb1Xxzivf0P1kUEuoGgfPJEaj4iOVzZo3aSD+4uszMx2EqRAgX6X9uv61ouRTa8Mp5a0yn4zodzv7E0+tq7IGdO7X4irItzEGEhQs7Oe+gZgsM7Z3hi5e4viWevEPUu0e+y3hOedvPDcSri4PwOgeA0bELSVuWbVn61yHRdzSWumPhJZaOZmVIUfqt3SeQ99hL0rwxDABKVc08hTA+UQn40wIAYMZmITq4PrkHlQpQJBcimc9C4IfR9ywPHJ4ysZiMwWpcvbB+YpCIG+Hri9lNTUEf7hLyMsi+8UFzPtqOVTje8ZUcdet60Cp0Q3RrQdbYaA3BaZxLFpx+aOd07ddbTVrYqAXghkgYRBcERhLy+joAdXRUlQ51fhzwHu55FXHZCKpceKdvlg+2tYzxcowH9fUqUTVrifP8zfdBAUrnNMi7b/SOXDMmexIMWs638f3wtNw9EMuPvr5GtrSorBAAiDRZoWmR76xJ0oqYVYEgtHEhAHh01adDiYrcY5ZTYsi/M+r39h+vp/sn4ZcI2lxrQcMOWYuLGhTqbCJRJNAM3M/s/Q/dd+hBqqfOTrrntZunqn9MLLNtKZ4PJZZyDUS0jV9cotsWtLxSog8RJ4woqj67YtSATOv+mMlSBz53WejVI1rj4m/M2te66Uldk7bjqmzjew7BLhBhOo32ArH2dCzP+S0Jvdxm7roMtShlq1wFLAAAAnEhLpbnG5tmduzuampqsuSVr3nhPFEmMk76BT0kfijwWWENCg1OE0cMwJcVIioFqNQ0BVXjxR8CXMkKpEitWyo3HYLjJOK2IQBYBBzwAj9PCFoYxbVhwTEyc8dMwiARBRBOnlN9C119XhyJEWnbT6cD3Q5gn/thDDxQ9dTI2d5C89KUVcYa25b0CDSGlKf/jGzd33NjzNedVj37b3jKc3gSDoa8S4y3gPT1NEbrS7kqDwxhEkOTfMaWF5s5eVyIh+jJn8yOuze7YZSYvxTNiI8unWcK+RXA30eMswIOjrgSmiJmf2V1rG7n3fKXp5y8fjKBQGpSUiXKugaq3uJq6xZWB/i6B9QzXjxTxrQ6Ui2bi15XDoZsZemu1Moa9D6Si+PAiA7SjjZP5aJijf223QOAtRtwxu1DO7LfQC0ABi3EkjMtW1k0NZ+nM1nw5PGst4BvFi9n7d/reSPZetpaMQAAAABJRU5ErkJggg==); width:13px;height:13px;display:inline-block;border-width: 0px 4px 0px 0px;border-style:solid;border-color:transparent;vertical-align:text-bottom;background-repeat:no-repeat}\
    .rating1 { background-position: 0 0%; }\
    .rating2 { background-position: 0 25%; }\
    .rating3 { background-position: 0 50%; }\
    .rating4 { background-position: 0 75%; }\
    .rating5 { background-position: 0 100%; }");
  } else {
    styles.push('.rating{font-size:16px;}\
    .rating5::before{color:#0000ff;content:"' + icons[iconsid][0] + '"}\
    .rating4::before{color:#33b4ff;content:"' + icons[iconsid][1] + '"}\
    .rating3::before{color:#ffa300;content:"' + icons[iconsid][2] + '"}\
    .rating2::before{color:#ff6666;content:"' + icons[iconsid][3] + '"}\
    .rating1::before{color:#ff0000;content:"' + icons[iconsid][4] + '"}');
  }
  if (betaTitle || (isgapage && GAfeatures===2)){
    var featuresicons = ['','ico_multiPlayer','ico_singlePlayer','','','','ico_mod_hl2','ico_mod_hl','ico_vac','ico_coop','','','','ico_cc','ico_commentary','ico_stats','ico_sdk','ico_editor','ico_partial_controller','ico_sdk','ico_multiPlayer','ico_dlc','ico_achievements','ico_cloud','ico_coop','ico_leaderboards','','ico_multiPlayer','ico_controller','ico_cards','ico_workshop','VRIcon','ico_turn_notifications','','','ico_cart','ico_multiPlayer',"ico_multiPlayer","ico_coop","ico_coop"];
    styles.push(".category{background-image: url(data:image/png;base64,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);width:21px;height:13px;display:inline-block;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.35);vertical-align:text-bottom;background-repeat:no-repeat; }\
    .vricon { background-position: 0 0%; }\
    .ico-achievements { background-position: 0 4.761905%; }\
    .ico-cards { background-position: 0 9.52381%; }\
    .ico-cart { background-position: 0 14.285714%; }\
    .ico-cc { background-position: 0 19.047619%; }\
    .ico-cloud { background-position: 0 23.809524%; }\
    .ico-commentary { background-position: 0 28.571429%; }\
    .ico-controller { background-position: 0 33.333333%; }\
    .ico-coop { background-position: 0 38.095238%; }\
    .ico-dlc { background-position: 0 42.857143%; }\
    .ico-editor { background-position: 0 47.619048%; }\
    .ico-leaderboards { background-position: 0 52.380952%; }\
    .ico-mod-hl { background-position: 0 57.142857%; }\
    .ico-mod-hl2 { background-position: 0 61.904762%; }\
    .ico-multiplayer { background-position: 0 66.666667%; }\
    .ico-partial-controller { background-position: 0 71.428571%; }\
    .ico-sdk { background-position: 0 76.190476%; }\
    .ico-singleplayer { background-position: 0 80.952381%; }\
    .ico-stats { background-position: 0 85.714286%; }\
    .ico-turn-notifications { background-position: 0 90.47619%; }\
    .ico-vac { background-position: 0 95.238095%; }\
    .ico-workshop { background-position: 0 100%; }\
    .sidebar--wide{max-width:336px; }\
    .steamdb{width:13px;height:13px;display:inline-block;border-width: 0px 4px 0px 0px;border-style:solid;border-color:transparent;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAACPUlEQVQokW2GPUwUQRhAP3svs3MzO7s7sz8zs5u9meXCzhH2qCTGQqM2FFirITEUWkGsJITSwprCTmMJCTQ2Bm0tJBDQQmiMP/wUWkCiF4jYQOdLXt4DAIC6rsXo6OjDpmle9/v9b03T/Gma5u/Y2NjPpmk+9Pv9F03TPKjrWgAAQLfbvV3X9fter3fS6/XOLnTOvRsZGXnsnLvjnLvnnJt3zr3qdrvXwVq7VFXVnjHmt7X2zFo7qKpqdWhoyHU6nWta67Qsy7osywljzFtr7RcQQpRKqX5RFDe01vfzPL8rpRzzPM9LkmQ8y7JnUsplKeWGlPJUa/0V4ji+KoRYjaLoOWNswvf98SAIHkVRtMw5/8U5P7swTdMfQohJqKpqwVr7MQzDBULIS0LIm3a7vUUIOSCEfD//pSiKnhhjtqqqmoeiKI7zPN9TStUAcKnValGEkG61Wh2EkEIIYQAApVSd5/leURTHkCTJihDiVAixzjmfopR2EELY9/3LCCFMCDGc8ykhxLoQ4jRJkhUoy/KW1nqHMbbr+/4RpXSfEPKJUrp+3n3f948YY7ta689lWd4EY8y2tXYnjuNhz/PGEULTnuctIISenncaY3wljuNha+2OMWYblFIHUspBlmVzaZpi+A9pmuIsy+aklAOl1AGEYTjJOd+IomgQBMEmY2yRMTZLKZ1mjM0yxhaDINiMomjAOd8Iw3ASAAAQQopSOkMIWcMYH2KMT9rt9hnG+ARjfEgIWaOUziCEFADAP5tvlu/HIunFAAAAAElFTkSuQmCC');background-size:100% 100%;background-repeat:no-repeat;vertical-align:middle;}");
  }
  if (GASmeta || isgapage){ styles.push(".meta{width:13px;height:13px;display:inline-block;border-width: 0px 4px 0px 0px;border-style:solid;border-color:transparent;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAACM0lEQVQokWWSSUgUAABFvzNZJo7lNi641KQmuaPOwIhMmZFegkCtBOkUVFKdQlOYAjEybFMrMYk0i5DSiCCCNpeoUDQp1zEPQVBYanapceJ1kErqnf/jX560DMa0eaHPcP1Vu9/4/Yumj72tPhNzfYZ2RpSrf+GEDD+HdO6MMwxLahoKykABNnwtWwiNS6C2MhTPoBrokPGPtDiks3tLLcjfjgIyCUzYypPnA8zOf6Pi5BW0MoNdRTF4Xqtx6WVEOeecoUtCaCZSNM66ZobeTnD3YTcAl9s6kU8W1UeDYUS5+vrccDMyNQ0FZrF6fTZHKmoZmZxm6+4y5BVD9YWrALR3PSHels3nbt3Wi3Y/l8xWtCqe5htd/OZh90t8I61oZSzlNY243Ytk7yzjQZP3O9275D9jDLFTvL+KN+NTxOcUcvDYaQCevhgkKM6B1iYRl1OIAmzcqV87o8ct3lMbHSUAzM4vYE7NR4qm9JATgOExF37r7CggBYXY6G41TWu+x3AreGMixfucuBc9DI+6iErLR14xFB+o4viZZlaEZ6EQK+bEdOaeGTvFmBx1lWFIyRSUHOb7DzfT7z+QkVeCTJtQYAqKsCKTnZPl4TCqPEmS560aSvZsQEomq2AfX+YWqKm/htYkIbMNmewUFcbinlLT3yI6ZPT0q/FUZQRmSwLhaTtQhAMFW4lKTKemIgJPv5oYkPf/OY1q23yP4dajllWTd877f+ppM7nmeo0djGn78t0vVQ8+T/mifr8AAAAASUVORK5CYII=');background-size:100% 100%;background-repeat:no-repeat;vertical-align:middle;}"); }
  if (isgaspage){ styles.push(".review{max-width:105px;text-overflow:ellipsis;overflow: hidden; }"); }
  var style = document.createElement('style');
  style.type = 'text/css';
  style.innerHTML = styles.join('');
  document.getElementsByTagName('head')[0].appendChild(style);
}

function cleanrating(rating, mode = false){
  if (rating.indexOf('%') !== -1){
    rating = rating.match(/%?([0-9,]+)(\s{0,1}%)?/g);
    ratinginvord = (rating[0].indexOf('%')!==-1) ? false : true;
    if (!mode){
        rating = rating[ratinginvord?1:0] + ' (' + rating[ratinginvord?0:1] + ')';
    } else {
        rating = Array((rating[ratinginvord?1:0].replace('%','')/100), Number(rating[ratinginvord?0:1].replace(',','')));
    }
  }
  return rating;
}

function geticon(rating){
  if (rating.indexOf('%') === -1){ return ""; }
  e = rating.match(/[0-9,]+/g);
  if (e.length !== 2){ return "";
  } else {
    imagetest = e[0];
    imagetest2 = e[1].replace(/,/g,'');
    if (imagetest>84 && imagetest2>=100){ var image = 5;
    } else if (imagetest>69){ var image = 4;
    } else if (imagetest>39){ var image = 3;
    } else if (imagetest>24 || imagetest2<=100){ var image = 2;
    } else { var image = 1; }
  }
  return '<span class="rating rating' + image + '" ></span>';
}

function processpage(req, hlink, change, gaid, steamstore){
  steamstore = !!steamstore ? " [Steam Store]" : "";
  ratingtest = $('div.glance_ctn_responsive_left:first div[data-tooltip-text]', req);
  ratingtest2 = $('.game_area_comingsoon:first div:first h1:first', req);
  ratingtest3 = $('.noReviewsYetTitle:first', req);
  if (req.title.indexOf('Site Error') === -1 && (!!steamstore || (!!ratingtest.length || !!ratingtest2.length || !!ratingtest3.length))){
    code = hlink.match(/[0-9]{2,6}/)[0];
    rating2 = "";
    if (!!ratingtest.length){
      rating = ratingtest[ratingtest.length === 2 ? 1 : 0].getAttribute("data-tooltip-text");
      if (ratingtest.length === 2){ rating2 = ratingtest[0].getAttribute("data-tooltip-text"); }
    } else {
      rating = ratingtest2.text()||ratingtest3.text()||"No ratings available";
    }
    meta = $('#game_area_metascore div', req);
    meta = (meta.length === 5 ? [meta[0].textContent.replace(/\s/g,""), $('#game_area_metalink a:first', meta)[0].href.split('/pc/')[1]] : "");
    saved = loaddata(code,false);
    features = $('a.name, div.DRM_notice div:first, div.DRM_notice:not(:has(*))', req).map(function() { return ((this.href!==undefined && this.href.indexOf("vrsupport")===-1)?this.href.match(/=([0-9]+)\&/)[1]:'0') + '::' + this.textContent.replace(/^\s{2,}/,'').replace(/\s{2,}/g,' '); }).get().join('\n');
    genre = $('.blockbg:first a[href*="//store.steampowered.com/genre/"]', req);
    tags = (genre.length > 0 ? genre[0].href.match(/genre\/(.+)\//)[1] + ':[' + genre[0].innerText + ']\n' : '') + $('a.app_tag', req).slice(0,5).map(function() { return (this.href!==undefined?this.href.match(/\/tags\/([a-z\-]+)/)[1]:'0') + ':' + this.textContent.replace(/\s{2,}/g,''); }).get().join('\n');
    savedata(code,{version: dbversion, rate: rating, rate2: rating2, meta: meta, time: (rating.indexOf("%")!==-1 ? (Number(cleanrating(rating).match(/[0-9,]+/g)[1].replace(/,/g,''))>=1000 ? parseInt(Date.now()/1000)+parseInt(expiretime*Math.min((Number(cleanrating(rating).match(/[0-9,]+/g)[1].replace(/,/g,'')/1000)-1),1)) : parseInt(Date.now()/1000)) : parseInt(Date.now()/1000)-expiretime+86400), features: features, tags: tags});
    if (!saved){
      dup = "";
    } else {
      dup = " (dup)";
    }
    if (!!ratingtest.length){
      log("Loaded ratings for " + hlink + dup + steamstore);
    } else if (!!ratingtest2.length){
      log("No ratings available YET for " + hlink + dup + steamstore);
    } else {
      log("No ratings available for " + hlink + steamstore);
    }
    getrating(hlink, change, gaid);
  } else if(!steamstore){
    steamstorerequest(hlink, change, gaid);
  }
}

function steamstorerequest(hlink, change, gaid){
  GM__xmlhttpRequest({
    method:  'GET',
    url:     hlink,
    headers: { 'Cookie': 'birthtime=0; mature_content=1' },
    onload:  function(req) {
      var req = new DOMParser().parseFromString(req.response, 'text/html');
      processpage(req, hlink, change, gaid, true);
    },
  });
}

function getreviewlink(id,saved){
  var dlc = saved.features.indexOf('21:');
  if(dlc !== -1){
    return 'http://store.steampowered.com/app/' + id + '/#responsive_apppage_reviewblock_ctn';
  } else {
    return 'https://steamcommunity.com/app/' + id + '/reviews/?browsefilter=toprated';
  }
}

function steamdb(rating){
    var steamdbr = cleanrating(rating, true);
    return ((steamdbr[0] - ( steamdbr[0] - 0.5 ) * Math.pow( 2, -Math.log10( steamdbr[1] + 1 ) ))*100).toFixed(2);
}

function getrating(hlink, change, gaid, toscanarray, delayed){
  var delayed = delayed||false;
  var toscanarray = toscanarray||[];
  var code = hlink.match(/[0-9]{2,6}/)[0];
  var saved = loaddata(code,false);
  if (delayscan>=100 && !delayed && toscanarray.indexOf(code)>0 && (!saved || (expiretimeenabled && parseInt(Date.now()/1000)-expiretime >= saved.time))){
      setTimeout(function(){ getrating(hlink, change, gaid, toscanarray, true); }, delayscan*toscanarray.indexOf(code));
      return false;
  }
  if(!!saved){
    if (expiretimeenabled && parseInt(Date.now()/1000)-expiretime >= saved.time){
      log("Cache expired [ " + hlink + " ]");
      GM__deleteValue(code);
      getrating(hlink, change, gaid);
    } else if (saved.version !== dbversion){
      log("Different dbversion on cache [ " + hlink + " ]");
      GM__deleteValue(code);
      getrating(hlink, change, gaid);
    } else {
      rating = saved.rate;
      rating2 = saved.rate2;
      meta = saved.meta;
      if (isgapage){
        sidebarwide = $(document.getElementsByClassName('sidebar--wide')[0]);
        if (GAratings){
            sidebarwide.append(
                '<h3 class="sidebar__heading">Steam Reviews</h3><ul class="sidebar__navigation"><li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link" href=' + getreviewlink(code,saved) + ' rel="nofollow" target="_blank">' + geticon(cleanrating(rating)) + '<span style="text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">' + rating + '</span></a></li>' +
                ( rating2 !== "" ? '<li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link" href=' + getreviewlink(code,saved) + ' rel="nofollow" target="_blank">' + geticon(cleanrating(rating2)) + '<span style="text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">' + rating2 + '</span></a></li>' : "") +
                '<li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link" href="https://steamdb.info/app/' + code + '/" rel="nofollow" target="_blank"><span class="steamdb"></span><div class="sidebar__navigation__item__name">SteamDB Formula</div><div class="sidebar__navigation__item__underline"></div><div class="sidebar__navigation__item__count">' + steamdb(rating) + '%</div></a></li>' + 
                ( meta !== "" ? '<li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link" href="http://www.metacritic.com/game/pc/' + meta[1] + '" rel="nofollow" target="_blank"><span class="meta"></span><div class="sidebar__navigation__item__name">metacritic</div><div class="sidebar__navigation__item__underline"></div><div class="sidebar__navigation__item__count">' + meta[0] + '/100</div></a></li>' : "") + '</ul>'
            );
        }
        if (!!GAfeatures && !!saved.features){
          if(GAfeatures === 2){
            sidebarwide.append('<h3 class="sidebar__heading">Steam Features</h3><ul class="sidebar__navigation"></ul>');
            var a = saved.features.split('\n');
            for (var i=0; i<a.length; i++){
              featuresid = a[i].split('::')[0];
              var img = (featuresid!=='0'&&!isNaN(featuresid)?'<img class="category ' + featuresicons[featuresid].replace('_','-').toLowerCase() + '"></img> ':'');
              var link = (featuresid!=='0'&&!isNaN(featuresid)?' href="http://store.steampowered.com/search/?category2=' + featuresid + '&category1=' + featuresid +'&category3=' +  featuresid +'"':'');
              $('ul:last', sidebarwide).append('<li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link"' + link + '><div class="sidebar__navigation__item__name">' + img + a[i].split('::')[1] + '</div></a></li>');
            }
          } else if(GAfeatures === 1){
            change.parentElement.title = saved.features.replace(/\b[0-9]+:/g,'');
          }
        }
        if(!!GAtags && !!saved.tags){
          if(GAtags === 2){
            sidebarwide.append('<h3 class="sidebar__heading">Steam Genre/Tags</h3><ul class="sidebar__navigation"></ul>');
            var a = saved.tags.split('\n');
            for (var i=0; i<a.length; i++){
              $('ul:last', sidebarwide).append('<li class="sidebar__navigation__item"><a class="sidebar__navigation__item__link" href="' + (a[i].indexOf('[')===-1?'http://store.steampowered.com/tags/' + a[i].split(':')[0] + '/' + a[i].split(':')[1]:'http://store.steampowered.com/genre/'+a[i].split(':')[0]) + '/" rel="nofollow" target="_blank"><div class="sidebar__navigation__item__name">'+ a[i].split(':')[1] + '</div></a></li>');
            }
          } else if (GAtags === 1){
            change.parentElement.title += (!!change.parentElement.title?'\n\n':'') + saved.tags.replace(/\b.+:/g,'');
          }
        }
        var title = change.parentElement.title;
        if(!!title){
          $(document.getElementsByClassName('sidebar__heading')).filter(':contains("Steam")').attr('title', title).next('ul').attr('title', title);
        }
      } else {
        if (gaid===0 && run === 0 && !!document.getElementById('ui-id-1')){ run++; getfeaturedga(); }
        if (GASmeta && meta !== "" && (!sgplusgrid || change.parentElement.parentElement.className.indexOf('pinned-giveaways__inner-wrap') !== -1)){
          change.getElementsByClassName('giveaway__columns')[0].children[0].outerHTML += '<div><a href="http://www.metacritic.com/game/pc/' + meta[1] + '" rel="nofollow" target="_blank"><img class="meta"></img><span>' + meta[0] + '/100</div></a></div>';
        }
        rating = cleanrating(rating);
        if(usesteamdb && rating.indexOf('%') !== -1){
            rating = Math.round(steamdb(rating)) + "%" + rating.split('%')[1];
        }
        image = geticon(rating);
        if (GASratings){
          if (!sgplusgrid || change.parentElement.parentElement.className.indexOf('pinned-giveaways__inner-wrap') !== -1){
            change.getElementsByClassName('giveaway__columns')[0].children[0].outerHTML += '<div class="review"><a href=' + getreviewlink(code,saved) + ' rel="nofollow" target="_blank">' + image + rating + '</a></div>';
          } else if (rating.indexOf('%') !== -1){
            if(change.className === "giveaway__row-inner-wrap"){
              change.getElementsByClassName('fa fa-clock-o')[0].outerHTML = image + rating.split(' ')[0] + ' ' + change.getElementsByClassName('fa fa-clock-o')[0].outerHTML;
            } else {
              change.parentElement.getElementsByClassName('fa fa-clock-o')[0].outerHTML = image + rating.split(' ')[0] + ' ' + change.parentElement.getElementsByClassName('fa fa-clock-o')[0].outerHTML;
            }
          }
        }
        if (!!saved.features || !!saved.tags){
            if (betaTitle){
                change.getElementsByClassName("review")[0].onmouseenter = function(){ betaTitleIn(this,saved.features,saved.tags) };
                change.getElementsByClassName("review")[0].onmouseleave = function(){ betaTitleOut(this) };
            } else if (GASfeatures){
                change.parentElement.title = saved.features.replace(/\b[0-9]+::/g,'') + (GAStags?(!!saved.features ? '\n\n':'')+saved.tags.replace(/\b.+:/g,''):'');
            }
        }
        if(hidereviews>0 && !issearchpage && change.className === "giveaway__row-inner-wrap" && image !== "" && image.match(/[0-9]/)[0] <= hidereviews){
          change.parentElement.style.display = "none";
        }
      }
    }
  } else {
      steamstorerequest(hlink, change, gaid);
  }
}

function getfeaturedga(){
  if (GASratings || GASfeatures){
    var code = false;
    var test1 = document.getElementsByClassName('featured__inner-wrap')[0].getElementsByTagName('img');
    if (!!test1.length && test1[0].src.indexOf('/apps/') !== -1){
      var code = test1[0].src.match(/[0-9]{2,6}/)[0];
    } else {
      var test2 = $(document.getElementsByClassName('giveaway__heading__name')).filter('[href$="'+document.getElementsByClassName('featured__inner-wrap')[0].getElementsByTagName('a')[0].href.replace(/.*\/giveaway\/.{5}/,'')+'"]:first');
      if (!!test2.length){
        var test2b = $(test2[0].parentElement.getElementsByClassName('giveaway__icon')).filter('[href*="/app/"]:first');
        if (!!test2b.length){
            var code = test2b[0].href.match(/[0-9]{2,6}/)[0];
        }
      }
    }
    if (!!code){
      var saved = loaddata(code,false);
      if (!!saved){
        if (GASmeta){
          var meta = saved.meta;
          if(meta !== ""){
            document.getElementsByClassName('featured__column')[0].outerHTML += '<div class="featured__column text-left"><a href="http://www.metacritic.com/game/pc/' + meta[1] + '" rel="nofollow" target="_blank"><img class="meta"></img><span>' + meta[0] + '/100</div></a></div>';
          }
        }
        if (GASratings){
          var rating = cleanrating(saved.rate);
          var image = geticon(rating);
          document.getElementsByClassName('featured__column')[0].outerHTML += '<div class="featured__column text-left"><a href=' + getreviewlink(code,saved) + ' rel="nofollow" target="_blank">' + image + rating + '</a></div>';
        }
        if (GASfeatures && (saved.features || !!saved.tags)){
          document.getElementsByClassName('featured__inner-wrap')[0].title = saved.features.replace(/\b[0-9]+::/g,'') + (GAStags?(!!saved.features ? '\n\n':'')+saved.tags.replace(/\b.+:/g,''):'');
        }
      }
    }
  }
}

function scangas(element){
  a = $('a.giveaway__icon[href*="/app/"]', 'div.pinned-giveaways__inner-wrap').length;
  if (timer){ console.time('SG Ratings pageLoad'); }
  var list = GM__listValues();
  var total = [];
  if (delayscan>=100){
      for (var i=0; i<element.length; i++){
          var code = element[i].href.match(/[0-9]{2,6}/)[0];
          var scan = (list.indexOf(code) !== -1);
          var expired = (!loaddata(code,false)||(expiretimeenabled && !!loaddata(code,false) && parseInt(Date.now()/1000)-expiretime >= loaddata(code).time));
          if (expired && total.indexOf(code)===-1){ total.push(code); }
      }
  }
  for (var i=0; i<element.length; i++){
    var code = element[i].href.match(/[0-9]{2,6}/)[0];
    var scan = (list.indexOf(code) !== -1);
    var expired = (expiretimeenabled && !!loaddata(code,false) && parseInt(Date.now()/1000)-expiretime >= loaddata(code).time);
    if (scan && toscan.indexOf(code)===-1){
      if (expired){ toscan.push(code); }
      getrating(element[i].href, element[i].parentElement.parentElement.parentElement,i-a,total);
    } else if(toscan.indexOf(code)===-1 && !expired){
      toscan.push(code);
      getrating(element[i].href, element[i].parentElement.parentElement.parentElement,i-a,total);
    } else {
      (function myLoop (i,element,code) {
        setTimeout(function () {
          if (!!GM__getValue(code,false)){
            log('Avoided (Dup) for ' + element.href);
            getrating(element.href, element.parentElement.parentElement.parentElement,10,total);
            i=1;
          }
          if (--i) myLoop(i,element,code);
        }, 2000);
      })(60,element[i],code);
    }
  }
}

if (isgaspage && (GASratings || GASfeatures || GAStags)){
  setTimeout(function(){
    sgplus = !!$('a.nav__row.SGPP__settings:first').length;
    sgplusgrid = (sgplus ? !!$('div.SGPP__gridView:first').length : false);
    if (sgplusgrid){ log('SG++ using Grid view'); }
    sgplus = (sgplus ? (JSON.parse(localStorage.SGPP_Settings||false).EndlessScrollGiveaways||{enabled:false}).enabled : false);
    extendedsg = !!$(document.getElementsByClassName('page-loading')).filter('[src*="Extended_Steamgifts"]').length;
    esgst = document.querySelector('div[class*="esgst-es-page"]');
    scangas($(document.getElementsByClassName('giveaway__icon')).filter('a[href*="/app/"]'));
    if(sgplus || extendedsg){
      log((sgplus ? 'SG++' : extendedsg ? 'Extended SteamGifts' : 'ESGST') + ' using endless scroll');
      log('Starting observer (Endless scroll compatibility)');
      var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
          var element = ( !sgplus ? $(mutation.addedNodes).filter('div:not([class])') : $(mutation.addedNodes).filter('div.table__heading'));
          if (element.length === 1){
            var element = $('a.giveaway__icon[href*="/app/"]', ( !sgplus ? element : element.parent().filter('div:not([class])')));
            if (element.length !== 0){ scangas(element); }
          }
        });
      });
      observer.observe(document.getElementsByClassName('widget-container')[0].children[1], { childList: true, subtree: sgplus });
    } else if (!!esgst){
      log('ESGST using endless scroll');
      log('Starting observer (Endless scroll compatibility)');
      var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
          var elements = $(mutation.addedNodes);
          for (var i=0; i<elements.length; i++){
            var element = $('a.giveaway__icon[href*="/app/"]', elements[i]);
            if (element.length===1){
              scangas(element);
            }
          }
        });
      });
      observer.observe(esgst.parentNode, { childList: true, subtree: false });
    }
  }, 20);
} else if (isgapage && (GAratings || (GAfeatures===1||GAfeatures===2) || (GAtags===1||GAtags===2))) {
  var link = document.getElementsByClassName('global__image-outer-wrap--game-large');
  if (link.length !== 0){
    if (link[0].href.indexOf('store.steampowered.com/app/') !== -1){
      getrating(link[0].href, link[0].parentElement);
    }
  }
}

setTimeout(function(){ if(timer){ console.timeEnd('SG Ratings'); } }, 0);
if (timer) console.timeEnd('SG Ratings Internal');