Bierdopje Old Shows

Adds a menu which includes a brand new page for the older (finished) shows.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Bierdopje Old Shows
// @namespace    http://www.bierdopje.com/
// @version      2.1.1
// @description  Adds a menu which includes a brand new page for the older (finished) shows.
// @match        http://*.bierdopje.com/shows
// @match        http://*.bierdopje.com/shows/
// @match        http://*.bierdopje.com/shows/page/*
// @match        http://*.bierdopje.com/shows/new
// @match        http://*.bierdopje.com/shows/new/
// @match        http://*.bierdopje.com/shows/finished
// @match        http://*.bierdopje.com/shows/finished/
// @match        http://*.bierdopje.com/shows/finished/*
// @grant        unsafeWindow
// @require      http://code.jquery.com/jquery-1.10.2.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js
// @author       Tom
// @copyright    2016+, Tom
// ==/UserScript==

$(function() {
    var showURL            = 'http://www.bierdopje.com/shows/';
    var sourceJSON         = 'https://raw.githubusercontent.com/Bierdopje-Community/old-shows/master/show_data/bierdopje_series.json';
    var SHOWS_PER_PAGE     = 50;
    var PAGINATION_ITEMS   = 6;
    
    // Submenu for the /shows/* pages.
    var subMenuContainer = '<div id="submenucontainer"><div id="submenu"><ul><li class="strong"><a href="/shows" id="active" selected="selected">Actieve series</a></li><li class="strong"><a href="/shows/new" id="new">Nieuwe series</a></li><li class="strong"><a href="/shows/finished" id="finished">Oude series</a></li></ul></div></div>';
    $('#topmenu').after(subMenuContainer);
    
    // Select the page in the submenu and set page title.
    if (window.location.href.indexOf("new") > -1) {
        document.title = 'Bierdopje.com | Series | Nieuwe series';
        $('#new').addClass("selected");
    } else if (window.location.href.indexOf("finished") > -1) {
        document.title = 'Bierdopje.com | Series | Oude series';
        $('#finished').addClass("selected");
    } else {
        document.title = 'Bierdopje.com | Series | Actieve series';
        $('#active').addClass("selected");
    }
    
    // Add finished series content
    if (window.location.href.indexOf("finished") > -1) {
        var prefix             = getCurrentPrefixFromURL();
        var currentPage        = getCurrentPageFromURL();
        var clear              = '<div class="clear">&nbsp;</div>';
        var finishedHeaderText = '<h3>Alle <u>afgelopen</u> series</h3>';
        var contentDiv         = $('.go-wide');
        contentDiv.find('div').replaceWith(finishedHeaderText);
        
        // Raw data
        var letterPaginationStart = '<div class="rightfloat" style="width: 620px;"><ul id="pagination" class="letterPagination">';
        var letterPaginationEnd   = '</ul></div>';
        
        var paginationStart       = '<ul id="pagination" class="numberPagination">';
        var paginationEnd         = '</ul>';
        
        var tableStart            = '<table id="startShowTable" class="listing form" cellspacing="0"><colgroup><col style="width:20%;"><col style="width:5%;"><col style="width:6%;"><col style="width:6%;"><col style="width:8%;"><col style="width:6%;"><col style="width:6%;"></colgroup><tbody id="tableData">';
        var tableHeaders          = '<tr id="tableHeader"><th class="bluerow">Naam</th><th class="bluerow">Runtime</th><th class="bluerow"># Seizoenen</th><th class="bluerow"># Afleveringen</th><th class="bluerow">Status</th><th class="bluerow">Score</th><th class="bluerow"># Favorieten</th></tr>';
        var tableEnd              = '</tbody></table>';
        
        var loadingRow            = '<tr id="loadingRows"><td colspan="7" style="text-align: center;"><img src="http://cdn.bierdopje.eu/g/if/facebox/loading.gif" style="vertical-align: middle;" />&nbsp;&nbsp;&nbsp;<span style="vertical-align: middle;">Series laden...</span></td></tr>';
        
        contentDiv.append(letterPaginationStart);
        contentDiv.append(letterPaginationEnd);
        contentDiv.append(paginationStart);
        contentDiv.append(paginationEnd);
        contentDiv.append(tableStart);
        
        // Data accessors after insertion
        var letterPaginationData = $(".letterPagination");
        var paginationData       = $(".numberPagination");
        var startShowTable       = $("#startShowTable");
        var tableData            = $('#tableData');
        
        tableData.append(tableHeaders);
        tableData.append(loadingRow);
        
        var loading = $("#loadingRows");
        
        getData(currentPage, prefix);
    }
    
    function getCurrentPrefixFromURL() {
        if (window.location.href.indexOf("/finished/") > -1) {
            var url = window.location.href;
            var reg = /finished\/(?!page)([a-z|A-Z|0-9])/.exec(url);
            if (reg) {
                return reg[1];
            }
        }
        return "";
    }
    
    function getCurrentPageFromURL() {
        if (window.location.href.indexOf("/page/") > -1) {
            var url = window.location.href;
            return parseInt(url.substring(url.lastIndexOf('/page/') + 6));
        }
        return 1;
    }
    
    function getPageAmount(showCount) {
        if (showCount > SHOWS_PER_PAGE) {
            return Math.ceil(showCount / SHOWS_PER_PAGE);
        }
        return 1;
    }
    
    function getData(page, prefix) {
        currentPage = page;
        
        $.getJSON(sourceJSON, function(showData) {
            // Use LINQ to get only the prefix data
            showData = Enumerable.From(showData)
                .Where(function (x) { return startsWith(x.name, prefix) })
                .OrderBy(function (x) { return x.name })
                .ToArray();
            var showCount = Object.keys(showData).length;
            var pages     = getPageAmount(showCount);
            
            console.log("Great! I've found " + showCount + " shows.");
            console.log("Will be putting that on " + pages + " page(s). " + SHOWS_PER_PAGE + " on each page.");
            
            addLetterPagination(prefix);
            addPagination(prefix, pages);
            
            console.log("Crushing all that show data now. Just for you!");
            
            var startIndex = (currentPage * SHOWS_PER_PAGE) - SHOWS_PER_PAGE;
            
            for (var i = 0; i < SHOWS_PER_PAGE; i++, startIndex++) {
                var j = startIndex;
                if (typeof showData[j] != "undefined") {
                    //var showtvdbId     = showData[j].tvdbId;
                    var showName       = showData[j].name;
                    var currentURL     = showData[j].slug;
                    var showRuntime    = showData[j].runtime;
                    var showSeasons    = showData[j].seasons;
                    var showEpisodes   = showData[j].episodes;
                    var showStatus     = 'Afgelopen'; //showData[j].showstatus;
                    var showScore      = showData[j].score;
                    var showFavourites = showData[j].favorites;

                    var tableRow = '<tr class="show"><td><a href="' + showURL + currentURL + '">' + showName + '</a></td><td>' + showRuntime + '</td><td>' + showSeasons + '</td><td>' + showEpisodes + '</td><td>' + showStatus + '</td><td>' + showScore + '</td><td>' + showFavourites + '</td></tr>';
                    //var tableRow = '<tr class="show"><td><a href="' + currentURL + '" class="getShow" data-tvdbid="' + showtvdbId + '">' + showName + '</a></td><td>' + showRuntime + '</td><td>' + showSeasons + '</td><td>' + showEpisodes + '</td><td>' + showStatus + '</td><td>-</td><td>-</td></tr>';
                    tableData.append(tableRow);
                }
            }
        }).done(function() {
            loading.hide();
        }).fail(function() {
            console.log("Could not get shows.");
            var errorRow = '<tr id="error"><td colspan="7" style="text-align: center;"><img src="http://cdn.bierdopje.eu/g/s/sadley.gif" style="vertical-align: middle;" />&nbsp;&nbsp;&nbsp;<span style="vertical-align: middle;">Er is een fout opgetreden.</span></td></tr>';
            loading.after(errorRow);
            loading.hide();
        });
        
        tableData.append(tableEnd);
    }
    
    function startsWith(str, prefix) {
        // Special
        if (prefix === "0") {
            if (!isNaN(+str.charAt(0))) {
                return str;
            }
        }
        
        str = str.toLowerCase();
        prefix = prefix.toLowerCase();
        
        if (str.indexOf(prefix) === 0) {
            return str;
        }
        return "";
    }
    
    function addLetterPagination(prefix) {
        var letterArray = ["0-9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "Alle"];
        $.each(letterArray, function(index, value) {
            // Handle specials
            if (index === 0) {
                if (prefix === "0") {
                    prefix = letterArray[0];
                    letterPaginationData.append('<li class="active">' + prefix + '</li>');
                } else {
                    letterPaginationData.append('<li><a href="/shows/finished/0">' + letterArray[0] + '</a></li>');
                }
            } else if (index === letterArray.length - 1) {
                if (!prefix) {
                    letterPaginationData.append('<li class="active">' + letterArray[index] + '</li>');
                } else {
                    letterPaginationData.append('<li><a href="/shows/finished/">' + letterArray[index] + '</a></li>');
                }
            } else {
                if (value === prefix) {
                    letterPaginationData.append('<li class="active">' + value.toUpperCase() + '</li>');
                } else {
                    letterPaginationData.append('<li><a data-letterpage="' + value + '" class="changeLetterPage" href="/shows/finished/' + value + '">' + value.toUpperCase() + '</a></li>');
                }
            }
        });
    }
    
    function addPagination(prefix, pages) {
        var FIRST_LAST_ITEMS = Math.round(PAGINATION_ITEMS / 2);
            
        // First FIRST_LAST_ITEMS pages
        for (var i = 1; i <= FIRST_LAST_ITEMS; i++) {
            if (i <= pages) {
                addPaginationItem(prefix, i);
            } else {
                break;
            }
        }

        // Middle block
        if (pages > PAGINATION_ITEMS) {
            if ((currentPage - 1) >= PAGINATION_ITEMS) {
                paginationData.append('<li class="spacer">...</li>');
            }
            for (var i = (currentPage - FIRST_LAST_ITEMS) + 1 ; i < (currentPage + FIRST_LAST_ITEMS); i++) {
                if (i > FIRST_LAST_ITEMS && i < (pages - FIRST_LAST_ITEMS) + 1) {
                    addPaginationItem(prefix, i);
                }
            }

            if ((currentPage) <= (pages - PAGINATION_ITEMS)) {
                paginationData.append('<li class="spacer">...</li>');
            }
        }

        // Last FIRST_LAST_ITEMS pages
        for (var i = (pages - FIRST_LAST_ITEMS) + 1; i <= pages; i++) {
            if (i >= FIRST_LAST_ITEMS + 1) {
                addPaginationItem(prefix, i);
            }
        }

        paginationData.append(paginationEnd);
        paginationData.after(clear);
        startShowTable.after(paginationData.clone());
    }
    
    function addPaginationItem(prefix, i) {
        if (i === currentPage) {
            paginationData.append('<li class="active">' + i + '</li>');
        } else {
            if (prefix) {
                paginationData.append('<li><a data-page="' + i + '" class="changePage" href="/shows/finished/' + prefix + '/page/' + i + '">' + i + '</a></li>');
            } else {
                paginationData.append('<li><a data-page="' + i + '" class="changePage" href="/shows/finished/page/' + i + '">' + i + '</a></li>');
            }
        }
    }
});