modules/snippet.js

aeq = ( function ( aeq ) {
/**
 * @namespace snippet
 * @memberof aeq
 * @type {object}
 */
aeq.snippet = aeq.extend({}, {
	toString: function () {
		return '[object aeq.snippet]';
	},

	// Function for extending the object using objects
	extend: aeq.extend,

	/**
	 * Gets the active comp and alerts the user if no comp is open. It then
	 * creates an undo group and executes a callback function with the comp as
	 * the first argument.
	 * @function activeComp
	 * @memberof aeq.snippet
	 * @param  {String}   undoGroup Name of the undo group
	 * @param  {function} callback  Function to execute that gets the active comp
	 *                              as the first argument
	 * @return {Boolean|Any}        `false` if the function is not executed
	 *         because no comp was selected. Else the value the `callback`
	 *         function returns is returned.
	 */
	activeComp: function ( undoGroup, callback ) {
		var comp = getCompWithAlert();
		if ( comp === null ) return false;
		return aeq.createUndoGroup( undoGroup, callback, [ comp ] );
	},

	/**
	 * Gets the selected layers in the active comp and alerts the user if no comp
	 * is open, or if no layer is selected. It then creates an undo group and
	 * executes a callback function with the layers as the first argument, and the
	 * comp as the second argument.
	 * @memberof aeq.snippet
	 * @param  {String}   undoGroup Name of the undo group
	 * @param  {function} callback  Function to execute that gets the selected
	 * layers as the first argument, and the comp as the second argument.
	 * @return {Boolean|Any}        `false` if the function is not executed because
	 * no comp or layer was selected. Else the value the `callback` function
	 * returns is returned.
	 */
	selectedLayers: function ( undoGroup, callback ) {
		var comp = getCompWithAlert();
		if ( comp === null ) return false;
		var layers = getSelectedLayersWithAlert( comp );
		if ( layers === null ) return false;

		layers = aeq.arrayEx( layers );
		return aeq.createUndoGroup( undoGroup, callback, [ layers, comp ] );
	},

	/**
	 * Gets the selected layers or all layers if no layers are selected, in the
	 * active comp. Alerts the user if no comp is open. It then creates an undo
	 * group and executes a callback function with the layers as the first
	 * argument, and the comp as the second argument.
	 * @memberof aeq.snippet
	 * @param  {String}   undoGroup Name of the undo group.
	 * @param  {function} callback  Function to execute that gets the selected
	 * layers in an ArrayEx as the first argument, and the comp as the second
	 * argument.
	 * @return {Boolean|Any}        `false` if the function is not executed because
	 * no comp was open. Else the value the `callback` function is returned.
	 */
	selectedLayersOrAll: function ( undoGroup, callback ) {
		var comp = getCompWithAlert();
		if ( comp === null ) return false;
		var layers = aeq.getSelectedLayersOrAll( comp );

		layers = aeq.arrayEx( layers );
		return aeq.createUndoGroup( undoGroup, callback, [ layers, comp ] );
	},

	/**
	 * Gets the selected properties in the active comp and alerts the user if no
	 * comp is open, or if no property is selected. It then creates an undo group
	 * and executes a callback function with the properties as the first argument,
	 * and the comp as the second argument.
	 * @memberof aeq.snippet
	 * @param  {String}   undoGroup Name of the undo group
	 * @param  {function} callback  Function to execute that gets the selected
	 * properties in an ArrayEx as the first argument, and the comp as the second
	 * argument.
	 * @return {Boolean|Any}        `false` if the function is not executed.
	 * because no comp or property was selected. Else the value the `callback`
	 * function is returned.
	 */
	selectedProperties: function ( undoGroup, callback ) {
		var comp = getCompWithAlert();
		if ( comp === null ) return false;
		var props = getSelectedPropertiesWithAlert( comp );
		if ( props === null ) return false;

		props = aeq.arrayEx( props );
		return aeq.createUndoGroup( undoGroup, callback, [ props, comp ] );
	},

	/**
	 * Loops through the selected layers in the active comp. Alerts the user if no
	 * comp is open, or no layer is selected. It then creates an undo group
	 * and executes a callback function for each of the layers.
	 * @memberof aeq.snippet
	 * @param  {String}          undoGroup Name of the undo group.
	 * @param  {forEachArrayCallback} callback  Function to execute for each layer.
	 * @return {Boolean|ArrayEx} `false` if the function is not executed because
	 *         no comp was open or no layer selected. Else the layers array is
	 *         returned.
	 */
	forEachSelectedLayer: function ( undoGroup, callback ) {
		return aeq.snippet.selectedLayers( undoGroup, function ( layers ) {
			layers.forEach( callback );
			return layers;
		});
	},

	/**
	 * Loops through the selected layers or all layers if no layers are selected, in the
	 * active comp. Alerts the user if no comp is open. It then creates an undo group
	 * and executes a callback function for each of the layers.
	 * @memberof aeq.snippet
	 * @param  {String}          undoGroup Name of the undo group
	 * @param  {forEachArrayCallback} callback  Function to execute for each layer.
	 * @return {Boolean|ArrayEx}           `false` if the function is not executed
	 *                                     because no comp was open. Else
	 *                                     the layers array are returned.
	 */
	forEachSelectedLayerOrAll: function ( undoGroup, callback ) {
		return aeq.snippet.selectedLayersOrAll( undoGroup, function ( layers ) {
			layers.forEach( callback );
			return layers;
		});
	},

	/**
	 * Loops through the selected properties in the active comp. Alerts the user if no
	 * comp is open, or no properties is selected. It then creates an undo group
	 * and executes a callback function for each of the properties.
	 * @memberof aeq.snippet
	 * @param  {String}          undoGroup Name of the undo group
	 * @param  {forEachArrayCallback} callback  Function to execute for each property.
	 * @return {Boolean|ArrayEx}           `false` if the function is not executed
	 *                                     because no comp was open or no layer
	 *                                     selected. Else the property array
	 *                                     is returned.
	 */
	forEachSelectedProperty: function ( undoGroup, callback ) {
		return aeq.snippet.selectedProperties( undoGroup, function ( props ) {
			props.forEach( callback );
			return props;
		});
	},

	/**
	 * Used for setting the default value in functions. Returns the first argument
	 * is not undefined, else it returns `defaultVal`.
	 *
	 * If `defaultval` is a function, the function will run and its value returned.
	 *
	 * @method
	 * @param  {Any} value      The value to check
	 * @param  {Any} defaultVal The value to use if `value` is `undefined`
	 * @return {Any}            `value` if it is not `undefined`, else `defaultVal`
	 *
	 * @example
	 * function getCustomGreeting() {
	 *     return prompt( 'Enter your greeting!', 'Hello World!' )
	 * }
	 * function say( greeting ) {
	 *     a = aeq.setOrGetDefault( greeting, getCustomGreeting )
	 *     alert( a )
	 * }
	 */
	setOrGetDefault: function ( value, defaultVal ) {
		if ( typeof value !== 'undefined' ) {
			return value;
		}

		if ( typeof defaultVal === 'function' ) {
			return defaultVal();
		}

		return defaultVal;
	}
});

function getCompWithAlert() {
	var comp = aeq.getActiveComp();
	if ( comp === null ) {
		alert( 'No Comp selected' );
	}
	return comp;
}

function getSelectedLayersWithAlert( comp ) {
	if ( comp.selectedLayers.length === 0 ) {
		alert( 'No layers selected' );
		return null;
	}
	return comp.selectedLayers;
}

function getSelectedPropertiesWithAlert( comp ) {
	if ( comp.selectedProperties.length === 0 ) {
		alert( 'No properties selected' );
		return null;
	}
	return comp.selectedProperties;
}

// Function aliases


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