/**
 * 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;
}
/**
 * Events month archive URL
 *
 * Theme can filter ctfw_content_types to specify event month archive URL format.
 * This makes replacements and returns working URL.
 *
 * For example, a theme may have a monthly calendar page template supporting months via query string.
 * This URL helps the framework know what URL to use, such as in ctfw_content_type_archives(), which
 * may be used to create archives nav, page template, widget, etc.
 *
 * @since 1.7.1
 * @param string $year_month Month as YYYY-MM (e.g. 2015-01 for January, 2015)
 * @return string URL to events month archive for the theme
 */
function ctfw_events_month_archive_url($year_month)
{
    $url = '';
    // Get URL format filered in by theme via ctfw_content_types
    $url_format = ctfw_content_type_data('event', 'month_archive_url_format');
    // Is URL provided and valid?
    // It may not be valid if, for example, page having a certain page template not yet setup
    if (ctfw_is_url($url_format)) {
        // valid URL (e.g. page for a page template exists)
        // Date
        $ts = strtotime($year_month);
        $year = date_i18n('Y', $ts);
        // e.g.  2015
        $month = date_i18n('n', $ts);
        // e.g. 1
        $month_padded = date_i18n('m', $ts);
        // e.g. 01
        // Make replacements
        $url = $url_format;
        $url = str_replace('{year}', $year, $url);
        $url = str_replace('{month}', $month, $url);
        $url = str_replace('{month_padded}', $month_padded, $url);
    }
    // Return filtered
    return apply_filters('ctfw_month_archive_url', $url, $year_month);
}