/**
 * glowobject.m
 *
 * @package	com.winamp.maki.lib.community.glowobject
 * @author	mpdeimos
 * @date	18/10/01
 * @version	1.0
 */


#ifndef included
#error This script can only be compiled as a #include
#endif

#define GLOW_TYPE_HOLD 0
#define GLOW_TYPE_FLASH 1
#define GLOW_TYPE_BOUNCE 2

Class GuiObject GlowLayer;
// {
	Member GuiObject GlowLayer.trigger;
// }

Class GuiObject GlowObject;
// {
	Member float GlowObject.fadeInSpeed;
	Member float GlowObject.fadeOutSpeed;
	Member int GlowObject.glowType;
	Member boolean GlowObject.glowing;

	Member GuiObject GlowObject.glow;

	/**
	 * constructor
	 * 
	 * @param GuiObject that will be used to trigger the glow on mouse entering it's region
	 * @param the glowing object
	 * @ret GlowObject object
	 */
	Function GlowObject GlowObject_construct(GlowObject trigger, GlowLayer glow);

	/**
	 * sets fade in time
	 * 
	 * @param GlowObject to act on
	 * @param milliseconds till the glow is at alpha 255
	 */
	Function GlowObject_setFadeInSpeed(GlowObject go, float ms);

	/**
	 * sets fade out time
	 * 
	 * @param GlowObject to act on
	 * @param milliseconds till the glow is at alpha 0
	 */
	Function GlowObject_setFadeOutSpeed(GlowObject go, float ms);

	/**
	 * sets the glowtype used by this glow button.
	 *
	 * @param GlowObject to act on
	 * @param glowType defined via GLOW_TYPE_*
	 */
	Function GlowObject_setGlowType(GlowObject go, int glowType);


	/*
	 * IMPLEMENTATION
	 */

	GlowObject GlowObject_construct(GlowObject trigger, GlowLayer glow)
	{
		if (trigger == null)
		{
			debug("trigger");
		}
		if (glow == NULL)
		{
			debug("glow");
		}
		
		GlowObject go = trigger;
		go.fadeInSpeed = 0.3;
		go.fadeOutSpeed = 0.5;
		go.glow = glow;
		go.glowType = GLOW_TYPE_HOLD;
		go.glowing = false;
		glow.trigger = trigger;
		return go;
	}

	GlowObject_setFadeInSpeed(GlowObject go, float ms)
	{
		go.fadeInSpeed = ms;
	}

	GlowObject_setFadeOutSpeed(GlowObject go, float ms)
	{
		go.fadeOutSpeed = ms;
	}

	GlowObject_setGlowType(GlowObject go, int glowType)
	{
		go.glowType = glowType;
	}

	GlowObject.onEnterArea ()
	{
		GlowObject.glowing = true;
		GlowObject.glow.cancelTarget();
		GlowObject.glow.setTargetA(255);
		GlowObject.glow.setTargetSpeed(GlowObject.fadeInSpeed);
		GlowObject.glow.gotoTarget();
	}

	GlowObject.onLeaveArea ()
	{
		GlowObject.glowing = false;
		if (GlowObject.glowType != GLOW_TYPE_FLASH)
		{
			GlowObject.glow.cancelTarget();
			GlowObject.glow.setTargetA(0);
			GlowObject.glow.setTargetSpeed(GlowObject.fadeOutSpeed);
			GlowObject.glow.gotoTarget();
		}
	}

	GlowLayer.onTargetReached ()
	{
		GlowObject go = GlowLayer.trigger;
		if (go.glowType == GLOW_TYPE_HOLD)
		{
			return;
		}
		else if (go.glowType == GLOW_TYPE_FLASH)
		{
			if (GlowLayer.getAlpha() == 255)
			{
				GlowLayer.cancelTarget();
				GlowLayer.setTargetA(0);
				GlowLayer.setTargetSpeed(GlowObject.fadeOutSpeed);
				GlowLayer.gotoTarget();
			}
		}
		else if (go.glowType == GLOW_TYPE_BOUNCE)
		{
			if (GlowLayer.getAlpha() == 255)
			{
				GlowLayer.cancelTarget();
				GlowLayer.setTargetA(0);
				GlowLayer.setTargetSpeed(GlowObject.fadeOutSpeed);
				GlowLayer.gotoTarget();
			}
			else if (GlowLayer.getAlpha() == 0 && go.glowing)
			{
				GlowLayer.cancelTarget();
				GlowLayer.setTargetA(255);
				GlowLayer.setTargetSpeed(GlowObject.fadeInSpeed);
				GlowLayer.gotoTarget();				
			}
		}		
	}
	
	GlowObject.onSetVisible (Boolean onoff)
	{
		if (onoff)
		{
			GlowObject.glow.show();
		}
		else
		{
			GlowObject.glow.hide();
		}
	
	}
// }