forEach.js

aeq = ( function ( aeq ) {
aeq.extend({

	/**
	 * Loops through the layers of a comp, array of comps, or all layers in the
	 * project, and executes a function for each one.
	 * @method
	 * @memberof aeq
	 * @param  {CompItem|CompItem[]|forEachArrayCallback}   [obj]
	 *         A `CompItem` or array of `compItem`s to get layers from.
	 *         If this is function, the function will loop through all layers in
	 *         the project.
	 * @param  {forEachArrayCallback}
	 *         callback The function to execute for each layer
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachLayer: function ( obj, callback ) {
		if ( aeq.isComp( obj ) ) {
			var length = obj.numLayers,
				i = 1;

			for ( ; i <= length; i++ ) {
				if ( callback( obj.layer( i ), i, obj ) === false ) {
					break;
				}
			}
		} else if ( aeq.isArray( obj ) ) {
			aeq.forEach( obj, function ( obj ) {
				aeq.forEachLayer( obj, callback );
			});
		} else if ( aeq.isFunction( obj ) ) {
			callback = obj;
			aeq.forEachComp( function ( comp ) {
				aeq.forEachLayer( comp, callback );
			});
		}
		return aeq;
	},

	/**
	 * Loops through the properties of a Comp, Layer, PropertyGroup, or an array
	 * of any of them, and executes a function for each one.
	 * @method
	 * @memberof aeq
	 * @param  {CompItem|Layer|PropertyGroup|Array|forEachArrayCallback}   [obj]
	 *         The object or array of objects to get properties from.
	 *         If this is function, the function will loop through all properties
	 *         in the project.
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each property
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachProperty: function ( obj, callback ) {
		if ( aeq.isLayer( obj ) || aeq.isPropertyGroup( obj ) ) {
			var properties = aeq.getPropertyChildren( obj, {});
			aeq.forEach( properties, callback );
		} else if ( aeq.isComp( obj ) ) {
			aeq.forEachLayer( obj, function ( layer ) {
				var properties = aeq.getPropertyChildren( layer, {});
				aeq.forEach( properties, callback );
			});
		} else if ( aeq.isArray( obj ) ) {
			aeq.forEach( obj, function ( obj ) {
				aeq.forEachProperty( obj, callback );
			});
		} else if ( aeq.isFunction( obj ) ) {
			callback = obj;
			aeq.forEachLayer( function ( layer ) {
				aeq.forEachProperty( layer, callback );
			});
		}
		return aeq;
	},

	/**
	 * Loops through the effects in a Comp, or on a Layer, and executes a function
	 * for each one.
	 * @method
	 * @memberof aeq
	 * @param  {CompItem|Layer|Array|forEachArrayCallback}   [obj]
	 *         The object or array of objects to get effects from.
	 *         If this is function, the function will loop through all properties
	 *         in the project.
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each effect
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachEffect: function ( obj, callback ) {
		var i, length, effects;
		if ( aeq.isLayer( obj ) ) {
			effects = obj.property( 'ADBE Effect Parade' );
			length = effects.numProperties;

			for ( i = 1; i <= length; i++ ) {
				if ( callback( effects.property( i ), i, effects ) === false ) {
					break;
				}
			}
		} else if ( aeq.isComp( obj ) ) {
			aeq.forEachLayer( obj, function ( layer ) {
				aeq.forEachEffect( layer, callback );
			});
		} else if ( aeq.isArray( obj ) ) {
			aeq.forEach( obj, function ( obj ) {
				aeq.forEachEffect( obj, callback );
			});
		} else if ( aeq.isFunction( obj ) ) {
			callback = obj;
			aeq.forEachLayer( function ( layer ) {
				aeq.forEachEffect( layer, callback );
			});
		}
		return aeq;
	},

	/**
	 * Loops through the comps in a project and executes a function for each one.
	 * @method
	 * @memberof aeq
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each comp.
	 */
	forEachComp: function ( callback ) {
		aeq.forEach( aeq.getCompositions(), callback );
	},

	/**
	 * Loops through the Project items in a project and executes a function
	 * for each one.
	 * @method
	 * @memberof aeq
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each item.
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachItem: function ( callback ) {
		var project = app.project;
		var items = project.items;
		var length = items.length;
		for ( var i = 1; i <= length; i++ ) {
			if ( callback( items[i], i, project ) === false ) {
				break;
			}
		}
		return aeq;
	},

	/**
	 * Loops through the items in the renderqueue and executes a function
	 * for each one.
	 * @method
	 * @memberof aeq
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each renderQueue Item.
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachRenderQueueItem: function ( callback ) {
		var renderQueue = app.project.renderQueue;
		var renderQueueItems = renderQueue.items;
		var length = renderQueueItems.length;
		for ( var i = 1; i <= length; i++ ) {
			if ( callback( renderQueueItems[i], i, renderQueue ) === false ) {
				break;
			}
		}
		return aeq;
	},

	/**
	 * Loops through the output modules in the renderqueue and executes a function
	 * for each one.
	 * @method
	 * @memberof aeq
	 * @param  {forEachArrayCallback} callback
	 *         The function to execute for each Output Module.
	 * @return {aeq}
	 *         The AEQuery library.
	 */
	forEachOutputModule: function ( callback ) {
		aeq.forEachRenderQueueItem( function ( item ) {
			var length = item.outputModules.length;
			for ( var i = 1; i <= length; i++ ) {
				if ( callback( item.outputModules[i], i, item ) === false ) {
					break;
				}
			}
		});
		return aeq;
	}
});

// ForEach aliases
/**
 * @see aeq.forEachProperty
 * @function
 */
aeq.forEachProp = aeq.forEachProperty;

/**
 * @see aeq.forEachComp
 * @function
 */
aeq.forEachComposition = aeq.forEachComp;

/**
 * @see aeq.forEachRenderQueueItem
 * @function
 */
aeq.forEachRQItem = aeq.forEachRenderQueueItem;

/**
 * @see aeq.forEachOutputModule
 * @function
 */
aeq.forEachOM = aeq.forEachOutputModule;

return aeq;
}( aeq || {}) );