Flash MX 2004 | Timeout class

Created a class from setTimeout out of popular demand. Also added some new features like event dispatching and timeout status.

Links

Code

/* 
Made by fry at friedcellcollective dot net
Use and distribute this freely. Just include this comment block.
Version 2.0+MX2004

init
	usage
		init( debug )
	parameters
		debug	If debug is set to true (default) the Timeout objects are not deleted
	returns
		True if all the methods weren't set before, False if one of the methods were already present on _global
	description
		Will register setTimeout, getTimeout and clearTimeout on _global, so you don't have to use org.fcc.Timeout all the time.
		If you use setTimeout a lot and with huge arguments it's smart to turn debugging off.
		Otherwise you will exeperience a memory leak because all the Timeout objects are left untouched.
	example
		init()	// anything that resolves to false
		init(1) // anything that resolves to true
setTimeout
	usage
		setTimeout( function, interval [, arg1, arg2,...,argn] )
		setTimeout( object, methodName, interval [, arg1, arg2,...,argn] )
		setTimeout( object, method, interval [, arg1, arg2,...,argn] )
	parameters
		function	A reference to a function or an anonymous function object
		object	An object of type Object or MovieClip
		methodName	The name of the method to call on the object parameter
		method	A reference to the method to call on the object parameter
		interval	The time in milliseconds between now and the call to function or method
		arg1, arg2,...,argn	Optional parameters to pass to the function or method
	returns
		A timeout identifier of type Number that you can pass to other methods.
	description
		Public static method; calls a function or a method after a certain time interval has passed.
		Uses the builtin function setInterval.
		Usage 3 allows you to call a method of a certain object with a different scope (the object 'this' inside the method)
	example
		usage 1: 
			setTimeout(function(){trace('timer called');},1000);
			or
			function test(arg) {trace('timer '+arg);}
			setTimeout(test,1000,'called');
		usage 2:
			var test:Object = new Object();
			test.method = function() {trace('timer called');}
			setTimeout(test,"method",1000);
		usage 3:
			var test:Object = new Object();
			test.method = function(arg) {trace('timer '+arg);}
			setTimeout(test,test.method,1000,'called');
clearTimeout
	usage
		clearTimeout( timeoutID )
	parameters
		timeoutID	An id returned from a call to the setTimeout function.
	returns
		Nothing.
	description
		Public static method; clears a call to the setTimeout function.
	example
		var timerID:Number = setTimeout(function(){trace('timer called');},1000);
		clearTimeout(timerID);
getTimeout
	usage
		getTimeout( timeoutID )
	parameters
		timeoutID	An id returned from a call to the setTimeout function.
	returns
		An object of type org.fcc.Timeout.
	description
		Public static method; retrieves the Timeout object.
		Use this method with care cause it might cause memory leaks even if debugging is turned off.
		Use this method to inspect the status of the Timeout object (or to listen to its changes).
		Timeout object has the following properties:
			obj:Object	The scope
			fn:Function	The function/method to execute
			args:Array	All arguments passed to the executed function/method
			interval:Number	Interval in milliseconds
			id:Number	Id of the Timeout
			intid:Number	Id of the Interval (returned by the setInterval)
			status:String	Status of the Timeout; values are "Initializing", "Waiting", "Executed", "Canceled"
			returned	Value the executed function returns (mixed type)
		Timeout object dispatches the following events:
			initialized	When it enters the state of "Waiting"
			executed	When it enters the state of "Executed"
			canceled	When it enters the state of "Canceled"
	example
		var timerID:Number = setTimeout(function(){trace('timer called');},1000);
		var timer:org.fcc.Timeout = getTimeout(timerID);
		trace(timer.status); //returns "Waiting"
*/
import mx.events.*;
class org.fcc.Timeout extends Object {
	public var _sClassName:String = "org.fcc.Timeout";
	public var obj:Object;
	public var fn:Function;
	public var args:Array;
	public var interval:Number;
	public var id:Number;
	public var intid:Number;
	public var status:String;
	public var returned;
	private function dispatchEvent():Void {};
 	private function addEventListener():Void {};
 	private function removeEventListener():Void {};
	private function Timeout() {
		mx.events.EventDispatcher.initialize(this);
		this.obj = null;
		this.fn = null;
		this.args = null;
		this.interval = null;
		this.id = null;
		this.intid = null;
		this.status = "Initializing";
		this.returned = null;
	}
	private function toString():String {
		return "[object "+_sClassName+"]";
	}
	private function valueOf():Number {
		return this.id;
	}
	
	private static var _bDebug:Boolean = true;
	private static var _aTimeouts:Array = new Array();
	public static function init(bDebug:Boolean):Boolean {
		_bDebug = bDebug;
		var _bReturn = true;
		if (_global.setTimeout) _bReturn = false;
		else _global.setTimeout = setTimeout;
		if (_global.getTimeout) _bReturn = false;
		else _global.getTimeout = getTimeout;
		if (_global.clearTimeout) _bReturn = false;
		else _global.clearTimeout = clearTimeout;
		return _bReturn;
	}
	
	public static function setTimeout():Number {
		var oTimer:Timeout = new Timeout();
		var nIndex:Number = 0;
		if (typeof(arguments[nIndex])=='object' || typeof(arguments[nIndex])=='movieclip') oTimer.obj = arguments[nIndex++];
		else oTimer.obj = null;
		oTimer.fn = (typeof(arguments[nIndex])!='function')? oTimer.obj[arguments[nIndex]] : arguments[nIndex];
		oTimer.interval = parseInt(arguments[++nIndex]);
		oTimer.args = arguments.slice(++nIndex);
		if (isNaN(oTimer.interval)) return null;
		oTimer.id = _aTimeouts.length;
		oTimer.intid = setInterval(_execTimeout,oTimer.interval,oTimer.id);
		_aTimeouts[oTimer.id] = oTimer;
		oTimer.status = "Waiting";
		oTimer.dispatchEvent({target:oTimer,type:"initialized"});
		return oTimer.id;
	}
	private static function _execTimeout(id:Number) {
		clearInterval(_aTimeouts[id].intid);
		var _uReturn = _aTimeouts[id].fn.apply(_aTimeouts[id].obj,_aTimeouts[id].args);
		_aTimeouts[id].status = "Executed";
		_aTimeouts[id].returned = _uReturn;
		_aTimeouts[id].dispatchEvent({target:_aTimeouts[id],type:"executed"});
		if (!_bDebug) delete _aTimeouts[id];
		return _uReturn;
	}
	public static function clearTimeout(id:Number):Void {
		clearInterval(_aTimeouts[id].intid);
		_aTimeouts[id].status = "Canceled";
		_aTimeouts[id].dispatchEvent({target:_aTimeouts[id],type:"canceled"});
		if (!_bDebug) delete _aTimeouts[id];
	}	
	public static function getTimeout(id:Number):Timeout {
		return _aTimeouts[id];
	}
}

Valid XHTML 1.1! Valid CSS!