/**
  * Add the GravityView menu to the Visual Composer menu
  * @uses vc_map
  * @return void
  */
 function vc_map()
 {
     global $vc_manager;
     $views = get_posts(array('post_type' => 'gravityview', 'numberposts' => -1, 'status' => 'publish'));
     if (empty($views) || is_wp_error($views)) {
         // By default, there are no Views found.
         $gravityview_array[__('No GravityView Views found.', 'gravityview-visual-composer')] = '';
         $params = array(array('type' => 'dropdown', 'heading' => __('View', 'gravityview-visual-composer'), 'param_name' => 'id', 'value' => $gravityview_array, 'description' => GravityView_Post_Types::no_views_text(), 'admin_label' => true));
     } else {
         // Overwrite the default
         $views_array = array(__('Select a View to Insert', 'gravityview-visual-composer') => '');
         // Map the title of the view to the ID
         foreach ($views as $view) {
             $title = !empty($view->post_title) ? esc_attr($view->post_title) : __('(no title)', 'gravityview-visual-composer');
             $views_array[$title] = $view->ID;
         }
         $params = $this->get_params($views_array);
     }
     vc_map(array('name' => __('GravityView', 'gravityview-visual-composer'), 'base' => 'gravityview', 'icon' => plugins_url('assets/img/icon.png', __FILE__), 'category' => __('Content', 'gravityview-visual-composer'), 'description' => __('Embed a View', 'gravityview-visual-composer'), 'params' => $params));
 }
    /**
     * @inheritDoc
     */
    public function form($instance)
    {
        // @todo Make compatible with Customizer
        if ($this->is_preview()) {
            $warning = sprintf(esc_html__('This widget is not configurable from this screen. Please configure it on the %sWidgets page%s.', 'gravityview'), '<a href="' . admin_url('widgets.php') . '">', '</a>');
            echo wpautop(GravityView_Admin::get_floaty() . $warning);
            return;
        }
        $defaults = array('title' => '', 'view_id' => 0, 'post_id' => '', 'search_fields' => '');
        $instance = wp_parse_args((array) $instance, $defaults);
        $title = $instance['title'];
        $view_id = $instance['view_id'];
        $post_id = $instance['post_id'];
        $search_fields = $instance['search_fields'];
        $views = GVCommon::get_all_views();
        // If there are no views set up yet, we get outta here.
        if (empty($views)) {
            ?>
			<div id="select_gravityview_view">
				<div class="wrap"><?php 
            echo GravityView_Post_Types::no_views_text();
            ?>
</div>
			</div>
			<?php 
            return;
        }
        ?>

		<p><label for="<?php 
        echo $this->get_field_id('title');
        ?>
"><?php 
        _e('Title:', 'gravityview');
        ?>
 <input class="widefat" id="<?php 
        echo $this->get_field_id('title');
        ?>
" name="<?php 
        echo $this->get_field_name('title');
        ?>
" type="text" value="<?php 
        echo esc_attr($title);
        ?>
" /></label></p>

		<?php 
        /**
         * Display errors generated for invalid embed IDs
         * @see GravityView_View_Data::is_valid_embed_id
         */
        if (isset($instance['updated']) && empty($instance['view_id'])) {
            ?>
			<div class="error inline hide-on-view-change">
				<p><?php 
            esc_html_e('Please select a View to search.', 'gravityview');
            ?>
</p>
			</div>
			<?php 
            unset($error);
        }
        ?>

		<p>
			<label for="gravityview_view_id"><?php 
        _e('View:', 'gravityview');
        ?>
</label>
			<select id="gravityview_view_id" name="<?php 
        echo $this->get_field_name('view_id');
        ?>
" class="widefat">
				<option value=""><?php 
        esc_html_e('&mdash; Select a View &mdash;', 'gravityview');
        ?>
</option>
				<?php 
        foreach ($views as $view_option) {
            $title = empty($view_option->post_title) ? __('(no title)', 'gravityview') : $view_option->post_title;
            echo '<option value="' . $view_option->ID . '" ' . selected(esc_attr($view_id), $view_option->ID, false) . '>' . esc_html(sprintf('%s #%d', $title, $view_option->ID)) . '</option>';
        }
        ?>
			</select>

		</p>

		<?php 
        /**
         * Display errors generated for invalid embed IDs
         * @see GravityView_View_Data::is_valid_embed_id
         */
        if (!empty($instance['error_post_id'])) {
            ?>
			<div class="error inline">
				<p><?php 
            echo $instance['error_post_id'];
            ?>
</p>
			</div>
			<?php 
            unset($error);
        }
        ?>

		<p>
			<label for="<?php 
        echo $this->get_field_id('post_id');
        ?>
"><?php 
        esc_html_e('If Embedded, Page ID:', 'gravityview');
        ?>
</label>
			<input class="code" size="3" id="<?php 
        echo $this->get_field_id('post_id');
        ?>
" name="<?php 
        echo $this->get_field_name('post_id');
        ?>
" type="text" value="<?php 
        echo esc_attr($post_id);
        ?>
" />
			<span class="howto"><?php 
        esc_html_e('To have a search performed on an embedded View, enter the ID of the post or page where the View is embedded.', 'gravityview');
        echo ' ' . gravityview_get_link('http://docs.gravityview.co/article/222-the-search-widget', __('Learn more&hellip;', 'gravityview'), 'target=_blank');
        ?>
</span>
		</p>

		<hr />

		<?php 
        // @todo: move style to CSS
        ?>
		<div style="margin-bottom: 1em;">
			<label class="screen-reader-text" for="<?php 
        echo $this->get_field_id('search_fields');
        ?>
"><?php 
        _e('Searchable fields:', 'gravityview');
        ?>
</label>
			<div class="gv-widget-search-fields" title="<?php 
        esc_html_e('Search Fields', 'gravityview');
        ?>
">
				<input id="<?php 
        echo $this->get_field_id('search_fields');
        ?>
" name="<?php 
        echo $this->get_field_name('search_fields');
        ?>
" type="hidden" value="<?php 
        echo esc_attr($search_fields);
        ?>
" class="gv-search-fields-value">
			</div>

		</div>

		<script>
			// When the widget is saved or added, refresh the Merge Tags (here for backward compatibility)
			// WordPress 3.9 added widget-added and widget-updated actions
			jQuery('#<?php 
        echo $this->get_field_id('view_id');
        ?>
').trigger( 'change' );
		</script>
	<?php 
    }
    /**
     * @since 1.6
     * @see WP_Widget::form()
     */
    public function form($instance)
    {
        // Set up some default widget settings.
        $defaults = array('title' => __('Recent Entries', 'gravityview'), 'view_id' => NULL, 'post_id' => NULL, 'limit' => 10, 'link_format' => __('Entry #{entry_id}', 'gravityview'), 'after_link' => '');
        $instance = wp_parse_args((array) $instance, $defaults);
        ?>

		<!-- Title -->
		<p>
			<label for="<?php 
        echo esc_attr($this->get_field_id('title'));
        ?>
"><?php 
        _e('Title:', 'gravityview');
        ?>
</label>
			<input class="widefat" id="<?php 
        echo esc_attr($this->get_field_id('title'));
        ?>
" name="<?php 
        echo esc_attr($this->get_field_name('title'));
        ?>
" type="text" value="<?php 
        echo esc_attr($instance['title']);
        ?>
" />
		</p>

		<!-- Download -->
		<?php 
        $args = array('post_type' => 'gravityview', 'posts_per_page' => -1, 'post_status' => 'publish');
        $views = get_posts($args);
        // If there are no views set up yet, we get outta here.
        if (empty($views)) {
            echo '<div id="select_gravityview_view"><div class="wrap">' . GravityView_Post_Types::no_views_text() . '</div></div>';
            return;
        }
        ?>

		<?php 
        /**
         * Display errors generated for invalid embed IDs
         * @see GravityView_View_Data::is_valid_embed_id
         */
        if (isset($instance['updated']) && empty($instance['view_id'])) {
            ?>
			<div class="error inline hide-on-view-change">
				<p><?php 
            esc_html_e('Please select a View to search.', 'gravityview');
            ?>
</p>
			</div>
			<?php 
            unset($error);
        }
        ?>

		<p>
			<label for="<?php 
        echo esc_attr($this->get_field_id('view_id'));
        ?>
"><?php 
        esc_html_e('Select a View', 'gravityview');
        ?>
</label>
			<select class="widefat gv-recent-entries-select-view" name="<?php 
        echo esc_attr($this->get_field_name('view_id'));
        ?>
" id="<?php 
        echo esc_attr($this->get_field_id('view_id'));
        ?>
">
				<option value=""><?php 
        esc_html_e('&mdash; Select a View as Entries Source &mdash;', 'gravityview');
        ?>
</option>
				<?php 
        foreach ($views as $view) {
            $title = empty($view->post_title) ? __('(no title)', 'gravityview') : $view->post_title;
            echo '<option value="' . $view->ID . '"' . selected(absint($instance['view_id']), $view->ID) . '>' . esc_html(sprintf('%s #%d', $title, $view->ID)) . '</option>';
        }
        ?>
			</select>
		</p>

		<?php 
        /**
         * Display errors generated for invalid embed IDs
         * @see GravityView_View_Data::is_valid_embed_id
         */
        if (!empty($instance['error_post_id'])) {
            ?>
			<div class="error inline">
				<p><?php 
            echo $instance['error_post_id'];
            ?>
</p>
			</div>
			<?php 
            unset($error);
        }
        ?>

		<p>
			<label for="<?php 
        echo $this->get_field_id('post_id');
        ?>
"><?php 
        esc_html_e('If Embedded, Page ID:', 'gravityview');
        ?>
</label>
			<input class="code" size="3" id="<?php 
        echo $this->get_field_id('post_id');
        ?>
" name="<?php 
        echo $this->get_field_name('post_id');
        ?>
" type="text" value="<?php 
        echo esc_attr($instance['post_id']);
        ?>
" />
			<span class="howto"><?php 
        esc_html_e('To have a search performed on an embedded View, enter the ID of the post or page where the View is embedded.', 'gravityview');
        echo ' ' . gravityview_get_link('http://docs.gravityview.co/article/222-the-search-widget', __('Learn more&hellip;', 'gravityview'), 'target=_blank');
        ?>
</span>
		</p>

		<p>
			<label for="<?php 
        echo $this->get_field_id('limit');
        ?>
">
				<span><?php 
        _e('Number of entries to show:', 'gravityview');
        ?>
</span>
			</label>
			<input class="code" id="<?php 
        echo $this->get_field_id('limit');
        ?>
" name="<?php 
        echo $this->get_field_name('limit');
        ?>
" type="number" value="<?php 
        echo intval($instance['limit']);
        ?>
" size="3" />
		</p>

		<p>
			<label for="<?php 
        echo $this->get_field_id('link_format');
        ?>
">
				<span><?php 
        _e('Entry link text (required)', 'gravityview');
        ?>
</span>
			</label>
			<input id="<?php 
        echo $this->get_field_id('link_format');
        ?>
" name="<?php 
        echo $this->get_field_name('link_format');
        ?>
" type="text" value="<?php 
        echo esc_attr($instance['link_format']);
        ?>
" class="widefat merge-tag-support mt-position-right mt-hide_all_fields" />
		</p>

		<p>
			<label for="<?php 
        echo $this->get_field_id('after_link');
        ?>
">
				<span><?php 
        _e('Text or HTML to display after the link (optional)', 'gravityview');
        ?>
</span>
			</label>
			<textarea id="<?php 
        echo $this->get_field_id('after_link');
        ?>
" name="<?php 
        echo $this->get_field_name('after_link');
        ?>
" rows="5" class="widefat code merge-tag-support mt-position-right mt-hide_all_fields"><?php 
        echo esc_textarea($instance['after_link']);
        ?>
</textarea>
		</p>

		<?php 
        /**
         * @action `gravityview_recent_entries_widget_form` Displayed at the bottom of the Recent Entries widget admin form
         * @param GravityView_Recent_Entries_Widget $this WP_Widget object
         * @param array $instance Current widget instance
         */
        do_action('gravityview_recent_entries_widget_form', $this, $instance);
        ?>

		<script>
			// When the widget is saved or added, refresh the Merge Tags (here for backward compatibility)
			// WordPress 3.9 added widget-added and widget-updated actions
			jQuery('#<?php 
        echo $this->get_field_id('view_id');
        ?>
').trigger( 'change' );
		</script>
	<?php 
    }
    /**
     * Add shortcode popup div
     *
     * @access public
     * @return void
     */
    function add_shortcode_popup()
    {
        global $post;
        if (!$this->is_post_editor_screen()) {
            return;
        }
        $post_type = get_post_type_object($post->post_type);
        $views = get_posts(array('post_type' => 'gravityview', 'posts_per_page' => -1));
        // If there are no views set up yet, we get outta here.
        if (empty($views)) {
            echo '<div id="select_gravityview_view"><div class="wrap">' . GravityView_Post_Types::no_views_text() . '</div></div>';
            return;
        }
        ?>
		<div id="select_gravityview_view">
			<form action="#" method="get" id="select_gravityview_view_form">
				<div class="wrap">

					<h2 class=""><?php 
        esc_html_e('Embed a View', 'gravityview');
        ?>
</h2>
					<p class="subtitle"><?php 
        printf(esc_attr(__('Use this form to embed a View into this %s. %sLearn more about using shortcodes.%s', 'gravityview')), $post_type->labels->singular_name, '<a href="http://gravityview.co/support/documentation/202934188/" target="_blank">', '</a>');
        ?>
</p>

					<div>
						<h3><label for="gravityview_id"><?php 
        esc_html_e('Select a View', 'gravityview');
        ?>
</label></h3>

						<select name="gravityview_id" id="gravityview_id">
							<option value=""><?php 
        esc_html_e('&mdash; Select a View to Insert &mdash;', 'gravityview');
        ?>
</option>
							<?php 
        foreach ($views as $view) {
            $title = empty($view->post_title) ? __('(no title)', 'gravityview') : $view->post_title;
            echo '<option value="' . $view->ID . '">' . esc_html(sprintf('%s #%d', $title, $view->ID)) . '</option>';
        }
        ?>
						</select>
					</div>

					<table class="form-table hide-if-js">

						<caption><?php 
        esc_html_e('View Settings', 'gravityview');
        ?>
</caption>

						<?php 
        $settings = GravityView_View_Data::get_default_args(true);
        foreach ($settings as $key => $setting) {
            if (empty($setting['show_in_shortcode'])) {
                continue;
            }
            GravityView_Render_Settings::render_setting_row($key, array(), NULL, 'gravityview_%s', 'gravityview_%s');
        }
        ?>

					</table>

					<div class="submit">
						<input type="submit" class="button button-primary button-large alignleft hide-if-js" value="<?php 
        esc_attr_e('Insert View', 'gravityview');
        ?>
" id="insert_gravityview_view" />
						<input class="button button-secondary alignright" type="submit" onclick="tb_remove(); return false;" value="<?php 
        esc_attr_e("Cancel", 'gravityview');
        ?>
" />
					</div>

				</div>
			</form>
		</div>
		<?php 
    }