您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ultimate Pixiv Script: Direct Links, Auto-Paging, Preview, IQDB/Danbooru, Filter/Sort using Bookmark,views,rating,total score. | Safe Search | plus more. Works best with "Pixiv++ Manga Viewer" and "Generic Image Viewer". 自動ページング|ポケベル|ロード次ページ|フィルター|並べ替え|注文|ダイレクトリンク
当前为
// ==UserScript== // @name [TS] Pixiv++ // @namespace TimidScript // @version 3.2.78a // @description Ultimate Pixiv Script: Direct Links, Auto-Paging, Preview, IQDB/Danbooru, Filter/Sort using Bookmark,views,rating,total score. | Safe Search | plus more. Works best with "Pixiv++ Manga Viewer" and "Generic Image Viewer". 自動ページング|ポケベル|ロード次ページ|フィルター|並べ替え|注文|ダイレクトリンク // @author TimidScript // @homepageURL https://openuserjs.org/users/TimidScript // @copyright © 2014 TimidScript, All Rights Reserved. // @license Creative Commons BY-NC-SA + Read the License inside the script // @include http://www.pixiv.net/* // @exclude http://www.pixiv.net/member_illust.php?mode=manga&illust_id* // @exclude http://www.pixiv.net/member_illust.php?mode=big&illust_id* // @require https://openuserjs.org/src/libs/TimidScript/TSL_-_Generic.js // @require https://openuserjs.org/src/libs/TimidScript/TSL_-_GM_Update.js // @homeURL https://openuserjs.org/scripts/TimidScript/[TS]_Pixiv++ // @grant GM_info // @grant GM_getMetadata // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @icon data:image/bmp;base64,Qk1GJwAAAAAAADYAAAAoAAAAMgAAADIAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//Oo13////////////////////////////79/L/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//Wsnj/////////////////7+DJ/86jXf+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/////////////////3sKT/72EJ/+9hCf/vYQn/72EJ//Fk0L/zqNd/86jXf/Oo13/zqNd/86jXf/BjDX/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//////////////////ewpP/yZtQ/+LJof/v4Mn////////////////////////////////////////////38OT/4smh/8mbUP+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn//////////////////////////////////////////////////Po1//v4Mn/7+DJ//v38v///////////////////////////+/gyf/Jm1D/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf///////////////////////fw5P/iyaH/zqNd/8GMNf+9hCf/vYQn/72EJ/+9hCf/vYQn/8WTQv/auob/9/Dk///////////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//////////////////m0a7/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/2rqG///////////////////////m0a7/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/yZtQ//v38v/////////////////iyaH/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/////////////////3sKT/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/1rJ4///////////////////////Oo13/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/7+DJ/////////////////+/gyf+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//Oo13//////////////////////8WTQv+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/////////////////3sKT/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//38OT/////////////////2rqG/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/+/gyf/////////////////iyaH/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/4smh/////////////////+/gyf+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//iyaH/xZNC/72EJ/+9hCf/////////////////3sKT/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//m0a7/////////////////7+DJ/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/2rqG///////Oo13/vYQn/72EJ//////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/+/gyf/////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/8GMNf/79/L//////9ayeP+9hCf/vYQn/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/+/fy/////////////////9ayeP+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/2rqG////////////+/fy/8mbUP+9hCf/////////////////3sKT/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/9Kqa///////////////////////wYw1/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/5tGu////////////+/fy/8mbUP/////////////////ewpP/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/7+DJ/////////////////+bRrv+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/5tGu////////////+/fy/////////////////97Ck/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/9Kqa///////////////////////xZNC/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/1rJ4//v38v//////////////////////3sKT/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//Jm1D/+/fy/////////////////9q6hv+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/xZNC/+/gyf/////////////////38OT/zqNd/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/0qpr//v38v/////////////////m0a7/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/9ayeP/38OT/////////////////8+jX/9ayeP/Fk0L/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/zqNd/+rZvP//////////////////////2rqG/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ//Wsnj/8+jX///////////////////////38OT/7+DJ/+rZvP/q2bz/7+DJ//v38v//////////////////////7+DJ/8mbUP+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/yZtQ/97Ck//v4Mn////////////////////////////////////////////38OT/4smh/8mbUP+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/yZtQ/86jXf/Oo13/zqNd/86jXf/Oo13/wYw1/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/72EJ/+9hCf/vYQn/w== // ==/UserScript== /* License + Copyright Notice ******************************************************************************************** Copyright © TimidScript, All Rights Reserved. [Creative Commons BY-NC-SA](http://en.wikipedia.org/wiki/Creative_Commons_license) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1) This copyright must be included 2) Due credits and link to original author's homepage (included in copyright). 3) Notify the original author of redistribution TimidScript's Homepages: [GitHub](https://github.com/TimidScript) [OpenUserJS](https://openuserjs.org/users/TimidScript) [GreasyFork](https://greasyforks.org/users/1455-timidscript) */ /* Information ******************************************************************************************** Version History ------------------------------------ 3.2.78 (2015-08-23) - Filter fixed. Neat code provided by HoldMyPizza from OUJS 3.2.77 (2015-07-26) - Bug Fix: Corrected latest fix 3.2.76 (2015-07-25) - Bug Fix: Capture new homepage url 3.2.75 (2015-06-27) - Bug Fix: Default preview time and height were switched - Bug Fix: Removal of extra title from thumbnail - Support for other 3rd party of login by adding full support of xhr to be default rather than GM_xhr. Default request method is now is xhr - Removed iframe support 3.2.74 (2015-06-06) - Bug fixes to support own illustrations both public and hidden 3.2.73 (2015-05-30) - Outgoing links are direct now - Bug Fix: getIllustID extracts id from unique urls now http://www.pixiv.net/member_illust.php?illust_id=1111111&mode=medium http://www.pixiv.net/member_illust.php?mode=medium&illust_id=1111111 - Bug Fix: Bookmark count was not being attained in "Works" page (3) 3.2.72 (2015-05-25) - Bug fix: Removes the token information from image link (illustURL) 3.2.71 (2015-05-16) - As of 11/05/2015 the Phone API (SPAPI) is dead. Using public API and HTML instead. - Single paged mangas will be marked as illustrations rather than manga as in most cases that is the case - Changed much of the metadata and information used - Created a separate library for the illustration data getter - Manga hotbox preview images dimensions unfixed - Removed a lot of redundant code. including linker methods, Cache and rated paging - GM_setValue("LinkerMethod", 2); //[2] - GM_setValue("EnableCache", true); //[3] - GM_setValue("APIAgeRating", true); //[4] - RequestBoomarkCount setting added - Huge amount of optimisation and removal of redundant code - IQDB now uses size 240 (240x480) - Need to remove AgeRating searches. Should only be a filter. 3.1.70 (2015-05-08) - Page count added in information box 3.1.69 (2015-04-14) - Hidden comix ads from the illustration page - Changed the illustration page interface. Illustration information is always shown and thumbnails for pages are bellow the illustration. . . . *************************************************************************************************/ //if (window.self !== window.top) return; var IsIllustrationPage = (document.URL.indexOf("http://www.pixiv.net/member_illust.php?") != -1 && document.URL.match(/mode=medium/i) != null); var Illustrations = {}; var PAGETYPE = (function () { if (IsIllustrationPage) return 0; else if (document.URL.match(/http:\/\/www\.pixiv\.net\/((cate_r18|mypage|member)\.php|$)/i)) return 1; else if (document.URL.match(/http:\/\/www\.pixiv\.net\/member_illust\.php\?id/i)) return 3; //Artist Work Page else if (document.URL.match(/http:\/\/www\.pixiv\.net\/member_illust\.php/i)) return 4; //Personal Work Page else if (document.URL.match(/http:\/\/www\.pixiv\.net\/bookmark(_add)?\.php/i)) return 5; //Personal Bookmarks, Added new bookmarks else if (document.URL.match(/http:\/\/www\.pixiv\.net\/bookmark\.php\?id=/i)) return 6; //Artist Bookmark else if (document.URL.match(/http:\/\/www\.pixiv\.net\/bookmark_new_illust(_r18)?\.php/i)) return 7; //Works from favourite artists else if (document.URL.match(/http:\/\/www\.pixiv\.net\/new_illust(_r18)?\.php/i)) return 8; //New illustrations else if (document.URL.match(/http:\/\/www\.pixiv\.net\/search\.php\?/i)) return 9; //Search return -1; })(); console.info("Pixiv++ (" + PAGETYPE + ")"); if (!(typeof GM_getValue === "function" && GM_getValue("", "?") === "?")) { GM_setValue = function (key, val) { localStorage.setItem(key, val); }; GM_getValue = function (key, def) { return (localStorage.getItem(key) ? localStorage.getItem(key) : def); } } var containerClasses = { UnPaged: [ "works_display", // Illustration Page (http://www.pixiv.net/member_illust.php?mode) "content", //Personal Home Page (http://www.pixiv.net/mypage.php) "top_display_works linkStyleWorks", //Personal Home Page Adult Content "worksListOthers", //Artist's Profile Page (http://www.pixiv.net/member.php?) "search_a2_result linkStyleWorks", //Response Page ], Paged: [ "_image-items", "display_works linkStyleWorks", //Artist's & Personal Work and Bookmark Page (http://www.pixiv.net/member_illust.php)(http://www.pixiv.net/bookmark.php) "_image-items autopagerize_page_element", // Illustrations Search; New Illustrations; Your Favourite Artist's New Illustrations; (http://www.pixiv.net/search.php?)(http://www.pixiv.net/new_illust.php)(http://www.pixiv.net/new_illust_r18.php)(http://www.pixiv.net/bookmark_new_illust.php) ] }; /* =================================================================================================================================== Handles all functions to do with getting and adding all Illustration links and metadata. This includes: Image Links, IQDB, Bookmark Count, Views, Rating and score. ===================================================================================================================================*/ var IllustrationLinker = { //Contains all thumbnail links that need to be parsed processList: new Array(), //Max of simultaneous link calls. The higher the count the more stress on server and ISP simultaneousCallsMAX: 6, simultaneousCalls: 0, intervalID: null, msgHandle: null, thumbcounter: 0, //Used by the pager when running in "SafeMode" as it temporarily removes session cookie shortPause: false, //If false the thumbnail interval parser stops running enabled: false, //First time it gets turned on is when the SideBar is loaded TIMESTART: 0, TIMEEND: 0, requestBookmarkCount: GM_getValue("RequestBookmarkCount", 0), getIllustID: function (url) { var id = url.replace(/.+www\.pixiv\.net\/member_illust\.php(\?.+&|\?)illust_id=(\d+)(&.+)?/, "$2"); id = id.replace(/.+i\d+\.pixiv\.net\/(img|c\/).+\/(\d+)(_.+)?\.\w+(\?.+)?/, "$2"); return id; }, getIllust: function (id) { var properties = "userID userName userProfileImageURL illustType illustID illustTitle illust128URL illust150URL illust240URL illust480URL illust600URL illustURL pageCount description time tags tools ratings totalRatings viewCount bookmarkCount responseCount R18"; var illust = Illustrations["i" + id]; if (!illust) { illust = {}; Illustrations["i" + id] = illust; } return makeStruct(properties, illust); }, /* ------------------------------------------------------------------------------------------- Parses through all the image links and add full image link -------------------------------------------------------------------------------------------*/ getContainerLinks: function (containers, pageNumber) { if (!containers) return; var id, thumbnail; if (IsIllustrationPage) ////Illustration Page that excludes Novels { IllustrationLinker.getDataHTML(IllustrationLinker.getIllustID(document.URL)) return; } for (var i = 0, i; container = containers[i], i < containers.length; i++) { links = container.getElementsByTagName("a"); for (var j = 0; link = links[j], j < links.length; j++) { if (link.href.indexOf("http://www.pixiv.net/member_illust.php?mode=") != -1 && link.getElementsByTagName('IMG').length == 1) { id = IllustrationLinker.getIllustID(link.href); thumbnail = link.parentNode; thumbnail.id = "i" + id; thumbnail.setAttribute("illustration-id", id); thumbnail.setAttribute("name", "pppThumb"); if (pageNumber > 0) { TSL.addClass(thumbnail, "pppThumb" + (pageNumber % 3)); thumbnail.setAttribute("page", pageNumber); thumbnail.setAttribute("position", ++IllustrationLinker.thumbcounter); } if (IllustrationLinker.getIllust(id).illustID) IllustrationLinker.createLinksBox(id); else IllustrationLinker.processList.push(id); } } } PaginatorHQ.displayResultInfo(); if (this.enabled) this.runIntevalThumbnailParser(); }, /* ------------------------------------------------------------------------------------------- Get links again. Called when using ARS -------------------------------------------------------------------------------------------*/ resetSettings: function () { clearInterval(IllustrationLinker.intervalID); IllustrationLinker.intervalID = null; IllustrationLinker.processList = new Array(); if (IllustrationLinker.msgHandle) IllustrationLinker.msgHandle.textContent = ""; }, /* ------------------------------------------------------------------------------------------- Contains the interval that requests image information -------------------------------------------------------------------------------------------*/ runIntevalThumbnailParser: function () { IllustrationLinker.TIMESTART = new Date(); if (!IllustrationLinker.msgHandle) IllustrationLinker.msgHandle = DisplayMessage("Getting metadata for [" + IllustrationLinker.processList.length + "] illustrations..."); if (IllustrationLinker.intervalID == null && IllustrationLinker.enabled) IllustrationLinker.intervalID = setInterval(processNextID, 100); function processNextID() { //shortPause used when removing session cookie for safe page search if (IllustrationLinker.shortPause || IllustrationLinker.simultaneousCalls >= IllustrationLinker.simultaneousCallsMAX) return; if (IllustrationLinker.processList.length == 0 && IllustrationLinker.simultaneousCalls == 0) { IllustrationLinker.TIMEEND = new Date(); //console.log(IllustrationLinker.TIMEEND - IllustrationLinker.TIMESTART); clearInterval(IllustrationLinker.intervalID); IllustrationLinker.intervalID = null; RemoveMessage(IllustrationLinker.msgHandle); IllustrationLinker.msgHandle = null; PreviewHQ.adjustAllHotboxPositions(); PaginatorHQ.displayResultInfo(); DisplayMessage("Illustration metadata acquired", 1000); } else if (IllustrationLinker.processList.length % 5 == 0) { IllustrationLinker.msgHandle.textContent = "Getting metadata for [" + (IllustrationLinker.simultaneousCalls + IllustrationLinker.processList.length) + "] illustrations..."; PaginatorHQ.displayResultInfo(); PreviewHQ.adjustAllHotboxPositions(); } //Last check if (IllustrationLinker.enabled && IllustrationLinker.processList.length > 0) { IllustrationLinker.simultaneousCalls++; IllustrationLinker.getDataHTML(IllustrationLinker.processList.shift()); } } }, /* ------------------------------------------------------------------------------------------- If "value" is set to true the linker is temporarily paused. This is used only for short term pausing. switchOff is used for longer pausing method. -------------------------------------------------------------------------------------------*/ pause: function (value) { IllustrationLinker.shortPause = value; if (value && msgHandle) msgHandle.textContent = ""; }, /* ------------------------------------------------------------------------------------------- Thumbnail parser interval is cleared and the link generation halts until it switchOn is called. -------------------------------------------------------------------------------------------*/ switchOff: function () { PreviewHQ.adjustAllHotboxPositions(); IllustrationLinker.enabled = false; clearInterval(IllustrationLinker.intervalID); IllustrationLinker.intervalID = null; if (IllustrationLinker.msgHandle) RemoveMessage(IllustrationLinker.msgHandle); IllustrationLinker.msgHandle = null; }, switchOn: function () { PreviewHQ.adjustAllHotboxPositions(); IllustrationLinker.enabled = true; IllustrationLinker.runIntevalThumbnailParser(); }, /* ------------------------------------------------------------------------------------------- Extracts data from illustration page -------------------------------------------------------------------------------------------*/ setMetadata: function (id, doc) { if (IsIllustrationPage) console.warn("Illustration page debugging: ", id); var el, m, context metadata = IllustrationLinker.getIllust(id), script = doc.evaluate("//div[@id='wrapper']//script[contains(text(),'pixiv.context.illustId')]", doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; unsafeWindow.eval("pixiv" + id + "= {}; pixiv" + id + ".context= {};"); script.innerHTML = script.innerHTML.replace(/pixiv\.context/g, "pixiv" + id + ".context"); unsafeWindow.eval(script.innerHTML); context = unsafeWindow["pixiv" + id].context; metadata.userID = context.userId; //el.parentElement.href.match(/member\.php\?id=(\d+)/i)[1]; metadata.userName = context.userName; //el.nextElementSibling.textContent; el = doc.querySelector(".user-image"); if (el) { metadata.userProfileImageURL = el.src; if (el.src.match("/profile/")) metadata.userLoginName = el.src.match(/\/profile\/([^\/])+\//i)[1]; } metadata.illustID = id; metadata.illustTitle = context.illustTitle; //doc.querySelector('meta[property="og:title"]'); //Translation scripts mess with the title metadata.R18 = 0; if (doc.querySelector(".r-18")) metadata.R18 = 1; if (doc.querySelector(".r-18g")) metadata.R18 = 2; metadata.pageCount = 1; if (doc.querySelector(".tools")) metadata.tools = doc.querySelector(".tools").textContent; metadata.tags = [].map.call(doc.querySelectorAll('li.tag a.text'), function (v, i) { return v.childNodes[0].textContent; }).join(' '); metadata.illust128URL = doc.querySelector('meta[property="og:image"]'); metadata.illust128URL = (metadata.illust128URL) ? metadata.illust128URL.getAttribute("content") : doc.querySelector('img[class="original-image"]').getAttribute("data-src"); metadata.description = doc.querySelector('meta[property="og:description"]'); metadata.description = (metadata.description) ? metadata.description.getAttribute("content") : doc.querySelector("._unit .caption").innerHTML; metadata.bookmarkCount = "?"; metadata.viewCount = parseInt(doc.querySelector(".view-count").textContent); metadata.ratings = parseInt(doc.querySelector(".rated-count").textContent); metadata.totalRatings = parseInt(doc.querySelector(".score-count").textContent); el = doc.querySelector(".response-in-work-more"); metadata.responseCount = (el) ? parseInt(el.textContent.match(/\d+/)[0]) : 0; if (context.ugokuIllustFullscreenData) { metadata.illustType = 3; metadata.illustURL = context.ugokuIllustFullscreenData.src; metadata.illust128URL = metadata.illust128URL.replace(/\/img-inf\/(.+)_s/, "/c/128x128/img-master/$1_master1200"); metadata.illust128URL = metadata.illust128URL.replace(".png", ".jpg"); metadata.illust150URL = metadata.illust128URL.replace("/128x128/", "/150x150/"); metadata.illust240URL = metadata.illust128URL.replace("/128x128/", "/240x480/"); metadata.illust480URL = metadata.illust128URL.replace("/128x128/", "/480x960/"); metadata.illust600URL = metadata.illust128URL.replace("/128x128/", "/600x600/"); metadata.illust1200URL = metadata.illust128URL.replace("/128x128/", "/1200x1200/"); } else { el = doc.querySelector(".works_display ._layout-thumbnail img"); metadata.illustURL = metadata.illust600URL = el.src; el = doc.querySelector(".original-image"); if (el) //Single Image { metadata.illustType = 1; metadata.illustURL = el.getAttribute("data-src").replace(/\?.+/, ""); } else //Manga { metadata.illustType = 2; el = doc.querySelectorAll(".work-info .meta li")[1]; m = el.textContent.match(/(\d+)P$/i); if (m) { metadata.pageCount = parseInt(m[1]); } else //Single paged manga { metadata.pageCount = 1; metadata.illustType = 1; } metadata.illustURL = metadata.illustURL.replace(/(\d+)_m\.\w+/, "$1_big_p0" + metadata.illust128URL.match(/(.\w+)$/)[1]); metadata.illustURL = metadata.illustURL.replace(/c\/600x600\/img-master(.+)\/.+/, "img-original$1/" + metadata.illustID + "_p0" + metadata.illust128URL.match(/(\.\w+)$/)[1]); if (metadata.illustID < 11319936) metadata.illustURL = metadata.illustURL.replace("_big", ""); } if (metadata.illust128URL.indexOf("/img-master/") > 0) { metadata.illust150URL = metadata.illust128URL.replace("/128x128/", "/150x150/"); metadata.illust128URL = metadata.illust150URL.replace("/150x150/", "/128x128/"); metadata.illust240URL = metadata.illust128URL.replace("/128x128/", "/240x480/"); metadata.illust480URL = metadata.illust128URL.replace("/128x128/", "/480x960/"); metadata.illust480URL = metadata.illust128URL.replace("/128x128/", "/600x600/"); metadata.illust1200URL = metadata.illust128URL.replace("/128x128/", "/1200x1200/"); } else { metadata.illust240URL = metadata.illust600URL.replace(/([^\/]+)\/(\d+)_m.+/, "$1/mobile/$2_240mw.jpg"); metadata.illust480URL = metadata.illust600URL; metadata.illust1200URL = metadata.illust600URL; if (metadata.illustType == 2) metadata.illust240URL = metadata.illust240URL.replace("_240mw", "_240mw_p0"); if (metadata.pageCount > 1 && metadata.illustID >= 11319936) metadata.illust1200URL = metadata.illustURL.replace("_big", "") metadata.illust150URL = metadata.illust240URL; } } metadata.bookmarkCount = IllustrationLinker.getBookmarkCount(id); if (IsIllustrationPage) console.log("HTML", metadata); //if (IsIllustrationPage) //{ // var arr = ["illust128URL", "illust150URL", "illust240URL", "illust480URL", "illust600URL", "illust1200URL"]; // var wd = document.querySelector(".works_display"); // wd.innerHTML = ""; // for (var i = 0; i < arr.length; i++) // { // var img = document.createElement("img"); // img.src = metadata[arr[i]]; // img.title = arr[i] + ": " + metadata[arr[i]]; // wd.appendChild(img); // wd.appendChild(document.createElement("br")); // } //} return metadata; }, /* ------------------------------------------------------------------------------------------- Gets bookmark count from thumbnail if one exists -------------------------------------------------------------------------------------------*/ getBookmarkCount: function (id) { var thumbnail = document.getElementById("i" + id); if (thumbnail) { var bm = thumbnail.querySelector(".bookmark-count"); if (bm) return parseInt(bm.textContent); if (PAGETYPE == 1 || PAGETYPE == 3 || PAGETYPE == 7 || PAGETYPE == 8) return "?"; //Pages that do not contain bookmark information else return 0; } return "?"; }, /* ------------------------------------------------------------------------------------------- Creates main links that are used by Downloaders. These links can be hidden. It also creates calls the creation of the hotbox. -------------------------------------------------------------------------------------------*/ createLinksBox: function (id) { var thumbnail = document.getElementById("i" + id), metadata = IllustrationLinker.getIllust(id); var linksBox = document.createElement("div"); linksBox.className = "pppLinksBox"; var directLinks = document.createElement("span"); if (IsIllustrationPage) { TSL.addStyle("LINXBOX", ".pppLinksBox {margin: 0 50px; text-align: center;}"); var el = document.querySelector(".works_display"); el.parentNode.insertBefore(linksBox, el.nextSibling); } else { PaginatorHQ.tidyThumbnail(id); thumbnail.insertBefore(linksBox, thumbnail.querySelector("a").nextSibling); } linksBox.appendChild(directLinks); directLinks.className = "pppDirectLinks"; if (PAGETYPE > 1) { var evaluator = new XPathEvaluator(); //document.evaluate var sortButton = evaluator.evaluate("//a[@name='Sort']", SideBar.iDoc.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (sortButton.firstElementChild.style.borderColor == "rgb(0, 255, 0)") sortButton.firstElementChild.style.borderColor = "#F00"; } if (metadata.pageCount <= 1) //Single Illustration { var directLink = document.createElement("a"); directLink.textContent = "[" + ((metadata.illustType == 3) ? "?" : "❀") + "]"; //S❂❀ directLink.href = metadata.illustURL; if (!Settings.display.illustLink) directLinks.style.display = "none"; directLinks.appendChild(directLink); } else //Manga Illustration { directLinks.setAttribute("style", "font-size:xx-small"); var mangaLinks = '[ '; for (var i = 0, href; i < metadata.pageCount; i++) { href = metadata.illustURL.replace(/_p\d+/, "_p" + i); if (IsIllustrationPage) mangaLinks += '<a title ="Page #' + i + '" href="' + href + '">' + i + '</a> | '; else mangaLinks += '<a title ="Page #' + i + '" href="' + href + '">' + (((i + 1) % 5 == 0) ? "◆" : "◇") + '</a>' } mangaLinks = mangaLinks.replace(/ | $/, "") + "]"; if (IsIllustrationPage) { directLinks.innerHTML = mangaLinks; directLinks.setAttribute("style", "font-size:small"); } else directLinks.innerHTML = mangaLinks; if (!Settings.display.mangaLinks) directLinks.style.display = "none"; } if (IsIllustrationPage) { TSL.addStyle("RemoveAds", ".ads_anchor {display:none;}"); TSL.addStyle("AddBorder", ".work-tags, .works_display {margin-bottom: 0px;}"); //TSL.addStyle("VLB", "#VisibleLinkBox {background-color: red; height: 40px; margin: 5px 20px 10px 20px;}"); TSL.addStyle("VLB", "#VisibleLinkBox {margin: 1px 20px 10px 20px; background-color: gray;}"); var linkbox = document.createElement("section"); linkbox.id = "VisibleLinkBox"; linkbox.className = "work-tags"; var metascore = [metadata.bookmarkCount, metadata.viewCount, metadata.ratings, metadata.totalRatings, metadata.responseCount]; var metaname = ["★", "Views", "Rating", "Total", "Response"]; linkbox.innerHTML = "<a class='bookmark-count' style='background-color:#FFFD00;' href='http://" + Settings.IQDBType + ".IQDB.org/?url=" + ((metadata.illustType == 3) ? metadata.illust480URL : metadata.illust150URL) + "&NULL'>IQDB<a>" + '<a href="/response.php?type=illust&id=' + metadata.illustID + '" class="image-response-count ui-tooltip" data-tooltip="Received ' + metascore[4] + ' image responses"><i class="_icon sprites-image-response-badge"></i>' + metascore[4] + '</a>' + '<a href="/bookmark_detail.php?illust_id=' + metadata.illustID + '" class="bookmark-count ui-tooltip" data-tooltip="Received ' + metascore[0] + ' bookmarks"><i class="_icon sprites-bookmark-badge"></i>' + metascore[0] + '</a>'; if (metadata.pageCount > 1) linkbox.innerHTML = "<a class='bookmark-count' style='background-color:#81FF00;'>P" + metadata.pageCount + "</a>" + linkbox.innerHTML; for (var i = 1; i < 4; i++) linkbox.innerHTML += "<span class='bookmark-count' style='background-color:#FDFDFB;'>" + metaname[i] + " " + metascore[i] + "</span>"; var el = document.querySelector(".work-tags"); el.parentNode.insertBefore(linkbox, el.nextElementSibling); if (metadata.illustType == 2 && metadata.pageCount > 1) //Manga { var previewThumbs = document.createElement("section"); previewThumbs.setAttribute("style", "text-align: center;"); linksBox.parentElement.insertBefore(previewThumbs, linksBox.nextElementSibling); var ShowThumbs = document.createElement("button"); ShowThumbs.textContent = "Show Thumbnails"; ShowThumbs.setAttribute("style", "display: inline-block; width: 300px; height: margin: 10px 0 20px 0; padding: 5px;"); previewThumbs.appendChild(ShowThumbs); ShowThumbs.onclick = function () { if (this.shown) { ShowThumbs.textContent = "Show Thumbnails"; document.getElementById("MangaThumbnails").style.display = "none"; this.shown = false; } else { ShowThumbs.textContent = "Hide Thumbnails"; this.shown = true; if (document.getElementById("MangaThumbnails")) document.getElementById("MangaThumbnails").style.display = "block"; else { TSL.addStyle("MangaT", "#MangaThumbnails img {max-width: 150px; min-width: 150px; margin: 2px; box-shadow: 5px 5px 3px #888888;}"); var thumbs = document.createElement("section"); thumbs.id = "MangaThumbnails"; thumbs.setAttribute("style", "margin: 10px 30px;"); linksBox.parentElement.insertBefore(thumbs, previewThumbs.nextElementSibling); for (var i = 0; i < metadata.pageCount; i++) { el = document.createElement("a"); el.href = metadata.illustURL.replace(/\/(\d+|\d+_big)_p\d+/i, "/$1_p" + i); el.innerHTML = "<img src='" + metadata.illust240URL.replace(/_p\d+/i, "_p" + i) + "'/>"; //el.innerHTML = "<img src='" + metadata.illust150URL.replace(/_p\d+/i, "_p" + i) + "'/>"; thumbs.appendChild(el); } } } } } } else { var IQDBLink = document.createElement("a"); IQDBLink.textContent = "IQDB"; IQDBLink.className = "IQDBLink"; linksBox.appendChild(IQDBLink); PaginatorHQ.updateIQDBLink(linksBox); PreviewHQ.createHotBox(id); } if (PAGETYPE > 1) PaginatorHQ.filterThumbnail(thumbnail); }, /* ------------------------------------------------------------------------------------------- Gets illustration information using Illustration page -------------------------------------------------------------------------------------------*/ getDataHTML: function (id) { var extensionKnown = false, illust = IllustrationLinker.getIllust(id), START = new Date(); if (IsIllustrationPage) ////Illustration Page that excludes Novels { IllustrationLinker.setMetadata(id, document); finalise(); return; } if (Settings.requestMethod & 4) { GM_xmlhttpRequest({ url: "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + id, method: "GET", timeout: 15000, //headers: { "User-agent": navigator.userAgent, "Accept": "text/html", Referer: "http://www.pixiv.net" }, headers: { "User-agent": navigator.userAgent, "Accept": "text/html" }, onload: function (response) { if (response.status == 200) //Response 200 implies that link exist and then most likely a Manga (or an Error XD) { var END = new Date(); //console.info(END - START); var doc = new DOMParser().parseFromString(response.responseText, "text/html"); IllustrationLinker.setMetadata(id, doc); } finalise(); } }); } else { var oReq = new XMLHttpRequest(); oReq.open("GET", "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + id, true); oReq.responseType = "text"; oReq.timeout = 15000; oReq.onload = function (e) { if (oReq.status == 200) //Response 200 implies that link exist and then most likely a Manga (or an Error XD) { var END = new Date(); //console.info(END - START); var doc = new DOMParser().parseFromString(oReq.response, "text/html"); IllustrationLinker.setMetadata(id, doc); } finalise(); }; oReq.send(); } function finalise() { if (illust.bookmarkCount == "?" && (IllustrationLinker.requestBookmarkCount == 2 || (IllustrationLinker.requestBookmarkCount == 1 && !IsIllustrationPage))) { getBookmarkCount(); } else if (!extensionKnown && illust.pageCount > 1) { extensionKnown = true; getMangaExtension(); } else { IllustrationLinker.createLinksBox(id); if (IllustrationLinker.simultaneousCalls > 0) IllustrationLinker.simultaneousCalls--; } } function getBookmarkCount() { if ((IsIllustrationPage && (Settings.requestMethod & 8)) || (!IsIllustrationPage && (Settings.requestMethod & 4))) { GM_xmlhttpRequest({ url: "http://www.pixiv.net/bookmark_detail.php?illust_id=" + id, method: "GET", timeout: 15000, //headers: { "User-agent": navigator.userAgent, "Accept": "text/html", Referer: "http://www.pixiv.net" }, headers: { "User-agent": navigator.userAgent, "Accept": "text/html" }, onload: function (response) { if (response.status == 200) //Response 200 implies that link exist and then most likely a Manga (or an Error XD) { var doc = new DOMParser().parseFromString(response.responseText, "text/html"); var bm = doc.querySelector(".bookmark-count"); if (bm) illust.bookmarkCount = parseInt(bm.textContent); else illust.bookmarkCount = 0; } finalise(); } }); } else { var oReq = new XMLHttpRequest(); oReq.open("GET", "http://www.pixiv.net/bookmark_detail.php?illust_id=" + id, true); oReq.responseType = "text"; oReq.timeout = 15000; oReq.onload = function (e) { if (oReq.status == 200) //Response 200 implies that link exist and then most likely a Manga (or an Error XD) { var doc = new DOMParser().parseFromString(oReq.response, "text/html"); var bm = doc.querySelector(".bookmark-count"); if (bm) illust.bookmarkCount = parseInt(bm.textContent); else illust.bookmarkCount = 0; } finalise(); }; oReq.send(); } } /* There is no way of finding out the extension of manga files in the new naming method using the illustration page. We need to make another http request. -------------------------------------------------------------------------------------------*/ function getMangaExtension() { if (illust.illust128URL.indexOf("/img-master/") > 0) //New naming format { if ((IsIllustrationPage && (Settings.requestMethod & 8)) || (!IsIllustrationPage && (Settings.requestMethod & 4))) { GM_xmlhttpRequest({ url: "http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=" + id + "&page=0", method: "GET", timeout: 15000, //headers: { "User-agent": navigator.userAgent, "Accept": "text/html", Referer: "http://www.pixiv.net" }, headers: { "User-agent": navigator.userAgent, "Accept": "text/html" }, onload: function (response) { if (response.status == 200) { var doc = new DOMParser().parseFromString(response.responseText, "text/html"); try { illust.illustURL = doc.getElementsByTagName("img")[0].src; } catch (err) { } } finalise(); } }); } else { var oReq = new XMLHttpRequest(); oReq.open("GET", "http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=" + id + "&page=0", true); oReq.responseType = "text"; oReq.timeout = 15000; oReq.onload = function (e) { if (oReq.status == 200) { var doc = new DOMParser().parseFromString(oReq.response, "text/html"); try { illust.illustURL = doc.getElementsByTagName("img")[0].src; } catch (err) { } } finalise(); }; oReq.send(); } } else finalise(); //Old naming format } } }; /* =================================================================================================================================== Handles getting the next page ===================================================================================================================================*/ var Pager = { nextPageURL: null, intervalID: null, //Time to wait out before attempting to get the next page timeOutLength: 2000, pause: false, //Event that fires off passing the loaded document onPageLoad: null, //If true it scraps any currently loading pages ageRatingChanged: false, requestingPage: false, scrollOffset: null, /* ------------------------------------------------------------------------------ Initialises the pager. - pageLoadEventHandler must be set as it gets called when a new page is loaded. It takes (document,nextURL) parameters. - scrollOffset function that return the bottom position of the main container. Used to calculate when to load next page. ------------------------------------------------------------------------------*/ initalise: function (pageLoadEventHandler, funcScrollOffset) { this.scrollOffset = funcScrollOffset; this.onPageLoad = pageLoadEventHandler; this.getNextPageURL(document.body); if (this.intervalID) clearInterval(this.intervalID); if (this.nextPageURL) this.intervalID = setInterval(this.checkScrollPosition, 500); return (this.nextPageURL != null); }, checkScrollPosition: function () { if (Pager.ageRatingChanged || !Settings.fetch.nextPage) return; if ((Pager.scrollOffset() - window.scrollY - window.innerHeight) < Settings.pagingOffset) { Pager.getNextPage(); } }, /* ------------------------------------------------------------------------------ Gets the next page url from an element or full document. Returns null if there isn't a next page other the url. ------------------------------------------------------------------------------*/ getNextPageURL: function (xml) { this.nextPageURL = null; var evaluator = new XPathEvaluator(); //document.evaluate var btnNext = evaluator.evaluate(".//a[@rel='next' and @class='_button']", xml, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (btnNext) this.nextPageURL = btnNext.href; //else btnNext = evaluator.evaluate(".//a[@rel='next' and @class='button']", xml, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; //if (btnNext) this.nextPageURL = btnNext.href; return this.nextPageURL; }, NextPageReceived: function (doc, pageNumber) { DisplayMessage("Page [" + pageNumber + "] received", 1500); if (Pager.onPageLoad) Pager.onPageLoad(doc, Pager.nextPageURL); Pager.getNextPageURL(doc.body); if (Pager.nextPageURL) { setTimeout( function () { Pager.intervalID = setInterval(Pager.checkScrollPosition, 500); } , Pager.timeOutLength); } }, /* ------------------------------------------------------------------------------ Gets the next page asynchronously. ------------------------------------------------------------------------------*/ getNextPage: function () { Pager.requestingPage = true; clearInterval(Pager.intervalID); var pageNumber = PaginatorHQ.getPageNumber(this.nextPageURL); var msg = DisplayMessage("Requesting page [" + pageNumber + "] ..."); if (Settings.requestMethod & 2) { GM_xmlhttpRequest({ url: this.nextPageURL, method: "GET", headers: { "User-agent": navigator.userAgent, "Accept": "document" }, //"Accept": "text/html" timeout: 20000, onload: function (response) { Pager.requestingPage = false; //Change age rate, so no need to process return result as new content will be loaded if (Pager.ageRatingChanged) return; if (response.status == 200) { RemoveMessage(msg); var doc = document.implementation.createHTMLDocument("P++"); doc.documentElement.innerHTML = response.responseText; //Not supported by Opera //var doc = new DOMParser().parseFromString(response.responseText, "text/html") Pager.NextPageReceived(doc, pageNumber); } else Pager.pageErrorTimeout("ERROR: Page [" + pageNumber + "] failed request", response); }, ontimeout: function (response) { RemoveMessage(msg); Pager.pageErrorTimeout("ERROR: Timeout on Page [" + pageNumber + "].", response) }, onerror: function (response) { RemoveMessage(msg); Pager.pageErrorTimeout("ERROR: Page [" + pageNumber + "] failed request", response) } }); } else { var oReq = new XMLHttpRequest(); oReq.open("GET", this.nextPageURL, true); oReq.responseType = "document"; oReq.timeout = 20000; oReq.onload = function (e) { { Pager.requestingPage = false; //Change age rate, so no need to process return result as new content will be loaded if (Pager.ageRatingChanged) return; if (oReq.status == 200) { RemoveMessage(msg); Pager.NextPageReceived(oReq.response, pageNumber); } else Pager.pageErrorTimeout("ERROR: Page [" + pageNumber + "] failed request", oReq); } }; oReq.ontimeout = function (response) { RemoveMessage(msg); Pager.pageErrorTimeout("ERROR: Timeout on Page [" + pageNumber + "].", response) }; oReq.onerror = function (response) { RemoveMessage(msg); Pager.pageErrorTimeout("ERROR: Page [" + pageNumber + "] failed request", response) }; oReq.send(); } }, pageErrorTimeout: function (msg, response) { console.error("Failed to get next page: (" + response.status + ") : " + response.statusText); DisplayMessage(msg, 5000); setTimeout( function () { Pager.intervalID = setInterval(Pager.checkScrollPosition, 500); } , Pager.timeOutLength); Pager.requestingPage = false; } } /* =================================================================================================================================== PaginatorHQ handles all functions to do with formatting the layout of the results ===================================================================================================================================*/ var PaginatorHQ = { pageTable: null, status: 0, styled: false, /* ------------------------------------------------------------------------------------------- Prepares current page for pagination -------------------------------------------------------------------------------------------*/ intialise: function () { PaginatorHQ.setStyles(); PaginatorHQ.removeUnwantedElements(document); var paged = (Pager.getNextPageURL(document) != null); var pageNumber = (paged) ? PaginatorHQ.getPageNumber(document.URL) : 0; console.log("Paged Content: ", paged); if (!paged) //Either has no pages or it is the last page { var containers = PaginatorHQ.getContainers(document); if (PAGETYPE > 1 && containers) containers[0].setAttribute("name", "pageContainer"); //Done for age rating issues. IllustrationLinker.getContainerLinks(containers, pageNumber); } else { var paginator = document.getElementsByClassName("column-order-menu"); while (paginator.length > 1) paginator[1].parentNode.removeChild(paginator[1]); paginator = paginator[0]; paginator.className += " paginator"; var pageContainer = PaginatorHQ.getContainers(document)[0]; if (pageContainer.className == "display_works linkStyleWorks") //display_works linkStyleWorks breaks sets UL style { //You need to add this otherwise "DIV._unit action-unit" element does not expand and will end up with transparent background. var divider = document.createElement("div"); divider.className = "clear"; pageContainer.appendChild(divider); pageContainer = pageContainer.firstElementChild; } else { pageContainer.parentElement.insertBefore(paginator, pageContainer); //pageContainer.insertBefore(paginator, pageContainer.firstElementChild); } pageContainer.style.marginBottom = "0"; pageContainer.style.marginTop = "0"; pageContainer.setAttribute("name", "pageContainer"); pageContainer.setAttribute("page", pageNumber); PaginatorHQ.pageTable = pageContainer.parentElement; IllustrationLinker.getContainerLinks([pageContainer], pageNumber); pageContainer.className += " pppPage" + (pageNumber % 3); Pager.initalise(PaginatorHQ.addNewPage, PaginatorHQ.getMainTableBottom); } PaginatorHQ.updateVisibilityOfAllElements(document); }, /* ------------------------------------------------------------------------------------------- Gets bottom of page table, used to calculate when the next page is going to be loaded -------------------------------------------------------------------------------------------*/ getMainTableBottom: function () { var pos = GetAbsolutePosition(PaginatorHQ.pageTable); return pos.top + PaginatorHQ.pageTable.offsetHeight; }, addStyle: function (id, textContent) { var style = document.createElement("style"); style.type = "text/css"; style.innerHTML = textContent; if (id) style.id = id; document.head.appendChild(style); }, setStyles: function () { if (PaginatorHQ.styled) return; PaginatorHQ.styled = true; PaginatorHQ.addStyle(null, '.IQDBLink{font-family:"Times New Roman";background-color: #000000;border-radius: 3px;padding: 2px 3px 1px 3px;color: #66CCFF !important;font-size: x-small;text-decoration: none;}'); PaginatorHQ.addStyle(null, "#pppMsgBox{position: fixed;z-index: 500;bottom: 30px;left: 10px;padding: 0 20px 0 10px;color: #FF0;background-color: #0000D5;padding-left: 10px;border-style: solid;border-color: #FFF;border: solid;}.pppHotBoxTi, .pppHotBoxTm{position: absolute;top: 0px;left: 0px;z-index: 20;border: 2px solid;}.pppHotBoxTi{background-color: rgba(255,255,0,0.6);border-color: red;width: 16px;height: 16px;}.pppHotBoxTm{background-color: rgba(0,255,255,0.2);border-color: red;width: 30px;height: 30px;}.pppHotBoxI{background-color: rgba(255,255,0,0.6);border: 2px solid rgba(255,0,0,0.6);width: 200px;height: 12px;display: inline-block;}.pppHotBoxTi:visited, .pppHotBoxTm:visited, .pppHotBoxI:visited{border-color: purple;/*background-color: rgba(128,0,128,0.4);*/}.pppPreviewWindow{position: absolute;background-color: #000;}"); PaginatorHQ.addStyle("pppPaged", ".pppPage1{background-color: yellow;}.pppPage2{background-color: #63FF00;}.pppPage0{background-color: #FF00FC;}.pppThumb1{background-color: #FCFCA8 !important;}.pppThumb2{background-color: #D9FFD9 !important;}.pppThumb0{background-color: #EAD3EF !important;}"); PaginatorHQ.addStyle("pppPaginator", ".paginator{background-color: white; margin:0; border: ridge;}"); PaginatorHQ.addStyle("pppVisitedIllusPage", ".image-item > a.work:visited > img { border: 22px solid red; !important}"); //Used to fix broken artist and bookmarks pages PaginatorHQ.addStyle(null, ".pppPage1 > li, .pppPage2 > li, .pppPage0 > li { clear: none; float: none !important; display:inline-block;}"); PaginatorHQ.addStyle(null, ".paginator li {clear:none;float:none;display:inline:block; width:auto;}"); PaginatorHQ.addStyle("linkColours", ".pppThumb0 a:link, .pppThumb1 a:link, .pppThumb2 a:link{color:#0507FF;} .pppThumb0 a:visited, .pppThumb1 a:visited, .pppThumb2 a:visited{color:#BCBBB9;}") }, getPageNumber: function (url) { var pageNumber = url.replace(/.+(&|\?)p=(\d+)$/gi, "$2"); if (isNaN(pageNumber)) pageNumber = 1; return parseInt(pageNumber); }, /* ------------------------------------------------------------------------------------------- Adds new content. -------------------------------------------------------------------------------------------*/ addNewPage: function (doc, url) { PaginatorHQ.removeUnwantedElements(doc); var pageNumber = PaginatorHQ.getPageNumber(url); //PageContainer var pageContainer = PaginatorHQ.getContainers(doc)[0]; pageContainer.setAttribute("name", "pageContainer"); pageContainer.setAttribute("page", pageNumber); pageContainer.style.marginBottom = "0"; pageContainer.style.marginTop = "0"; //Navigation Bar var paginator = doc.getElementsByClassName("column-order-menu")[0]; paginator.className += " paginator pppPagedChild"; for (var i = paginator.children.length - 1; child = paginator.children[i], i >= 0; i--) if (child.className != "pager-container") paginator.removeChild(child); paginator.getElementsByTagName("ul")[0].className = "clear " + paginator.getElementsByTagName("ul")[0].className; pageContainer.className += " pppPagedChild pppPage" + (pageNumber % 3); //TODO: Readjust painator bars //pageContainer.insertBefore(paginator, pageContainer.firstElementChild); PaginatorHQ.pageTable.appendChild(paginator); PaginatorHQ.pageTable.appendChild(pageContainer); //IllustrationLinker.getContainerLinks should always after page is added. IllustrationLinker.getContainerLinks([pageContainer], pageNumber); PaginatorHQ.updateVisibilityOfAllElements(pageContainer); if (Settings.filterSwitchFlag > 0) { pageContainer.style.display = "none"; paginator.style.display = "none"; PaginatorHQ.filterContainer(pageContainer); } }, /* ----------------------------------------------------------------------------------------- Returns containers that contain thumbnails. If doc is left out it uses current document. This does not return dynamic containers, i.e. containers like recommended illustrations whose content are auto-updated by Pixiv. -----------------------------------------------------------------------------------------*/ getContainers: function (doc) { //console.info("Getting Containers"); if (!doc) doc = document; for (var i = 0; i < containerClasses.Paged.length; i++) { var nodes = doc.getElementsByClassName(containerClasses.Paged[i]); if (nodes.length > 0) return nodes; } for (var i = 0; i < containerClasses.UnPaged.length; i++) { var nodes = doc.getElementsByClassName(containerClasses.UnPaged[i]); if (nodes.length > 0) return nodes; } //console.warn("No thumbnail containers"); return null; }, filterThumbnail: function (thumbnail) { if (Settings.filterSwitchFlag == 0) return; var metadata = IllustrationLinker.getIllust(thumbnail.getAttribute("illustration-id")); var filterOut = false; if (metadata.pageCount == null) return; //Filter using age rating filterOut = ((Settings.filterSwitchFlag & 16) == 16 && metadata.R18 == 0) || ((Settings.filterSwitchFlag & 32) == 32 && metadata.R18 == 1) || ((Settings.filterSwitchFlag & 64) == 64 && metadata.R18 == 2); if (!filterOut && (Settings.filterSwitchFlag & 2) == 2) { var flag = Settings.filter.flag; var values = Settings.filters[Settings.filter.set]; try { if ((flag & 2) == 2 && metadata.pageCount == 0) filterOut = true; //Filtering out Illustrations else if ((flag & 4) == 4 && metadata.pageCount > 0) filterOut = true; //Filtering out Manga else if ((flag & 8) == 8 && metadata.bookmarkCount < values[0]) filterOut = true; //Bookmarks else if ((flag & 16) == 16 && metadata.viewCount < values[1]) filterOut = true; //Views else if ((flag & 32) == 32 && metadata.ratings < values[2]) filterOut = true; //Ratings else if ((flag & 64) == 64 && metadata.totalRatings < values[3]) filterOut = true; //Total } catch (e) { }; } if (!filterOut) { var found; var tags = metadata.tags; while (tags.indexOf(" ") >= 0) tags = tags.replace(" ", " "); tags = tags.split(" "); if ((Settings.filterSwitchFlag & 4) == 4) { var tagsF = Settings.filter.tagsInclude; while (tagsF.indexOf(" ") >= 0) tagsF = tagsF.replace(" ", " "); tagsF = tagsF.split(" "); tagsF = Settings.filter.tagsInclude.split(" "); found = true; for (var i = 0; i < tagsF.length; i++) { found = false for (var j = 0; j < tags.length; j++) { if (tagsF[i].trim().toLowerCase() == tags[j].trim().toLowerCase()) { found = true; break; } } if (!found) break; } filterOut = !found; } if (!filterOut && (Settings.filterSwitchFlag & 8) == 8) { var tagsF = Settings.filter.tagsExclude; while (tagsF.indexOf(" ") >= 0) tagsF = tagsF.replace(" ", " "); tagsF = tagsF.split(" "); found = false; for (var i = 0; i < tagsF.length; i++) { for (var j = 0; j < tags.length; j++) { if (tagsF[i].trim().toLowerCase() == tags[j].trim().toLowerCase()) { found = true; break; } } if (found) break; } filterOut = found; } } //Illustration metadata has yet to be retrieved if (filterOut) { PaginatorHQ.filterThumbnailLinks(thumbnail, true); thumbnail.style.display = "none"; } else { PaginatorHQ.filterThumbnailLinks(thumbnail, false); thumbnail.style.display = null; } }, filterThumbnailLinks: function (thumbnail, remove) { var links = thumbnail.querySelectorAll(".pppHotBoxTi, .pppDirectLinks > a"); //var links = thumbnail.querySelectorAll("a"); if (!links) return; for (var i = 0; i < links.length; i++) { if (remove) { if (!links[i].getAttribute("hrefOriginal")) links[i].setAttribute("hrefOriginal", links[i].href); links[i].removeAttribute("href"); } else if (!links[i].href && links[i].getAttribute("hrefOriginal")) { links[i].href = links[i].getAttribute("hrefOriginal"); } } }, filterContainer: function (container) { if (Settings.filterSwitchFlag == 0) return; var mainContainer = document.getElementsByName("pageContainer")[0]; var evaluator = new XPathEvaluator(); var nodesSnapshot = evaluator.evaluate(".//li[@name='pppThumb']", container, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var j = 0 ; thumb = nodesSnapshot.snapshotItem(j), j < nodesSnapshot.snapshotLength; j++) { PaginatorHQ.filterThumbnail(thumb); if (thumb.parentElement != mainContainer) mainContainer.appendChild(thumb); } return nodesSnapshot.snapshotLength; }, /* ------------------------------------------------------------------------------------------- Goes through all thumbnail containers and filters the result accordingly -------------------------------------------------------------------------------------------*/ filterResult: function () { if (PaginatorHQ.status == 0) { PaginatorHQ.status = 1; setTimeout(PaginatorHQ.filterResult, 0); return true; } if (PaginatorHQ.status == 2) { return false; } PaginatorHQ.status = 2; var msg = DisplayMessage("Filtering content (" + Settings.filterSwitchFlag + ")"); var filtering = (Settings.filterSwitchFlag > 0); var containers = document.getElementsByName("pageContainer"); var paginators = document.getElementsByClassName(" paginator"); var mainContainer = containers[0]; var mainContainerPage = mainContainer.getAttribute("page"); //Parse through page containers and paginators and set visibility according to filter for (var i = 1; container = containers[i], i < containers.length; i++) { containers[i].style.display = (filtering) ? "none" : null; paginators[i].style.display = (filtering) ? "none" : null; } if (filtering) //Displaying all items { mainContainer.style.backgroundColor = "transparent"; for (var i = 0; i < containers.length; i++) { msg.textContent = ("Filtering Page " + (i + 2) + "/" + containers.length); PaginatorHQ.filterContainer(containers[i]); } } else //Filtering out { mainContainer.style.backgroundColor = null; var evaluator = new XPathEvaluator(); var nodesSnapshot = evaluator.evaluate(".//li[@name='pppThumb']", mainContainer, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0 ; thumb = nodesSnapshot.snapshotItem(i), i < nodesSnapshot.snapshotLength; i++) { //msg.textContent = ("Filtering thumbnail " + (i + 1) + "/" + nodesSnapshot.snapshotLength); thumbPage = thumb.getAttribute("page"); if (thumbPage > mainContainerPage) containers[thumbPage - mainContainerPage].appendChild(thumb); PaginatorHQ.filterThumbnailLinks(thumb, false); thumb.style.display = null; } } if (filtering) { DisplayMessage("Filtering completed", 2000); // (totalCount - PaginatorHQ.filteredCount) + " (" + totalCount + ")"; } else { DisplayMessage("Filter disabled", 2000); } RemoveMessage(msg); PaginatorHQ.status = 0; PaginatorHQ.displayResultInfo(); PreviewHQ.adjustAllHotboxPositions(); }, getResultCount: function (doc) { if (!doc) doc = document; var evaluator = new XPathEvaluator(); //document.evaluate //var result = evaluator.evaluate("//div[@class='column-label' or '_unit manage-unit']/span[@class='count-badge']", doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; var result = evaluator.evaluate("//div[@class='column-label' or @class='_unit manage-unit']/span[@class='count-badge']", doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (result) return parseInt(result.textContent); else return -1; }, /* ------------------------------------------------------------------------------------------- Displays the amount of thumbnails listed -------------------------------------------------------------------------------------------*/ displayResultInfo: function () { if (SideBar.iDoc == null) { setTimeout(function () { PaginatorHQ.displayResultInfo(); }, 250); //Sidebar has yet to load return; } var thumbs = document.getElementsByName("pppThumb"); var it = SideBar.iDoc.getElementById("InfoTable"); var resultCount = PaginatorHQ.getResultCount(); //Number of items returned by search var linked = (thumbs.length - IllustrationLinker.processList.length - IllustrationLinker.simultaneousCalls); if (resultCount < 0) //We do not know how many pages can be displayed. Might not be paged { it.rows[0].style.display = "none"; it.rows[1].style.display = null; it.rows[1].cells[1].textContent = linked + " / " + thumbs.length; //Number of images if (PAGETYPE > 2) //It is paged. Go figure. { var startPage = PaginatorHQ.getPageNumber(document.URL); var pagesLoaded = Math.ceil(thumbs.length / 20); it.rows[0].style.display = null; it.rows[0].cells[1].textContent = pagesLoaded + " (" + startPage + "-" + (startPage + pagesLoaded - 1) + ")"; } } else if (thumbs.length == 0 || resultCount == 0) { it.rows[0].cells[1].textContent = 0; it.rows[1].cells[1].textContent = 0; } else { var visibleCount = thumbs.length; if (Settings.filterSwitchFlag > 0) { visibleCount = 0; for (var i = 0; i < thumbs.length; i++) { if (!thumbs[i].style.display) visibleCount++; } } var pagesLoaded = Math.ceil(thumbs.length / 20); var pageS = PaginatorHQ.getPageNumber(document.URL); var pageE = pageS + pagesLoaded - 1; var pageCount = Math.ceil(resultCount / 20); it.rows[0].cells[1].textContent = pagesLoaded + " (" + pageS + "-" + pageE + " | " + pageCount + ")"; var leftCount = resultCount - ((pageS - 1) * 20) if (Settings.filterSwitchFlag > 0) it.rows[1].cells[1].innerHTML = visibleCount + " / " + linked + " | " + thumbs.length + "<br /> (" + leftCount + " | " + resultCount + ")"; else it.rows[1].cells[1].textContent = linked + " / " + thumbs.length + " (" + leftCount + " | " + resultCount + ")"; } //Adjust frame size to fit info text if (SideBar.iDoc.body.clientHeight < SideBar.iDoc.body.scrollHeight) SideBar.adjustFrameSize(); }, /* ------------------------------------------------------------------------------------------- Sorts the thumbnails according to filter type -------------------------------------------------------------------------------------------*/ sortByScore: function (sort) { if (PaginatorHQ.status == 0) { PaginatorHQ.status = 1; setTimeout(PaginatorHQ.sortByScore, 0, sort); return true; } if (PaginatorHQ.status == 2) { return false; } PaginatorHQ.status = 2; var msg = DisplayMessage("Sorting content"); var containers = document.getElementsByName("pageContainer"); var sortType = Settings.sortType; //A very bad way of doing sort but it seems efficient. Problem is having items spread over containers var evaluator = new XPathEvaluator(); var nodesSnapshot = evaluator.evaluate(".//li[@name='pppThumb']", PaginatorHQ.pageTable, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var arr = new Array(); for (var i = 0; thumb = nodesSnapshot.snapshotItem(i), i < nodesSnapshot.snapshotLength; i++) { var value = (sort) ? parseInt(getMetaScore(thumb)[sortType]) : parseInt(thumb.getAttribute("position")); arr.push({ "index": i, "value": value }); } //Stores thumbnail metascore and position in an array and then sorts the array and then proceeds to //to apply sorted result to the thumbnails for (var i = 0 ; i < arr.length; i++) { for (var j = i + 1 ; j < arr.length; j++) { if ((sort && arr[i].value < arr[j].value) || (!sort && arr[i].value > arr[j].value)) { var temp = arr[i].value; arr[i].value = arr[j].value; arr[j].value = temp; temp = arr[i].index; arr[i].index = arr[j].index; arr[j].index = temp; } } } //Apply sorted array to thumbnails for (var i = 0 ; i < arr.length; i++) { if (Settings.filterSwitchFlag > 0) container = containers[0]; //Items are all in one container as filter is enabled else container = containers[Math.floor(i / 20)]; container.appendChild(nodesSnapshot.snapshotItem(arr[i].index)); } var evaluator = new XPathEvaluator(); //document.evaluate var sortButton = evaluator.evaluate("//a[@name='Sort']", SideBar.iDoc.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (sort) { DisplayMessage("Sorted by " + FilterTypeToString(sortType), 3000); sortButton.firstElementChild.style.borderColor = "#0F0"; } else { DisplayMessage("Removed sorting", 3000); sortButton.firstElementChild.style.borderColor = "#000"; } RemoveMessage(msg); PaginatorHQ.status = 0; PreviewHQ.adjustAllHotboxPositions(); function getMetaScore(thumbnail) { var illust = IllustrationLinker.getIllust(thumbnail.getAttribute("illustration-id")) return [illust.bookmarkCount, illust.viewCount, illust.ratings, illust.totalRatings]; } }, updateIQDBLink: function (linksBox) { var IQDBLink = linksBox.getElementsByClassName("IQDBLink")[0]; if (Settings.display.IQDBLink) { var directLinks = linksBox.getElementsByClassName("pppDirectLinks")[0].getElementsByTagName("a"); IQDBLink.href = "http://" + Settings.IQDBType + ".IQDB.org/?url=" + linksBox.parentElement.getElementsByTagName('IMG')[0].src + "&fullimage=" + directLinks[0].href + "&"; IQDBLink.style.display = null; } else { IQDBLink.removeAttribute("href"); IQDBLink.style.display = "none"; } }, updateAllIQDBLinks: function () { var linksBoxes = document.getElementsByClassName("pppLinksBox"); for (var i = 0; i < linksBoxes.length; i++) PaginatorHQ.updateIQDBLink(linksBoxes[i]); }, /* Set display information for thumbnails ----------------------------------------------------------------------------------------*/ updateVisibilityOfElement: function (thumbnail) { var el = thumbnail.getElementsByClassName("title2")[0]; if (el) el.style.display = (Settings.display.illustTitle) ? null : "none"; else if (PAGETYPE == 1 || PAGETYPE == 3 || PAGETYPE == 4 || PAGETYPE == 5) //Bookmark page { var el = thumbnail.getElementsByTagName("H1")[0]; if (el) el.style.display = (Settings.display.illustTitle) ? null : "none"; } el = thumbnail.getElementsByClassName("user")[0]; if (el) el.style.display = (Settings.display.artistName) ? "block" : "none"; el = thumbnail.getElementsByClassName("count-list")[0]; if (el) el.style.display = (Settings.display.countList) ? null : "none"; var links = thumbnail.getElementsByClassName("pppDirectLinks")[0]; if (links) { if (links.getElementsByTagName("a").length == 1) links.style.display = (Settings.display.illustLink) ? null : "none"; else links.style.display = (Settings.display.mangaLinks) ? null : "none"; } }, /* ---------------------------------------------------------------------------------------- Clean's up the thumbnail and adds any missing information. It gets called by the IllustrationLinker.createLinkBox function when the metadata has been recieved. ----------------------------------------------------------------------------------------*/ tidyThumbnail: function (id) { var thumbnail = document.getElementById("i" + id), link = thumbnail.getElementsByTagName("a")[0], metadata = IllustrationLinker.getIllust(id); //We clean up here. Removing anything we do not desire or wanting to recreate //var el = thumbnail.getElementsByClassName("count-list"); //if (el.length == 1) thumbnail.removeChild(el[0]); //var el = thumbnail.getElementsByClassName("f10"); //if (el.length == 1) thumbnail.removeChild(el[0]); //el = thumbnail.getElementsByClassName("bookmark_artist"); //if (el.length == 1) thumbnail.removeChild(el[0]); TSL.removeNode(thumbnail.querySelector(".count-list")); TSL.removeNode(thumbnail.querySelector(".f10")); TSL.removeNode(thumbnail.querySelector(".bookmark_artist")); TSL.removeNode(thumbnail.querySelector("h1.title")); //Cleans image link by first removing any unwanted text. This is the case in Bookmarks. var brs = thumbnail.getElementsByTagName("br"); while (brs.length > 0) brs[0].parentElement.removeChild(brs[0]); if (link.getElementsByClassName("title2").length == 0) { link.innerHTML = link.innerHTML.replace(/(<img[^>]*>).*/gi, "$1"); link.style.display = "block"; var h1 = document.createElement("h1"); h1.className = "title2"; h1.textContent = metadata.illustTitle; link.appendChild(h1); } if (thumbnail.getElementsByClassName("user").length == 0) { var el = thumbnail.getElementsByClassName("f10"); if (el.length == 1) thumbnail.removeChild(el[0]); el = thumbnail.getElementsByClassName("bookmark_artist"); if (el.length == 1) thumbnail.removeChild(el[0]); var a = document.createElement("a"); a.className = "user"; a.textContent = metadata.userName; a.href = "http://www.pixiv.net/member.php?id=" + metadata.userID; thumbnail.insertBefore(a, link.nextElementSibling); } var ul = document.createElement("ul"); ul.className = "count-list"; ul.innerHTML = '<a href="/bookmark_detail.php?illust_id=' + metadata.illustID + '" class="bookmark-count ui-tooltip" data-tooltip="Received ' + metadata.bookmarkCount + ' bookmarks"><i class="_icon sprites-bookmark-badge"></i>' + metadata.bookmarkCount + '</a>' + '<a href="/response.php?type=illust&id=' + metadata.illustID + '" class="image-response-count ui-tooltip" data-tooltip="Received ' + metadata.responseCount + ' image responses"><i class="_icon sprites-image-response-badge"></i>' + metadata.responseCount + '</a>'; thumbnail.appendChild(ul); //<ul class="count-list"><li><a href="/bookmark_detail.php?illust_id=33473196" class="bookmark-count ui-tooltip" data-tooltip="Received 31 bookmarks"><i class="_icon sprites-bookmark-badge"></i>31</a></li><li><a href="/response.php?type=illust&id=33473196" class="image-response-count ui-tooltip" data-tooltip="Received 1 image responses"><i class="_icon sprites-image-response-badge"></i>1</a></li></ul> PaginatorHQ.updateVisibilityOfElement(thumbnail); }, /* ---------------------------------------------------------------------------------------- Sets the visibility of the elements according to sidebar settings. ----------------------------------------------------------------------------------------*/ updateVisibilityOfAllElements: function (container) { if (!container) container = document; var evaluator = new XPathEvaluator(); var nodesSnapshot = evaluator.evaluate(".//li[@name='pppThumb']", container, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0 ; thumb = nodesSnapshot.snapshotItem(i), i < nodesSnapshot.snapshotLength; i++) { PaginatorHQ.updateVisibilityOfElement(nodesSnapshot.snapshotItem(i)); } PreviewHQ.adjustAllHotboxPositions(document); }, removeUnwantedElements: function (doc) { var classes = ["popular-introduction", "user-ad-container"]; var ids = ["header-banner"]; for (var i = 0; i < classes.length; i++) { var els = doc.getElementsByClassName(classes[i]); while (els.length > 0) els[0].parentNode.removeChild(els[0]); } for (var i = 0; i < ids.length; i++) { var el = doc.getElementById(ids[i]); if (el) el.parentNode.removeChild(el); } } }; /* =================================================================================================================================== Handles the preview dialog window ===================================================================================================================================*/ var PreviewHQ = { interval: null, intervalImageLoadCheck: null, delay: new Object(), /* ------------------------------------------------------------------------------------------- Creates hotbox and it's event handlers -------------------------------------------------------------------------------------------*/ createHotBox: function (id) { var metadata = IllustrationLinker.getIllust(id); var hotbox = document.createElement("a"); hotbox.name = "HotBox"; document.getElementById("i" + id).querySelector("a").appendChild(hotbox); if (metadata.illustType != 2) { hotbox.className = "pppHotBoxTi"; hotbox.href = metadata.illustURL; } else { hotbox.className += "pppHotBoxTm"; hotbox.href = "http://www.pixiv.net/member_illust.php?mode=manga&illust_id=" + metadata.illustID; //DirectLink to Manga Page Viewer } PreviewHQ.adjustHotboxPosition(hotbox); hotbox.onmouseenter = function () { if (PreviewHQ.delay.iID != metadata.illustID) { PreviewHQ.delay.tID = setTimeout(function () { //PreviewHQ.delay = new object(); PreviewHQ.onMouseOverHBShowPreview(hotbox); }, 250); } if (PreviewHQ.interval) { clearTimeout(PreviewHQ.interval); PreviewHQ.interval = null; } } hotbox.onmouseout = PreviewHQ.onMouseOut; }, /* ------------------------------------------------------------------------------------------- Adjust hotbox position. Called often because images sometimes not loaded, or when elements are removed the hotbox position goes out of whack. -------------------------------------------------------------------------------------------*/ adjustHotboxPosition: function (hotbox) { //If image is not loaded you might need to readjust position. //var img = hotbox.parentElement.getElementsByTagName("img")[0]; var img = hotbox.parentElement.getElementsByClassName("_layout-thumbnail")[0]; //hotbox.style.left = (img.offsetLeft + 2) + "px"; //hotbox.style.top = (img.offsetTop + 2) + "px"; hotbox.style.left = img.offsetLeft + "px"; hotbox.style.top = img.offsetTop + "px"; }, /* ------------------------------------------------------------------------------------------- Parses through all hotboxes and adjusts them ------------------------------------------------------------------------------------------*/ adjustAllHotboxPositions: function (container) { clearInterval(PreviewHQ.cid); var hotboxes = document.getElementsByName("HotBox"); var i = 0; PreviewHQ.cid = setInterval(AP, 0); function AP() { if (i > hotboxes.length) clearInterval(PreviewHQ.cid); PreviewHQ.adjustHotboxPosition(hotboxes[i]); i++ } }, /* ------------------------------------------------------------------------------------------- Loads preview window when mouse hovers over hotbox ------------------------------------------------------------------------------------------*/ onMouseOverHBShowPreview: function (hotbox) { //var hotbox = e.target; var pThumb = hotbox.parentElement.parentElement; var imageID = pThumb.getAttribute("illustration-id"); var metadata = IllustrationLinker.getIllust(imageID); var previewWindow = document.getElementById("previewWindow"); if (previewWindow && previewWindow.getAttribute("illustration-id") == imageID) return; else if (previewWindow) document.body.removeChild(previewWindow); if (PreviewHQ.intervalImageLoadCheck) clearInterval(PreviewHQ.intervalImageLoadCheck); PreviewHQ.intervalImageLoadCheck = null; previewWindow = document.createElement("div"); previewWindow.id = "previewWindow"; document.body.appendChild(previewWindow); previewWindow.setAttribute("illustration-id", imageID); previewWindow.onmouseout = PreviewHQ.onMouseOut; previewWindow.onmouseover = function () { if (PreviewHQ.interval) { clearTimeout(PreviewHQ.interval); PreviewHQ.interval = null; } }; var metascore = [metadata.bookmarkCount, metadata.viewCount, metadata.ratings, metadata.totalRatings, metadata.responseCount]; var metaname = ["★", "Views", "Rating", "Total", "Response"]; var data = document.createElement("div"); data.className = "pwMetadata"; var info = document.createElement("div"); var a = document.createElement("a"); a.href = "http://www.pixiv.net/member.php?id=" + metadata.userID //if (metadata.userProfileImageURL.indexOf("http://") == 0) a.innerHTML = "<img src='" + metadata.userProfileImageURL + "' / >"; a.innerHTML = '<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABW0lEQVR42mNkwAECAoNZGBkYVgKZCv8ZGFw2rF/7Hps6RmyCvn7+TIwMjIuAstFggf8MJ/4z/HfZvGnjV6IM8Pb2nQakMtGE9wBN8tm6dctPvAZ4eHh1AAXLsRkM9Mo6IBm+Y8f2P1gNcHN1rwBS7Qz4wYL///8n796z6x+KAc5OzkAnM05jIAr8n7h3394CuAEO9g7AwGJcjCtMcBjScODggUZGWxtbb6C+DUARFuI1ww3JZrSxslEEsuSB/nIH0hVE6lzAyMi4EEi/gTvZwsw8AUjNJ9KAxhOnTjagBKKpsQlJBpw+ewbVACMDQxQDGEHhwshwEeJVoBcZ/icgG3DuwnlUAwx09dBdkHjh8qUFUDkHILUf2QCgHKoBulraGAZcvnZ1AVQOwwCgHKoBWuoaGAZcu3ljAVQOwwCgHKoB6iqqIEW7gJgVZsDNO7cXIMnBDPgPlQNFIwMAOj56D6356V8AAAAASUVORK5CYII=" />'; info.appendChild(a); a = document.createElement("a"); a.style.color = "#00FD00"; a.href = "http://www.pixiv.net/member_illust.php?id=" + metadata.userID; a.textContent = metadata.userName; info.appendChild(a); a = document.createElement("a"); a.style.marginRight = "10px"; a.style.color = "#00FD00"; a.textContent = metadata.illustTitle; if (metadata.pageCount > 1) a.href = "http://www.pixiv.net/member_illust.php?mode=manga&illust_id=" + metadata.illustID; else a.href = "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + metadata.illustID + "#SKIP"; info.innerHTML = a.outerHTML + "(" + info.innerHTML + ")"; data.appendChild(info); var IQDBPrefix = "http://" + Settings.IQDBType + ".IQDB.org/?url="; //Different informational links //http://www.pixiv.net/bookmark_detail.php?illust_id=34470652 //http://www.pixiv.net/response.php?type=illust&id=34470652 //http://www.pixiv.net/member_illust.php?id=68447 var links; links = pThumb.getElementsByClassName("pppDirectLinks")[0].getElementsByTagName("a"); if (metadata.pageCount > 1) data.innerHTML = "<a class='bookmark-count' style='background-color:#81FF00;'>P" + metadata.pageCount + "</a>"; data.innerHTML += "<a class='bookmark-count' style='background-color:#FFFD00;' href='http://" + Settings.IQDBType + ".IQDB.org/?url=" + ((metadata.illustType == 3) ? metadata.illust480URL : metadata.illust150URL) + "&NULL'>IQDB<a>"; data.setAttribute("style", "padding: 2px 5px 2px 5px; text-decoration: none; color: #FFF; font-weight:bold;"); data.innerHTML += '<a href="/response.php?type=illust&id=' + imageID + '" class="image-response-count ui-tooltip" data-tooltip="Received ' + metascore[4] + ' image responses"><i class="_icon sprites-image-response-badge"></i>' + metascore[4] + '</a>'; data.innerHTML += '<a href="/bookmark_detail.php?illust_id=' + imageID + '" class="bookmark-count ui-tooltip" data-tooltip="Received ' + metascore[0] + ' bookmarks"><i class="_icon sprites-bookmark-badge"></i>' + metascore[0] + '</a>'; for (var i = 1; i < 4; i++) data.innerHTML += "<span class='bookmark-count' style='background-color:#FDFDFB;'>" + metaname[i] + " " + metascore[i] + "</span>"; previewWindow.setAttribute("style", "position: absolute; z-index: 1000; background-color:#000;border: 5px ridge #565757; max-width: 95%;"); if (metadata.illustType == 2 && metadata.pageCount > 1) //Manga { TSL.addStyle("MangaPreview", "#ThumbContainer{top: 0; left: 0; overflow: auto; white-space: nowrap; max-width: 100%; width: 100%;}" + "#ThumbContainer > a > img {border: 2px ridge #FFF; max-width: 128px;}"); var thumbContainer = document.createElement("div"); thumbContainer.id = "ThumbContainer"; thumbContainer.setAttribute("style", ""); for (var i = 0; i < links.length; i++) { var link = document.createElement("a"); var thumbnail = document.createElement("img"); thumbnail.setAttribute("style", "border: 2px ridge #FFF;"); thumbnail.setAttribute("style", "border: 2px ridge #FFF; max-width: 128px;"); thumbnail.src = metadata.illust150URL.replace(/_p\d+/, "_p" + i); thumbnail.alt = "Page #" + i; link.href = links[i].href; link.appendChild(thumbnail); thumbContainer.appendChild(link); thumbnail.onload = (function () { setTimeout(function () { PreviewHQ.adjustPreviewWindow(previewWindow, hotbox); }, 1000); })(); } previewWindow.appendChild(thumbContainer); } else { var prethumb = document.createElement("div"); var link = document.createElement("a"); link.href = links[0].href; var preImg = document.createElement("img"); preImg.setAttribute("style", "margin: auto auto; height: " + Settings.preview.height + "px;text-align:center;"); var imgsrc = (Settings.preview.height > 450) ? metadata.illust600URL : metadata.illust480URL; var topOffSet = 0; if (Settings.display.autoPreview) { preImg.src = imgsrc; prethumb.setAttribute("style", "height: " + Settings.preview.height + "px;text-align:center;"); preImg.alt = "Loading image"; } else { preImg.alt = "Click to load image"; prethumb.setAttribute("style", "text-align:center;"); topOffSet = 100; preImg.onclick = function () { preImg.onclick = null; preImg.onmouseover = null; preImg.alt = "Loading image"; preImg.src = imgsrc; prethumb.setAttribute("style", "height: " + Settings.preview.height + "px;text-align:center;"); PreviewHQ.adjustPreviewWindow(previewWindow, hotbox, topOffSet); return false; }; } PreviewHQ.intervalImageLoadCheck = setInterval(function () { if (preImg.naturalWidth > 0) { clearInterval(PreviewHQ.intervalImageLoadCheck); PreviewHQ.intervalImageLoadCheck = null; PreviewHQ.adjustPreviewWindow(previewWindow, hotbox, topOffSet); //console.log(preImg.width, 'x', preImg.height); } }, 0); //if (preImg.offsetWidth == 0) preImg.onload = function () { preImg.onload = null; }; //PreviewHQ.adjustPreviewWindow(previewWindow, hotbox, 65); link.appendChild(preImg); prethumb.appendChild(link) previewWindow.appendChild(prethumb); } previewWindow.appendChild(data); PreviewHQ.adjustPreviewWindow(previewWindow, hotbox); }, onMouseOut: function (e) { //Clear preview timeout so it does not display if hover is too short clearTimeout(PreviewHQ.delay.tID); PreviewHQ.delay = new Object(); PreviewHQ.interval = setTimeout(function () { if (PreviewHQ.intervalImageLoadCheck) clearInterval(PreviewHQ.intervalImageLoadCheck); PreviewHQ.intervalImageLoadCheck = null; var previewWindow = document.getElementById("previewWindow"); //if (previewWindow.getElementsByTagName("img")[0]) previewWindow.getElementsByTagName("img")[0].onload = null; if (previewWindow) document.body.removeChild(previewWindow); PreviewHQ.interval = null; }, Settings.preview.timeLength); }, adjustPreviewWindow: function (previewWindow, hotbox, topOffset) { if (previewWindow.offsetWidth == 0) return; //PreviewWindow unloaded. Setting onload to null in onMouseOut does not work. if (!topOffset) topOffset = 0; var offset = GetAbsolutePosition(hotbox); //TODO: adjustPreviewWindow: Change it to take into account top scroll-space, so it should not always choose bottom preview by default. //console.log(hotbox.getClientRects()[0].top, offset.top, previewWindow.offsetHeight, offset.top - previewWindow.offsetHeight) previewWindow.style.top = (offset.top - previewWindow.offsetHeight + 2) + "px"; if ((previewWindow.getClientRects()[0].top) < 0) { previewWindow.style.top = (offset.top + hotbox.offsetHeight - topOffset + 4) + "px"; var data = previewWindow.getElementsByClassName("pwMetadata")[0]; if (data != previewWindow.firstElementChild) previewWindow.insertBefore(data, previewWindow.firstElementChild); } previewWindow.style.left = 0 + "px"; //You do this to stop the wrapping that occurs with the metadata on the right most thumbnails previewWindow.style.left = (offset.left - (previewWindow.offsetWidth / 2) + Math.round(hotbox.offsetWidth / 2)) + "px"; var right = previewWindow.getClientRects()[0].right; if (right > document.body.clientWidth) previewWindow.style.left = (document.body.clientWidth - previewWindow.offsetWidth - 10) + "px"; var left = previewWindow.getClientRects()[0].left; if (left < 0) previewWindow.style.left = "0px"; } } /* =================================================================================================================================== Handles all events and functions to do with the sidebar ===================================================================================================================================*/ var SideBar = { iframe: null, sidebar: null, iDoc: null, interval: null, scrollWidth: (function getScrollBarWidth() { var inner = document.createElement('p'); inner.style.width = "100%"; inner.style.height = "200px"; var outer = document.createElement('div'); outer.style.position = "absolute"; outer.style.top = "0px"; outer.style.left = "0px"; outer.style.visibility = "hidden"; outer.style.width = "200px"; outer.style.height = "150px"; outer.style.overflow = "hidden"; outer.appendChild(inner); document.body.appendChild(outer); var w1 = inner.offsetWidth; outer.style.overflow = 'scroll'; var w2 = inner.offsetWidth; if (w1 == w2) w2 = outer.clientWidth; document.body.removeChild(outer); return (w1 - w2); })(), addStyle: function (id, styleScript) { var style = SideBar.iDoc.createElement("style"); style.type = "text/css"; style.innerHTML = styleScript; if (id) style.id = id; SideBar.iDoc.head.appendChild(style); }, initalise: function () { if (PAGETYPE < 1) return; var img = document.createElement("img"); img.setAttribute("style", "position:fixed; z-index: 100; top: 15px; left: 10px;"); img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAANi0lEQVR42tWaC5AU1RWG/9s9753ZnVnYZZdFWJ4FimKp4SGIIRISFDUCxqAU8VEqWj4SY0oEFF8golFLg6iUxsgqiaEkqwYTFUtiaUQloKjIIggIuMuy78e8++bcvn27e2Z2EVOVMt6tmZ7pme4+3zn/OffcnmXIGz948mA0VqXPjQXY+UFdO9XDEGO0X6MnJh6wHvRGbp19Ymiw3nC5Vfu5+cTt19z6hIs/rvbBfm1Y24yBlqTBt9BTbZORrdl8TlWr217mfnPmy1/PqfR5HiwOoKI9ZSCe5coOCWCDMBeI3Ce+aMMoAAtU2s7tK9oG92C4AlIA4vigzlDsZWg3UF/fmb1p44yKtQUAZ7zccOvQInZPYyKrdWa4ZSyzDOfmVrP2uQ11w8kTOp/bRuddLcdw9T7P8+JYw37PzG2Y5FAW1Iy6Dix++9zye+1TTqw9OGdQyFNzoDujGVwYwE1DdZd0FAAhmZ+7Dc+RlqUbJZD8oQxW8jFsIJYTGUN85oIyH/SagoGqkG7s78rM3XRe1Vo2bl1DtDzEd7SmshXkeGEeGcYtTwsILgHc+6H0zwsBmAVxNABXdPINNw1WEeCwAbPc2a+T56Jerb6hm41iY2vqrouWRB4lAFsyuqU9RzZWFOz9LM9gBwQozINCAGmpaTzQO4CKhmW8jAQ3YWI+DS1tHdezSS8dej2RMqZq1kV1ZmlfvXclqtS3FQklaxMmD4A5EegpFraEOLcgmPXa8biSUT6A+F7WOqHfp7/Bxr5woDkDHtM0R/OaBaF0riDsBLUABUg+BFwguXXCFj5UbZNeZzml1A3AwXONhxMB8d7LWAsbs3Y/13RmJ63ytu4CcMuIQUoLcCSWazTPc3cPLHmxUXlh5Eipd++rpOZEwo6v2ce9Ho0SQyWqEwXd9ngPUVCe5zKZwfO0zHmOt3MYlDOsksxdrCrB7erjzgNXaRWPNM1ybOSafdzn1SztF0JolsG5UYAqmLah4uTckKCDIjqGFuuoLNIQ82vw04Hiwp1pjsPxLPa0Z/F5Swbd5E5NOE6T13DPE0ZeRFRZVY8s7UylCWDEH/dyP2W0KaG8ySpn8oKr7qvwGuIhE3psuQ9Tqnw4pdyLiDfX49y1VSNJx245nEbtnji2NmXgoZNruoxKTi5Yuneiwe2SmqRugQ17RgFIyeR73ymhzNa3GWI6Cx2GcwcHMXtYCH0DspK0JzLY/FU7th7qxO6mBBq60kjSd4Mk0wHFXoypDGPqsBgGRv2WhBi2Nqbx0LYOHOo2oOtyH5iT1ArAmdQkRDJFOTDk6b084NcK5QN3K2F5Uxxo4U8b6MfVJ4ZR6peGH2hL4JktDXhzbxfSHj88/gB0r4+8qtm6yGYNZJIJZONdOGtgEDdOrEIs6DENjmcZln7QjnfrUxJCl1c1CuYDbkmIACiMrPopioBfy5GPu/KoRo3TUQYdVR7QsWhsCUnFQ+/NiowumgR/uqYOWlExfIGAaYCayZW2VWIL2WXpKRVPIprtwMPTB6E6JqPBmY7F/2rDO18TBPU9TENOhcpPYhPguNV7eICMKgBQJdJKToP6jMn9/bhjQhQBjTxJ3tRlPUU7nWh6bROC5AiPMF5T0mM5eWC3B/SUIWekCTySbMOzM6vtSKS4hstea8YBynDNqix2Y+cyXsAkklmw/o/v4cGg7pROd+Laxhu47PgI5o8Jk/Yz2HawE+/u68C1p1faAGfXNiMYIAAPs9vtozVzIpoCIklGTIwmsXzaAHtS3NZk4No3m0iCJGqNFeaCkBDtTSQoAv1W7TYBdHt2lRDMupow/jenRHHxiABpOIN/HyDDNxzEjNGVWHx6iQPwUosJoOSDXgBsCFNKohTSozuOP0yLYWR5SEJQbZ2/sRUfNaehUfJzltteK5C4AOizcjcPhXSrjWCu+UDqXicvrT87hsqwjkPtKfz8hb3o8pVg9vAgFk0otgF+QhEI+XXIWR29dnNOKy2NElFI0fEzB3DcfHqZ3aVu2JfBHe+3ySgwd1fqgHTTnMKivyeAoCYjYLUQKhLiW1maLMYWdePxGQOx7O16rNtPFYs8NGuoHwvHRWyAH9e2EICMgAi7WqEVGu9aVlr5kKZrDPBksPb8fnbFO5KkSvfiEXioVouKxF0TmWonuilPWNEju3g45LGbNt1VhUQOmFqlirF8fBA7u3x4bmfcNGzm4AAWjXcAzlrfLAE8Wk5bnS+d/CiYACRTLZXBxgvL4LPKp3DSxBeOIC7Oo7vzwIoCbbsEgO/hOh4p8pjSsWWEXBmJSSuQaIehUen0F5kWXFDtx2IXwJQXRRLrZhWyPc96sB65vY9ZkajCZSiZN87qg2K/Zh8qZNmQ5BKAwa7/Yi4Q204BoD1Yx8ME4LGSV3dPaGYUpMuYYa3MRL2mo2cSwG0THIDJ65wqBMYKvK9M5i4KCQAzDzjJ6K3ZpQh5rAjQOaasO4LGjIiATGQRAeV9IaOOrgxd54GdPBAmANrhsdYEKpHN1sK6nmZ5Rclq1iAfbncBTFp3bBHI77QFgJBQlC78+gWlVqsubqdwnFzTCMOnOxEA7LWAWP52mgArdnItLMuo1zLeY1Uje1EPZ5VmJh55a3a1jya1sAXAMf4vlAMBOZExrWf/uz0PqyHMCgBqyn7Y34dHfhi282N7Qxw/e7UTnoBu50DWAhBREADxTgGwfCdHRDcPEhAigh4oOUmjnclNZpKoTBcO9uEuBUBN1Wl/bkGRPZHhqEMVI9OTGVlGH50SxdQBlv7pBPe+cwRPfkHXFh2jzmz5CMMz1utsJ+UAlu7goC5RhZsxx3gbBE53qkrrRQSwdKKUUBsZcMqfqIwGRQS0YwIwrNlYlNARtHaoPa+U5Cl7q/YEzc7PH0KbNwTNK3MqY0dAQpgn6UiTRfd8JgGU9QUgMhdsOYmqQbPnJQSwbKIjoZPWNpk5IMqopjnGFszJqpcxq48BL7n2lZn9MDiUto9Z+MYhPLXfSx2tlI/BpNdVG2GfsF0A3PkpR0kegCsJ1RpYyYgJCZFm5w3xYfkkB2DUmib4SUJerwRw3+DKNZ6juv4gyhsPY/vw0Vh9bn+M62tQm5I1pbP+k2ZcvakTRriInAGM/3IHzfwBbD1uSOHa0wRY8gkB+PIMd9/gyYURETAoAlcQwH1nSACKOM5Z34ZP2tJmDoguVbTCzFVODUgXiqRdvepOjN21Hf5/rkH0pEEUiYz53b+S8ddsbEYqTD0WOSKSjuODW+ahpbQME5asKpwJWwXA4u0cUZ9rte02POemp2MJReCKYQQwOWInXVE4jB1NWbz2ZTc2H4rj8+YU6mmiSWRktSF7cFzEgzMGBHHZ7QsQ3bIV0U2roZ8wjNYTBpa9eRBP7kiCR6LyyxTySKIbHy6Yi9ZYGcYteSJ3CjcBUmTWQheAOwJuw5mLwLwdwHE5Aaw4UwIkyci3drVh8vAookV+6od080G9Ii0nZanUGw7D29pqervpyruR/rgORSsX4LNQOR55rxH/6Dsc6XAEjJJ2dOMB+I0MIt1deHzlEnTTQunK+beZ1+rwUUvTp8IFsIAAYt5eDM9rapgTgcuH+bFiilWFqK0den8dIp40Tu0fwLiBYYyuCGJwqR/9Ij4EyaOJ6dcgu21nL3WJ4arLF2HTqJMxuKMJf79rPnprxTNeP05Y9pyMhimh337MUeorNDQfRsnJXMvRAmeEH/f/qNgC4Bi6sh7mKl80+hlqJdNUVTL0EMtOutjC9zZg1OGvzPOe+PUeBJNx1FVWozVYBIOidfcFV+KL8v6I0v7f1TwEXyoBP0VrzL6d1IPp2FI90kRqLS7F9b+4QdrVIgBu/ogi0EMO5Buu9ompMCUAArh/qgtgVQNAZRR63o8ARp4LiXHNU5TEX36Ki29cgS1VQ3Kj7bqzF6HF/4e3/xKtUcqBWx8rrEItQkI3bbMAetG9e585nxtmBC4dGcAD06JSiiShYY8RAE1kZgKqVkJdCK5z0FjzxB0Yu4cAfmUB2IPnGGkC3HEpAfTFuFtWOZ+r7zQn6ZS/3ioBesqBfO8Lb9LMOanSj7sml+CkMmYFheGxrUnc934rEjlr0p7Hwlefx6RdH2P+vJuxn4yzewvXxrz7TBJ8/umlaIrEcNVFNxQ6xQS4kQD6+Jyd7oqTX5kMKZ9bTgthZImcfOTXqBH0+3Dn5jh2d3OYDdU3tBMFOdrTDWFeCJXzoinVA4B75MOICIhGpLtT3BaTQCpKwmgqgwh4c380+6bR0w8HvRmdL0cT4IYtHH0DvVWtwuFuyt1DYxLCfc/9WEePt+P50W0SAEcStLlmczP6hWPfymO2Dq0rOD/N5MruWI0+Zu/lHdLQ2UIzyDuvo1/JVLv8fV+GUEFD2xsMF794HaqGPgpaVv43jvhOhvA1rcZwcPf1DPNejiJQvAMVfSu+tXa/qyHysP5IPRLto6Ru5m2Yg0hJDcqi3w+ExlYDHW1z8ezZax3hX/K3W1EcuQdlpfIHM/5/pidRIEQX0NhsoL1jMZ47x/lXA3vMfWUONN+DiIUrEA5RW+DFNy5w/9dDOFI0hp3d1Pt01sNI3YSaGYX/7GGPWRuiCGXngrPzKRKnEkDsOwZoIc9voRV/LeKeGqybnvPvNv8BnlQbx8ePPhYAAAAASUVORK5CYII=" document.body.appendChild(img); img.onmouseover = function () { img.style.cursor = "pointer"; }; img.onmousedown = function () { SideBar.iframe.style.visibility = null; SideBar.adjustFrameSize(); document.getElementById("wrapper").style.margin = "10px 20px 0px auto"; Settings.display.sidebar = true; Settings.saveSettings(); }; var iframe = document.createElement("iframe"); iframe.onload = function () { var iDoc = iframe.contentDocument || iframe.contentWindow.document; iDoc.head.innerHTML = '<meta charset="utf-8" />'; iDoc.body.innerHTML = '<section id="PSideBar" style="min-width: 130px;"><div style="text-align: right; margin: 2px 5px 0 0; padding: 0;"><span style="float: left; display: inline-block; margin-left: 5px;"><a name="nextPage" href="#" title="Paging" class="buttonR buttonOn"><span></span></a><a name="metadata" href="#" title="Illustartion Linker" class="buttonG buttonOn"><span></span></a></span><a href="#" id="SidebarClose"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAADpklEQVR42m2U2UuUURjG329Gx3XcNXcll3EZ9UK9rQgsy5soo5v8C9wSR4zIGyHoJosR6b4uCokiiMirwi4S1EhxwxFRxwUV3JfR2XqeU98wmQdeZr7zfed3nvd9zns0OWe0tLSYIyIi0n0+X7nJZKo0Go0ZmPZ7vV7n6enpsMFgmDw+Pl612+2HZ9dqwQ+NjY1GfFyckJDQkJmZeTsrK+tiSkqKwWw2q/f7+/uysbHhdTqds8vLy/1bW1tvsKmjr6/P9x+wqanJFBIScj03N7etoqLiSlpamoZn0bR/9hS/3y8ej0fW1tZ8Y2NjXxYWFp673e5vgHoCQCoLDQ29WVRU1F1eXl4WFxdHpQp2HpABZbKzs+MZHx8fnpmZ6QL0K5Wqr5ubm605OTn2qqqqS7GxsSiZUYEIZQQPgnQgle7u7npGR0c/Ly4u2np7ex0aYOaYmJjHlZWVHXqaMEJQR7Vob28vAONGUC9HR0dqnkAYxfS9IyMjXajxC629vd0C0CfULT88PFwtglpJTU0VpMGPZXt7W7gR5xITE+Xk5ESgSM0T6nK5BKn/XF1dvaO1tbXdLSkpeQtHDVRGYGlpqVLIwcWERkVFKRhLQVXz8/Oyvr6ugNx4aWnpdHp6uk6z2WxPYUQnUyGQSqKjoyUvL08BOLiA8xwE4NgI1Kh5BjeFQVRpI/A1gPcjIyMlLCxM4LYygooKCgokKSkpUEPCmCqBev104OHhoUxMTPRora2trzIyMhqSk5OFUKoklPUsLCwUvAscHdbK4XDIysqKMowwdI6CbW5uUvUzDQf6CdrsEVNmUFl8fLxYrVZljl4z1pYDLSeolaohNzg4OFDmMGU8P9BwqG8h1XcAGQmjutraWrFYLApGBZOTk8IM0I4KSkWDg4MyOzsbSBfhwrc3CCxAwT8i3WKmTGBNTY3gGKmU0F4yNTWljKqurpbs7GylamBgQNB2SiXPJWIImdwjMApKOqCyC0AD0lep46CrVKmOvxxoACkrK1Ogubk5BWIJ8OuGuk500Eu9ly1wtgfQawCG0BA6TbU0STeFYJZAvyD+qiPsPUx6iF5e0IFs2KsofDcA1YTqZ5Jm6P1MZ/WjQjDUEfYd8114/QNAf+AqAZQn9zIWt0BZHYC8gUS/KIKvLgZA4LqpzI5XQ/qdePaCpZQ8AOoBrgfMijAFA6HQhfgFUD+eP2B6kcrOvbGDwBGAXMDffEQFIv0Pz+/E7xhiHrEBkOvs2t9OIDX6eVLvRgAAAABJRU5ErkJggg==" /></a></div><div id="hiddenCtrl" style="font-size: x-small; text-align: center; margin: 2px; display: none;"><input id="pagingOffset" type="text" style="width: 40px; margin: 0px 3px;" title="Page Offset" /><select id="pageFetchMethod" title="Page Fetch Method"><option title="GM_xmlHttpRequest">1G</option><option title="xmlHttpRequest">2X</option><option title="iframe">3F</option></select></div><hr style="margin-top: 2px;" /><div><table id="InfoTable"><tbody><tr><td>Pages</td><td></td></tr><tr><td>Images</td><td></td></tr></tbody></table></div><hr /><section><div style="text-align: center;"><a name="displayOptions" href="#"><div class="bgiY blockButtonOn" style="border-color: yellow;">Display Options</div></a></div><div id="DisplayOptions" class="aY" style="border: 2px solid yellow; padding-bottom: 5px;"><table class="switchTable"><tbody><tr class="switchCellOn"><td><a name="artistName" href="#"><div></div></a></td><td><a name="artistName" href="#">Artist Name</a></td></tr><tr class="switchCellOn"><td><a name="illustTitle" href="#"><div></div></a></td><td><a name="illustTitle" href="#">Illustration Title</a></td></tr><tr class="switchCellOff"><td><a name="illustLink" href="#"><div></div></a></td><td><a name="illustLink" href="#">Illustration Link</a></td></tr><tr class="switchCellOff"><td><a name="mangaLinks" href="#"><div></div></a></td><td><a name="mangaLinks" href="#">Manga Links</a></td></tr><tr class="switchCellOn"><td><a name="countList" href="#"><div></div></a></td><td><a name="countList" href="#">Count-List</a></td></tr></tbody></table><hr /><table class="switchTable"><tbody><tr class="switchCellOff"><td><a name="IQDBLink" href="#"><div></div></a></td><td><a name="IQDBLink" href="#">IQDB Link</a></td></tr></tbody></table><div class="selectHolder"><select id="IQDBOptions"><option>danbooru</option></select></div><hr /><table class="switchTable"><tbody><tr class="switchCellOn"><td><a name="autoPreview" href="#"><div></div></a></td><td><a name="autoPreview" href="#">Preview Image</a></td></tr></tbody></table><div class="selectHolder"><select id="previewHeight"><option>250px</option></select><select id="previewLength"><option>10ms</option></select></div></div></section><section><div style="text-align: center;"><a name="filterOptions" href="#"><div class="bgiC blockButtonOn" style="border-color: cyan;">Filter Options</div></a></div><div id="FilterOptions" class="aC" style="border: 2px solid cyan;"><ul><li><input type="checkbox" name="ageRating" />Safe</li><li><input type="checkbox" name="ageRating" />R18</li><li><input type="checkbox" name="ageRating" />R18G</li></ul><table class="filterTable"><tbody><tr><td><input id="tagsInclude" type="text" /></td><td><a name="tagsInclude" href="#"><div class="bgiG"></div></a></td></tr><tr><td><input id="tagsExclude" type="text" /></td><td><a name="tagsExclude" href="#"><div class="bgiG"></div></a></td></tr></tbody></table><hr /><div style="text-align: center;"><a name="filterSwitch" href="#"><div class="miniButtonOff" style="width: 80%;">Filter Options</div></a></div><table><tbody><tr><td style="width: 16px;"><input type="checkbox" name="filterType" value="2" checked="checked" /></td><td colspan="3">Illustrations</td></tr><tr><td><input type="checkbox" name="filterType" value="4" checked="checked" /></td><td colspan="3">Mangas</td></tr><tr><td><input type="checkbox" name="filterType" value="8" checked="checked" /></td><td>Bookmarks</td><td><input class="filterValue" type="text" /></td><td style="width: 10px;"><input type="radio" name="sortType" value="0" /></td></tr><tr><td><input type="checkbox" name="filterType" value="16" checked="checked" /></td><td>Views</td><td><input class="filterValue" type="text" /></td><td><input type="radio" name="sortType" value="1" /></td></tr><tr><td><input type="checkbox" name="filterType" value="32" checked="checked" /></td><td>Ratings</td><td><input class="filterValue" type="text" /></td><td><input type="radio" name="sortType" value="2" /></td></tr><tr><td><input type="checkbox" name="filterType" value="32" checked="checked" /></td><td>Total</td><td><input class="filterValue" type="text" /></td><td><input type="radio" name="sortType" value="3" /></td></tr></tbody></table><div style="text-align: center; margin-bottom: 3px;"><a name="Sort" href="#"><div class="blockButtonOn bgiC" style="width: 50px;">Sort</div></a><a name="Unsort" href="#"><div class="blockButtonOn bgiC" style="width: 50px;">Unsort</div></a></div><ul class="filterSet"><li><span style="background-color: yellow;"><input type="radio" name="filterSet" value="0" /></span></li><li><span style="background-color: pink;"><input type="radio" name="filterSet" value="1" /></span></li><li><span style="background-color: red;"><input type="radio" name="filterSet" value="2" /></span></li><li><span style="background-color: darkgreen;"><input type="radio" name="filterSet" value="3" /></span></li><li><span style="background-color: blue;"><input type="radio" name="filterSet" value="4" /></span></li></ul></div></section></section>'; var sidebar = iDoc.body.firstElementChild; iDoc.body.appendChild(sidebar); SideBar.sidebar = sidebar; SideBar.iDoc = iDoc; SideBar.iframe = iframe; SideBar.addStyle(null, ".bgiY{background-color: yellow;background-image: linear-gradient(bottom, rgb(255,255,250) 0%, rgb(255,255,0) 50%, rgb(255,255,250) 100%);background-image: -o-linear-gradient(bottom, rgb(255,255,250) 0%, rgb(255,255,0) 50%, rgb(255,255,250) 100%);background-image: -moz-linear-gradient(bottom, rgb(255,255,250) 0%, rgb(255,255,0) 50%, rgb(255,255,250) 100%);background-image: -webkit-linear-gradient(bottom, rgb(255,255,250) 0%, rgb(255,255,0) 50%, rgb(255,255,250) 100%);background-image: -ms-linear-gradient(bottom, rgb(255,255,250) 0%, rgb(255,255,0) 50%, rgb(255,255,250) 100%);background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(255,255,250)), color-stop(0.5, rgb(255,255,0)), color-stop(1, rgb(255,255,250)) );}.bgiC{background-color: cyan;background-image: linear-gradient(bottom, rgb(200,255,255) 0%, rgb(0,255,255) 50%, rgb(200,255,255) 100%);background-image: -o-linear-gradient(bottom, rgb(200,255,255) 0%, rgb(0,255,255) 50%, rgb(200,255,255) 100%);background-image: -moz-linear-gradient(bottom, rgb(200,255,255) 0%, rgb(0,255,255) 50%, rgb(200,255,255) 100%);background-image: -webkit-linear-gradient(bottom, rgb(200,255,255) 0%, rgb(0,255,255) 50%, rgb(200,255,255) 100%);background-image: -ms-linear-gradient(bottom, rgb(200,255,255) 0%, rgb(0,255,255) 50%, rgb(200,255,255) 100%);background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(200,255,255)), color-stop(0.5, rgb(0,255,255)), color-stop(1, rgb(200,255,255)) );}.bgiL, .switchCellOn > td:first-child, .miniButtonOn{background-color: rgb(0,255,0);background-image: linear-gradient(bottom,rgb(200,255,200) 0%, rgb(0,255,0) 50%, rgb(200,255,200) 100%);background-image: -o-linear-gradient(bottom, rgb(200,255,200) 0%, rgb(0,255,0) 50%, rgb(200,255,200) 100%);background-image: -moz-linear-gradient(bottom, rgb(200,255,200) 0%, rgb(0,255,0) 50%, rgb(200,255,200) 100%);background-image: -webkit-linear-gradient(bottom, rgb(200,255,200) 0%, rgb(0,255,0) 50%, rgb(200,255,200) 100%);background-image: -ms-linear-gradient(bottom, rgb(200,255,200) 0%, rgb(0,255,0) 50%, rgb(200,255,200) 100%);background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(200,255,200)), color-stop(0.5, rgb(0,255,0) ), color-stop(1, rgb(200,255,200)) );}.bgiG, .switchCellOff > td:first-child, .miniButtonOff{background-color: rgb(156,156,156);background-image: linear-gradient(bottom, rgb(238,238,238) 0%, rgb(156,156,156) 50%, rgb(238,238,238) 100%);background-image: -o-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(156,156,156) 50%, rgb(238,238,238) 100%);background-image: -moz-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(156,156,156) 50%, rgb(238,238,238) 100%);background-image: -webkit-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(156,156,156) 50%, rgb(238,238,238) 100%);background-image: -ms-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(156,156,156) 50%, rgb(238,238,238) 100%);background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(238,238,238)), color-stop(0.5, rgb(156,156,156)), color-stop(1, rgb(238,238,238)) );}.bgiB, #PSideBar, .blockButtonOff{background-color: black;background-image: linear-gradient(bottom, rgb(80,80,80) 0%, rgb(0,0,0) 50%, rgb(80,80,80) 100%);background-image: -o-linear-gradient(bottom, rgb(80,80,80) 0%, rgb(0,0,0) 50%, rgb(80,80,80) 100%);background-image: -moz-linear-gradient(bottom, rgb(80,80,80) 0%, rgb(0,0,0) 50%, rgb(80,80,80) 100%);background-image: -webkit-linear-gradient(bottom, rgb(80,80,80) 0%, rgb(0,0,0) 50%, rgb(80,80,80) 100%);background-image: -ms-linear-gradient(bottom, rgb(80,80,80) 0%, rgb(0,0,0) 50%, rgb(80,80,80) 100%);background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(80,80,80)), color-stop(0.5, rgb(0,0,0)), color-stop(1, rgb(80,80,80)) );}.aY a:link, .aY a:visited{color: yellow;}.aC a:link, .aC a:visited{color: cyan;}a, td, input, select, option, ul, span{text-decoration: none;font-size: small;}a, td, ul{color: white;}input, select, option, span{text-align: right;font-size: smaller;}hr{margin: 5px;}"); SideBar.addStyle(null, "#PSideBar{top: 0px;left: 0px;border: 5px ridge black;display: inline-block;color: white;}#PSideBar > div, #PSideBar > section > div{margin: 2px 5px 2px 5px;}.blockButtonOff, .blockButtonOn, .miniButtonOn, .miniButtonOff{width: 90%;display: inline-block;text-align: center;border-radius: 20px;border: 2px solid;}.blockButtonOn{color: black;}.blockButtonOff{color: rgb(156,156,156);}.miniButtonOff, .miniButtonOn{color: black;}.switchTable, .filterTable{padding: 2px 5px 0px 5px;text-decoration: none;}.switchTable * tr > td:first-child > a > div{width: 100%;height: 100%;}.switchTable * tr > td:first-child{width: 12px;height: 12px;border-radius: 10px;display: inline-block;}.switchCellOff > td:last-child > a:link, .switchCellOff a:visited{color: white;}#InfoTable tr > td:first-child{padding-right: 5px;border-right: 1px solid gray;}#InfoTable tr > td:last-child{padding-left: 5px;}.selectHolder{padding: 0 8px 0 8px;}.selectHolder > select{font-size: small;width: 100%;}ul{margin: 0;padding: 0;list-style-type: none;text-align: center;}ul > li{display: inline;border-right: 1px solid gray;padding-right: 5px;}ul > li:last-child{border-right: none;}ul > li > span{display: inline-block;}.filterSet{margin-bottom: 5px;}.filterSet > li{border: none;padding-right: 1px;}.filterSet input{margin: 4px;}.filterValue{color: black;width: 38px;}.buttonG > span{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEPUlEQVR42m2VW0wcZRiG35md8+7sLLjsdgsL8YoKF5JUNJoYb4y9NKWJ1KaNBuXQQ1ITm0avbGJSIzRpMKWcCmKLpMV0MRhIbKgXSFFCGr3oRcFShG13wT1x2uPs7vjPdFm2hZm8meP/zPt93/9/Q2GPrb+/X3I4HHWyLB9mWbaWyJXJZBCPx/1Es9FodGRtbc3T2NgYe3EsVXjR2dlJlZWV1ZeWlrYqiuLe2NjA4pNH+C/sJ29qcBS7sL+kHCbahGAw6A2Hw+c3NzdvtbS0aLuAAwMDTEVFRXt5eflJ/4qPuj7SgweL9wE2DU5koDEZqIiDYRnUvPwm3q/9GFTWpK2urnYS6NmmpqZ0HtjR0UFVVVVdIcBTd3//FX2e71Bkt4EVaGh0GllTGlqBVCqOLNlPvPYFKpRX4Pf7r25tbZ3RnRrA0dHRo9XV1UO/3btDXfNchmu/C1l6B5A1qTtAZlsqVC2Bj6q/hp2u0AKBwLGGhoabVF9fn1RTU/Mwnoy5P2/7lMCcOUg6505FLLOORHYTGVMKNKeBESji3mQcGZrHZ1XfY9Ub9CYSiQPU2NjY8crKyhtt1y5gKTwHXs9XDriZCiMU95NzAuIBky4hdyRidBHwW9Z6vMHXg+TzBDU5OXnbIlvqTrd+AMe+kmcwWkUw+hRrqYAxMA8rVAFYZl9Ci3UQy0vLHmpqamo5sO53f/vTOThKngHDiRWE4ys7MGEP4Av3P2F/QOhxwkvNzMyofy/MMD/euwxFsSKpRfF0fYGAtN3uhO1QSe7IDNBzqF9TXBZHtDakHlnT1PT0tPpgeZYZ/PMSrIqMQOwJ4tpGHlII1AG8yBJx4ATWAOvPKTaDQ7GvkJyT09TExMTyhhpyX7p7GjbFBt/WglFJA1YQkj4nRUmEKIoQckATRxvvaqyKQysXEZwnIY+Pj98uKi6q+/KXI2DMGiIp/y5nOkwySzBLZgKUIAgCOJ445Mg0JuFCNeHdfy+Song91PDw8HGyQm4M/9WOmbWfodKx58MkEiUJFrNMgBaYBXMOyMHE6sAM7L6DcC2+g1AodILq7e2VXC7XQ1Hm3N/c/xAxNvRc9TiBgWy2wiLJsIhWSKIFEm8Gx/EECGRTFF79pxlL8z4vWXQHjKU3ODh41Ol0DvmSc9T11XPI8ol8VSWSM9msGDBDAoHyMgROAkiPKZ17D7FFTiNr+Vhzc/NNA9jV1UVZrdYrdrv91EpmDp7oBSTEkFFVPUxZzAEFxQCaOQVCqgjOx28j4eUQiUSuEswZAtTy7aunp4fheb6dgE+KCkv9kRzCvHQHJiWVh5l1mGqHM3wQ+0KvI+iL6M46yfCzBJbe1WB1pwzD1NM03Wqz2dyiJCDGB5HkIkZTFdRicDEbolsxvQB6zs4T3dKd7dmxt7fu7m6SINQRHSaqJR9w6fez2Sxp3ZglGiHyENCuX8D/3p++AfxYDl8AAAAASUVORK5CYII=);}.buttonR > span{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAD+UlEQVR42nWVS0xTWRjHv9PeR1t6+4AC00BpMhsQNiRGExfGnXsxETWaGCIUH4kbY9xpYuJCTQxGBEpAjIQAiWBIIJGwmBBkwjDsJpGO4IwUW5i+0JbS0sed/7lOGRC4yT9fz+k9v37PU0YHPL29vaaysrIGRVHOiKJ4DHLmcjna2toKQvObm5ujGxsbI83Nzckfz7Ldi46ODlZZWdlYUVHxyGq1uuLfvtHa0hLFg0FiqkqK00m2qirS6fUUDof90Wj0TjweH2ptbVX3Afv6+gS3291WVVV1LRQIsF+8XgotLJCUzZIsCKSHh3CRdPhceuIE1Vy5Qlm9Xl1fX+8A9FZLS0t2B9je3s5qa2ufA3j993fv6P2zZ1Ris5Gk05EOQC79LssAzuXz9PPdu2Q8coSCweCLRCJxk3uqAcfGxs7X1dUNLExOsl+fPqUyhLYHlMnsAWrCnppKkfPBA8q53WooFLrY1NQ0yHp6ekz19fWLmWTSNXT1KpWXl+8c1v0Hy339Smo8TvrtbRKRS4kxkpBHbkmW6aeXL2kFOU2lUjVsfHz8UnV19evR+/cp7fORATkqwLLRKKVQEA2ESKRdKqxlgPWNjZSHkM/LbHp6+o1iNjcMnjtHZaWlO16lvnyh7VBoz+EfYQWxkhJi/f3098rKCJuZmVlJBoOu97dvkx1AHm56bU3TYYCD1ulXr2gplfKzubm5TGBuTvChGGaLhWhzkxLLy99zdRgMuZPRAdzytYiKJx8/Jp/FkmWzs7OZf+bnheUnT6hIUSi1ukoqGvogmAYSRZIlSbMiLw72BfRo9N49+qAoWTY1NbWiRiKuP27cIAW9lzzMO3hkMBo1caDEgdjj7wrI+eeHD8nHQ56YmHhTbLc3/Hb2LJnxZQZVPQhmNJnIUFREMqxkMHwHwkMB4W6j0h8B/Oz3j7Dh4eFLmJDXH9vaKPP2LemSyX1AAyBGpEM2m0kGVAPCS4EDEe7q0aO0fOoURSKRy6y7u9vkdDoXrZLk+uvCBZIjkT0wPscGFMsAILcSoBKgIhpa4NUFdNHjoT8DAT+WNdro9ff3n8eEDOR9PpZE+8gYqR0gcma0WkkGrCARcBFe8yvmw+nT9EmSVMzyRY/HM6gBOzs7mcViee5wOK4zTIuKqTHBU15VAw8TQM07WIkDYdN2Oy2dPEl+hB6LxV4AcxNAdef68nq9gizLbQBfs4kiUwcGSJmcJAvGbjds2+GgMHIWPn6cArEY96wDx28B9v/1VXi4p4IgNOp0ukc2m81lQvIN4TDJsZh2qaaLiymJ1kqgcCgAz9kdaIh7duCNXXi6urpMMA3QGegYfsDJ9/P5fBBmHhqFRgDa9xfwL7RWxwHoNf0IAAAAAElFTkSuQmCC);}.buttonOff > span, .buttonOn > span{height: 20px;width: 20px;display: inline-block;}.buttonOff > span{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAADWElEQVR42nWVyy9rURTG16Ze9Y5nw2EkhEiQmPkTJKIGaJgQj4rE7A7NTAwkotQ7koogUSFhgIGISMSAgYGJiDZR77d6tJy7vp2c3nPb2snK7mn3/u1vfWvtU0FhxvT0tDEzM9OcmJhYGxUVVclh+v7+pvf3dw/Hwdvb2/Lj46Ozra3NG7xX6B/sdrvIzc2tz8nJ6U9OTlaen5/p9PSUrq6uSAhBWVlZxL9RZGQk3d7euu/v7/+8vLwsdHZ2qiHAmZkZQ35+/mBeXp714uJCTE5O0tHRkQTFxsbK2e/3U0xMDFVUVFBNTQ2+U/kwO0N72tvb/QHg8PCwKC4utjGwa2Njg2w2G6WlpcnNgZOFCMxIH7PFYiFFUcjj8Yy8vr52Q6lctbq62lBSUjK3ubkphoaGZFoaIBimD4AbGxspNTVVvbm5sbS0tMyLqakpY1lZ2YnX61WsVmsIDOPj44O+vr5IVVUyGAwUHR0t1WNGtLa20uXlpZvXFYm1tbWmwsJCR19fH52dnQX8wuBq0sPDg/zMlQ4JDVxeXk6lpaUoXrPY2dlZSkhIMOOU7OzsAOzu7o7Y7LAgPRAztxfV1dXR+fm5U+zu7rqur68VKERbAMg9JkO/6TeYFtXV1VDoFvv7+77Dw0ODw+GAueTz+VA16dVvQL2HeMbaqqoq4r71i729Pd/x8bFhdnaWUlJSZKqfn59hYXiOi4uTPiPwDBiCC4us/GJra8vFXikDAwNSIW5FOHVQZDQaKT4+XkI1hbg1ERERxG2HzNxifX19iUHm3t5euejp6SnEJ8xcOBmAakD8BiBGQUEBuVwup1hcXGziG+JwOp3yqqFZg4FQhUoCqFeITKAOnxFsV7OYmJgwmkymE16k4JagKHogvALsNyAEZGRkoIfdLLRINh0XpIFbZo7bR6ysrMjWCVanByJtHISBddz8Kt9lS0dHx7wEjo6OiqSkJFt6enoXv5Zoe3ubfn5+/vMOQMC00AoHzxk4wphuBqqBSzs+Pm7gNAYZbOUNglsJ91OmpkEBwiFatTkjKLPz9h6G/Xt9aQNK+eR6Nrqfe1KBV/AUPqGaUAU7cMe5APDsD8cClIV9Y2tjbGzMyJOZo5ajkg8w4Xu2wcPTAccyh5NBIX8BfwGUUXYBm4oiewAAAABJRU5ErkJggg==);}.filterTable div{width: 15px;height: 15px;border-radius: 2px;border: 2px solid black;}.filterTable input{text-align: left;}"); // Settings to hide according to the page type. if (Settings.displayHidden & 2) if (PAGETYPE > 1 && Settings.displayHidden & 2) { var hc = iDoc.getElementById("hiddenCtrl"); hc.style.display = null; hc.style.textAlign = "left"; var offset = iDoc.getElementById("pagingOffset"); offset.value = Settings.pagingOffset; offset.onfocus = function (e) { e.target.select(); } offset.oninput = function () { if (offset.value.length > 5 || isNaN(offset.value[offset.value.length - 1])) offset.value = offset.value.substring(0, offset.value.length - 1); if (isNaN(offset.value) || offset.value < 100) Settings.pagingOffset = 100; else Settings.pagingOffset = offset.value; Settings.saveSettings(); }; hc.removeChild(iDoc.getElementById("pageFetchMethod")); hc.title = "If checked implies usage of GM_xmlhttpRequest rather than XMLHttpRequest.\nP > Next page fetching.\nA > All pages apart from illustration page. \nI > Illustration page" hc.innerHTML += '<select id="gbm" title="Get Bookmark on..."><option>None</option><option>All-I</option><option>All+I</option></select>' hc.innerHTML += 'P<input type="checkbox" />A<input type="checkbox" />I<input type="checkbox" />'; var els = iDoc.getElementById("gbm"); els.selectedIndex = GM_getValue("RequestBookmarkCount", 0); els.onchange = function () { GM_setValue("RequestBookmarkCount", this.selectedIndex); }; var els = hc.querySelectorAll("input[type=checkbox]"); for (var i = 0; i < els.length; i++) { els[i].checked = (Settings.requestMethod & Math.pow(2, i + 1)); els[i].onclick = function () { Settings.requestMethod = 0; var chk = iDoc.querySelectorAll("#hiddenCtrl input[type=checkbox]"); for (var j = 0; j < chk.length; j++) { Settings.requestMethod += (chk[j].checked) ? Math.pow(2, j + 1) : 0; } console.log("New Request Method: " + Settings.requestMethod); GM_setValue("RequestMethod", Settings.requestMethod) }; } } else { iDoc.getElementById("pagingOffset").style.display = "none"; iDoc.getElementById("pageFetchMethod").style.display = "none"; } if (PAGETYPE < 2) { iDoc.getElementById("FilterOptions").parentElement.style.display = "none"; iDoc.getElementsByName("nextPage")[0].style.display = "none"; } else { iDoc.getElementById("FilterOptions").style.display = (Settings.display.filterOptions) ? null : "none"; //How to handle AgeRating functions if (PAGETYPE != 8) { var ars = iDoc.getElementsByName("ageRating"); for (var i = 0; i < ars.length; i++) { ars[i].onclick = SideBar.onAgeRatingFilter; } } else iDoc.getElementsByName("ageRating")[0].parentElement.parentElement.style.display = "none"; } iDoc.getElementById("DisplayOptions").style.display = (Settings.display.displayOptions) ? null : "none"; var switchLinks = sidebar.getElementsByTagName("a"); for (var i = 0; s = switchLinks[i], i < switchLinks.length; i++) { if (s.id == "SidebarClose") //No toggling here { s.onclick = function () { SideBar.iframe.style.visibility = "hidden"; document.getElementById("wrapper").style.margin = null; Settings.display.sidebar = false; Settings.saveSettings(); } } else if (s.name) { switch (s.name) { case "filterSwitch": SideBar.switchSet(s, false); break; case "Sort": case "Unsort": break; case "tagsInclude": case "tagsExclude": //Filter search text var txt = iDoc.getElementById(s.name); txt.value = Settings.filter[s.name]; txt.oninput = SideBar.onInputTagFilter; break; case "nextPage": case "metadata": SideBar.switchSet(s, Settings.fetch[s.name]); break; default: SideBar.switchSet(s, Settings.display[s.name]); break; } s.onclick = SideBar.onSwitchPressed; } } //-------------------------------------------// //Checking filters var filters = iDoc.getElementsByName("filterType"); for (var i = 0; i < filters.length; i++) { var bitValue = Math.pow(2, i + 1); filters[i].checked = (bitValue & Settings.filter.flag) ? true : false; filters[i].onclick = SideBar.onToggledFilter; } //-------------------------------------------// //Loading filter values var filterSets = iDoc.getElementsByName("filterSet"); for (var i = 0; i < filterSets.length; i++) { filterSets[i].onclick = SideBar.onRadioClick; } iDoc.getElementsByName("filterSet")[Settings.filter.set].checked = true; SideBar.loadFilterSet(); var els = sidebar.getElementsByClassName("filterValue"); for (var i = 0; i < els.length; i++) { els[i].oninput = SideBar.onInputFilterValue; els[i].onfocus = function (e) { e.target.select(); }; } //-------------------------------------------// //Sort type var sortTypes = iDoc.getElementsByName("sortType"); for (var i = 0; i < sortTypes.length; i++) sortTypes[i].onclick = SideBar.onRadioClick; SideBar.iDoc.getElementsByName("sortType")[Settings.sortType].checked = true; //-------------------------------------------// //Load IQDB options and set them var IQDBTypes = ["All", "anime-pictures", "danbooru", "e-shuushuu", "haruhidoujins", "gelbooru", "konachan", "mangadrawing", "sankaku", "theanimegallery", "yandere", "zerochan"]; var sel = iDoc.getElementById("IQDBOptions"); sel.innerHTML = ""; for (i = 0; i < IQDBTypes.length; i++) { var opt = iDoc.createElement("option"); opt.textContent = IQDBTypes[i]; sel.add(opt); if (IQDBTypes[i] == Settings.IQDBType) opt.selected = true; } if (Settings.IQDBType == "www") sel.selectedIndex = 0; sel.onchange = function (e) { var sel = e.target; if (sel.selectedIndex == 0) Settings.IQDBType = "www"; else Settings.IQDBType = sel.options[sel.selectedIndex].textContent; if (Settings.display.IQDBLink) PaginatorHQ.updateAllIQDBLinks(); Settings.saveSettings(); }; //-------------------------------------------// //Preview height settings sel = iDoc.getElementById("previewHeight"); sel.innerHTML = ""; for (i = 0; i <= 10; i++) { var size = i * 50 + 200; var opt = iDoc.createElement("option"); opt.textContent = size + "px"; opt.value = size; sel.add(opt); if (size == Settings.preview.height) opt.selected = true; } sel.onchange = function (e) { var sel = e.target; Settings.preview.height = sel.options[sel.selectedIndex].value; Settings.saveSettings(); }; //-------------------------------------------// //Preview length settings sel = iDoc.getElementById("previewLength"); sel.innerHTML = ""; for (i = 1; i < 9; i++) { var period = (i < 7) ? (i * 500) : 3000 + ((i - 6) * 1000); var opt = iDoc.createElement("option"); opt.textContent = period + "ms"; opt.value = period; sel.add(opt); if (period == Settings.preview.timeLength) opt.selected = true; } sel.onchange = function (e) { var sel = e.target; Settings.preview.timeLength = sel.options[sel.selectedIndex].value; Settings.saveSettings(); }; iDoc.body.setAttribute("style", "width: auto; height: auto;"); iframe.setAttribute("style", "z-index: 1000; position:fixed; top: 0px; left:0px;"); SideBar.adjustFrameSize(); SideBar.iframe.style.visibility = (Settings.display.sidebar) ? null : "hidden"; document.getElementById("wrapper").style.margin = (Settings.display.sidebar) ? "10px 20px 0px auto" : null; window.onresize = SideBar.adjustFrameSize; if (Settings.fetch.metadata) IllustrationLinker.switchOn(); else IllustrationLinker.switchOff(); } document.body.appendChild(iframe); }, switchMain: function (s) { if (s.className) return s; if (s.firstElementChild && s.firstElementChild.className) return s.firstElementChild; var depth = 0; while (!s.className) { s = s.parentElement; if (s.className) return s; if (++depth == 2) return s; } }, switchCheck: function (s) { return (SideBar.switchMain(s).className.indexOf("On") >= 0); }, switchSet: function (s, enable) { var m = SideBar.switchMain(s); m.className = (enable) ? m.className.replace("Off", "On") : m.className.replace("On", "Off"); }, switchToggle: function (s) { var m = SideBar.switchMain(s); var enabled = !SideBar.switchCheck(m); SideBar.switchSet(m, enabled); return enabled; }, adjustFrameSize: function (e) { if (SideBar.sidebar.offsetHeight > window.innerHeight) { SideBar.iframe.style.height = (window.innerHeight) + "px"; SideBar.iframe.style.width = (SideBar.sidebar.offsetWidth + 20 + SideBar.scrollWidth) + "px"; } else { SideBar.iframe.style.height = (SideBar.sidebar.offsetHeight + 30) + "px"; SideBar.iframe.style.width = (SideBar.sidebar.offsetWidth + 20) + "px"; } }, /* ------------------------------------------------------ Handles all link elements that behave like a button ------------------------------------------------------*/ onSwitchPressed: function (e) { e.stopPropagation(); //e.preventDefault(); //Stops propagating to parent var s = e.target; while (s.tagName != "A") s = s.parentElement; var enabled; if (s.name != "Sort" && s.name != "Unsort") enabled = SideBar.switchToggle(s); if (Settings.display[s.name] != undefined) Settings.display[s.name] = enabled; if (Settings.fetch[s.name] != undefined) Settings.fetch[s.name] = enabled; switch (s.name) { case "Sort": case "Unsort": case "tagsInclude": case "tagsExclude": case "filterSwitch": if (PaginatorHQ.status != 0) { alert("Sort/Filter is already in progress."); } else if (s.name == "filterSwitch") { if (enabled) Settings.filterSwitchFlag = (Settings.filterSwitchFlag | 2); else Settings.filterSwitchFlag -= (Settings.filterSwitchFlag & 2); PaginatorHQ.filterResult(); } else if (s.name == "tagsInclude" || s.name == "tagsExclude") { var btn = e.target; if (btn.className == "bgiL" && btn.style.borderColor == "rgb(0, 0, 0)") { btn.className = "bgiG"; enabled = false; } else { btn.style.borderColor = "rgb(0, 0, 0)"; btn.className = "bgiL"; enabled = true; } if (s.name == "tagsInclude") { if (enabled) Settings.filterSwitchFlag = (Settings.filterSwitchFlag | 4); else Settings.filterSwitchFlag -= (Settings.filterSwitchFlag & 4); } if (s.name == "tagsExclude") { if (enabled) Settings.filterSwitchFlag = (Settings.filterSwitchFlag | 8); else Settings.filterSwitchFlag -= (Settings.filterSwitchFlag & 8); } PaginatorHQ.filterResult(); } else { PaginatorHQ.sortingMethod = (PaginatorHQ.sortingMethod != 0) ? 0 : 1; PaginatorHQ.sortByScore((s.name == "Sort")); } break; case "displayOptions": SideBar.iDoc.getElementById("DisplayOptions").style.display = (enabled) ? null : "none"; break; case "filterOptions": SideBar.iDoc.getElementById("FilterOptions").style.display = (enabled) ? null : "none"; break; case "IQDBLink": PaginatorHQ.updateAllIQDBLinks(); break; case "metadata": if (enabled) IllustrationLinker.switchOn(); else IllustrationLinker.switchOff(); break; case "Paging": break; default: PaginatorHQ.updateVisibilityOfAllElements(); break; } Settings.saveSettings(); SideBar.adjustFrameSize(); return false; }, onToggledFilter: function (e) { Settings.filter.flag = 0; var filters = SideBar.iDoc.getElementsByName("filterType"); for (var i = 0; i < filters.length; i++) { var bitValue = Math.pow(2, i + 1); Settings.filter.flag += (filters[i].checked) ? bitValue : 0; } Settings.saveSettings(); PaginatorHQ.filterResult(); }, onAgeRatingFilter: function (e) { var ars = SideBar.iDoc.getElementsByName("ageRating"); for (var i = 0; i < ars.length; i++) { var val = Math.pow(2, i + 4); Settings.filterSwitchFlag -= (Settings.filterSwitchFlag & val); //Remove the bit switch if (ars[i].checked) Settings.filterSwitchFlag += val; } PaginatorHQ.filterResult(); }, onRadioClick: function (e) { switch (e.target.name) { case "filterSet": Settings.filter.set = e.target.value; SideBar.loadFilterSet(); Settings.saveSettings(); if ((Settings.filterSwitchFlag & 2) == 2) PaginatorHQ.filterResult(); break; case "sortType": Settings.sortType = e.target.value; Settings.saveSettings(); break; } }, onInputFilterValue: function (e) { e.target.value = parseInt(e.target.value); if (e.target.value.length > 6) e.target.value = e.target.value.substring(0, 6); var values = SideBar.sidebar.getElementsByClassName("filterValue"); for (var i = 0; i < values.length; i++) Settings.filters[Settings.filter.set][i] = parseInt(values[i].value); Settings.saveSettings(); if ((Settings.filterSwitchFlag & 2) == 2 && Settings.filter.flag == e.target.nextElementSibling.value) PaginatorHQ.filterResult(); }, onInputTagFilter: function (e) { var name = e.target.id; var btn = SideBar.iDoc.getElementsByName(name)[0].firstElementChild; if (btn.className == "bgiL" && btn.style.borderColor == "rgb(0, 0, 0)") { btn.style.borderColor = "rgb(255, 0, 0)"; } Settings.filter[name] = e.target.value; Settings.saveSettings(); }, loadFilterSet: function () { var values = Settings.filters[Settings.filter.set]; var filters = SideBar.sidebar.getElementsByClassName("filterValue"); for (var i = 0; i < filters.length; i++) filters[i].value = values[i]; } } /* =================================================================================================================================== ===================================================================================================================================*/ var Settings = { filterSwitchFlag: 0, sortType: 0, versionCheck: function (current) { var saved = GM_getValue("Version", "0.0").toString(); var v1 = saved.split("."); var v2 = current.split("."); if (saved != current) alert("(Some) Pixiv++ settings will be reset due to major changes in the update."); if (v1[0] != v2[0]) { var names = GM_listValues(); for (var i = 0; name = names[i], i < names.length; i++) { var skipNames = ["Filters", "DisplayHidden"]; var found = false; for (var j = 0; j < skipNames.length; j++) found = found || (name.indexOf(skipNames[j]) == 0); if (!found) GM_deleteValue(name); } } if (v1[1] != v2[1]) { var names = GM_listValues(); for (var i = 0; name = names[i], i < names.length; i++) { var deleteNames = ["Filters"]; if ("Filters" == name) GM_deleteValue(name); } } GM_setValue("Version", current); }, loadSettings: function () { Settings.versionCheck("126.125"); //GM_setValue("DisplayHidden", 2); Settings.displayHidden = GM_getValue("DisplayHidden", 2); Settings.requestMethod = GM_getValue("RequestMethod", 0); var vals = GM_getValue(Settings.valueName("Generic"), "4094|6|350,1500|500|0|0|0").split("|"); // ----------- Sidebar Display Settings Options (PAGETYPE > 0) Settings.display = makeStruct("artistName illustTitle countList illustLink mangaLinks IQDBLink autoPreview sidebar displayOptions filterOptions"); Settings.setObjectPropertiesByFlag(Settings.display, vals[0]); // ----------- Sidebar Fetch Settings (PAGETYPE > 0) Settings.fetch = makeStruct("nextPage metadata"); Settings.setObjectPropertiesByFlag(Settings.fetch, vals[1]); // ----------- Preview Settings Settings.preview = makeStruct("timeLength height"); Settings.setObjectPropertiesValues(Settings.preview, vals[2].split(",")); // ----------- Other Values Settings.pagingOffset = parseInt(vals[3]); Settings.sortType = parseInt(vals[4]); Settings.filter = new Object(); Settings.filter.flag = parseInt(vals[5]); Settings.filter.set = parseInt(vals[6]); // ----------- Fixed Settings vals = GM_getValue("General", "danbooru|R-18|R-18").split("|"); Settings.IQDBType = vals[0]; Settings.filter.tagsInclude = vals[1]; Settings.filter.tagsExclude = vals[2]; // ----------- Filters vals = GM_getValue("Filters", "5, 10, 5, 10|10, 50, 10, 20|30, 400, 30, 100|50, 1000, 50, 200|80, 2000, 60, 400").split("|"); Settings.filters = new Array(); for (var i = 0; i < 5; i++) Settings.filters[i] = vals[i].split(","); if (Settings.pagingOffset > 3000) Settings.pagingOffset = 3000; }, setObjectPropertiesByFlag: function (obj, flag) { var i = 0; for (var key in obj) { if (obj.hasOwnProperty(key)) { i++; obj[key] = (flag & Math.pow(2, i)) > 0; } } return obj; }, getObjectPropertiesFlag: function (obj) { var i = 0; var flag = 0; for (var key in obj) { if (obj.hasOwnProperty(key)) { i++; if (obj[key]) flag += Math.pow(2, i); } } return flag; }, setObjectPropertiesValues: function (obj, arr) { var i = 0; for (var key in obj) { if (obj.hasOwnProperty(key)) { obj[key] = arr[i]; i++; } } return obj; }, getObjectPropertiesValues: function (obj) { var arr = new Array(); for (var key in obj) if (obj.hasOwnProperty(key)) arr.push(obj[key]); return arr; }, saveSettings: function () { GM_setValue(Settings.valueName("Generic"), Settings.getObjectPropertiesFlag(Settings.display) + "|" + Settings.getObjectPropertiesFlag(Settings.fetch) + "|" + Settings.getObjectPropertiesValues(Settings.preview) + "|" + Settings.pagingOffset + "|" + Settings.sortType + "|" + Settings.filter.flag + "|" + Settings.filter.set); GM_setValue("General", Settings.IQDBType + "|" + Settings.filter.tagsInclude + "|" + Settings.filter.tagsExclude); GM_setValue("Filters", (function () { var val = ""; for (var i = 0; i < 5; i++) val += Settings.filters[i].toString() + ((i < 4) ? "|" : ""); return val; })()); }, valueName: function (name, saveset) { if (!saveset) saveset = PAGETYPE; return "[" + saveset + "] " + name; } } function GetAbsolutePosition(el) { var x = 0; var y = 0; while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { x += el.offsetLeft; y += el.offsetTop; el = el.offsetParent; } return { top: y, left: x }; } function FilterTypeToString(type) { var names = ["Bookmarks", "Views", "Ratings", "Total"]; return names[type]; } function RemoveMessage(msg) { if (msg) { var msgBox = msg.parentElement; msgBox.removeChild(msg); if (msgBox.children.length == 0) msgBox.style.visibility = "hidden"; } } //function AdjustDisplayMessage() //{ // var msgBox = document.getElementById("pppMsgBox"); // if (!msgBox) return; // if (SideBar.iframe) msgBox.style.marginLeft = (SideBar.pinned || (SideBar.iframe.style.visibility != "hidden")) ? SideBar.iframe.offsetWidth + "px" : "0px"; //} function DisplayMessage(msgTxt, timeout) { //text-align: center; display:inline-block; width: 100px; background-color: #D3D3D3; border: 1; var msgBox = document.getElementById("pppMsgBox"); if (!msgBox) { msgBox = document.createElement("span"); msgBox.id = "pppMsgBox"; document.body.appendChild(msgBox); } //AdjustDisplayMessage(); msgBox.style.visibility = null; var msg = document.createElement("div"); msg.textContent = msgTxt; msgBox.appendChild(msg); if (!isNaN(timeout)) setTimeout(RemoveMessage, timeout, msg); return msg } function makeStruct(keys, obj) { if (!obj) obj = {}; var names = keys.split(" ").sort(); for (var i = 0; i < names.length; i++) { obj[names[i]] = obj[names[i]]; } return obj; } /* ================================================================================================= [VYCS] VARIABLE YOU CAN SET =================================================================================================*/ //GM_setValue("RequestMethod", 0); // [1] //GM_setValue("RequestBookmarkCount", 2); //[4] /* [1] Default: 0 Default gets all meta-data using XmlHttpRequest otherwise uses the flags below: 2: Get next pages using GM_XmlHttpRequest 4: Get illustration data using GM_XmlHttpRequest on every page apart from illustration page 8: Get data using GM_XmlHttpRequest on illustration page If you want to use GM_XmlHttpRequest on everything then the value set the value to 14 (2+4+8) [2] Does an extra call to get bookmark if it is missing. Default value is 0. 0: Do not make any extra http request to get bookmark 1: Get bookmark count on every page except illustration page 2: Get bookmark for every page */ /* ================================================================================================= Do not touch =================================================================================================*/ //Removes pop dialog that appears when there isn't a cookie if (window.self === window.top) (function () { PaginatorHQ.addStyle("Adjust-Pixiv", "li.before a img, li.after a img, img._thumbnail {color: white; border: 3px solid; padding: 1px; background-color: white;}" + "li.before a:visited img, li.after a:visited img, a:visited img._thumbnail{color: cyan !important;}" ); console.info("Pixiv Main"); var counter = 0; var id = setInterval(function () { var pop = document.getElementById("register-introduction-modal"); if (pop) pop.getElementsByClassName("close")[0].click(); pop = document.getElementsByClassName("signup-notice"); for (var i = 0; i < pop.length; i++) pop[i].style.display = "none"; counter++; if (counter = 10) clearInterval(id); }, 100); Settings.loadSettings(); if (PAGETYPE >= 0) { console.info("Pixiv++ Initalising"); var els = document.querySelectorAll("a[href^='/jump']"); for (var i = 0; i < els.length; i++) { els[i].href = decodeURIComponent(els[i].href.replace(/.+\/jump\.php\?/, "")); console.log("Direct URL: " + els[i].href); } SideBar.initalise(); PaginatorHQ.intialise(); } }()); /* <script> pixiv.context.illustId = '44305721'; pixiv.context.illustTitle = 'フランスパンこいしちゃんgif'; pixiv.context.userId = '42949'; pixiv.context.userName = 'ゆぬき うた'; pixiv.context.hasQuestionnaire = false; pixiv.context.embedId = '44305721_0286523bc768bf54bbc69e3163d75256'; pixiv.context.explicit = false; pixiv.context.illustSize = [514, 487]; pixiv.context.ugokuIllustData = {"src":"http:\/\/i2.pixiv.net\/img-zip-ugoira\/img\/2014\/06\/25\/21\/24\/51\/44305721_ugoira600x600.zip","mime_type":"image\/jpeg","frames":[{"file":"000000.jpg","delay":100},{"file":"000001.jpg","delay":100},{"file":"000002.jpg","delay":100},{"file":"000003.jpg","delay":100},{"file":"000004.jpg","delay":100},{"file":"000005.jpg","delay":100},{"file":"000006.jpg","delay":100},{"file":"000007.jpg","delay":100},{"file":"000008.jpg","delay":100},{"file":"000009.jpg","delay":100},{"file":"000010.jpg","delay":100},{"file":"000011.jpg","delay":100}]}; pixiv.context.ugokuIllustFullscreenData = {"src":"http:\/\/i2.pixiv.net\/img-zip-ugoira\/img\/2014\/06\/25\/21\/24\/51\/44305721_ugoira1920x1080.zip","mime_type":"image\/jpeg","frames":[{"file":"000000.jpg","delay":100},{"file":"000001.jpg","delay":100},{"file":"000002.jpg","delay":100},{"file":"000003.jpg","delay":100},{"file":"000004.jpg","delay":100},{"file":"000005.jpg","delay":100},{"file":"000006.jpg","delay":100},{"file":"000007.jpg","delay":100},{"file":"000008.jpg","delay":100},{"file":"000009.jpg","delay":100},{"file":"000010.jpg","delay":100},{"file":"000011.jpg","delay":100}]}; </script> http://pixiv.me/<userID> */