E-Hentai <-> ExHentai

Links between E-Hentai and ExHentai page, and also links user to ExHentai automatically if gallery is "removed" and adds "view later" function

נכון ליום 04-07-2017. ראה הגרסה האחרונה.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name           E-Hentai <-> ExHentai
// @description    Links between E-Hentai and ExHentai page, and also links user to ExHentai automatically if gallery is "removed" and adds "view later" function
// @namespace      https://greasyfork.org/en/scripts/24342-e-hentai-exhentai
// @version        3.06
// @icon           https://e-hentai.org/favicon.ico

// @include        https://upload.e-hentai.org/*
// @include        http*://e-hentai.org/*
// @include        http*://exhentai.org/*

// @exclude        https://e-hentai.org/archive*
// @exclude        https://e-hentai.org/gallery*
// @exclude        https://exhentai.org/archive*
// @exclude        https://exhentai.org/gallery*

// @require        https://code.jquery.com/jquery-3.1.1.min.js
// @require        https://greasyfork.org/scripts/27104-filesaver/code/FileSaver.js?version=173518
// @author         Resuha
// @grant          GM_getValue
// @grant          GM_setValue
// ==/UserScript==

//Credit to developer of https://github.com/js-cookie/js-cookie

//Ver 3.00 added "view/read later" functionality
//Ver 2.00 added redirector and cookie remover

var extraCSS = document.createElement("style");
extraCSS.textContent = `
.link, .option {
cursor: pointer;
text-decoration: underline;
}

.option, #placeholderText{
font-size: 125%;
}

.readLaterItem{
font-size: 125%;
}

.readLaterItem > .option{
font-size: 100%;
}

.divHeader{
font-size: 160%;
font-weight: bold;
}

.link.dark{
color:yellow
}

.option.dark{
color:plum
}

#fixedDiv.dark, #readLaterDiv.dark,#successDiv.dark,#previewDiv.dark{
background-color:rgba(64, 64, 0, 1)
}

#mpvAddon.dark{
background-color:rgba(64, 64, 0, 0.4)
}

.link.light{
color:blue
}

.option.light{
color:Red
}

#fixedDiv.light, #readLaterDiv.light,#successDiv.light,#previewDiv.light{
background-color:rgba(255, 255, 0, 1)
}

#mpvAddon.light{
background-color:rgba(255, 255, 0, 0.4)
}

#successDiv{
font-size: 125%;
position: absolute;
transform: translate(-100%, -50%);
z-index:10;
padding: 8px 8px;
}

#linker{
font-size: 160%;
}

#fixedDiv{
text-align: left !important;
position: fixed;
top: 12px;
right: 12px;
align: left;
padding: 8px 8px;
z-index:10;
}

#fixedDivPeek{
text-align: left !important;
position: fixed;
top: 0px;
right: 0px;
width: 10px;
height: 10px;
background-color:rgba(255, 255, 0, 1);
align: left;
padding: 8px 8px;
z-index:10;
}

#readLaterDiv{
text-align: left !important;
position:fixed;
bottom: 24px;right: 24px;
width: 55%;
align: left;
z-index:10;
padding: 8px 8px;
}

#i1 > #mpvAddon{
float:right;
padding:0px 10px 10px 10px;
cursor: pointer;
}

#optionDivUL, #readLaterUL, #readLaterOptionDivUL{
margin: 0; padding: 0px 0px 0px 20px;
}

#readLaterUL{
max-height: 160px;
overflow: auto;
}

.topRightDivButton{
float:right;
cursor: pointer;
padding: 0px 4px 2px 3px;
border: 1px solid;
font-size: 80%;
}

#previewDiv{
position:fixed;
transform: translate(-50%, -100%);
z-index:10;
padding:4px;
border: 1px solid yellow;
}
`;
document.head.appendChild(extraCSS);

var fixedDiv = `'
<div id="fixedDiv">
  <div class="divHeader"><label id="scriptTitleHeader">E<->Ex v`+GM_info.script.version+`</label><label class="topRightDivButton" id="minmaxFixedDivButton">–</label></div><BR>
  <div id="linkerDiv">
    <label class="divHeader">Linker:</label>
  </div>
  <div id="readLaterOptionDiv"><BR>
    <label class="divHeader">Read Later:</label><BR><ul id="readLaterOptionDivUL"></ul>
  </div>
  <div id="optionDiv"><BR>
    <label class="divHeader">Option:</label><BR><ul id="optionDivUL"></ul>
  </div>
</div>'`;
$('body').append(fixedDiv);
fixedDiv = $('#fixedDiv');
linkerDiv = $('#linkerDiv');
optionDiv = $('#optionDiv');
optionDiv.hide();
document.getElementById('minmaxFixedDivButton').addEventListener("click", function(){
    if($('#scriptTitleHeader').is(":visible")){
        hideFixedDivContent();
    } else {
        showFixedDivContent();
    }
});

function hideFixedDivContent(){
    $('#minmaxFixedDivButton').text("+");
    $('#scriptTitleHeader').hide();
    $('#linkerDiv').hide();
    $('#readLaterOptionDiv').hide();
    $('#optionDiv').hide();
}

function showFixedDivContent(){
    $('#minmaxFixedDivButton').text("–");
    $('#scriptTitleHeader').show();
    $('#linkerDiv').show();
    $('#readLaterOptionDiv').show();
    if ($('.setting').length > 0){
        $('#optionDiv').show();
    }
}

var readLaterDiv = `'
<div id="readLaterDiv">
  <div class="divHeader"><label>Read Later List:</label><label class="topRightDivButton" id="closeReadLaterButton">✖</label></div>
  <ul id="readLaterUL"></ul>
</div>'`;
$('body').append(readLaterDiv);
document.getElementById('closeReadLaterButton').addEventListener("click", function(){
    hide_rlList();
});
readLaterDiv = $('#readLaterDiv');
readLaterDiv.hide();

var previewDiv = `'
<div id="previewDiv">
  <img id="previewImg" src=""></img><label id="placeholderText"></label>
</div>'`;
$('body').append(previewDiv);
document.getElementById('closeReadLaterButton').addEventListener("click", function(){
    hide_rlList();
});
previewDiv = $('#previewDiv');
//previewDiv.hide();

var targetWebsite;
if (document.location.href.indexOf('exhentai') != - 1) {
    link = 'https://e-hentai.org' + parse_gallery_identifier();
    targetWebsite = 'E-Hentai';
    fixedDiv.addClass("dark");
    readLaterDiv.addClass("dark");
    previewDiv.addClass("dark");
} else {
    link = 'https://exhentai.org' + parse_gallery_identifier();
    targetWebsite = 'ExHentai';
    fixedDiv.addClass("light");
    readLaterDiv.addClass("light");
    previewDiv.addClass("light");
} // Determine if the current page is E-Hentai or ExHentai

var readLaterList;
populate_rlDiv();
window.addEventListener('focus', function() {
    populate_rlDiv();
});

var currentPageHref = window.location.href;

$(document).ready(function () {
    if (document.title == 'Gallery Not Available - E-Hentai Galleries'){ // Gallery is expunged in e-hentai
        document.location.href = 'https://exhentai.org' + parse_gallery_identifier();
    } else if(document.title == "exhentai.org (260×260)"){ // Got sadpanda
        var bYes = '<button id="yesButton" class="askButton">Yes';
        var bNo = '<button id="noButton" class="askButton">No';
        var askConfirm = '<div id="confirmDiv">Are you currently logged in at e-hentai.org forum?<label id="message"><br>'+bYes+bNo+'</div>';
        $('body').append(askConfirm);
        askConfirm = $('#confirmDiv');
        askConfirm.css({
            'align':'center',
            'color':'blue',
        });

        $('#yesButton').click(function(){ // Clear cookie and refresh
            $('#confirmDiv').text("This page will refresh. If you still see this page after the refresh, it is possible that your account is not old enough for exhentai");
            setTimeout(function() {
                // delete cookie
                Cookies.remove('yay', {domain:'.exhentai.org'});
                location.reload();
            }, 1000);
        });
        $('#noButton').click(function(){ // Redirect to forum
            $('#confirmDiv').text("Redirecting to E-Hentai login page");
            setTimeout(function() {
                document.location.href = 'https://forums.e-hentai.org/index.php?act=Login&CODE=00';
            }, 1000);
        });

    } else {
        if(currentPageHref.indexOf("/mpv/") === -1){
            var link;
            var linker;

            if (targetWebsite == 'ExHentai') {
                if(document.location.href == 'https://upload.e-hentai.org/manage.php'){
                    linker="https://exhentai.org/upload/manage.php";
                } else {
                    linker="https://exhentai.org"+parse_gallery_identifier();
                }
                linkerDiv.append(createLink("linker",linker,"To ExHentai"));
            } else {
                if(document.location.href == 'https://exhentai.org/upload/manage.php'){
                    linker="https://upload.e-hentai.org/manage.php";
                } else {
                    linker="https://e-hentai.org"+parse_gallery_identifier();
                }
                linkerDiv.append(createLink("linker",linker,"To E-Hentai"));
            } // Add option to switch between E-Hentai and ExHentai in the top bar of the page

            document.getElementById('linker').addEventListener("click",function(){
                document.location.href = linker;
            });

            // Setting page
            if(currentPageHref.indexOf("uconfig") > -1){
                optionDiv.show();
                var optionArray = [];
                optionArray.push(createOptionWithClass("loadSettingOption","Load saved user setting","setting"));
                optionArray.push(createOptionWithClass("saveSettingOption","Save current user setting","setting"));

                for (i=0;i<optionArray.length;i++){
                    $('#optionDivUL').append(optionArray[i]);
                }

                document.getElementById('loadSettingOption').addEventListener("click",function(){
                    var setting = GM_getValue("userSetting","");
                    if(setting !== ""){
                        if (document.location.href.indexOf('exhentai') != - 1) {
                            Cookies.set("uconfig",setting,{domain:".exhentai.org", expires:365});
                        } else {
                            Cookies.set("uconfig",setting,{domain:".e-hentai.org", expires:365});
                        }
                        alert("User setting loaded");
                        location.reload();
                    } else {
                        alert("Nothing to load");
                    }
                });
                document.getElementById('saveSettingOption').addEventListener("click",function(){
                    GM_setValue("userSetting", Cookies.get("uconfig"));
                    // Maybe have an option to save it to file
                    alert("User setting saved");
                });
            }

            // Gallery page
            if(currentPageHref.indexOf("/g/") > -1 || currentPageHref.indexOf("/s/") > -1){
                var indexMatch = getIndex_rlList(parse_gallery_identifier());
                if(indexMatch.exactMatch === true && readLaterList[indexMatch.index].thumbnailLink !== "undefined"){
                    $('#readLaterOptionDivUL').append(createOption("addReadLaterOption",'Already in "view later" list'));
                    $('#addReadLaterOption').css({
                        'text-decoration': 'none',
                        'cursor': 'default',
                    });
                } else {
                    $('#readLaterOptionDivUL').append(createOption("addReadLaterOption",'Add to "view later" list'));
                    document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction);
                }

                if(currentPageHref.indexOf("/s/") > -1){
                    var successDiv;
                    if(targetWebsite === "E-Hentai"){
                        $('#i1').prepend('<div id="mpvAddon" class="dark"></div>');
                        $('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/rdXO8o2.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">');
                        $('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/ywCl5NP.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">');
                        successDiv = '<div id="successDiv" class="dark">Added/updated "view later" list</div>';
                    } else {
                        $('#i1').prepend('<div id="mpvAddon" class="light"></div>');
                        $('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/tWBUjde.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">');
                        $('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/XH8qCCi.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">');
                        successDiv = '<div id="successDiv" class="light">Added/updated "view later" list</div>';
                    }
                    $('body').append(successDiv);
                    successDiv = $('#successDiv');
                    successDiv.hide();

                    document.getElementById('mpvSave_rl').addEventListener("click", add_rlEntryFunction);
                    document.getElementById('mpvView_rl').addEventListener("click", view_rlButtonClick);
                    hideFixedDivContent();

                    var oldLocation = location.href;
                    setInterval(function() {
                        if(location.href != oldLocation) {
                            oldLocation = location.href;
                            $('#addReadLaterOption').text('Add to "view later" list');
                            document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction);
                            $('#addReadLaterOption').css({
                                'text-decoration': 'underline',
                                'cursor': 'pointer',
                            });
                        }
                    }, 2000); // check 2 seconds
                }
            }

            $('#readLaterOptionDivUL').append(createOption("seeReadLaterListOption",'Show "view later" list'));
            document.getElementById('seeReadLaterListOption').addEventListener("click",view_rlButtonClick);

            // If there is no option available, hide the optionDiv completely
            if ($('.setting').length === 0){
                optionDiv.hide();
            }

            $('#readLaterOptionDivUL').append(createOption("export_rlListOption",'Export list'));
            document.getElementById('export_rlListOption').addEventListener("click",exportClick);

            $('#readLaterOptionDivUL').append(createOption("import_rlListOption",'Import list'));
            document.getElementById('import_rlListOption').addEventListener("click",importClick);

            $('#readLaterOptionDivUL').append(createOption("reset_rlListOption",'Empty the list'));
            document.getElementById('reset_rlListOption').addEventListener("click",resetList);
        } else {
            var successDiv;
            if(targetWebsite === "E-Hentai"){
                $('#bar3').append('<div id="mpvAddon" class="dark"></div>');
                $('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/rdXO8o2.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">');
                $('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/ywCl5NP.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">');
                successDiv = '<div id="successDiv" class="dark">Added/updated "view later" list</div>';
            } else {
                $('#bar3').append('<div id="mpvAddon" class="light"></div>');
                $('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/tWBUjde.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">');
                $('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/XH8qCCi.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">');
                successDiv = '<div id="successDiv" class="light">Added/updated "view later" list</div>';
            }
            $('body').append(successDiv);
            successDiv = $('#successDiv');
            successDiv.hide();
            document.getElementById('mpvSave_rl').addEventListener("click", add_rlButtonClick);
            document.getElementById('mpvView_rl').addEventListener("click", view_rlButtonClick);
            $('#fixedDiv').hide();
        }
    }
});

function resetList(){
    if(confirm("Are you sure you want to empty the list? You cannot restore it unless you export it first.")){
        GM_setValue("readLater", "");
        alert('The list is empty now');
    }
}

function add_rlButtonClick(){ //for MPV
    var pos = getOffset(this);
    $('#successDiv').css({
        'top':pos.top+12,
        'left':pos.left-12,
    });
    var currentPageNum = 0;
    var currentScrollLocation = $('#pane_images').scrollTop();
    var allImgDiv = $('#pane_images_inner').children('div');
    for(i=0;i<allImgDiv.length;i++){
        currentScrollLocation -= allImgDiv[i].offsetHeight;
        currentPageNum++;
        if(currentScrollLocation <= 0){
            break;
        }
    }
    var lastPage = document.getElementById("pane_thumbs_inner").childElementCount;
    var title = document.title.substring(0, document.title.lastIndexOf(" - ")) +" {"+ currentPageNum +"/"+lastPage+"}";
    var link = parse_gallery_identifier();
    link = link.substring(0,link.lastIndexOf("/"))+"/#page"+currentPageNum;

    var mainPage_URL = window.location.href.substring(0,window.location.href.lastIndexOf("/")).replace("mpv","g");
    var thumbnailLink;

    $(document).ajaxComplete(function( event, xhr, settings ) {
        var data = xhr.responseText;
        var divStyle = $("#gd1",data).children('div').attr("style").split(" ");
        if(divStyle[3].startsWith("url")){
            thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(")+1,divStyle[3].indexOf(")"));
        } else {
            for(i=0;i<stuff.length;i++){
                if(divStyle[i].startsWith("url")){
                    thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(")+1,divStyle[i].indexOf(")"));
                    break;
                }
            }
        }
        thumbnailLink = thumbnailLink.replace("exhentai.org","ehgt.org");
        add_rlEntry(title, link, thumbnailLink);
        populate_rlDiv();
        $('#successDiv').fadeIn();
        setTimeout(function(){
            $('#successDiv').fadeOut();
        }, 2000 );
    });
    $.ajax(mainPage_URL);
}

function getThumbnailLink_AJAX(mainPage_URL){
}

function exportClick(){
    var str = rlArrayToString(readLaterList);
    var filename = "eh_view_later_list";
    var blob = new Blob([str], {type: "text/plain;charset=utf-8"});
    saveAs(blob, filename+".txt");
}

function importClick(){
    var input = document.createElement('input');
    $(input).attr("type", "file");
    input.addEventListener("change",function readSingleFile(e) {
        var file = e.target.files[0];
        if (!file) {
            return;
        }
        var reader = new FileReader();
        reader.onload = function(e) {
            var contents = e.target.result;
            GM_setValue("readLater", contents);
            populate_rlDiv();
            var successDiv;
            if(targetWebsite === "E-Hentai"){
                successDiv = '<div id="successDiv" class="dark">List successfully loaded</div>';
            } else {
                successDiv = '<div id="successDiv" class="light">List successfully loaded</div>';
            }
            $('body').append(successDiv);
            successDiv = $('#successDiv');
            successDiv.hide();
            $('#successDiv').css({
                'top':1+12,
                'left':1-12,
            });
            $('#successDiv').fadeIn();
            setTimeout(function(){
                $('#successDiv').fadeOut();
            }, 2000 );
        };
        reader.readAsText(file);
    },false);
    $(input).trigger('click');
}

function view_rlButtonClick(){
    if($('#readLaterDiv').is(":visible")){
        hide_rlList();
    } else {
        show_rlList();
    }
}

function getGalleryID(pageHref){
    var splitHref = pageHref.split("/");
    if(pageHref.indexOf("/g/") > -1 || pageHref.indexOf("/mpv/") > -1){
        return splitHref[2];
    } else {
        return splitHref[3].substring(0,splitHref[3].indexOf("-"));
    }
}

function populate_rlDiv(){
    readLaterList = load_rlList();
    $(".readLaterItem").remove(); // remove existing ones and repopulate the list

    for (i=0;i<readLaterList.length;i++){
        if(readLaterList[i].link !== undefined && readLaterList[i].link !== ""){
            var titleLabel = '<label>'+readLaterList[i].title+"</label>";
            if(targetWebsite === "E-Hentai"){
                $('#readLaterUL').append('<li class="readLaterItem hoverPopup" id="item'+i+'"><label class="readLaterRemoveItem option dark">Remove</label> | '+ createLink("","https://e-hentai.org"+readLaterList[i].link,"E-Hentai") +' | '+ createLink("","https://exhentai.org"+readLaterList[i].link,"ExHentai") +' | '+titleLabel+'</li>');
            } else {
                $('#readLaterUL').append('<li class="readLaterItem hoverPopup" id="item'+i+'"><label class="readLaterRemoveItem option light">Remove</label> | '+ createLink("","https://e-hentai.org"+readLaterList[i].link,"E-Hentai") +' | '+ createLink("","https://exhentai.org"+readLaterList[i].link,"ExHentai") +' | '+titleLabel+'</li>');
            }
        }
    }
    $(".hoverPopup").hover(function(event){ //on
        previewDiv.show();
        previewDiv.css({
            "left":event.clientX+"px",
            "top":event.clientY+"px",
        });
        var arrayNumber = $(this).attr('id').replace("item","");
        var thumbLink = readLaterList[arrayNumber].thumbnailLink;
        if(thumbLink !== undefined && thumbLink !== "" && thumbLink !== "undefined"){
            $("#previewImg").attr("src",thumbLink);
        } else {
            $("#previewImg").attr("src","");
            $("#placeholderText").text("Sorry, please re-add the gallery to see thumbnail");
            previewDiv.css("width","160px");
        }
    }, function(event){ //off
        previewDiv.hide();
        $("#placeholderText").text("");
        previewDiv.css("width","");
    });
    var removeItem = document.getElementsByClassName("readLaterRemoveItem");
    for (i=0;i<removeItem.length;i++){
        removeItem[i].addEventListener("click",function(){
            this.parentNode.remove(this);
            remove_rlEntry(parse_gallery_identifier(this.nextElementSibling.href));
        });
    }
}

function add_rlEntryFunction(){
    var title;
    if(window.location.href.indexOf("/g/") > -1){
        title = $('#gn').text();
    } else {
        title = $('#i1').children('h1').text() +" {"+ $('#i2').children('.sn').children('div').text().replace(/ /g,"")+"}";
    }
    var thumbnailLink;

    if(currentPageHref.indexOf("/s/") > -1){
        var mainPage_URL = $('#i5').children('.sb').children('a').attr('href');
        $(document).ajaxComplete(function( event, xhr, settings ) {
            var data = xhr.responseText;
            var divStyle = $("#gd1",data).children('div').attr("style").split(" ");
            if(divStyle[3].startsWith("url")){
                thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(")+1,divStyle[3].indexOf(")"));
            } else {
                for(i=0;i<stuff.length;i++){
                    if(divStyle[i].startsWith("url")){
                        thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(")+1,divStyle[i].indexOf(")"));
                        break;
                    }
                }
            }
            thumbnailLink = thumbnailLink.replace("exhentai.org","ehgt.org");
            add_rlEntry(title, parse_gallery_identifier(), thumbnailLink);
            populate_rlDiv();
            $('#successDiv').fadeIn();
            setTimeout(function(){
                $('#successDiv').fadeOut();
            }, 2000 );
            $('#addReadLaterOption').text('Added to list');
            $('#addReadLaterOption').off();
            $('#addReadLaterOption').css({
                'text-decoration': 'none',
                'cursor': 'default',
            });
        });
        $.ajax(mainPage_URL);
    } else {
        var divStyle = $("#gd1").children('div').attr("style").split(" ");
        if(divStyle[3].startsWith("url")){
            thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(")+1,divStyle[3].indexOf(")"));
        } else {
            for(i=0;i<stuff.length;i++){
                if(divStyle[i].startsWith("url")){
                    thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(")+1,divStyle[i].indexOf(")"));
                    break;
                }
            }
        }
        thumbnailLink = thumbnailLink.replace("exhentai.org","ehgt.org");
        add_rlEntry(title, parse_gallery_identifier(), thumbnailLink);
        populate_rlDiv();
        $('#addReadLaterOption').text('Added to list');
        $('#addReadLaterOption').off();
        $('#addReadLaterOption').css({
            'text-decoration': 'none',
            'cursor': 'default',
        });
    }
}

function show_rlList(){
    readLaterDiv.fadeIn("fast");
    $('#seeReadLaterListOption').text('Hide "view later" list');
}

function hide_rlList(){
    readLaterDiv.fadeOut("fast");
    $('#seeReadLaterListOption').text('Show "view later" list');
}

function createLink(id, link, text){
    if(targetWebsite === 'E-Hentai'){
        return '<a id="'+id+'" href="'+link+'" class="link dark">'+text+'</a>';
    } else {
        return '<a id="'+id+'" href="'+link+'" class="link light">'+text+'</a>';
    }
}

function createOption(id, text){
    if(targetWebsite === 'E-Hentai'){
        return '<li><label id="'+id+'" class="option dark">'+text+'</label></li>';
    } else {
        return '<li><label id="'+id+'" class="option light">'+text+'</label></li>';
    }
}

function createOptionWithClass(id, text, extraClass){
    if(targetWebsite === 'E-Hentai'){
        return '<li><label id="'+id+'" class="option dark '+extraClass+'">'+text+'</label></li>';
    } else {
        return '<li><label id="'+id+'" class="option light '+extraClass+'">'+text+'</label></li>';
    }
}

function rlStringToArray(string){
    var returnArray = [];
    var splitString = string.split(";");
    for (i=0;i<splitString.length;i++){
        var entrySplit = splitString[i].split("::");
        returnArray.push(create_rlEntry(entrySplit[0],entrySplit[1],entrySplit[2]));
    }
    return returnArray;
}

function rlArrayToString(array){
    var returnString = "";
    for (i=0;i<array.length;i++){
        returnString += getStringEntry(array[i]);
        if(i !== (array.length - 1)){
            returnString += ";";
        }
    }
    return returnString;
}

function create_rlEntry(title, link, thumbnailLink){
    return {title:title, link:link, thumbnailLink:thumbnailLink};
}

function getStringEntry(entry){
    return entry.title + "::" + entry.link + "::" + entry.thumbnailLink;
}

function load_rlList(){
    var rlString = GM_getValue("readLater", "");
    return rlStringToArray(rlString);
}

function add_rlEntry(title, link, thumbnailLink){
    if(getIndex_rlList(link).index === -1){
        var entry = create_rlEntry(title, link, thumbnailLink);
        var entryString = title+"::"+link+"::"+thumbnailLink;
        // add to current saved list
        readLaterList.push(entry);
        // add to GM_saved list
        var newValue = GM_getValue("readLater", "");
        if(newValue !== ""){
            newValue += ";";
        }
        newValue += entryString;
        GM_setValue("readLater", newValue);
    } else {
        var replaceItemIndex = getIndex_rlList(link).index;
        // update current saved list
        readLaterList[replaceItemIndex].title = title;
        readLaterList[replaceItemIndex].link = link;
        readLaterList[replaceItemIndex].thumbnailLink = thumbnailLink;
        // update current saved list
        var savedValue = GM_getValue("readLater", "");
        var array = rlStringToArray(savedValue);
        array[replaceItemIndex].title = title;
        array[replaceItemIndex].link = link;
        array[replaceItemIndex].thumbnailLink = thumbnailLink;
        savedValue = rlArrayToString(array);
        GM_setValue("readLater", savedValue);
    }
}

function remove_rlEntry(link){
    var removeItemIndex = getIndex_rlList(link).index;
    // remove from current saved list
    readLaterList.splice(removeItemIndex,1);

    // remove from GM_saved list
    var savedValue = GM_getValue("readLater", "");
    var array = rlStringToArray(savedValue);
    array.splice(removeItemIndex,1);
    savedValue = rlArrayToString(array);
    GM_setValue("readLater", savedValue);

    if(location.href.indexOf(link)>-1){
        $('#addReadLaterOption').text('Add to "view later" list');
        if(currentPageHref.indexOf("/mpv/") === -1){
            document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction);
        }
        $('#addReadLaterOption').css({
            'text-decoration': 'underline',
            'cursor': 'pointer',
        });
    }

    if(document.getElementsByClassName("readLaterItem").length === 0){
        hide_rlList();
    }
}

function getIndex_rlList(link){
    var galleryID = getGalleryID(link);
    for(i=0;i<readLaterList.length;i++){
        if (readLaterList[i].link !== undefined && readLaterList[i].link.indexOf(galleryID)>-1){
            if(readLaterList[i].link === link){
                return {index:i, exactMatch:true};
            } else {
                return {index:i, exactMatch:false};
            }
        }
    }
    return {index:-1, exactMatch:false};
}

// Parse the gallery link
function parse_gallery_identifier(link) {
    var identifier_start;
    var identifier_end;
    var identifier;
    if(link === undefined){
        if (location.href.indexOf('e-hentai.org') != - 1) {
            identifier_start = location.href.indexOf('e-hentai.org')+12;
        } else if (location.href.indexOf('exhentai.org') != - 1) {
            identifier_start = location.href.indexOf('exhentai.org')+12;
        }
        identifier_end = location.href.length;
        identifier = location.href.substr(identifier_start, identifier_end);
    } else {
        if (link.indexOf('e-hentai.org') != - 1) {
            identifier_start = link.indexOf('e-hentai.org')+12;
        } else if (link.indexOf('exhentai.org') != - 1) {
            identifier_start = link.indexOf('exhentai.org')+12;
        }
        identifier_end = link.length;
        identifier = link.substr(identifier_start, identifier_end);
    }
        return identifier;
}

// Credit to Adam Grant: http://stackoverflow.com/questions/442404/retrieve-the-position-x-y-of-an-html-element
function getOffset(el) {
    el = el.getBoundingClientRect();
    return {
        left: el.left + window.scrollX,
        top: el.top + window.scrollY
    };
}

/*!
 * JavaScript Cookie v2.1.3
 * https://github.com/js-cookie/js-cookie
 *
 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
 * Released under the MIT license
 */
;(function (factory) {
    var registeredInModuleLoader = false;
    if (typeof define === 'function' && define.amd) {
        define(factory);
        registeredInModuleLoader = true;
    }
    if (typeof exports === 'object') {
        module.exports = factory();
        registeredInModuleLoader = true;
    }
    if (!registeredInModuleLoader) {
        var OldCookies = window.Cookies;
        var api = window.Cookies = factory();
        api.noConflict = function () {
            window.Cookies = OldCookies;
            return api;
        };
    }
}(function () {
    function extend () {
        var i = 0;
        var result = {};
        for (; i < arguments.length; i++) {
            var attributes = arguments[ i ];
            for (var key in attributes) {
                result[key] = attributes[key];
            }
        }
        return result;
    }

    function init (converter) {
        function api (key, value, attributes) {
            var result;
            if (typeof document === 'undefined') {
                return;
            }

            // Write

            if (arguments.length > 1) {
                attributes = extend({
                    path: '/'
                }, api.defaults, attributes);

                if (typeof attributes.expires === 'number') {
                    var expires = new Date();
                    expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
                    attributes.expires = expires;
                }

                try {
                    result = JSON.stringify(value);
                    if (/^[\{\[]/.test(result)) {
                        value = result;
                    }
                } catch (e) {}

                if (!converter.write) {
                    value = encodeURIComponent(String(value))
                        .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
                } else {
                    value = converter.write(value, key);
                }

                key = encodeURIComponent(String(key));
                key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
                key = key.replace(/[\(\)]/g, escape);

                return (document.cookie = [
                    key, '=', value,
                    attributes.expires ? '; expires=' + attributes.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
                    attributes.path ? '; path=' + attributes.path : '',
                    attributes.domain ? '; domain=' + attributes.domain : '',
                    attributes.secure ? '; secure' : ''
                ].join(''));
            }

            // Read

            if (!key) {
                result = {};
            }

            // To prevent the for loop in the first place assign an empty array
            // in case there are no cookies at all. Also prevents odd result when
            // calling "get()"
            var cookies = document.cookie ? document.cookie.split('; ') : [];
            var rdecode = /(%[0-9A-Z]{2})+/g;
            var i = 0;

            for (; i < cookies.length; i++) {
                var parts = cookies[i].split('=');
                var cookie = parts.slice(1).join('=');

                if (cookie.charAt(0) === '"') {
                    cookie = cookie.slice(1, -1);
                }

                try {
                    var name = parts[0].replace(rdecode, decodeURIComponent);
                    cookie = converter.read ?
                        converter.read(cookie, name) : converter(cookie, name) ||
                        cookie.replace(rdecode, decodeURIComponent);

                    if (this.json) {
                        try {
                            cookie = JSON.parse(cookie);
                        } catch (e) {}
                    }

                    if (key === name) {
                        result = cookie;
                        break;
                    }

                    if (!key) {
                        result[name] = cookie;
                    }
                } catch (e) {}
            }

            return result;
        }

        api.set = api;
        api.get = function (key) {
            return api.call(api, key);
        };
        api.getJSON = function () {
            return api.apply({
                json: true
            }, [].slice.call(arguments));
        };
        api.defaults = {};

        api.remove = function (key, attributes) {
            api(key, '', extend(attributes, {
                expires: -1
            }));
        };

        api.withConverter = init;

        return api;
    }

    return init(function () {});
}));