MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Wiki.sah
Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 91: Zeile 91:


jQuery( CustomizeModificationsOfSidebar );
jQuery( CustomizeModificationsOfSidebar );
// === Minimaler Consent-Banner + Consent Mode v2 für MediaWiki ===
// Replace these placeholders before using:
//  - G_MEASUREMENT_ID -> your gtag measurement id (optional, if you use GA/GA4)
//  - ADSENSE_PUBLISHER -> your AdSense publisher id like "ca-pub-1605738920284413"
(function () {
    // --- Konfiguration ---
    var G_MEASUREMENT_ID = 'G-MEASUREMENT-ID'; // optional, oder leer lassen
    var ADSENSE_PUBLISHER = 'ca-pub-1605738920284413'; // ersetzen
    var STORAGE_KEY = 'site_consent_ads'; // Werte: 'granted' | 'denied'
    // Admin-Ausnahme: eingeloggte Benutzer sehen kein Banner
    if (mw.config.get('wgUserName') !== null) return;
    // Hilfsfunktionen
    function setConsentState(state) {
        try { localStorage.setItem(STORAGE_KEY, state); } catch (e) {}
        // Update Google Consent Mode
        if (window.gtag) {
            if (state === 'granted') {
                gtag('consent', 'update', { 'ad_storage': 'granted', 'analytics_storage': 'granted' });
            } else {
                gtag('consent', 'update', { 'ad_storage': 'denied', 'analytics_storage': 'denied' });
            }
        }
    }
    function getConsentState() {
        try { return localStorage.getItem(STORAGE_KEY); } catch (e) { return null; }
    }
    function injectScript(src, id, onload, onerror) {
        if (id && document.getElementById(id)) { if (onload) onload(); return; }
        var s = document.createElement('script');
        if (id) s.id = id;
        s.src = src;
        s.async = true;
        if (onload) s.onload = onload;
        if (onerror) s.onerror = onerror;
        document.head.appendChild(s);
    }
    // gtag loader (mit initialer Default-Consent 'denied' für EU-Konformität)
    function ensureGtag() {
        if (window.gtag) return;
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        window.gtag = window.gtag || gtag;
        // initial deny to be privacy-safe
        gtag('consent', 'default', { 'ad_storage': 'denied', 'analytics_storage': 'denied' });
        if (G_MEASUREMENT_ID && G_MEASUREMENT_ID.indexOf('G-') === 0) {
            injectScript('https://www.googletagmanager.com/gtag/js?id=' + encodeURIComponent(G_MEASUREMENT_ID), 'gtag-js', function(){
                // nothing — gtag() already defined
            });
        }
    }
    // AdSense loader (will be present but behavior depends on consent state)
    function ensureAdsense() {
        // add publisher meta if not present
        if (!document.querySelector('script[data-ad-client]')) {
            var s = document.createElement('script');
            s.async = true;
            s.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
            s.setAttribute('data-ad-client', ADSENSE_PUBLISHER);
            document.head.appendChild(s);
        }
    }
    // Banner erstellen
    function createBanner() {
        if (document.getElementById('consent-banner')) return;
        var banner = document.createElement('div');
        banner.id = 'consent-banner';
        banner.className = 'consent-banner';
        banner.innerHTML = '<div class="consent-inner">Wir nutzen Werbung, um diese Inhalte kostenlos zu halten. ' +
            '<button id="consent-accept" class="consent-btn primary">Einwilligen</button>' +
            '<button id="consent-decline" class="consent-btn">Nicht einwilligen</button>' +
            '<a id="consent-settings" href="#" class="consent-link">Einstellungen</a>' +
            '</div>';
        document.body.appendChild(banner);
        document.getElementById('consent-accept').addEventListener('click', function(e){
            e.preventDefault();
            setConsentState('granted');
            hideBanner();
            // update gtag and allow personalized ads
            if (window.gtag) gtag('consent','update',{ 'ad_storage':'granted','analytics_storage':'granted' });
        });
        document.getElementById('consent-decline').addEventListener('click', function(e){
            e.preventDefault();
            setConsentState('denied');
            hideBanner();
            if (window.gtag) gtag('consent','update',{ 'ad_storage':'denied','analytics_storage':'denied' });
        });
        document.getElementById('consent-settings').addEventListener('click', function(e){
            e.preventDefault();
            openSettingsDialog();
        });
    }
    function hideBanner() {
        var b = document.getElementById('consent-banner');
        if (b) b.style.display = 'none';
    }
    // einfache Einstellungen (kann ausgebaut werden)
    function openSettingsDialog() {
        alert('Einstellungen:\\n\nEinwilligen = personalisierte Werbung zulassen.\\nNicht einwilligen = nur nicht-personalisierte Werbung.');
    }
    // Optionaler leichter AdBlock-Check (falls du das willst)
    function checkAdblockAndShowNotice() {
        // create test node that adblockers often hide
        var bait = document.createElement('div');
        bait.className = 'adbait';
        bait.style.cssText = 'width:1px;height:1px;position:absolute;left:-9999px;';
        document.body.appendChild(bait);
        window.setTimeout(function() {
            var blocked = (window.getComputedStyle && window.getComputedStyle(bait).display === 'none') || !document.body.contains(bait);
            try { document.body.removeChild(bait); } catch(e) {}
            if (blocked) {
                // minimalistische Hinweisleiste, nur für echte Besucher (nicht admin)
                if (!document.getElementById('adblock-warning')) {
                    var w = document.createElement('div');
                    w.id = 'adblock-warning';
                    w.className = 'adblock-warning';
                    w.innerHTML = 'Es scheint ein Werbeblocker aktiv zu sein. Bitte deaktiviere ihn für <strong>science-at-home.de</strong>, um uns zu unterstützen. ' +
                                  '<button id="adblock-close" class="consent-btn">Schließen</button>';
                    document.body.appendChild(w);
                    document.getElementById('adblock-close').addEventListener('click', function(){ w.style.display='none'; });
                }
            }
        }, 800);
    }
    // Start-Flow
    function init() {
        // load gtag & adsense early (gtag default denied)
        ensureGtag();
        ensureAdsense();
        var state = getConsentState();
        if (!state) {
            // show banner after slight delay so user isn't überrumpelt
            setTimeout(function(){ createBanner(); }, 800);
            // also check AdBlocker (optional)
            checkAdblockAndShowNotice();
        } else {
            // apply stored consent state
            setConsentState(state);
            // no banner
        }
    }
    // Kick off
    if (document.readyState === 'complete' || document.readyState === 'interactive') {
        init();
    } else {
        window.addEventListener('load', init);
    }
})();

Version vom 17. November 2025, 12:55 Uhr

// === Google Analytics mit Selbst-Ausschluss ===

// Prüfen, ob der Benutzer das Opt-out-Cookie gesetzt hat
if (document.cookie.indexOf('disableGA=true') === -1) {
    // Google Analytics laden
    var script = document.createElement('script');
    script.async = true;
    script.src = 'https://www.googletagmanager.com/gtag/js?id=UA-7078304';
    document.head.appendChild(script);

    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'UA-7078304');
} else {
    console.log('Google Analytics ist für diesen Benutzer deaktiviert.');
}

// === Button / Link zum Selbst-Ausschluss ===
mw.hook('wikipage.content').add(function($content) {
    if ($content.find('#gaOptOut').length === 0) return;
    $content.find('#gaOptOut').on('click', function() {
        document.cookie = "disableGA=true; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";
        alert("Google Analytics wurde für dich deaktiviert.");
    });
});


function ModifySidebar( action, section, name, link ) {
	try {
		switch ( section ) {
			case 'languages':
				var target = 'p-lang';
				break;
			case 'toolbox':
				var target = 'p-tb';
				break;
			case 'navigation':
				var target = 'p-navigation';
				break;
			default:
				var target = 'p-' + section;
				break;
		}

		if ( action == 'add' ) {
			var node = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var aNode = document.createElement( 'a' );
			var liNode = document.createElement( 'li' );

			aNode.appendChild( document.createTextNode( name ) );
			aNode.setAttribute( 'href', link );
			liNode.appendChild( aNode );
			liNode.className = 'plainlinks';
			node.appendChild( liNode );
		}

		if ( action == 'remove' ) {
			var list = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var listelements = list.getElementsByTagName( 'li' );

			for ( var i = 0; i < listelements.length; i++ ) {
				if (
					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||
					listelements[i].getElementsByTagName( 'a' )[0].href == link
				)
				{
					list.removeChild( listelements[i] );
				}
			}
		}

	} catch( e ) {
		// let's just ignore what's happened
		return;
	}
}

function CustomizeModificationsOfSidebar() {
	// adds [[Special:CategoryTree]] to toolbox
	ModifySidebar( 'add', 'toolbox', 'CategoryTree', 'http://en.wikipedia.org/wiki/Special:CategoryTree' );
	// removes [[Special:Upload]] from toolbox
	ModifySidebar( 'remove', 'toolbox', 'Upload file', 'http://en.wikipedia.org/wiki/Special:Upload' );
}

jQuery( CustomizeModificationsOfSidebar );



// === Minimaler Consent-Banner + Consent Mode v2 für MediaWiki ===
// Replace these placeholders before using:
//  - G_MEASUREMENT_ID -> your gtag measurement id (optional, if you use GA/GA4)
//  - ADSENSE_PUBLISHER -> your AdSense publisher id like "ca-pub-1605738920284413"

(function () {
    // --- Konfiguration ---
    var G_MEASUREMENT_ID = 'G-MEASUREMENT-ID'; // optional, oder leer lassen
    var ADSENSE_PUBLISHER = 'ca-pub-1605738920284413'; // ersetzen
    var STORAGE_KEY = 'site_consent_ads'; // Werte: 'granted' | 'denied'

    // Admin-Ausnahme: eingeloggte Benutzer sehen kein Banner
    if (mw.config.get('wgUserName') !== null) return;

    // Hilfsfunktionen
    function setConsentState(state) {
        try { localStorage.setItem(STORAGE_KEY, state); } catch (e) {}
        // Update Google Consent Mode
        if (window.gtag) {
            if (state === 'granted') {
                gtag('consent', 'update', { 'ad_storage': 'granted', 'analytics_storage': 'granted' });
            } else {
                gtag('consent', 'update', { 'ad_storage': 'denied', 'analytics_storage': 'denied' });
            }
        }
    }

    function getConsentState() {
        try { return localStorage.getItem(STORAGE_KEY); } catch (e) { return null; }
    }

    function injectScript(src, id, onload, onerror) {
        if (id && document.getElementById(id)) { if (onload) onload(); return; }
        var s = document.createElement('script');
        if (id) s.id = id;
        s.src = src;
        s.async = true;
        if (onload) s.onload = onload;
        if (onerror) s.onerror = onerror;
        document.head.appendChild(s);
    }

    // gtag loader (mit initialer Default-Consent 'denied' für EU-Konformität)
    function ensureGtag() {
        if (window.gtag) return;
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        window.gtag = window.gtag || gtag;
        // initial deny to be privacy-safe
        gtag('consent', 'default', { 'ad_storage': 'denied', 'analytics_storage': 'denied' });
        if (G_MEASUREMENT_ID && G_MEASUREMENT_ID.indexOf('G-') === 0) {
            injectScript('https://www.googletagmanager.com/gtag/js?id=' + encodeURIComponent(G_MEASUREMENT_ID), 'gtag-js', function(){ 
                // nothing — gtag() already defined 
            });
        }
    }

    // AdSense loader (will be present but behavior depends on consent state)
    function ensureAdsense() {
        // add publisher meta if not present
        if (!document.querySelector('script[data-ad-client]')) {
            var s = document.createElement('script');
            s.async = true;
            s.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
            s.setAttribute('data-ad-client', ADSENSE_PUBLISHER);
            document.head.appendChild(s);
        }
    }

    // Banner erstellen
    function createBanner() {
        if (document.getElementById('consent-banner')) return;
        var banner = document.createElement('div');
        banner.id = 'consent-banner';
        banner.className = 'consent-banner';
        banner.innerHTML = '<div class="consent-inner">Wir nutzen Werbung, um diese Inhalte kostenlos zu halten. ' +
            '<button id="consent-accept" class="consent-btn primary">Einwilligen</button>' +
            '<button id="consent-decline" class="consent-btn">Nicht einwilligen</button>' +
            '<a id="consent-settings" href="#" class="consent-link">Einstellungen</a>' +
            '</div>';
        document.body.appendChild(banner);

        document.getElementById('consent-accept').addEventListener('click', function(e){
            e.preventDefault();
            setConsentState('granted');
            hideBanner();
            // update gtag and allow personalized ads
            if (window.gtag) gtag('consent','update',{ 'ad_storage':'granted','analytics_storage':'granted' });
        });

        document.getElementById('consent-decline').addEventListener('click', function(e){
            e.preventDefault();
            setConsentState('denied');
            hideBanner();
            if (window.gtag) gtag('consent','update',{ 'ad_storage':'denied','analytics_storage':'denied' });
        });

        document.getElementById('consent-settings').addEventListener('click', function(e){
            e.preventDefault();
            openSettingsDialog();
        });
    }

    function hideBanner() {
        var b = document.getElementById('consent-banner');
        if (b) b.style.display = 'none';
    }

    // einfache Einstellungen (kann ausgebaut werden)
    function openSettingsDialog() {
        alert('Einstellungen:\\n\nEinwilligen = personalisierte Werbung zulassen.\\nNicht einwilligen = nur nicht-personalisierte Werbung.');
    }

    // Optionaler leichter AdBlock-Check (falls du das willst)
    function checkAdblockAndShowNotice() {
        // create test node that adblockers often hide
        var bait = document.createElement('div');
        bait.className = 'adbait';
        bait.style.cssText = 'width:1px;height:1px;position:absolute;left:-9999px;';
        document.body.appendChild(bait);

        window.setTimeout(function() {
            var blocked = (window.getComputedStyle && window.getComputedStyle(bait).display === 'none') || !document.body.contains(bait);
            try { document.body.removeChild(bait); } catch(e) {}
            if (blocked) {
                // minimalistische Hinweisleiste, nur für echte Besucher (nicht admin)
                if (!document.getElementById('adblock-warning')) {
                    var w = document.createElement('div');
                    w.id = 'adblock-warning';
                    w.className = 'adblock-warning';
                    w.innerHTML = 'Es scheint ein Werbeblocker aktiv zu sein. Bitte deaktiviere ihn für <strong>science-at-home.de</strong>, um uns zu unterstützen. ' +
                                  '<button id="adblock-close" class="consent-btn">Schließen</button>';
                    document.body.appendChild(w);
                    document.getElementById('adblock-close').addEventListener('click', function(){ w.style.display='none'; });
                }
            }
        }, 800);
    }

    // Start-Flow
    function init() {
        // load gtag & adsense early (gtag default denied)
        ensureGtag();
        ensureAdsense();

        var state = getConsentState();
        if (!state) {
            // show banner after slight delay so user isn't überrumpelt
            setTimeout(function(){ createBanner(); }, 800);
            // also check AdBlocker (optional)
            checkAdblockAndShowNotice();
        } else {
            // apply stored consent state
            setConsentState(state);
            // no banner
        }
    }

    // Kick off
    if (document.readyState === 'complete' || document.readyState === 'interactive') {
        init();
    } else {
        window.addEventListener('load', init);
    }
})();