package eu.dnetlib.client.shared;

import java.math.BigDecimal;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;

public class FadeIn implements IsWidget{
	private Widget widget;

	protected final int SHOW_TIMER_DELAY = 25; // ms
	private Timer showTimer;

	protected final int HIDE_TIMER_DELAY = 25; // ms
	private Timer hideTimer;

	private static final BigDecimal DELTA = BigDecimal.valueOf(1, 1);

	public FadeIn() {
//		this.widget = new PopupPanel(false, false);
 		this.showTimer = new Timer() {
			@Override
			public void run() {
				String opacityStr = widget.getElement().getStyle().getOpacity();
				boolean increased = false;
				if (!isBlank(opacityStr)) {
					try {
						BigDecimal opacity = new BigDecimal(opacityStr);
						if (opacity.compareTo(new BigDecimal(1)) < 0) {
							widget.getElement().getStyle().setOpacity(opacity.add(DELTA).doubleValue());
							increased = true;
						}
					} catch (NumberFormatException nfe) {
						// fallback to showing
					}
				}
				if (!increased) {
					widget.getElement().getStyle().setOpacity(1);
					cancel();
				}
			}
		};
		this.hideTimer = new Timer() {
			@Override
			public void run() {
				String opacityStr = widget.getElement().getStyle().getOpacity();
				boolean decreased = false;
				if (!isBlank(opacityStr)) {
					try {
						BigDecimal opacity = new BigDecimal(opacityStr);
						if (opacity.compareTo(DELTA) > 0) {
							widget.getElement().getStyle().setOpacity(opacity.subtract(DELTA).doubleValue());
							decreased = true;
						}
					} catch (NumberFormatException nfe) {
						// fallback to hiding
					}
				}
				if (!decreased) {
//					widget.hide();
					widget.getElement().getStyle().setOpacity(0);

					cancel();
				}
			}
		};
	}

	public void show() {
		widget.getElement().getStyle().setOpacity(0);
//		widget.show();
//		widget.setVisible(true);
		showTimer.scheduleRepeating(SHOW_TIMER_DELAY);
	}

	public void hide() {
		showTimer.cancel();
		hideTimer.scheduleRepeating(HIDE_TIMER_DELAY);
	}

	public static boolean isBlank(final String str) {
		return (str == null) || (str.trim().length() == 0);
	}

 	public Widget asWidget() {
 		return widget;
	}

	public Widget getWidget() {
		return widget;
	}

	public void setWidget(Widget widget) {
		this.widget = widget;
	}
}
