/**
 * Enqueue Stylesheets and Scripts
 * @since 1.0.0
 */
function tf_enqueue_scripts()
{
    // Get theme version for theme scripts and styles
    $theme_version = wp_get_theme()->display('Version');
    ///////////////////
    //Enqueue styles
    ///////////////////
    // Flow style.css
    wp_enqueue_style('flow-style', get_template_directory_uri() . '/style.css', array(), $theme_version);
    $responsive = TF_Settings::get('disable_responsive');
    if (!$responsive || !checked($responsive, 'on', false)) {
        wp_enqueue_style('themify-media-queries', get_template_directory_uri() . '/media-queries.css', array(), $theme_version);
    }
    if (is_child_theme()) {
        wp_enqueue_style('style', get_stylesheet_uri(), array(), $theme_version);
    }
    ///////////////////
    //Enqueue scripts
    ///////////////////
    // WordPress comment-reply script
    if (is_single() || is_page()) {
        wp_enqueue_script('comment-reply');
    }
}
 /**
  * Register settings to display in settings page.
  * 
  * @since 1.0.0
  */
 public function register_settings()
 {
     global $TF;
     include_once $TF->framework_path() . '/classes/class-tf-settings.php';
     $this->sections_and_settings = apply_filters('tf_settings_and_sections', TF_Settings::get_sections_and_settings(), $this);
     register_setting('tf-settings', 'themify-flow');
     foreach ($this->sections_and_settings as $key => $block) {
         $section = $this->slug . $key;
         add_settings_section($section, $block['title'], $block['callback'], $section);
         foreach ($block['fields'] as $field) {
             add_settings_field($this->slug . $field['id'], $field['label'], array('TF_Settings', $field['type']), $section, $section, array('id' => $field['id'], 'description' => isset($field['description']) ? $field['description'] : null, 'default' => isset($field['default']) ? $field['default'] : null, 'class' => isset($field['class']) ? $field['class'] : null, 'options' => isset($field['options']) ? $field['options'] : null));
         }
     }
 }
 /**
  * Filter body classes
  * 
  * @since 1.0.0
  * @access public
  * @param array $classes 
  * @return array
  */
 public function body_class($classes)
 {
     global $TF, $TF_Layout;
     $classes[] = 'tf_theme-' . $TF->active_theme->slug;
     $classes[] = wp_is_mobile() ? 'touch' : 'no-touch';
     if (TF_Model::is_tf_editor_active()) {
         $classes[] = 'frontend tf_active tf_admin';
     }
     if (TF_Model::is_tf_custom_css_active()) {
         $classes[] = 'tf_custom_css_active';
     }
     if (TF_Model::is_tf_custom_css_active_only()) {
         $classes[] = 'tf_custom_css_active_only';
     }
     if (!empty($TF_Layout->layout_name)) {
         $classes[] = 'tf_template tf_template_' . $TF_Layout->layout_name;
     }
     $responsive = TF_Settings::get('disable_responsive');
     if ($responsive && checked($responsive, 'on', false)) {
         $classes[] = 'tf_responsive_disabled';
     }
     // return the $classes array
     return $classes;
 }
 /**
  * Check if the font passed references a Google Font and if so, enqueue it.
  * 
  * @since 1.0.0
  *
  * @uses TF_Engine_Style_loader::web_fonts
  */
 function maybe_load_fonts()
 {
     if (!empty($this->web_fonts) && is_array($this->web_fonts)) {
         $the_fonts = array();
         foreach ($this->web_fonts as $font) {
             if (is_array($font->variant)) {
                 $font->variant = implode(',', array_filter($font->variant, 'trim'));
             }
             $the_fonts[] = str_replace(' ', '+', $font->name) . ':' . $font->variant;
         }
         $subsets = 'latin';
         $web_fonts_setting = TF_Settings::get('webfonts');
         if (isset($web_fonts_setting['subsets'])) {
             $web_fonts_setting['subsets'] = trim($web_fonts_setting['subsets']);
             if (!empty($web_fonts_setting['subsets'])) {
                 $subsets .= ',' . str_replace(' ', '', $web_fonts_setting['subsets']);
             }
         }
         $the_fonts = implode('|', $the_fonts);
         wp_enqueue_style('tf-google-fonts-' . md5($the_fonts), tf_https_esc('http://fonts.googleapis.com/css') . "?family={$the_fonts}&subset={$subsets}", array('flow-style'));
     }
 }
 /**
  * Grab google fonts lists from api
  * @return array
  */
 public static function grab_remote_google_fonts()
 {
     $web_fonts = TF_Settings::get('webfonts');
     $subsets = isset($web_fonts['subsets']) ? $web_fonts['subsets'] : false;
     $fonts_file_path = self::get_google_fonts_file();
     if ($subsets && '' != $subsets) {
         $user_subsets = explode(',', str_replace(' ', '', $subsets));
     } else {
         $user_subsets = array();
     }
     $subsets = apply_filters('tf_google_fonts_subsets', array_merge(array('latin'), $user_subsets));
     $subsets_count = count($subsets);
     if (isset($GLOBALS['google_fonts_json_file_cache']) && '' != $GLOBALS['google_fonts_json_file_cache']) {
         $response = $GLOBALS['google_fonts_json_file_cache'];
     } else {
         if (!function_exists('WP_Filesystem')) {
             require_once ABSPATH . 'wp-admin/includes/file.php';
         }
         WP_Filesystem();
         global $wp_filesystem;
         $response = $wp_filesystem->get_contents($fonts_file_path);
         if (false === $response) {
             $response = call_user_func('file_get_contents', $fonts_file_path);
             if (false === $response) {
                 ob_start();
                 include_once $fonts_file_path;
                 $response = ob_get_contents();
                 ob_end_clean();
             }
         }
         $GLOBALS['google_fonts_json_file_cache'] = $response;
     }
     $fonts = array();
     if ($response !== false) {
         if (isset($GLOBALS['google_fonts_json_decode_cache']) && '' != $GLOBALS['google_fonts_json_decode_cache']) {
             $results = $GLOBALS['google_fonts_json_decode_cache'];
         } else {
             $results = json_decode($response);
             $GLOBALS['google_fonts_json_decode_cache'] = $results;
         }
         foreach ($results->items as $font) {
             // If user specified additional subsets
             if ($subsets_count > 1) {
                 $font_subsets = $font->subsets;
                 $subsets_match = true;
                 // Check that all specified subsets are available in this font
                 foreach ($subsets as $subset) {
                     if (!in_array($subset, $font_subsets)) {
                         $subsets_match = false;
                     }
                 }
                 // Ok, this font supports all subsets requested by user, add it to the list
                 if ($subsets_match) {
                     $fonts[] = array('family' => $font->family, 'variant' => $font->variants);
                 }
             } else {
                 $fonts[] = array('family' => $font->family, 'variant' => $font->variants);
             }
         }
     }
     return $fonts;
 }