function element(id) { return document.getElementById(id); }
function alfa(ele, value) { value = Math.min(1, Math.max(0, Math.round(value*10)/10)); ele.style.opacity = value; ele.style.filter = 'alpha(opacity=' + (value * 100)+ ')'; }
function fadein(id, time)
{
	var ele = element(id);
	if(ele)
	{
		var start = ele.style.opacity; if(!start) start = 0; else start = parseFloat(start);
		for(var timer in ele.fadetimers) clearTimeout(ele.fadetimers[timer]); ele.fadetimers = Array();
		for(var n = start; n <= 1.05; n += 0.1) ele.fadetimers[n] = setTimeout("alfa(element('" + id + "'), " + n + ")", (n - start) * time);
	}
}
function fadeout(id, time)
{
	var ele = element(id);
	if(ele)
	{
		var start = ele.style.opacity; if(!start) start = 0; else start = parseFloat(start);
		for(var timer in ele.fadetimers) clearTimeout(ele.fadetimers[timer]); ele.fadetimers = Array();
		for(var n = start; n >= -0.5; n -= 0.1) ele.fadetimers[n] = setTimeout("alfa(element('" + id + "'), " + n + ")", (start - n) * time);
	}
}
function linkLocal(href)
{
	var n, loc = location.href;

	if((n = loc.indexOf('#')) != -1) loc = loc.substr(0, n);
	loc += '#';
	return (href && href.indexOf('#') != -1 && href.substr(0, loc.length) == loc);
}
var scrollTimer, scrollSteps = 10;
function scrollCurrentPosition()
{
	if(window.pageYOffset) return window.pageYOffset;
	if(document.body && document.body.scrollTop) return document.body.scrollTop;
	if(document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop;
	return 0;
}
function scrollOnClick(e)
{
	var e = e || window.event, elem = e.target || e.srcElement;
	var n, len, anchors = document.getElementsByTagName('a');
	var target, link, href, offset;

	while(elem)
	{
		if(elem.href) break;
		elem = elem.parentNode;
	}
	if(!elem || !elem.href || (n = elem.href.indexOf('#')) == -1) return true;
	href = elem.href.substr(n + 1);
	if(!href.length) return true;
	for(n = 0, len = anchors.length; n < len; n++)
	{
		link = anchors[n];
		if(link.name == href) break;
	}
	if(n == len) return true;
	
	offset = (link.offsetTop != 0) ? link.offsetTop : link.parentNode.offsetTop;
	clearTimeout(scrollTimer);
	scrollAnimation(href, 0, offset, (scrollCurrentPosition() - offset) / scrollSteps);

	return false;
}
function scrollAnimation(anchor, stage, destination, step)
{
	var ynew;

	stage++;
	if(stage == scrollSteps)
	{
		window.location.hash = anchor;
		ynew = destination;
	}
	else
	{
		ynew = scrollCurrentPosition() - step;
		scrollTimer = setTimeout('scrollAnimation("' + anchor + '",' + stage + ',' + destination + ',' + step + ' )', 10);
	}
	window.scrollTo(0, Math.round(ynew));
}
function scrollAnchors()
{
	var anchors = document.getElementsByTagName('a');
	var n, len, link;

	for(n = 0, len = anchors.length; n < len; n++)
	{
		link = anchors[n];
		if(linkLocal(link.href)) link.onclick = scrollOnClick;
	}
}
function fontHeight(scale)
{
	var div = document.createElement('div');
	var attrs = {fontSize:(scale + 'em'), padding:'0', position:'absolute', lineHeight:(scale + 'em'), visibility:'hidden'};
	var height;

	for(var n in attrs){ div.style[n] = attrs[n]; }
	div.appendChild(document.createTextNode('M'));
	document.body.appendChild(div);
	height = div.offsetHeight;
	document.body.removeChild(div);

	return height;
}
function hiddenLoad(parentid, id)
{
	element(parentid).onmouseover = function () { hiddenOver(id); };
	element(parentid).onmouseout = function () { hiddenOut(id); };
	alfa(element(id), 0);
}
function hiddenHide(id) { alfa(element(id), 0); }
function hiddenOver(id) { fadein(id, 250); }
function hiddenOut(id) { fadeout(id, 250); }
function editAreaResize()
{
	var height, footer, area, content, clientheight;

	footer = element('editfooter');
	area = element('editarea');
	content = element('editcontent');
	clientheight = window.innerHeight || document.documentElement.clientHeight;
	if(footer && content && area && clientheight > 0 && (height = clientheight - area.offsetTop - footer.offsetHeight - fontHeight(1.4) - 4) > 0)
		content.style.height = height + 'px';
}
function editAreaLoad()
{
	var area = element('editcontent');
	
	if(!area) return;
	area.onkeydown = editAreaOnKeyDown;
	area.onblur = function(e) { if(this.lastKey == 9) this.focus(); };
	area.onfocus = function(e) { this.lastKey = undefined; }
	editAreaResize();
	window.onresize = editAreaResize;
}
function editAreaReplace(element, key, replace)
{
	var start, end, range;

	if(element.setSelectionRange)
	{
		start = element.selectionStart;
		end = element.selectionEnd;
		element.value = element.value.substr(0, start) + replace + element.value.substr(end);
		element.setSelectionRange(start + 1, start + 1);
	}
	else if(document.selection)
	{
		range = document.selection.createRange();
		range.text = replace;
		range.collapse(false);
		range.select();
	}
	element.lastKey = key;

	return false;
}
function editAreaOnKeyDown(e)
{
	var e = e || window.event;
	var key = e.which || e.keyCode;

	if(key == 9 && !e.shiftKey && !e.ctrlKey && !e.altKey) return editAreaReplace(this, key, '\t');
	else if(key == 32 && (e.shiftKey || e.ctrlKey || e.altKey)) return editAreaReplace(this, key, '\u00a0');

	return true;
}
function authFocus()
{
	var auth = element('auth-pass');
	if(auth) auth.focus();
}
function load()
{
	hiddenLoad('page-tools', 'page-tools');
	hiddenLoad('page-top', 'page-toplabel');
	hiddenLoad('page-bottom', 'page-bottomlabel');
	scrollAnchors();
	editAreaLoad();
	authFocus();
}
window.onload = load;

