azazar / Целюллоза(zelluloza.ru) как надо

// ==UserScript==
// @name        Целюллоза(zelluloza.ru) как надо
// @namespace   zelluloza.ru.uo1.net
// @description Просто нормальная читалка для целлюлозы. Обычное отображение текста в браузере, без всяких постраничных глупостей.
// @include     /^https?:\/\/(www\.)?zelluloza\.ru(/.*|)$/
// @version     1.03
// @grant       none
// @updateURL https://openuserjs.org/meta/azazar/Целюллоза(zelluloza.ru)_как_надо.meta.js
// ==/UserScript==

(function() {
    
    function showReader() {
        var disableCopyPaste = false;

        if (typeof maxpg === 'undefined' || maxpg === 0) {
            alert("Это не страница с книгой");
            return;
        }

        var imgInsertInterval;

        var dc = document;
        var bd = dc.body;
        var cntr = dc.createElement('span');

        if (disableCopyPaste) {
            cntr.oncontextmenu = function() {
                event.preventDefault();
            }
        }

        //var bd_ovf = bd.style.overflow;

        cntr.rs = function(c) {
            c = c * cntr.clientHeight;
            var scrollTo = cntr.scrollTop + c;
            if (scrollTo < 0) {
                scrollTo = 0;
            }
            else if (scrollTo > cntr.scrollHeight) {
                scrollTo = cntr.scrollHeight;
            }
            if (cntr.scrollTop === scrollTo) {
                return;
            }

            /*var scrollFrom = cntr.scrollTop;
            var steps = Math.abs(scrollTo - cntr.scrollTop);
            var speed = 4;
            for(var step = 1; step <= steps; step+=5) {
                var f = step/steps;
                var top = Math.round(scrollFrom * (1-f) + scrollTo * f);
                setTimeout(function() {
                    cntr.scrollTop = top;
                }, step*speed);
                console.log("t:",step*speed);
            }

            setTimeout(function() {*/
                cntr.scrollTop = scrollTo;
            /*}, steps*speed + 1);*/
        };

        function mykeypress(evt) {

            var keyId = evt.key ? evt.key : evt.keyIdentifier;

            if (keyId === "Down" || keyId === "DownArrow" || keyId === "ArrowDown") {
                cntr.rs(0.1);
            }
            else if (keyId === "Up" || keyId === "UpArrow" || keyId === "ArrowUp") {
                cntr.rs(-0.1);
            }
            else if (keyId === "PageUp") {
                cntr.rs(-0.9);
            }
            else if (keyId === "PageDown" || keyId === "U+0020" || keyId === " ") {
                cntr.rs(0.9);
            }
            else if (keyId === "Home") {
                cntr.rs(-100500);
            }
            else if (keyId === "End") {
                cntr.rs(100500);
            }
            else {
                console.log(keyId);
                return;
            }

            evt.preventDefault();
            evt.stopPropagation();
        }

        cntr.onkeypress = mykeypress;

        function closeClear() {
            if (imgInsertInterval !== undefined) {
                clearInterval(imgInsertInterval)
            }
            //bd.style.overflow = bd_ovf;
            bd.removeChild(cntr);
            window.removeEventListener("keydown", mykeypress);
        }

        var btnsBefore = null;

        function appendCloseBtn() {
            var input = dc.createElement('input');
            input.setAttribute('type', 'button');
            input.value = 'Закрыть';
            input.onclick = function(evt) {
                closeClear();
                evt.preventDefault();
            };
            cntr.appendChild(input);
            if (btnsBefore === null) {
                cntr.appendChild(btnsBefore = dc.createElement('br'));
            }
            return input;
        }

        cntr.setAttribute('style',
            'max-width: 30em; margin: 0 auto 0 auto; font-size: 2em; box-shadow: 0 0 10px rgba(0,0,0,0.5);' +
            'z-index: 999; overflow: scroll; padding: 1em 1em 1em 1em; background: #ffffff; display: block; position:fixed; top: 0px; left: 0px; right: 0px; bottom: 0px' +
            (disableCopyPaste ? '; -webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;' : ''));
        appendCloseBtn();

        var clseBtn2 = appendCloseBtn();

        /* <input type="button" class="bluebtn" value="След. фрагмент" onclick="location.replace('/books/1453/8168/#page');"> */
        var nextLink = dc.querySelector("input[type='button'][value='След. >']");

        if (nextLink !== null) {
            var nextBtn = dc.createElement('input');
            nextBtn.setAttribute('type', 'button');
            nextBtn.setAttribute('value', 'След. фрагмент');
            nextBtn.onclick = function() {
                nextLink.click();
            };
            cntr.appendChild(nextBtn);
        }

        var imgSrcs = [];
        if (protectionview && doprote === 2) {
            var btnInsertBefore;
            cntr.appendChild(dc.createTextNode('Для изменения размера шрифта - изменяйте ширину окна браузера.'));
            cntr.appendChild(btnInsertBefore = dc.createElement('br'));

            for (var pgIdx = 0; pgIdx < maxpg; pgIdx += pagessize) {
                var actn;
                (function() {
                    var src = 'http://zelluloza.ru/get/' + btoa(bookid + ':' + chapterid + ':' + pagessize + ':' + pgIdx);
                    actn = function() {
                        var img = dc.createElement('img');
                        img.setAttribute('width', '100%');
                        if (window.imagesStyle) {
                            img.setAttribute('style', window.imagesStyle);
                        }
                        else {
                            /*var f = 'brightness(2) contrast(4);';
                            img.setAttribute('style', '-webkit-filter: '+f+'; filter: '+f+';');*/
                        }
                        if (disableCopyPaste) {
                            img.onclick = img.ondragstart = img.oncontextmenu = function(evt) {
                                evt.preventDefault();
                            };
                        }
                        img.src = src;
                        cntr.insertBefore(dc.createElement('br'), clseBtn2);
                        cntr.insertBefore(img, clseBtn2);
                    };
                })();
                if (pgIdx < 10) {
                    actn();
                } else {
                    imgSrcs.push(actn);
                }
            }

            var loadPageBtn;

            function loadPage() {
                if (imgSrcs.length > 0) {
                    var a = imgSrcs.shift();
                    a();
                }
                if (imgSrcs.length === 0) {
                    clearInterval(imgInsertInterval);
                    imgInsertInterval = undefined;
                    cntr.removeChild(loadPageBtn);
                }
            }

            imgInsertInterval = setInterval(loadPage, 20000 + Math.round(Math.random() * 10000));

            loadPageBtn = dc.createElement('input');
            loadPageBtn.setAttribute('type', 'button');
            loadPageBtn.setAttribute('value', 'Загрузить страницу');
            cntr.insertBefore(loadPageBtn, btnInsertBefore);
            loadPageBtn.onclick = loadPage;
        } else {
            var bkCntr = dc.createElement('span');
            if (disableCopyPaste) {
                bkCntr.onclick = bkCntr.ondragstart = bkCntr.oncontextmenu = bkCntr.oncopy = bkCntr.oncut = bkCntr.onpaste = function(evt) {
                    evt.preventDefault();
                };
            }
            var lns = noway[0].split(/\n/g);
            for (var pgIdx = 0; pgIdx < lns.length; pgIdx++) {
                lns[pgIdx] = DS('1978thepasswhere', lns[pgIdx]);
                /*if (pgIdx < 200) {
                    console.log(pgIdx, lns[pgIdx])
                }*/
            }
            lns.forEach(function(line) {
                var p = dc.createElement("p");
                p.setAttribute("style", "cursor:arrow; text-indent: 3em; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px");
                p.appendChild(dc.createTextNode(line));
                bkCntr.appendChild(p);
            });
            cntr.insertBefore(bkCntr, clseBtn2);
            var fontSize = 1;

            function applyFontSize() {
                bkCntr.style['font-size'] = fontSize + "em";
            }

            var input = dc.createElement('input');
            input.setAttribute('type', 'button');
            input.setAttribute('value', '+');
            input.onclick = function(event) {
                fontSize *= 1.1;
                applyFontSize();
                event.preventDefault();
            };

            cntr.insertBefore(input, btnsBefore);

            input = dc.createElement('input');
            input.setAttribute('type', 'button');
            input.setAttribute('value', '-');
            input.onclick = function(event) {
                fontSize /= 1.1;
                applyFontSize();
                event.preventDefault();
            };

            cntr.insertBefore(input, btnsBefore);
        }
        //bd.style.overflow = 'hidden';
        window.addEventListener("keydown", mykeypress);
        bd.appendChild(cntr);
    };
    
    var btn = document.getElementById("pages4")
    
    btn.removeAttribute("onclick");
    btn.setAttribute("title", "Открыть в читалке");
    
    btn.onclick = function(event) {
        showReader();
        event.preventDefault();
    };
    
    btn.innerHTML = "R";
    
    console.log("Юзерскрипт отработал");

})();