// ==UserScript==
// @name            a select
// @description     ver 0.31  2006.09.26
// @namespace       http://f56.aaa.livedoor.jp/~tdnr/ppblog/
// @include         *

// const
var select_border = "dotted 4px red";
var small_scroll = 1;
var big_scroll = 4;

var list_font = "normal normal bold 10px 'ıııı ıııııııııı',Osaka,sans-serif";
var list_color = "Black";
var list_bgcolor = "Whitesmoke";
var list_opacity = 0.7;
var list_id = "a________list";

// global
var windowPageTop = -1;
var linkList = null;
var linkIndex = -1;

window.addEventListener("resize", refreshLinkList, false);

window.addEventListener("keydown", function(e) 
{
	if (!e.ctrlKey) {	// ctrl
		return;
	}

	var value = 0;
	switch(e.keyCode) {
		case 17:
			visibleList();
			break;

		case 38:	// up
			selectedAnchor(small_scroll*-1);
			break;

		case 40:	//	down
			selectedAnchor(small_scroll);
			break;

		case 37:	// right
			selectedAnchor(big_scroll*-1);
			break;

		case 39:	// left
			selectedAnchor(big_scroll);
			break;

		case 13:	// enter
			focusAnchor();
			e.preventDefault();
			break;

		default:
			hiddenList();
			return;
	}
	//e.preventDefault();

}, false);


window.addEventListener("keyup", function(e) 
{
	switch(e.keyCode) {
		case 17:
			hiddenList();
			break;
		default:
			return;
	}
}, false);


function refreshLinkList()
{
	if (linkIndex >= 0) {
		if (linkList[linkIndex].before_border) {
			linkList[linkIndex].style.border = linkList[linkIndex].before_border;
		}
	}

	linkList = new Array();
	var len = document.links.length;

	var index = 0;
	for (var i=0; i<len; i++) {
		if (isDisplay(document.links[i])) {
			linkList[index++] = document.links[i];
		}
	}

	var elements = document.getElementsByTagName("area");
	len = elements.length;
	for (var i=0; i<len; i++) {
		if (isDisplay(elements[i])) {
			linkList[index++] = elements[i];
		}
	}

	windowPageTop = window.pageYOffset;
	linkIndex = -1;

	makeAnchorList();
}


function isDisplay(link)
{
	if (link.offsetTop < window.pageYOffset) {
		return false;
	}

	if (link.offsetTop > (window.pageYOffset + window.innerHeight)) {
		return false;
	}

	if (link.style.visibility == "hidden") {
		alert(link.innerHTML + ":hidden");
	}
	return true;
}

function selectedAnchor(value)
{
	if (window.pageYOffset != windowPageTop) {
		refreshLinkList();
	}

	if (linkList.length == 0) {
		return;
	}

	if (linkIndex >= 0) {
		linkList[linkIndex].style.border = linkList[linkIndex].before_border;
	}

	linkIndex += value;
	if (linkIndex >= linkList.length) {
		linkIndex -= linkList.length;
	}

	if (linkIndex < 0) {
		linkIndex = linkList.length - 1;
	}

	linkList[linkIndex].before_border = linkList[linkIndex].style.border;
	linkList[linkIndex].style.border = select_border;

	var list = document.getElementById(list_id);
	list.selectedIndex = linkIndex;
}


function focusAnchor()
{
	if (linkIndex < 0) {
		return;
	}
	linkList[linkIndex].focus();
}


function makeAnchorList()
{
	var list = document.createElement("select");
	list.id = list_id;
	list.size = 100;

	list.style.font = list_font;
	list.style.color = list_color;
	list.style.backgroundColor = list_bgcolor;
	list.style.opacity = list_opacity;
	list.style.zIndex = 10;
	list.style.visibility = "hidden";

	var len = linkList.length;
	for(var i=0; i<len; i++) {
		var text = document.createTextNode(linkList[i].text);

		var option = document.createElement("option");
		option.value = i;
		option.selected = false;
		option.appendChild(text);

		list.appendChild(option);
	}

	document.body.appendChild(list);
}


function visibleList()
{
	if(document.getElementById(list_id) == undefined) {
		refreshLinkList();
	}

	if (window.pageYOffset != windowPageTop) {
		refreshLinkList();
	}

	var list = document.getElementById(list_id);
	if (list.style.visibility == "visible") {
		return;
	}

	var listWidth = Math.floor(window.innerWidth / 4);

	list.style.position = "absolute";
	list.style.height = window.innerHeight + "px";
	list.style.width = listWidth + "px";

	list.style.top = window.pageYOffset + "px";
	list.style.left = (window.innerWidth - listWidth + window.pageXOffset - 20) + "px";
	list.style.visibility = "visible";
}


function hiddenList()
{
	var list = document.getElementById(list_id);
	if (list == undefined) {
		return;
	}

	list.style.visibility = "hidden";
}

