<?php
	/*	
	*	Goodlayers Utility Files
	*	---------------------------------------------------------------------
	*	This file contains the function that helps doing things
	*	---------------------------------------------------------------------
	*/
	
	//
	if( !function_exists('gdlr_core_array_insert') ){
		function gdlr_core_array_insert($array, $position, $insert){

		    if( !is_int($position) ){
		        $position = array_search($position, array_keys($array)) + 1;
		    }
		    
		    return array_slice($array, 0, $position) + $insert + array_slice($array, $position);
		}
	}

	// Setup a post object and store the original loop item so we can reset it later
	if( !function_exists('gdlr_core_setup_admin_postdata') ){
		function gdlr_core_setup_admin_postdata(){
			global $post;

			if( is_admin() ){
				global $gdlr_core_post;
				$gdlr_core_post = $post;
			}
		}
	}

	// Reset $post back to the original item
	if( !function_exists('gdlr_core_reset_admin_postdata') ){
		function gdlr_core_reset_admin_postdata(){
			global $gdlr_core_post;

			if( is_admin() && !empty($gdlr_core_post) ){
				global $post;
				$post = $gdlr_core_post;
				setup_postdata($post);

				// clean up the data
				unset($gdlr_core_post);
			}
		}
	}

	// include utility function for uses 
	// make sure to call this function inside wp_enqueue_script action
	if( !function_exists('gdlr_core_include_utility_script') ){
		function gdlr_core_include_utility_script(){
			
			if( is_admin() ){
				wp_enqueue_style('google-Montserrat', '//fonts.googleapis.com/css?family=Montserrat:400,700');
			}
		
			gdlr_core_include_icon_font('font-awesome');
			gdlr_core_include_icon_font('elegant-font');
						
			wp_enqueue_style('gdlr-core-utility', GDLR_CORE_URL . '/framework/css/utility.css');
			
			wp_enqueue_script('gdlr-core-utility', GDLR_CORE_URL . '/framework/js/utility.js', array('jquery'), false, true);
			wp_localize_script('gdlr-core-utility', 'gdlr_utility', array(
				'confirm_head' => esc_html__('Just to confirm', 'goodlayers-core'),
				'confirm_text' => esc_html__('Are you sure to do this ?', 'goodlayers-core'),
				'confirm_sub' => esc_html__('* Please noted that this could not be undone.', 'goodlayers-core'),
				'confirm_yes' => esc_html__('Yes', 'goodlayers-core'),
				'confirm_no' => esc_html__('No', 'goodlayers-core'),
			));
			
		}
	}	
	
	// change any string to valid html id
	if( !function_exists('gdlr_core_string_to_slug') ){
		function gdlr_core_string_to_slug( $string ){
			// lower case everything
			$string = strtolower($string);
			
			// make alphanumeric (removes all other characters)
			$string = preg_replace("/[^a-z0-9_\s-]/", "", $string);
			
			// clean up multiple dashes or whitespaces
			$string = preg_replace("/[\s-_]+/", " ", $string);
			
			// remove space at the front and back
			$string = trim($string);
			
			// convert whitespaces and underscore to dash
			$string = preg_replace("/[\s_]/", "-", $string);
    
			return $string;
		}
	}
	
	// get all thumbnail name
	if( !function_exists('gdlr_core_get_thumbnail_list') ){
		function gdlr_core_get_thumbnail_list(){
			$ret = array();
			
			$thumbnails = get_intermediate_image_sizes();
			$ret['full'] = esc_html__('full size', 'goodlayers-core');
			foreach( $thumbnails as $thumbnail ) {
				if( !empty($GLOBALS['_wp_additional_image_sizes'][$thumbnail]) ){
					$width = $GLOBALS['_wp_additional_image_sizes'][$thumbnail]['width'];
					$height = $GLOBALS['_wp_additional_image_sizes'][$thumbnail]['height'];
				}else{
					$width = get_option($thumbnail . '_size_w', '');
					$height = get_option($thumbnail . '_size_h', '');
				}
				$ret[$thumbnail] = $thumbnail . ' ' . $width . '-' . $height;
			}
			return $ret;
		}
	}
	if( !function_exists('gdlr_core_get_video_size') ){
		function gdlr_core_get_video_size( $size = '' ){

			if( empty($size) || $size == 'full' ){
				return array( 'width'=>640, 'height'=>360 );
			}
			
			if( is_array($size) && ( $size['width'] == '100%' || $size['height'] == '100%') ){
				return array( 'width'=>640, 'height'=>360 );
			}
			
			if( !empty($GLOBALS['_wp_additional_image_sizes'][$size]) ){
				$width = $GLOBALS['_wp_additional_image_sizes'][$size]['width'];
				$height = $GLOBALS['_wp_additional_image_sizes'][$size]['height'];
				if( !empty($width) && !empty($height) ){
					return array( 'width'=>$width, 'height'=>$height );
				}
			}

			return array( 'width'=>640, 'height'=>360 );
		}
	}
	
	// gdlr esc size
	if( !function_exists('gdlr_core_esc_style') ){
		function gdlr_core_esc_style($atts, $wrap = true, $important = false){
			if( empty($atts) || !is_array($atts) ) return '';
			$att_style = '';

			// special attribute
			if( !empty($atts['background-shadow-color']) ){
				if( !empty($atts['background-shadow-size']) ){
					if( is_array($atts['background-shadow-size']) ){
						$bgs_sizex = empty($atts['background-shadow-size']['x'])? '0': $atts['background-shadow-size']['x'];
						$bgs_sizey = empty($atts['background-shadow-size']['y'])? '0': $atts['background-shadow-size']['y'];
						$bgs  = $bgs_sizex . ' ' . $bgs_sizey . ' ' . $atts['background-shadow-size']['size'] . ' ';
					}else{
						$bgs  = $atts['background-shadow-size'] . ' ';
					}

					if( !empty($bgs) && $atts['background-shadow-opacity'] ){
						$bgs .= 'rgba(' . gdlr_core_format_datatype($atts['background-shadow-color'], 'rgba') . ',' . $atts['background-shadow-opacity'] . ')';

						$att_style .= 'box-shadow: ' . $bgs . '; ';
						$att_style .= '-moz-box-shadow: ' . $bgs . '; ';
						$att_style .= '-webkit-box-shadow: ' . $bgs . '; ';
					}
				}
			}
			unset($atts['background-shadow-color']);
			unset($atts['background-shadow-size']);
			unset($atts['background-shadow-opacity']);

			// normal attribute
			foreach($atts as $key => $value){
				if( empty($value) ) continue;
				
				switch($key){
					
					case 'blur': 
						if( !empty($value) ){
							$att_style .= "-webkit-filter: blur({$value});";
							$att_style .= "-moz-filter: blur({$value});";
							$att_style .= "-o-filter: blur({$value});";
							$att_style .= "-ms-filter: blur({$value});";
							$att_style .= "filter: blur({$value});";
						}
						break;

					case 'border-radius': 
						if( is_array($value) ){
							if( !empty($value['top']) || !empty($value['right']) || !empty($value['bottom']) || !empty($value['left']) ){
								$value = wp_parse_args($value, array('top'=>'0', 'right'=>'0', 'bottom'=>'0', 'left'=>'0'));
								$value = "{$value['top']} {$value['right']} {$value['bottom']} {$value['left']}";
							}else if( !empty($value['top-left']) || !empty($value['top-right']) || !empty($value['bottom-left']) || !empty($value['bottom-right']) ){
								$value = wp_parse_args($value, array('top-left'=>'0', 'top-right'=>'0', 'bottom-left'=>'0', 'bottom-right'=>'0'));
								$value = "{$value['top-left']} {$value['top-right']} {$value['bottom-right']} {$value['bottom-left']}";
							}else if( !empty($value['t-left']) || !empty($value['t-right']) || !empty($value['b-left']) || !empty($value['b-right']) ){
								$value = wp_parse_args($value, array('top-left'=>'0', 'top-right'=>'0', 'bottom-left'=>'0', 'bottom-right'=>'0'));
								$value = "{$value['t-left']} {$value['t-right']} {$value['b-right']} {$value['b-left']}";
							}else{
								$value = '';
							}
						}

						if( !empty($value) ){
							$att_style .= "border-radius: {$value};";
							$att_style .= "-moz-border-radius: {$value};";
							$att_style .= "-webkit-border-radius: {$value};";
						}
						break;
					
					case 'gradient': 
					case 'gradient-v': 
						if( is_array($value) && sizeOf($value) > 1 ){
							$atts = '';
							if( $key == 'gradient-v' ){
								$atts = 'to right, ';
							}

							if( is_array($value[0]) ){
								$rgba_value = gdlr_core_format_datatype($value[0][0], 'rgba');
								$color1 = "rgba({$rgba_value}, {$value[0][1]})";
							}else{
								$color1 = $value[0];
							}
							if( is_array($value[1]) ){
								$rgba_value = gdlr_core_format_datatype($value[1][0], 'rgba');
								$color2 = "rgba({$rgba_value}, {$value[1][1]})";
							}else{
								$color2 = $value[1];
							}

							if( empty($value[2]) ){
								$att_style .= "background: linear-gradient({$atts}{$color1}, {$color2});";
								$att_style .= "-moz-background: linear-gradient({$atts}{$color1}, {$color2});";
								$att_style .= "-o-background: linear-gradient({$atts}{$color1}, {$color2});";
								$att_style .= "-webkit-background: linear-gradient({$atts}{$color1}, {$color2});";
							}else{
								if( is_array($value[2]) ){
									$rgba_value = gdlr_core_format_datatype($value[2][0], 'rgba');
									$color3 = "rgba({$rgba_value}, {$value[2][1]})";
								}else{
									$color3 = $value[2];
								}

								$att_style .= "background: linear-gradient({$atts}{$color1}, {$color2}, {$color3});";
								$att_style .= "-moz-background: linear-gradient({$atts}{$color1}, {$color2}, {$color3});";
								$att_style .= "-o-background: linear-gradient({$atts}{$color1}, {$color2}, {$color3});";
								$att_style .= "-webkit-background: linear-gradient({$atts}{$color1}, {$color2}, {$color3});";
							}
							
						}
						break;
					
					case 'background':
					case 'background-color':
						if( is_array($value) ){
							$rgba_value = gdlr_core_format_datatype($value[0], 'rgba');
							$att_style .= "{$key}: rgba({$rgba_value}, {$value[1]}) " . ($important? ' !important': '') . ";";
						}else{
							$att_style .= "{$key}: {$value} " . ($important? ' !important': '') . ";";
						}
						break;

					case 'background-image':
						if( $value == 'none' ){
							$att_style .= "background-image: none;";
						}else if( is_numeric($value) ){
							$image_url = gdlr_core_get_image_url($value);
							if( !empty($image_url) ){
								$att_style .= "background-image: url({$image_url}) " . ($important? ' !important': '') . ";";
							}
						}else{
							$att_style .= "background-image: url({$value}) " . ($important? ' !important': '') . ";";
						}
						break;
					
					case 'padding':
					case 'margin':
					case 'border-width':
						if( is_array($value) ){
							if( !empty($value['top']) && !empty($value['right']) && !empty($value['bottom']) && !empty($value['left']) ){
								$att_style .= "{$key}: {$value['top']} {$value['right']} {$value['bottom']} {$value['left']}" . ($important? ' !important': '') . ";";
							}else{
								foreach($value as $pos => $val){
									if( $pos != 'settings' && (!empty($val) || $val === '0') ){
										if( $key == 'border-width' ){
											$att_style .= "border-{$pos}-width: {$val}" . ($important? ' !important': '') . ";";
										}else{
											$att_style .= "{$key}-{$pos}: {$val}" . ($important? ' !important': '') . ";";
										}
									}
								}
							}
						}else{
							$att_style .= "{$key}: {$value};";
						}
						break;
					
					default: 
						$value = is_array($value)? ((empty($value[0]) || $value[0] === '0')? '': $value[0]): $value;
						$att_style .= "{$key}: {$value} " . ($important? ' !important': '') . ";";
				}
			}
			
			if( !empty($att_style) ){
				if( $wrap ){
					return 'style="' . esc_attr($att_style) . '" ';
				}
				return $att_style;
			}
			return '';
		}
	}
	
	// process data sent from the post variable
	if( !function_exists('gdlr_core_process_post_data') ){
		function gdlr_core_process_post_data( $post ){
			return stripslashes_deep($post);
		}
	}		
	
	// format data to specific type
	if( !function_exists('gdlr_core_format_datatype') ){
		function gdlr_core_format_datatype( $value, $data_type ){
			if( $data_type == 'color' ){
				return (strpos($value, '#') === false)? '#' . $value: $value; 
			}else if( $data_type == 'rgba' ){
				$value = str_replace('#', '', $value);
				if(strlen($value) == 3) {
					$r = hexdec(substr($value,0,1) . substr($value,0,1));
					$g = hexdec(substr($value,1,1) . substr($value,1,1));
					$b = hexdec(substr($value,2,1) . substr($value,2,1));
				}else{
					$r = hexdec(substr($value,0,2));
					$g = hexdec(substr($value,2,2));
					$b = hexdec(substr($value,4,2));
				}
				return $r . ', ' . $g . ', ' . $b;
			}else if( $data_type == 'text' ){
				return trim($value);
			}else if( $data_type == 'pixel' ){
				return (is_numeric($value))? $value . 'px': $value;
			}else if( $data_type == 'file' ){
				if(is_numeric($value)){
					$image_src = wp_get_attachment_image_src($value, 'full');	
					return (!empty($image_src))? $image_src[0]: false;
				}else{
					return $value;
				}
			}else if( $data_type == 'font'){
				return trim($value);
			}else if( $data_type == 'percent' ){
				return (is_numeric($value))? $value . '%': $value;
			}else if( $data_type == 'opacity' ){
				return (intval($value) / 100);
			} 
		}
	}	
	
	// retrieve all categories from each post type
	if( !function_exists('gdlr_core_get_taxonomies') ){	
		function gdlr_core_get_taxonomies(){

			$taxonomy = get_taxonomies();
			unset($taxonomy['nav_menu']);
			unset($taxonomy['link_category']);
			unset($taxonomy['post_format']);

			return $taxonomy;

		}
	}

	// retrieve all categories from each post type
	if( !function_exists('gdlr_core_get_term_list') ){	
		function gdlr_core_get_term_list( $taxonomy, $cat = '', $with_all = false ){
			$term_atts = array(
				'taxonomy'=>$taxonomy, 
				'hide_empty'=>0,
				'number'=>999
			);
			if( !empty($cat) ){
				if( is_array($cat) ){
					$term_atts['slug'] = $cat;
				}else{
					$term_atts['parent'] = $cat;
				}
			}
			$term_list = get_categories($term_atts);

			$ret = array();
			if( !empty($with_all) ){
				$ret[$cat] = esc_html__('All', 'goodlayers-core'); 
			}

			if( !empty($term_list) ){
				foreach( $term_list as $term ){
					if( !empty($term->slug) && !empty($term->name) ){
						$ret[$term->slug] = $term->name;
					}
				}
			}

			return $ret;
		}	
	}
	if( !function_exists('gdlr_core_get_term_list_id') ){	
		function gdlr_core_get_term_list_id( $taxonomy ){
			$term_atts = array(
				'taxonomy'=>$taxonomy, 
				'hide_empty'=>0,
				'number'=>5000
			);

			$term_list = get_categories($term_atts);

			$ret = array();
			if( !empty($term_list) ){
				foreach( $term_list as $term ){
					if( !empty($term->term_id) && !empty($term->name) ){
						$ret[$term->term_id] = $term->name;
					}
				}
			}

			return $ret;
		}	
	}
	
	// user role list
	if( !function_exists('gdlr_core_get_user_role_list') ){	
		function gdlr_core_get_user_role_list(){
			global $wp_roles; return $wp_roles->get_names();
		}
	}

	// retrieve all posts from each post type
	if( !function_exists('gdlr_core_get_post_list') ){	
		function gdlr_core_get_post_list( $post_type, $type = 'id' ){
			$post_list = get_posts(array('post_type' => $post_type, 'numberposts'=>999));

			$ret = array();
			if( !empty($post_list) ){
				foreach( $post_list as $post ){
					if( $type == 'slug' ){
						$ret[$post->post_name] = $post->post_title;
					}else{
						$ret[$post->ID] = $post->post_title;
					}
				}
			}
				
			return $ret;
		}	
	}

	// page builder content/text filer to execute the shortcode	
	if( !function_exists('gdlr_core_content_filter') ){
		add_filter( 'gdlr_core_the_content', 'wptexturize'        ); add_filter( 'gdlr_core_the_content', 'convert_smilies'    );
		add_filter( 'gdlr_core_the_content', 'convert_chars'      ); add_filter( 'gdlr_core_the_content', 'prepend_attachment' );	
		add_filter( 'gdlr_core_the_content', 'wpautop');
		add_filter( 'gdlr_core_the_content', 'shortcode_unautop');
		add_filter( 'gdlr_core_the_content', 'gdlr_core_do_shortcode', 11 );
		function gdlr_core_content_filter( $content, $main_content = false ){
			if($main_content) return str_replace( ']]>', ']]&gt;', apply_filters('the_content', $content) );
			
			$content = preg_replace_callback( '|("?https?://[^\s"<]+)|im', 'gdlr_core_content_oembed', $content );

			return apply_filters('gdlr_core_the_content', $content);
		}		
	}
	if( !function_exists('gdlr_core_content_oembed') ){
		function gdlr_core_content_oembed( $link ){

			if( substr($link[1], 0, 1) == '"' ){ 
				return $link[1]; 
			}

			if( preg_match('/youtube|youtu\.be|vimeo|spotify/', $link[1]) ){
				$html = wp_oembed_get($link[1]);
				
				if( $html ) return $html;
			}
			return $link[1];
		}
	}
	add_filter('oembed_dataparse', 'gdlr_core_oembed_cookies');
	add_filter('embed_oembed_html', 'gdlr_core_oembed_cookies');
	if( !function_exists('gdlr_core_oembed_cookies') ){
		function gdlr_core_oembed_cookies( $return ){
			$youtube_cookies = gdlr_core_youtube_cookies();

			if( !$youtube_cookies ){
				if( strpos($return, 'youtube-nocookie') === false ){
					$return = str_replace('youtube', 'youtube-nocookie', $return);
				}
			}
			return $return;
		}
	}


	if( !function_exists('gdlr_core_remove_extra_p') ){
		function gdlr_core_remove_extra_p( $text ){
			return str_replace('<p></p>', '', $text);
		}
	}
	if( !function_exists('gdlr_core_text_filter') ){
		add_filter('gdlr_core_text_filter', 'do_shortcode', 11);
		function gdlr_core_text_filter( $text ){
			return apply_filters('gdlr_core_text_filter', $text);
		}
	}

	// check broken html tag
	if( is_admin() ){ 
		add_filter( 'gdlr_core_the_content', 'gdlr_core_content_validate'); 
		add_filter( 'gdlr_core_text_filter', 'gdlr_core_content_validate'); 
	}
	if( !function_exists('gdlr_core_content_validate') ){
		function gdlr_core_content_validate( $content ){
			$open_tag  = substr_count($content, '<div');
			$open_tag += substr_count($content, '<iframe');

			$close_tag  = substr_count($content, '</div');
			$close_tag += substr_count($content, '</iframe');
			
			if( $open_tag == $close_tag ){
				return $content;
			}else{
				return esc_html__('Please ensure that all html is opened and closed properly.', 'goodlayers-core');
			}
		}
	}

	// only apply goodlayers shortcode in admin
	if( !function_exists('gdlr_core_do_shortcode') ){
		function gdlr_core_do_shortcode( $content ){

			if( !is_admin() ){
				return do_shortcode($content);
			}else{
				global $shortcode_tags, $gdlr_core_shortcode_tags;

				$allow_tags = apply_filters('gdlr_core_pb_allowed_shortcode', array());

				if( empty($gdlr_core_shortcode_tags) ){
					$gdlr_core_shortcode_tags = array();
					foreach( $shortcode_tags as $tag => $function ){
						if( strpos($tag, 'gdlr_core') !== false || in_array($tag, $allow_tags) ){
							$gdlr_core_shortcode_tags[$tag] = $function;
						}
					}
				}

				$orig_shortcode_tags = $shortcode_tags;

				$shortcode_tags = $gdlr_core_shortcode_tags;

				$content = do_shortcode($content);

				$shortcode_tags = $orig_shortcode_tags;

				return $content;
			}
		}
	}	
	
	// escape content with html
	if( !function_exists('gdlr_core_escape_content') ){
		function gdlr_core_escape_content( $content ){
			return apply_filters('gdlr_core_escape_content', $content);
		}
	}	
	
	// allow specific upload file format
	add_filter('upload_mimes', 'gdlr_core_custom_upload_mimes');
	if( !function_exists('gdlr_core_custom_upload_mimes') ){
		function gdlr_core_custom_upload_mimes( $existing_mimes = array() ){
			$existing_mimes['ttf'] = 'application/x-font-ttf';
			$existing_mimes['otf'] = 'application/x-font-opentyp'; 
			$existing_mimes['eot'] = 'application/vnd.ms-fontobject'; 
			$existing_mimes['woff'] = 'application/font-woff'; 
			$existing_mimes['svg'] = 'image/svg+xml'; 

			return $existing_mimes;
		}
	}

	// change the object to string
	if( !function_exists('gdlr_core_debug_object') ){
		function gdlr_core_debug_object( $object ){

			ob_start();
			print_r($object);
			$ret = ob_get_contents() . '<br><br>';
			ob_end_clean();

			return $ret;
		}
	}

	// create pagination link
	if( !function_exists('gdlr_core_get_pagination') ){	
		function gdlr_core_get_pagination($max_num_page, $settings = array(), $extra_class = '', $style = ''){
			if( $max_num_page <= 1 ) return '';
		
			$big = 999999999; // need an unlikely integer

			if( empty($settings['pagination-style']) || $settings['pagination-style'] == 'default' ){
				$style = apply_filters('gdlr_core_pagination_style', 'round');
			}else{
				$style = $settings['pagination-style'];
			}
			if( empty($settings['pagination-align']) || $settings['pagination-align'] == 'default' ){
				$align = apply_filters('gdlr_core_pagination_align', 'right');
			}else{
				$align = $settings['pagination-align'];
			}

			$with_border = (strpos($style, '-border') !== false);
			$style = str_replace('-border', '', $style);
			$current_page = empty($settings['paged']) ? 1: $settings['paged'];

			$pagination_class  = ' gdlr-core-style-' .  $style;
			$pagination_class .= ' gdlr-core-' .  $align . '-align';
			$pagination_class .= empty($with_border)? '': ' gdlr-core-with-border';
			$pagination_class .= empty($extra_class)? '': ' ' . $extra_class;
			
			if( is_single() ){
				return '<div class="gdlr-core-pagination ' . esc_attr($pagination_class) . '" ' . gdlr_core_esc_style(array(
					'margin-top' => empty($settings['pagination-top-margin'])? '': $settings['pagination-top-margin']
				)) . ' >' . paginate_links(array(
					'base' => add_query_arg(array('page'=>'%#%'), get_permalink()),
					'format' => '?page=%#%',
					'current' => max(1, $current_page),
					'total' => $max_num_page,
					'prev_text'=> '',
					'next_text'=> '',
					'show_all' => ($max_num_page <= 5)? true: false
				)) . '</div>';
			}else{
				return '<div class="gdlr-core-pagination ' . esc_attr($pagination_class) . '" ' . gdlr_core_esc_style(array(
					'margin-top' => empty($settings['pagination-top-margin'])? '': $settings['pagination-top-margin']
				)) . ' >' . paginate_links(array(
					'base' => str_replace($big, '%#%', get_pagenum_link($big, false)),
					'format' => '?paged=%#%',
					'current' => max(1, $current_page),
					'total' => $max_num_page,
					'prev_text'=> '',
					'next_text'=> '',
					'show_all' => ($max_num_page <= 5)? true: false
				)) . '</div>';
			}
		}	
	}		
	if( !function_exists('gdlr_core_get_ajax_pagination') ){	
		function gdlr_core_get_ajax_pagination($post_type, $settings, $max_num_page, $target, $extra_class = ''){
			if( $max_num_page <= 1 ) return '';
			
			if( empty($settings['pagination-style']) || $settings['pagination-style'] == 'default' ){
				$style = apply_filters('gdlr_core_pagination_style', 'round');
			}else{
				$style = $settings['pagination-style'];
			}
			if( empty($settings['pagination-align']) || $settings['pagination-align'] == 'default' ){
				$align = apply_filters('gdlr_core_pagination_align', 'right');
			}else{
				$align = $settings['pagination-align'];
			}
			$with_border = (strpos($style, '-border') !== false);
			$style = str_replace('-border', '', $style);
			$current_page = empty($settings['paged']) ? 1: $settings['paged'];

			$pagination_class  = ' gdlr-core-style-' .  $style;
			$pagination_class .= ' gdlr-core-' .  $align . '-align';
			$pagination_class .= empty($with_border)? '': ' gdlr-core-with-border';
			$pagination_class .= empty($extra_class)? '': ' ' . $extra_class;

			$ret  = '<div class="gdlr-core-pagination gdlr-core-js ' . esc_attr($pagination_class) . '" ';
			$ret .= 'data-ajax="gdlr_core_' . esc_attr($post_type) . '_ajax" ';
			$ret .= 'data-settings="' . esc_attr(json_encode($settings)) . '" ';
			$ret .= 'data-target="' . esc_attr($target) . '" ';
			$ret .= 'data-target-action="replace" ';
			$ret .= gdlr_core_esc_style(array(
				'margin-top' => empty($settings['pagination-top-margin'])? '': $settings['pagination-top-margin']
			));
			$ret .= '>';
			for($i=1; $i<=$max_num_page; $i++){
				if( $i == $current_page ){
					$ret .= '<a class="page-numbers gdlr-core-active" data-ajax-name="paged" data-ajax-value="' . $i . '" >' . $i . '</a> ';
				}else{
					$ret .= '<a class="page-numbers" data-ajax-name="paged" data-ajax-value="' . $i . '" >' . $i . '</a> ';
				}
			}
			$ret .= '</div>';

			return $ret;
		}	
	}
	if( !function_exists('gdlr_core_get_ajax_load_more') ){	
		function gdlr_core_get_ajax_load_more($post_type, $settings, $paged, $max_num_page, $target, $extra_class){

			$ret  = '';
			if( $paged <= $max_num_page ){
				$ret  = '<div class="gdlr-core-load-more-wrap gdlr-core-js gdlr-core-center-align ' . esc_attr($extra_class) . '" ';
				$ret .= 'data-ajax="gdlr_core_' . esc_attr($post_type) . '_ajax" ';
				$ret .= 'data-settings="' . esc_attr(json_encode($settings)) . '" ';
				$ret .= 'data-target="' . esc_attr($target) . '" ';
				$ret .= 'data-target-action="append" ';
				$ret .= '>';
				if( $paged <= $max_num_page ){
					$ret .= '<a href="#" class="gdlr-core-load-more gdlr-core-button-color" data-ajax-name="paged" data-ajax-value="' . esc_attr($paged) . '" ' . gdlr_core_esc_style(array(
						'margin-top' => empty($settings['pagination-top-margin'])? '': $settings['pagination-top-margin']
					)) . ' >';
					$ret .= apply_filters('gdlr_core_ajax_load_more_text', esc_html__('Load More', 'goodlayers-core'), $post_type);
					$ret .= '</a>';
				}
				$ret .= '</div>';
			}

			return $ret;
		}
	}
	if( !function_exists('gdlr_core_get_ajax_filterer') ){	
		function gdlr_core_get_ajax_filterer($post_type, $taxonomy, $settings, $target, $extra_class, $filterer_atts = array()){

			$ret  = '<div class="gdlr-core-filterer-wrap gdlr-core-js ' . esc_attr($extra_class) . '" ';
			$ret .= 'data-ajax="gdlr_core_' . esc_attr($post_type) . '_ajax" ';
			$ret .= 'data-settings="' . esc_attr(json_encode($settings)) . '" ';
			$ret .= 'data-target="' . esc_attr($target) . '" ';
			$ret .= 'data-target-action="replace" ';
			$filterer_atts = apply_filters('gdlr_core_filterer_css_atts', $filterer_atts, $settings);
			if( !empty($settings['filterer-bottom-margin']) ){
				$filterer_atts['margin-bottom'] = $settings['filterer-bottom-margin'];
			}
			if( !empty($settings['filterer-top-margin']) ){
				$filterer_atts['margin-top'] = $settings['filterer-top-margin'];
			}
			if( !empty($filterer_atts) ){
				$ret .= gdlr_core_esc_style($filterer_atts);
			}
			$ret .= ' >';

			// for all
			if( empty($settings['category']) ){

				$ret .= '<a href="#" class="gdlr-core-filterer gdlr-core-button-color gdlr-core-active" >' . esc_html__('All', 'goodlayers-core') . '</a>';
				$filters = gdlr_core_get_term_list($taxonomy);

			// parent category
			}else if( sizeof($settings['category']) == 1 ){

				$term = get_term_by('slug', $settings['category'][0], $taxonomy);
				$ret .= '<a href="#" class="gdlr-core-filterer gdlr-core-button-color gdlr-core-active" >' . gdlr_core_escape_content($term->name) . '</a>';
				$filters = gdlr_core_get_term_list($taxonomy, $term->term_id);

			// multiple category select
			}else{

				$ret .= '<a href="#" class="gdlr-core-filterer gdlr-core-button-color gdlr-core-active" >' . esc_html__('All', 'goodlayers-core') . '</a>';
				$filters = gdlr_core_get_term_list($taxonomy, $settings['category']);
				
			}

			$filter_sep = apply_filters('gdlr_core_filterer_separator', '');
			foreach( $filters as $slug => $name ){
				$ret .= $filter_sep;
				$ret .= '<a href="#" class="gdlr-core-filterer gdlr-core-button-color" data-ajax-name="category" data-ajax-value="' . esc_attr($slug) . '" >';
				$ret .= gdlr_core_escape_content($name);
				$ret .= '</a>';
			}

			if( !empty($settings['filterer-slide-bar']) ){
				$ret .= '<div class="gdlr-core-filterer-slide-bar" ></div>';
			}
			$ret .= '</div>'; // gdlr-core-filterer-wrap

			return $ret;
		}
	}

	// for preparing srcset
	if( !function_exists('gdlr_core_set_container') ){
		function gdlr_core_set_container( $container = true ){
			global $content_width, $gdlr_core_container, $gdlr_core_container_multiplier, $gdlr_core_item_multiplier;

			if( empty($container) ){
				$gdlr_core_container = 2560;
			}else if( $container === true ){
				$gdlr_core_container = $content_width;
			}else{
				$gdlr_core_container = $container;
			}
			$gdlr_core_content_width = $gdlr_core_container;
			$gdlr_core_container_multiplier = $gdlr_core_item_multiplier = 1;
		}
	}
	// main is column
	if( !function_exists('gdlr_core_set_container_multiplier') ){
		function gdlr_core_set_container_multiplier( $multiplier, $main = true ){
			global $gdlr_core_container, $gdlr_core_container_multiplier, $gdlr_core_item_multiplier;

			if( empty($gdlr_core_container) ){
				gdlr_core_set_container();
			}

			if( $main ){
				$gdlr_core_container_multiplier = $multiplier;
			}else{
				$gdlr_core_item_multiplier = $multiplier;
			}
		}
	}
	if( !function_exists('gdlr_core_get_image_srcset') ){
		function gdlr_core_get_image_srcset( $image_id, $image ){
			
			$enable_srcset = apply_filters('gdlr_core_enable_srcset', true);
			if( !$enable_srcset ) return;
			
			if( empty($image) || empty($image[0]) || empty($image[1]) || empty($image[2]) ) return;
			
			$srcset = '';
			
			// crop image
			$smallest_image = $image;
			$cropped_sizes = array(400, 600, 800);
			foreach( $cropped_sizes as $cropped_size ){
				if( $image[1] > $cropped_size + 100 ){
					$new_height = intval($cropped_size * intval($image[2]) / intval($image[1]));
					$cropped_image = gdlr_core_get_cropped_image( $image_id, $cropped_size, $new_height, false);
					
					if( !empty($cropped_image) ){
						$srcset .= empty($srcset)? '': ', ';
						if( function_exists('rocket_cdn_file') ){
							$srcset .= rocket_cdn_file($cropped_image) . ' ' . $cropped_size . 'w';
						}else{
							$srcset .= $cropped_image . ' ' . $cropped_size . 'w';
						}
						$smallest_image = array($cropped_image, $cropped_size, $new_height);
					}
				}
			}			
	
			if( !empty($srcset) ){
				$ret  = ' src="' . esc_url($image[0]) . '" width="' . esc_attr($image[1]) . '" height="' . esc_attr($image[2]) . '" ';
				// $ret  = ' src="' . esc_url($smallest_image[0]) . '" width="' . esc_attr($image[1]) . '" height="' . esc_attr($image[2]) . '" ';
				if( function_exists('rocket_cdn_file') ){
					$ret .= ' srcset="' . esc_attr($srcset) . ', ' . esc_attr(rocket_cdn_file($image[0])) . ' ' . esc_attr($image[1]) . 'w" ';
				}else{
					$ret .= ' srcset="' . esc_attr($srcset) . ', ' . esc_attr($image[0]) . ' ' . esc_attr($image[1]) . 'w" ';
				}
				// get screen size for query
				global $content_width, $gdlr_core_container, $gdlr_core_container_multiplier, $gdlr_core_item_multiplier;
				if( empty($gdlr_core_container) ){ gdlr_core_set_container(); }
				$column_size = intval(100 * $gdlr_core_container_multiplier * $gdlr_core_item_multiplier);
				$content_size = intval($gdlr_core_container * $gdlr_core_container_multiplier * $gdlr_core_item_multiplier);
				
				$sizes = '(max-width: 767px) 100vw';
				if( $gdlr_core_container >= 2560 ){
					$sizes .= ', ' . $column_size . 'vw';
				}else{
					$sizes .= ', (max-width: ' . $gdlr_core_container . 'px) ' . $column_size . 'vw';
					$sizes .= ', ' . $content_size . 'px';
				}
				
				$ret .= ' sizes="' . esc_attr($sizes) . '" ';
				return $ret;
			}

			return '';
		}
	}

	if( !function_exists('gdlr_core_get_cropped_image') ){
		function gdlr_core_get_cropped_image( $attachment_id = 0, $width, $height, $html = true ){
			if( empty($attachment_id) ){
				return;
			}

			$original_path = get_attached_file($attachment_id);
			$orig_info = pathinfo($original_path);
			$dir = $orig_info['dirname'];
			$ext = $orig_info['extension'];	

			$suffix = "{$width}x{$height}";
			$name = wp_basename($original_path, ".{$ext}");
			$destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";

			$attachment = wp_get_attachment_image_src($attachment_id, 'full');
			$destfileurl = str_replace($name, $name . '-' . $suffix, $attachment[0]);

			if( !file_exists($destfilename) ){

				// get attachment for resize && check if it's resizable
				$attachment_thumbnail = wp_get_attachment_image_src($attachment_id, 'thumbnail');
				if( $attachment[1] == $attachment_thumbnail[1] && $attachment[2] == $attachment_thumbnail[2] ){
					return;
				}
			
				// crop an image
				$cropped_image = wp_get_image_editor($original_path);
				if( !is_wp_error($cropped_image) ) {
					$cropped_image->resize($width, $height, true);
					$cropped_image->save($destfilename);

					if( !$html ){
						return $destfileurl;
					}else{
						$alt_text = get_post_meta($attachment_id , '_wp_attachment_image_alt', true);
						return '<img src="' . esc_url($destfileurl) . '" width="' . esc_attr($width) . '" height="' . esc_attr($height) . '" alt="' . (empty($alt_text)? '': $alt_text) . '" >';
					}
				}
			}else{
				if( !$html ){
						return $destfileurl;
				}else{
					$alt_text = get_post_meta($attachment_id , '_wp_attachment_image_alt', true);
					return '<img src="' . esc_url($destfileurl) . '" width="' . esc_attr($width) . '" height="' . esc_attr($height) . '" alt="' . (empty($alt_text)? '': $alt_text) . '" >';
				}
			}

		} // gdlr_core_get_cropped_image
	} // function_exists


	if( !function_exists('gdlr_core_to_shortcode') ){
		function gdlr_core_to_shortcode( $name, $atts, $content = null ){
			$ret = '[' . $name . ' ';
			foreach( $atts as $att_key => $att_val ){
				$ret .= $att_key . '="' . esc_attr($att_val) . '" ';
			}
			$ret .= ']';

			if( $content !== null ){
				$ret .= esc_html($content) . '[/' . $name . ']';
			}

			return $ret;
		}
	}

	add_action('wp_footer', 'gdlr_core_inline_style');
	if( !function_exists('gdlr_core_inline_style') ){
		function gdlr_core_inline_style(){
			global $gdlr_core_inline_style;

			if( !empty($gdlr_core_inline_style) ){
				echo '<style>'. $gdlr_core_inline_style . '</style>';
			}
		}
	}
	if( !function_exists('gdlr_core_add_inline_style') ){
		function gdlr_core_add_inline_style( $css ){
			global $gdlr_core_inline_style;

			$gdlr_core_inline_style  = empty($gdlr_core_inline_style)? '': $gdlr_core_inline_style;
			$gdlr_core_inline_style .= $css;
		}
	}

	if( !function_exists('gdlr_core_option_to_css') ){
		function gdlr_core_option_to_css($option_slug, $option, $option_val){

			$ret = '';

			if( empty($option['data-type']) ){
				$option['data-type'] = 'color';
			}else if( $option['data-type'] == 'rgba' ){

				// replace the rgba first
				$value = gdlr_core_format_datatype($option_val[$option_slug], 'rgba');
				$option['selector'] = str_replace('#gdlra#', $value, $option['selector']);
				
				$option['data-type'] = 'color';

			}
			$value = gdlr_core_format_datatype($option_val[$option_slug], $option['data-type']);

			// for secondary selector
			if( !empty($option['selector-extra']) ){ 

				while( $start_extra = strpos($option['selector'], '<') ){
					$end_extra = strpos($option['selector'], '>');
					$end_alpha = strpos($option['selector'], '>a');
					$end_text = strpos($option['selector'], '>t');

					if( $start_extra !== false && $end_extra !== false ){
						$custom_slug = substr($option['selector'], ($start_extra + 1), ($end_extra - $start_extra - 1));
						
						if( $end_alpha !== false ){
							$custom_value = gdlr_core_format_datatype($option_val[$custom_slug], 'rgba');
							$option['selector'] = str_replace('<' . $custom_slug . '>a', $custom_value, $option['selector']);
						}else if( $end_text !== false ){
							$custom_value = gdlr_core_format_datatype($option_val[$custom_slug], 'text');
							$option['selector'] = str_replace('<' . $custom_slug . '>t', $custom_value, $option['selector']);
						}else{
							$custom_value = gdlr_core_format_datatype($option_val[$custom_slug], $option['data-type']);
							$option['selector'] = str_replace('<' . $custom_slug . '>', $custom_value, $option['selector']);
						}
					}
				}
			}

			if( empty($value) && $option['data-type'] == 'image' ){
				
			}else{
				$ret .= str_replace('#gdlr#', $value, $option['selector']) . " \n";
			}

			return $ret;

		}
	}