penguin/AstroJS

Javascript framework for my blog

botanjs/src/System/Cycle/_this.js

raw ยท 2709 bytes

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

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

	var tList = [];

	var C_CALLBACK = 0;
	var C_TIME = 1;
	var C_ONCE = 2;
	var C_ID = 3;
	var C_INTVL = 4;
	var C_REMOVED = 5;

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

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

			if (!f || f[C_REMOVED])
			{
				continue;
			}

			if (thisTime > f[C_TIME])
			{
				try
				{
					f[C_CALLBACK]();
				}
				catch (e)
				{
					debug.Error(e);
					continue;
				}

				if (f[C_REMOVED] || f[C_ONCE])
				{
					continue;
				}

				f[C_TIME] = thisTime + f[C_INTVL];
			}

			tList[w++] = f;
		}

		tList.length = w;
	};

	// Should bind "func" before register
	var registerDelay = function (func, milliSec)
	{
		var a = [];
		a[ C_CALLBACK ] = func;
		a[ C_TIME ] = new Date().getTime() + milliSec;
		a[ C_ONCE ] = true;

		tList[ tList.length ] = a;
	};

	var registerPermanentTicker = function ( id, func, interval )
	{
		for ( var i = 0, l = tList.length; i < l; i ++ )
		{
			if( tList[i][ C_ID ] == id )
				return false;
		}

		var a = [];
		a[ C_CALLBACK ] = func;
		a[ C_TIME ] = new Date().getTime() + interval;
		a[ C_ONCE ] = false;
		a[ C_ID ] = id;
		a[ C_INTVL ] = interval;

		tList[ tList.length ] = a;
		return true;
	};

	var deletePermanentTicker = function ( id )
	{
		// 3: id
		for (var i = 0, l = tList.length; i < l; i++)
		{
			var f = tList[i];

			if (f && f[C_ID] === id)
			{
				f[C_REMOVED] = true;
				return;
			}
		}
	};

	var next = function( func )
	{
		var a = [];
		a[ C_CALLBACK ] = func;
		a[ C_TIME ] = 0;
		a[ C_ONCE ] = true;

		tList[ tList.length ] = a;
	};

	var ourTick = new Tick();
	ourTick.putStepper( stepper );

	var gTickStart = function( e )
	{
		e.target.removeEventListener( "NS_IMPORT", gTickStart );

		var TICK = __import( "System.Cycle.TICK", true );

		if( TICK != ourTick && TICK.started )
		{
			debug.Info( "[System.Cycle] Global Tick exists" );
			ourTick = null;
			return;
		}

		debug.Info( "[System.Cycle] Creating global Tick" );
		ourTick.start();
	};

	ns.addEventListener( "NS_IMPORT", gTickStart );

	ns[ NS_EXPORT ]( EX_FUNC, "next", next );
	ns[ NS_EXPORT ]( EX_FUNC, "delay", registerDelay );
	ns[ NS_EXPORT ]( EX_FUNC, "perma", registerPermanentTicker );
	ns[ NS_EXPORT ]( EX_FUNC, "permaRemove", deletePermanentTicker );
	ns[ NS_EXPORT ]( EX_READONLY_GETTER, "TICK", function(){ return ourTick; } );
})();