// ==UserScript==
// @name EnstylerJS
// @namespace Enstyler
// @description MyDealz Enstyler Frontend and enhanced features
// @include http://www.mydealz.de/*
// @include https://www.mydealz.de/*
// @version 2.10.304
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_log
// @grant GM_xmlhttpRequest
// @require http://code.jquery.com/jquery-latest.js
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// ==/UserScript==
// ========== RUN EnstylerJS =====================================
function EnstylerJS () {
// create object for enstyler "Menu Button"
var input = document.createElement('input');
input.type = 'button';
input.value = 'Enstyler';
input.onclick = showEnstylerConfig;
// add Enstyler Button to ...
var myElement;
if (GM_config.get('enConfMain')) {
// add button to MainNav
var Elements = document.getElementsByClassName("navMenu-trigger");
myElement = Elements[0];
input.className = 'nav-link-text vAlign--all-m';
} else {
// add button to SubNav
myElement = document.getElementById('tour-filter');
input.className = 'box--all-i subNavMenu-link';
input.setAttribute('style', 'font-size: 1.28571em; font-weight: 700; top: 3px; left: -0.7em');
}
// only if myElement exist
if (myElement !== null) {
myElement.appendChild(input);
}
// hide Enstyler2 CSS (c) text because we have a button now
addStyleString('.threadWidget-footer::after {display: none !important};');
// basic config panel formatting, everything else is formatted by enstyler
var enCSS = ['#GM_config { left: 5% !important; top: 5% !important; height: auto !important; min-width: 19em; max-width: 33em !important;}',
'#GM_config input[type=button], #GM_config button { border: 1px solid; margin: 0.5em 0em 0.2em 1em; padding: 0.1em;}',
'#GM_config .reset { font-size: 9pt; padding-right: 1em; }',
].join(" ");
addStyleString(enCSS);
}
// ========= END INIT, we are ready to go ===============================
// ============ functions to modify page content =============================
// REGEX to detect external URL
var REGEX_THREAD = /^https?:\/\/www\.mydealz\.de\/visit\/thread(image)?\/\d+$/;
var REGEX_DESC = /^https?:\/\/www\.mydealz\.de\/visit\/threaddesc\/\d+\/\d+$/;
var REGEX_COMMENT = /^https?:\/\/www\.mydealz\.de\/visit\/comment\/\d+\/\d+$/;
var REGEX_AMAZONMOB = /^https?:\/\/www\.amazon\..*\/gp\/aw\/.*$/;
//var REGEX_AMAZON = /^https?:\/\/www\.amazon\..*$/;
// abfangen aller links mit jQuery
// wird genutzt zum filtern und
$('a').bind('click', function(){
var url = this.href;
// externer Link mit Redirect ...
// Match REDIRECT URLs and open new Window with finalUrl
if (GM_config.get('enConfFilterLink') && url.match(REGEX_THREAD) || url.match(REGEX_DESC) || url.match(REGEX_COMMENT)) {
// Workaround: pre open window because of popup blockers
// Workaround: if GM_xmlhttpRequest is not availible
var asyncWindow = window.open(url, '_blank');
//* GM_xmlhhtpREquest not supported by firefox mobile :-(((
// now lookup redirecd external URL ...
// alert("external URL detected");
GM_xmlhttpRequest({
method: 'GET',
url: url,
// here we get the final URL from redirect
onload: function (response) {
// process final URL
var newUrl = response.finalUrl;
//alert(newUrl);
// lets see ...
if (newUrl.match(REGEX_AMAZONMOB)) {
newUrl = newUrl.replace("/gp/aw/d/", "/dp/");
newUrl = newUrl.replace("/gp/aw/ol/", "/gp/offer-listing/");
//alert("Amazon rewritten URL: " + newUrl);
}
// load processed URL in preopened window
asyncWindow.location = newUrl;
}
});
// return without link processing by Browser - END GM_xmlhttpRequest */
return false;
}
// return with link processing in Browser
return true;
});
// ============= GM_config functions =======================================
// define GM_config elements
var fieldDefs = {
// Part one: load external content --------
'enstyler': {
'section': ['additonal features for Enstyler', ''],
'label': 'Install / Update CSS...', // Appears on the button
'type': 'button', // Makes this setting a button input
'click': function() { // Function to call when button is clicked
showUrl('https://userstyles.org/styles/128262#style-info'); }
},
/*
'mobileRedirect': {
'label': 'Amazon mobile redirect...', // Appears on the button
'type': 'button', // Makes this setting a button input
'click': function() { // Function to call when button is clicked
showUrl('https://greasyfork.org/de/scripts/19700'); }
}, // */
'dontCookies': {
'label': 'Mozilla no cookies...', // Appears on the button
'type': 'button', // Makes this setting a button input
'click': function() { // Function to call when button is clicked
showUrl('https://addons.mozilla.org/de/addon/i-dont-care-about-cookies/'); }
},
// part two: EnstylerJS internal configuration options ------
'hidden1': { // display next section, dont kow why ...
'section': ['Configuration', ''],
'type': 'hidden', // Makes this setting a hidden input
'value': 'Some hidden value' // Value stored
},
// postion of enstyler "button"
'enConfMain': {
'label': 'Enstyler in MainNav', // Appears next to field
'type': 'checkbox', // Makes this setting a checkbox input
'default': false // Default value if user doesn't change it
},
// enable filtering of external links
'enConfFilterLink': {
'label': 'Amazon mobile redirect', // Appears next to field
'type': 'checkbox', // Makes this setting a checkbox input
'default': true // Default value if user doesn't change it
},
// display copy message at end of section ...
'copy': {
'section': ['', '(c) Gnadelwartz - <a target="blank" href="https://www.mydealz.de/diskussion/enstyler2-style-your-mydealz-incl-pepper-sites-736219">Enstyler2 - Style your MyDealz</a>'],
'type': 'hidden', // Makes this setting a hidden input
'value': 'Some hidden value' // Value stored
},
};
// display GM_copnfig as div, so we cam apply CSS!!
var frame = document.createElement('div');
document.body.appendChild(frame);
GM_config.init(
{
id: 'GM_config',
title: 'EnstylerJS - Settings',
fields: fieldDefs,
// relaod page on close
'events': // Callback functions object
{
//'init': function() { alert('onInit()'); },
//'open': function() { alert('onOpen()'); },
//'save': function() { alert('onSave()'); },
'close': function() { location.reload(); },
//'reset': function() { alert('onReset()'); }
},
'frame': frame // Element used for the panel
}
);
// EnstylerJS Config Panel anzeigen
function showEnstylerConfig() {
GM_config.open();
}
//=========== Support functions for actual use =======
// display website in external window
function showUrl(str) {
var myDeco = "innerheight=800,innerwidth=600";
var myName = "enstyler";
// workaround for not working window.focus(): close an existing window first
var myWindowShow = window.open('', myName, "width=100,height=100").close();
myWindowShow = window.open(str, myName, myDeco);
}
// add CSS in to document
function addStyleString(str) {
var node = document.createElement('style');
node.innerHTML = str;
document.body.appendChild(node);
}
// sleep time expects milliseconds, then execute code
// NOTE: code runs in parallel (asnyc)!
// Usage!
// sleepAsync(500).then(() => {
// Do something after the sleep!
// });
function sleepAsync (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
// ============== INIT EnstyerJS =============
EnstylerJS();