/**
 * Get archives for content type
 *
 * Specify content type to get taxonomy and month archives.
 * This can be useful for creating taxonomy page templates, dropdown navigation, etc.
 *
 * @since 1.7.1
 * @global object $wp_locale
 * @param array $args Arguments, all optional (see defaults and comments below)
 * @return array Archive data
 */
function ctfw_content_type_archives($args = array())
{
    global $wp_locale;
    // Default arguments
    $args = wp_parse_args($args, array('content_type' => ctfw_current_content_type(), 'specific_archive' => false, 'all_books' => false));
    extract($args);
    // make available as variables
    // Start array
    $archives = array();
    // Blog
    if ('blog' == $content_type) {
        // Categories (alphabetical)
        $taxonomy = 'category';
        if (!$specific_archive || $taxonomy == $specific_archive) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => true));
        }
        // Tag (biggest first)
        $taxonomy = 'post_tag';
        if (!$specific_archive || $taxonomy == $specific_archive) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('orderby' => 'count', 'order' => 'DESC', 'pad_counts' => true));
        }
        // Months
        if (!$specific_archive || 'months' == $specific_archive) {
            $archives['months']['items'] = ctfw_get_month_archives('post');
        }
    }
    // Sermon
    if ('sermon' == $content_type) {
        // Topics (alphabetical)
        $taxonomy = 'ctc_sermon_topic';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => true));
        }
        // Series (newest first)
        $taxonomy = 'ctc_sermon_series';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            // Cache with transient because getting all series / sermons can be intensive
            // It's possible this function is called more than once during a page load
            // so let's cache it for a few seconds so the queries and loops are not repeated
            $transient_name = 'ctfw_content_type_archives_sermon_series';
            // 45 char max
            $transient = get_transient($transient_name);
            if ($transient) {
                // we have it; let's use it
                $series = $transient;
            } else {
                // Get series terms
                $series_terms = get_terms($taxonomy, array('orderby' => 'id', 'order' => 'DESC', 'pad_counts' => true));
                // Loop series
                $series_ids = array();
                $series = array();
                foreach ($series_terms as $series_term) {
                    // Get series IDs
                    $series_ids[] = $series_term->term_id;
                    // Add term to series array with ID as key
                    $series[$series_term->term_id] = $series_term;
                }
                // Get sermons having a series
                $series_sermons = get_posts(array('posts_per_page' => -1, 'post_type' => 'ctc_sermon', 'tax_query' => array(array('taxonomy' => 'ctc_sermon_series', 'field' => 'id', 'terms' => $series_ids))));
                // Loop sermons
                foreach ($series_sermons as $sermon) {
                    // Get series having this sermon
                    $series_with_sermon = wp_get_post_terms($sermon->ID, 'ctc_sermon_series', array('fields' => 'ids'));
                    // Loop series to add sermon
                    foreach ($series_with_sermon as $series_id) {
                        if (isset($series[$series_id])) {
                            if (!isset($series[$series_id]->sermons)) {
                                $series[$series_id]->sermons = array();
                            }
                            $series[$series_id]->sermons[$sermon->ID] = $sermon;
                        }
                    }
                }
                // Loop series to record latest and earliest sermon dates
                foreach ($series as $series_id => $series_data) {
                    $sermons = $series_data->sermons;
                    if ($sermons) {
                        // Latest sermon
                        $values = array_values($sermons);
                        $latest_sermon = array_shift($values);
                        $series[$series_id]->sermon_latest_date = strtotime($latest_sermon->post_date);
                        // Earliest sermon
                        $values = array_values($sermons);
                        $earliest_sermon = end($values);
                        $series[$series_id]->sermon_earliest_date = strtotime($earliest_sermon->post_date);
                    }
                }
                // Re-order series by latest sermon date
                usort($series, 'ctfw_sort_by_latest_sermon');
                // Cache with transient
                set_transient($transient_name, $series, 15);
                // 15 seconds is more than enough for a regular pageload
            }
            // Add to archives array
            $archives[$taxonomy]['items'] = $series;
        }
        // Book (in order of books in Bible)
        $taxonomy = 'ctc_sermon_book';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => true));
            // Re-order according to books in Bible
            if ($archives[$taxonomy]['items']) {
                $reordered_books = array();
                $unmatched_books = array();
                $bible_books = ctfw_bible_books();
                // Loop books in Bible
                foreach ($bible_books['all'] as $bible_book_key => $bible_book) {
                    // Include this book if found in terms
                    $found_book_term = false;
                    foreach ($archives[$taxonomy]['items'] as $book_term) {
                        if (trim(strtolower($book_term->name)) == strtolower($bible_book['name'])) {
                            // Add book data (testament, alternate names)
                            $book_term->book_data = $bible_book;
                            // Add it
                            $reordered_books[] = $book_term;
                            // Stop looking
                            $found_book_term = true;
                            break;
                        }
                    }
                    // Add book if no term was found and argument for empty books is set
                    if (!$found_book_term && $all_books) {
                        // Add name and count
                        $book_term = new stdClass();
                        $book_term->term_id = '';
                        $book_term->name = $bible_book['name'];
                        $book_term->count = 0;
                        // Add book data (testament, alternate names)
                        $book_term->book_data = $bible_book;
                        // Add it
                        $reordered_books[] = $book_term;
                    }
                }
                // Add those not found to end
                foreach ($archives[$taxonomy]['items'] as $book_term) {
                    // Not added to new array?
                    foreach ($bible_books['all'] as $bible_book_key => $bible_book) {
                        $found = false;
                        // Found it?
                        if ($bible_book['name'] == $book_term->name) {
                            $found = true;
                            break;
                        }
                    }
                    // Not found, append to end
                    if (!$found) {
                        $reordered_books[] = $book_term;
                    }
                }
                // Replace books with reordered array
                $archives[$taxonomy]['items'] = $reordered_books;
            }
        }
        // Speakers -- (by count)
        $taxonomy = 'ctc_sermon_speaker';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => true));
        }
        // Months
        if (!$specific_archive || 'months' == $specific_archive) {
            $archives['months']['items'] = ctfw_get_month_archives('ctc_sermon');
        }
    }
    // Event
    if ('event' == $content_type) {
        // Category (alphabetical)
        $taxonomy = 'ctc_event_category';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => false));
        }
        // Months
        // Each theme decides how to handle event archives, if any (such as on a monthly calendar via page template)
        // Therefore, ctfw_content_types must be filtered by theme to add correct URL format for month archives
        if (!$specific_archive || 'months' == $specific_archive) {
            $url_format = ctfw_content_type_data('event', 'month_archive_url_format');
            if (ctfw_is_url($url_format)) {
                // valid URL (e.g. page for a page template exists)
                // Date info
                $month_limit = apply_filters('ctfw_content_type_archives_event_month_limit', 12);
                // show up to X months into the future
                $year_month = date_i18n('Y-m');
                // start with current
                $DateTime = new DateTime($year_month);
                // Loop next X months
                $months_looped = 0;
                while ($months_looped < $month_limit) {
                    // Add month to archives array if has events
                    $count = ctfw_month_events_count($year_month);
                    // get number of event occurences in month
                    if ($count) {
                        // Date
                        $month_ts = strtotime($year_month);
                        $month = date_i18n('n', $month_ts);
                        // e.g. 1
                        $year = date_i18n('Y', $month_ts);
                        // e.g.  2015
                        // Name
                        // 'name' that is automatically localized (key matches taxonomy term object)
                        /* translators: 1: month name, 2: 4-digit year */
                        $name = sprintf(_x('%1$s %2$d', 'month archive', 'church-theme-framework'), $wp_locale->get_month($month), $year);
                        // URL
                        $url = ctfw_events_month_archive_url($year_month);
                        // Add data
                        // Use same format as ctfw_get_month_archives()
                        $archives['months']['items'][$months_looped] = new stdClass();
                        $archives['months']['items'][$months_looped]->year = $year;
                        $archives['months']['items'][$months_looped]->month = $month;
                        $archives['months']['items'][$months_looped]->count = $count;
                        $archives['months']['items'][$months_looped]->post = $count;
                        $archives['months']['items'][$months_looped]->name = $name;
                        $archives['months']['items'][$months_looped]->url = $url;
                    }
                    // Next month
                    $DateTime->modify('+1 month');
                    $year_month = $DateTime->format('Y-m');
                    // PHP 5.2 cannot chain methods
                    $months_looped++;
                }
            }
        }
    }
    // People
    if ('people' == $content_type) {
        // Groups (alphabetical)
        $taxonomy = 'ctc_person_group';
        if (ctfw_ctc_taxonomy_supported($taxonomy) && (!$specific_archive || $taxonomy == $specific_archive)) {
            $archives[$taxonomy]['items'] = get_terms($taxonomy, array('pad_counts' => true));
        }
    }
    // Loop archives
    // Remove those with no items
    // Add archive name and URLs to terms
    foreach ($archives as $archive_key => $archive) {
        // No items, remove archive
        if (empty($archives[$archive_key]['items'])) {
            unset($archives[$archive_key]);
        } else {
            // Month archive
            if ($archive_key == 'months') {
                // Type
                $archives[$archive_key]['type'] = 'months';
                // Name
                $archives[$archive_key]['name'] = _x('Months', 'content type archives', 'church-theme-framework');
            } else {
                // Type
                $archives[$archive_key]['type'] = 'taxonomy';
                // Name
                $taxonomy_data = get_taxonomy($archive_key);
                if (!empty($taxonomy_data->labels->menu_name)) {
                    $archives[$archive_key]['name'] = $taxonomy_data->labels->menu_name;
                    // e.g. "Topics" instead of "Sermon Topics"
                } else {
                    // should never happen, but just in case
                    $archives[$archive_key]['name'] = isset($taxonomy_data->labels->name) ? $taxonomy_data->labels->name : ctfw_make_friendly($archive_key);
                }
                // Loop items
                $archive_items = $archive['items'];
                foreach ($archive['items'] as $archive_item_key => $archive_item) {
                    $archives[$archive_key]['items'][$archive_item_key]->url = !empty($archive_item->term_id) ? get_term_link($archive_item) : '';
                }
            }
            // Move items to end of array so name, etc. is first
            $items = $archives[$archive_key]['items'];
            unset($archives[$archive_key]['items']);
            $archives[$archive_key]['items'] = $items;
        }
    }
    // Specific Archive
    if ($specific_archive) {
        $archives = isset($archives[$specific_archive]) ? $archives[$specific_archive] : array();
    }
    // Make filterable
    $archives = apply_filters('ctfw_content_type_archives', $archives, $args);
    $archives = apply_filters('ctfw_content_type_archives-' . $content_type, $archives, $args);
    return $archives;
}
/**
 * Get content template
 *
 * Loads content-*.php according to post type, post format and whether or not is singular (full) or not (short).
 * Templates will be loaded from partials directory first (if exist); otherwise from root
 *
 * The order in which templates existence is checked is from most specific to least specific.
 * For example, content-post-short.php is checked for before content-post.php and content-post-audio-short.php before content-post-audio.php.
 *
 * These examples are NOT listed in order of priority (read above):
 *
 * content-post.php 				Standard blog post - is_singular or not
 * content-post-full.php 			Standard blog post - is_singular
 * content-post-short.php 			Standard blog post - not is_singular
 * content-post-audio.php			Blog post using audio post format - is_singular or not
 * content-post-audio-full.php		Blog post using audio post format - is_singular
 * content-post-audio-short.php		Blog post using audio post format - not is_singular
 * content-audio.php 				Same as above (but be careful, an 'audio' post type may use this) - is_singular or not
 * content-audio-full.php 			Same as above (but be careful, an 'audio' post type may use this) - is_singular
 * content-audio-short.php 			Same as above (but be careful, an 'audio' post type may use this) - not is_singular
 * content-post-type.php 			Custom post type 'ctc_post_type' made friendly - is_singular or not
 * content-post-type-full.php 		Custom post type 'ctc_post_type' made friendly - is_singular
 * content-post-type-short.php 		Custom post type 'ctc_post_type' made friendly - not is_singular
 * content-ctc_post_type.php  		Same as above but using actual name - is_singular or not
 * content-ctc_post_type-full.php  Same as above but using actual name - is_singular
 * content-ctc_post_type-short.php  Same as above but using actual name - not is_singular
 * content-attachment.php 			Media attachment
 *
 * Now here's an example of how prioerity loading works. *-single and *-full are available depending on
 * whether or not is_singular is or is not true. This example is for when is_singular is not true. If it
 * were true, -full would be checked for instead -short.
 *
 * partials/content-sermon-short.php (or *-full if is_singular)
 * partials/content-sermon.php
 * partials/content-ctc_sermon-short.php
 * partials/content-ctc_sermon.php
 * partials/content-short.php
 * partials/content.php
 * content-sermon-short.php
 * content-sermon.php
 * content-ctc_sermon-short.php
 * content-ctc_sermon.php
 * content-short.php
 * content.php
 *
 * One strategy is to use content-sermon.php for both single (full) and archive (short)
 * by checking is_singular( get_post_type() ) in the partial, which may save on redundant code.
 * The pro of separate partials is better organization and easier child theme overrides.
 *
 * This is based on Justin Tadlock's Hybrid Base 0.1 hybrid_base_get_content_template()
 * function: https://github.com/justintadlock/hybrid-base/blob/0.1/functions.php#L154
 *
 * @since 0.9
 * @return string Template file name if template loaded
 */
function ctfw_get_content_template()
{
    // Templates will be attempted to be loaded in the order they are added to this array
    $templates = array();
    // Get post type
    $post_type = get_post_type();
    $post_type_friendly = ctfw_make_friendly($post_type);
    // "ctc_post_type" is made into "post-type" for friendlier template naming
    // Singular post?
    $singular = is_singular($post_type) ? true : false;
    // Does post type support post formats?
    if (post_type_supports($post_type, 'post-formats')) {
        // Get post format
        $post_format = get_post_format();
        // Has post format
        if ($post_format) {
            // First check for something like content-post-audio.php (blog post using audio post format)
            if ($singular) {
                $templates[] = "content-{$post_type}-{$post_format}-full";
            }
            if (!$singular) {
                $templates[] = "content-{$post_type}-{$post_format}-short";
            }
            $templates[] = "content-{$post_type}-{$post_format}";
            // If that doesn't exist, check simply for content-audio.php (shorter but may conflict with post type name)
            if ($singular) {
                $templates[] = "content-{$post_format}-full";
            }
            if (!$singular) {
                $templates[] = "content-{$post_format}-short";
            }
            $templates[] = "content-{$post_format}";
        }
    }
    // If no post format, load content-post-type.php, where "post-type" is a friendly version of "ctc_post_type"
    if ($post_type_friendly != $post_type) {
        if ($singular) {
            $templates[] = "content-{$post_type_friendly}-full";
        }
        if (!$singular) {
            $templates[] = "content-{$post_type_friendly}-short";
        }
        $templates[] = "content-{$post_type_friendly}";
    }
    // If no friendly post type template, load content-ctc_post_type.php, using the actual post type name
    if ($singular) {
        $templates[] = "content-{$post_type}-full";
    }
    if (!$singular) {
        $templates[] = "content-{$post_type}-short";
    }
    $templates[] = "content-{$post_type}";
    // If all else fails, use the plain vanilla template
    if ($singular) {
        $templates[] = 'content-full';
    }
    if (!$singular) {
        $templates[] = 'content-short';
    }
    $templates[] = 'content';
    // Append .php extension
    foreach ($templates as $template_key => $template) {
        $templates[$template_key] = $template . '.php';
    }
    // Check in partials directory first
    $templates_partials = array();
    foreach ($templates as $template) {
        $templates_partials[] = CTFW_THEME_PARTIAL_DIR . '/' . $template;
    }
    $templates = array_merge($templates_partials, $templates);
    // Load template and return filename if succeeded
    return locate_template($templates, true, false);
}