Newt300 / Anime randomaizer

// ==UserScript==
// @name         Anime randomaizer
// @namespace    https://vk.com/shiki_ex
// @updateURL    https://openuserjs.org/meta/Newt300/Anime_randomaizer.meta.js
// @downloadURL  https://openuserjs.org/install/Newt300/Anime_randomaizer.user.js
// @version      0.4.5
// @description  [shikimori.org] У вас Over9000+ тайтлов в "Запланированно"? Сложно выбрать?? Тогда мы идем к вам!  ### Этот скрипт входит в пакет скриптов shiki extender (by STorn) ###
// @author       STorn
// @match        https://shikimori.org/*
// @match        http://shikimori.org/*
// @grant        none
// @license      MIT
// ==/UserScript==

/*jshint multistr: true */

//Code Conventions?? Не, не слышал! 

var listsLength = 0;

function fullListCheck() {
    if (kGlobal > 0 ){
        if($("#chk1").prop("checked")) {
            if (document.querySelectorAll("span[class=action]")[0].innerText.replace(/[^-0-9]/gim,'') > document.querySelectorAll("tbody[class=entries] tr td[class=name] > a").length + 1) {
                document.getElementById("lInfo").innerHTML = 'Кажется ваш список "' + document.getElementsByClassName('subheadline')[2].innerText + '" прогружен не полностью. <br> [ ' + (document.querySelectorAll("tbody[class=entries] tr td[class=name] > a").length + 1) + ' / ' + document.querySelectorAll("span[class=action]")[0].innerText.replace(/[^-0-9]/gim,'') +' ] <br> [Нажмите чтобы прогрузить]';
                return;
            } else document.getElementById("lInfo").innerHTML = '';
        } else {
            if ((document.querySelectorAll("tbody[class=entries] tr td[class=name] > a").length + 1) % 400 === 0) {
                document.getElementById("lInfo").innerHTML = 'Кажется ваш список прогружен не полностью. <br> [ ' + (document.querySelectorAll("tbody[class=entries] tr td[class=name] > a").length + 1) + ' / ' + listsLength +' ] <br> [Нажмите чтобы прогрузить]';
                return;
            }
            document.getElementById("lInfo").innerHTML = '';
        }
    }
}

function insertButton() {

    console.log("##########################################");
    console.log("[AR]: Anime Ranromaiser has successfully started");
    
    var listsLengthEl = document.querySelectorAll('a.b-link.always-active > span');
    for (var i = 0; i <= listsLengthEl.length - 1; i++) {
        listsLength += Number(listsLengthEl[i].innerHTML);
    }


    var firstListName = document.getElementsByClassName('subheadline')[1];
    var insertPlace  = document.getElementsByClassName('b-collection_search')[0]; //место вставки
    var button = document.createElement("div");
    var div = document.createElement("div");
    div.innerHTML = '<div class="b-options-floated collapse"><a href="https://vk.com/shiki_ex">shiki extender</a></div><div class="subheadline">Anime randomaizer</div>\
    <div class="b-options-floated collapse"><a href="https://goo.gl/ugmFCL" target="_blank">[info]</a></div>';
    button.innerHTML = '<table width="325" cellspacing="5" cellpadding="10"><tr><td title="\
    Скрипт перемещает элемент из списка в выделенное место ниже. Этот метод позволяет сохранить вывод подсказки.">\
    &nbsp;&nbsp;&nbsp;<input  type="button" value="Рандом аниме" name="d" id="btn1"></td>\
    <td title="Регулировать жанры можно спомощью стандартного shiki фильтра(меню справа)">&nbsp; &nbsp;<input type="checkbox" name="b" id="chk1" checked></td>\
    <td title="Регулировать жанры можно спомощью стандартного shiki фильтра(меню справа)"><p>&nbsp; фильтр "' + firstListName.innerText + '"</p></td>\
    </tr></table>';

    var br = document.createElement("br");
    var table = document.createElement("table");
    table.setAttribute("class", "b-table list-lines");
    //table.setAttribute("hight", "25");
    table.innerHTML = '<tbody class=""><tr class="user_rate selectable editable">\
    <td id="r" width="25" class="index" title="Рандомное число"></td>\
    <td id="p" width="500" class="name"></td>\
    <td id="prev_a" width="25" align="right" class="index" title="Историю рандомов можно посмотреть в логах (Ctrl + Shift + I)">⤾</td>\
    </tr><tr><td></td><td class="index" id="lInfo"></td></tr></tbody>';
    insertPlace.appendChild(div);
    insertPlace.appendChild(button);
    insertPlace.appendChild(table);
    insertPlace.appendChild(br);


}

var kGlobal = 0;

function main() {
    'use strict';

        var k = 0;
        var r = 0;
        var btn1 = document.getElementById("btn1");
        var firstListLength = document.querySelectorAll("span[class=action]")[0].innerText.replace(/[^-0-9]/gim,'');
        var arIndex = document.getElementById("r");
        btn1.onclick = function ()
        {

            function reset() {
                var tNextChild = document.querySelectorAll("tbody[class=entries] tr td:nth-child(2) span:first-child")[0];
                var tParent = document.querySelectorAll("tbody[class=entries] tr td[class=name]");
                var tEl = document.querySelectorAll("tbody tr td[id=p] a")[0];
                tParent[r].insertBefore(tEl, tNextChild);
                var prev_a = document.getElementById("prev_a");
                prev_a.setAttribute("title", "Предыдущее: " + tEl.innerHTML);
            }

            if (k > 0) {reset();}

            // console.log("[AR]: firstListLength=" + firstListLength);
            var list = document.querySelectorAll("tbody[class=entries] tr td[class=name] > a");
            var t = document.getElementById("p");

            var firstListName = document.getElementsByClassName('subheadline')[2];
            /*if(firstListLength > list.length) {
                document.getElementById("lInfo").innerHTML = 'Кажется ваш список "' + firstListName.innerText + '" прогружен не полностью. <br> [Нажмите чтобы прогрузить]';
            } else {
                document.getElementById("lInfo").innerHTML = "";
            }*/

            if($("#chk1").prop("checked") && (firstListLength < list.length)) {
                r = Math.floor(Math.random() * firstListLength);
                console.log("[AR]: Флажок установлен");
                console.log("[AR]: " + (r + 1)  +  "/" + firstListLength);
            } else {
                r = Math.floor(Math.random() * list.length);
                console.log("[AR]: Флажок не установлен");
                console.log("[AR]: " + (r + 1)  + "/" + list.length);
            }

            //console.log("[AR]: r2=" + r);
            arIndex.innerHTML = r + 1;
            t.appendChild(list[r]);
            console.log("[AR]: Random Anime " + (k + 1) + ": " + list[r].innerHTML);
            console.log("##########################################");
            k++;
            kGlobal++;
            $(fullListCheck());
        };


        var scroll = document.getElementById("lInfo");
        scroll.onclick = function ()
        {
            var loader = document.querySelectorAll("div.b-postloader.collapsed")[0];
            loader.click();
            setTimeout(function() {fullListCheck();}, 2000);
        };


}

function start() {
    if (window.location.pathname.indexOf("/list/anime") > 0 || window.location.pathname.indexOf("/list/manga/") > 0) {
        fullListCheck();
        if($("#chk1").length>0) {return;}
        insertButton();
        main();
    }
}

$(document).bind('mouseup mousemove ready', function(){
    start();
});
$(document).ready(start());
$(document).ready(function(){kGlobal = 0; start();});
$(document).on('page:load', function(){kGlobal = 0; start();});
$(document).on('turbolinks:load', function(){kGlobal = 0; start();});