var fx_enabled = true;
var fx_speed = 10;
var fx_step = 20;
var fx_limit = 200;

function fx_show(div, recall, h, step){
	if (div.readAttribute('fxfade') == 'out') {
		return;
	}
	if (!fx_enabled) {
		div.show();
		return;
	}
	if (!h || !step) {
		if (div.visible()) {
			return;
		}
		div.show();
		h = div.getHeight();
		if (h / fx_step * fx_speed > fx_limit)
			step = Math.round(h / fx_limit * fx_speed);
		else step = fx_step;
		div.setStyle({height: '0px', overflow: 'hidden'});
		div.setOpacity(0);
		div.writeAttribute('fxfade', 'in');
	}

	var newH = div.getHeight() + step;

	if (newH < h) {
		div.setStyle({'height': newH+'px'});
		div.setOpacity(newH / h);
		fx_show.delay(fx_speed / 1000, div, recall, h, step);
	}
	else {
		div.setStyle({height:'',overflow:''});
		div.setOpacity(1);
		div.writeAttribute('fxfade', null);
		if (typeof recall == 'function') {
			recall();
		}
	}
	div.scrollIntoView(true);
}

function fx_hide(div, recall, h, step){
	if (!div.visible() || div.readAttribute('fxfade') == 'in') {
		return;
	}
	if (!fx_enabled) {
		div.hide();
		return;
	}
	if (!h || !step) {
		h = div.getHeight();
		if (h / fx_step * fx_speed > fx_limit)
			step = Math.round(h / fx_limit * fx_speed);
		else step = fx_step;

		div.setStyle({height: h+'px',overflow:'hidden'});
		div.writeAttribute('fxfade', 'out');
	}

	newH = div.getHeight() - step;

	if (newH > 0) {
		div.setStyle({'height':newH+'px'});
		div.setOpacity(newH / h);
		fx_hide.delay(fx_speed / 1000, div, recall, h, step);
	}
	else {
		div.setStyle({height:'',overflow:''});
		div.hide();
		div.writeAttribute('fxfade', null);
		if (typeof recall == 'function') {
			recall();
		}
	}
}
