helikon

Von $1

    Inhaltsverzeichnis
    keine Gliederung

    Version seit 19:08, 11 Aug 2026

    zu dieser Version.

    Zurück zu Versionshistorie.

    Zeige aktuelle Version

    (function() {
        var SLEEP_SEC = 30;
        var HAPPY_SEC = 4;
        var ERROR_SEC = 6;
        var LOAD_SEC  = 5;
        var FADE_SEC  = 5;
        var CHAT_URL  = '/Willkommen/Helikon';
        var TOPIC_DELAY = 4;
    
        var GIFS = new Array(5);
        GIFS[0] = '/@api/deki/files/403/=buddy_idle.gif';
        GIFS[1] = '/@api/deki/files/402/=buddy_sleeping.gif';
        GIFS[2] = '/@api/deki/files/401/=buddy_happy.gif';
        GIFS[3] = '/@api/deki/files/400/=buddy_error.gif';
        GIFS[4] = '/@api/deki/files/399/=buddy_loading.gif';
    
        var S_IDLE = 0, S_SLEEP = 1, S_HAPPY = 2, S_ERROR = 3, S_LOAD = 4;
    
        var SPEECH = new Array(5);
        SPEECH[0] = new Array('Alles klar!', 'Bereit!', 'Was gibts?', 'Hm...');
        SPEECH[1] = new Array('zzz...', 'ZZzz...', '*schnarch*', 'zZzZz...');
        SPEECH[2] = new Array('Yay!', 'Super!', 'Nice!', 'Toll!', 'Weiter so!');
        SPEECH[3] = new Array('ALARM!', 'Oh nein!', 'Fehler!', 'Hilfe!');
        SPEECH[4] = new Array('Moment...', 'Lade...', 'Gleich...', 'Bitte warten...');
    
        var HELLOS = new Array('Hi!', 'Hallo!', '*blinzel*', 'Yo!', '01001000 01101001', 'Hey du!', 'Moin!');
    
        var curState = -1;
        var lastAct  = Date.now();
        var sTimer   = null;
        var fadeTimer = null;
        var leaving  = false;
        var pageError = false;
        var preloading = false;
    
        var clickCount = 0;
        var clickTimer = null;
        var pressTimer = null;
    
        var bWrap   = document.getElementById('serverBuddy');
        var bImg    = document.getElementById('buddyImg');
        var bSpeech = document.getElementById('buddySpeech');
        if (!bWrap || !bImg || !bSpeech) return;
    
        bWrap.style.display = 'block';
    
        bImg.setAttribute('alt', '');
        bImg.setAttribute('title', '');
        bImg.setAttribute('draggable', 'false');
        bImg.addEventListener('dragstart', function(e) { e.preventDefault(); });
        bImg.addEventListener('contextmenu', function(e) { e.preventDefault(); });
    
        function pick(arr) {
            return arr[Math.floor(Math.random() * arr.length)];
        }
    
        function wakeUp() {
            bWrap.className = 'active';
            if (fadeTimer) clearTimeout(fadeTimer);
            fadeTimer = setTimeout(function() {
                if (curState !== S_ERROR && curState !== S_LOAD && !preloading) {
                    bWrap.className = '';
                }
            }, FADE_SEC * 1000);
        }
    
        function showMsg(txt) {
            bSpeech.textContent = txt;
            bSpeech.className = 'visible';
            wakeUp();
            setTimeout(function() {
                bSpeech.className = '';
            }, 3000);
        }
    
        function setS(s, msg) {
            if (curState === s && s !== S_HAPPY) return;
            curState = s;
            bImg.src = GIFS[s];
            showMsg(msg || pick(SPEECH[s]));
            if (sTimer) clearTimeout(sTimer);
    
            if (s === S_HAPPY) {
                sTimer = setTimeout(function() { setS(S_IDLE); }, HAPPY_SEC * 1000);
            }
            if (s === S_ERROR && !pageError) {
                sTimer = setTimeout(function() { setS(S_IDLE); }, ERROR_SEC * 1000);
            }
            if (s === S_LOAD) {
                sTimer = setTimeout(function() { setS(S_HAPPY, 'Fertig!'); }, LOAD_SEC * 1000);
            }
        }
    
        function fetchPageTopic() {
            var pid = 0;
            if (typeof Deki !== 'undefined' && Deki.PageId) {
                pid = Deki.PageId;
            }
            if (!pid) return;
            var url = '/@api/deki/pages/' + pid + '/properties';
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);
            xhr.onload = function() {
                if (xhr.status !== 200) return;
                try {
                    var parser = new DOMParser();
                    var xml = parser.parseFromString(xhr.responseText, 'text/xml');
                    var nodes = xml.getElementsByTagName('property');
                    var i;
                    for (i = 0; i < nodes.length; i++) {
                        var name = nodes[i].getAttribute('name') || '';
                        if (name.indexOf('buddy.pagetopic') !== -1) {
                            var contents = nodes[i].getElementsByTagName('contents');
                            if (contents.length > 0 && contents[0].textContent) {
                                var topic = contents[0].textContent.replace(/^\s+|\s+$/g, '');
                                if (topic) {
                                    showMsg(topic);
                                }
                            }
                            break;
                        }
                    }
                } catch (e) {}
            };
            xhr.onerror = function() {};
            xhr.send();
        }
    
        function goToChat() {
            curState = -1;
            setS(S_HAPPY, 'Komm mit!');
            setTimeout(function() {
                window.location.href = CHAT_URL;
            }, 500);
        }
    
        function onSingleClick() {
            curState = -1;
            setS(S_HAPPY, pick(HELLOS));
        }
    
        function resetIdle() {
            lastAct = Date.now();
            if (curState === S_SLEEP && !leaving && !preloading) setS(S_IDLE);
        }
    
        function checkIdle() {
            if (leaving || pageError || preloading) return;
            var sec = Math.floor((Date.now() - lastAct) / 1000);
            if (sec >= SLEEP_SEC && curState === S_IDLE) setS(S_SLEEP);
        }
    
        function checkPageError() {
            var errEl = document.querySelector('.errormsg.systemmsg');
            var hasErr = (errEl && errEl.offsetParent !== null);
            if (hasErr && !pageError) {
                pageError = true;
                if (sTimer) clearTimeout(sTimer);
                curState = -1;
                setS(S_ERROR, 'Systemfehler!');
            } else if (!hasErr && pageError) {
                pageError = false;
                setS(S_IDLE, 'Wieder OK!');
            }
        }
    
        function isPreloaderVisible() {
            var pl = document.getElementById('preloader');
            if (!pl) return false;
            return pl.className.indexOf('show') !== -1;
        }
    
        function checkPreloader() {
            var plShow = isPreloaderVisible();
            if (plShow && !preloading) {
                preloading = true;
                bWrap.className = 'active';
                curState = -1;
                setS(S_SLEEP, 'zzz...');
            } else if (!plShow && preloading) {
                preloading = false;
                curState = -1;
                setS(S_LOAD, 'Lade Seite...');
                setTimeout(function() {
                    leaving = false;
                    setS(S_IDLE, 'Bereit!');
                }, 2000);
            }
        }
    
        document.addEventListener('mousemove', resetIdle);
        document.addEventListener('scroll', resetIdle);
        document.addEventListener('keydown', resetIdle);
        document.addEventListener('touchstart', resetIdle);
    
        bWrap.addEventListener('mouseenter', function() { wakeUp(); });
    
        document.addEventListener('click', function(e) {
            resetIdle();
            var t = e.target;
            var link = null;
            if (t.tagName === 'A') {
                link = t;
            } else if (t.parentNode && t.parentNode.tagName === 'A') {
                link = t.parentNode;
            }
            if (link) {
                var href = link.getAttribute('href') || '';
                if (href && href.charAt(0) !== '#' && href.indexOf('javascript:') !== 0) {
                    leaving = true;
                    curState = -1;
                    setS(S_SLEEP, 'Bis gleich...');
                } else {
                    setS(S_HAPPY);
                }
            }
        });
    
        window.addEventListener('beforeunload', function() {
            leaving = true;
            bImg.src = GIFS[S_SLEEP];
        });
    
        bWrap.addEventListener('click', function(e) {
            e.stopPropagation();
            e.preventDefault();
            clickCount++;
            if (clickCount === 1) {
                clickTimer = setTimeout(function() {
                    clickCount = 0;
                    onSingleClick();
                }, 350);
            } else if (clickCount === 2) {
                clearTimeout(clickTimer);
                clickCount = 0;
                goToChat();
            }
        });
    
        bWrap.addEventListener('mousedown', function() {
            pressTimer = setTimeout(function() { goToChat(); }, 800);
        });
        bWrap.addEventListener('mouseup', function() {
            if (pressTimer) clearTimeout(pressTimer);
        });
        bWrap.addEventListener('mouseleave', function() {
            if (pressTimer) clearTimeout(pressTimer);
        });
        bWrap.addEventListener('touchstart', function(e) {
            pressTimer = setTimeout(function() {
                e.preventDefault();
                goToChat();
            }, 800);
        });
        bWrap.addEventListener('touchend', function() {
            if (pressTimer) clearTimeout(pressTimer);
        });
        bWrap.addEventListener('touchmove', function() {
            if (pressTimer) clearTimeout(pressTimer);
        });
    
        window.addEventListener('error', function() { setS(S_ERROR); });
    
        document.addEventListener('visibilitychange', function() {
            if (document.hidden) {
                setS(S_SLEEP, '*gaehn*');
            } else {
                leaving = false;
                resetIdle();
                setS(S_IDLE, 'Wieder da!');
            }
        });
    
        var i;
        for (i = 0; i < 5; i++) {
            var preImg = new Image();
            preImg.src = GIFS[i];
        }
    
        if (isPreloaderVisible()) {
            preloading = true;
            bWrap.className = 'active';
            setS(S_SLEEP, 'zzz...');
        } else {
            setS(S_LOAD, 'Lade Seite...');
            setTimeout(function() {
                leaving = false;
                setS(S_IDLE, 'Bereit!');
                setTimeout(fetchPageTopic, TOPIC_DELAY * 1000);
            }, 2000);
        }
    
        setInterval(checkIdle, 1000);
        setInterval(checkPageError, 1000);
        setInterval(checkPreloader, 300);
    
        window.serverBuddy = new Object();
        window.serverBuddy.setState = function(name, msg) {
            var map = new Object();
            map['idle'] = 0; map['sleeping'] = 1; map['happy'] = 2;
            map['error'] = 3; map['loading'] = 4;
            if (map[name] !== undefined) setS(map[name], msg);
        };
        window.serverBuddy.say = showMsg;
    })();

     
    Use the language selection below for English Utilise le sélecteur de langue ci-dessous pour français Per l'italiano, utilizzare la selezione della lingua qui sotto Schön sprichst du deutsch :-)