// ==UserScript==
// @name GMX standalone window view
// @name:de GMX Standalone-Fensteransicht
// @name:fr GMX email - fenêtre séparée
// @namespace https://github.com/Procyon-b
// @version 0.9.4
// @description Set option to open email in standalone window (gmx / web.de)
// @description:de Stellen Sie die Option so ein, dass E-Mails im eigenständigen Fenster geöffnet werden (gmx / web.de)
// @description:fr Réactiver l'ouverture des emails dans une fenêtre popup (gmx / web.de)
// @author Achernar
// @match https://3c.gmx.net/mail/client/*
// @match https://3c-bap.gmx.net/mail/client/*
// @include https://3c-bs.gmx.tld/mail/client/*
// @match https://3c.web.de/mail/client/*
// @match https://3c-bap.web.de/mail/client/*
// @run-at document-start
// @grant GM_setValue
// @grant GM_getValue
// @grant window.close
// ==/UserScript==
(function() {
"use strict";
var ML, MLp, R, tb, v=0;
if ( /^\/mail\/client\/(home|folder|search|spa\/list|mailSearch)/.test(location.pathname) ) document.addEventListener('DOMContentLoaded', function(){
const maxRetry=100;
var e, r, retry=maxRetry;
function toggle(ev) {
if (!e) return;
var v=(typeof ev == 'object')? !phx.vars.enableStandaloneView : ev;
e.checked=v;
if (phx && phx.vars) phx.vars.enableStandaloneView=v;
try{
GM_setValue('option', v);
}catch(er){
window.sessionStorage._popup_=v;
}
}
function addChk() {
r=document.querySelector('.widget.menubar .button-container.left, webmailer-mail-list, webmailer-mail-search');
var OE;
// new design?
if (r && ['WEBMAILER-MAIL-LIST', 'WEBMAILER-MAIL-SEARCH'].includes(r.nodeName) ) {
R=r;
// do we have style to inject?
if (styles.R) {
addSt(R.shadowRoot, styles.R);
delete styles.R;
}
r=r.shadowRoot.querySelector('list-toolbar');
tb=r;
if (r) r=r.shadowRoot.querySelector('.list-toolbar__left');
}
if (!(r)) {
if (retry--) {
setTimeout(addChk,100);
}
return;
}
if (R) {
OE=document.createElement('div');
OE.className=r.firstElementChild.className;
OE.style='order: 9;';
}
retry=maxRetry;
e=document.createElement('input');
e.type='checkbox';
e.id='standaloneView';
e.title='Standalone view';
e.style='margin-top: 6px; order: 9;';
if (OE) OE.appendChild(e);
r.appendChild(OE || e);
e.onclick=toggle;
try{
toggle(GM_getValue('option',true));
}catch(er){
let v=window.sessionStorage._popup_;
if (v === undefined) v=true;
else v=JSON.parse(v);
toggle(v);
}
if (window !== top) (document.querySelector('.mail-list__container #mail-head') ||
document.querySelector('webmailer-mail-list') || document).addEventListener('click', function(ev){
if ( (ev.target.id.substr(-10)=='fullscreen') && ev.ctrlKey) {
ev.stopPropagation();
let mId=ev.target.parentNode.querySelector('[href*="mailId"]');
if (mId && /mailId=([^&]+)/.exec(mId)) openW(RegExp.$1);
}
}, true);
watchFC();
}
addChk();
const obs = new MutationObserver(function(mutL){
for (let mut of mutL) {
for (let el of mut.addedNodes) {
if (el.classList && el.classList.contains('menubar')) {
r=document.querySelector('.widget.menubar .button-container.left');
addChk();
return;
}
}
}
});
ML=document.querySelector('#panel-mail-table .panel-body form');
if (ML) {
obs.observe(ML, {subtree: false, childList: true, attributes: false} );
}
function watchFC() {
// new layout 2023-02
if (R) {
MLp=R.shadowRoot.querySelector('list-mail-list')
ML=MLp.shadowRoot;
}
// previous (other gmx TLDs)
if (!ML) ML=document.querySelector('#panel-mail-table .panel-body form');
ML.addEventListener('click', function(ev){
if (!phx.vars.enableStandaloneView) return;
var tg=ev.target, li;
if (tg.classList.contains('mail-open')
|| ( (tg.classList.contains('hoverMenu-icon') || tg.classList.contains('hover-menu-element') ) && ( (li=tg.closest('li')) && li.dataset.oaoHover=='open' ))
|| (R && tg.classList.contains('list-mail-item__fullscreen')) ) {
ev.stopPropagation();
let mId=tg.closest('tr[data-oao-mailid]');
let F;
if (mId) mId=mId.attributes['data-oao-mailid'].value;
// design 2023-02
else {
mId=tg.closest('list-mail-item, search-list-item');
if (mId) {
F=mId.querySelector('.list-mail-item__folder');
mId=mId.id;
F=F && F.title && findFol(F.title);
}
}
openW(mId, F);
}
},
{capture: true} );
}
function openW(mId, F, TO) {
if (!TO) {
// ensure that it opens a popup and not a tab
setTimeout(function(){openW(mId, F, 1);}, 0);
return;
}
F=F || document.querySelector('.folder.active');
F=F && F.id;
let u=location.origin+location.pathname.replace(/search\/[^;]+;/,'folder;')+'?folderId='+F+'#';
u=location.origin+location.pathname.replace(/(spa\/|mailSearch)[^;]*;/,'home;')+'?folderId='+F+'#';
let w=Math.min( Math.max(1024, ML.scrollWidth || tb.scrollWidth) ,1400);
if (R) mId=mId.replace(/^tmai/, 'id');
window.open(u, 'tmai-'+mId ,'width='+w+',height=600');
}
});
function findFol(f) {
var r, a=f.split('/');
if (a.length > 1) {
r=document.querySelector('.mail-directory > li[data-webdriver="'+a[0]+'"]');
for (let i=1; i < a.length; i++) {
if (r) r=r.querySelector(':scope > ul > li > .folder > a[title^="'+a[i]+'"]');
if (r) r=r.closest('li');
}
if (r) r=r.querySelector(':scope > .folder');
}
else {
r=document.querySelector('.mail-directory > li > .folder > a[title^="'+a[0]+'"]');
if (r) r=r.closest('.folder');
}
return r;
}
function addSt(r,s,t) {
let st=document.createElement('style');
try{
(r || document.head || document.documentElement).appendChild(st);
st.innerText=s;
}catch(e){
if (t) document.addEventListener('DOMContentLoaded',function(){addSt(r,s);});
else setTimeout(function(){addSt(r,s,t);},0);
}
}
var styles={};
if (window.name && (window.name.length>=20) && window.name.startsWith('tmai-') ) {
let mId=/^(?:tmai-)?(.*)/.exec(window.name)[1];
let fId=/folderId=([^&]*)/.exec(location.search)[1];
let h='#action/mailDisplay/mailId/'+mId+'/page/0';
window.onhashchange=function(){
if (location.href.includes('#') && (location.hash != h) ) location.hash=h;
}
if (location.href.includes('#')) {
location.hash='#';
location.hash=h;
}
addSt(null, '#navigation, #section-0, .section-1 .prev, .section-1 .next, .section-1 .menubar, .ad, div#mail-instant-reply, #maillist, #selectionCountMessage, webmailer-mail-list .mail-info > ul.icons {display: none !important;} .section-1 {left: 0 !important;} .mail-display-wrapper {top: 0 !important;left: 0 !important;} html.can-have-sky .section-content {margin-right: 0 !important;} .section-1 > .section-container {bottom:0 !important;} div#system-message > div {display: block !important}');
styles={
'R':':host list-toolbar, :host list-mail-list {display:none;}',
};
var retryWSR=300;
function showWithSR() {
if (!ML) {
setTimeout(showWithSR, 20);
return;
}
var e=ML.querySelector('list-mail-item#'+mId);
if (!e) {
let a=ML.querySelectorAll('list-mail-item:not(.seen)');
if (a.length) {
a.forEach((e)=>e.classList.add('seen'));
let b=ML.querySelector('list-paging-footer input ~ button');
b.click();
setTimeout(showWithSR, 200);
return;
}
}
if (e) e.click();
else if (--retryWSR) setTimeout(showWithSR, 20);
}
function ready() {
// design 2023-02 ?
if (!ML) {
// click() must be set
setTimeout(function(){
document.querySelector('.folder#'+fId+' > .label').click();
showWithSR();
}, 0);
}
let c=50;
function setTitle() {
let t=document.querySelector('.section-1 .mail-subject dd');
if (t) {
document.title=document.title.split('-')[0]+' - '+t.innerText;
t=document.querySelectorAll('[id$="fullscreen"]');
// more than one button
for (let i=0; i < t.length; i++) {
t[i].addEventListener('click', function(ev){
ev.stopPropagation();
window.close();
}, {capture: true});
}
let t2=document.querySelector('#mail-detail');
if (t2) t2.focus();
}
else c-- && setTimeout(setTitle, 100);
}
setTitle();
document.body.addEventListener('click', function(ev){
if (ev.target.id=='fullscreen') window.close();
}, {capture: true});
// prevent keyboard interaction
document.body.addEventListener('keydown', function(ev){
ev.stopPropagation();
}, true);
}
if (document.readyState != 'loading') ready();
else document.addEventListener('DOMContentLoaded', ready);
}
// prevent keyboard interaction
if ( /^\/mail\/client\/mailbody\//.test(location.pathname) ) {
function init() {
try {
document.documentElement.addEventListener('keydown', function(ev){ ev.stopPropagation(); }, true);
}catch(e){
document.addEventListener('DOMContentLoaded', init);
}
}
init();
}
})();