// ==UserScript==
// @name ABP Digest: Open in pop-in
// @namespace lainscripts_abp_digest_popin
// @description Opens reports in pop-in window.
// @include *://reports.adblockplus.org/*
// @version 0.1
// @grant none
// @run-at document-start
// ==/UserScript==
/* jshint esnext: true */
(()=>{
'use strict';
var inIframe = (function(){ try { return window.self !== window.top; } catch (ignore) { return true; } })();
// attach styles before document displayed
(function(style) {
style.id = 'popinStyles';
style.type = 'text/css';
document.head.appendChild(style);
style.sheet.insertRule('@keyframes spinnerFrames {0% {transform:rotate(0deg)} 100% {transform:rotate(-360deg)}}',0);
style.sheet.insertRule('#popinSpinner svg {'+
['animation: spinnerFrames linear 1s',
'animation-iteration-count: infinite',
'transform-origin: 50% 50%'].join(';')+'}', 0);
style.sheet.insertRule('#popinBackground {'+
['box-sizing: border-box',
'position: fixed',
'top: 0',
'left: 0',
'padding: 35px 40px',
'width: 100%',
'height: 100%',
'background-color: rgba(0,0,0,0.85)',
'z-index: 1000000',
'display: none'].join(';')+'}', 0);
style.sheet.insertRule('#popinFrame {'+
['position: relative',
'width: 100%',
'height: 100%',
'border: #aaa 2px solid',
'border-radius: 3px',
'background-color: rgba(0,0,0,0.33)',
'z-index: 1'].join(';')+'}', 0);
style.sheet.insertRule('#popinSpinner {'+
['position: fixed',
'top: 50%',
'left: 50%',
'margin-top: -50px',
'margin-left: -50px',
'width: 100px',
'height: 100px',
'z-index: 2'].join(';')+'}', 0);
// modify navigation elements when various pages are loaded in the pop-in
if (inIframe) {
// make page cover the entire window height and reset padding with margin if someone changed them
style.sheet.insertRule('html, body {'+['height: 100%',
'padding: 0!important',
'margin: 0!important'].join(';')+'}', 0);
// let that status block at the top grow
style.sheet.insertRule('#overview th, #overview td { max-width: none !important }', 0);
}
})(document.createElement('style'));
function createSVGSpinner(out_radius, in_radius, width, number_of_lines, period, direction) {
var num = number_of_lines, shift = out_radius + width / 2, step = 0;
var nameSpace = 'http://www.w3.org/2000/svg';
var svg = document.createElementNS(nameSpace, 'svg');
svg.setAttribute('version', '1.1');
svg.setAttribute('x', '0px');
svg.setAttribute('y', '0px');
svg.setAttribute('width', (2 * shift) + 'px');
svg.setAttribute('height', (2 * shift) + 'px');
svg.setAttribute('style', ['stroke: #fff',
'stroke-width: ' + width + 'px',
'stroke-linecap: round'].join(';'));
var g = document.createElementNS(nameSpace, 'g');
svg.appendChild(g);
var line;
while (num--) {
if (direction >= 0) step = num; else step = number_of_lines - num;
line = document.createElementNS(nameSpace, 'line');
line.setAttribute('x1', shift + Math.cos(2 * Math.PI / number_of_lines * num) * in_radius);
line.setAttribute('y1', shift + Math.sin(2 * Math.PI / number_of_lines * num) * in_radius);
line.setAttribute('x2', shift + Math.cos(2 * Math.PI / number_of_lines * num) * out_radius);
line.setAttribute('y2', shift + Math.sin(2 * Math.PI / number_of_lines * num) * out_radius);
line.setAttribute('stroke-opacity', 1 / (num + 1));
g.appendChild(line);
}
return svg;
}
function popinObj() {
/* jshint validthis: true */
var _self = this;
_self.childPopin = null;
var spinner = document.createElement('div');
spinner.appendChild(createSVGSpinner(45, 25, 10, 10, 1.8, -1));
spinner.id = 'popinSpinner';
var popin = document.createElement('div');
popin.id = 'popinBackground';
var ifrm = null;
var openFrame = function (a) {
var url = a.href;
var ifr = document.createElement('iframe');
ifr.id = 'popinFrame';
ifr.onload = function() { spinner.style.zIndex = 0; };
// Hide spinner if page keeps loading after a 5 seconds
setTimeout(function() {
if (popin.style.display === 'block')
spinner.style.zIndex = 0;
}, 5000);
ifr.src = url;
return ifr;
};
popin.appendChild(spinner);
document.body.appendChild(popin);
_self.show = function (a) {
document.body.style.overflowY = 'hidden';
ifrm = openFrame(a);
popin.appendChild(ifrm);
popin.style.display = 'block';
};
_self.hide = function () {
document.body.style.overflowY = 'auto';
popin.removeAttribute('style');
spinner.removeAttribute('style');
ifrm.parentNode.removeChild(ifrm);
ifrm = null;
};
popin.onclick = _self.hide;
}
document.addEventListener ("DOMContentLoaded", function() {
document.popin = new popinObj();
document.body.addEventListener('click', function(e) {
var t = e.target;
// handle only LMB clicks
if (e.which !== 1)
return;
// try to drill up to an A element if present
while (t.parentNode && !t.href)
t = t.parentNode;
// if user clicked a link - try to handle it properly
if (t.href) {
if (!inIframe && t.hostname === document.location.hostname) {
document.popin.show(t);
e.preventDefault();
} else {
t.target = '_blank';
}
}
});
});
})();