// ==UserScript==
// @name E-Hentai <-> ExHentai
// @description Links between E-Hentai and ExHentai page, and also links user to ExHentai automatically if gallery is "removed"
// @namespace https://greasyfork.org/en/scripts/24342-e-hentai-exhentai
// @version 2.01
// @icon https://e-hentai.org/favicon.ico
// @include http*://e-hentai.org/*
// @include https://upload.e-hentai.org/*
// @include https://exhentai.org/*
// @require https://code.jquery.com/jquery-3.1.1.min.js
// @author Resuha
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
//Credit to developer of https://github.com/js-cookie/js-cookie
//Ver 2.00 added redirector and cookie remover
//Ver 1.41 minor bug in code
//Ver 1.40 made the script work with the new e-hentai URL
//Ver 1.31 removed the blinking linker, seems like it leads to crashvar extraCSS = document.createElement("style");
var extraCSS = document.createElement("style");
extraCSS.textContent = `
.link, .option {
cursor: pointer;
font-size: 100%;
text-decoration: underline;
}
.option{
font-size: 110%;
}
.link{
font-size: 150%;
}
label.divHeader{
font-size: 150%;
}
#fixedDiv{
text-align: left !important;
}
#optionDivUL{
margin: 0; padding: 0px 0px 0px 12px;
}
`;
document.head.appendChild(extraCSS);
$(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 {
var link;
var targetWebsite;
if (document.location.href.indexOf('exhentai') != - 1) {
link = 'https://e-hentai.org' + parse_gallery_identifier();
targetWebsite = 'E-Hentai';
} else {
link = 'https://exhentai.org' + parse_gallery_identifier();
targetWebsite = 'ExHentai';
} // Determine if the current page is E-Hentai or ExHentai
var fixedDiv = `'
<div id="fixedDiv" class="fixedDivArea">
<div id="linkerDiv">
<label class="divHeader">Linker:</label>
</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');
fixedDiv.css({
'position': 'fixed',
'top': '24px',
'right': '24px',
'align': 'left',
'padding': '8px 8px',
});
var linker;
if (targetWebsite == 'ExHentai') {
fixedDiv.css({
'background-color': 'rgba(255, 255, 0, 0.6)',
});
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"));
$('#linker a, #linker').css('color', 'blue'); //Give blue color to linker
} else {
fixedDiv.css({
'background-color': 'rgba(128, 128, 0, 0.6)',
});
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"));
$('#linker a, #linker').css('color', 'yellow'); //Give yellow color to linker
} // 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;
});
if(window.location.href.indexOf("uconfig") > -1){
var optionArray = [];
optionArray.push(createOption("loadSettingOption","Load saved user setting"));
optionArray.push(createOption("saveSettingOption","Save current user 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");
});
}
// If there is no option available, hide the optionDiv completely
if ($('.option').length === 0){
optionDiv.hide();
}
// Colorize the option
if (targetWebsite == 'ExHentai') {
$('.option').css('color', 'Red');
} else {
$('.option').css('color', 'Plum');
}
}
});
function createLink(id, link, text){
return '<a id="'+id+'" href="'+link+'" class="link">'+text+'</a>';
}
function createOption(id, text){
return '<li><label id="'+id+'" class="option">'+text+'</label></li>';
}
// Parse the gallery link
function parse_gallery_identifier() {
var identifier_start;
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;
}
var identifier_end = location.href.length;
var identifier = location.href.substr(identifier_start, identifier_end);
return identifier;
}
/*!
* 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 () {});
}));