<?php
/**
*
*	King Composer
*	(c) KingComposer.com
*
*/
if(!defined('KC_FILE')) {
	header('HTTP/1.0 403 Forbidden');
	exit;
}

if( !function_exists('wp_list_widgets') )
	require_once(ABSPATH . '/wp-admin/includes/widgets.php');

function kc_admin_enable( $force = false ){

	if( $force === true )
		return true;

	global $post, $kc;

	$type = !empty( $post->post_type ) ? $post->post_type:'';
	$page = !empty( $_GET['page'] ) ? $_GET['page'] : '';

	$allows_types = $kc->get_support_content_types();

	if( is_admin() && ( in_array( $type, $allows_types ) || $page == 'kc-mapper' || $kc->is_live() ) )
		return true;
	else return false;

}

function kc_add_map( $map = array() ){

	global $kc;

	if( !is_array( $map ) )
		return;

	$kc->add_map( $map );

}
/*
*	Add maps from exported file
*/
function kc_include_map($file) {

	if (!file_exists($file))
		return;

	ob_start();
	@include($file);
	$data = ob_get_contents();
	ob_end_clean();

	/*
	$handle = fopen($file, 'r' );
	$data = fread($handle, filesize($file));
	fclose($handle);
	*/

	$data = @json_decode($data, true);

	if (!empty($data) && is_array($data)) {
		global $kc;
		$kc->add_map($data);
	}

}

function kc_remove_map( $name = '' ){

	global $kc;

	if( empty( $name ) )
		return;

	$kc->remove_map( $name );

}

function kc_prebuilt_template ($name = '', $pack = '') {

	global $kc;

	if (empty($name) || empty($pack))
		return false;

	$kc->prebuilt_template ($name, $pack);

}

function kc_hide_element( $name = '' ){

	global $kc;

	if( empty( $name ) )
		return;

	$kc->hide_element( $name );

}

function kc_add_param_type( $name = '', $func = '' ){

	global $kc;

	if( empty( $name ) || empty( $func ) )
		return;

	$kc->add_param_type( $name, $func );

}

function kc_add_icon( $source = '' ){

	if( !empty( $source ) ){
		KingComposer::globe()->add_icon_source( $source );
	}
}

function kc_remove_wpautop( $content, $autop = false ) {

	if ( $autop ) {
		$content = wpautop( preg_replace( '/<\/?p\>/', "\n", $content ) . "\n" );
	}

	return do_shortcode( shortcode_unautop( $content ) );
}

function kc_validate_options( $plugin_options ){

	if( isset( $_POST['kc_options'] ) && !empty( $_POST['kc_options'] ) ){
		if( isset( $_POST['re-active-kc-pro'] ) && $_POST['re-active-kc-pro'] == '1' ){
			$result = activate_plugin( 'kc_pro/kc_pro.php' );
		}
		return $plugin_options;
	}

}

function kc_youtube_id_from_url( $url = '' ) {

    parse_str( parse_url( $url, PHP_URL_QUERY ), $vars );

	return isset( $vars['v'] ) ? $vars['v'] : '';

}

function kc_loop_box( $items ){

	if( empty( $items ) )
		return '';

	$output = '';

	foreach( $items as $item ){

		if( is_object( $item ) && $item->tag != 'text' ){


			if( !isset( $item->attributes ) || !is_object( $item->attributes ) )
				$item->attributes = new stdClass();

			if( !isset( $item->attributes->class ) )
				$item->attributes->class = '';

			if( $item->tag == 'image' )
				$item->tag = 'img';
			if( $item->tag == 'icon' )
				$item->tag = 'i';
			if( $item->tag == 'column' ){
				$item->tag = 'div';
				$item->attributes->class .= ' '.$item->attributes->cols;
				unset( $item->attributes->cols );
			}

			$output .= '<'.$item->tag;

			if( $item->tag == 'img' ){
				if( empty( $item->attributes->src ) )
					$item->attributes->src = KC_URL.'/assets/images/get_start.jpg';

				if( $item->tag == 'img' && !isset( $item->attributes->alt ) )
					$item->attributes->alt = '';
			}

			foreach( $item->attributes as $k => $v ){
				if( !empty($v) )$output .= ' '.$k.'="'.trim($v).'"';
			}

			if( $item->tag == 'img' )
				$output .= '/';

			$output .= '>';

			if( is_array( $item->children ) )
				$output .= kc_loop_box( $item->children );

			if( $item->tag != 'img' )
				$output .= '</'.$item->tag.'>';

		}else $output .= $item->content;

	}

	return $output;

}

function kc_get_terms( $tax = 'category', $key = 'id', $type = '', $default = '' ){

	$get_terms = (array) get_terms( $tax, array( 'hide_empty' => false ) );

	if( $type != '' ){
		$get_terms = kc_get_terms_by_post_type( array($tax), array($type) );
	}

	$terms = array();

	if( $default != '' ){
		$terms[] = $default;
	}

	if ( $key == 'id' ){
		foreach ( $get_terms as $term ){
			if( isset( $term->term_id ) && isset( $term->name ) ){
				$terms[$term->term_id] = $term->name;
			}
		}
	}else if ( $key == 'slug' ){
		foreach ( $get_terms as $term ){
			if( !empty($term->name) ){
				if( isset( $term->slug ) && isset( $term->name ) ){
					$terms[$term->slug] = $term->name;
				}
			}
		}
	}

	return $terms;

}

function kc_filter_search( $s, &$w ) {

	global $wpdb;

	if ( empty( $s ) )return '';

	$q = $w->query_vars;

	$n = ! empty( $q['exact'] ) ? '' : '%';
	$s = $sa = '';

	foreach ( (array) $q['search_terms'] as $t ) {
		$t = $wpdb->esc_like( $t );
		$l = $n . $t . $n;
		$s .= $wpdb->prepare( "{$sa}($wpdb->posts.post_title LIKE %s)", $l );
		$sa = ' AND ';
	}

	if ( ! empty( $s ) )
		$s = " AND ({$s}) ";

	return $s;
}

function kc_get_submit_button( $text = '', $type = 'primary large', $name = 'submit', $wrap = true, $other_attributes = '' ) {

	if ( ! is_array( $type ) )
		$type = explode( ' ', $type );

	$button_shorthand = array( 'primary', 'small', 'large' );
	$classes = array( 'button' );
	foreach ( $type as $t ) {
		if ( 'secondary' === $t || 'button-secondary' === $t )
			continue;
		$classes[] = in_array( $t, $button_shorthand ) ? 'button-' . $t : $t;
	}
	$class = implode( ' ', array_unique( $classes ) );

	if ( 'delete' === $type )
		$class = 'button-secondary delete';

	$text = $text ? $text : __( 'Save Changes' );

	// Default the id attribute to $name unless an id was specifically provided in $other_attributes
	$id = $name;
	if ( is_array( $other_attributes ) && isset( $other_attributes['id'] ) ) {
		$id = $other_attributes['id'];
		unset( $other_attributes['id'] );
	}

	$attributes = '';
	if ( is_array( $other_attributes ) ) {
		foreach ( $other_attributes as $attribute => $value ) {
			$attributes .= $attribute . '="' . esc_attr( $value ) . '" '; // Trailing space is important
		}
	} elseif ( ! empty( $other_attributes ) ) { // Attributes provided as a string
		$attributes = $other_attributes;
	}

	// Don't output empty name and id attributes.
	$name_attr = $name ? ' name="' . esc_attr( $name ) . '"' : '';
	$id_attr = $id ? ' id="' . esc_attr( $id ) . '"' : '';

	$button = '<input type="submit"' . $name_attr . $id_attr . ' class="' . esc_attr( $class );
	$button	.= '" value="' . esc_attr( $text ) . '" ' . $attributes . ' />';

	if ( $wrap ) {
		$button = '<p class="submit">' . $button . '</p>';
	}

	return $button;
}

function kc_process_tab_title( $matches ){

	if( !empty( $matches[0] ) ){

		$tab_atts = shortcode_parse_atts( $matches[0] );

		$title = ''; $adv_title = '';$tab_id='';
		if ( isset( $tab_atts['title'] ) )
			$title = $tab_atts['title'];
		if ( isset( $tab_atts['tab_id'] ) )
			$tab_id = $tab_atts['tab_id'];

		if( isset( $tab_atts['advanced'] ) && $tab_atts['advanced'] === 'yes' ){

			if( isset( $tab_atts['adv_title'] ) && !empty( $tab_atts['adv_title'] ) )
				$adv_title = base64_decode( $tab_atts['adv_title'] );

			$icon=$icon_class=$image=$image_id=$image_url=$image_thumbnail=$image_medium=$image_large=$image_full='';

			if( isset( $tab_atts['adv_icon'] ) && !empty( $tab_atts['adv_icon'] ) ){
				$icon_class = $tab_atts['adv_icon'];
				$icon = '<i class="'.$tab_atts['adv_icon'].'"></i>';
			}

			if( isset( $tab_atts['adv_image'] ) && !empty( $tab_atts['adv_image'] ) ){
				$image_id = $tab_atts['adv_image'];
				$image_url = wp_get_attachment_image_src( $image_id, 'full' );
				$image_medium = wp_get_attachment_image_src( $image_id, 'medium' );
				$image_large = wp_get_attachment_image_src( $image_id, 'large' );
				$image_thumbnail = wp_get_attachment_image_src( $image_id, 'thumbnail' );

				if( !empty( $image_url ) && isset( $image_url[0] ) ){
					$image_url = $image_url[0];
					$image_full = $image_url;
				}
				if( !empty( $image_medium ) && isset( $image_medium[0] ) )
					$image_medium = $image_medium[0];

				if( !empty( $image_large ) && isset( $image_large[0] ) )
					$image_large = $image_large[0];

				if( !empty( $image_thumbnail ) && isset( $image_thumbnail[0] ) )
					$image_thumbnail = $image_thumbnail[0];
				if( !empty( $image_url ) )
					$image = '<img src="'.$image_url.'" alt="" />';
			}

			$adv_title = str_replace( array( '{title}', '{icon}', '{icon_class}', '{image}', '{image_id}', '{image_url}', '{image_thumbnail}', '{image_medium}', '{image_large}', '{image_full}', '{tab_id}' ), array( $title, $icon, $icon_class, $image, $image_id, $image_url, $image_thumbnail, $image_medium, $image_large, $image_full, $tab_id ), $adv_title );

			echo '<li>'.$adv_title.'</li>';

		}else{
			if( isset( $tab_atts['icon_option'] ) && $tab_atts['icon_option']  == 'yes' ){
				if(empty($tab_atts['icon']))
					$tab_atts['icon'] = 'fa-leaf';
				$title = '<i class="'.$tab_atts['icon'].'"></i> '.$title;
			}
			echo '<li><a href="#'.(isset($tab_atts['tab_id']) ? $tab_atts['tab_id'] : '').'" data-prevent="scroll">'.$title.'</a></li>';
		}

	}

	return $matches[0];

}

function kc_is_using(){

	global $post;

	if( !isset( $post ) || !isset( $post->ID ) || empty( $post->ID ) || !get_post_meta( $post->ID , 'kc_data', false ) )
		return false;

	$kc_meta = get_post_meta( $post->ID , 'kc_data', true );

	if( isset( $kc_meta['mode'] ) && $kc_meta['mode'] == 'kc' )
		return true;
	else return false;

}

function kc_js_callback( $callback ){

	global $kc;
	$kc->js_callback( $callback );

}

function kc_add_content_type( $type = '', $setion = true  ){

	global $kc;
	if( !empty( $type ) )
		$kc->add_content_type( $type, $setion );

}

/*
 * Return the type of content
 */
function kc_get_post_type(){

	global $post;

	$type = '';

	if( isset( $post ) && isset( $post->post_type ) )
		$type = $post->post_type;

	return $type;

}

/*
 * Get content as raw format
 */
function kc_raw_content( $id = 0 ){

	$content = '';

	if ( FALSE !== get_post_status( $id ) ) {

		$content = get_post_field('post_content_filtered', $id );
		if( empty( $content ) )
			$content = get_post_field( 'post_content', $id );

	}

	return $content;
}

function kc_do_shortcode( $content = '' ){

	if( empty( $content ) )
		return '';

	global $kc_front;

	if( !isset( $kc_front ) )
		return do_shortcode( $content );
	else return $kc_front->do_shortcode( $content );

}

function kc_remove_dir ($dirPath = '') {

	if (empty($dirPath))
		return false;

	$dirPath = untrailingslashit($dirPath).KDS;

	if ($dirPath == ABSPATH)
		return false;

    if (! is_dir($dirPath)) {
        return false;
    }

    $files = scandir($dirPath, 1);

    foreach ($files as $file) {
	    if ($file != '.' && $file != '..') {
	        if (is_dir($dirPath.$file)) {
	        	kc_remove_dir($dirPath.$file);
	        } else {
	            unlink($dirPath.$file);
	        }
        }
    }

    if (is_file($dirPath.'.DS_Store'))
    	unlink($dirPath.'.DS_Store');

    return rmdir($dirPath);

}
/*
* Read changelogs from readme.txt
*/
function kc_changelogs(){

	$path = KC_PATH.KDS.'readme.txt';
	if (file_exists($path)) {

		$content = @file_get_contents($path);
		$anchor = strpos($content, '== Changelog ==');

		if (!empty($content) && $anchor !== false) {

			$content = substr($content, $anchor + strlen('== Changelog =='));
			$content = explode("\n", $content);
			$group = array('newfeatures' => array(), 'improve' => array(), 'bugfixes' => array(), 'changes' => array(), 'remove' => array());

			foreach ($content as $n => $line) {

				$line = trim($line);

				if (substr ($line, 0, 1) == '*') {

					$line = trim(substr ($line, 1));
					if (strpos($line, '[New]') === 0)
						$group['newfeatures'][] = substr ($line, 5);
					else if (strpos($line, '[Improve]') === 0)
						$group['improve'][] = substr ($line, 9);
					else if (strpos($line, '[Fix]') === 0)
						$group['bugfixes'][] = substr ($line, 5);
					else if (strpos($line, '[Remove]') === 0)
						$group['remove'][] = substr ($line, 8);
					else $group['changes'][] = $line;

				}
				else {

					foreach ($group as $label => $items) {
						if (count($items) > 0) {
							echo '<div class="kc-log-type '.esc_attr($label).'"><strong>'.esc_attr($label).'</strong></div>';
							echo '<ul>';
							foreach ($items as $i => $item) {
								if (!empty($item))
									echo '<li>'.esc_html($item).'</li>';
							}
							echo '</ul>';
						}
					}

					$group = array('newfeatures' => array(), 'improve' => array(), 'bugfixes' => array(), 'changes' => array(), 'remove' => array());

					if (substr ($line, strlen($line)-1) == '=' && substr ($line, 0, 1) == '=')
						echo '<h3 class="kc-log-ver">Version '.substr ($line, 1, strlen($line)-2).'</h3>';

				}
			}

		} else {
			_e('Error: Could not read data', 'kingcomposer');
		}

	} else {
		_e('Error: Could not find the file readme.txt', 'kingcomposer');
	}

}
/*
*	Build list template from prebuilt list
*/
function kc_prerebuilt_templates ($data = array(), $registered = array()) {

	if (!isset($data['data']))
		return $data;

	$lz = array();

	foreach ($registered as $name => $path) {
		if (!isset($data['data']['term']) || empty($data['data']['term']) || !isset($registered[$data['data']['term']]))
			$data['data']['term'] = $name;
		$data['data']['terms'][] = array('name' => $name, 'id' => '', 'taxonomy' => $name);
	}

	$posts = kc_get_template_xml($registered[$data['data']['term']], '', $data['data']['s']);

	if (count($posts) > 0) {

		$to = (int)$data['data']['paged']*(int)$data['data']['per_page'];
		$start = $to-(int)$data['data']['per_page'];

		$data['data']['items'] = array();

		for($i = $start; $i < $to; $i++){
			if (isset($posts[$i]))
				$data['data']['items'][] = $posts[$i];
		}

		$data['data']['total'] = ceil(count($posts)/(int)$data['data']['per_page']);
		$data['data']['count'] = count($posts);
		$data['stt'] = 1;
		$data['message'] = 'Success';
	}else{
		$data['message'] = '<span style="font-size: 50px;">\\(^Д^)/</span><br /><br /><span style="font-size: 16px">'.__('Oops, there are no template found in package', 'kingcomposer').' <strong>'.$data['data']['term'].'</strong><br /><small><i>'.$registered[$data['data']['term']].'</i></small>';
	}

	return $data;

}
/*
*	Read templates from xml
*/
function kc_get_template_xml($file = '', $id = '', $s = '') {

	if (empty($file) || !file_exists($file))
		return null;

	$xml = simplexml_load_file($file);
	$posts = array();

	foreach ($xml->channel->item as $item) {

		$meta = $item->children('http://wordpress.org/export/1.2/');

		$kc_meta = false;

		for ($i = 0; $i < count($meta->postmeta); $i++) {
			if ($meta->postmeta[$i]->meta_key == 'kc_data') {
				$kc_meta = unserialize($meta->postmeta[$i]->meta_value);
				break;
			}
		}

		if (!empty($id) && $id == (string)$meta->post_id) {
			if ($kc_meta !== false && isset($kc_meta['mode']) && $kc_meta['mode'] == 'kc') {
				$content = $item->children('http://purl.org/rss/1.0/modules/content/');
				return array((string)$content->encoded, $kc_meta);
			}else{
				return array(null, null);
			}
		}

		if ($kc_meta !== false && isset($kc_meta['mode']) && $kc_meta['mode'] == 'kc') {
			if ($s === '' || strpos(strtolower(html_entity_decode($item->title)), strtolower($s)) !== false) {
				$posts[] = array(
					'title' => html_entity_decode($item->title),
					'preview' => isset($kc_meta['thumbnail']) ? $kc_meta['thumbnail'] : '',
					'date' => date('F d, Y', strtotime((string)$item->pubDate)),
					'categories' => array(),
					'id' => (string)$meta->post_id,
					'type' => 'xml'
				);
			}

		}

	}

	return $posts;

}
/*
*	Read templates from xml
*/
function kc_set_transient_xml_attachs() {

	global $kc, $wpdb;

	$delete_transient = "delete from {$wpdb->options} where option_name like '_transient_kc_attach_xml_%' or option_name like '_transient_timeout_kc_attach_xml_%'";

	$xmls = $kc->get_prebuilt_templates();

	if (is_array($xmls) && count($xmls) > 0) {

		$sizes = 0;
		$names = '';
		$unique_key = get_option('kc_map_xml_attachments', true);

		foreach ($xmls as $file) {

			if (file_exists($file)) {

				$sizes += filesize($file);
				$names .= $file;

			}
		}

		$unique = md5($names).$sizes;

		if ($unique_key !== $unique) {

			update_option('kc_map_xml_attachments', $unique);

			// DELETE transient	before adding new fresh bellow
			$wpdb->query($delete_transient);

			foreach ($xmls as $file) {

				if (file_exists($file)) {

					$xml = simplexml_load_file($file);
					foreach ($xml->channel->item as $item) {

						$meta = $item->children('http://wordpress.org/export/1.2/');
						if ((string)$meta->post_type == 'attachment') {

							$_wp_attached_file = '';
							$_wp_attachment_metadata = array();

							for ($i = 0; $i < count($meta->postmeta); $i++) {
								if ($meta->postmeta[$i]->meta_key == '_wp_attached_file') {
									$_wp_attached_file = (string)$meta->postmeta[$i]->meta_value;
								}
								if ($meta->postmeta[$i]->meta_key == '_wp_attachment_metadata') {
									$_wp_attachment_metadata = unserialize($meta->postmeta[$i]->meta_value);
								}
							}

							$serialized_value = maybe_serialize(array(
								'url' => (string)$meta->attachment_url,
								'metadata' => $_wp_attachment_metadata,
								'expiration' => (defined('KC_ATTACHS_XML_EXPIRATION') ? (time()+(int)KC_ATTACHS_XML_EXPIRATION) : 0)
							));

							$wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", '_transient_kc_attach_xml_'.(string)$meta->post_id, $serialized_value, 'no' ) );

						}

					}

				}
			}

		}

	} else if (get_option('kc_map_xml_attachments')) {
		$wpdb->query($delete_transient);
		delete_option('kc_map_xml_attachments');
	}

}

/*
*	preg replace attach url
*/
function kc_images_filter($url = '') {

	//$regx = '/\%SITE\_URL\%(.+?)\.(jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG|http)/';
	//$regx = '/\%SITE\_URL\%(.+?)\.([A-Za-z0-9\s]+)/i';
	$regx = '/\%SITE\_URL\%(.+?)(\'|\"|\)|\ )/i';

	return preg_replace_callback($regx, 'kc_images_filter_callback', $url);

}
function kc_images_filter_callback($m) {

	return kc_attach_url(KC_SITE.$m[1]).$m[2];

}
/*
*	Fix attach urls
*/
function kc_attach_url($url = '') {

	if (strpos($url, KC_SITE.'/wp-content') === false)
		return $url;

	global $kc;
	$xmls = $kc->get_prebuilt_templates();

	$test_exist = str_replace(
		array(KC_SITE . '/wp-content', '/', '\\'),
		array(untrailingslashit(WP_CONTENT_DIR), KDS, KDS),
		$url
	);

	if (count($xmls) === 0) {

		if (strpos($url, KC_SITE) === 0 && !file_exists($test_exist)) {
			return KC_URL.'/assets/images/get_start.jpg';
		}

		return $url;

	}

	if (strpos($url, KC_SITE) === 0 && file_exists($test_exist)) {
		return $url;
	}else{

		global $wpdb;

		kc_set_transient_xml_attachs();

		$xurl = str_replace(KC_SITE, '', esc_url($url));
		$posts = $wpdb->get_results("select * from {$wpdb->options} where (option_name like '_transient_kc_attach_xml_%' or option_name like '_transient_timeout_kc_attach_xml_%') and option_value like '%".$xurl."%'");

		if (count($posts) > 0) {

			$attach = unserialize($posts[0]->option_value);

			if (isset($attach['expiration']) && ($attach['expiration'] === 0 || $attach['expiration'] > time())) {
				if (isset($attach['url']) &&
					strpos($attach['url'], $xurl) !== false &&
					strpos($attach['url'], "/wp-content/uploads") !== false
				){
					$attach['url'] = explode("/wp-content/uploads", $attach['url']);
					return $attach['url'][0].$xurl;
				}
			}else{
				delete_transient(str_replace('_transient_', '', $posts[0]->option_name));
			}
		}
	}

	return $url;

}
/*
 * Return a random string with length
 */
function kc_random_string( $length = 10 ){
	$str = "";
	$allow_characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
	$_max_length = count($allow_characters) - 1;

	for ($i = 0; $i < $length; $i++) {
		$rand = mt_rand(0, $_max_length);
		$str .= $allow_characters[$rand];
	}

	return $str;
}
/*
 * Get first image in content of a post
 */
function kc_first_image( $content ) {

	$first_img = '';

	ob_start();
	ob_end_clean();

	$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches);

	if( isset($matches[1][0]) )
		return $matches[1][0];

	return false;
}
/*
 * Sort screen size as ordering
 */
function kc_screen_sort( array &$array ) {
	$screens = array('any', '1000-5000', '1024', '999', '767', '479');
	uksort($array, function($key1, $key2) use ($screens) {
		return (array_search($key1, $screens) > array_search($key2, $screens));
	});
}

/*
 * Sort first array base on key as array second
 */
function kc_abasort( array &$array, $order ) {
	$order = array('any', '1000-5000', '1024', '999', '767', '479');
	uksort($array, function($key1, $key2) use ($order) {
		return (array_search($key1, $order) > array_search($key2, $order));
	});
}


/*
 * Return options for CSS columns
 */

function kc_column_options ( $selector ){

    return array(
        array(
            'screens' => "any,1024,999,767,479",
            'Typography' => array(
                array('property' => 'color', 'label' => 'Color'),
                array('property' => 'font-size', 'label' => 'Font Size'),
                array('property' => 'font-weight', 'label' => 'Font Weight'),
                array('property' => 'font-style', 'label' => 'Font Style'),
                array('property' => 'font-family', 'label' => 'Font Family'),
                array('property' => 'text-align', 'label' => 'Text Align'),
                array('property' => 'text-shadow', 'label' => 'Text Shadow'),
                array('property' => 'text-transform', 'label' => 'Text Transform'),
                array('property' => 'text-decoration', 'label' => 'Text Decoration'),
                array('property' => 'line-height', 'label' => 'Line Height'),
                array('property' => 'letter-spacing', 'label' => 'Letter Spacing'),
                array('property' => 'overflow', 'label' => 'Overflow'),
                array('property' => 'word-break', 'label' => 'Word Break'),
            ),
            //Background group
            'Background' => array(
                array('property' => 'background'),
            ),
            //Box group
            'Box' => array(
                array('property' => 'margin', 'label' => 'Margin'),
                array('property' => 'padding', 'label' => 'Padding'),
                array('property' => 'border', 'label' => 'Border'),
                array('property' => 'width', 'label' => 'Width'),
                array('property' => 'height', 'label' => 'Height'),
                array('property' => 'border-radius', 'label' => 'Border Radius'),
                array('property' => 'float', 'label' => 'Float'),
                array('property' => 'display', 'label' => 'Display'),
                array('property' => 'box-shadow', 'label' => 'Box Shadow'),
                array('property' => 'opacity', 'label' => 'Opacity'),
            ),

            //Box group
            'Inside' => array(
                array('property' => 'margin', 'label' => 'Margin', 'selector' => $selector),
                array('property' => 'padding', 'label' => 'Padding', 'selector' => $selector),
                array('property' => 'border', 'label' => 'Border', 'selector' => $selector),
                array('property' => 'width', 'label' => 'Width', 'selector' => $selector),
                array('property' => 'height', 'label' => 'Height', 'selector' => $selector),
                array('property' => 'border-radius', 'label' => 'Border Radius', 'selector' => $selector),
                array('property' => 'float', 'label' => 'Float', 'selector' => $selector),
                array('property' => 'display', 'label' => 'Display', 'selector' => $selector),
                array('property' => 'box-shadow', 'label' => 'Box Shadow', 'selector' => $selector),
                array('property' => 'opacity', 'label' => 'Opacity', 'selector' => $selector),
            ),

            //Custom code css
            'Custom' => array(
                array('property' => 'custom', 'label' => 'Custom CSS')
            )
        ),
    );
}
