// ==UserScript==
// @name AutoPagerize_Console
// @namespace phodra
// @description AutoPagerizeをサポートするボタン
// @include http://*
// @include https://*
// @version 3.0
// @grant GM_getResourceText
// @grant GM_getResourceURL
// @grant GM_addStyle
// @resource res_style https://www.dropbox.com/pri/get/greasemonkey/AutoPagerize_Console/AutoPagerize_Console30.css?_subject_uid=458281274&w=AABDSxYNzTf64mrwmUgqrmzCfiwtDNiY5nOsV_KlvSMZWw
// @resource res_scrAll https://www.dropbox.com/pri/get/greasemonkey/AutoPagerize_Console/res_scrAll.png?_subject_uid=458281274&w=AAC1nNQHg54HAcIT9r_wtLfYfooghM9Zz_XSqJlzXoNVWg
// @resource res_scrPage https://www.dropbox.com/pri/get/greasemonkey/AutoPagerize_Console/res_scrPage.png?_subject_uid=458281274&w=AABzAy7HXbTJz6TqislRIdgYome4Hvwe2ew06l1S7yIXAw
// @resource res_tglEnabled https://www.dropbox.com/pri/get/greasemonkey/AutoPagerize_Console/res_tglEnabled.png?_subject_uid=458281274&w=AADgyiqSzgcFlHMk-Vg4OLLxO_rbPEiOwpDx-ZKXWHJ-ng
// @resource res_tglDisabled https://www.dropbox.com/pri/get/greasemonkey/AutoPagerize_Console/res_tglDisabled.png?_subject_uid=458281274&w=AACcYk_tx6l7Li-_pmC9-QogcdK3vcubUeGWgAPkLtumfg
// ==/UserScript==
(function (){
// リソースの定数化
const RES = {
'style': GM_getResourceText("res_style"),
'scrAll': GM_getResourceURL("res_scrAll"),
'scrPage': GM_getResourceURL("res_scrPage"),
'tglEnabled': GM_getResourceURL("res_tglEnabled"),
'tglDisabled': GM_getResourceURL("res_tglDisabled"),
};
// スタイル追加
var apcStyle = GM_addStyle(RES.style);
// スクロール関数(jquery:animate:swingと違いキビキビした感じ)
var PageScroll = function(target, bearing)
{
clearTimeout(timer);
if( target==scTop ) return;
if( bearing==null ) bearing = target-scTop;
var y = (target-scTop)/5;
window.scrollBy( 0,
bearing>0? Math.ceil(y):
bearing<0? Math.floor(y): 0
);
timer = setTimeout(
function()
{
PageScroll( target, bearing);
}, 10
);
if( (bearing<0 && (target>=scTop && target<document.body.clientHeight)) ||
(bearing>0 && target<=scTop) )
{
window.scrollTo( 0, target);
clearTimeout(timer);
}
};
// // 初期化
// var ap;
// var timer, scTop;
// var $pageInfo_dispNow, $pageInfo_dispMax;
// var $pagelist, $pageitem;
//
// var AP_Init = function()
// {
// 初期化
var ap = {
'page': 0,
'seam': [0]
};
var scTop = document.documentElement.scrollTop;
var timer;
// コントロール配置
// パネル(最親)
var $panel = document.createElement("div");
$panel.id = "apc_panel";
$panel.style.display = 'none';
document.body.appendChild($panel);
const APC_BTN = "apc_button";
// コントローラー
var $controller = document.createElement("div");
$controller.id = "apc_controller";
$panel.appendChild($controller);
// enable/disable 切り替え機能
var disp_E = "E", disp_D = "D";
var $ctrToggle = document.createElement("img");
$ctrToggle.id = "apc_ctrToggle";
$ctrToggle.className = APC_BTN;
$ctrToggle.innerText = disp_E;
$ctrToggle.textContent = disp_E;
$ctrToggle.setAttribute('src', RES.tglEnabled);
$controller.appendChild($ctrToggle);
/// トグルイベント
var ap_enable = true;
$ctrToggle.addEventListener(
'click' , function()
{
var e = document.createEvent('Event');
e.initEvent('AutoPagerizeToggleRequest', true, true);
return document.dispatchEvent(e);
}
);
var ApToggle = function(enbl)
{
ap_enable = enbl==null? !ap_enable: enbl;
if( ap_enable )
{
$ctrToggle.textContent = $ctrToggle.innerText = disp_E;
$ctrToggle.setAttribute('src', RES.tglEnabled);
}
else
{
$ctrToggle.textContent = $ctrToggle.innerText = disp_D;
$ctrToggle.setAttribute('src', RES.tglDisabled);
}
console.log(ap_enable);
}
document.addEventListener(
'AutoPagerizeToggleRequest',
function(){
ApToggle();
}
);
document.addEventListener(
'AutoPagerizeDisableRequest',
function(){ ApToggle(false);}
);
document.addEventListener(
'AutoPagerizeEnableRequest',
function(){ ApToggle(true);}
);
// スクローラー
var $scroller = document.createElement("div");
$scroller.id = "apc_scroller";
$panel.appendChild($scroller);
const APC_SCRBTN = APC_BTN + " apc_scrbtn";
// 最上部へ移動
var $scrTop = document.createElement("img");
$scrTop.className = APC_SCRBTN;
$scrTop.id = "apc_scrTop";
$scrTop.setAttribute('src', RES.scrAll);
$scrTop.setAttribute('alt', "↑");
$scrTop.setAttribute('title', "Move to Top");
$scrTop.addEventListener(
'click', function()
{
PageScroll(0);
}
);
$scroller.appendChild($scrTop);
// 最下部へ移動
var $scrBtm = document.createElement("img");
$scrBtm.className = APC_SCRBTN;
$scrBtm.id = "apc_scrBtm";
$scrBtm.setAttribute('src', RES.scrAll);
$scrBtm.setAttribute('alt', "↓");
$scrBtm.setAttribute('title', "Move to Bottom");
$scrBtm.addEventListener(
'click', function()
{
PageScroll( document.body.clientHeight-window.innerHeight );
}
);
$scroller.appendChild($scrBtm);
// 前のページ
var $scrPrv = document.createElement("img");
$scrPrv.className = APC_SCRBTN;
$scrPrv.id = "apc_scrPrv";
$scrPrv.setAttribute('src', RES.scrPage);
$scrPrv.setAttribute('alt', "△");
$scrPrv.setAttribute('title', "Move to Previous");
$scrPrv.addEventListener(
'click', function()
{
PageScroll( scTop==ap.seam[ap.page]?
ap.seam[ap.page-1]: ap.seam[ap.page]
);
}
);
$scroller.appendChild($scrPrv);
// 次のページ
var $scrNxt = document.createElement("img");
$scrNxt.className = APC_SCRBTN;
$scrNxt.id = "apc_scrNxt";
$scrNxt.setAttribute('src', RES.scrPage);
$scrNxt.setAttribute('alt', "▽");
$scrNxt.setAttribute('title', "Move to Next");
$scrNxt.addEventListener(
'click', function()
{
PageScroll( ap.page+1<ap.seam.length?
ap.seam[ap.page+1]:
document.body.clientHeight-window.innerHeight
);
}
);
$scroller.appendChild($scrNxt);
// ページ表示
var $pageInfo = document.createElement("div");
$pageInfo.id = "apc_pageInfo";
var $pageInfo_disp = document.createElement("div");
$pageInfo_disp.id = "apc_pageInfo_disp";
var $pageInfo_dispNow = document.createElement("span");
var $pageInfo_dispMax = document.createElement("span");
$pageInfo_dispNow.innerHTML = $pageInfo_dispMax.innerHTML = "1";
$pageInfo_disp.appendChild($pageInfo_dispNow);
$pageInfo_disp.appendChild( document.createTextNode(" / "));
$pageInfo_disp.appendChild($pageInfo_dispMax);
$pageInfo.appendChild($pageInfo_disp);
$pageInfo.addEventListener(
'mouseover' , function()
{
$pageList.style.display = 'flex';
}
);
$pageInfo.addEventListener(
'mouseout' , function()
{
$pageList.style.display = 'none';
}
);
$panel.appendChild($pageInfo);
// ページリスト
var $pageList = document.createElement("ol");
$pageList.id = "apc_pageList";
$pageList.style.display = 'none';
$pageInfo.appendChild($pageList);
// ページリストアイテム
var $pageList_item = document.createElement("li");
$pageList_item.className = "apc_pageList_item";
$pageList_item.innerHTML = "1";
$pageList.appendChild($pageList_item);
var PageItem_AddEvent = function($elm)
{
$elm.addEventListener(
'click', function()
{
var num = this.innerHTML-1;
PageScroll(
num>=0 && num<ap.seam.length?
ap.seam[num]: 0
);
}
);
$elm.addEventListener(
'dblclick', function()
{
var num = this.innerHTML-2;
window.location = num>=0?
document.getElementsByClassName("autopagerize_link")[num].href:
window.location;
}
);
};
PageItem_AddEvent($pageList_item);
// for( var i = 0; i<5; i++ )
// {
// var $new_pageitem = $pageList_item.cloneNode(true);
// $new_pageitem.innerHTML = i + "t";
// PageItem_AddEvent($new_pageitem);
// $pageList.appendChild($new_pageitem);
// }
// ウィンドウのスクロールが発生した時
window.addEventListener(
'scroll', function()
{
scTop = document.documentElement.scrollTop;
for( var i=ap.seam.length-1; i>=0; i-- )
{
if( scTop >= ap.seam[i]-1 )
{
if( ap.page != i )
{
ap.page = i;
$pageInfo_dispNow.innerHTML = i+1;
}
break;
}
}
}
);
// };
// ページを継ぎ足した時、継ぎ目の位置を記録する
var AP_SeamLine = function()
{
var $ap_sep = document.getElementsByClassName("autopagerize_page_separator");
var len = $ap_sep.length;
var offsety = 0, elm = $ap_sep[len-1];
do
{
offsety += elm.offsetTop || 0;
elm = elm.offsetParent;
}while(elm);
ap.seam[len] = offsety;
$pageInfo_dispMax.innerHTML = len+1;
var $new_pageitem = $pageList_item.cloneNode(true);
$new_pageitem.innerHTML = len+1;
PageItem_AddEvent($new_pageitem);
$pageList.appendChild($new_pageitem);
};
if( window.AutoPagerize )
{
console.log( 'window.AutoPagerize' );
// 初期化
// AP_Init();
$panel.style.display = 'flex';
// 継ぎ足した時
AutoPagerize.addFilter(AP_SeamLine);
}else
{
// document.addEventListener(
// 'GM_AutoPagerizeLoaded',
// function()
// {
// AP_Init();
// }
// );
document.addEventListener(
'GM_AutoPagerizeNextPageLoaded',
function()
{
// 初期設定(GM_AutoPagerizeLoadedでできればいいんだけど……)
// if( ap==null ) AP_Init();
$panel.style.display = 'flex';
AP_SeamLine();
}
);
}
})();