// ==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.07
// @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,#addDiv.dark{
background-color:rgba(64, 64, 0, 1);
border: 1px solid rgba(255, 255, 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,#addDiv.light{
background-color:rgba(255, 255, 0, 1);
border: 1px solid rgba(64, 64, 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;
}
#addDiv{
position:absolute;
z-index:10;
padding:4px;
font-size:125%;
cursor: pointer;
}
`;
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 addDiv = '<div id="addDiv"><label id="addDivLabel">Add to "view later" list</label></div>';
$('body').append(addDiv);
addDiv = $('#addDiv');
addDiv.hide();
$("#addDiv").click(function(){
var title = lastHovered.getElementsByClassName("id2")[0].childNodes[0].innerHTML;
var link = parse_gallery_identifier(lastHovered.getElementsByClassName("id2")[0].childNodes[0].href);
var thumbnailLink = lastHovered.getElementsByClassName("id3")[0].childNodes[0].childNodes[0].src.replace("exhentai.org","ehgt.org");
if(thumbnailLink.indexOf("blank.gif")>-1){ //if there is no thumbnail, do AJAX call
$(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();
});
$.ajax(link);
} else {
add_rlEntry(title, link, thumbnailLink);
populate_rlDiv();
}
});
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");
addDiv.addClass("dark");
} else {
link = 'https://exhentai.org' + parse_gallery_identifier();
targetWebsite = 'ExHentai';
fixedDiv.addClass("light");
readLaterDiv.addClass("light");
previewDiv.addClass("light");
addDiv.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;
var lastHovered;
$(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){
$(".id1").hover(function(){
lastHovered = this;
var location = getOffset(this.getElementsByClassName("id3")[0]);
addDiv.show();
addDiv.css({
"top":location.top+"px",
"left":location.left+"px",
});
if(getIndex_rlList(parse_gallery_identifier(lastHovered.getElementsByClassName("id3")[0].childNodes[0].href)).exactMatch){
$("#addDivLabel").text('Already added to list');
}
}, function(){
addDiv.hide();
$("#addDivLabel").text('Add to "view later" list');
});
addDiv.hover(function(){
addDiv.show();
if(getIndex_rlList(parse_gallery_identifier(lastHovered.getElementsByClassName("id3")[0].childNodes[0].href)).exactMatch){
$("#addDivLabel").text('Already added to list');
} else {
$("#addDiv").css("color","red");
}
}, function(){
$("#addDiv").hide();
$("#addDiv").css("color","");
});
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 () {});
}));