K1ll3rM / FileRefresh

// ==UserScript==
// @name         FileRefresh
// @version      1.0.1
// @description  Allows you to refresh all Scripts, Link tags (including stylesheets), Img tags or all 3 on the page without full refresh. Also adds a timestamp to force cache reset. To refresh you can either press the buttons added in the menu or press Alt + F5 for the refresh all option
// @author       Michel Jonkman
// @copyright    2018, Michel Jonkman
// @license      MIT
// @include      *
// @require      http://code.jquery.com/jquery-3.2.1.min.js
// @grant        GM_registerMenuCommand
// ==/UserScript==

GM_registerMenuCommand('Refresh Javascript', JSRefresh, 'r');
GM_registerMenuCommand('Refresh Link tags(stylesheets)', CSSRefresh, 'r');
GM_registerMenuCommand('Refresh Images', ImgRefresh, 'r');
GM_registerMenuCommand('Refresh All above', all, 'r');

$(document).keydown(function (e) {
  var evtobj = window.event ? event : e;

  if (evtobj.keyCode === 116 && evtobj.altKey) {
    all();
  }
});

function JSRefresh() {
  $('script').each(function (index, value) {

    var extra = '';

    $(value.attributes).each(function (index, node) {
      if (node.nodeName === 'src') {
        var src;

        if (node.nodeValue.indexOf('refreshTimestamp=') >= 0) {
          src = node.nodeValue.substr(0, node.nodeValue.lastIndexOf("="));
          src = src + '=' + Math.floor(Date.now() / 1000);
        }
        else if (node.nodeValue.indexOf('?') < 0) {
          src = node.nodeValue + '?refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }
        else {
          src = node.nodeValue + '&refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }

        extra += ' ' + node.nodeName + '="' + src + '"';
      }
      else {
        extra += ' ' + node.nodeName + '="' + node.nodeValue + '"';
      }
    });

    $(value).replaceWith('<script' + extra + '></script>');
  });
}

function CSSRefresh() {
  $('link').each(function (index, value) {

    var extra = '';

    $(value.attributes).each(function (index, node) {
      if (node.nodeName === 'href') {
        var src;

        if (node.nodeValue.indexOf('refreshTimestamp=') >= 0) {
          src = node.nodeValue.substr(0, node.nodeValue.lastIndexOf("="));
          src = src + '=' + Math.floor(Date.now() / 1000);
        }
        else if (node.nodeValue.indexOf('?') < 0) {
          src = node.nodeValue + '?refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }
        else {
          src = node.nodeValue + '&refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }

        extra += ' ' + node.nodeName + '="' + src + '"';
      }
      else {
        extra += ' ' + node.nodeName + '="' + node.nodeValue + '"';
      }
    });

    $(value).replaceWith('<link' + extra + '>');
  });
}

function ImgRefresh() {
  $('img').each(function (index, value) {

    var extra = '';

    $(value.attributes).each(function (index, node) {
      if (node.nodeName === 'src') {
        var src;

        if (node.nodeValue.indexOf('refreshTimestamp=') >= 0) {
          src = node.nodeValue.substr(0, node.nodeValue.lastIndexOf("="));
          src = src + '=' + Math.floor(Date.now() / 1000);
        }
        else if (node.nodeValue.indexOf('?') < 0) {
          src = node.nodeValue + '?refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }
        else {
          src = node.nodeValue + '&refreshTimestamp=' + Math.floor(Date.now() / 1000);
        }

        extra += ' ' + node.nodeName + '="' + src + '"';
      }
      else {
        extra += ' ' + node.nodeName + '="' + node.nodeValue + '"';
      }
    });

    $(value).replaceWith('<img' + extra + '>');
  });
}

function all() {
  JSRefresh();
  CSSRefresh();
  ImgRefresh();
}