function findPosX(obj)
// Compliments of Quirksmode.org
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
// Compliments of Quirksmode.org
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function positionIt(rubyText,rubyBase) {
	var rtest = $(rubyText);
	var rbase = $(rubyBase);
	Element.cleanWhitespace(document.getElementsByTagName('RUBY')[0]);
	Element.remove(rtest);
	var bodyObj = document.getElementsByTagName("BODY");
	var newRuby = document.createElement('rt');
	newRuby.innerHTML = rtest.innerHTML;
	newRuby.setAttribute("style","display: inline-block; position: absolute;");
	$("div1").appendChild(newRuby);
    newRuby.style.left = findPosX(rbase) + "px";
    newRuby.style.top = (findPosY(rbase) - 17) + "px";
  return;
}

function positionRubyText() {
	document.getElementsByTagName('BODY')[0].style.position = "relative";
	for(i = 0; i < document.getElementsByTagName('RUBY').length; i++) {
		var relem = document.getElementsByTagName('RUBY')[i];
			Element.cleanWhitespace(relem);
		var rbase = relem.getElementsByTagName('RB')[0];
			rbase.style.whiteSpace = "pre";
			// Setting white-space to "pre" prevents base text from wrapping.
		var rtext = relem.getElementsByTagName('RT')[0];
			rtext.style.display = "none";
		var newRuby = document.createElement('RT');
			newRuby.innerHTML = rtext.innerHTML;
			newRuby.setAttribute("style","display: inline-block; position: absolute;");
			newRuby.setAttribute("class","rubytext");
		// $("div1").appendChild(newRuby);
		document.getElementsByTagName('BODY')[0].appendChild(newRuby);
    newRuby.style.left = findPosX(rbase) + "px";
    newRuby.style.top = (findPosY(rbase) - (Element.getHeight(rbase)/2) - 1) + "px";
    // When we append newRuby to the body tag, dividing the height by 2 becomes
    // necessary. It's not clear why this is.
	}
	return;
}

function repositionRubyText() {
	var j = 0;
	for(i=0; i < document.getElementsByTagName('RT').length; i++) {
		var currentRuby = document.getElementsByTagName('RT')[i];
		if (currentRuby.className == "rubytext") {
			var rbase = document.getElementsByTagName('RB')[j];
			j++;
			currentRuby.style.left = findPosX(rbase) + "px";
    	currentRuby.style.top = (findPosY(rbase) - (Element.getHeight(rbase)/2) - 1) + "px";
		}
	}
	// $("message").innerHTML = "font size is " + monitorFontSize();
	return;
}

function monitorFontSize() {
	var f = document.defaultView.getComputedStyle($("div1"),null).getPropertyValue("font-size");
	return f;
}

function positionRuby() {	

	var agt=navigator.userAgent.toLowerCase();

	if ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)) { return; }

	positionRubyText();
	
	window.onresize = repositionRubyText;
	
	new PeriodicalExecuter(repositionRubyText,1);
	// Uses Prototype; this is to reposition ruby text in the event of a text resize
	// or other unexpected layout shift.
	
}