penguin/AstroJS

Javascript framework for my blog

botanjs/src/System/Cycle/Trigger.js

raw ยท 1697 bytes

(function(){
	var ns = __namespace( "System.Cycle.Trigger" );

	/** @type {System.Cycle} */
	var Cycle                   = __import( "System.Cycle" );
	/** @type {System.Debug} */
	var debug                   = __import( "System.Debug" );

	// trigger list
	var tList = [];
	var stepperId = -1;

	var stepper = function( args )
	{
		var thisTime = Date.now();
		var w = 0;

		for (var i = 0, l = tList.length; i < l; i++)
		{
			var f = tList[i];

			if (!f)
				continue;

			if (thisTime > f[2])
			{
				try
				{
					if (f[0]())
					{
						f[1]();
						continue;
					}

					f[2] = thisTime + f[3];
				}
				catch (e)
				{
					debug.Error(e);
					continue;
				}
			}

			tList[w++] = f;
		}

		tList.length = w;
	};

	var registerTrigger = function ( trigger, handler, peekInt )
	{
		tList[ tList.length ] = [ trigger, handler, new Date().getTime() + peekInt, peekInt ]
	};

	var heightTrigger = function ( __element, value, handler )
	{
		var k = function () {
			return ( this.a.clientHeight == this.b );
		}.bind({ a: __element, b: value });

		registerTrigger( k, handler, 50 );
	};

	var transitionTrigger = function (__style, value, handler)
	{
		var k = function ()
		{
			return ( this.a.transition == this.b );
		}.bind({a: __style, b: value });
		registerTrigger( k, handler, 50 );
	};

	var regTick = function( e )
	{
		if( stepperId < 0 )
		{
			stepperId = Cycle.TICK.putStepper( stepper );
		}
	};

	ns.addEventListener( "NS_IMPORT", regTick );

	ns[ NS_EXPORT ]( EX_FUNC, "register", registerTrigger );
	ns[ NS_EXPORT ]( EX_FUNC, "transition", transitionTrigger );
	ns[ NS_EXPORT ]( EX_FUNC, "height", heightTrigger );

	ns[ NS_TRIGGER ]( TGR_IMPORT, regTick );
})();