function scrollDown(id)
{
	var anchor = document.getElementById(id);
	var url = location.href;

	if (url.indexOf('#') >= 0)
		url = url.substring(0, url.indexOf('#'));

	url += '#' + anchor.name;

	window.location = Utf8.decode(url);;
}


// Retrieve the x coordinate of a positionable object
function getObjectLeft(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.currentStyle)
	{
		result = elem.currentStyle.left;
	}
	else if (elem.style)
	{
		result = elem.style.left;
	}
	else
	{
		result = elem.left;
	}

	return parseInt(result);
}

// Retrieve the y coordinate of a positionable object
function getObjectTop(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.currentStyle)
	{
		result = elem.currentStyle.top;
	}
	else if (elem.style)
	{
		result = elem.style.top;
	}
	else
	{
		result = elem.top;
	}

	return parseInt(result);
}

// Retrieve the rendered width of an element
function getObjectWidth(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.offsetWidth)
	{
		result = elem.offsetWidth;
	}
	else if (elem.clip && elem.clip.width)
	{
		result = elem.clip.width;
	}
	else if (elem.style && elem.style.pixelWidth)
	{
		result = elem.style.pixelWidth;
	}

	return parseInt(result);
}

// Retrieve the rendered height of an element
function getObjectHeight(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.offsetHeight)
	{
		result = elem.offsetHeight;
	}
	else if (elem.clip && elem.clip.height)
	{
		result = elem.clip.height;
	}
	else if (elem.style && elem.style.pixelHeight)
	{
		result = elem.style.pixelHeight;
	}

	return parseInt(result);
}

// Retrieve the rendered width of an element
function getVisibleObjectWidth(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.offsetWidth)
	{
		result = elem.offsetWidth;
	}
	else if (elem.clip && elem.clip.width)
	{
		result = elem.clip.width;
	}
	else if (elem.style && elem.style.pixelWidth)
	{
		result = elem.style.pixelWidth;
	}

	return parseInt(result);
}

// Retrieve the rendered height of an element
function getVisibleObjectHeight(obj)
{
	var elem = obj;
	var result = 0;

	if (elem.offsetHeight)
	{
		result = elem.offsetHeight;
	}
	else if (elem.clip && elem.clip.height)
	{
		result = elem.clip.height;
	}
	else if (elem.style && elem.style.pixelHeight)
	{
		result = elem.style.pixelHeight;
	}

	return parseInt(result);
}

// Move an object by x and/or y pixels
function shiftBy(objStr, outerObjStr, deltaX, deltaY)
{
	obj = document.getElementById(objStr);

	if (obj)
	{
		// equalize incorrect numeric value type
		var units = "px";

		var left = getObjectLeft(obj) + deltaX;
		if (left >= 0 && deltaX > 0)
			left = 0;
		var visibleWidth = getVisibleObjectWidth(document.getElementById(outerObjStr));
		if (left <= visibleWidth - getObjectWidth(obj) && deltaX < 0)
			left = visibleWidth - getObjectWidth(obj);

		var top = getObjectTop(obj) + deltaY;
		if (top >= 0 && deltaY > 0)
			top = 0;
		var visibleHeight = getVisibleObjectHeight(document.getElementById(outerObjStr));
		if (top <= visibleHeight - getObjectHeight(obj) && deltaY > 0)
			top = visibleHeight - getObjectHeight(obj);

		obj.style.left = left + units;
		obj.style.top = top + units;
	}
}

function niceShiftBy(objStr, outerObjStr, deltaX, deltaY, interval)
{
	var obj = document.getElementById(objStr);
	var outerObj = document.getElementById(outerObjStr);

	clearInterval(obj.timer);
	obj.timer = setInterval(repeat, interval);

	function repeat()
	{
		shiftBy(objStr, outerObjStr, deltaX, deltaY, interval);
	}
}

function stopNiceShiftBy(objStr)
{
	var obj = document.getElementById(objStr);
	clearInterval(obj.timer);
}