GMX standalone window view

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

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

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

})();