Untitled diff
249 removals
Words removed | 576 |
Total words | 2045 |
Words removed (%) | 28.17 |
700 lines
278 additions
Words added | 699 |
Total words | 2168 |
Words added (%) | 32.24 |
741 lines
// ==UserScript==
// ==UserScript==
// @name EH Gallery Quick Favourite
// @name EH Gallery Quick Favourite
// @author FabulousCupcake
// @author FabulousCupcake
// @namespace http://fabulous.cupcake.jp.net/
// @namespace http://fabulous.cupcake.jp.net/
// @version v2.1.0
// @version v2.2.0
// @description Upgrades the gallery favourite button to allow quick favouriting of a gallery.
// @description Upgrades the gallery favourite button to allow quick favouriting of a gallery.
// @include /^https?://(ex|(?:g\.)?e-)hentai\.org/g/\d+?/\w{10}/?/
// @include /^https?://(ex|(?:g\.)?e-)hentai\.org/g/\d+?/\w{10}/?/
// @include /^https?://(ex|(?:g\.)?e-)hentai\.org\/gallerypopups\.php\?.+&act=addfav/
// @include /^https?://(ex|(?:g\.)?e-)hentai\.org\/gallerypopups\.php\?.+&act=addfav/
// @grant none
// @grant none
// ==/UserScript==
// ==/UserScript==
/* ====================================== *\
/* ====================================== *\
Hotkey Map
Hotkey Map
----
----
Shift+F : Initiate Favouriting Mode
Shift+F : Initiate Favouriting Mode
[0-9] : Favourite 0-9
[0-9] : Favourite 0-9
- : Remove Favourite
- : Remove Favourite
----
----
Pressing any other key during act-
Pressing any other key during act-
ive favouriting mode will exit the
ive favouriting mode will exit the
active favving mode.
active favving mode.
\* ====================================== */
\* ====================================== */
// Config
// Config
const config = {
const config = {
'debug': false,
"debug": false,
'timeout': 5000, // XHR Timelimit in milliseconds
"editor_size": 60, // Width of the favnotes input element in not-px unit
'editor_size': 60, // Width of the favnotes input element in not-px unit
"hotkeys": true, // Enable hotkeys
'hotkeys': true, // Enable hotkeys
"cheatsheet": true // Show cheatsheet after pressing Shift+F?
'cheatsheet': true // Show cheatsheet after pressing Shift+F?
};
};
// Colors
// Colors
var geh = {
var geh = {
'border' : '#5C0D12',
"border" : "#5C0D12",
'bg' : '#E3E0D1',
"bg" : "#E3E0D1",
'bg_light' : '#F8F6EE',
"bg_light" : "#F8F6EE",
};
};
var exh = {
var exh = {
'border' : '#000000',
"border" : "#000000",
'bg' : '#4F535B',
"bg" : "#4F535B",
'bg_light' : '#5F636B',
"bg_light" : "#5F636B",
};
};
var color;
var color;
var hotkeyInit = false;
var hotkeyInit = false;
// Are we on fjords?
// Are we on fjords?
color = (location.host.substr(0,2) == "ex" ) ?
color = (location.host.substr(0,2) == "ex" ) ?
color = exh :
color = exh :
color = geh;
color = geh;
// Stylesheet
// Stylesheet
var stylesheet =`
var stylesheet =`
#gdf {
#gdf {
margin: 6px 0 !important;
margin: 6px 0 !important;
padding: 10px 5px !important;
padding: 10px 5px !important;
width: 160px !important;
width: 160px !important;
height: 18px;
height: 18px;
position: relative;
position: relative;
border: 1px dashed ${color.border};
border: 1px dashed ${color.border};
left: -2px !important;
left: -2px !important;
}
}
#gdf > div:nth-child(1),
#gdf > div:nth-child(1),
#gdf > div:nth-child(2),
#gdf > div:nth-child(2),
#gdf > div:nth-child(3) {
#gdf > div:nth-child(3) {
display: inline !important;
display: inline !important;
float: none !important;
float: none !important;
}
}
#gdf > div:nth-child(2) > a {
#gdf > div:nth-child(2) > a {
position: relative;
position: relative;
top: -1px;
top: -1px;
line-height: 21px;
line-height: 21px;
}
}
#gdf > #fav {
#gdf > #fav {
padding-left: 5px;
padding-left: 5px;
}
}
#gdf > #fav > * {
#gdf > #fav > * {
float: none !important;
float: none !important;
display: inline-block !important;
display: inline-block !important;
margin: 0 !important;
margin: 0 !important;
position: relative;
position: relative;
top: 2px;
top: 2px;
}
}
#gdf div.i {
#gdf div.i {
display: inline-block;
display: inline-block;
margin: 0 !important;
margin: 0 !important;
}
}
#gdf a:hover {
#gdf a:hover {
color: inherit !important;
color: inherit !important;
}
}
.qf-top, .qf-bot {
.qf-top, .qf-bot {
background: ${color.bg_light} !important;
background: ${color.bg_light} !important;
width: inherit;
width: inherit;
padding: 0 5px;
padding: 0 5px;
position: absolute;
position: absolute;
left: -1px;
left: -1px;
visibility: hidden;
visibility: hidden;
border: 1px solid ${color.border};
border: 1px solid ${color.border};
}
}
.qf-top {
.qf-top {
border-bottom: none;
border-bottom: none;
padding-top: 5px;
padding-top: 5px;
bottom: 33px;
bottom: 33px;
}
}
.qf-bot {
.qf-bot {
border-top: none;
border-top: none;
padding-bottom: 5px;
padding-bottom: 5px;
top: 33px;
top: 33px;
}
}
#gdf .fav {
#gdf .fav {
box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
cursor: pointer;
padding: 5px;
padding: 5px;
text-align: left;
text-align: left;
width: 100%;
width: 100%;
}
}
#gdf .fav:hover {
#gdf .fav:hover {
background: ${color.bg};
background: ${color.bg};
}
}
#gdf:hover,
#gdf:hover,
#gdf.hover {
#gdf.hover {
border: 1px solid ${color.border};
border: 1px solid ${color.border};
}
}
#gdf:hover > .qf-top,
#gdf:hover > .qf-top,
#gdf:hover > .qf-bot,
#gdf:hover > .qf-bot,
#gdf.hover > .qf-top,
#gdf.hover > .qf-top,
#gdf.hover > .qf-bot {
#gdf.hover > .qf-bot {
visibility: visible;
visibility: visible;
}
}
#gdf > .favnote {
#gdf > .favnote {
float: right !important;
float: right !important;
cursor: pointer;
cursor: pointer;
width: 16px;
width: 16px;
height: 16px;
height: 16px;
margin-right: 5px;
margin-right: 5px;
position: relative;
position: relative;
top: 1px;
top: 1px;
z-index: 20;
z-index: 20;
opacity: 0.5;
opacity: 0.5;
}
}
#gdf > .favnote:hover {
#gdf > .favnote:hover {
opacity: 1;
opacity: 1;
}
}
#gdf > .favnote:after {
#gdf > .favnote:after {
opacity: 0;
opacity: 0;
}
}
#gdf > .favnote:hover:after {
#gdf > .favnote:hover:after {
display: block;
display: block;
padding: 0 5px;
padding: 0 5px;
height: 20px;
height: 20px;
box-shadow: 0 1px 4px rgba(0,0,0,0.4);
box-shadow: 0 1px 4px rgba(0,0,0,0.4);
background: #f4f4f4;
background: #f4f4f4;
color: #333;
color: #333;
font-weight: 400;
font-weight: 400;
font-size: 11px;
font-size: 11px;
line-height: 20px;
line-height: 20px;
position: absolute;
position: absolute;
top: -20px;
top: -20px;
left: 0px;
left: 0px;
transition: opacity 300ms cubic-bezier(1, -1, 1, -1);
transition: opacity 300ms cubic-bezier(1, -1, 1, -1);
opacity: 1
opacity: 1
}
}
/* ========================================= *\
/* ========================================= *\
* Fugue Icons v3.5.6 by Yusuke Kamiyamane *
* Fugue Icons v3.5.6 by Yusuke Kamiyamane *
* http://p.yusukekamiyamane.com/ *
* http://p.yusukekamiyamane.com/ *
\* ========================================= */
\* ========================================= */
#gdf > .favnote { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQ0lEQVR4AcWONZoVURBGTxXusgrcIcMhw3dCjC/hxewB9wR3SXAYJGKS5zLW91bBK9wd/u6+2ud8P/89AnDjsOwBZvBjKS1a7xd4k+EAZsyav2zvFkst3A08Y1aQUz85D2C5AKC39ymdyhG9dlBkyUY/D6BvBIINYkUtvlw0sNTG8iCpSAwNFQwMDMS3eO2pLWZsvbJfln3YQEARkTdOi3nYsOG8TUpDNJtNzpzYDizZXHlxbQqwMv7IGRVRVBUz+6pk+vSFmGVGjx7N3XStCfCRQES+J4kmb5l3gpRRQhDQdyX6ah3Mxw0Euh/fkYRg1OcNBMWRcHxPosPHfNIgoUgXFtz5rkR1RDDvBH39PhKdiIwAcccxcCPWMVvA7hk3Q3RkMG8FU2/d4Vm7tHk0P5FHz3nWZQUYA0wI2c8lAS1+Ny8BF2m6Eor51N8AAAAASUVORK5CYII='); }
#gdf > .favnote { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQ0lEQVR4AcWONZoVURBGTxXusgrcIcMhw3dCjC/hxewB9wR3SXAYJGKS5zLW91bBK9wd/u6+2ud8P/89AnDjsOwBZvBjKS1a7xd4k+EAZsyav2zvFkst3A08Y1aQUz85D2C5AKC39ymdyhG9dlBkyUY/D6BvBIINYkUtvlw0sNTG8iCpSAwNFQwMDMS3eO2pLWZsvbJfln3YQEARkTdOi3nYsOG8TUpDNJtNzpzYDizZXHlxbQqwMv7IGRVRVBUz+6pk+vSFmGVGjx7N3XStCfCRQES+J4kmb5l3gpRRQhDQdyX6ah3Mxw0Euh/fkYRg1OcNBMWRcHxPosPHfNIgoUgXFtz5rkR1RDDvBH39PhKdiIwAcccxcCPWMVvA7hk3Q3RkMG8FU2/d4Vm7tHk0P5FHz3nWZQUYA0wI2c8lAS1+Ny8BF2m6Eor51N8AAAAASUVORK5CYII='); }
#gdf > .favnote.plus { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABl0lEQVR4AcWOA4xeQRRGz0xtM6gd1DbCmjFquw3qWGVUx6lt27Ztt+vdN3OnndWPddTv4frk479LAVzfp5YATcmfVrbu585HAK7uUTtadF03WEwszgk4i0iANYlYm4TYAIBPn14S/2P/TmBF2wHuHIAGEEEhyUjwy3/Y4A9i4hCbjAkMKSkBSUlJ+K9Nn6ODRZhxeZfqClA4E4BGKYWPIPhYqFBhMmRMCjExMZw+PB9oO+jHx6sVgB6FAaxFK6XRWiMiOUKaNGmFiKV48eI8MFdjACIASqk8Id5Jxk0mwPgiFaAByROi/+X+BkCT6UDhvzAnEbWPM15fpveTw8x6cx0bDvA0hQZyh9z6/Y3WHftx8/fXKAcGTbqD7CBT7p+m06VtYBx/7B+UgbGubHvWV1yjADav5MyIUbu6IjHgHA7BOfG5j7Q7soqy3RsRrVM7T95QQMW5Y1jWsDZNyEEbi5So81oVKglQcUSLUj+33IpPcSR9f+n2A5QAqgI18/wWl7pT81Uz52P6TQkKpClF1zChyHUfSddf7UXJLEn3VbsAAAAASUVORK5CYII='); }
#gdf > .favnote.plus { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABl0lEQVR4AcWOA4xeQRRGz0xtM6gd1DbCmjFquw3qWGVUx6lt27Ztt+vdN3OnndWPddTv4frk479LAVzfp5YATcmfVrbu585HAK7uUTtadF03WEwszgk4i0iANYlYm4TYAIBPn14S/2P/TmBF2wHuHIAGEEEhyUjwy3/Y4A9i4hCbjAkMKSkBSUlJ+K9Nn6ODRZhxeZfqClA4E4BGKYWPIPhYqFBhMmRMCjExMZw+PB9oO+jHx6sVgB6FAaxFK6XRWiMiOUKaNGmFiKV48eI8MFdjACIASqk8Id5Jxk0mwPgiFaAByROi/+X+BkCT6UDhvzAnEbWPM15fpveTw8x6cx0bDvA0hQZyh9z6/Y3WHftx8/fXKAcGTbqD7CBT7p+m06VtYBx/7B+UgbGubHvWV1yjADav5MyIUbu6IjHgHA7BOfG5j7Q7soqy3RsRrVM7T95QQMW5Y1jWsDZNyEEbi5So81oVKglQcUSLUj+33IpPcSR9f+n2A5QAqgI18/wWl7pT81Uz52P6TQkKpClF1zChyHUfSddf7UXJLEn3VbsAAAAASUVORK5CYII='); }
#gdf > .favnote.arrow { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABnUlEQVR4Ac2QA6weURCFt7bduHZc27YV1bZt+9m2bdu2bRvn7Tz8ZthJvsXdPd+ducz/UeF2/V6zmMnIaiFBqE0/i7YqdbSU/URz6Xc0l3xBY9F71OU9Q3X2PVRm3ASR4L8H9C/LGj5BsFU/y7YKBTQVvkBjwTM05D9Ffd5j1GTfR3naLRQnXUFhwkVEuG8BGt1A/7Os5QgCLfpZtVUoobnopUSJl+UyDub/+nlxBH6m/WzaK1XQWvKaJFI7oXEowxF4G/Wz66hSQ1vpG5kkJKAMR+Cu38+ho1oD7WXvZJLQwVKGI3DR6efUWaOJjvL3UiUfnF1hF2YAynAEDpr9XFCjzQo+SJWc0Q/DWYMIvFE9HccR2Kr2c0OtDjorPgpJXlrY4JiqD4GjhIo3lAqAjV9saxa/jz7NUBn/ZnxQbwWSUCfd41Srgw527y83/MkDriQAZ2K43E0GZj72C6f8+AfnGW3190yIKHbcu1O65IZSPS/LA4B51zTKx+14dpEEw1gms0yXhVEn9WKIkQf+nO/NyleDD6irsJzue+8CGCvzmWahQigAAAAASUVORK5CYII='); }
#gdf > .favnote.arrow { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABnUlEQVR4Ac2QA6weURCFt7bduHZc27YV1bZt+9m2bdu2bRvn7Tz8ZthJvsXdPd+ducz/UeF2/V6zmMnIaiFBqE0/i7YqdbSU/URz6Xc0l3xBY9F71OU9Q3X2PVRm3ASR4L8H9C/LGj5BsFU/y7YKBTQVvkBjwTM05D9Ffd5j1GTfR3naLRQnXUFhwkVEuG8BGt1A/7Os5QgCLfpZtVUoobnopUSJl+UyDub/+nlxBH6m/WzaK1XQWvKaJFI7oXEowxF4G/Wz66hSQ1vpG5kkJKAMR+Cu38+ho1oD7WXvZJLQwVKGI3DR6efUWaOJjvL3UiUfnF1hF2YAynAEDpr9XFCjzQo+SJWc0Q/DWYMIvFE9HccR2Kr2c0OtDjorPgpJXlrY4JiqD4GjhIo3lAqAjV9saxa/jz7NUBn/ZnxQbwWSUCfd41Srgw527y83/MkDriQAZ2K43E0GZj72C6f8+AfnGW3190yIKHbcu1O65IZSPS/LA4B51zTKx+14dpEEw1gms0yXhVEn9WKIkQf+nO/NyleDD6irsJzue+8CGCvzmWahQigAAAAASUVORK5CYII='); }
#gdf > .favnote.pencil { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwElEQVR4Ac2QA4yYMQCF23nRfEMwe4sz27Zt297Ztm3btm3btt/+XnJmvJfU/b6C/B+JdKB8XLGYYNlFhibcjlp11GiirUIGreVSaC0TR3OJEBoKfqE29xOqs96ClaTA02B7ubJ7kCDUhlp3VCmhpfgPmot+oanwJxoLvqMu9zMqM96hNOUFipOeIsrzMNDsAbafK3v6BMFW1KajSgWtJX/HlPhYb+0rlorUp08QYE7tOqvV0F7GxyTj3oQ9hzF9Al8T6tBVo4GOcv4JSUqtriJlAy0NpnQfYfE0pE5dtVrorBAcV5IS+gqu4hcBXl7YUepHWNz0qEt3nTa6KoXGlBTF34KF3kO0tLTg64nZOTqEHCEsTtrUDXW6nEB4VElJ4h0EWq/m+t8hLXwZCrzTgvv+wF6deqBeD91VIiNKypLvI8hmDYNhpboM6eEvwZg+gakc8UOjDZiE3aTnObWaYB9bkf4OwbabGQwb9TXIinyD9kplMKaXn/vlMdHVFCJhQ4u2IImzUKC1DFb+S+tVeElq7xpjGMsVMpMrPFxZMrQIPKRSaEyD7Hca9PAiuTBknaeHHSd4dpZafL1Ld4+24R9mFfDtXW/67AAAAABJRU5ErkJggg=='); }
#gdf > .favnote.pencil { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwElEQVR4Ac2QA4yYMQCF23nRfEMwe4sz27Zt297Ztm3btm3btt/+XnJmvJfU/b6C/B+JdKB8XLGYYNlFhibcjlp11GiirUIGreVSaC0TR3OJEBoKfqE29xOqs96ClaTA02B7ubJ7kCDUhlp3VCmhpfgPmot+oanwJxoLvqMu9zMqM96hNOUFipOeIsrzMNDsAbafK3v6BMFW1KajSgWtJX/HlPhYb+0rlorUp08QYE7tOqvV0F7GxyTj3oQ9hzF9Al8T6tBVo4GOcv4JSUqtriJlAy0NpnQfYfE0pE5dtVrorBAcV5IS+gqu4hcBXl7YUepHWNz0qEt3nTa6KoXGlBTF34KF3kO0tLTg64nZOTqEHCEsTtrUDXW6nEB4VElJ4h0EWq/m+t8hLXwZCrzTgvv+wF6deqBeD91VIiNKypLvI8hmDYNhpboM6eEvwZg+gakc8UOjDZiE3aTnObWaYB9bkf4OwbabGQwb9TXIinyD9kplMKaXn/vlMdHVFCJhQ4u2IImzUKC1DFb+S+tVeElq7xpjGMsVMpMrPFxZMrQIPKRSaEyD7Hca9PAiuTBknaeHHSd4dpZafL1Ld4+24R9mFfDtXW/67AAAAABJRU5ErkJggg=='); }
#gdf > .favnote.exclamation { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVR4AcWQA4yfMQBHXzvbtm3b4RzNXow5mIPZWzTbtm3btre/1a/dXXN2uF9St6+v5b9HANw8IKYDNclYFjfuZi4mAlzfJ3Y1aLuit1YejNFgHLSO4KgAjhNEOxEAvnx5je/Xwd3AoqY9zAUACaA1Ah1CR/7Y4kRcaOVFOyFURBEORwgGg7Y06XK8t9aMvrpHtAXIHAdAIoSIYWrbZspkl22UCuN2uzl7dBLQtNevz9cLAB3sDsdBCiGRUqK1ThVSo0YjtHbInj07j9R1N9idcQBrIKVto0pcayEB33P+fD9J0PuC2DNxT1DRA3vA3pzUxPaDvs+UrT2eD48W233RZ5IYCGxJwcTneUuOfLXIlj0/uQrUIhT4FmcgYw2E7aYEAdfvF+QtXJ++Q7aTt2AtXH9eRgMyEWegkMQYJIV4XO/IlLUIRrnYsWMHfs9nNNkRgkJxf+APmKzIvIgsIIzBoMFoRFT5EfVxeYpW4fOf6xw6OJ4fwRtkypEVbSgxsJe9koITRrKganlqkCTZsoncJUsXKFupQf3cjnJRqdYtXj1qBAhe3Xv6bdUm32AB5ADyWJskWTlTLGzVrmKngkWyFsIYchfqhffXHgB+//T+vH/r0yFBGlk/l2Va05BUIiW3/wHmcuCUyEztWwAAAABJRU5ErkJggg=='); }
#gdf > .favnote.exclamation { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVR4AcWQA4yfMQBHXzvbtm3b4RzNXow5mIPZWzTbtm3btre/1a/dXXN2uF9St6+v5b9HANw8IKYDNclYFjfuZi4mAlzfJ3Y1aLuit1YejNFgHLSO4KgAjhNEOxEAvnx5je/Xwd3AoqY9zAUACaA1Ah1CR/7Y4kRcaOVFOyFURBEORwgGg7Y06XK8t9aMvrpHtAXIHAdAIoSIYWrbZspkl22UCuN2uzl7dBLQtNevz9cLAB3sDsdBCiGRUqK1ThVSo0YjtHbInj07j9R1N9idcQBrIKVto0pcayEB33P+fD9J0PuC2DNxT1DRA3vA3pzUxPaDvs+UrT2eD48W233RZ5IYCGxJwcTneUuOfLXIlj0/uQrUIhT4FmcgYw2E7aYEAdfvF+QtXJ++Q7aTt2AtXH9eRgMyEWegkMQYJIV4XO/IlLUIRrnYsWMHfs9nNNkRgkJxf+APmKzIvIgsIIzBoMFoRFT5EfVxeYpW4fOf6xw6OJ4fwRtkypEVbSgxsJe9koITRrKganlqkCTZsoncJUsXKFupQf3cjnJRqdYtXj1qBAhe3Xv6bdUm32AB5ADyWJskWTlTLGzVrmKngkWyFsIYchfqhffXHgB+//T+vH/r0yFBGlk/l2Va05BUIiW3/wHmcuCUyEztWwAAAABJRU5ErkJggg=='); }
#gdf > .favnote:after { width: 70px; content: "See your note"; }
#gdf > .favnote:after { width: 70px; content: "See your note"; }
#gdf > .favnote.plus:after { width: 55px; content: "Add a note"; }
#gdf > .favnote.plus:after { width: 55px; content: "Add a note"; }
#gdf > .favnote.arrow:after { width: 70px; content: "Save the note"; }
#gdf > .favnote.arrow:after { width: 70px; content: "Save the note"; }
#gdf > .favnote.pencil:after { width: 70px; content: "Edit your note"; }
#gdf > .favnote.pencil:after { width: 70px; content: "Edit your note"; }
#gdf > .favnote.exclamation:after { width: 300px; height: 60px !important; white-space: normal; content: "Note failed to load. Click to retry. WARNING: Changing favourite category while the note is not loaded will remove existing notes!"; }
#gdf > .favnote.exclamation:after { width: 300px; height: 60px !important; white-space: normal; content: "Note failed to load. Click to retry. WARNING: Changing favourite category while the note is not loaded will remove existing notes!"; }
#gdf > .favnote + .editor {
#gdf > .favnote + .editor {
position: absolute;
position: absolute;
height: 18px;
height: 18px;
background: ${color.bg_light} !important;
background: ${color.bg_light} !important;
padding: 10px;
padding: 10px;
top: -1px;
top: -1px;
left: 132px;
left: 132px;
z-index: 10;
z-index: 10;
border: 1px solid ${color.border};
border: 1px solid ${color.border};
visibility: hidden;
visibility: hidden;
}
}
#gdf > .favnote + .editor > input {
#gdf > .favnote + .editor > input {
margin: 0 0 0 30px;
margin: 0 0 0 30px;
height: 12px;
height: 12px;
}
}
#gdf > .favnote + .editor > input.notinput {
#gdf > .favnote + .editor > input.notinput {
border-color: transparent;
border-color: transparent;
background: none !important;
background: none !important;
color: inherit !important;
color: inherit !important;
cursor: default !important;
cursor: default !important;
outline: none !important;
outline: none !important;
color: transparent !important;
color: transparent !important;
text-shadow: 0 0 0 ${color.border};
text-shadow: 0 0 0 ${color.border};
}
}
#gdf > .favnote + .editor.show { visibility: visible; }
#gdf > .favnote + .editor.show { visibility: visible; }
#gdf.hover .fav {
#gdf.hover .fav {
position: relative;
position: relative;
}
}
#gdf .hotkey-hint {
#gdf .hotkey-hint {
position: absolute;
position: absolute;
top: 4px;
top: 4px;
right: 0;
right: 0;
box-sizing: border-box;
box-sizing: border-box;
padding: 0 1px 0 2px;
padding: 0 1px 0 2px;
border: 1px solid #888;
border: 1px solid #888;
border-radius: 2px;
border-radius: 2px;
background: #eee;
background: #eee;
color: #666 !important;
color: #666 !important;
font-family: monospace;
font-family: monospace;
font-size: 13px;
font-size: 13px;
box-shadow: -3px 0 2px 2px ${color.bg_light};
box-shadow: -3px 0 2px 2px ${color.bg_light};
visibility: hidden;
visibility: hidden;
}
}
#gdf.hover .fav:hover .hotkey-hint {
#gdf.hover .fav:hover .hotkey-hint {
box-shadow: -3px 0 2px 2px ${color.bg};
box-shadow: -3px 0 2px 2px ${color.bg};
}
}
#gdf.hover .hotkey-hint {
#gdf.hover .hotkey-hint {
visibility: visible;
visibility: visible;
}
}
`;
`;
/* ========================================================================= *\
* * UTILITY FUNCTIONS
\* ========================================================================= */
// Debug msg
// Debug msg
function dlog(msg) {
function dlog(msg) {
if ( config.debug ) {
if ( config.debug ) {
console.log(`"EHGQF: ${msg}`);
console.log(`"EHGQF: ${msg}`);
}
}
}
}
// Detect if page is favourite adding popup
function isFavouritePopupPage() {
var x = location.search.match("addfav");
var y = location.pathname.match("gallerypopups.php");
Text moved with changes to lines 693-696 (91.0% similarity)
if ( x && y ) return true;
return false;
}
// Get the actual/current favourite category of the current gallery
// Get the actual/current favourite category of the current gallery
function getCurrentFavID() {
function getPageFavId() {
var curFavEl = document.querySelector("div[style*='g/fav.png);']");
let idElement = document.querySelector("#fav .i");
var curFavID;
if ( !idElement ) return 10;
if ( curFavEl ) {
curFavID = (curFavEl.attributes.style.value.match(/background-position:0px -(\d+)px/)[1] - 2 ) / 19;
} else {
curFavID = 10; // curFavEl does not exist if gallery is not yet marked as favourite of any favs
}
dlog(curFavID);
return curFavID;
}
Text moved to lines 491-513
// Get Favourite Notes remotely from the popup
function fetchFavouriteNotes(cb) {
dlog("Beginning to check favnotes");
// Send XHR to Favourite Page
var galID = location.pathname.match(/^\/\w\/(\d+)\//)[1];
var token = location.pathname.match(/\/(\w+)\/$/)[1];
var prot = location.protocol;
var host = location.host;
var url = `${prot}//${host}/gallerypopups.php?gid=${galID}&t=${token}&act=addfav`;
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.timeout = config.timeout;
xhr.responseType = "document";
xhr.send();
// And grab the favnotes
xhr.onload = function() {
if ( xhr.status == 200 ) {
// grab it!
var data = xhr.response;
var favnoteEl = data.querySelector('textarea[name="favnote"]');
var favnote;
if (favnoteEl) {
favnote = favnoteEl.value;
} else {
favnote = false;
}
Text moved to lines 514-524
dlog("Favnotes successfully found");
cb(favnoteEl.value); // Fire callback function
} else {
dlog("XHR failed; notes not found");
return false;
}
};
xhr.timeout = function() {
dlog("XHR timed out; notes not found");
return false;
};
}
// Update the locally stored favourite labels
function updateFavouriteLabels() {
dlog("Updating favourite labels");
var favs = document.querySelectorAll('div[style="height:25px; cursor:pointer"]');
for (var i=0; i<favs.length; i++) {
var label = favs[i].children[2].textContent;
localStorage.setItem(`EHGQF-fav${i}`, label);
dlog(`Successfully set 'EHGQF-fav${i} to ${label}`);
}
}
// Update the current/actual Favourite Category of the current Gallery
function updateCurrentFav(favID) {
dlog('Updating current fav');
Text moved to lines 453-483
var el;
if (favID == 'favdel') {
el = `
<div style="float:left">
<a onclick="return false" href="#" id="favoritelink"><img src="http://ehgt.org/g/mr.gif"> Add to Favorites</a>
<div class="hotkey-hint">-</div>
</div>
`;
} else {
// Fetch the Labels of the 10 Fav items
var favLabels = [];
for (i=0; i<10; i++) {
var label = localStorage.getItem(`EHGQF-fav${i}`);
if ( !label ) label = `Favorites ${i}`;
favLabels.push(label);
}
// Calculate bg offset
var offset = 2 + (favID*19);
// Build
el = `
<div id="fav" style="float:left; cursor:pointer">
<div title="Read Later" style="background-image:url(http://ehgt.org/g/fav.png); background-position:0px -${offset}px;" class="i"></div>
</div>
<div style="float:left">
<a onclick="return false" href="#" id="favoritelink">${favLabels[favID]}</a>
</div>
`;
}
document.getElementById('gdf').innerHTML = el;
return (idElement.style.backgroundPositionY.match(/\d+/)[0] - 2)/19;
}
}
Text moved to lines 529-539
// Update favnote icon status
function updateFavnoteIcon(status) {
dlog(`Updating favnote icon to ${status}`);
var favnoteEl = document.querySelector('#gdf > .favnote');
// Clear all classes but .favnote
favnoteEl.className = 'favnote';
// Add status
favnoteEl.classList.add(status);
}
// Inject Stylesheet
/* ========================================================================= *\
* * UI INJECTIONS
\* ========================================================================= */
// Inject CSS
function injectStylesheet() {
function injectStylesheet() {
dlog("Injecting stylesheet");
dlog("Injecting stylesheet");
var stylesheetEl = document.createElement('style');
var stylesheetEl = document.createElement("style");
stylesheetEl.innerHTML = stylesheet;
stylesheetEl.innerHTML = stylesheet;
document.body.appendChild(stylesheetEl);
document.body.appendChild(stylesheetEl);
}
}
// Build and inject favnote UI; this needs to be separated because it's asynchronous
// Build and inject FavNote UI
function injectFavnoteElements() {
function injectFavnoteElements() {
dlog("Injecting Favnote UI elements");
dlog("Injecting Favnote UI elements");
// Fetch the FavID of the current gallery
// Fetch the FavID of the current gallery
var curFavID = getCurrentFavID();
var curFavID = getPageFavId();
// Fetch favnotes if current gallery was already in a fav category
// Fetch favnotes if current gallery was already in a fav category
if ( curFavID != 10 ) {
if ( curFavID != 10 ) {
fetchFavouriteNotes(function(favnote){
fetchFavouriteNotes( favnote => {
// Determine icon type
// Determine icon type
var favnoteStatus = '';
var favnoteStatus = "";
if ( favnote === false ) favnoteStatus = 'exclamation';
if ( favnote === false ) favnoteStatus = "exclamation";
if ( favnote === "" ) favnoteStatus = 'plus';
if ( favnote === "" ) favnoteStatus = "plus";
// Build elements for Favnotes
// Build elements for Favnotes
var favnoteEl = `
var favnoteEl = `
<div class='favnote ${favnoteStatus}'></div>
<div class='favnote ${favnoteStatus}'></div>
<div class="editor">
<div class="editor">
<input type="text" size="${config.editor_size}" class="stdinput" value="${favnote}">
<input type="text" size="${config.editor_size}" class="stdinput" value="${favnote}">
</div>
</div>
`;
`;
// Inject
// Inject
var gdf = document.getElementById("gdf");
var gdf = document.getElementById("gdf");
gdf.insertAdjacentHTML('beforeend', favnoteEl);
gdf.insertAdjacentHTML("beforeend", favnoteEl);
// Add event listeners
// Add event listeners
document.querySelector("#gdf > .favnote").addEventListener("click", favnoteClick);
document.querySelector("#gdf > .favnote").addEventListener("click", favnoteClick);
dlog("Successfully injected Favnote UI ");
dlog("Successfully injected Favnote UI");
return;
});
});
}
}
dlog("FavID = 10: No notes to inject!");
}
}
// Build and inject UI; also hook event listeners
// Build & Inject QF UI
function injectQFElements() {
function injectQFElements() {
var i;
var i;
dlog("Injecting Quick Fav UI elements");
dlog("Injecting Quick Fav UI elements");
// Fetch the FavID of the current gallery
// Fetch the FavID of the current gallery
var curFavID = getCurrentFavID();
var curFavID = getPageFavId();
// Fetch the Labels of the 10 Fav items
// Fetch the Labels of the 10 Fav items
var favLabels = [];
var favLabels = [];
for (i=0; i<10; i++) {
for (i=0; i<10; i++) {
var label = localStorage.getItem(`EHGQF-fav${i}`);
var label = localStorage.getItem(`EHGQF-fav${i}`);
if ( !label ) label = `Favorites ${i+1}`;
if ( !label ) label = `Favorites ${i+1}`;
favLabels.push(label);
favLabels.push(label);
}
}
// Build fav item elements
// Build fav item elements
var favEl = [];
var favEl = [];
for (i=0; i<10; i++) {
for (i=0; i<10; i++) {
var offset = 2 + (i*19);
var offset = 2 + (i*19);
var el = `
var el = `
<div qfid='${i}' class='fav'>
<div qfid='${i}' class='fav'>
<div class="i" style="background-image:url(http://ehgt.org/g/fav.png); background-position:0px -${offset}px;"></div>
<div class="i" style="background-image:url(https://ehgt.org/g/fav.png); background-position:0px -${offset}px;"></div>
<a id="favoritelink" href="#">${favLabels[i]}</a>
<a id="favoritelink" href="#">${favLabels[i]}</a>
<div class="hotkey-hint">${i}</div>
<div class="hotkey-hint">${i}</div>
</div>
</div>
`;
`;
favEl.push(el);
favEl.push(el);
}
}
// Add the `remove favorites` fav item
// Add the `remove favorites` fav item
favEl.push(`
favEl.push(`
<div qfid='favdel' class='fav'>
<div qfid='favdel' class='fav'>
<a id="favoritelink" href="#">Remove from Favorites</a>
<a id="favoritelink" href="#">Remove from Favorites</a>
<div class="hotkey-hint">-</div>
</div>
</div>
`);
`);
// Build top list
// Build top list
var qfTopElContent = "";
var qfTopElContent = "";
for (i=0; i<curFavID; i++) { qfTopElContent += favEl[i]; }
for (i=0; i<curFavID; i++) { qfTopElContent += favEl[i]; }
var qfTopEl = `<div class='qf-top'>${qfTopElContent}</div>`;
var qfTopEl = `<div class='qf-top'>${qfTopElContent}</div>`;
// Build bottom list
// Build bottom list
var qfBotElContent = "";
var qfBotElContent = "";
for (i=curFavID+1; i<favEl.length; i++) { qfBotElContent += favEl[i]; }
for (i=curFavID+1; i<favEl.length; i++) { qfBotElContent += favEl[i]; }
var qfBotEl = `<div class='qf-bot'>${qfBotElContent}</div>`;
var qfBotEl = `<div class='qf-bot'>${qfBotElContent}</div>`;
// Inject Elements! Finally
// Inject Elements! Finally
var gdf = document.getElementById("gdf");
var gdf = document.getElementById("gdf");
gdf.insertAdjacentHTML('beforeend', qfTopEl);
gdf.insertAdjacentHTML("beforeend", qfTopEl);
gdf.insertAdjacentHTML('beforeend', qfBotEl);
gdf.insertAdjacentHTML("beforeend", qfBotEl);
// Add Event Listeners
// Add Event Listeners
var favDOMEl = document.querySelectorAll("#gdf .fav");
var favDOMEl = document.querySelectorAll("#gdf .fav");
for(i=0; i<favDOMEl.length; i++) {
for(i=0; i<favDOMEl.length; i++) {
favDOMEl[i].addEventListener("click", quickFavourite);
favDOMEl[i].addEventListener("click", quickFavourite);
}
}
// Disable `#gdf` click event; move it to its child element;
// Disable `#gdf` click event; move it to its child element;
gdf.children[0].onclick = gdf.onclick;
gdf.children[0].onclick = gdf.onclick;
gdf.children[1].onclick = gdf.onclick;
gdf.children[1].onclick = gdf.onclick;
gdf.onclick = "";
gdf.onclick = "";
dlog("UI Injection successful!");
dlog("UI Injection successful!");
}
}
// Mark gallery as favourite
/* ========================================================================= *\
* * QUICK FAVOURITE
\* ========================================================================= */
// Send Favouriting XHR request to EH server
function quickFavourite(id) {
function quickFavourite(id) {
dlog("quickFavourite() triggered!");
dlog("quickFavourite() triggered!");
// Gather and build things
// Gather and build things
var favnote = document.querySelector('.favnote + .editor > input').value;
let favnoteEl = document.querySelector(".favnote + .editor > input");
var favID;
let favnote = (favnoteEl) ? favnoteEl.value : "";
let favID;
try { favID = this.attributes.qfid.value; } catch(e) {
try { favID = this.attributes.qfid.value; } catch(e) {
favID = id;
favID = id;
}
}
var galID = location.pathname.match(/^\/\w\/(\d+)\//)[1];
let galID = location.pathname.match(/^\/\w\/(\d+)\//)[1];
var token = location.pathname.match(/\/(\w+)\/$/)[1];
let token = location.pathname.match(/\/(\w+)\/$/)[1];
var prot = location.protocol;
let prot = location.protocol;
var host = location.host;
let host = location.host;
var url = `${prot}//${host}/gallerypopups.php?gid=${galID}&t=${token}&act=addfav`;
let url = `${prot}//${host}/gallerypopups.php?gid=${galID}&t=${token}&act=addfav`;
var dat = `apply=Add to Favorites&favcat=${favID}&favnote=${favnote}&update=1`;
let dat = `apply=Add to Favorites&favcat=${favID}&favnote=${favnote}&update=1`;
// Prepare to send XHR
// Prepare to send XHR
var xhr = new XMLHttpRequest();
let xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xhr.timeout = config.timeout;
// Remove Quick Favourite Elements to prevent sending multiple XHR
// Remove Quick Favourite Elements to prevent sending multiple XHR
document.querySelector('.qf-top').remove();
document.querySelector(".qf-top").remove();
document.querySelector('.qf-bot').remove();
document.querySelector(".qf-bot").remove();
document.querySelector('.favnote').remove();
if ( favnoteEl ) document.querySelector(".favnote").remove();
document.querySelector('.editor').remove();
if ( favnoteEl ) document.querySelector(".editor").remove();
// Send XHR
// Send XHR
xhr.send(dat);
xhr.send(dat);
// Update UI if request was successful
// Update UI if request was successful
xhr.onload = function() {
xhr.onload = function() {
if (xhr.status == 200) {
if (xhr.status == 200) {
updateCurrentFav(favID); // Update #gdf
updateCurrentFav(favID); // Update #gdf
} else {
} else {
dlog("Error occurred! Favorite was not updated!");
dlog("Error occurred! Favorite was not updated!");
alert("Error occurred! Favorite was not updated!");
alert("Error occurred! Favorite was not updated!");
}
}
injectQFElements(); // Reinject Quick Favourite UI
injectQFElements(); // Reinject Quick Favourite UI
injectFavnoteElements(); // and Favnote UI
injectFavnoteElements(); // and Favnote UI
disableHotkeys();
disableHotkeys();
dlog("quickFavourite() done!"); // Done!
dlog("quickFavourite() done!"); // Done!
};
};
}
// Throw error if timeout occurred
// Update the current/actual Favourite Category of the current Gallery
xhr.ontimeout = function(e) {
function updateCurrentFav(favID) {
dlog("Timeout occurred! Favorite was not updated!");
dlog("Updating current fav with favID "+favID);
alert("Timeout occurred! Favorite was not updated!");
injectQFElements();
// If id is not specified, refresh
dlog("quickFavourite() timed out!");
if ( typeof favID == "undefined" ) {
favID = getPageFavId();
dlog("FavID set to " + favID);
}
Text moved from lines 344-374
var el;
if (favID == "favdel" || favID === 10) {
el = `
<div style="float:left">
<a onclick="return false" href="#" id="favoritelink"><img src="https://ehgt.org/g/mr.gif"> Add to Favorites</a>
<div class="hotkey-hint"></div>
</div>
`;
} else {
// Fetch the Labels of the 10 Fav items
var favLabels = [];
for (let i=0; i<10; i++) {
var label = localStorage.getItem(`EHGQF-fav${i}`);
if ( !label ) label = `Favorites ${i}`;
favLabels.push(label);
}
// Calculate bg offset
var offset = 2 + (favID*19);
// Build
el = `
<div id="fav" style="float:left; cursor:pointer">
<div title="Read Later" style="background-image:url(https://ehgt.org/g/fav.png); background-position:0px -${offset}px;" class="i"></div>
</div>
<div style="float:left">
<a onclick="return false" href="#" id="favoritelink">${favLabels[favID]}</a>
</div>
`;
}
document.getElementById("gdf").innerHTML = el;
}
/* ========================================================================= *\
* * FAVOURITE NOTES
\* ========================================================================= */
Text moved from lines 286-308
// Get Favourite Notes remotely from the popup
function fetchFavouriteNotes(cb) {
dlog("Beginning to check favnotes");
// Send XHR to Favourite Page
var galID = location.pathname.match(/^\/\w\/(\d+)\//)[1];
var token = location.pathname.match(/\/(\w+)\/$/)[1];
var prot = location.protocol;
var host = location.host;
var url = `${prot}//${host}/gallerypopups.php?gid=${galID}&t=${token}&act=addfav`;
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.timeout = config.timeout;
xhr.responseType = "document";
xhr.send();
// And grab the favnotes
xhr.onload = function() {
if ( xhr.status == 200 ) {
// grab it!
var data = xhr.response;
var favnoteEl = data.querySelector("textarea[name='favnote']");
Text moved from lines 315-325
dlog("Favnotes successfully found");
cb(favnoteEl.value); // Fire callback function
} else {
dlog("XHR failed; notes not found");
return false;
}
};
xhr.timeout = function() {
dlog("XHR timed out; notes not found");
return false;
};
};
}
}
Text moved from lines 379-389
// What happens when favnote icon is clicked
// Update favnote icon status
function updateFavnoteIcon(status) {
dlog(`Updating favnote icon to ${status}`);
var favnoteEl = document.querySelector("#gdf > .favnote");
// Clear all classes but .favnote
favnoteEl.className = "favnote";
// Add status
favnoteEl.classList.add(status);
}
// FavNote click event handler
function favnoteClick() {
function favnoteClick() {
var favnoteEl = this;
var favnoteEl = this;
var editorEl = document.querySelector('#gdf > .favnote + .editor');
var editorEl = document.querySelector("#gdf > .favnote + .editor");
var inputEl = document.querySelector('#gdf > .favnote + .editor > input');
var inputEl = document.querySelector("#gdf > .favnote + .editor > input");
// Determine mode
// Determine mode
var mode;
var mode;
if ( favnoteEl.classList.length === 1 ) mode = 'show';
if ( favnoteEl.classList.length === 1 ) mode = "show";
else if ( favnoteEl.classList.contains('arrow') ) mode = 'save';
else if ( favnoteEl.classList.contains("arrow") ) mode = "save";
else if ( favnoteEl.classList.contains('exclamation') ) mode = 'reload';
else if ( favnoteEl.classList.contains("exclamation") ) mode = "reload";
else mode = 'edit';
else mode = "edit";
// Behave accordingly
// Behave accordingly
switch(mode) {
switch(mode) {
case 'show':
case "show":
updateFavnoteIcon('pencil'); // marks the next action to edit
updateFavnoteIcon("pencil"); // marks the next action to edit
editorEl.classList.add('show');
editorEl.classList.add("show");
inputEl.classList.add('notinput');
inputEl.classList.add("notinput");
break;
break;
case 'edit':
case "edit":
updateFavnoteIcon('arrow'); // marks the next action to save
updateFavnoteIcon("arrow"); // marks the next action to save
editorEl.classList.add('show');
editorEl.classList.add("show");
inputEl.classList.remove('notinput');
inputEl.classList.remove("notinput");
break;
break;
case 'save':
case "save":
var favID = getCurrentFavID();
var favID = getPageFavId();
quickFavourite(favID);
quickFavourite(favID);
break;
break;
case 'reload':
case "reload":
// an error occurred, attempt to reload favnotes
// an error occurred, attempt to reload favnotes
document.querySelector('.favnote').remove();
document.querySelector(".favnote").remove();
document.querySelector('.editor').remove();
document.querySelector(".editor").remove();
injectFavnoteElements();
injectFavnoteElements();
break;
break;
default:
default:
dlog("What is happening?");
dlog("What is happening?");
alert("A really strange error occurred. This part of code should be reached.");
alert("A really strange error occurred. This part of code should be reached.");
return;
return;
}
}
}
}
/* ========================================================================= *\
* * FAVOURITE HOTKEYS
\* ========================================================================= */
// Adds keypress event listener
// Adds keypress event listener
function injectHotkeyListener() {
function injectHotkeyListener() {
document.addEventListener('keypress', hotkeyHandler);
document.addEventListener("keypress", hotkeyHandler);
dlog("Listening to keypress events now");
dlog("Listening to keypress events now");
}
}
// Processes keypresses
// Handles keypresses
function hotkeyHandler(e) {
function hotkeyHandler(e) {
let key = e.which;
let key = e.which;
let char = String.fromCharCode(key);
let char = String.fromCharCode(key);
if (hotkeyInit) {
if (hotkeyInit) {
if (e.keyCode == 27) {
if (e.keyCode == 27) {
return;
return;
}
}
// 0-9 and "-"
// 0-9 and "-"
let favID;
let favID;
switch(char) {
switch(char) {
case("0"):
case("0"):
favID = 0;
favID = 0;
break;
break;
case("1"):
case("1"):
favID = 1;
favID = 1;
break;
break;
case("2"):
case("2"):
favID = 2;
favID = 2;
break;
break;
case("3"):
case("3"):
favID = 3;
favID = 3;
break;
break;
case("4"):
case("4"):
favID = 4;
favID = 4;
break;
break;
case("5"):
case("5"):
favID = 5;
favID = 5;
break;
break;
case("6"):
case("6"):
favID = 6;
favID = 6;
break;
break;
case("7"):
case("7"):
favID = 7;
favID = 7;
break;
break;
case("8"):
case("8"):
favID = 8;
favID = 8;
break;
break;
case("9"):
case("9"):
favID = 9;
favID = 9;
break;
break;
case("-"):
case("-"):
favID = 'favdel';
favID = "favdel";
break;
break;
default:
default:
disableHotkeys();
disableHotkeys();
break;
break;
}
}
if (favID) quickFavourite(favID);
if (typeof favID != "undefined") quickFavourite(favID);
} else {
} else {
if (char == "F") enableHotkeys();
if (char == "F") enableHotkeys();
}
}
}
}
function enableHotkeys() {
function enableHotkeys() {
hotkeyInit = true;
hotkeyInit = true;
if(config.cheatsheet) showCheatSheet();
if(config.cheatsheet) showCheatSheet();
dlog("Entering active hotkey favouriting mode");
dlog("Entering active hotkey favouriting mode");
}
}
function disableHotkeys() {
function disableHotkeys() {
if(config.cheatsheet) hideCheatSheet();
if(config.cheatsheet) hideCheatSheet();
hotkeyInit = false;
hotkeyInit = false;
dlog("Quitting active hotkey favouriting mode");
dlog("Quitting active hotkey favouriting mode");
}
}
function showCheatSheet() {
function showCheatSheet() {
dlog("Showing Cheat Sheet");
dlog("Showing Cheat Sheet");
document.getElementById("gdf").classList.add("hover");
document.getElementById("gdf").classList.add("hover");
}
}
function hideCheatSheet() {
function hideCheatSheet() {
dlog("Hiding Cheat Sheet");
dlog("Hiding Cheat Sheet");
document.getElementById("gdf").classList.remove("hover");
document.getElementById("gdf").classList.remove("hover");
}
}
// Main/init
/* ========================================================================= *\
* * CORE LOGICS
\* ========================================================================= */
function checkSyncNecessity() {
// >1w = stale
let currentTime = new Date().getTime();
let lastSyncTime = localStorage.getItem("EHGQF-lastSyncTime");
let timeDelta = currentTime - lastSyncTime;
if ( timeDelta > 1000*60*60*24*7 ) return true;
// setup
let x = localStorage.getItem("EHGQF-setup");
if (typeof x == "undefined") return true;
// constant page check
let labelId = getPageFavId();
if ( labelId == 10 ) return false; // can't check if page isn't favourited yet
let pageLabel = document.querySelector("#favoritelink").textContent;
let storedLabel = localStorage.getItem(`EHGQF-fav${labelId}`);
if ( pageLabel != storedLabel ) return true;
Text moved with changes from lines 268-271 (91.0% similarity)
dlog("No reason found to sync favourite labels");
return false;
}
function syncFavouriteLabels() {
dlog("Fetching fresh Favourite Labels!");
// Send XHR to Favourite Page
var galID = location.pathname.match(/^\/\w\/(\d+)\//)[1];
var token = location.pathname.match(/\/(\w+)\/$/)[1];
var prot = location.protocol;
var host = location.host;
var url = `${prot}//${host}/gallerypopups.php?gid=${galID}&t=${token}&act=addfav`;
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "document";
xhr.send();
// And grab the favnotes
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 && xhr.status == 200 ) {
let data = xhr.response;
for(let i=0; i<=9; i++) {
let label = data.querySelector(`div + div + div[onclick*='fav${i}']`).textContent;
localStorage.setItem(`EHGQF-fav${i}`, label);
}
dlog("Favourite Labels Updated!");
let time = new Date().getTime();
localStorage.setItem("EHGQF-setup", 1);
localStorage.setItem("EHGQF-lastSyncTime", time);
updateCurrentFav();
injectQFElements();
}
};
}
function init() {
function init() {
if ( isFavouritePopupPage() ) {
dlog("Initialization start!");
// We are in favourite popup page; update labels
if ( checkSyncNecessity() ) syncFavouriteLabels();
dlog("We are in favourite popup page");
injectStylesheet();
updateFavouriteLabels();
injectQFElements();
} else {
injectFavnoteElements();
// We are in gallery page; inject quick favourite ui
if (config.hotkeys) injectHotkeyListener();
dlog("We are in Gallery page");
injectStylesheet();
injectQFElements();
injectFavnoteElements();
if (config.hotkeys) injectHotkeyListener();
}
dlog("Initialization finished!");
dlog("Initialization finished!");
}
}
init();
init();