AutoPagerize_Console

AutoPagerizeをサポートするボタン

目前為 2015-12-30 提交的版本,檢視 最新版本

// ==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();
			}
		);
	}

})();