// ==UserScript==
// @name           HatenaRssRolling
// @author         ma.la <timpo@ma.la>
// @description    add some keybinds to HatenaRss
// @namespace      http://www.hatena.ne.jp
// @include        http://r.hatena.ne.jp/*
// ==/UserScript==

// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html

(function(){
	var KC = {
		 up    : 38
		,down  : 40
		,left  : 37
		,right : 39
		,shift : 16
		,enter : 13
		,pgup  : 33
		,pgdown: 34
		,home  : 36
		,end   : 35
		,space : 32
	};
	with(KC){
		var ignore = [up,down,space];
		var ignoreList = {};
		for(var i=0;i<ignore.length;i++){
			ignoreList[ignore[i]] = i
		};
	}
	var head = document.getElementById("selectgrouptitle");
	var site = document.getElementById("sitedescription_top");

	var items = document.evaluate(
		'//div[@class="item"]',
		 document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
	);
	var main = (document.evaluate(
		'//div[@class="maincontents"]',
		 document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
	)).snapshotItem(0);
	var offset = 0;
	function reloadItems(){
		items = document.evaluate(
			'//div[@class="item"]',
			 document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
		);
	}
	function clickbutton(e){
		reloadItems();
		var item = items.snapshotItem(0);
		var b = document.evaluate(
			'//button[@class="field"]',
			 item, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
		);
		var button = b.snapshotItem(0);
		if(button){
			button.click();
		}
	}
	function rotate(e){
		if(!init_f){init()}
		var count = e.detail/3;
		var vec = (count < 0)?-1:1;
		if(vec == 1){
			reloadItems();
			var item = items.snapshotItem(0);
			var len  = items.snapshotLength;
			var last = items.snapshotItem(len-1);
			main.insertBefore(item,last.nextSibling);
			if(items.snapshotItem(1)){
				with(items.snapshotItem(1).style){
					MozOpacity = 1;
				}
			}
		}else{
			reloadItems();
			var item = items.snapshotItem(0);
			var len  = items.snapshotLength;
			var last = items.snapshotItem(len-1);
			main.insertBefore(last,item);
			with(last.style){
				MozOpacity = 1;
			}
		}
		if(e.preventDefault){
			e.preventDefault();
		}
		return false;
	}
	function keypress(e){
		if(e.keyCode in ignoreList || !e.keyCode){
			e.preventDefault();
		}
	}
	function keyup(e){
		if(e.keyCode in ignoreList){
			e.preventDefault();
		}
	}
	function keydown(e){
		switch(e.keyCode){
			case KC.up   : rotate({detail:-1});break;
			case KC.down : rotate({detail:1});break;
			case KC.space: clickbutton();break;
			case KC.left : clickbutton();break;
			case KC.right: clickbutton();break;
		}
		if(e.keyCode in ignoreList){
			e.preventDefault();
		}
	}
	function init(){
		for (var i = 1; i < items.snapshotLength; i++){
			var item = items.snapshotItem(i);
			with(item.style){
				MozOpacity = 0.2;
			}
		}
		init_f = 1;
	}
	var init_f = 0;
	if(head){
		head.addEventListener("DOMMouseScroll",rotate,false);
		head.addEventListener("click",clickbutton,false);
		if(site){
			site.addEventListener("DOMMouseScroll",rotate,false);
			site.addEventListener("click",clickbutton,false);
		}
		document.addEventListener("keypress",keypress,false);
		document.addEventListener("keydown",keydown,false);
		document.addEventListener("keyup",keyup,false);
	}
})();

