<?php

/**
 * Possibly amend the loop.
 * 
 * Specify the conditions under which the grid loop should be used.
 *
 * @author Bill Erickson
 * @author Gary Jones
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 *
 * @return boolean Return true of doing the grid loop, false if not. 
 */
function child_is_doing_grid_loop() {

	// Amend this conditional to pick where this grid looping occurs
	// This says to use the grid loop everywhere except single posts and pages
	return ( ! is_single() && ! is_page() );

}

/**
 * Grid Loop Arguments
 * 
 * Specify all the desired grid loop and query arguments
 *
 * @author Bill Erickson
 * @author Gary Jones
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 *
 * @return array $arguments
 */
function child_grid_loop_arguments() {

	$grid_args = array(
		'features'              => 1,
		'feature_content_limit' => 0,
		'feature_image_size'    => 0,
		'feature_image_class'   => 'alignleft post-image',
		'grid_content_limit'    => 0,
		'grid_image_size'       => 'grid-thumbnail',
		'grid_image_class'      => 'alignleft post-image',
		'more'                  => __( 'Continue reading &#x2192;', 'genesis' ),
	);

	$query_args = array(
		'posts_per_page'        => 6,
	);

	return array(
		'grid_args'  => $grid_args,
		'query_args' => $query_args,
	);
}

add_action( 'genesis_before_loop', 'child_prepare_grid_loop' );
/**
 * Prepare Grid Loop.
 * 
 * Swap out the standard loop with the grid and apply classes.
 *
 * @author Gary Jones
 * @author Bill Erickson
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 */
function child_prepare_grid_loop() {

	if ( child_is_doing_grid_loop() ) {
		// Remove the standard loop
		remove_action( 'genesis_loop', 'genesis_do_loop' );
	
		// Use the prepared grid loop
		add_action( 'genesis_loop', 'child_do_grid_loop' );
	
		// Add some extra post classes to the grid loop so we can style the columns
		add_filter( 'genesis_grid_loop_post_class', 'child_grid_loop_post_class' );
	}
	
}

add_action( 'pre_get_posts', 'child_grid_query' );
/**
 * Grid query to get the posts that will appear in the grid.
 * 
 * Any changes to the actual query (posts per page, category…) should be here.
 *
 * @author Bill Erickson
 * @author Gary Jones
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 *
 * @param WP_Query $query
 */
function child_grid_query( $query ) {
	
	// Only apply to main query, if this matches our grid query conditional, and if it isn't in the back-end
	if ( $query->is_main_query() && child_is_doing_grid_loop() && ! is_admin() ) {


		// Get all arguments
		$args = child_grid_loop_arguments();
		
		// Don't edit below, this does the logic to figure out how many posts on each page
		$posts_per_page = $args['query_args']['posts_per_page'];
		$features = $args['grid_args']['features'];
		$offset = 0;
		$paged = $query->query_vars['paged'];
		if ( 0 == $paged )
			// If first page, add number of features to grid posts, so balance is maintained
			$posts_per_page += $features;
		else
			// Keep the offset maintained from our page 1 adjustment
			$offset = ( $paged - 1 ) * $posts_per_page + $features;
		
		$query->set( 'posts_per_page', $posts_per_page );
		$query->set( 'offset', $offset );
	}
	
}

/**
 * Prepare the grid loop.
 * 
 * Only use grid-specific arguments. All query args should be done in the
 * child_grid_query() function.
 *  
 * @author Gary Jones
 * @author Bill Erickson
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 *
 * @uses genesis_grid_loop() Requires Genesis 1.5
 *
 * @global WP_Query $wp_query Post query object.
 */
function child_do_grid_loop() {

	global $wp_query;

	// Grid specific arguments
	$all_args = child_grid_loop_arguments();
	$grid_args = $all_args['grid_args'];

	// Combine with original query
	$args = array_merge( $wp_query->query_vars, $grid_args );

	// Create the Grid Loop
	genesis_grid_loop( $args );

}

/**
 * Add some extra body classes to grid posts.
 * 
 * Change the $columns value to alter how many columns wide the grid uses.
 *
 * @author Gary Jones
 * @author Bill Erickson
 * @link   http://code.garyjones.co.uk/genesis-grid-loop-advanced/
 * 
 * @global array   $_genesis_loop_args
 * @global integer $loop_counter
 *
 * @param array $grid_classes 
 */
function child_grid_loop_post_class( $grid_classes ) {

	global $_genesis_loop_args, $loop_counter;

	// Alter this number to change the number of columns - used to add class names
	$columns = 3;
	
	// Be able to convert the number of columns to the class name in Genesis
	$fractions = array( '', 'half', 'third', 'quarter', 'fifth', 'sixth' );

	// Only want extra classes on grid posts, not feature posts
	if ( $loop_counter >= $_genesis_loop_args['features'] ) {
		// Make a note of which column we're in
		$column_number = ( ( $loop_counter - $_genesis_loop_args['features'] ) % $columns ) + 1;
		
		// Add genesis-grid-column-? class to know how many columns across we are
		$grid_classes[] = sprintf( 'genesis-grid-column-%d', $column_number );

		// Add one-* class to make it correct width
		$grid_classes[] = sprintf( 'one-' . $fractions[$columns - 1], $columns );
		
		// Add a class to the first column, so we're sure of starting a new row with no padding-left
		if ( 1 == $column_number )
			$grid_classes[] = 'first';
	}

	return $grid_classes;

}