<?php
/*
Plugin Name: TheGem Theme Elements (for Elementor)
Plugin URI: http://codex-themes.com/thegem/
Description: Extended features and functionality for TheGem theme, including rich collection of page elements for Elementor Page Builder.
Author: Codex Themes
Version: 5.12.2
Author URI: http://codex-themes.com/thegem/
TextDomain: thegem
DomainPath: /languages
Elementor tested up to: 4.1.1
*/

if ( ! defined( 'THEGEM_THEME_URI' ) ) {
	define( 'THEGEM_THEME_URI', get_template_directory_uri() );
}
if ( ! defined( 'THEGEM_THEME_VERSION' ) ) {
	define( 'THEGEM_THEME_VERSION', wp_get_theme(wp_get_theme()->get('Template'))->get('Version') );
}
if ( ! defined( 'THEGEM_PAGE_EDITOR' ) ) {
	define( 'THEGEM_PAGE_EDITOR', 'elementor' );
}
if ( ! defined( 'THEGEM_ELEMENTS_ELEMENTOR' ) ) {
	define( 'THEGEM_ELEMENTS_ELEMENTOR', 1 );
}

add_action( 'plugins_loaded', 'thegem_load_textdomain' );
function thegem_load_textdomain() {
	load_plugin_textdomain( 'thegem', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}

if(!function_exists('thegem_is_plugin_active')) {
	function thegem_is_plugin_active($plugin) {
		include_once(ABSPATH . 'wp-admin/includes/plugin.php');
		return is_plugin_active($plugin);
	}
}

if(!function_exists('thegem_user_icons_info_link')) {
function thegem_user_icons_info_link($pack = '') {
	return esc_url(apply_filters('thegem_user_icons_info_link', THEGEM_THEME_URI.'/fonts/icons-list-'.$pack.'.html', $pack));
}
}

/* Get theme option*/
if(!function_exists('thegem_get_current_language')) {
function thegem_get_current_language() {
	static $result;

	if (isset($result)) {
		return $result;
	}

	if(defined('ICL_SITEPRESS_VERSION') && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE) {
		$result = ICL_LANGUAGE_CODE;
		return $result;
	}
	if(defined( 'POLYLANG_VERSION' ) && function_exists('pll_current_language') && pll_current_language('slug')) {
		$result = pll_current_language('slug');
		return $result;
	}

	$result = false;
	return $result;
}
}

if(!function_exists('thegem_get_default_language')) {
function thegem_get_default_language() {
	static $result;

	if (isset($result)) {
		return $result;
	}

	if(defined('ICL_SITEPRESS_VERSION')) {
		global $sitepress;
		if(is_object($sitepress) && $sitepress->get_default_language()) {
			$result = $sitepress->get_default_language();
			return $result;
		}
	}
	if(defined( 'POLYLANG_VERSION' ) && pll_default_language('slug')) {
		$result = pll_default_language('slug');
		return $result;
	}

	$result = false;
	return $result;
}
}

function thegem_home_url( $path = '', $scheme = null ) {
	return home_url( $path, $scheme );
}

function thegem_pll_home_url_white_list( $white_list ) {
	$white_list[] = array( 'function' => 'thegem_home_url' );
	return $white_list;
}
add_filter( 'pll_home_url_white_list', 'thegem_pll_home_url_white_list' );

if (!function_exists('thegem_lazy_loading_enqueue')) {
	function thegem_lazy_loading_enqueue() {
		wp_enqueue_script('thegem-lazy-loading');
		wp_enqueue_style('thegem-lazy-loading-animations');
	}
}

if (!function_exists('thegem_translated_options')) {
	function thegem_translated_options() {
		return apply_filters('thegem_translated_options', array(
			'footer_html', 'top_area_button_text', 'top_area_button_link', 'contacts_address', 'contacts_phone', 'contacts_fax', 'contacts_email', 'contacts_website', 'top_area_contacts_address', 'top_area_contacts_phone', 'top_area_contacts_fax', 'top_area_contacts_email', 'top_area_contacts_website', 'custom_footer', 'header_builder', 'header_builder_sticky', 'post_builder_template', 'portfolio_builder_template', 'blog_archive_builder_template', 'blog_archive_item_builder_template', 'search_builder_template', 'search_item_builder_template', 'logo', 'logo_light', 'small_logo', 'small_logo_light', 'portfolio_archive_page',
			'product_archive_quick_view_text', 'product_archive_cart_button_text', 'product_archive_select_options_button_text', 'product_archive_more_button_text', 'product_archive_filter_by_categories_title', 'product_archive_filter_by_price_title', 'product_archive_filter_by_status_title', 'product_archive_filter_by_status_sale_text', 'product_archive_filter_by_status_stock_text', 'product_archive_filters_text_labels_all_text', 'product_archive_filters_text_labels_clear_text', 'product_archive_filters_text_labels_search_text', 'product_archive_filter_buttons_hidden_show_text', 'product_archive_filter_buttons_hidden_sidebar_title', 'product_archive_filter_buttons_hidden_filter_by_text', 'product_archive_added_cart_text', 'product_archive_added_wishlist_text', 'product_archive_removed_wishlist_text', 'product_archive_view_cart_button_text', 'product_archive_checkout_button_text', 'product_archive_view_wishlist_button_text', 'product_archive_not_found_text',
			'product_page_desc_review_description_title', 'product_page_desc_review_additional_info_title', 'product_page_desc_review_reviews_title', 'product_page_button_add_to_cart_text', 'product_page_button_clear_attributes_text', 'product_page_elements_reviews_text', 'product_page_elements_sku_title', 'product_page_elements_categories_title', 'product_page_elements_tags_title', 'product_page_elements_share_title', 'product_page_elements_upsell_title', 'product_page_elements_related_title',
			'cart_empty_title', 'cart_empty_text', 'cart_elements_cross_sells_title', 'checkout_thank_you_extra', 'product_builder_template', 'product_archive_builder_template', 'cart_builder_template', 'cart_empty_builder_template', 'checkout_builder_template', 'search_layout_mixed_grids_title', 'search_layout_mixed_grids_show_all', 'product_archive_filter_by_attribute_data', 'size_guide_text', 'mini_cart_sidebar_title', 'mini_cart_sidebar_infotext', 'product_page_additional_tabs_data', 'blog_layout_caption_read_more_text', 'website_search_page_title', 'website_search_page_excerpt', 'search_layout_load_more_text', 'mobile_menu_show_this_page_text', 'mobile_menu_back_text'
		));
	}
}

if(!function_exists('thegem_get_option')) {
function thegem_get_option($name, $default = false, $ml_full = false, $clearCache = false) {
	static $ref_options;
	static $cache = [];

	if ($clearCache) {
		$ref_options = null;
		$cache = [];
	}
	$cacheKey = $name.'_'.$default.'_'.$ml_full;

	if (isset($cache[$cacheKey])) {
		return $cache[$cacheKey];
	}

	if (!isset($ref_options)) {
		$ref_options = get_option('thegem_theme_options');
	}
	$options = $ref_options;

	if(isset($options[$name])) {
		$ml_options = thegem_translated_options();
		if(in_array($name, $ml_options) && is_array($options[$name]) && !$ml_full) {
			if(thegem_get_current_language()) {
				if(isset($options[$name][thegem_get_current_language()])) {
					$options[$name] = $options[$name][thegem_get_current_language()];
				} elseif(thegem_get_default_language() && isset($options[$name][thegem_get_default_language()])) {
					$options[$name] = $options[$name][thegem_get_default_language()];
				} else {
					$options[$name] = '';
				}
			}else {
				$options[$name] = reset($options[$name]);
			}
		}
		$result = apply_filters('thegem_option_'.$name, $options[$name]);
		$cache[$cacheKey] = $result;
		return $result;
	}
	$result = apply_filters('thegem_option_'.$name, $default);
	$cache[$cacheKey] = $result;
	return $result;
}
}

/* USER ICON PACK */

if(!function_exists('thegem_icon_userpack_enabled')) {
function thegem_icon_userpack_enabled() {
	return apply_filters('thegem_icon_userpack_enabled', false);
}
}

if(!function_exists('thegem_icon_packs_select_array')) {
function thegem_icon_packs_select_array() {
	$packs = array('elegant' => __('Elegant', 'thegem'), 'material' => __('Material Design', 'thegem'), 'fontawesome' => __('FontAwesome', 'thegem'));
	if(thegem_icon_userpack_enabled()) {
		$packs['userpack'] = __('UserPack', 'thegem');
	}
	return $packs;
}
}

if(!function_exists('thegem_icon_packs_infos')) {
function thegem_icon_packs_infos() {
	ob_start();
?>
<?php _e('Enter icon code', 'thegem'); ?>.
<a class="gem-icon-info gem-icon-info-elegant" href="<?php echo thegem_user_icons_info_link('elegant'); ?>" onclick="tb_show('<?php _e('Icons info', 'thegem'); ?>', this.href+'?TB_iframe=true'); return false;"><?php _e('Show Elegant Icon Codes', 'thegem'); ?></a>
<a class="gem-icon-info gem-icon-info-material" href="<?php echo thegem_user_icons_info_link('material'); ?>" onclick="tb_show('<?php _e('Icons info', 'thegem'); ?>', this.href+'?TB_iframe=true'); return false;"><?php _e('Show Material Design Icon Codes', 'thegem'); ?></a>
<a class="gem-icon-info gem-icon-info-fontawesome" href="<?php echo thegem_user_icons_info_link('fontawesome'); ?>" onclick="tb_show('<?php _e('Icons info', 'thegem'); ?>', this.href+'?TB_iframe=true'); return false;"><?php _e('Show FontAwesome Icon Codes', 'thegem'); ?></a>
<?php if(thegem_icon_userpack_enabled()) : ?>
<a class="gem-icon-info gem-icon-info-userpack" href="<?php echo thegem_user_icons_info_link('userpack'); ?>" onclick="tb_show('<?php _e('Icons info', 'thegem'); ?>', this.href+'?TB_iframe=true'); return false;"><?php _e('Show UserPack Icon Codes', 'thegem'); ?></a>
<?php endif; ?>
<?php
	return ob_get_clean();
}
}


/* META BOXES */

if(!function_exists('thegem_print_select_input')) {
function thegem_print_select_input($values = array(), $value = '', $name = '', $id = '') {
	if(!is_array($values)) {
		$values = array();
	}
?>
	<select name="<?php echo esc_attr($name) ?>" id="<?php echo esc_attr($id); ?>" class="thegem-combobox">
		<?php foreach($values as $key => $title) : ?>
			<option value="<?php echo esc_attr($key); ?>" <?php selected($key, $value); ?>><?php echo esc_html($title); ?></option>
		<?php endforeach; ?>
	</select>
<?php
}
}

if(!function_exists('thegem_print_checkboxes')) {
function thegem_print_checkboxes($values = array(), $value = array(), $name = '', $id_prefix = '', $after = '') {
	if(!is_array($values)) {
		$values = array();
	}
	if(!is_array($value)) {
		$value = array();
	}
?>
	<?php foreach($values as $key => $title) : ?>
		<input name="<?php echo esc_attr($name); ?>" type="checkbox" id="<?php echo esc_attr($id_prefix.'-'.$key); ?>" value="<?php echo esc_attr($key); ?>" <?php checked(in_array($key, $value), 1); ?> />
		<label for="<?php echo esc_attr($id_prefix.'-'.$key); ?>"><?php echo esc_html($title); ?></label>
		<?php echo $after; ?>
	<?php endforeach; ?>
<?php
}
}

if(!function_exists('thegem_add_srcset_rule')) {
	function thegem_add_srcset_rule(&$srcset, $condition, $size, $id=false) {
		if (!$id) {
			$id = get_post_thumbnail_id();
		}
		$im = thegem_generate_thumbnail_src($id, $size);
		$srcset[$condition] = $im[0];
	}
}

if(!function_exists('thegem_srcset_generate_urls')) {
	function thegem_srcset_generate_urls($attachment_id, $srcset) {
		$result = array();
		$thegem_sizes = array_keys(thegem_image_sizes());
		foreach ($srcset as $condition => $size) {
			if (!in_array($size, $thegem_sizes)) {
				continue;
			}
			if(!thegem_get_option('retina_thumbnails_enabled') && $condition !== '1x') {
				continue;
			}
			$im = thegem_generate_thumbnail_src($attachment_id, $size);
			if ($im) {
				$result[$condition] = esc_url($im[0]);
			}
		}
		return $result;
	}
}

if(!function_exists('thegem_srcset_list_to_string')) {
	function thegem_srcset_list_to_string($srcset) {
		if (count($srcset) == 0) {
			return '';
		}
		$srcset_condtions = array();
		foreach ($srcset as $condition => $url) {
			$srcset_condtions[] = $url . ' ' . $condition;
		}
		return implode(', ', $srcset_condtions);
	}
}

if(!function_exists('thegem_generate_picture_sources')) {
	function thegem_generate_picture_sources($attachment_id, $sources) {
		if (!$sources) {
			return '';
		}
		?>
		<?php foreach ($sources as $source): ?>
			<?php
				if(!thegem_get_option('mobile_thumbnails_enabled') && !empty($source['media'])) {
					continue;
				}
				$srcset = thegem_srcset_generate_urls($attachment_id, $source['srcset']);
				if (!$srcset) {
					continue;
				}
			?>
			<source srcset="<?php echo thegem_srcset_list_to_string($srcset); ?>" <?php if(!empty($source['media'])): ?>media="<?php echo esc_attr($source['media']); ?>"<?php endif; ?> <?php if(!empty($source['type'])): ?>type="<?php echo esc_attr($source['type']); ?>"<?php endif; ?> sizes="<?php echo !empty($source['sizes']) ? esc_attr($source['sizes']) : '100vw'; ?>">
		<?php endforeach; ?>
		<?php
	}
}

if(!function_exists('thegem_generate_picture')) {
	function thegem_generate_picture($attachment_id, $default_size, $sources=array(), $attrs=array(), $return_info=false) {
		if (!$attachment_id || (!in_array($default_size, ['full', 'woocommerce_thumbnail', 'woocommerce_single', 'thumbnail', 'medium', 'medium_large', 'large', '1536x1536', '2048x2048']) && !in_array($default_size, array_keys(thegem_image_sizes())))) {
			return '';
		}
		$default_image = thegem_generate_thumbnail_src($attachment_id, $default_size);
		if (!$default_image) {
			return '';
		}
		list($src, $width, $height) = $default_image;
		$hwstring = image_hwstring($width, $height);

		$default_attrs = array('class' => "attachment-$default_size");
		if (empty($attrs['alt'])) {
			$attachment = get_post($attachment_id);
			$attrs['alt'] = trim(strip_tags(get_post_meta($attachment_id, '_wp_attachment_image_alt', true)));
			if ($attachment) {
				if(empty($default_attr['alt']))
					$attrs['alt'] = trim(strip_tags($attachment->post_excerpt));
				if(empty($default_attr['alt']))
					$attrs['alt'] = trim(strip_tags($attachment->post_title));
			}
		}

		$attrs = wp_parse_args($attrs, $default_attrs);
		$attrs = array_map('esc_attr', $attrs);
		$attrs_set = array();
		foreach ($attrs as $attr_key => $attr_value) {
			$attrs_set[] = $attr_key . '="' . $attr_value . '"';
		}
		?>
		<picture>
			<?php thegem_generate_picture_sources($attachment_id, $sources); ?>
			<img src="<?php echo $src; ?>" <?php echo $hwstring; ?> <?php echo implode(' ', $attrs_set); ?> />
		</picture>
		<?php
		if ($return_info) {
			return array(
				'default' => $default_image
			);
		}
	}
}

add_filter('wp_lazy_loading_enabled', function() { return false; } );
add_filter('pre_wp_get_loading_optimization_attributes', function() { return array(); } );

/*if(!function_exists('thegem_check_array_value')) {
function thegem_check_array_value($array = array(), $value = '', $default = '') {
	if(in_array($value, $array)) {
		return $value;
	}
	return $default;
}
}*/

if(!function_exists('thegem_templates_element_design_options')) {
	function thegem_templates_element_design_options($uniqid, $params) {
		$custom_css = '';
		$disable = 'flex_hide_element';
		$absolute = 'flex_absolute';
		$order = 'flex_sort_order';
		$horizontal = 'flex_horizontal_align';
		$vertical = 'flex_vertical_align';
		$padding = 'flex_padding';
		$margin = 'flex_margin';
		$gaps_dir = array('top', 'bottom', 'left', 'right');

		// Design options visibility
		if (isset( $params[$disable]) && $params[$disable] == '1') {
			$custom_css .= $uniqid . ' {display: none!important;}';
		}
		if (isset( $params[$disable.'_tablet']) && $params[$disable.'_tablet'] == '1') {
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {display: none!important;}}';
		} else {
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {display: block!important;}}';
		}
		if (isset( $params[$disable.'_mobile']) && $params[$disable.'_mobile'] == '1') {
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {display: none!important;}}';
		} else {
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {display: block!important;}}';
		}

		// Design options absolute
		$is_desktop_absolute = $is_tablet_absolute = $is_mobile_absolute = false;
		if (isset($params[$absolute]) && $params[$absolute] == '1') {
			$is_desktop_absolute = true;
			$custom_css .= $uniqid . ' {position: absolute !important;}';
		}
		if (isset($params[$absolute.'_tablet']) && $params[$absolute.'_tablet'] == '1') {
			$is_tablet_absolute = true;
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {position: absolute !important;}}';
		} else {
			$is_tablet_absolute = false;
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {position: relative !important; left:auto; right:auto; top:auto; bottom:auto; transform: none;}}';
		}
		if (isset($params[$absolute.'_mobile']) && $params[$absolute.'_mobile'] == '1') {
			$is_mobile_absolute = true;
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {position: absolute !important;}}';
		} else {
			$is_mobile_absolute = false;
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {position: relative !important; left:auto; right:auto; top:auto; bottom:auto; transform: none;}}';
		}

		// Design options order
		if (isset($params[$order]) && !empty($params[$order])) {
			$result = str_replace(' ', '', $params[$order]);
			$custom_css .= $uniqid . ' {order: ' . $result . ' !important;}';
		}
		if (isset($params[$order.'_tablet']) && !empty($params[$order.'_tablet'])) {
			$result = str_replace(' ', '', $params[$order.'_tablet']);
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {order: ' . $result . ' !important;}}';
		}
		if (isset($params[$order.'_mobile']) && !empty($params[$order.'_mobile'])) {
			$result = str_replace(' ', '', $params[$order.'_mobile']);
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {order: ' . $result . ' !important;}}';
		}

		// Design options horizontal align
		if (isset($params[$horizontal]) && !empty($params[$horizontal])) {
			switch ($params[$horizontal]) {
				case 'left':
					$result = $is_desktop_absolute ? 'left: 0; transform: none; right: auto;' : 'margin: 0; margin-right: auto;';
					break;
				case 'center':
					$result = $is_desktop_absolute ? 'left: 50%; transform: translateX(-50%); right: auto;' : 'margin: 0 auto;';
					break;
				case 'right':
					$result = $is_desktop_absolute ? 'right: 0; transform: none; left: auto;' : 'margin: 0; margin-left: auto;';
					break;
				default: $result = 'margin: 0;';
			}
			$custom_css .= $uniqid . ' {' . $result . '}';
		}
		if (isset($params[$horizontal.'_tablet']) && !empty($params[$horizontal.'_tablet'])) {
			switch ($params[$horizontal.'_tablet']) {
				case 'unset':
					$result = $is_tablet_absolute ? 'left:auto; right:auto; transform: none;' : 'margin: 0; left:auto; right:auto; transform: none;';
					break;
				case 'left':
					$result = $is_tablet_absolute ? 'left: 0; transform: none; right: auto;' : 'margin: 0; margin-right: auto;';
					break;
				case 'center':
					$result = $is_tablet_absolute ? 'left: 50%; transform: translateX(-50%); right: auto;' : 'margin: 0 auto;';
					break;
				case 'right':
					$result = $is_tablet_absolute ? 'right: 0; transform: none; left: auto;' : 'margin: 0; margin-left: auto;';
					break;
				default: $result = 'margin: 0;';
			}
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {' . $result . '}}';
		}
		if (isset($params[$horizontal.'_mobile']) && !empty($params[$horizontal.'_mobile'])) {
			switch ($params[$horizontal.'_mobile']) {
				case 'unset':
					$result = $is_mobile_absolute ? 'left:auto; right:auto; transform: none;' : 'margin: 0; left:auto; right:auto; transform: none;';
					break;
				case 'left':
					$result = $is_mobile_absolute ? 'left: 0; transform: none; right: auto;' : 'margin: 0; margin-right: auto;';
					break;
				case 'center':
					$result = $is_mobile_absolute ? 'left: 50%; transform: translateX(-50%); right: auto;' : 'margin: 0 auto;';
					break;
				case 'right':
					$result = $is_mobile_absolute ? 'right: 0; transform: none; left: auto;' : 'margin: 0; margin-left: auto;';
					break;
				default: $result = 'margin: 0;';
			}
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {' . $result . '}}';
		}

		// Design options vertical align
		if (isset($params[$vertical])) {
			switch ($params[$vertical]) {
				case 'top':
					$result = $is_desktop_absolute ? 'top: 0; transform: none; bottom: auto;' : 'align-self: flex-start;';
					break;
				case 'center':
					$result = $is_desktop_absolute ? 'top: 50%; transform: translateY(-50%); bottom: auto;' : 'align-self: center;';
					break;
				case 'bottom':
					$result = $is_desktop_absolute ? 'bottom: 0; transform: none; top: auto;' : 'align-self: flex-end;';
					break;
				default:
					$result = 'align-self: center;';
			}
			$custom_css .= $uniqid . ' {' . $result . '}';
		}
		if (isset($params[$vertical.'_tablet']) && !empty($params[$vertical.'_tablet'])) {
			switch ($params[$vertical.'_tablet']) {
				case 'unset':
					$result = $is_tablet_absolute ? 'top:auto; bottom:auto; transform: none;' : 'align-self: center; top:auto; bottom:auto; transform: none;';
					break;
				case 'top':
					$result = $is_tablet_absolute ? 'top: 0; transform: none; bottom: auto;' : 'align-self: flex-start;';
					break;
				case 'center':
					$result = $is_tablet_absolute ? 'top: 50%; transform: translateY(-50%); bottom: auto;' : 'align-self: center;';
					break;
				case 'bottom':
					$result = $is_tablet_absolute ? 'bottom: 0; transform: none; top: auto;' : 'align-self: flex-end;';
					break;
				default:
					$result = 'align-self: center;';
			}
			$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {' . $result . '}}';
		}
		if (isset($params[$vertical.'_mobile']) && !empty($params[$vertical.'_mobile'])) {
			switch ($params[$vertical.'_mobile']) {
				case 'unset':
					$result = $is_mobile_absolute ? 'top:auto; bottom:auto; transform: none;' : 'align-self: center; top:auto; bottom:auto; transform: none;';
					break;
				case 'top':
					$result = $is_mobile_absolute ? 'top: 0; transform: none; bottom: auto;' : 'align-self: flex-start;';
					break;
				case 'center':
					$result = $is_mobile_absolute ? 'top: 50%; transform: translateY(-50%); bottom: auto;' : 'align-self: center;';
					break;
				case 'bottom':
					$result = $is_mobile_absolute ? 'bottom: 0; transform: none; top: auto;' : 'align-self: flex-end;';
					break;
				default:
					$result = 'align-self: center;';
			}
			$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {' . $result . '}}';
		}

		// Design options paddings
		if (isset($params[$padding]) && !empty($params[$padding])) {
			$unit = $params[$padding]['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= $uniqid . ' {padding-' . $dir . ': ' . $params[$padding][$dir] . $unit . ' !important;}';
			}
		}

		if (isset($params[$padding.'_tablet']) && !empty($params[$padding.'_tablet'])) {
			$unit = $params[$padding.'_tablet']['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {padding-' . $dir . ': ' . $params[$padding.'_tablet'][$dir] . $unit . ' !important;}}';
			}
		}

		if (isset($params[$padding.'_mobile']) && !empty($params[$padding.'_mobile'])) {
			$unit = $params[$padding.'_mobile']['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {padding-' . $dir . ': ' . $params[$padding.'_mobile'][$dir] . $unit . ' !important;}}';
			}
		}

		// Design options margins
		if (isset($params[$margin]) && !empty($params[$margin])) {
			$unit = $params[$margin]['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= $uniqid . ' {margin-' . $dir . ': ' . $params[$margin][$dir] . $unit . ' !important;}';
			}
		}

		if (isset($params[$margin.'_tablet']) && !empty($params[$margin.'_tablet'])) {
			$unit = $params[$margin.'_tablet']['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= '@media screen and (max-width: 1023px) {' . $uniqid . ' {margin-' . $dir . ': ' . $params[$margin.'_tablet'][$dir] . $unit . ' !important;}}';
			}
		}

		if (isset($params[$margin.'_mobile']) && !empty($params[$margin.'_mobile'])) {
			$unit = $params[$margin.'_mobile']['unit'];
			foreach ($gaps_dir as $dir) {
				$custom_css .= '@media screen and (max-width: 767px) {' . $uniqid . ' {margin-' . $dir . ': ' . $params[$margin.'_mobile'][$dir] . $unit . ' !important;}}';
			}
		}

		return $custom_css;
	}
}

/* FONTS MANAGER */

function thegem_fonts_allowed_mime_types( $existing_mimes = array() ) {
	$existing_mimes['ttf'] = 'font/ttf';
	$existing_mimes['ttf1'] = 'application/x-font-ttf';
	$existing_mimes['ttf2'] = 'font/sfnt';
	$existing_mimes['ttf3'] = 'application/octet-stream';
	$existing_mimes['eot'] = 'application/vnd.ms-fontobject';
	$existing_mimes['woff'] = 'application/x-font-woff';
	$existing_mimes['woff2'] = 'font/woff2';
	$existing_mimes['woff21'] = 'application/octet-stream';
	$existing_mimes['svg'] = 'image/svg+xml';
	$existing_mimes['json'] = 'application/json';
	return $existing_mimes;
}
add_filter('upload_mimes', 'thegem_fonts_allowed_mime_types');

function thegem_bypass_font_mime_check($filetype_data, $file, $filename, $mimes) {
	$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));

	$font_extensions = array(
		'ttf' => 'font/ttf',
		'otf' => 'font/otf',
		'woff' => 'font/woff',
		'woff2' => 'font/woff2',
		'eot' => 'application/vnd.ms-fontobject'
	);

	if (isset($font_extensions[$ext])) {
		$filetype_data['ext'] = $ext;
		$filetype_data['type'] = $font_extensions[$ext];
		$filetype_data['proper_filename'] = $filename;
	}

return $filetype_data;
}
add_filter('wp_check_filetype_and_ext', 'thegem_bypass_font_mime_check', 10, 4);

function thegem_modify_post_mime_types( $post_mime_types ) {
	$post_mime_types['application/x-font-ttf'] = array(esc_html__('TTF Font (Legacy)', 'thegem'), esc_html__( 'Manage Legacy TTFs (Legacy)', 'thegem' ), _n_noop( 'TTF (Legacy) <span class="count">(%s)</span>', 'TTFs (Legacy) <span class="count">(%s)</span>', 'thegem' ) );
	$post_mime_types['font/ttf'] = array(esc_html__('TTF Font', 'thegem'), esc_html__( 'Manage TTFs', 'thegem' ), _n_noop( 'TTF <span class="count">(%s)</span>', 'TTFs <span class="count">(%s)</span>', 'thegem' ) );
	$post_mime_types['application/vnd.ms-fontobject'] = array(esc_html__('EOT Font', 'thegem'), esc_html__( 'Manage EOTs', 'thegem' ), _n_noop( 'EOT <span class="count">(%s)</span>', 'EOTs <span class="count">(%s)</span>', 'thegem' ) );
	$post_mime_types['application/x-font-woff'] = array(esc_html__('WOFF Font', 'thegem'), esc_html__( 'Manage WOFFs', 'thegem' ), _n_noop( 'WOFF <span class="count">(%s)</span>', 'WOFFs <span class="count">(%s)</span>', 'thegem' ) );
	$post_mime_types['font/woff2'] = array(esc_html__('WOFF2 Font', 'thegem'), esc_html__( 'Manage WOFF2s', 'thegem' ), _n_noop( 'WOFF2 <span class="count">(%s)</span>', 'WOFF2s <span class="count">(%s)</span>', 'thegem' ) );
	$post_mime_types['image/svg+xml'] = array(esc_html__('SVG Font', 'thegem'), esc_html__( 'Manage SVGs', 'thegem' ), _n_noop( 'SVG <span class="count">(%s)</span>', 'SVGs <span class="count">(%s)</span>', 'thegem' ) );
	return $post_mime_types;
}
add_filter('post_mime_types', 'thegem_modify_post_mime_types');

/* SCRTIPTs & STYLES */

function thegem_elements_scripts() {
	$theme_uri = THEGEM_THEME_URI;
	wp_register_style('thegem-portfolio', $theme_uri . '/css/thegem-portfolio.css', array('thegem-hovers'), THEGEM_THEME_VERSION);
	wp_register_style('thegem-portfolio-filters-list', $theme_uri . '/css/thegem-portfolio-filters-list.css', array('thegem-portfolio'), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid', $theme_uri . '/css/thegem-news-grid.css', array( 'thegem-portfolio'), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-hovers', $theme_uri . '/css/thegem-news-grid-hovers.css', array(), THEGEM_THEME_VERSION);

	wp_register_style('thegem-news-grid-version-new-hovers-default', $theme_uri . '/css/thegem-news-grid-version-new/default.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-zooming-blur', $theme_uri . '/css/thegem-news-grid-version-new/zooming-blur.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-horizontal-sliding', $theme_uri . '/css/thegem-news-grid-version-new/horizontal-sliding.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-vertical-sliding', $theme_uri . '/css/thegem-news-grid-version-new/vertical-sliding.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-gradient', $theme_uri . '/css/thegem-news-grid-version-new/gradient.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-circular', $theme_uri . '/css/thegem-news-grid-version-new/circular.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-zoom-overlay', $theme_uri . '/css/thegem-news-grid-version-new/zoom-overlay.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-new-hovers-disabled', $theme_uri . '/css/thegem-news-grid-version-new/disabled.css', array(), THEGEM_THEME_VERSION);

	wp_register_style('thegem-news-grid-version-default-hovers-default', $theme_uri . '/css/thegem-news-grid-version-default/default.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-zooming-blur', $theme_uri . '/css/thegem-news-grid-version-default/zooming-blur.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-horizontal-sliding', $theme_uri . '/css/thegem-news-grid-version-default/horizontal-sliding.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-vertical-sliding', $theme_uri . '/css/thegem-news-grid-version-default/vertical-sliding.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-gradient', $theme_uri . '/css/thegem-news-grid-version-default/gradient.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-circular', $theme_uri . '/css/thegem-news-grid-version-default/circular.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-zoom-overlay', $theme_uri . '/css/thegem-news-grid-version-default/zoom-overlay.css', array(), THEGEM_THEME_VERSION);
	wp_register_style('thegem-news-grid-version-default-hovers-disabled', $theme_uri . '/css/thegem-news-grid-version-default/disabled.css', array(), THEGEM_THEME_VERSION);

	wp_register_style('thegem-gallery-grid-styles', $theme_uri . '/css/thegem-gallery-grid.css', array( 'thegem-wrapboxes', 'thegem-hovers'), THEGEM_THEME_VERSION);

	wp_register_script('raphael', $theme_uri . '/js/raphael.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-news-carousel', $theme_uri . '/js/news-carousel.js', array('jquery', 'jquery-carouFredSel'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-portfolio-grid-carousel', $theme_uri . '/js/portfolio-grid-carousel.js', array('jquery', 'jquery-carouFredSel'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-portfolio-grid-extended', $theme_uri . '/js/thegem-portfolio-grid-extended.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_script( 'thegem-portfolio-grid-extended-inline', '', [], '', true );
	wp_register_script('thegem-widgets', $theme_uri . '/js/widgets.js', array('jquery', 'jquery-carouFredSel'), THEGEM_THEME_VERSION, true);
	wp_register_script('jquery-restable', $theme_uri . '/js/jquery.restable.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-parallax-vertical', $theme_uri . '/js/jquery.parallaxVertical.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-parallax-horizontal', $theme_uri . '/js/jquery.parallaxHorizontal.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_style('nivo-slider', $theme_uri . '/css/nivo-slider.css', array(), THEGEM_THEME_VERSION);
	wp_register_script('jquery-nivoslider', $theme_uri . '/js/jquery.nivo.slider.pack.js', array('jquery'), THEGEM_THEME_VERSION);
	wp_register_script('thegem-nivoslider-init-script', $theme_uri . '/js/nivoslider-init.js', array('jquery', 'jquery-nivoslider'), THEGEM_THEME_VERSION);
	wp_localize_script('thegem-nivoslider-init-script', 'thegem_nivoslider_options', array(
		'effect' => thegem_get_option('slider_effect') ? thegem_get_option('slider_effect') : 'random',
		'slices' => thegem_get_option('slider_slices') ? thegem_get_option('slider_slices') : 15,
		'boxCols' => thegem_get_option('slider_boxCols') ? thegem_get_option('slider_boxCols') : 8,
		'boxRows' => thegem_get_option('slider_boxRows') ? thegem_get_option('slider_boxRows') : 4,
		'animSpeed' => thegem_get_option('slider_animSpeed') ? thegem_get_option('slider_animSpeed')*100 : 500,
		'pauseTime' => thegem_get_option('slider_pauseTime') ? thegem_get_option('slider_pauseTime')*1000 : 3000,
		'directionNav' => thegem_get_option('slider_directionNav') ? true : false,
		'controlNav' => thegem_get_option('slider_controlNav') ? true : false,
	));

	wp_register_script('thegem-video', THEGEM_THEME_URI . '/js/thegem-video.js', array(), THEGEM_THEME_VERSION, true);

	wp_register_script('thegem-isotope-metro', $theme_uri . '/js/isotope_layout_metro.js', array('thegem-isotope-js'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-isotope-masonry-custom', $theme_uri . '/js/isotope-masonry-custom.js', array('thegem-isotope-js'), THEGEM_THEME_VERSION, true);
	wp_register_script('jquery-waypoints', $theme_uri . '/js/jquery.waypoints.js', array('jquery'), THEGEM_THEME_VERSION, true);
	wp_register_script('thegem-stickyColumn', $theme_uri . '/js/thegem-stickyColumn.js', array('jquery', 'jquery-waypoints'), THEGEM_THEME_VERSION, true);

}
add_action('wp_enqueue_scripts', 'thegem_elements_scripts', 6);

function thegem_elements_builders_scripts() {
	if (is_singular() || (
		(function_exists('thegem_archive_product_template') && thegem_archive_product_template())
		|| (function_exists('thegem_blog_archive_template') && thegem_blog_archive_template())
		|| (function_exists('thegem_cpt_archive_template') && thegem_cpt_archive_template())
		|| (function_exists('thegem_search_template') && thegem_search_template())
		)) {
		$post_id = function_exists('thegem_archive_product_template') && thegem_archive_product_template() ? thegem_archive_product_template() :
			(function_exists('thegem_blog_archive_template') && thegem_blog_archive_template() ? thegem_blog_archive_template() :
				(function_exists('thegem_cpt_archive_template') && thegem_cpt_archive_template() ? thegem_cpt_archive_template() :
					(function_exists('thegem_search_template') && thegem_search_template() ? thegem_search_template() :
						(function_exists('thegem_single_post_template') && in_array(get_post_type(), array('post', 'thegem_news'), true) && thegem_single_post_template() ? thegem_single_post_template() :
							(function_exists('thegem_cpt_template') && in_array(get_post_type(), thegem_get_available_po_custom_post_types(), true) && thegem_cpt_template() ? thegem_cpt_template() : get_the_ID())
						)
					)
				)
			);
		if (function_exists('thegem_enqueue_template_styles') && $post_id !== get_the_ID()) thegem_enqueue_template_styles($post_id);
		$elementor_data = get_post_meta($post_id, '_elementor_data');
		if ($elementor_data && defined('ELEMENTOR_VERSION')) {
			if (is_array($elementor_data)) {
				$elementor_data = $elementor_data[0];
			}
			$data = json_decode($elementor_data, true);
			if (is_array($data)) {
				$elements = array();
				\Elementor\Plugin::$instance->db->iterate_data( $data, function( $element ) use ( &$elements ) {
					$elements[] = (object)$element;
				} );
				$inlineFiltersScript = false;
				foreach($elements as $widget) {
					if (isset($widget->elType) && ($widget->elType == 'container' || $widget->elType == 'section')) {
						$widgetSettings = $widget->settings;
						$scrollBG = isset($widgetSettings['thegem_scroll_bg_active']) && $widgetSettings['thegem_scroll_bg_active'] == 'yes';
						if ($scrollBG) {
							wp_enqueue_style('thegem-container-scroll-bg-color');
						}
					}
					if (isset($widget->elType) && $widget->elType == 'widget') {
						$widgetSettings = $widget->settings;
						if ($widget->widgetType == 'thegem-portfolio' || $widget->widgetType == 'thegem-portfolio-list') {
							wp_enqueue_style('thegem-portfolio');
							$showFilter = !isset($widgetSettings['portfolio_show_filter']) || $widgetSettings['portfolio_show_filter'] == 'yes';
							$showSorting = !isset($widgetSettings['portfolio_show_sorting']) || $widgetSettings['portfolio_show_sorting'] == 'yes';
							if ($showFilter || $showSorting) {
								wp_enqueue_style('thegem-portfolio-filters-list');
							}
						} else if ($widget->widgetType == 'thegem-extended-blog-grid') {
							wp_enqueue_style('thegem-news-grid');
							$showFilter = !isset($widgetSettings['blog_show_filter']) || $widgetSettings['blog_show_filter'] == 'yes';
							$showSorting = !isset($widgetSettings['blog_show_sorting']) || $widgetSettings['blog_show_sorting'] == 'yes';
							if ($showFilter || $showSorting) {
								wp_enqueue_style('thegem-portfolio-filters-list');
							}
							if(function_exists('thegem_enqueue_template_styles') && isset($widgetSettings['skin_source']) && $widgetSettings['skin_source'] === 'builder' && !empty($widgetSettings['loop_builder'])) {
								thegem_enqueue_template_styles($widgetSettings['loop_builder']);
							}
						} else if ($widget->widgetType == 'thegem-posts-carousel') {
							if(function_exists('thegem_enqueue_template_styles') && isset($widgetSettings['skin_source']) && $widgetSettings['skin_source'] === 'builder' && !empty($widgetSettings['loop_builder'])) {
								thegem_enqueue_template_styles($widgetSettings['loop_builder']);
							}
						} else if ($widget->widgetType == 'thegem-team') {
							if(function_exists('thegem_enqueue_template_styles') && isset($widgetSettings['skin_source']) && $widgetSettings['skin_source'] === 'builder' && !empty($widgetSettings['loop_builder'])) {
								thegem_enqueue_template_styles($widgetSettings['loop_builder']);
							}
						} else if ($widget->widgetType == 'thegem-testimonials') {
							if(function_exists('thegem_enqueue_template_styles') && isset($widgetSettings['skin_source']) && $widgetSettings['skin_source'] === 'builder' && !empty($widgetSettings['loop_builder'])) {
								thegem_enqueue_template_styles($widgetSettings['loop_builder']);
							}
						} else if ($widget->widgetType == 'thegem-gallery-grid') {
							wp_enqueue_style('thegem-gallery-grid-styles');
							$showFilter = !isset($widgetSettings['show_filter']) || $widgetSettings['show_filter'] == 'yes';
							if ($showFilter) {
								wp_enqueue_style('thegem-portfolio-filters-list');
							}
						} else if ($widget->widgetType == 'thegem-styledbutton') {
							wp_enqueue_style('thegem-button');
						} else if ($widget->widgetType == 'thegem-extended-filter') {
							wp_enqueue_style('thegem-portfolio-filters-list');
						}
					}
				}
			}
		}
	}
	if (is_singular() && defined('ELEMENTOR_VERSION') && (
		(function_exists('thegem_single_post_template') && thegem_single_post_template()) ||
		(function_exists('thegem_portfolio_template') && thegem_portfolio_template()) ||
		(function_exists('thegem_cpt_template') && thegem_cpt_template())
	)) {
		add_action( 'wp_enqueue_scripts', [ \Elementor\Plugin::instance()->frontend, 'enqueue_styles' ] );
	}
}
add_action('wp_enqueue_scripts', 'thegem_elements_builders_scripts', 7);

function thegem_nonce_life() {
	return 31536000;
}
add_filter('nonce_life', 'thegem_nonce_life');

function thegem_fix_pw_init() {
	if(defined('PAGE_WIDGET_VERSION')) {
		remove_action('admin_print_scripts', 'pw_print_scripts');
		add_action('admin_print_scripts', 'thegem_pw_print_scripts');
	}
}
add_filter('init', 'thegem_fix_pw_init');

function thegem_pw_print_scripts() {

	global $pagenow, $typenow;

	$plugins_url = plugins_url();
	$pw_plugin_url = $plugins_url;
	if(defined('PAGE_WIDGET_VERSION') && version_compare(PAGE_WIDGET_VERSION, '4.0.1', '<')) {
		$pw_plugin_url .= '/wp-page-widget';
	} else {
		$pw_plugin_url .= '/wordpress-page-widget';
	}

	if (function_exists('pw_backend_check_allow_continue_process') && pw_backend_check_allow_continue_process()) {

		do_action( 'admin_print_scripts-widgets.php' );

		/* Plugin support */

		// Image widget support
		if (is_plugin_active('image-widget/image-widget.php')) {
			wp_enqueue_script('tribe-image-widget', $plugins_url . '/image-widget/resources/js/image-widget.js', array('jquery', 'media-upload', 'media-views'), false, true);
			wp_localize_script( 'tribe-image-widget', 'TribeImageWidget', array(
			'frame_title' => __( 'Select an Image', 'image_widget' ),
			'button_title' => __( 'Insert Into Widget', 'image_widget' ),
			) );
		}

		// Simple Link List Widget plugin support/
		if (is_plugin_active('simple-link-list-widget/simple-link-list-widget.php')) {
			wp_enqueue_script( 'sllw-sort-js', $plugins_url .'/simple-link-list-widget/js/sllw-sort.js');
		}

		// Easy releated posts and Simple social icons support.
		if (
			is_plugin_active('easy-related-posts/easy_related_posts.php')
			||
			is_plugin_active('simple-social-icons/simple-social-icons.php')
		) {
			wp_enqueue_script( 'wp-color-picker');
		}


		wp_enqueue_script('pw-widgets', $pw_plugin_url . '/assets/js/page-widgets.js', array('jquery', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable'), rand(), true);


		/*
		* Add pwTextWidgets extend from wp.textWidgets
		* Add pwMediaWidgets extend from wp.mediaWidgets
		*/
		if( version_compare( get_bloginfo('version'), '4.7.9', '>' ) ) {
			wp_enqueue_script('pw-extend-text-widgets', $pw_plugin_url . '/assets/js/pw-text-widgets-extend-wp-text-widgets.js', array('jquery', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable'), PAGE_WIDGET_VERSION, true);
			wp_enqueue_script('pw-extend-media-widgets', $pw_plugin_url . '/assets/js/pw-media-widgets-extend-wp-media-widgets.js', array('jquery', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable'), PAGE_WIDGET_VERSION, true);
		}

		/*
		* Add pwCustomHTML extend from wp.customHtmlWidgets
		*/
		if( version_compare( get_bloginfo('version'), '4.8.5', '>' ) ) {
			wp_enqueue_script('pw-extend-custom-html', $pw_plugin_url . '/assets/js/pw-custom-html-extend-wp-custom-html.js', array('jquery', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable'), PAGE_WIDGET_VERSION, true);

			$settings = wp_enqueue_code_editor( array(
				'type' => 'text/html',
				'codemirror' => array(
					'indentUnit' => 2,
					'tabSize' => 2,
				),
			));

			if ( empty( $settings ) ) {
				$settings = array(
					'disabled' => true,
				);
			}
			wp_add_inline_script( 'pw-extend-custom-html', sprintf( 'pwCustomHTML.init( %s );', wp_json_encode( $settings ) ), 'after' );
		}

		wp_localize_script( 'pw-widgets', 'wp_page_widgets', array(
			'remove_inactive_widgets_text'  => __('Press the following button will remove all of these inactive widgets', 'wp-page-widgets'),
			'remove_inactive_widgets' => __( 'Remove inactive widgets', 'wp-page-widgets' ),
		) );
	}
}

function thegem_info_message_notice() {
	if ( !current_user_can('manage_options' ) )
		return false;

	$user_id = get_current_user_id();

	$dismissed_ids = get_user_meta($user_id, 'thegem_dismissed_notices', true);
	if ( !is_array($dismissed_ids) ) {
		$dismissed_ids = array();
	}

	$message_data = get_option('thegem_info_message_news', array());
	$notice_class = '';
	$notice_html  = '';
	$notice_until = 0;
	$notice_id    = '';

	if(is_array($message_data) and !empty($message_data['last_check'])) {
		$last_check = intval($message_data['last_check']);
	} else {
		$last_check = 0;
	}

	$thegem_theme = wp_get_theme('thegem-elementor');
	$current_theme_ver = $thegem_theme->exists() ? $thegem_theme->get('Version') : '0.0.0';

	$current_plugin_ver = '0.0.0';
	$plugin_path = trailingslashit(WP_PLUGIN_DIR) . 'thegem-elements-elementor/thegem-elements-elementor.php';
	if ( file_exists($plugin_path) ) {
		if ( !function_exists('get_plugin_data') ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}
		$plugin_data = get_plugin_data($plugin_path);
		$current_plugin_ver = !empty($plugin_data['Version']) ? $plugin_data['Version'] : '0.0.0';
	}

	$cached_theme_ver  = isset($message_data['theme_version']) ? $message_data['theme_version'] : '';
	$cached_plugin_ver = isset($message_data['plugin_version']) ? $message_data['plugin_version'] : '';

	$version_changed = ($current_theme_ver !== $cached_theme_ver || $current_plugin_ver !== $cached_plugin_ver);

	if( $version_changed || (time()-$last_check)/3600 > 24 ) {
		$last_check = time();
		$response = wp_remote_get('http://democontent.codex-themes.com/plugins/thegem/theme/message-news.json', array('timeout' => 5));
		if ( is_wp_error( $response ) ) {
			update_option('thegem_info_message_news', array(
				'last_check'     => $last_check,
				'theme_version'  => $current_theme_ver,
				'plugin_version' => $current_plugin_ver
			));
			return false;
		}
		$body = wp_remote_retrieve_body($response);
		$data = json_decode($body, 1);
		if ( ! isset( $data['class'] ) ) {
			update_option('thegem_info_message_news', array(
				'last_check'     => $last_check,
				'theme_version'  => $current_theme_ver,
				'plugin_version' => $current_plugin_ver
			));
			return false;
		}
		$notice_class = $data['class'];
		$notice_html  = isset($data['html']) ? $data['html'] : '';
		$notice_until = isset($data['until']) ? intval($data['until']) : $last_check+24*60*60;
		$notice_id    = isset($data['id']) ? sanitize_key($data['id']) : '';
	} else {
		if(!empty($message_data['class']) && !empty($message_data['html'])) {
			$notice_class = $message_data['class'];
			$notice_html  = $message_data['html'];
			$notice_until = isset($message_data['until']) ? intval($message_data['until']) : $last_check+24*60*60;
			$notice_id    = isset($message_data['id']) ? $message_data['id'] : '';
		}
	}

	update_option('thegem_info_message_news', array(
		'last_check'     => $last_check,
		'class'          => $notice_class,
		'html'           => $notice_html,
		'until'          => $notice_until,
		'id'             => $notice_id,
		'theme_version'  => $current_theme_ver,
		'plugin_version' => $current_plugin_ver
	));

	if ( !empty($notice_id) && in_array($notice_id, $dismissed_ids) ) {
		return false;
	}

	if(!empty($notice_class) && !empty($notice_html) && $notice_until > time()) {
		echo '<div id="thegem-news-notice" class="thegem-news-notice notice '.esc_attr($notice_class).' is-dismissible" data-nonce="'.wp_create_nonce('thegem_dismiss_nonce').'" data-notice-id="'.esc_attr($notice_id).'" style="padding: 0;">';
		echo wp_kses_post($notice_html);
		echo '</div>';

		?>
		<script type="text/javascript">
			jQuery(document).on('click', '#thegem-news-notice .notice-dismiss', function() {
				var $notice = jQuery('#thegem-news-notice');
				var nonce = $notice.data('nonce');
				var noticeId = $notice.data('notice-id');

				jQuery.ajax({
					url: ajaxurl,
					type: 'POST',
					data: {
						action: 'thegem_dismiss_info_message_notice',
						security: nonce,
						notice_id: noticeId
					}
				});
			});
		</script>
		<?php
	}
}
add_action('admin_notices', 'thegem_info_message_notice');

function thegem_dismiss_info_message_notice_callback() {
	check_ajax_referer('thegem_dismiss_nonce', 'security');

	if ( current_user_can('manage_options') && isset($_POST['notice_id']) ) {
		$notice_id = sanitize_key($_POST['notice_id']);
		$user_id = get_current_user_id();

		if ( !empty($notice_id) && !empty($user_id) ) {
			$dismissed_ids = get_user_meta($user_id, 'thegem_dismissed_notices', true);
			if ( !is_array($dismissed_ids) ) {
				$dismissed_ids = array();
			}

			if ( !in_array($notice_id, $dismissed_ids) ) {
				$dismissed_ids[] = $notice_id;
			}

			update_user_meta($user_id, 'thegem_dismissed_notices', $dismissed_ids);
			wp_send_json_success();
		}
	}
	wp_send_json_error();
}
add_action('wp_ajax_thegem_dismiss_info_message_notice', 'thegem_dismiss_info_message_notice_callback');

function thegem_plugin_update_notice() {
	if ( !current_user_can('update_themes' ) )
		return false;
	if ( !isset($themes_update) )
		$themes_update = get_site_transient('update_themes');
	if ( isset($themes_update->response['thegem-elementor']) ) {
		$update = $themes_update->response['thegem-elementor'];
		$theme = wp_prepare_themes_for_js( array( wp_get_theme('thegem-elementor') ) );
		$details_url = add_query_arg(array(), $update['url']);
		$update_url = wp_nonce_url( admin_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( 'thegem-elementor' ) ), 'upgrade-theme_thegem-elementor' );
		if(isset($theme[0]) && isset($theme[0]['hasUpdate']) && $theme[0]['hasUpdate'] && version_compare( $theme[0]['version'], '5.0.0', '<' )) {
			wp_enqueue_script('jquery-fancybox');
			wp_enqueue_style('jquery-fancybox');
			echo '<div class="thegem-update-notice notice notice-warning is-dismissible">';
			echo '<p>'.sprintf(wp_kses(__('There is a new version of TheGem theme available. Your current version is <strong>%s</strong>. Update to <strong>%s</strong>.', 'thegem'), array('strong' => array())), $theme[0]['version'], $update['new_version']).'</p>';
			echo '<p>'.sprintf(wp_kses(__('<strong><a href="%s" class="thegem-view-details-link">View update details</a></strong> or <strong><a href="%s" class="thegem-update-link">Update now</a></strong>.', 'thegem'), array('strong' => array(), 'a' => array('href' => array(), 'class' => array()))), $details_url, $update_url).'</p>';
			echo '</div>';
		}
	}
}
add_action('admin_notices', 'thegem_plugin_update_notice');

function thegem_plugin_theme_update_notice() {
	if ( !current_user_can('update_themes' ) )
		return false;
	$thegem_theme = wp_get_theme('thegem-elementor');
	if($thegem_theme->exists() && version_compare($thegem_theme->get('Version'), '5.12.2', '<')) {
		echo '<div class="thegem-update-notice-new notice notice-error" style="display: flex; align-items: center;">';
		echo '<p style="margin: 5px 15px 0 10px;"><img src=" '.THEGEM_THEME_URI . '/images/alert-icon.svg'.' " width="40px" alt="thegem-blocks-logo"></p>';
		echo '<p><b style="display: block; font-size: 14px; padding-bottom: 5px">'.__('IMPORTANT:', 'thegem').'</b>'.__('Please update <strong>«TheGem Theme»</strong> to the latest version.', 'thegem').'</p>';
		echo '<p style="margin-left: auto;">'.sprintf(wp_kses(__('<a href="%s" class="button button-primary">Update now</a>', 'thegem'), array('strong' => array(), 'a' => array('href' => array(), 'class' => array()))), esc_url(admin_url('update-core.php'))).'</p>';
		echo '</div>';
	}
}
add_action('admin_notices', 'thegem_plugin_theme_update_notice');

if (!function_exists('thegem_get_posts_by_query')) {
	function thegem_get_posts_by_query() {
		$search_string = isset($_POST['q']) ? sanitize_text_field(wp_unslash($_POST['q'])) : '';
		$post_type = isset($_POST['post_type']) ? $_POST['post_type'] : 'post';
		$results = array();

		$query = new WP_Query(
			array(
				's' => $search_string,
				'post_type' => $post_type,
				'posts_per_page' => -1,
			)
		);

		if (!isset($query->posts)) {
			return;
		}

		foreach ($query->posts as $post) {
			$results[] = array(
				'id' => $post->ID,
				'text' => $post->post_title,
			);
		}

		wp_send_json($results);
	}
	add_action('wp_ajax_thegem_get_posts_by_query', 'thegem_get_posts_by_query');
}

if (!function_exists('thegem_get_posts_title_by_id')) {
	function thegem_get_posts_title_by_id() {
		$ids = isset($_POST['id']) ? $_POST['id'] : array();
		$post_type = isset($_POST['post_type']) ? $_POST['post_type'] : 'post';
		$results = array();

		$query = new WP_Query(
			array(
				'post_type' => $post_type,
				'post__in' => $ids,
				'posts_per_page' => -1,
				'orderby' => 'post__in',
			)
		);

		if (!isset($query->posts)) {
			return;
		}

		foreach ($query->posts as $post) {
			$results[$post->ID] = $post->post_title;
		}

		wp_send_json($results);
	}
	add_action('wp_ajax_thegem_get_posts_title_by_id', 'thegem_get_posts_title_by_id');
}

if (!function_exists('thegem_get_taxonomy_terms_by_query')) {
	function thegem_get_taxonomy_terms_by_query() {
		$search_string = isset($_POST['q']) ? sanitize_text_field(wp_unslash($_POST['q'])) : '';
		$post_type = isset($_POST['post_type']) ? $_POST['post_type'] : 'post';
		$results = array();

		if ($post_type && $post_type != 'any')  {
			$taxonomies = get_object_taxonomies( $post_type);
		} else {
			$taxonomies = get_taxonomies(array(
				'public' => true,
			));
		}

		if (!empty($taxonomies) && !is_wp_error($taxonomies)) {
			$args = array(
				'taxonomy' => $taxonomies,
				'hide_empty' => true,
				'name__like' => $search_string
			);

			$terms = get_terms( $args );

			if (!empty($terms)) {
				foreach ($terms as $term) {
					$results[] = array(
						'id' => $term->taxonomy . '|' . $term->term_id,
						'text' => $term->name . ' (' . $term->taxonomy . ')',
					);
				}
			}
		}

		wp_send_json($results);
	}
	add_action('wp_ajax_thegem_get_taxonomy_terms_by_query', 'thegem_get_taxonomy_terms_by_query');
}

if (!function_exists('thegem_get_taxonomy_terms_by_tax')) {
	function thegem_get_taxonomy_terms_by_tax() {
		$search_string = isset($_POST['q']) ? sanitize_text_field(wp_unslash($_POST['q'])) : '';
		$taxonomy = isset($_POST['taxonomy']) ? $_POST['taxonomy'] : 'category';
		$results = array();

		$args = array(
			'taxonomy' => $taxonomy,
			'hide_empty' => true,
			'name__like' => $search_string
		);

		$terms = get_terms( $args );

		if (!empty($terms)) {
			foreach ($terms as $term) {
				$results[] = array(
					'id' => $term->term_id,
					'text' => $term->name . ' (' . $term->taxonomy . ')',
				);
			}
		}

		wp_send_json($results);
	}
	add_action('wp_ajax_thegem_get_taxonomy_terms_by_tax', 'thegem_get_taxonomy_terms_by_tax');
}

if (!function_exists('thegem_get_taxonomy_terms_by_id')) {
	function thegem_get_taxonomy_terms_by_id() {
		$ids = isset($_POST['id']) ? $_POST['id'] : array();
		$results = array();

		foreach ($ids as $id) {
			$arr = explode("|", $id);
			$term = get_term_by('id', $arr[1], $arr[0]);
			$results[$term->taxonomy . '|' . $term->term_id] = $term->name . ' (' . $term->taxonomy . ')';
		}

		wp_send_json($results);
	}
	add_action('wp_ajax_thegem_get_taxonomy_terms_by_id', 'thegem_get_taxonomy_terms_by_id');
}

function thegem_elementor_content_set_deafult_settings_for_element($data, $type, $settings, $widgetType = '') {
	if(is_array($data)) {
		foreach($data as &$element) {
			if($element['elType'] === $type && ($type !== 'widget' || (!empty($element['widgetType']) && $widgetType === $element['widgetType']))) {
				$element['settings'] = array_merge($settings, $element['settings']);
			}
			if(!empty($element['elements'])) {
				$element['elements'] = thegem_elementor_content_set_deafult_settings_for_element($element['elements'], $type, $settings, $widgetType);
			}
		}
	}
	return $data;
}

$thegem_plugin_file = __FILE__;

function thegem_woocommerce_register_feature_definitions($features) {
	if(!thegem_get_option('woocommerce_order_attribution_feature_enabled')) {
		$features->add_feature_definition( 'order_attribution', __( 'Order Attribution', 'woocommerce' ), array(
			'name'               => __( 'Order Attribution', 'woocommerce' ),
			'description'        => __(
				'Enable this feature to track and credit channels and campaigns that contribute to orders on your site',
				'woocommerce'
			),
			'enabled_by_default' => true,
			'disable_ui'         => true,
			'is_legacy'          => true,
			'is_experimental'    => false,
		) );
	}
}
//add_action('woocommerce_register_feature_definitions', 'thegem_woocommerce_register_feature_definitions');

function thegem_woocommerce_feature_order_attribution_enabled($value, $option, $default_value) {
	if(!thegem_get_option('woocommerce_order_attribution_feature_enabled')) {
		$value = 'no';
	}
	return $value;
}
//add_filter('pre_option_woocommerce_feature_order_attribution_enabled', 'thegem_woocommerce_feature_order_attribution_enabled', 10 , 3);

function thegem_prepare_revslider_sr7_migrate() {
	if(defined('RS_REVISION') && !get_option('thegem_revslider_sr7_migrate', false)) {
		$slider = new RevSlider();
		$arrSliders = $slider->get_sliders();
		if(empty($arrSliders)) {
			$func = RevSliderGlobals::instance()->get('RevSliderFunctions');
			$global = $func->get_global_settings();
			$func->set_val($global, array('getTec', 'engine'), 'SR6');
			$func->set_global_settings($global);
		}
		update_option('thegem_revslider_sr7_migrate', 1);
	}
}
add_action( 'admin_init', 'thegem_prepare_revslider_sr7_migrate' );

require_once(plugin_dir_path( __FILE__ ) . 'inc/content.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/remote_media_upload.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/diagram.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/post-types/init.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/widgets/init.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/gdpr/gdpr.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/blocks-helper/index.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/elementor/elementor.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/woo-swatches.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/templates/templates.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/heading-animation/index.php');
require_once(plugin_dir_path( __FILE__ ) . 'inc/button-animation/index.php');
