// effect.js
// copyright by oursky.net, all rights reserved.

// var keyControl_allowAutoDetect = true;
var keyControl_limitObjects = {
	'TEXTAREA': 1,
	'INPUT': 1,
	'SELECT': 1,
	'A': 1
};
// set to null to allow all prefixes
var keyControl_limitPrefixes = {
	'field': 1,
	'title': 1
};

function keyControl_onKeyDown(e)
{
	// init
	e = e||window.event; if (!e) return {}.undefined;
	var o = e.srcElement||e.target;
	if (o && o.nodeName == '#text') {
		o = o.parentNode;
	}
	if (!o) return {}.undefined;

	switch (e.keyCode) {
	case 13:
		if (self.go && go instanceof Function) {
			go();
			return false;
		}
		var ids = ['defaultObject', 'lnkGo'];
		for (var i in ids) {
			var obj = document.getElementById(ids[i]);
			if (obj) {
				obj.click();
				return false;
			}
		}
		break;
	}
	// condiction
	if (!e.ctrlKey) {
		return {}.undefined;
	}
	var vx, vy;
	vx = vy = 0;
	switch (e.keyCode) {
		case 38: vy --; break; // up
		case 40: vy ++; break; // down
		case 37: vx --; break; // left
		case 39: vx ++; break; // right
		default: return {}.undefined;
	}

	var objToSearch = [o, document.activeElement];
	var srcObj = false;
	for (var i in objToSearch) {
		var obj = objToSearch[i];
		while (obj) {
			if (keyControl_limitObjects[obj.nodeName]) {
				srcObj = obj;
				break;
			}
			obj = obj.parentNode;
		}
		if (srcObj) { break; }
	}
	if (!srcObj) {
		srcObj = o.getElementsByTagName('A')[0] ||
			document.body.getElementsByTagName('A')[0];
		srcObj.focus();
		return false;
	}
	o = srcObj;
	if (!o) {
		return {}.undefined;
	}

	if (o.id) {
		var pos = o.id.split("_");
		var prefix = pos[0];
		if (!keyControl_limitPrefixes
		 || keyControl_limitPrefixes && keyControl_limitPrefixes[prefix]) {
			// search 10 times;
			var y = 1*pos[1] || 0;
			var x = 1*pos[0] || 0;
			var obj;
			for (var i = 0; i < 10; i ++) {
				y += vy;
				x += vx;
				obj = document.getElementById(prefix + '_' + y + '_' + x)
					|| document.getElementById(prefix + '_' + y)
					|| document.getElementById(prefix + '_' + y + '_0');
				if (obj) {
					try { obj.focus(); return false; }
					catch (e) {}
					return {}.undefined;
				}
			}
		}
	}
	o = srcObj;
	var x = o_absLeft(o);
	var y = o_absTop(o);
	var srcTag = o.tagName;
	/*
	if (!self.div) {
		self.div = div = document.createElement('DIV')
		div.style.width = div.style.height = '10px';
		div.style.background = div.style.border = 'black';
		div.style.position = 'absolute';
		document.body.appendChild(div);
		div.appendChild(document.createTextNode('..'));
	}
	// */

	if (document.elementFromPoint) {
		var b = SS.getBody();
		var scrTop = b.scrollTop, scrLeft = b.scrollLeft;
		y += - scrTop +  Number(vy > 0 ? o.offsetHeight : 8);
		x += - scrLeft + Number(vx > 0 ? o.offsetWidth  : 3);
		var max;
		if (vx) {
			max = o.offsetHeight;
		}
		else {
			max = o.offsetWidth;
		}
		self.tmp = 0;
		for (var i = 0; i < 200; i ++) {
			x += vx * 8;
			y += vy * 8;

			for (var j = 0; j < max; j += 8) {
				if (vx) {
					if (kc_tryPose(srcObj, x, y + j, scrTop, scrLeft)) {
						return false;
					}
				}
				else {
					if (kc_tryPose(srcObj, x + j, y, scrTop, scrLeft)) {
						return false;
					}
				}
			}
		}
	}
	// auto detect
	var nodename = o.nodeName;
	while (o.nodeName != 'TD') {
		o = o.parentNode;
		if (!o) break;
	}
	if (o && o.nodeName == 'TD') {
		for (var i = 0; i < 10; i ++) {
			o = kc_searchObj(o, vx, vy);
			if (!o) break;
			var found = o.getElementsByTagName(nodename);
			if (found && found[0]) {
				try { found[0].focus(); return false; }
				catch (e) {}
				return {}.undefined;
			}
		}
	}
	return {}.undefined;
}

function kc_tryPose(srcObj, xx, yy, scrTop, scrLeft) {
	var o = document.elementFromPoint(xx, yy + 1);
	if (self.div) {
		setTimeout('\
			self.div.style.left = "' + (xx + scrLeft) + 'px";\
			self.div.style.top = ' + (yy + scrTop) + ' + "px";\
		'
		, self.tmp++ * 300);
	}
	for (var k = 0; o && k < 4; k ++, o = o.parentNode) {
		if (o == srcObj) {
			break;
		}
		var tag = o.tagName;
		if (tag == 'BODY') {
			break;
		}
		if (tag == 'TD') {
			break;
		}
		if (keyControl_limitObjects[tag] && o != srcObj) {
			try { o.focus(); }
			catch (e) {}
			return o;
		}
	}
	return {}.undefined;
}
function kc_searchObj(o, vx, vy) {
	if (vx) {
		o = vx < 0 ? o.previousSibling : o.nextSibling;
	}
	else {
		var cellIdx = o.cellIndex;
		while (o.nodeName != 'TR') {
			o = o.parentNode;
			if (!o) return {}.undefined;
		}
		var obj = vy < 0 ? o.previousSibling : o.nextSibling;
		if (obj) {
			o = obj;
		}
		else {
			switch (o.parentNode.nodeName) {
			case 'TABLE':
			case 'TBODY':
			case 'THEAD':
			case 'TFOOT':
				o = o.parentNode;
				o = vy < 0 ? o.previousSibling : o.nextSibling;
				if (!o) return {}.undefined;
				o = vx < 0 ? o.lastChild : o.firstChild;
				if (!o || o.nodeName != 'TR') return {}.undefined;
				break;
			}
		}
		if (!o) return {}.undefined;
		o = o.cells[cellIdx];
		if (!o) return {}.undefined;
	}
	return o;
}

function keyControl_shiftcheck(e)
{
	e = e || window.event
	e_Prepair(e);
	var o = e.srcElement
	if (o.tagName != 'INPUT' || o.type != 'checkbox') {
		return;
	}
	var begin = keyControl_shiftcheck.beginCheck;
	if (e.shiftKey) {
		if (!begin) {
			return;
		}
		var checks = document.getElementsByName(o.name);
		var checks_l = checks.length;
		if (checks.length <= 1) {
			return;
		}
		var last = keyControl_shiftcheck.beginCheck;
		var beginIdx, endIdx;
		for (var i = 0; i < checks_l; i ++) {
			switch (checks[i]) {
			case o:
				endIdx = i;
				break;
			case last:
				beginIdx = i;
				break;
			}
		}

		if (typeof beginIdx == 'undefined' || typeof endIdx == 'undefined') {
			return;
		}

		if (beginIdx > endIdx) {
			var tmp = endIdx;
			endIdx = beginIdx;
			beginIdx = tmp;
		}

		var checked = begin.checked;
		for (var i = beginIdx; i <= endIdx; i ++) {
			checks[i].checked = checked;
		}
	}
	else {
		keyControl_shiftcheck.beginCheck = o;
	}
}

SS.listen(document, 'keydown', keyControl_onKeyDown);
SS.listen(document, 'click', keyControl_shiftcheck);

scriptscomplete['keycontrol'] = true;
