?
Current File : /home/c/i/d/cideo/www/wp-includesVIp/js/crop/images/loop.tar
templates.html000066600000022424151262626420007446 0ustar00<script type="text/html" id="vcl-loop-frame">
    <div class="vc_row">
        <div class="vc_col-sm-12">
            <# if(vc.loop_field_not_hidden('post_type', loop)) { #>
                <label class="wpb_element_label"><?php _e('Post types', 'js_composer') ?></label>

                <div class="post-types-list">
                    {{{ vc.loop_partial('checkboxes', 'post_type', loop) }}}
                </div>
                <span class="description clear"><?php _e('Select post types to populate posts from. Note: If no post type is selected, WordPress will use default "Post" value.', 'js_composer'); ?></span>
                <# } #>
        </div>
    </div>
    <div class="vc_row">
        <# if(vc.loop_field_not_hidden('size', loop)) { #>
            <div class="vc_col-sm-4">
                <label class="wpb_element_label"><?php _e('Post count', 'js_composer') ?></label>
                {{{ vc.loop_partial('text-input', 'size', loop) }}}
                <span class="description clear"><?php _e('How many teasers to show? Enter number or word "All".', 'js_composer'); ?></span>
            </div>
            <# } #>
                <# if(vc.loop_field_not_hidden('order_by', loop)) { #>
                    <div class="vc_col-sm-4">
                        <label class="wpb_element_label"><?php _e('Order by', 'js_composer') ?></label>
                        {{{ vc.loop_partial('dropdown', 'order_by', loop) }}}
                        <span class="description clear"><?php echo sprintf(__('Select how to sort retrieved posts. More at %s.', 'js_composer'), '<a href="http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters" target="_blank">
                            WordPress codex page</a>'); ?></span>
                    </div>
                    <# } #>
                        <# if(vc.loop_field_not_hidden('order', loop)) { #>
                            <div class="vc_col-sm-4">
                                <label class="wpb_element_label"><?php _e('Sort order', 'js_composer') ?></label>
                                {{{ vc.loop_partial('dropdown', 'order', loop) }}}
                                <span class="description clear"><?php _e('Designates the ascending or descending order.', 'js_composer'); ?></span>
                            </div>
                            <# } #>
    </div>

    <# if(vc.loop_field_not_hidden('categories', loop)) { #>
        <div class="vc_row">
            <div class="vc_col-sm-12">
                <div class="vc_suggest-field" data-block="suggestion">
                    <label class="wpb_element_label"><?php _e('Categories', 'js_composer') ?></label>
                    {{{ vc.loop_partial('autosuggest', 'categories', loop) }}}
                    <span class="description clear"><?php _e('Filter output by posts categories, enter category names here.', 'js_composer'); ?></span>
                </div>
            </div>
        </div>
        <# } #>
            <# if(vc.loop_field_not_hidden('tags', loop)) { #>
                <div class="vc_row">
                    <div class="vc_col-sm-12">
                        <div class="vc_suggest-field" data-block="suggestion">
                            <label class="wpb_element_label"><?php _e('Tags', 'js_composer') ?></label>
                            {{{ vc.loop_partial('autosuggest', 'tags', loop) }}}
                            <span class="description clear"><?php _e('Filter output by posts tags, enter tag names here.', 'js_composer'); ?></span>
                        </div>
                    </div>
                </div>
                <# } #>
                    <# if(vc.loop_field_not_hidden('tax_query', loop)) { #>
                        <div class="vc_row">
                            <div class="vc_col-sm-12">
                                <div class="vc_suggest-field" data-block="suggestion">
                                    <label class="wpb_element_label"><?php _e('Taxonomies', 'js_composer') ?></label>
                                    {{{ vc.loop_partial('autosuggest', 'tax_query', loop) }}}
                                    <span class="description clear"><?php _e('Filter output by custom taxonomies categories, enter category names here.', 'js_composer'); ?></span>
                                </div>
                            </div>
                        </div>
                        <# } #>
                            <# if(vc.loop_field_not_hidden('by_id', loop)) { #>
                                <div class="vc_row">
                                    <div class="vc_col-sm-12">
                                        <div class="vc_suggest-field" data-block="suggestion">
                                            <label class="wpb_element_label"><?php _e('Individual Posts/Pages/Custom Post Types', 'js_composer') ?></label>
                                            {{{ vc.loop_partial('autosuggest', 'by_id', loop) }}}
                                            <span class="description clear"><?php _e('Only entered posts/pages will be included in the output. Note: Works in conjunction with selected "Post types".', 'js_composer'); ?></span>
                                        </div>
                                    </div>
                                </div>
                                <# } #>
                                    <# if(vc.loop_field_not_hidden('authors', loop)) { #>
                                        <div class="vc_row">
                                            <div class="vc_col-sm-12">
                                                <div class="vc_suggest-field" data-block="suggestion">
                                                    <label class="wpb_element_label"><?php _e('Author', 'js_composer') ?></label>
                                                    {{{ vc.loop_partial('autosuggest', 'authors', loop) }}}
                                                    <span class="description clear"><?php _e('Filter by author name.', 'js_composer'); ?></span>
                                                </div>
                                            </div>
                                        </div>
                                        <# } #>
</script>
<script type="text/html" id="_vcl-text-input">
    <#
            var is_locked = vc.is_locked(data),
            disabled = is_locked  ? ' disabled="true"' : '',
            value = _.isObject(data) && !_.isUndefined(data.value) ? data.value : '';
            #>
        <input type="text" name="{{ name }}" value="{{ value }}" class="vc_{{ name }}_field" {{ disabled }}>
</script>
<script type="text/html" id="_vcl-dropdown">
    <#
            var is_locked = vc.is_locked(data),
            disabled = is_locked  ? ' disabled="true"' : '';
            #>
        <select name="{{ name }}" class="vc_dropdown" {{ disabled }}>
            <option value=""></option>
            <# if(_.isObject(data) && _.isArray(data.options)) { #>
                <#
                        _.each(data.options, function(opt) {
                        var value, label;
                        if(_.isArray(opt)) {
                        value = opt[0];
                        label = opt[1];
                        } else {
                        value = opt;
                        label = opt;
                        }#>
                    <option value="{{ value }}"
                            {{ data.value===value ?
                    ' selected="true"' : '' }}>{{ label }}</option>
                    <#
                            });
                            #>
                        <# } #>
        </select>
</script>
<script type="text/html" id="_vcl-checkboxes">
    <#
            var is_locked = vc.is_locked(data);
            #>
        <input type="hidden" name="{{ name }}" value="{{ data.value }}" data-name="{{ name }}">
        <# if(_.isObject(data) && _.isArray(data.options)) {
                _.each(data.options, function(opt) {
                var value, label, params;
                if(_.isArray(opt)) {
                value = opt[0];
                label = opt[1];
                } else {
                value = opt;
                label = opt;
                }
                params = _.indexOf(data.value, value) >=0 ? ' checked="true"' : '';
            if(!_.isEmpty(params) && is_locked) params += ' disabled="true"';
            #>
            <label><input type="checkbox" data-input="{{ name }}" value="{{ value }}" {{ params }}/> {{ label }}</label>
            <#
                    });
                    } #>
</script>
<script type="text/html" id="_vcl-autosuggest">
    <# limit_param = _.isObject(settings) && !_.isUndefined(settings.limit) ? ' data-limit="' + settings.limit + '"' : ''; #>
        <input type="hidden" data-suggest-prefill="{{ name }}"
               value="{{ _.isObject(data) && _.isArray(data.options) ? window.encodeURIComponent(JSON.stringify(data.options)) : '' }}">
        <input type="hidden" name="{{ name }}"
               value="{{ _.isObject(data) && _.isArray(data.value) ? data.value.join(',') : '' }}"
               data-suggest-value="{{ name }}">
        <input type="text" name="{{ name }}_autosuggest" value=""
               placeholder="<?php _e('Click here and start typing...', 'js_composer'); ?>" class="vc_{{ name }}_field"
               data-suggest="{{ name }}" {{ limit_param }}/>
</script>loop.php000066600000050673151263475620006260 0ustar00<?php
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

/**
 * @param $settings
 * @param $value
 *
 * @since 4.2
 * @return string
 */
function vc_loop_form_field( $settings, $value ) {
	$query_builder = new VcLoopSettings( $value );
	$params = $query_builder->getContent();
	$loop_info = '';
	if ( is_array( $params ) ) {
		foreach ( $params as $key => $param ) {
			$param_value = vc_loop_get_value( $param );
			if ( ! empty( $param_value ) ) {
				$loop_info .= ' <b>' . $query_builder->getLabel( $key ) . '</b>: ' . $param_value . ';';
			}
		}
	}

	return '<div class="vc_loop">'
	       . '<input name="' . $settings['param_name'] . '" class="wpb_vc_param_value  ' . $settings['param_name'] . ' ' . $settings['type'] . '_field" type="hidden" value="' . $value . '"/>'
	       . '<a href="#" class="button vc_loop-build ' . $settings['param_name'] . '_button" data-settings="' . rawurlencode( json_encode( $settings['settings'] ) ) . '">' . __( 'Build query', 'js_composer' ) . '</a>'
	       . '<div class="vc_loop-info">' . $loop_info . '</div>'
	       . '</div>';
}

/**
 * @param $param
 *
 * @since 4.2
 * @return string
 */
function vc_loop_get_value( $param ) {
	$value = array();
	$selected_values = (array) $param['value'];
	if ( isset( $param['options'] ) && is_array( $param['options'] ) ) {
		foreach ( $param['options'] as $option ) {
			if ( is_array( $option ) && isset( $option['value'] ) ) {
				if ( in_array( ( ( '-' === $option['action'] ? '-' : '' ) . $option['value'] ), $selected_values ) ) {
					$value[] = $option['action'] . $option['name'];
				}
			} elseif ( is_array( $option ) && isset( $option[0] ) ) {
				if ( in_array( $option[0], $selected_values ) ) {
					$value[] = $option[1];
				}
			} elseif ( in_array( $option, $selected_values ) ) {
				$value[] = $option;
			}
		}
	} else {
		$value[] = $param['value'];
	}

	return implode( ', ', $value );
}

/**
 * Parses loop settings and creates WP_Query according to manual
 * @since 4.2
 * @link http://codex.wordpress.org/Class_Reference/WP_Query
 */
class VcLoopQueryBuilder {
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $args = array(
		'post_status' => 'publish', // show only published posts #1098
	);

	/**
	 * @since 4.2
	 *
	 * @param $data
	 */
	function __construct( $data ) {
		foreach ( $data as $key => $value ) {
			$method = 'parse_' . $key;
			if ( method_exists( $this, $method ) ) {
				$this->$method( $value );
			}
		}
	}

	/**
	 * Pages count
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_size( $value ) {
		$this->args['posts_per_page'] = 'All' === $value ? - 1 : (int) $value;
	}

	/**
	 * Sorting field
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_order_by( $value ) {
		$this->args['orderby'] = $value;
	}

	/**
	 * Sorting order
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_order( $value ) {
		$this->args['order'] = $value;
	}

	/**
	 * By post types
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_post_type( $value ) {
		$this->args['post_type'] = $this->stringToArray( $value );
	}

	/**
	 * By author
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_authors( $value ) {
		$this->args['author'] = $value;
	}

	/**
	 * By categories
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_categories( $value ) {
		$this->args['cat'] = $value;
	}

	/**
	 * By taxonomies
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_tax_query( $value ) {
		$terms = $this->stringToArray( $value );
		if ( empty( $this->args['tax_query'] ) ) {
			$this->args['tax_query'] = array( 'relation' => 'AND' );
		}
		$negative_term_list = array();
		foreach ( $terms as $term ) {
			if ( (int) $term < 0 ) {
				$negative_term_list[] = abs( $term );
			}
		}

		$not_in = array();
		$in = array();

		$terms = get_terms( VcLoopSettings::getTaxonomies(),
			array( 'include' => array_map( 'abs', $terms ) ) );
		foreach ( $terms as $t ) {
			if ( in_array( (int) $t->term_id, $negative_term_list ) ) {
				$not_in[ $t->taxonomy ][] = $t->term_id;
			} else {
				$in[ $t->taxonomy ][] = $t->term_id;
			}
		}

		foreach ( $in as $taxonomy => $terms ) {
			$this->args['tax_query'][] = array(
				'field' => 'term_id',
				'taxonomy' => $taxonomy,
				'terms' => $terms,
				'operator' => 'IN',
			);
		}
		foreach ( $not_in as $taxonomy => $terms ) {
			$this->args['tax_query'][] = array(
				'field' => 'term_id',
				'taxonomy' => $taxonomy,
				'terms' => $terms,
				'operator' => 'NOT IN',
			);
		}
	}

	/**
	 * By tags ids
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_tags( $value ) {
		$in = $not_in = array();
		$tags_ids = $this->stringToArray( $value );
		foreach ( $tags_ids as $tag ) {
			$tag = (int) $tag;
			if ( $tag < 0 ) {
				$not_in[] = abs( $tag );
			} else {
				$in[] = $tag;
			}
		}
		$this->args['tag__in'] = $in;
		$this->args['tag__not_in'] = $not_in;
	}

	/**
	 * By posts ids
	 * @since 4.2
	 *
	 * @param $value
	 */
	protected function parse_by_id( $value ) {
		$in = $not_in = array();
		$ids = $this->stringToArray( $value );
		foreach ( $ids as $id ) {
			$id = (int) $id;
			if ( $id < 0 ) {
				$not_in[] = abs( $id );
			} else {
				$in[] = $id;
			}
		}
		$this->args['post__in'] = $in;
		$this->args['post__not_in'] = $not_in;
	}

	/**
	 * @since 4.2
	 *
	 * @param $id
	 */
	public function excludeId( $id ) {
		if ( ! isset( $this->args['post__not_in'] ) ) {
			$this->args['post__not_in'] = array();
		}
		if ( is_array( $id ) ) {
			$this->args['post__not_in'] = array_merge( $this->args['post__not_in'], $id );
		} else {
			$this->args['post__not_in'][] = $id;
		}
	}

	/**
	 * Converts string to array. Filters empty arrays values
	 * @since 4.2
	 *
	 * @param $value
	 *
	 * @return array
	 */
	protected function stringToArray( $value ) {
		$valid_values = array();
		$list = preg_split( '/\,[\s]*/', $value );
		foreach ( $list as $v ) {
			if ( strlen( $v ) > 0 ) {
				$valid_values[] = $v;
			}
		}

		return $valid_values;
	}

	/**
	 * @return array
	 */
	public function build() {
		return array( $this->args, new WP_Query( $this->args ) );
	}
}

/**
 * Class VcLoopSettings
 * @since 4.2
 */
class VcLoopSettings {
	// Available parts of loop for WP_Query object.
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $content = array();
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $parts;
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $query_parts = array(
		'size',
		'order_by',
		'order',
		'post_type',
		'authors',
		'categories',
		'tags',
		'tax_query',
		'by_id',
	);

	/**
	 * @since 4.2
	 *
	 * @param $value
	 * @param array $settings
	 */
	function __construct( $value, $settings = array() ) {
		$this->parts = array(
			'size' => __( 'Post count', 'js_composer' ),
			'order_by' => __( 'Order by', 'js_composer' ),
			'order' => __( 'Sort order', 'js_composer' ),
			'post_type' => __( 'Post types', 'js_composer' ),
			'authors' => __( 'Author', 'js_composer' ),
			'categories' => __( 'Categories', 'js_composer' ),
			'tags' => __( 'Tags', 'js_composer' ),
			'tax_query' => __( 'Taxonomies', 'js_composer' ),
			'by_id' => __( 'Individual posts/pages', 'js_composer' ),
		);
		$this->settings = $settings;
		// Parse loop string
		$data = $this->parseData( $value );
		foreach ( $this->query_parts as $part ) {
			$value = isset( $data[ $part ] ) ? $data[ $part ] : '';
			$locked = 'true' === $this->getSettings( $part, 'locked' );
			// Predefined value check.
			if ( ! is_null( $this->getSettings( $part, 'value' ) ) && $this->replaceLockedValue( $part )
			     && ( true === $locked || 0 === strlen( (string) $value ) )
			) {
				$value = $this->settings[ $part ]['value'];
			} elseif ( ! is_null( $this->getSettings( $part, 'value' ) ) && ! $this->replaceLockedValue( $part )
			           && ( true === $locked || 0 === strlen( (string) $value ) )
			) {
				$value = implode( ',', array_unique( explode( ',', $value . ',' . $this->settings[ $part ]['value'] ) ) );
			}
			// Find custom method for parsing
			if ( method_exists( $this, 'parse_' . $part ) ) {
				$method = 'parse_' . $part;
				$this->content[ $part ] = $this->$method( $value );
			} else {
				$this->content[ $part ] = $this->parseString( $value );
			}
			// Set locked if value is locked by settings
			if ( $locked ) {
				$this->content[ $part ]['locked'] = true;
			}
			//
			if ( 'true' === $this->getSettings( $part, 'hidden' ) ) {
				$this->content[ $part ]['hidden'] = true;
			}
		}
	}

	/**
	 * @param $part
	 *
	 * @since 4.2
	 * @return bool
	 */
	protected function replaceLockedValue( $part ) {
		return in_array( $part, array( 'size', 'order_by', 'order' ) );
	}

	/**
	 * @param $key
	 *
	 * @since 4.2
	 * @return mixed
	 */
	public function getLabel( $key ) {
		return isset( $this->parts[ $key ] ) ? $this->parts[ $key ] : $key;
	}

	/**
	 * @param $part
	 * @param $name
	 *
	 * @since 4.2
	 * @return null
	 */
	public function getSettings( $part, $name ) {
		$settings_exists = isset( $this->settings[ $part ] ) && is_array( $this->settings[ $part ] );

		return $settings_exists && isset( $this->settings[ $part ][ $name ] ) ? $this->settings[ $part ][ $name ] : null;
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parseString( $value ) {
		return array( 'value' => $value );
	}

	/**
	 * @param $value
	 * @param array $options
	 *
	 * @since 4.2
	 * @return array
	 */
	protected function parseDropDown( $value, $options = array() ) {
		return array( 'value' => $value, 'options' => $options );
	}

	/**
	 * @param $value
	 * @param array $options
	 *
	 * @since 4.2
	 * @return array
	 */
	protected function parseMultiSelect( $value, $options = array() ) {
		return array( 'value' => explode( ',', $value ), 'options' => $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_order_by( $value ) {
		return $this->parseDropDown( $value, array(
			array( 'date', __( 'Date', 'js_composer' ) ),
			'ID',
			array( 'author', __( 'Author', 'js_composer' ) ),
			array( 'title', __( 'Title', 'js_composer' ) ),
			array( 'modified', __( 'Modified', 'js_composer' ) ),
			array( 'rand', __( 'Random', 'js_composer' ) ),
			array( 'comment_count', __( 'Comment count', 'js_composer' ) ),
			array( 'menu_order', __( 'Menu order', 'js_composer' ) ),
		) );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_order( $value ) {
		return $this->parseDropDown( $value, array(
			array( 'ASC', __( 'Ascending', 'js_composer' ) ),
			array( 'DESC', __( 'Descending', 'js_composer' ) ),
		) );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_post_type( $value ) {
		$options = array();
		$args = array(
			'public' => true,
		);
		$post_types = get_post_types( $args );
		foreach ( $post_types as $post_type ) {
			if ( 'attachment' !== $post_type ) {
				$options[] = $post_type;
			}
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_authors( $value ) {
		$options = $not_in = array();
		if ( empty( $value ) ) {
			return $this->parseMultiSelect( $value, $options );
		}
		$list = explode( ',', $value );
		foreach ( $list as $id ) {
			if ( (int) $id < 0 ) {
				$not_in[] = abs( $id );
			}
		}
		$users = get_users( array( 'include' => array_map( 'abs', $list ) ) );
		foreach ( $users as $user ) {
			$options[] = array(
				'value' => (string) $user->ID,
				'name' => $user->data->user_nicename,
				'action' => in_array( (int) $user->ID, $not_in ) ? '-' : '+',
			);
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_categories( $value ) {
		$options = $not_in = array();
		if ( empty( $value ) ) {
			return $this->parseMultiSelect( $value, $options );
		}
		$list = explode( ',', $value );
		foreach ( $list as $id ) {
			if ( (int) $id < 0 ) {
				$not_in[] = abs( $id );
			}
		}
		$list = get_categories( array( 'include' => array_map( 'abs', $list ) ) );
		foreach ( $list as $obj ) {
			$options[] = array(
				'value' => (string) $obj->cat_ID,
				'name' => $obj->cat_name,
				'action' => in_array( (int) $obj->cat_ID, $not_in ) ? '-' : '+',
			);
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_tags( $value ) {
		$options = $not_in = array();
		if ( empty( $value ) ) {
			return $this->parseMultiSelect( $value, $options );
		}
		$list = explode( ',', $value );
		foreach ( $list as $id ) {
			if ( (int) $id < 0 ) {
				$not_in[] = abs( $id );
			}
		}
		$list = get_tags( array( 'include' => array_map( 'abs', $list ) ) );
		foreach ( $list as $obj ) {
			$options[] = array(
				'value' => (string) $obj->term_id,
				'name' => $obj->name,
				'action' => in_array( (int) $obj->term_id, $not_in ) ? '-' : '+',
			);
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_tax_query( $value ) {
		$options = $not_in = array();
		if ( empty( $value ) ) {
			return $this->parseMultiSelect( $value, $options );
		}
		$list = explode( ',', $value );
		foreach ( $list as $id ) {
			if ( (int) $id < 0 ) {
				$not_in[] = abs( $id );
			}
		}
		$list = get_terms( self::getTaxonomies(), array( 'include' => array_map( 'abs', $list ) ) );
		foreach ( $list as $obj ) {
			$options[] = array(
				'value' => (string) $obj->term_id,
				'name' => $obj->name,
				'action' => in_array( (int) $obj->term_id, $not_in ) ? '-' : '+',
			);
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public function parse_by_id( $value ) {
		$options = $not_in = array();
		if ( empty( $value ) ) {
			return $this->parseMultiSelect( $value, $options );
		}
		$list = explode( ',', $value );
		foreach ( $list as $id ) {
			if ( (int) $id < 0 ) {
				$not_in[] = abs( $id );
			}
		}
		$list = get_posts( array( 'post_type' => 'any', 'include' => array_map( 'abs', $list ) ) );

		foreach ( $list as $obj ) {
			$options[] = array(
				'value' => (string) $obj->ID,
				'name' => $obj->post_title,
				'action' => in_array( (int) $obj->ID, $not_in ) ? '-' : '+',
			);
		}

		return $this->parseMultiSelect( $value, $options );
	}

	/**
	 * @since 4.2
	 */
	public function render() {
		echo json_encode( $this->content );
	}

	/**
	 * @since 4.2
	 * @return array
	 */
	public function getContent() {
		return $this->content;
	}

	/**
	 * get list of taxonomies which has no tags and categories items.
	 * @since 4.2
	 * @static
	 * @return array
	 */
	public static function getTaxonomies() {
		$taxonomy_exclude = (array) apply_filters( 'get_categories_taxonomy', 'category' );
		$taxonomy_exclude[] = 'post_tag';
		$taxonomies = array();
		foreach ( get_taxonomies() as $taxonomy ) {
			if ( ! in_array( $taxonomy, $taxonomy_exclude ) ) {
				$taxonomies[] = $taxonomy;
			}
		}

		return $taxonomies;
	}

	/**
	 * @param $settings
	 *
	 * @since 4.2
	 * @return string
	 */
	public static function buildDefault( $settings ) {
		if ( ! isset( $settings['settings'] ) || ! is_array( $settings['settings'] ) ) {
			return '';
		}
		$value = '';
		foreach ( $settings['settings'] as $key => $val ) {
			if ( isset( $val['value'] ) ) {
				$value .= ( empty( $value ) ? '' : '|' ) . $key . ':' . $val['value'];
			}
		}

		return $value;
	}

	/**
	 * @param $query
	 * @param bool $exclude_id
	 *
	 * @since 4.2
	 * @return array
	 */
	public static function buildWpQuery( $query, $exclude_id = false ) {
		$data = self::parseData( $query );
		$query_builder = new VcLoopQueryBuilder( $data );
		if ( $exclude_id ) {
			$query_builder->excludeId( $exclude_id );
		}

		return $query_builder->build();
	}

	/**
	 * @param $value
	 *
	 * @since 4.2
	 * @return array
	 */
	public static function parseData( $value ) {
		$data = array();
		$values_pairs = preg_split( '/\|/', $value );
		foreach ( $values_pairs as $pair ) {
			if ( ! empty( $pair ) ) {
				list( $key, $value ) = preg_split( '/\:/', $pair );
				$data[ $key ] = $value;
			}
		}

		return $data;
	}
}

/**
 * Suggestion list for wp_query field
 * Class VcLoopSuggestions
 * @since 4.2
 */
class VcLoopSuggestions {
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $content = array();
	/**
	 * @since 4.2
	 * @var array
	 */
	protected $exclude = array();
	/**
	 * @since 4.2
	 * @var
	 */
	protected $field;

	/**
	 * @param $field
	 * @param $query
	 * @param $exclude
	 *
	 * @since 4.2
	 */
	function __construct( $field, $query, $exclude ) {
		$this->exclude = explode( ',', $exclude );
		$method_name = 'get_' . preg_replace( '/_out$/', '', $field );
		if ( method_exists( $this, $method_name ) ) {
			$this->$method_name( $query );
		}
	}

	/**
	 * @param $query
	 *
	 * @since 4.2
	 */
	public function get_authors( $query ) {
		$args = ! empty( $query ) ? array(
			'search' => '*' . $query . '*',
			'search_columns' => array( 'user_nicename' ),
		) : array();
		if ( ! empty( $this->exclude ) ) {
			$args['exclude'] = $this->exclude;
		}
		$users = get_users( $args );
		foreach ( $users as $user ) {
			$this->content[] = array( 'value' => (string) $user->ID, 'name' => (string) $user->data->user_nicename );
		}
	}

	/**
	 * @param $query
	 *
	 * @since 4.2
	 */
	public function get_categories( $query ) {
		$args = ! empty( $query ) ? array( 'search' => $query ) : array();
		if ( ! empty( $this->exclude ) ) {
			$args['exclude'] = $this->exclude;
		}
		$categories = get_categories( $args );

		foreach ( $categories as $cat ) {
			$this->content[] = array( 'value' => (string) $cat->cat_ID, 'name' => $cat->cat_name );
		}
	}

	/**
	 * @param $query
	 *
	 * @since 4.2
	 */
	public function get_tags( $query ) {
		$args = ! empty( $query ) ? array( 'search' => $query ) : array();
		if ( ! empty( $this->exclude ) ) {
			$args['exclude'] = $this->exclude;
		}
		$tags = get_tags( $args );
		foreach ( $tags as $tag ) {
			$this->content[] = array( 'value' => (string) $tag->term_id, 'name' => $tag->name );
		}
	}

	/**
	 * @param $query
	 *
	 * @since 4.2
	 */
	public function get_tax_query( $query ) {
		$args = ! empty( $query ) ? array( 'search' => $query ) : array();
		if ( ! empty( $this->exclude ) ) {
			$args['exclude'] = $this->exclude;
		}
		$tags = get_terms( VcLoopSettings::getTaxonomies(), $args );
		foreach ( $tags as $tag ) {
			$this->content[] = array(
				'value' => $tag->term_id,
				'name' => $tag->name . ' (' . $tag->taxonomy . ')',
			);
		}
	}

	/**
	 * @param $query
	 *
	 * @since 4.2
	 */
	public function get_by_id( $query ) {
		$args = ! empty( $query ) ? array( 's' => $query, 'post_type' => 'any' ) : array( 'post_type' => 'any' );
		if ( ! empty( $this->exclude ) ) {
			$args['exclude'] = $this->exclude;
		}
		$posts = get_posts( $args );
		foreach ( $posts as $post ) {
			$this->content[] = array( 'value' => $post->ID, 'name' => $post->post_title );
		}
	}

	/**
	 * @since 4.2
	 */
	public function render() {
		echo json_encode( $this->content );
	}
}

/**
 * Build WP_Query object from query string.
 * String created by loop controllers
 *
 * @param $query
 * @param bool $exclude_id
 *
 * @since 4.2
 * @return string
 */
function vc_build_loop_query( $query, $exclude_id = false ) {
	return VcLoopSettings::buildWpQuery( $query, $exclude_id );
}

/**
 * @since 4.2
 */
function vc_get_loop_suggestion() {
	vc_user_access()
		->checkAdminNonce()
		->validateDie()
		->wpAny( 'edit_posts', 'edit_pages' )
		->validateDie();

	$loop_suggestions = new VcLoopSuggestions( vc_post_param( 'field' ), vc_post_param( 'query' ), vc_post_param( 'exclude' ) );
	$loop_suggestions->render();
	die();
}

/**
 * @since 4.2
 */
function vc_get_loop_settings_json() {
	vc_user_access()
		->checkAdminNonce()
		->validateDie()
		->wpAny( 'edit_posts', 'edit_pages' )
		->validateDie();

	$loop_settings = new VcLoopSettings( vc_post_param( 'value' ), vc_post_param( 'settings' ) );
	$loop_settings->render();
	die();
}

add_action( 'wp_ajax_wpb_get_loop_suggestion', 'vc_get_loop_suggestion' );
add_action( 'wp_ajax_wpb_get_loop_settings', 'vc_get_loop_settings_json' );

/**
 * @since 4.2
 */
function vc_loop_include_templates() {
	require_once vc_path_dir( 'TEMPLATES_DIR', 'params/loop/templates.html' );
}

add_action( 'admin_footer', 'vc_loop_include_templates' );

/**
 * @param $param
 *
 * @since 4.2
 * @return mixed
 */
function vc_set_loop_default_value( $param ) {
	if ( empty( $param['value'] ) && isset( $param['settings'] ) ) {
		$param['value'] = VcLoopSettings::buildDefault( $param );
	}

	return $param;
}

add_filter( 'vc_mapper_attribute_loop', 'vc_set_loop_default_value' );
price.php000066600000000607151264507350006376 0ustar00<?php
/**
 * Loop Price
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     1.6.4
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

global $product;
?>

<?php if ( $price_html = $product->get_price_html() ) : ?>
	
	<div class="woopost-price">
		<div class="woopost-price-in">
			<?php echo $price_html; ?>
		</div>
	</div>

<?php endif; ?>
rating.php000066600000000602151264507350006553 0ustar00<?php
/**
 * Loop Rating
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

global $product;

if ( get_option( 'woocommerce_enable_review_rating' ) === 'no' )
	return;
?>

<?php if ( $rating_html = $product->get_rating_html() ) : ?>
	<?php echo $rating_html; ?>
<?php endif; ?>
result-count.php000066600000001715151264507350007741 0ustar00<?php
/**
 * Result Count
 *
 * Shows text: Showing x - x of x results
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

global $wp_query;

if ( ! woocommerce_products_will_display() )
	return;
?>
<p class="woocommerce-result-count">
	<?php
	$paged    = max( 1, $wp_query->get( 'paged' ) );
	$per_page = $wp_query->get( 'posts_per_page' );
	$total    = $wp_query->found_posts;
	$first    = ( $per_page * $paged ) - $per_page + 1;
	$last     = min( $total, $wp_query->get( 'posts_per_page' ) * $paged );

	if ( 1 == $total ) {
		_e( 'Showing the single result', 'woocommerce' );
	} elseif ( $total <= $per_page || -1 == $per_page ) {
		printf( __( 'Showing all %d results', 'woocommerce' ), $total );
	} else {
		printf( _x( 'Showing %1$d&ndash;%2$d of %3$d results', '%1$d = first, %2$d = last, %3$d = total', 'woocommerce' ), $first, $last, $total );
	}
	?>
</p>
no-products-found.php000066600000000700151264507350010654 0ustar00<?php
/**
 * Displayed when no products are found matching the current query.
 *
 * Override this template by copying it to yourtheme/woocommerce/loop/no-products-found.php
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

?>
<p class="woocommerce-info"><?php _e( 'No products were found matching your selection.', 'woocommerce' ); ?></p>
add-to-cart.php000066600000003556151264507350007401 0ustar00<?php
/**
 * Loop Add to Cart
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/loop/add-to-cart.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you (the theme developer).
 * will need to copy the new files to your theme to maintain compatibility. We try to do this.
 * as little as possible, but it does happen. When this occurs the version of the template file will.
 * be bumped and the readme will list any important changes.
 *
 * @see 	    http://docs.woothemes.com/document/template-structure/
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.5.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

global $product;

// get theme customizer data
$sProduct_addcart = royal_get_option( 'royal_sProduct_addcart' );
$addcart_icon = '<i class="fa fa-'. $sProduct_addcart['icon'] .'"></i>';

if ( $product->add_to_cart_text() === 'Read More' ) {
	$add_to_cart_text = $sProduct_addcart['outstock_txt'];
	$addcart_icon = '';
} elseif ( $product->add_to_cart_text() === 'Select options' ) {
	$add_to_cart_text = $sProduct_addcart['selectopts_txt'];
	$addcart_icon = '';
}  elseif ( $product->add_to_cart_text() === 'Add to cart' ) {
	$add_to_cart_text = $sProduct_addcart['addcart_txt'];
} else {
	$add_to_cart_text = $product->add_to_cart_text() .'&nbsp;';
}


echo '<div class="woopost-addcart">';

	echo apply_filters( 'woocommerce_loop_add_to_cart_link',
		sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="woopost-addcart-in rf-button %s"><span>%s</span>%s</a>',
			esc_url( $product->add_to_cart_url() ),
			esc_attr( isset( $quantity ) ? $quantity : 1 ),
			esc_attr( $product->id ),
			esc_attr( $product->get_sku() ),
			esc_attr( isset( $class ) ? $class : 'button' ),
			esc_html( $add_to_cart_text ),
			$addcart_icon
		),
	$product );

echo '</div>';loop-start.php000066600000001207151264507350007375 0ustar00<?php
/**
 * Product Loop Start
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.0.0
 */

// royal shop grid values
$sPage_general 	 = royal_get_option( 'royal_sPage_general' );
$sSingle_details = royal_get_option( 'royal_sSingle_details' );

?>
<ul id="woocommerce-container" class="products" data-layout="<?php echo $sPage_general['layout']; ?>" data-columns-rate="<?php echo $sPage_general['columns_rate']; ?>" data-single-columns-rate="<?php echo $sSingle_details['columns_rate']; ?>" data-gutter-horz="<?php echo $sPage_general['gutter_horz']; ?>" data-gutter-vert="<?php echo $sPage_general['gutter_vert']; ?>">loop-end.php000066600000000175151264507350007011 0ustar00<?php
/**
 * Product Loop End
 *
 * @author 		WooThemes
 * @package 	WooCommerce/Templates
 * @version     2.0.0
 */
?>
</ul>title.php000066600000000333151264507350006411 0ustar00<?php
/**
 * Product loop title
 *
 * @author  WooThemes
 * @package WooCommerce/Templates
 * @version 2.4.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

?>
<h3><?php the_title(); ?></h3>