GISTS/web/userscripts/org.e(x)hentai.helper.user.js
2024-05-02 00:16:45 +02:00

1196 lignes
Pas d'EOL
45 Kio
JavaScript
Brut Lien permanent Annotations Historique

Ce fichier contient des caractères Unicode ambigus.

Ce fichier contient des caractères Unicode qui peuvent être confondus avec d'autres caractères. Si vous pensez que c'est intentionnel, vous pouvez ignorer cet avertissement. Utilisez le bouton Échappe pour les dévoiler.

// ==UserScript==
// @name E(X)Hentai Helper
// @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 org.e(x)hentai.helper
// @version 4.10
// @icon https://e-hentai.org/favicon.ico
// @resource exCSS http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css
// @resource jqueryui https://code.jquery.com/ui/1.12.0/jquery-ui.min.js
// @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://code.jquery.com/ui/1.12.1/jquery-ui.min.js
// @require https://cdn.jsdelivr.net/npm/datatables.net@1.10.16/js/jquery.dataTables.js
// @require https://raw.githubusercontent.com/eligrey/FileSaver.js/master/dist/FileSaver.min.js
// @author Resuha
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_getResourceText
// ==/UserScript==
//Credit to developer of https://github.com/js-cookie/js-cookie
//Ver 4.10 changed deleted imgur pics by span tags with unicode emojis
//Ver 4.00 changed "view/read later" layout
//Ver 3.00 added "view/read later" functionality
//Ver 2.00 added redirector and cookie remover
var targetWebsite = "";
var theme = "";
var readLaterList = [];
var lastHovered;
var currentPageLink = window.location.href;
var dataTable;
var cssTxt = GM_getResourceText("exCSS");
GM_addStyle(cssTxt);
var jqueryui = GM_getResourceText("jqueryui");
GM_addStyle(jqueryui);
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;
}
#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);
}
.link.dark{color:yellow}
.option.dark{color:plum}
#mpvAddon.dark{background-color:rgba(64, 64, 0, 0.4)}
#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);
}
.link.light{color:blue}
.option.light{color:Red}
#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: 4%;left: 2%;
align: left;
z-index:10;
padding: 8px 8px;
}
#i1 > #mpvAddon{
float:right;
padding:0px 10px 5px 10px;
cursor: pointer;
}
#optionDivUL, #readLaterOptionDivUL{
margin: 0;
padding: 0px 0px 0px 20px;
}
.topRightDivButton{
float:right;
cursor: pointer;
padding: 0px 4px 2px 3px;
border: 1px solid;
font-size: 80%;
}
#previewDiv{
position:fixed;
z-index:10;
padding:4px;
}
#previewDiv.showLeft{transform: translate(-110%, -105%)}
#previewDiv.showRight{transform: translate(10%, -105%)}
#addDiv{
position:absolute;
z-index:10;
padding:4px;
font-size:125%;
cursor: pointer;
}
.readLaterItem.hoverPopup.odd.light{background:rgba(240, 240, 0, 1)}
.readLaterItem.hoverPopup.odd.dark{background:rgba(48, 48, 0, 1)}
#readLaterTable.light{border:2px rgba(64, 64, 0, 1) solid}
#readLaterTable.dark{border:2px rgba(255, 255, 0, 1) solid}
.highlighted{font-weight: bold !important;}
.highlighted.light{color: red}
.highlighted.dark{color: lightblue}
`;
document.head.appendChild(extraCSS);
var fixedDiv = `'
<div id="fixedDiv">
<div class="divHeader"><label id="scriptTitleHeader">E(X)Hentai Helper 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();
}
});
var readLaterDiv = `'
<div id="readLaterDiv" style="width:96%">
<div class="divHeader"><label id="rlDivHeader">Read Later List:</label><label class="topRightDivButton" id="closeReadLaterButton">✖</label></div>
<div id="readLaterTableWrapper"></div>
</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();
}
});
if (document.location.href.indexOf('exhentai') !== - 1) {
link = 'https://e-hentai.org' + parse_gallery_identifier();
targetWebsite = 'E-Hentai';
theme = "dark";
} else {
link = 'https://exhentai.org' + parse_gallery_identifier();
targetWebsite = 'ExHentai';
theme = "light";
} // Determine if the current page is E-Hentai or ExHentai
readLaterDiv.resizable({
handles: "n,e,ne",
stop: function (event, ui) {
$('th')[0].click();
}
});
fixedDiv.addClass("light");
readLaterDiv.addClass("light");
previewDiv.addClass("light");
addDiv.addClass("light");
$('#readLaterTable').addClass("light");
redoTheme();
window.addEventListener('focus', populate_rlDiv);
$(document).ready(function () {
populate_rlDiv();
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 (currentPageLink.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 (currentPageLink.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 (currentPageLink.indexOf("/g/") > -1 || currentPageLink.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 (indexMatch.index > -1) {
$('#readLaterOptionDivUL').append(createOption("removeReadLaterOption", 'Remove from "view later" list'));
document.getElementById('removeReadLaterOption').addEventListener("click", remove_rlEntryFunction);
}
if (currentPageLink.indexOf("/s/") > -1) {
var successDiv;
if (targetWebsite === "E-Hentai") {
$('#i1').prepend('<div id="mpvAddon" class="dark"></div>');
$('#mpvAddon').append('<span id="mpvSave_rl" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8; font-size: x-large; margin-right: 1ex;">💾</span>');
$('#mpvAddon').append('<span id="mpvView_rl" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8; font-size: x-large;">👁️</span>');
successDiv = '<div id="successDiv" class="dark">Added/updated "view later" list</div>';
} else {
$('#i1').prepend('<div id="mpvAddon" class="light"></div>');
$('#mpvAddon').append('<span id="mpvSave_rl" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8; font-size: x-large; margin-right: 1ex;">💾</span>');
$('#mpvAddon').append('<span id="mpvView_rl" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8; font-size: x-large;">👁️</span>');
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", exportFunction);
$('#readLaterOptionDivUL').append(createOption("import_rlListOption", 'Import list'));
document.getElementById('import_rlListOption').addEventListener("click", importFunction);
$('#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();
}
redoTheme();
}
});
function resetList() {
if (confirm("Are you sure you want to empty the list? You cannot undo this unless you export it first.")) {
GM_setValue("readLater", "");
}
}
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 exportFunction() {
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 importFunction() {
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;
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();
populate_rlDiv();
}
}
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();
console.log($('#readLaterDiv').is(':visible'));
console.log($('.readLaterItem').length, readLaterList.length);
if ($('#readLaterDiv').is(':visible') && ($('.readLaterItem').length === 0 || $('.readLaterItem').length !== readLaterList.length)) {
$("#readLaterTable_wrapper").remove(); // remove existing ones and repopulate the list
$('#readLaterTableWrapper').append(
`<table id="readLaterTable" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th>Delete</th>
<th>EH Link</th>
<th>EX Link</th>
<th>Title</th>
<th>Circle</th>
<th>Artist</th>
<th>Event</th>
</tr>
</thead>
<tbody id="readLaterTableBody">
</tbody>
</table>`
);
$("#rlDivHeader").text("Read Later List: (" + readLaterList.length + " items)");
for (i = 0; i < readLaterList.length; i++) {
var entryDOM = '<tr class="readLaterItem hoverPopup light" id="item' + i + '">';
if (readLaterList[i] !== null) {
entryDOM += '<td class="readLaterRemoveItem option light">Remove</td>';
entryDOM += '<td>' + createLink("", "https://e-hentai.org" + readLaterList[i].link, "Read") + '</td>';
entryDOM += '<td>' + createLink("", "https://exhentai.org" + readLaterList[i].link, "Read") + '</td>';
entryDOM += '<td>' + readLaterList[i].title + '</td>';
entryDOM += '<td>' + readLaterList[i].group + '</td>';
entryDOM += '<td>' + readLaterList[i].artist + '</td>';
entryDOM += '<td>' + readLaterList[i].eventName + '</td>';
}
entryDOM += "</tr>"
$('#readLaterTableBody').append(entryDOM);
}
$(".hoverPopup").mousemove(function (event) { //on
previewDiv.css({
"left": event.clientX + "px",
"top": event.clientY + "px",
});
if (event.clientX > (document.getElementById('readLaterDiv').offsetWidth * 0.75)) {
previewDiv.addClass("showLeft");
previewDiv.removeClass("showRight");
} else {
previewDiv.addClass("showRight");
previewDiv.removeClass("showLeft");
}
previewDiv.show();
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");
}
$(this).addClass('highlighted');
});
$(".hoverPopup").mouseleave(function (event) { //off
previewDiv.hide();
$("#placeholderText").text("");
previewDiv.css("width", "");
$(this).removeClass('highlighted');
});
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.children[0].href));
});
}
redoTheme();
dataTable = $('#readLaterTable').DataTable({
"scrollY": "400px",
"scrollCollapse": true,
"paging": false,
"responsive": true,
"bAutoWidth": true,
});
// setTimeout(function () {
// $('th')[0].click();
// }, 100)
}
}
function remove_rlEntryFunction(event) {
remove_rlEntry(parse_gallery_identifier());
$(this).parent().remove();
}
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 (currentPageLink.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.show();
$('#seeReadLaterListOption').text('Hide "view later" list');
}
function hide_rlList() {
readLaterDiv.hide();
$('#seeReadLaterListOption').text('Show "view later" list');
}
function createLink(id, link, text) {
return '<a id="' + id + '" href="' + link + '" class="link light">' + text + '</a>';
}
function createOption(id, text) {
return '<li><label id="' + id + '" class="option light">' + text + '</label></li>';
}
function createOptionWithClass(id, text, extraClass) {
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("::");
var entry = create_rlEntry(entrySplit[0], entrySplit[1], entrySplit[2]);
if (entry !== null) {
returnArray.push(entry);
}
}
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) {
if (!link || !title || !thumbnailLink) {
return null;
} else {
titleParse = parseTitle(title);
return { eventName: titleParse.eventName, group: titleParse.group, artist: titleParse.artist, title: titleParse.title, link: link, thumbnailLink: thumbnailLink };
}
}
function getStringEntry(entry) {
var returnString = unparseTitle(entry)
returnString += "::" + entry.link;
returnString += "::" + entry.thumbnailLink;
return returnString;
}
function load_rlList() {
var rlString = GM_getValue("readLater", "");
return rlStringToArray(rlString);
}
function add_rlEntry(title, link, thumbnailLink) {
titleParsed = parseTitle(title);
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].eventName = titleParsed.eventName;
readLaterList[replaceItemIndex].group = titleParsed.group;
readLaterList[replaceItemIndex].artist = titleParsed.artist;
readLaterList[replaceItemIndex].title = titleParsed.title;
readLaterList[replaceItemIndex].link = link;
readLaterList[replaceItemIndex].thumbnailLink = thumbnailLink;
// update current saved list
var savedValue = GM_getValue("readLater", "");
var array = rlStringToArray(savedValue);
array[replaceItemIndex].eventName = titleParsed.eventName;
array[replaceItemIndex].group = titleParsed.group;
array[replaceItemIndex].artist = titleParsed.artist;
array[replaceItemIndex].title = titleParsed.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 (currentPageLink.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();
}
populate_rlDiv();
}
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;
}
////////////////////////////////////////////////////////////////
// Parsing and unparsing title
////////////////////////////////////////////////////////////////
function unparseTitle(parsedTitle) {
var returnString = "";
if (parsedTitle.eventName !== "") {
returnString += "(" + parsedTitle.eventName + ") ";
}
if (parsedTitle.group !== "" && parsedTitle.artist !== "") {
returnString += "[" + parsedTitle.group + " (" + parsedTitle.artist + ")] ";
} else if (parsedTitle.artist !== "") {
returnString += "[" + parsedTitle.artist + "] ";
}
returnString += parsedTitle.title;
return returnString;
}
function parseTitle(stringTitle) {
var eventName = "";
var group = "";
var artist = "";
var title = "";
var title_done = false;
var mode = "";
var temp = "";
for (j = 0; j < stringTitle.length; j++) {
if (stringTitle[j] === "(" && mode === "") {
mode = "event";
} else if (stringTitle[j] === ")" && mode === "event") {
mode = "";
} else if (stringTitle[j] === "[" && mode === "") {
mode = "info";
} else if (stringTitle[j] === "(" && mode === "info") {
mode = "artist";
group = temp;
} else if (stringTitle[j] === ")" && mode === "artist") {
mode = "title";
} else if (stringTitle[j] === "]" && mode === "info") {
mode = "title";
artist = temp;
} else if (stringTitle[j] === "]" && stringTitle[j - 1] === ")") {
mode = "title";
} else {
switch (mode) {
case "":
title += stringTitle[j];
break;
case "event":
eventName += stringTitle[j];
break;
case "info":
temp += stringTitle[j];
break;
case "artist":
artist += stringTitle[j];
break;
case "title":
title += stringTitle[j];
break;
}
}
}
return { eventName: eventName.trim(), group: group.trim(), artist: artist.trim(), title: title.trim() };
}
////////////////////////////////////////////////////////////////
// UI Related
////////////////////////////////////////////////////////////////
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();
}
}
function redoTheme() {
if (theme === "dark") {
$('.light').addClass("dark");
$('.light').removeClass("light");
} else {
$('.dark').addClass("light");
$('.dark').removeClass("dark");
}
}
////////////////////////////////////////////////////////////////
// External codes
////////////////////////////////////////////////////////////////
// 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 () { });
}));