<?php



/**
 * td_global_blocks.php
 * Here we store the global state of the theme. All globals are here (in theory)
 *  - no td_util loaded, no access to settings
 */

class td_global {

	// Flag set by tdc_zone template
	private static $in_zone = false;

	// Flag set by vc_row template
	private static $in_row = false;

	// Flag set by vc_column template
	private static $in_column = false;

	// Flag set by vc_row_inner template
	private static $in_inner_row = false;

	// Flag set by vc_column_inner template
	private static $in_inner_column = false;

	// Flag set by block
	private static $in_element = false;

	// Flag set by vc_set_custom_column_number
	private static $in_custom_area = false;


	// The column number - default 1
	private static $column_number = 1;

	// The inner column number - default 1
	private static $inner_column_number = 1;


	// The column width - default 1/1 (full width)
	private static $column_width = '1/1';

	// The inner column width - default 1/1 (full width)
	private static $inner_column_width = '1/1';


	// set from td_util::is_pagebuilder_content($post);
	private static $is_page_builder_content;

	// Is 'tdb_templates' custom post type registered by template builder
	private static $is_tdb_registered;

	//theme plugins 'PLUGIN_CONSTANT' => 'hash'
	private static $td_plugins = array(
		'TD_COMPOSER' => '3328da2481dfce47ccb29fd8f8bc649a',
		'TD_CLOUD_LIBRARY' => '63d427d0bf1ccf261a43d975fb1dddb0',
		'TD_SOCIAL_COUNTER' => '75a9ad4c7e2231c25bd1433c610f1cdf',
		'TD_NEWSLETTER' => '34f25c5ed6a393cf646b26fe165682d4',
		'TD_MOBILE_PLUGIN' => '42d7c9614029f8a34674ba4ff7a2b326',
		'AMP' => '___amp___',
	);


	/**
	 * Get the $td_plugins hashes array
	 * @return array
	 */
	static function get_td_plugins() {
		return self::$td_plugins;
	}

	/**
	 * Set the $in_zone
	 * Used in tdc_zone template
	 *
	 * @param $in_zone
	 */
	static function set_in_zone($in_zone) {
		self::$in_zone = $in_zone;
	}

	/**
	 * Just get the $in_zone flag
	 * @return bool
	 */
	static function get_in_zone() {
		return self::$in_zone;
	}

	/**
	 * Set the $in_row
	 * Used in vc_row template
	 *
	 * @param $in_row
	 */
	static function set_in_row($in_row) {
		self::$in_row = $in_row;
	}

	/**
	 * Just get the $in_row flag
	 * @return bool
	 */
	static function get_in_row() {
		return self::$in_row;
	}


	/**
	 * Set the $in_column
	 * Used in vc_column template
	 *
	 * @param $in_column
	 */
	static function set_in_column($in_column) {
		self::$in_column = $in_column;
	}

	/**
	 * Just get the $in_column flag
	 * @return bool
	 */
	static function get_in_column() {
		return self::$in_column;
	}

	/**
	 * Set the $in_inner_row flag
	 * Used in vc_row_inner template
	 *
	 * @param $in_inner_row
	 */
	static function set_in_inner_row($in_inner_row) {
		self::$in_inner_row = $in_inner_row;
	}

	/**
	 * Just get $in_inner_row
	 * @return bool
	 */
	static function get_in_inner_row() {
		return self::$in_inner_row;
	}


	/**
	 * Set the $in_inner_column flag
	 * Used in vc_column_inner template
	 *
	 * @param $in_inner_column
	 */
	static function set_in_inner_column($in_inner_column) {
		self::$in_inner_column = $in_inner_column;
	}

	/**
	 * Just get $in_inner_column
	 * @return bool
	 */
	static function get_in_inner_column() {
		return self::$in_inner_column;
	}


	/**
	 * Set the $in_element
	 * Used by blocks
	 *
	 * @param $in_element
	 */
	static function set_in_element($in_element) {
		self::$in_element = $in_element;
	}

	/**
	 * Just get the $in_element flag
	 * @return bool
	 */
	static function get_in_element() {
		return self::$in_element;
	}


	/**
	 * Set $column_width and $column_number
	 * @param $column_width
	 */
	static function set_column_width($column_width) {
		self::$column_width = $column_width;

		$columns = 1;

		switch ($column_width) {
			case '1/1':
				$columns = 3;
				break;

			case '1/3':
				$columns = 1;
				break;

			case '2/3':
				$columns = 2;
				break;
		}


		/**
		 * For 'page-title-sidebar' current template (the version of page-pagebuilder-title.php file that still has sidebar)
		 * set properly the column number
		 */

		if (td_global::$current_template === 'page-title-sidebar') {
			global $post;

			$td_page = td_util::get_post_meta_array($post->ID, 'td_page');

			//check for this page sidebar position
			if (empty($td_page['td_sidebar_position'])) {
				$sidebar_position_pos = td_util::get_option('tds_page_sidebar_pos');
			} else {
				$sidebar_position_pos = $td_page['td_sidebar_position'];
			}

			if ($sidebar_position_pos !== 'no_sidebar' && $columns > 1) {
				--$columns;
			}
		}

		self::$column_number = $columns;
	}

	/**
	 * Just get $column_width
	 * @return string
	 */
	static function get_column_width() {
		return self::$column_width;
	}

	/**
	 * Set $inner_column_width and $inner_column_number
	 * @param $inner_column_width
	 */
	static function set_inner_column_width($inner_column_width) {
		self::$inner_column_width = $inner_column_width;

		$columns = 1;

		switch (self::$inner_column_width) {

			case '1/1':

				switch (self::$column_number) {
					case 2:
					case 3:
						$columns = self::$column_number;
						break;
				}
				break;

			case '2/3':

				switch (self::$column_number) {
					case 2:
					case 3:
						$columns = 2;
						break;
				}
				break;
		}

		self::$inner_column_number = $columns;
	}

	/**
	 * Just get $inner_column_width
	 * @return string
	 */
	static function get_inner_column_width() {
		return self::$inner_column_width;
	}


	/**
	 * Just get $is_page_builder_content
	 * It doesn't make sense to have a set, so function isn't in 'get' format
	 * @return mixed
	 */
	static function is_page_builder_content() {

		if (!isset(self::$is_page_builder_content)) {
			global $post;
			self::$is_page_builder_content = td_util::is_pagebuilder_content($post);
		}
		return self::$is_page_builder_content;
	}


	/**
	 * Used only in custom area templates (there where we aren't in row. For example: footer, sidebar, etc)
	 * Set $column_number to be later used by 'vc_get_column_number' (from block render)	 *
	 * @param $column_number
	 */
	static function vc_set_custom_column_number($column_number) {
		self::$in_custom_area = true;
		self::$column_number = $column_number;
	}

	static function vc_get_column_number() {

		if (self::$in_row || self::$in_custom_area) {
			if (self::$in_inner_row) {
				return self::$inner_column_number;
			}
			return self::$column_number;

		} else {

			// For special situations like sidebar, or any place outside of row or custom area, where 1 column should be.
			return 1;
		}
	}




	/**
	 * @deprecated
	 * @var :)
	 */
    //static $td_options; //here we store all the options of the theme will be used in td_first_install.php

    static $current_template = ''; //used by page-homepage-loop, 404

    static $current_author_obj; //set by the author page template, used by widgets

    static $cur_url_page_id; //the id of the main page (if we have loop in loop, it will return the id of the page that has the uri)

    static $load_sidebar_from_template; //used by some templates for custom sidebars (setted by page-homepage-loop.php etc)

    static $load_featured_img_from_template; //used by single.php to instruct td_module_single to load the full with thumb when necessary (ex. no sidebars)

    static $cur_single_template_sidebar_pos = ''; // set in single.php - used by the gallery short code to show appropriate images

    static $cur_single_template = ''; /** @var string set here: @see  */


    static $is_woocommerce_installed = false; // at the end of this file we check if woo commerce is installed
	static $is_bbpress_installed = false; // at the end of this file we check if bbpress is installed


    /**
     * @var stdClass holds the category object
     *      - it's set on pre_get_posts hook @see td_modify_main_query_for_category_page
     *      - WARNING: it can be null on category pages that request a category ID that dosn't exists
     */
    static $current_category_obj;

    //this is used to check for if we are in loop
    //also used for quotes in blocks - check isf the module is displayed on blocks or not
    static $is_wordpress_loop = '';

    static $custom_no_posts_message = '';  /** used to set a custom post message for the template. If this is set to false, the default message will not show @see td_page_generator::no_posts */


    /**
     * @var string used to store texts for: includes/wp_booster/wp-admin/content-metaboxes/td_set_video_meta.php
     * is set in td_config @see td_wp_booster_config::td_global_after
     */
    static $td_wp_admin_text_list = array();


    static $http_or_https = 'http'; //is set below with either http or https string  @see EOF


	//@todo refactor all code to use TEMPLATEPATH instead
    static $get_template_directory = '';  // here we store the value from get_template_directory(); - it looks like the wp function does a lot of stuff each time is called

	//@todo refactor all code to use STYLESHEETPATH instead
    static $get_template_directory_uri = ''; // here we store the value from get_template_directory_uri(); - it looks like the wp function does a lot of stuff each time is called


	static $td_viewport_intervals = array(); // the tdViewport intervals are stored


    /**
     * the js files that the theme uses on the front end (file_id - filename) @see td_wp_booster_config
     * @see td_wp_booster_hooks
     * @var array
     */
    static $js_files = array ();

	// the plugins that are installable via the theme > plugins panel & tgma
    static $theme_plugins_list = array();

	// the plugins that are just for information porpuses (the plugin cannot be installed with tgma, usually because the plugin is to big so we included it in the -tf/plugins folder)
	static $theme_plugins_for_info_list = array();

	static $td_animation_stack_effects = array();




    /**
     * the js files that are used in wp-admin
     * @var array
     */
    static $js_files_for_wp_admin = array (
        'td_wp_admin' => '/includes/wp_booster/wp-admin/js/td_wp_admin.js',
        'td_wp_admin_color_picker' => '/includes/wp_booster/wp-admin/js/td_wp_admin_color_picker.js',
        'td_wp_admin_panel' => '/includes/wp_booster/wp-admin/js/td_wp_admin_panel.js',
        'td_edit_page' => '/includes/wp_booster/wp-admin/js/td_edit_page.js',

        'tdDemoFullInstaller' => '/includes/wp_booster/wp-admin/js/tdDemoFullInstaller.js',
        'td_wp_admin_demos' => '/includes/wp_booster/wp-admin/js/td_wp_admin_demos.js',
        'tdDemoProgressBar' => '/includes/wp_booster/wp-admin/js/tdDemoProgressBar.js',

        'td_page_options' => '/includes/wp_booster/wp-admin/js/td_page_options.js',
        'td_tooltip' => '/includes/wp_booster/wp-admin/js/tooltip.js',
	    'td_confirm' => '/includes/wp_booster/wp-admin/js/tdConfirm.js',
	    'td_detect' => '/includes/wp_booster/js_dev/tdDetect.js'
    );


    // scripts that load only on our panel. This scripts are not minified because ace does not support that
    static $js_files_for_td_theme_panel = array (
        'td_ace' => '/includes/wp_booster/wp-admin/external/ace/ace.js',
        'td_ace_ext_language_tools' => '/includes/wp_booster/wp-admin/external/ace/ext-language_tools.js'
    );



    /**
     * @var array the tinyMCE style formats
     */
    static $tiny_mce_style_formats = array();


    /**
     * @var array
     *
     *  'td_full_width' => array(           - id used in the drop down in tinyMCE
     *      'text' => 'Full width',         - the text that will appear in the dropdown in tinyMCE
     *      'class' => 'td-post-image-full' - the class tha this image style will add to the image
     *  )
     *
     */
    static $tiny_mce_image_style_list = array();


    /**
     * here we store the fields form td-panel -> custom css
     * @var array
     */
    static $theme_panel_custom_css_fields_list = array();


    /**
     * the big grid styles used by the theme. This styles will show up in the panel @see td_panel_categories.php and on each big grid block
     */
    static $big_grid_styles_list = array();


    /**
     * @var array here we keep all the panels from the theme panel
     */
    static $all_theme_panels_list = array();



	static $viewport_settings = array();




    static $translate_languages_list = array(
        'en' => 'English (default)',
        'af' => 'Afrikaans',
        'sq' => 'Albanian',
        'ar' => 'Arabic',
        'hy' => 'Armenian',
        'az' => 'Azerbaijani',
        'eu' => 'Basque',
        'be' => 'Belarusian',
        'bn' => 'Bengali',
        'bs' => 'Bosnian',
        'bg' => 'Bulgarian',
        'ca' => 'Catalan',
        'ceb' => 'Cebuano',
        'ny' => 'Chichewa',
        'zh' => 'Chinese (Simplified)',
        'zh-TW' => 'Chinese (Traditional)',
        'hr' => 'Croatian',
        'cs' => 'Czech',
        'da' => 'Danish',
        'nl' => 'Dutch',
        'eo' => 'Esperanto',
        'et' => 'Estonian',
        'tl' => 'Filipino',
        'fi' => 'Finnish',
        'fr' => 'French',
        'gl' => 'Galician',
        'ka' => 'Georgian',
        'de' => 'German',
        'el' => 'Greek',
        'gu' => 'Gujarati',
        'ht' => 'Haitian Creole',
        'ha' => 'Hausa',
        'iw' => 'Hebrew',
        'hi' => 'Hindi',
        'hmn' => 'Hmong',
        'hu' => 'Hungarian',
        'is' => 'Icelandic',
        'ig' => 'Igbo',
        'id' => 'Indonesian',
        'ga' => 'Irish',
        'it' => 'Italian',
        'ja' => 'Japanese',
        'jw' => 'Javanese',
        'kn' => 'Kannada',
        'kk' => 'Kazakh',
        'km' => 'Khmer',
        'ko' => 'Korean',
        'lo' => 'Lao',
        'la' => 'Latin',
        'lv' => 'Latvian',
        'lt' => 'Lithuanian',
        'mk' => 'Macedonian',
        'mg' => 'Malagasy',
        'ms' => 'Malay',
        'ml' => 'Malayalam',
        'mt' => 'Maltese',
        'mi' => 'Maori',
        'mr' => 'Marathi',
        'mn' => 'Mongolian',
        'my' => 'Myanmar (Burmese)',
        'ne' => 'Nepali',
        'no' => 'Norwegian',
        'fa' => 'Persian',
        'pl' => 'Polish',
        'pt' => 'Portuguese',
        'pa' => 'Punjabi',
        'ro' => 'Romanian',
        'ru' => 'Russian',
        'sr' => 'Serbian',
        'st' => 'Sesotho',
        'si' => 'Sinhala',
        'sk' => 'Slovak',
        'sl' => 'Slovenian',
        'so' => 'Somali',
        'es' => 'Spanish',
        'su' => 'Sundanese',
        'sw' => 'Swahili',
        'sv' => 'Swedish',
        'tg' => 'Tajik',
        'ta' => 'Tamil',
        'te' => 'Telugu',
        'th' => 'Thai',
        'tr' => 'Turkish',
        'uk' => 'Ukrainian',
        'ur' => 'Urdu',
        'uz' => 'Uzbek',
        'vi' => 'Vietnamese',
        'cy' => 'Welsh',
        'yi' => 'Yiddish',
        'yo' => 'Yoruba',
        'zu' => 'Zulu'
    );



    /**
     * stack_filename => stack_name
     * @var array
     */
    public static $demo_list = array ();


    /**
     * the list of fonts used by the theme by default
     * @var array
     */
    public static $default_google_fonts_list = array();


    /**
     * @var array string here we keep the typography settings from the THEME FONTS panel.
     * this is also used by the css compiler
     */
    public static $typography_settings_list = array ();


    /**
     * @var bool
     * set true in @see td_background::wp_head_hook_background_logic if a bg img or color is set
     */
    public static $is_boxed_layout = false;




    // @todo clean this up
    private static $post = '';
    private static $primary_category = '';


    static function load_single_post($post) {

            self::$post = $post;


        /*  ----------------------------------------------------------------------------
            update the primary category Only on single posts :0
         */
        if (is_single()) {
            //read the post setting
            $td_post_theme_settings = td_util::get_post_meta_array(self::$post->ID, 'td_post_theme_settings');
            if (!empty($td_post_theme_settings['td_primary_cat'])) {
                self::$primary_category = $td_post_theme_settings['td_primary_cat'];
                return;
            }

            $categories = get_the_category(self::$post->ID);
            foreach($categories as $category) {
                if ($category->name != TD_FEATURED_CAT) { //ignore the featured category name
                    self::$primary_category = $category->cat_ID;
                    break;
                }
            }
        }
    }


    //used on single posts
    static function get_primary_category_id() {
        if (empty(self::$post->ID)) {
            return get_queried_object_id();
        }
        return self::$primary_category;
    }


    //generate unique_ids
    private static $td_unique_counter = 0;

    static function td_generate_unique_id() {
        self::$td_unique_counter++;
        return 'td_uid_' . self::$td_unique_counter . '_' . uniqid();
    }


	//current ad in panel
	static $current_ad_id = '';


	/**
	 * Detect if 'tdb_templates' custom post type is registered by template builder
	 * @return bool
	 */
    static function is_tdb_registered() {
    	if ( isset( self::$is_tdb_registered ) ) {
    		return self::$is_tdb_registered;
	    }

	    global $wp_post_types;
    	self::$is_tdb_registered = in_array( 'tdb_templates', array_keys ( $wp_post_types ) );

        return self::$is_tdb_registered;
    }


    /**
     * determines if a single template id is a tdb template
     * @param $template_id
     * @param $and_exist
     * @return bool
     */
    static function is_tdb_template($template_id, $and_exist = false ) {
    	if ( substr( $template_id, 0, 4 ) == 'tdb_' ) {

    		if ( $and_exist ) {
			    $query = new WP_Query(
                    array(
                        'p' => self::tdb_get_template_id( $template_id ),
                        'post_type' => 'tdb_templates',
                    )
                );

			    return $query->have_posts();
	        }
	        return true;
	    }
    	return false;
    }


    /**
     * extract the template id from a api_single_template ID
     * @param $template_id
     * @return int
     */
    static function tdb_get_template_id($template_id) {
        return (int) str_replace('tdb_template_', '', $template_id);
    }
}


if (is_ssl()) {
    td_global::$http_or_https = 'https';
}


require_once(ABSPATH . 'wp-admin/includes/plugin.php');
if (is_plugin_active('woocommerce/woocommerce.php')) {
    td_global::$is_woocommerce_installed = true;
}

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
if (is_plugin_active('bbpress/bbpress.php')) {
	td_global::$is_bbpress_installed = true;
}

/**
 * td_global::$get_template_directory must be used instead of get_template_directory()
 * td_global::$get_template_directory_uri must be used instead of get_template_directory_uri()
 *
 * They supplies the get_template_directory() and get_template_directory_uri() if the mobile theme is not activated (actually, the mobile plugin is not activated).
 *
 * If the mobile plugin is activated, they will return the same values, but for doing this it needs to consider the td_mobile_theme class who saves these values. In this case,
 * the get_template_directory() and get_template_directory_uri() returns values corresponding to the mobile theme, and not to the main theme.
 */

$current_theme_name = get_template();

if (empty($current_theme_name) and class_exists('td_mobile_theme')) {
	td_global::$get_template_directory = td_mobile_theme::$main_dir_path;
	td_global::$get_template_directory_uri = td_mobile_theme::$main_uri_path;
} else {
	td_global::$get_template_directory = get_template_directory();
	td_global::$get_template_directory_uri = get_template_directory_uri();
}

