/**********************************************
Visual Effect
**********************************************/
function setOpacity(id, opacity) {
	var objectStyle = document.getElementById(id).style;
	objectStyle.opacity = (opacity / 100);
	objectStyle.MozOpacity = (opacity / 100);
	objectStyle.KhtmlOpacity = (opacity / 100);
	objectStyle.filter = "alpha(opacity=" + opacity + ")";
}

function fade(id, opStart, opEnd, duration, onFadeEnd) {
	setTimeout(function () {
		setOpacity(id, opEnd);
		if (onFadeEnd) onFadeEnd();
	}, duration + 100);
	function fadeInternal(id, opStart, opEnd, duration) {
		if (opStart == opEnd || isNaN(duration) || duration < 0) {
			setOpacity(id, opEnd);
			return;
		}
		setTimeout(function () {
			setOpacity(id, opEnd);
		}, duration);
		var durationInterval = 100;
		var opacityInterval = Math.round(durationInterval * Math.abs(opEnd - opStart)/duration);
		opEnd += (opStart < opEnd)? -opacityInterval : opacityInterval;
		fadeInternal(id, opStart, opEnd, duration - durationInterval);
	}
	fadeInternal(id, opStart, opEnd, duration);
}

/**********************************************
Utilities
**********************************************/
function $(id) {
	var element = document.getElementById(id);
	return element;
}
