Greasy Fork is available in English.

[TS] Pixiv Manga Viewer

A more Powerful Pixiv Manga Viewer with no lazy loading (loads all images) and better interface. Works with Pixiv++ & Generic Image Viewer ロードし、すべての画像|いいえ遅延読み込み|マンガビューア|ダイレクトリンク|ベターインタフェース

// ==UserScript==
// @name            [TS] Pixiv Manga Viewer
// @namespace       TimidScript
// @version         2.2.31
// @description     A more Powerful Pixiv Manga Viewer with no lazy loading (loads all images) and better interface. Works with Pixiv++ & Generic Image Viewer ロードし、すべての画像|いいえ遅延読み込み|マンガビューア|ダイレクトリンク|ベターインタフェース
// @author          TimidScript
// @homepageURL     https://github.com/TimidScript
// @copyright       © 2013+ TimidScript, Some Rights Reserved.
// @license         https://github.com/TimidScript/UserScripts/blob/master/license.txt
// @match           *://www.pixiv.net/member_illust.php?mode=manga&illust_id=*
// @require         https://greasyfork.org/scripts/19967/code/TSL - GM_update.js
// @require         https://greasyfork.org/scripts/19968/code/TSLibrary - Generic.js
// @homeURL         https://greasyfork.org/en/scripts/4684
// @grant           GM_xmlhttpRequest
// @grant           GM_listValues
// @grant           GM_info
// @grant           GM_getMetadata
// @grant           GM_getValue
// @grant           GM_setValue
// @grant           GM_deleteValue
// @grant           GM_registerMenuCommand
// @icon            data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAB/ElEQVRYR+2XMUpEMRCGvY0n8AKewAt4Ai/gARYruy2txM7CwlLcQsFiG0ELRQsREREbRYstLNaPTHwMs75NJrx9rJCfv1jzJsn3MpPkubI6GC2hK5bHFcvjiuVxxfK4YnncDdbG3njz4FJ7bffMxLhcjgXK8Pxh/Pg+bdHzx2R//ESY6ZjjEqzt45vb1684eRAE8J3evWF+fE6+44MgWrxwPiyAIIizTafA0bI+vDBhmDyCGOOCdk7uTcwc52Ixt84XcExsYma9dXitV+7o6sUEtDkLiyUxeaGqTEybSZ/um7lmaSxeUUbUo+djYdYsdgv6M+nGCSzNxHvLb+TCwroAclI5D4sFl4GEiRb5E3mxzIIlT7V5WHSWxFFb0iKDIi8W1jXQDNjmRBJlwZpNJ4OiAiydx2T3dMlzUjdFGkctwmrKFIFonhqnsbTjqEVYvF7svFRYOokgmqfG/WHpWyt5qPaExaaJPYOSJ2pPWDqDycLCfWBxSsVuQTl3/MKxzFWdLHZxIVbmJ0pzfYkye+FCLCTfxGRk9oKjogHSWw+58l6OZcSXKrWMdcpENC72oznOE16dmVgtvcWMZDm9QOJuSp6skU3tXv8hi1DOQinw/8fSpyIlRaZMQIfOxQIiEv2KHWdiOrQvib25YnlcsTyuWB5XLI8rVr4Hox+cjUxd3KUvOgAAAABJRU5ErkJggg==
// ==/UserScript==


/* License + Copyright Notice
********************************************************************************************
License can be found at: https://github.com/TimidScript/UserScripts/blob/master/license.txt
Below is a copy of the license the may not be up-to-date.

Copyright © TimidScript, Some Rights Reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
following conditions are met:

1) GPL-3 License is met that does not conflict with the rest of the license (http://www.gnu.org/licenses/gpl-3.0.en.html)
2) This notice must be included
3) Due credits and link to original author's homepage (included in this notice).
4) Notify the original author of redistribution
5) Clear clarification of the License and Notice to the end user
6) Do not upload on OpenUserJS.org or any other site that infringes on this license

TimidScript's Homepages:  GitHub:      https://github.com/TimidScript
                          GreasyFork:  https://greasyfork.org/users/1455
*/

/* Information
********************************************************************************************
    Version History
------------------------------------

Hotkeys:
  A = ← = K => Previous Page
  Z = → = J => Next Page
  Q = Num 6 => Thumbnail Gallery

  1 = Num 1 => Auto-Height
  2 = Num 2 => Auto-Width
  3 = Num 3 => Auto-Stretch
  4 = Num 4 => Enlarge/Shrink to Client Area
  5 = Num 5 => Alternate through colour schemes
  ` = Num 0 => Reset Size
----------------------------------------------
    Version History
----------------------------------------------
2.2.31 (2017-04-18)
 - Quickfix to support https protocol
2.2.30 (2016-05-27)
 - Altered license
2.2.29 (2016-05-25)
 - Moving to GreasyFork and preparing to remove OUJS files
2.2.28 (2016-04-10)
 - updateURL added
2.2.28 (2016-04-03)
 - Changed license to GPL-3
2.2.26 (2015-10-05)
 - Replaced base64 bmp icon with png version
2.2.25 (2015-08-23)
 - Removed redundant code
2.2.24 (2015-06-27)
 - Bug Fix: userId not userID when getting artist's id
2.2.23 (2015-06-27)
 - Changed to using XMLHttpRequest to supprt Pixiv 3rd party login
2.2.22 (2015-05-15)
 - As of 11/05/2015 the Phone API (SPAPI) is dead. Extract the information from the document instead.
 - Avoided the usage of Public API to bypass multiple login and timeout
 - Added bgc selector array
 - Removed alternating background colours. All saved settings are reset.
 - Changed the content styling
 - Changed the hotkeys to match Generic Image Viewer
2.1.21 (2014-10-02)
 - Bug fixes due to changes in pixiv url syntax
2.1.20 (2014-09-08)
 - Bug Fix: Due to changes to TSL-Generic.
2.1.19 (2014-08-29)
 - Added GM_update
2.1.18  (2014-08-19)
 - Cleaned up header for OUJS
 - Removed old history
2.1.17 (2014-03-28)
 - Bug Fix: Resize issue.
2.1.16 (2014-03-25)
 - Behaviour changed to mimic Generic Image Viewer. See "Information" section above for hotkeys.
 - Multiple background colour options
 - Settings are removed with update
 - Optimised and cleaned up the code
 - Need to manually place the image to make sure correct CSS is applied to image background
 in correct order.
2.0.15 (2013-10-14)
 - document.replaceChild used
2.0.14 (2013-10-03)
 - Previous and next page with mouse click
 - Slight changes in interface
 - Increase top, left active area
**********************************************************************************************/

//#region Global Variables
/*
==============================================================================================
 VYCC: Variables You Can Change
==============================================================================================*/
//GM_setValue("SyncCalls", "5"); //Number of images it loads at a given time
//GM_setValue("ColourSets", '[["DDF0F5","E2E2E1"],["F1F18A","C8F3C8"],["000071","000"],["EACCE6","A15F5F"]]');  //Background colour + Image frame colour


/*
==============================================================================================
 Variables you should not touch
==============================================================================================*/
var MangaBigPagesID = 11319936;
var MaxSyncCalls = GM_getValue("SyncCalls", "5");
var ResizeMode = GM_getValue("ResizeMode", 0); //Bit operator for fitting and expanding images. (1 = FV, 2 = FH, 4 = Expand)
var IQDBType = GM_getValue("IQDBType", 2);
var IQDBTypes = ["All", "anime-pictures", "danbooru", "e-shuushuu", "haruhidoujins", "gelbooru", "konachan", "mangadrawing", "sankaku", "theanimegallery", "yandere", "zerochan"];
var ViewingPage = { previous: -1, current: 0, next: 1 };
var Illust = new Object();


var ColourSets = JSON.parse(GM_getValue("ColourSets", '[["EEF0F5","BFCBE9"],["DDF0F5","E2E2E1"],["F1F18A","C8F3C8"],["000071","000"],["EACCE6","A15F5F"],["FFF","C8C6C6"],["000","C8C6C6"]]'));
var ColoursActive = GM_getValue("ColoursActive", 0);
//#endregion

var ScrollBarThickness = TSL.getScrollBarThickness();
//#endregion

function GetCurrentViewedPage()
{
    var pages = document.getElementsByClassName("mPage");
    var thumbnails;
    if (document.getElementById("Thumbnails"))
        thumbnails = document.getElementById("Thumbnails").getElementsByTagName("a");

    ViewingPage = { previous: -1, current: -1, next: -1 };
    for (i = 0; page = pages[i], i < pages.length; i++)
    {
        if (thumbnails && thumbnails.length > 0) thumbnails[i].style.backgroundColor = null;
        var top = page.getClientRects()[0].top;

        if ((ViewingPage.previous == -1 || ViewingPage.next == -1))
        {
            if (top >= -1 && top <= 50)
            {
                ViewingPage.previous = i;
                ViewingPage.current = i + 1;
                if (ViewingPage.current < Illust.pageCount) ViewingPage.next = i + 2;
            }
            else if (top > 50)
            {
                ViewingPage.previous = i;
                ViewingPage.next = i + 1;
            }
        }
    }
    if (ViewingPage.previous == -1 && ViewingPage.current == -1 && ViewingPage.next == -1)
    {
        ViewingPage.previous = Illust.pageCount - 1;
        ViewingPage.current = Illust.pageCount;
    }
    //console.log("Page Count: " + Illust.pageCount, ViewingPage);

    if (thumbnails && thumbnails.length > 0)
    {
        if (ViewingPage.previous > 0) thumbnails[ViewingPage.previous - 1].style.backgroundColor = "#FFFFBD";
        if (ViewingPage.current > 0) thumbnails[ViewingPage.current - 1].style.backgroundColor = "#FF0";
        if (ViewingPage.next > 0) thumbnails[ViewingPage.next - 1].style.backgroundColor = "#FFFFBD";
    }
}


function GetAbsolutePosition(el)
{
    var x = 0;
    var y = 0;

    while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop))
    {
        x += el.offsetLeft;
        y += el.offsetTop;
        el = el.offsetParent;
    }
    return { top: y, left: x };
}

function GotoToPageID(id)
{
    var page = document.getElementById(id);
    if (page)
    {
        DisplayMessage("Page #" + (parseInt(id.match(/\d+/)[0])));
        var offset = GetAbsolutePosition(page);
        //console.log(page.id + " Top: " + offset.top);
        scrollTo(null, offset.top);
    }
    else console.error("Passed erroneous element ID: " + id);
}

function GotoToPageNumber(number)
{
    GotoToPageID("Page" + number);
}

function GotoToPage(e)
{
    var link = e.target;
    while (link.tagName != "A") link = link.parentElement;
    GotoToPageID(link.name);
    return false;
}


function RemoveAllDocumentContent()
{
    //Futile attempts to disable javascripts :/
    var doc = document.implementation.createHTMLDocument(document.title);
    document.replaceChild(doc.documentElement, document.documentElement);
}

function KeyDownCallback(e)
{
    //var key = String.fromCharCode(e.keyCode).toLowerCase();
    //e.stopImmediatePropagation();

    switch (e.keyCode)
    {
        case 38: //↑
        case 40: //↓
            e.stopImmediatePropagation();
            break;
        case 37: //←: Load previous page
        case 75: //K: (Pixiv's default for previous image)
        case 65: //A
            e.stopImmediatePropagation();
            GetCurrentViewedPage();
            if (ViewingPage.previous > 0) GotoToPageNumber(ViewingPage.previous);
            else GotoToPageNumber(ViewingPage.current);
            return false;
        case 39://→
        case 74: //J (Pixiv's default for next image)
        case 90: //Z: Load next page
            e.stopImmediatePropagation();
            GetCurrentViewedPage();
            if (ViewingPage.next > 0 && ViewingPage.next <= Illust.pageCount) GotoToPageNumber(ViewingPage.next);
            return false; //window.pageYOffset == document.documentElement.scrollTop
        case 81: //Q: Toggle Thumbnail Gallery Display
        case 102: //Num 6
            e.stopImmediatePropagation();
            var tg = document.getElementById("ThumbGallery");
            if (tg) tg.parentElement.removeChild(tg);
            else DisplayThumbGallery();
            return false;
        case 53: //5 Change Background Colour
        case 101: //Num 4
            e.stopImmediatePropagation();
            ResizeHQ.setColours();
            return false;
        case 79: //O: Pixiv's Original size
            e.stopImmediatePropagation();
            return false;
    }

    var mode = e.keyCode - 48;
    if (e.keyCode == 100) mode = 4;
    else if (e.keyCode != 101 && mode > 10) mode = mode - 48;
    if (e.keyCode == 192 || e.keyCode == 96) mode = 0;

    if (mode >= 0 && mode < 5)
    {
        e.stopImmediatePropagation();
        if (mode == 0) ResizeMode = 0;
        ResizeHQ.adjustSizeMode(mode);
        return false;
    }
}


function CreatePanelControl(text, href)
{
    var panel = document.createElement("span");
    panel.className = "controlPanel";
    var link = document.createElement("a");

    if (text) link.textContent = text;
    if (href) link.href = href;

    panel.appendChild(link);
    return panel;
}

function CreatePanelControlImage(href, imgSrc)
{
    var panel = CreatePanelControl(null, href, imgSrc);
    var image = document.createElement("img");
    image.src = imgSrc;
    panel.firstElementChild.appendChild(image);
    return panel;
}


function DisplayThumbGallery()
{
    var thumbgallery = document.getElementById("ThumbGallery");

    if (!thumbgallery)
    {
        thumbgallery = document.createElement("section");
        thumbgallery.id = "ThumbGallery";
        document.body.appendChild(thumbgallery);

        var infopanel = document.createElement("div");
        infopanel.style.display = "inline-block";
        infopanel.style.margin = "10px 0 0 10px";
        thumbgallery.appendChild(infopanel);


        var panel = CreatePanelControl(Illust.title, "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + Illust.id);
        infopanel.appendChild(panel);

        panel = CreatePanelControlImage("https://www.pixiv.net/member.php?id=" + Illust.userID, Illust.userIcon);
        infopanel.appendChild(panel);
        var image = panel.getElementsByTagName("IMG")[0];
        image.style.margin = "0 5px 0 10px";
        image.style.height = "20px";
        image.style.width = "20px";
        infopanel.appendChild(panel);


        panel = CreatePanelControl(Illust.username, "https://www.pixiv.net/member_illust.php?id=" + Illust.userID);
        infopanel.appendChild(panel);

        //var seperator = document.createElement("span");
        //seperator.setAttribute("style", "width: 50px;");
        //infopanel.appendChild(seperator);

        panel = document.createElement("span");
        panel.className = "controlPanel";
        var sel = document.createElement("select");
        sel.style.borderRadius = "0 5px 5px 0";
        sel.style.marginLeft = "50px";
        sel.title = "IQDB Search options";
        sel.onchange = function ()
        {
            IQDBType = sel.selectedIndex;
            GM_setValue("IQDBType", IQDBType);
        };

        for (var i = 0; i < IQDBTypes.length; i++)
        {
            var opt = document.createElement("option");
            opt.textContent = IQDBTypes[i];
            sel.add(opt);
        }
        sel.selectedIndex = IQDBType;
        panel.appendChild(sel);
        infopanel.appendChild(panel);


        var thumbs = document.createElement("div");
        thumbs.id = "Thumbnails";
        thumbgallery.appendChild(thumbs);
        for (var i = 0; i < Illust.pageCount; i++)
        {
            var thumbnail = document.createElement("a");
            var image = document.createElement("img");

            image.src = Illust.thumbnail;
            image.src = image.src.replace(/_p\d+/, "_p" + i);

            var div = document.createElement("div");
            var j = i + 1;
            div.textContent = (j);

            thumbnail.appendChild(image);
            thumbnail.appendChild(div);
            thumbnail.href = "#Page" + j;
            thumbnail.name = "Page" + j;
            thumbnail.onclick = GotoToPage;
            thumbs.appendChild(thumbnail);
        }

        thumbs.onclick = function () { thumbgallery.style.display = "none"; };
        thumbgallery.onclick = function () { thumbgallery.style.display = "none"; };
    }

    thumbgallery.style.display = null;
    GetCurrentViewedPage();

    return false;
}

/*
==============================================================================================

==============================================================================================*/
function ImageCursor(e, img)
{
    var pos = GetAbsolutePosition(img);

    if ((e.pageX - pos.left) < (img.width / 2))
    {
        if (img.getAttribute("page") == 1 && img.className != "cursorS") img.className = "cursorS";
        else if (img.getAttribute("page") > 1 && img.className != "cursorP") img.className = "cursorP";
    }
    else
    {
        if (img.getAttribute("page") == Illust.pageCount && img.className != "cursorS") img.className = "cursorS";
        else if (img.getAttribute("page") < Illust.pageCount && img.className != "cursorN") img.className = "cursorN";
    }
}

function DisplayMessage(msg)
{
    //text-align: center; display:inline-block; width: 100px; background-color: #D3D3D3; border: 1;
    var msgBox = document.getElementById("msgBox");
    if (!msgBox)
    {
        msgBox = document.createElement("span");
        msgBox.id = "msgBox";
        msgBox.setAttribute("style", "position: fixed; bottom: 30px; left: 10px; min-width: 200px; background-color: #D3D3D3; padding-left:10px; border-style: solid; border-color: #FF0000;");
        document.body.appendChild(msgBox);
    }
    msgBox.style.visibility = null;
    var div = document.createElement("div");
    div.textContent = msg;
    msgBox.appendChild(div);

    setTimeout(function (el) { if (el.parentElement.children.length == 1) el.parentElement.style.visibility = "hidden"; el.parentElement.removeChild(el); }, 2000, div);
}


/* Mouse Monitor Functions
====================================================================
 Monitors mouse cursor and set visibility of panels according to
 cursor position.
====================================================================*/
var MouseMonitor =
{
    stID: null,

    onMove: function (e)
    {
        MouseMonitor.isMouseOverPanel(e, "ButtonPanel");
        MouseMonitor.isMouseOverPanel(e, "LinkPanel");
        MouseMonitor.isMouseOverPanel(e, "galleryIcon");
    },

    isMouseOverPanel: function (e, id)
    {
        var panel = document.getElementById(id);
        if (!panel) return;
        if (TSL.isMouseEventInClientArea(e, panel))
        {
            if (panel.style.visibility)
            {
                clearTimeout(MouseMonitor.btnID);
                MouseMonitor.stID = null;
                panel.style.visibility = null;
            }
        }
        else if (!panel.style.visibility && !MouseMonitor.btnID)
        {
            MouseMonitor.stID = setTimeout(function () { panel.style.visibility = "hidden"; MouseMonitor.stID = null; }, 500);
        }
    }
};


/* ResizeHQ Functions
====================================================================
 Functions that deal with the image resize control panel
====================================================================*/
var ResizeHQ =
{
    addButtons: function ()
    {
        var panel = document.createElement("div");
        panel.id = "ButtonPanel";
        panel.setAttribute("style", "position:fixed; top: 50px; left: 5px; display:inline-block; z-index: 100; padding: 1px; background-color: #E1DFDF; border: 1px solid black; border-radius: 5px;");
        TSL.addStyle("", "#ButtonPanel > div {margin: 1px; width: 32px; background-color: #F9FAFA; border-radius: 5px; background-position: center center; background-repeat: no-repeat; cursor:pointer;} .resizeBTN:hover, #BGColorBtn:hover{border-color:red;}");

        TSL.addStyle("", ".resizeBTN {height:32px; border-color: #05F505 !important; border: 2px ridge; }");
        TSL.addStyle("", ".ColourBTN {height:24px;}");



        //TSL.addStyle("Buttons", ".resizeBTN");
        //#BGColorBtn{background-color: #F9FAFA; margin-top:10px; height:32px;width: 32px; border: 2px ridge #05F505; border-radius: 5px; cursor:pointer;}

        for (var i = 0; i < 4 + ColourSets.length ; i++)
        {
            var btn = document.createElement("div");
            if (i < 4) btn.className = "resizeBTN";
            else btn.className = "ColourBTN";
            btn.onclick = ResizeHQ.buttonClick;
            panel.appendChild(btn);
        }

        var btns = panel.querySelectorAll("#ButtonPanel > div");
        btns[0].style.backgroundImage = "URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAgklEQVR42mNkGGDAOOoAcjWeOXPmPzLfxMSELLNGHTC0HIBuKS5AimNIdjUhR5AaEmQFGy5HkBMNQysN4HIEuZZT7ABqgKHrAGDwL0bmA6MhdiAcEAPlLhmxDoADujuAWmBoO2BAC6IBLYoHtDIa0Op4UDRIcDlmZLQJRx1ACzDqAABrqFohocSl/AAAAABJRU5ErkJggg==')";
        btns[0].title = "Auto-Fit Height (1, Num 1)";
        btns[1].style.backgroundImage = "URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAeElEQVR42u3UbQqAIAwG4HanHcdOV8fZnbLAQERzLnIE7/4I6l4e8IMW5yIAAAAAAACeFkXkYOZXyF5GF3CNVoSmXwWwILS91GqqVR507t2KtdWSMwTImxMgpOn9Boxk/A/w+RGUNf0StkJcn6HrRzSjAAAAAAAAiN9oYiGanAXaAAAAAElFTkSuQmCC')";
        btns[1].title = "Auto-Fit Width (2, Num 2)";
        btns[2].style.backgroundImage = "URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAs0lEQVR42u2XYQqAIAyF804ep05Xx/FOlZAgw7k5zSW5P4L43j5zyjKLcpgJUCN2zp1+tNaKfcTCkDyEFEIkgslrIIoFWHIpRNFiKrkEYswa+A+AT4IZcwFyHlmAFo8Mx4fcXSsAzMvkBKkIJve6HcxvJfokAOeeA4D1mT64ABDiWwAln/CVI0hBdC9CKFS5hrFY7SHi7owCoGICjNeQqLZkFESXphSD6F6EMYTKj0mrmAAX79KqIbEwc3wAAAAASUVORK5CYII=')";
        btns[2].title = "Stretch (3, Num 3)";
        btns[3].title = "Fill Client Area while keeping ratio (4, Num 4)";
        btns[3].style.marginBottom = "5px";


        for (var i = 4; i < btns.length ; i++)
        {
            btns[i].value = i - 4;
            console.log(ColourSets[btns[i].value]);
            btns[i].style.backgroundColor = "#" + ColourSets[btns[i].value][0];
            btns[i].style.border = "2px solid #" + ColourSets[btns[i].value][1];
            btns[i].onclick = ResizeHQ.setColours;
        }

        document.body.appendChild(panel);
        ResizeHQ.resizeButtonsShow();
    },

    buttonClick: function (e)
    {
        var btns = document.getElementsByClassName("resizeBTN");
        for (var i = 0; i < btns.length; i++)
        {
            if (btns[i] == this)
            {
                ResizeHQ.adjustSizeMode(i + 1);
                return;
            }
        }
    },

    adjustSizeMode: function (mode)
    {
        var n = Math.pow(2, mode);
        var enabled = (ResizeMode & n);
        if (enabled) ResizeMode -= n; else ResizeMode += n;

        var msg = "";
        switch (mode)
        {
            case 1:
                msg = "Auto-height";
                break;
            case 2:
                msg = "Auto-width";
                break;
            case 3:
                msg = "Stretch";
                break;
            case 4:
                msg = "Fill Area";
                break;
        }

        if (mode > 0) DisplayMessage(msg + ((!enabled) ? " ON" : " OFF"));
        else DisplayMessage("Resize Off");

        ResizeHQ.readjustImageSizes();
        GM_setValue("ResizeMode", ResizeMode);
    },

    readjustImageSizes: function ()
    {
        var images = document.getElementsByName("MangaImage");
        for (var i = 0; i < images.length; i++)
        {
            var img = images[i];
            var maxH = window.innerHeight - 10;
            var maxW = window.innerWidth - 30;

            //Resize taking into account ScrollBars
            if (document.body.scrollWidth > document.body.clientWidth) maxH - ScrollBarThickness;
            if (document.body.scrollHeight >= document.body.clientHeight) img.style.width = maxW - ScrollBarThickness;

            img.style.maxHeight = (ResizeMode & 2) ? maxH + "px" : null;
            img.style.maxWidth = (ResizeMode & 4) ? maxW + "px" : null;

            if (ResizeMode & 16) //Fill Area: Max size without stretching
            {
                var imageRatio = img.naturalWidth / img.naturalHeight;
                var clientRatio = window.innerWidth / window.innerHeight;

                img.style.width = (imageRatio >= clientRatio) ? maxW + "px" : null;
                img.style.height = (imageRatio < clientRatio) ? maxH + "px" : null;
            }
            else if (ResizeMode & 8) //Stretch image
            {
                img.style.height = (ResizeMode & 2) ? maxH + "px" : null;
                img.style.width = (ResizeMode & 4) ? maxW + "px" : null;
            }
            else
            {
                img.style.height = null;
                img.style.width = null;
            }

            ResizeHQ.resizeButtonsShow();
        }

        GetCurrentViewedPage();
    },

    resizeButtonsShow: function ()
    {
        clearTimeout(ResizeHQ.stID);
        document.getElementById("ButtonPanel").style.visibility = null;

        var btns = document.getElementsByClassName("resizeBTN");
        btns[0].style.backgroundColor = (ResizeMode & 2) ? "yellow" : null;
        btns[1].style.backgroundColor = (ResizeMode & 4) ? "yellow" : null;
        btns[2].style.backgroundColor = (ResizeMode & 8) ? "yellow" : null;
        btns[3].style.backgroundColor = (ResizeMode & 16) ? "red" : null;

        //ResizeHQ.stID = setTimeout(function () { document.getElementById("ButtonPanel").style.visibility = "hidden"; }, 1000);
    },

    setColours: function ()
    {
        if (!isNaN(this.value)) ColoursActive = this.value;
        else if (++ColoursActive >= ColourSets.length) ColoursActive = 0;

        GM_setValue("ColoursActive", ColoursActive);
        MainHQ.addStyles();
    },

    windowResized: function ()
    {
        GetCurrentViewedPage();
        if (ResizeMode != 4 && ResizeMode != 0) ResizeHQ.readjustImageSizes();

        //Reason for this is due to the crap pixiv script that scrolls to the top after resize
        setTimeout(function ()
        {
            if (ViewingPage.current >= 0) GotoToPageNumber(ViewingPage.current);
            else if (ViewingPage.previous >= 0) GotoToPageNumber(ViewingPage.previous);
            else GotoToPageNumber(ViewingPage.next);
        }, 300);
    }
};

/* Main Functions
====================================================================
 Loads manga pages and alters the html interface
====================================================================*/
var MainHQ =
{
    imageCount: 0,
    syncLoads: 0,
    intervalID: 0,

    addStyles: function ()
    {
        TSL.addStyle("DockStyle", "body{margin: 0px;padding: 0px;}div.mPage{width: 100%;max-width: 100%;text-align: center;}#floatingPanel{position: absolute;text-align: center;width: 100%;margin: 0;padding: 0;}.controlPanel{text-align: center;vertical-align: middle;display: table-cell;margin: 0;padding: 0;}.directImageLink{background-color: #FFF;border-radius: 5px;margin: 0 5px;border: groove;}.IQDBLink, .pageCount{border-radius: 5px;text-decoration: none;border: groove;padding: 0 2px 0 2px;}.IQDBLink{background-color: #FF0;color: #00F;}.directImageLink:hover, .IQDBLink:hover, pageCount:hover{border-color: #0FF;}.pageCount{background-color: #E8F2F5;color: #808080;}.resizeBtn, .resizeBtnSelected{background-color: #E9E9EB;border-radius: 5px;border: groove;height: 24px;width: 24px;margin-left: 2px;}.resizeBtn:hover, .resizeBtnSelected:hover{background-color: #0FF;}.resizeBtnSelected{background-color: #FF0;}#ThumbGallery{position: fixed;background-color: #E6E5E5;height: 100%;max-height: 100%;width: 100%;z-index: 500;margin: 0px;left: 0px;top: 0px;}#Thumbnails{overflow: auto;position: absolute;top: 40px;bottom: 0px;}#Thumbnails > a{padding: 5px;margin: 5px;min-width: 128px;background-color: #F8FDFF;display: inline-block;text-align: center;}.cursorP{cursor: url('data:image/cursor;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABYdJREFUWIXtll+IXFcdxz+/c86dO3dmJ7ubNsaG1FhZW7fVBpvY1BJ8ia0PrRWpSgNWpT4Ilap5EB+aB0EqvimKYKONVUFBaKiCUCwohtQKeailtQQTa9Jsmmx2Zje7szsze+89v58PM7PJJs0m/kMf8oPDmcM9/L6f8/uePwPX4lr8j8P/M5Mnd0386IbJDZ8aDevfk/fyVp7nM/8tsEvivR+dOPBi+3fWitP2TOtpu/vz2w/9J/KGq5k0cdeWJ7/1w29+fFttJ2rKu5JJet1OAmzMyJJIrIVaVquntRGwhvPWkCAZUMvqWb2yLjQoWG6dWni5OTd9GDg7zC1XEn/HbZv3Pv7sV77xic2fo7QcJ54TnWM8+dz3aMgYlSwQqp5qNSNkniQNVNMqPvGklZQkVAg+kK1PaZ2d5S9/OsJ3d//s9qJYeuWKAJs2b3rkC88+9NRn3/0o3WIJw4EozhzBJ9jKTMOs34OBcv6bGeI9o/VRgg/89uSv+fRNX7w3svz8mhaMj4/f98mf3PPUA+98iNOLU5gAppgKaoZcsXYr+vjgkMwI5ukVPby3JEYcoG8JkIVs+337dv7q/skHeXPxJJhhppgJZoaZoarIVVCYGSEJ1GOGiCcnX/X9LQDSiY98/4N/uP/Oj/nphTN9MeuXdihuMWIYqnLew1U/LjDHjCRJWK9jOBy5La8JcP09T9xxcNeuXbVme4YY44pwjAARi0ZUGBotCIhQxJx23qaIyzjnGUkaVEMGGEmssKgbcebI9fIA1Q99edvBnQ/uuGGhvYBaxNSIGlE1TBU17eua0S16nF08TbMzzUz3DPO9eYzB3jBQjHqos6lxIzdvvI2bdAuiQnm5Cuz4zNbnGruZfOHE70GFIAl1N0Lma5j2Pc+LnNluk7lOk/ZyG439fSA4vPfIRYcq15zXzx3ldDHF224Zo2GjdOLSQDZfBVBZd2t6V5F3KaxEVenEJeZikzKWxKhoqUSNWFQ0Gk48/eUORO2880MMEcHhCBKIUjJfzrGgi6sg3aBPDj3+ysP2WlVd4jAzxPqZBI/D45zgncMFj0sgJA5XEVxiuMSQYIjvN3OGyfBuGPJdjLcaIO/G7qHDe47uqczUkeD6fht4Z7gg+IonqXpCFZLM4+oQRjyh4QgjjsqIJ9Q9PhN8KrjE9aEETM6TXGzT0IICmDvXPXfg8KPHx+98esvXF9N5KAwRj0hEnMMEnAuoi3hzRAwkIAYaFYuCRaAUYqlo0R+H4PH4S1Z/IQBAD5htzp7d/+pj1fVbf/z2Ly2GWRTFe49LDPOgHtQZJY5k4JMZmDqsNKwEzQVfCrpsxFxxiZC6CiqGWyn6pQAAXWD2jRNvfLu6J9nwvn0bdre1hXpFKmDBYd5Q5/q7X9zQYEzBSkXLgBaG9owyNaQHFefIXErpFC9+TQADOkDrry//bW/4anLdtn0b723aNEVYJoY42GggYjgHblABFDQKrhC0AE1BlqFMhATHuFtH1+fMyvyaAEOIJcC9dvDIY9nXbv/pHT/YtOOkHQcP4h1ZSJloT9KcWyBWCtRHokQKKykoiCjRRcqkf3RTaiwkixQ+0tEeAjoUW+s1ccAocOPdj7z/l1u/s+6WY3YU7zyNrMap3aN/P/Kb1/cnWVJ1IWQhUA31UEsynyU1V5PMpz6TzGcuTdcltarPitN/bh1tHTv30szc9H6gyeVew0EosABM/XH/Sw9Xrv/AgZuf2LK55ZtcJ2O8Wdf52U7z53TQCxbiBk0u6of5ikF124Pxlf8R0bdpDMKtH967/Zl6LZUzr84fP/VC8xdTJ6b20T89w1wXXI2rxsMnMgLloK1MuppIgPFBS+lf5HPA7GBV/3JcLQD0K1GlX9I4gPi3xK/F/0X8A9KAi5v8bApEAAAAAElFTkSuQmCC') 16 16, auto;}.cursorN{cursor: url('data:image/cursor;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABYRJREFUWIXtlVuMXWUVx39rfXufM9feZnoZ0URISWgVi1KkKg/GJvog4ihG5YHEoCnEBAMPPNUHE0WNL14SH9BYBR/qS4mamHhBIk21IoKpBLBja6RtJu3cZ86cfTn7+77lwz4zHc4gnZgSX7qS7+zvXPb6/771X2sfuBbX4v8ccjWSDA0N7R1729h43/W615eheOX3Z75wNfJuON7/+f0njs3+xGbDJTvZetre+bHdT2703qTn/Y7RrTtvG7lu0z5Smp0l38rbeRvIzFseg7RAWu0yW/ZZnjlclpNXRZ6lN6R7GLTN3DpwB9/84dc/8dD4I4+d+fOr928YIE0Hb/7S0Xv//o4DNzGyYxv5XIkPnsp3KDsloQoUZUFVenweKIocXwQ6uadlC4TK06oWiRZ43+YP8chPHzz06Ph3zp976cLXNgQQK79r/637+fCuu/DBs9hYxEKApsBgt1kU6p0gsrKvX32omM4ugilC5CM7xrn4+ORXHxv/2eTkhckjVwJQ5ywtqoIlP4+3wEwxRfCxK3TlMAMVQdRAlIVynrve/lnmHp/90ROf+uWl+fn5X71hBQA6dGiFFmaB2WIaX3lkAwRmhqoiIt1liChUwp177mb2B3O/OHbPUwdyn//1jQGspB0WiURms2mqquoBEMC6qpcvqoYgiHOrECB1RQrhzvd+3C1/v/3Mz+//4z4oz/x3gFiyHJaIEpkrZqiqDiAUPme5ahFjIHVNhhvDpK4BZhi22iBOQZwADudYBXHecfDgwYH2o/nx3x0++S5g5nUBvJW0QwtT4+zSBBOXXmKydZ62b6MISO21IGzu28z2/l2MDuxkx9AY/WlfLaigoogqqoJThwRBK8cdd98+Vk51jh//7vPvAYoegIQstPlXcZqWLPLMhd+Qt3NUlIZrvNZzjOXOMq3OBGcXTqNOGW4Os3VglG39ozTSRt0TKuQhox2X8VaBGsP3JHtun9/362efOPXBdRVYigsQPJZGEknqk4j02s7l8XOIGCpK4UsutSeZKi7i1KGJ4pySuATnEpxTVBQ6kU17+w8ADaDT8ySU1ROuntYAqX1e7cfX7IVEFVFQdagIqoLiELT+rXUnJVXs5b544vCL9wLpOgBZ899kYrWIM0QVcYY4ut7W3680nwokOETAiQMUQXBiYEIkkiQpjelBTj488XAe8hNAZ50FKxAOR5I4tE8QB5qCSxwkhrgaRp3DpC6RQxBRNDpcVMQUi6DmMAOXOgY7w/zli//+ykK+8CQwD1TrABQllaQuYVNIVHANRZuCJoI2DEkUSQTRFRsMMyFB0ahoUCQosRIIdc4ht4VTD1z83szc1BFgju4ErANw4mhqg0SVRr9SNRXtU5JU0D5BU0GTLoSutgxmRmKKRkGCIl6wjqBBGdYRXjw0ffTcq+e+3RXP12r2AAhDboB+bZAO1m2U9AmuKWijBpAUtLYZEYgYMRpiEQuRGALOO9Jmk1HZyfOHZn47cersl4FZIGPtMK0FEIhZLMj6cirt0GwMYNT+Jao4HA4l9SlpSHDm0OBwnZTRTZs4M/wKuS+xYCRBeKu8hRcemH/25eP/eLAr3u4V53IRUWB0+9ad943s3vLusVtGbixCnpZLVRbyWIbccstDWWUxq/KQ+7bPvKeI3udVXhU3ffSG+647unh9K88IMbBbbuTUQ0un/3Tkb58GzgOLQOwVXwsA0A9sAQapZ1S7n8cu+drrSjID9AOfu+3YzT/WW6ZtjpEwysRhf+EP33ruk8DZrnh4PXEAt2bvqbtzGWh1b1xYsxaBpZ7VAjo2r2n7uebIwMT25tRTPnv6Gy98BuI/ryTeW4H/NVJgG7CV+vFaUs/56qy/2QArEA3qikbqSvqrlPtavLnxH1JHdHLMfy8nAAAAAElFTkSuQmCC') 16 16, auto;}.cursorS{cursor: url('data:image/png;base64,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') 24 24, auto;}");
        TSL.addStyle("GalleryThumbs", "#Thumbnails img {max-width: 200px; min-width: 200px;}");
        TSL.addStyle("", ".mPage {padding: 2px 0}");
        TSL.addStyle("BGColour", "body {background-color:#" + ColourSets[ColoursActive][0] + "}");
        TSL.addStyle("IMGFrame", "div.mPage > img{border: 2px solid #" + ColourSets[ColoursActive][1] + ";}");
        //TSL.addStyle("IMGShadow", "div.mPage > img{margin: 0 5px; box-shadow: 10px 10px 5px #888888;}");
    },

    LoadAllMangaPages: function ()
    {
        RemoveAllDocumentContent();
        MainHQ.addStyles();


        for (var i = 0; i < Illust.pageCount; i++)
        {
            var link = document.createElement("a");

            link.href = Illust.full.replace(/_p\d+/, "_p" + i);
            link.title = i;
            document.body.appendChild(link);
        }

        MainHQ.intervalID = setInterval(MainHQ.loadNextImage, 100);

        //Creating Thumbnail Gallery Button
        var d = document.createElement("d");
        d.id = "galleryIcon";
        d.setAttribute("style", "visibility:hidden; position:fixed; right: 0px; top:0px; z-index:100; padding:15px;");
        var a = document.createElement("a");
        a.href = "#ShowGallery";

        var img = document.createElement("img");
        img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA8ElEQVR42mNkGGDAOOqAUQcMWgecOXNmL5ByQhNeYGJiknj69Om1jIyMQcgS////X2dqahoM1DcfyE1A07cPqM+ZVAf8xyL8CGiQPFDuA5DNjyb3ESgnAJR7CGTLoWsEymG1a9QBg9oBoMSEkgiBCW0xMKHVAOUmArkBaFo2AC3JBybQFmACjUWTAyXCRJIcQC+ALwTWMWBmw4UgX0JDJxBNbj3Il9DQiUcLub2gLEqqA3CmAWAwfwQGMx+a3PBLhKMOGNhESC8weAuiwZAGRh0w4A7A2SSDZlGUbIivSQbNhi4kOYBeYNQBow4YcAcAAP+JFzAAMwyCAAAAAElFTkSuQmCC";

        img.className = "directImageLink";
        a.appendChild(img);
        d.appendChild(a)
        document.body.appendChild(d);

        //#region LinkPanel
        var linkPanel = document.createElement("div");
        linkPanel.setAttribute("style", "visibility:hidden;  position: fixed; left: 10px; top: 10px; z-index:100; border: 1px ridge gray; padding: 5px;");
        linkPanel.id = "LinkPanel"

        var panel = CreatePanelControl(Illust.title, "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + Illust.id);
        linkPanel.appendChild(panel);

        panel = CreatePanelControlImage("https://www.pixiv.net/member.php?id=" + Illust.userID, Illust.userIcon);
        linkPanel.appendChild(panel);
        var image = panel.getElementsByTagName("IMG")[0];
        image.style.margin = "0 5px 0 10px";
        image.style.height = "20px";
        image.style.width = "20px";
        linkPanel.appendChild(panel);

        panel = CreatePanelControl(Illust.username, "https://www.pixiv.net/member_illust.php?id=" + Illust.userID);
        linkPanel.appendChild(panel);

        document.body.appendChild(linkPanel);
        a.onclick = DisplayThumbGallery;
        document.body.onmousemove = MouseMonitor.onMove;
    },

    loadNextImage: function ()
    {
        if (MaxSyncCalls == MainHQ.syncLoads) return;
        MainHQ.syncLoads++;

        MainHQ.imageCount++;
        var mPage = document.createElement("div");
        mPage.className = "mPage";
        mPage.id = "Page" + MainHQ.imageCount;


        var img = document.createElement("img");

        img.src = Illust.full.replace(/_p\d+/, "_p" + (MainHQ.imageCount - 1));
        img.setAttribute("page", (MainHQ.imageCount));
        img.alt = "Page " + (MainHQ.imageCount) + " out of " + Illust.pageCount + "pages";
        img.title = "Page " + (MainHQ.imageCount) + " out of " + Illust.pageCount + "pages";
        img.name = "MangaImage";
        img.id = "IMG" + MainHQ.imageCount;

        MainHQ.imageEvents(img);
        mPage.appendChild(img);
        //document.body.appendChild(mPage);
        document.body.insertBefore(mPage, document.body.children[MainHQ.imageCount - 1]);

        if (MainHQ.imageCount == Illust.pageCount) clearInterval(MainHQ.intervalID);
        TSL.removeNode("fb-root"); //Sometimes an extra div is created by Pixiv script. Just removing it.
    },

    imageEvents: function (img)
    {
        img.onload = function (e)
        {
            MainHQ.syncLoads--;
            ResizeHQ.readjustImageSizes();
            this.onload = null;
        };

        setTimeout(ResizeHQ.readjustImageSizes, 500, img);

        img.onclick = function (e)
        {
            var page = parseInt(img.getAttribute("page"));
            if (this.className == "cursorP")
            {
                GotoToPageNumber(--page);
                ImageCursor(e, document.getElementById("IMG" + page));
            }
            else if (this.className == "cursorN")
            {
                GotoToPageNumber(++page);
                ImageCursor(e, document.getElementById("IMG" + page));
            }
        };

        img.onmousemove = function (e)
        {
            ImageCursor(e, this);
            var pos = GetAbsolutePosition(this);

            var floatingPanel = document.getElementById("floatingPanel");
            if ((e.pageY - pos.top) > 100 && ((pos.top + this.height) - e.pageY) > 100)
            {
                if (floatingPanel) floatingPanel.parentElement.removeChild(floatingPanel);
                return;
            }

            if (!floatingPanel)
            {
                floatingPanel = document.createElement("section");
                floatingPanel.id = "floatingPanel";
                floatingPanel.style.position = "absolute";
                document.body.appendChild(floatingPanel);


                var panels = document.createElement("div");
                panels.style.display = "inline-block";
                floatingPanel.appendChild(panels);


                //Pager
                var panelLink = CreatePanelControl(this.getAttribute("page") + "/" + Illust.pageCount, "#" + this.parentElement.parentElement.id);
                panelLink.firstElementChild.name = this.parentElement.parentElement.id;
                panelLink.firstElementChild.onclick = GotoToPageID;
                panelLink.firstElementChild.className = "pageCount";
                panels.appendChild(panelLink);

                //Direct Image Link
                var panelLink = CreatePanelControlImage(null, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABDklEQVR42mNkGGDAOOqAUQdQasCZM2dE/v///4iRkZETj7JfQNxrYmJSRZMQADoiE0hNJWDeL6AD2GniAGIdAXQAhhwjDsP+E2sxsqGnT5+uAkZF64A44MSJE+IsLCz7gUxNujuAGMtp6gBg0G8CBr0vsaFFsgOwaQQBAj6/DsyeS4AOa4HZQ3UH4PH59T9//jhaWFi8RM4dVHMAPp8Dfb3579+/qSDLkcwDOaIHaA43VRyAz+dAtVrYzDx58qSwubn5W2o54DLQATqEfE4MIMsBQN+4MzMzbwQyYUUrTp/TxAEwRzAxMfUAmfdNTU39yLGcIgdQon7UASQ7gFQw6oCh7wB6glEHjDpgwB0AADHkuyGqtwsNAAAAAElFTkSuQmCC");
                panelLink.getElementsByTagName("img")[0].className = "directImageLink";
                panels.appendChild(panelLink);

                //
                var panelLink = CreatePanelControl("IQDB", null);
                panelLink.firstElementChild.className = "IQDBLink";
                panels.appendChild(panelLink);
            }


            if (floatingPanel.getAttribute("page") != img.getAttribute("page"))
            {
                var pos = GetAbsolutePosition(img);
                if ((e.pageY - pos.top) <= 100) floatingPanel.style.top = pos.top + "px";
                else floatingPanel.style.top = (pos.top + img.clientHeight - 50) + "px";

                floatingPanel.style.left = window.pageXOffset + "px";

                var links = floatingPanel.getElementsByTagName("a");
                links[0].textContent = img.getAttribute("page") + "/" + Illust.pageCount;
                links[1].href = img.src;
                links[2].href = "https://" + ((IQDBType == 0) ? "www" : IQDBTypes[IQDBType]) + ".iqdb.org/?url=" + Illust.thumbnail.replace("_p0", "_p" + (img.getAttribute("page") - 1)) + "&"; //& at the end so as not to get picked up by download managers
                floatingPanel.setAttribute("page", img.getAttribute("page"));
            }
        };
    }
};



/* Main Function
====================================================================
Main function that extracts illustration information from the
document.
====================================================================*/
(function ()
{
    //Removes old settings
    var Version = 1002;
    if (GM_getValue("Version", 0) != Version)
    {
        var names = GM_listValues();
        for (var i = 0; name = names[i], i < names.length; i++)
        {
            var skipNames = ["SyncCalls", "IQDBType", "GMU-CoolingPeriod", "GMU-Timestamp"];
            var found = false;
            for (var j = 0; j < skipNames.length; j++) found = found || (name.indexOf(skipNames[j]) == 0);
            if (!found) GM_deleteValue(name);
        }
        ResizeMode = 0;
        GM_setValue("ResizeMode", 0);
        GM_setValue("Version", Version);
    }

    Illust.id = unsafeWindow.pixiv.context.illustId;
    Illust.title = document.querySelector(".breadcrumbs h1").textContent;
    Illust.userID = unsafeWindow.pixiv.context.userId;
    Illust.username = document.querySelector(".user").textContent;
    Illust.userIcon = document.querySelector(".user-icon").src.replace("_ss", "_s");
    //Illust.userLoginName = Illust.userIcon.match(/\/profile\/([^\/]+)\//)[1];
    Illust.pageCount = unsafeWindow.pixiv.context.images.length;
    Illust.full = unsafeWindow.pixiv.context.images[0];
    Illust.full = Illust.full.replace(/\/c\/\d+.+img-master\/(.+\d+_p0)(_master\d+)?/, "/img-original/$1");
    Illust.thumbnail = unsafeWindow.pixiv.context.thumbnailImages[0];
    Illust.thumbnail = Illust.thumbnail.replace("_128x128_p0", "_240mw_p0"); //Handles old naming format to display none-square larger thumbnails
    //Illust.thumbnail = Illust.thumbnail.replace(".png", ".jpg");
    Illust.thumbnail = Illust.thumbnail.replace("_p0_square1200", "_p0_master1200"); //Handles new naming format to display none-square larger thumbnails
    //Illust.thumbnail = Illust.thumbnail.replace("/128x128/", "/150x150/");
    Illust.thumbnail = Illust.thumbnail.replace("/128x128/", "/240x480/");

    if (Illust.thumbnail.indexOf("/img-master/") < 0) //Old format
    {
        if (Illust.id >= 11319936) Illust.full = Illust.full.replace("_p0", "_big_p0");
        changeInterface();
    }
    else //New format. We do not know the extension of the large size so we have to get information on it.
    {
        var oReq = new XMLHttpRequest();
        oReq.open("GET", "https://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=" + Illust.id + "&page=0", true);
        oReq.responseType = "text";
        oReq.timeout = 15000;
        oReq.onload = function (e)
        {
            if (oReq.status == 200)
            {
                var doc = new DOMParser().parseFromString(oReq.response, "text/html");
                try
                {
                    Illust.full = doc.getElementsByTagName("img")[0].src;
                }
                catch (err) { }
            }
            changeInterface();
        };
        oReq.send();
    }

    function changeInterface()
    {
        console.log(Illust);
        MainHQ.LoadAllMangaPages();
        ResizeHQ.addButtons();
        window.onresize = ResizeHQ.windowResized;
        window.addEventListener("keydown", KeyDownCallback, true);
    }
})();