GMX standalone window view

Set option to open email in standalone window (gmx / web.de)

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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();
  }

})();