<?php

class WP_Widget_Media_Image extends WP_Widget_Media
{
    public function __construct()
    {
        parent::__construct('media_image', __('Image'), array('description' => __('Displays an image.'), 'mime_type' => 'image'));
        $this->l10n = array_merge($this->l10n, array('no_media_selected' => __('No image selected'), 'add_media' => _x('Add Image', 'label for button in the image widget'), 'replace_media' => _x('Replace Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long'), 'edit_media' => _x('Edit Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long'), 'missing_attachment' => sprintf(__('We can&#8217;t find that image. Check your <a href="%s">media library</a> and make sure it wasn&#8217;t deleted.'), esc_url(admin_url('upload.php'))), 'media_library_state_multi' => _n_noop('Image Widget (%d)', 'Image Widget (%d)'), 'media_library_state_single' => __('Image Widget')));
    }
    public function get_instance_schema()
    {
        return array_merge(array('size' => array('type' => 'string', 'enum' => array_merge(get_intermediate_image_sizes(), array('full', 'custom')), 'default' => 'medium', 'description' => __('Size')), 'width' => array('type' => 'integer', 'minimum' => 0, 'default' => 0, 'description' => __('Width')), 'height' => array('type' => 'integer', 'minimum' => 0, 'default' => 0, 'description' => __('Height')), 'caption' => array('type' => 'string', 'default' => '', 'sanitize_callback' => 'wp_kses_post', 'description' => __('Caption'), 'should_preview_update' => false), 'alt' => array('type' => 'string', 'default' => '', 'sanitize_callback' => 'sanitize_text_field', 'description' => __('Alternative Text')), 'link_type' => array('type' => 'string', 'enum' => array('none', 'file', 'post', 'custom'), 'default' => 'custom', 'media_prop' => 'link', 'description' => __('Link To'), 'should_preview_update' => true), 'link_url' => array('type' => 'string', 'default' => '', 'format' => 'uri', 'media_prop' => 'linkUrl', 'description' => __('URL'), 'should_preview_update' => true), 'image_classes' => array('type' => 'string', 'default' => '', 'sanitize_callback' => array($this, 'sanitize_token_list'), 'media_prop' => 'extraClasses', 'description' => __('Image CSS Class'), 'should_preview_update' => false), 'link_classes' => array('type' => 'string', 'default' => '', 'sanitize_callback' => array($this, 'sanitize_token_list'), 'media_prop' => 'linkClassName', 'should_preview_update' => false, 'description' => __('Link CSS Class')), 'link_rel' => array('type' => 'string', 'default' => '', 'sanitize_callback' => array($this, 'sanitize_token_list'), 'media_prop' => 'linkRel', 'description' => __('Link Rel'), 'should_preview_update' => false), 'link_target_blank' => array('type' => 'boolean', 'default' => false, 'media_prop' => 'linkTargetBlank', 'description' => __('Open link in a new tab'), 'should_preview_update' => false), 'image_title' => array('type' => 'string', 'default' => '', 'sanitize_callback' => 'sanitize_text_field', 'media_prop' => 'title', 'description' => __('Image Title Attribute'), 'should_preview_update' => false)), parent::get_instance_schema());
    }
    public function render_media($instance)
    {
        $instance = array_merge(wp_list_pluck($this->get_instance_schema(), 'default'), $instance);
        $instance = wp_parse_args($instance, array('size' => 'thumbnail'));
        $attachment = null;
        if ($this->is_attachment_with_mime_type($instance['attachment_id'], $this->widget_options['mime_type'])) {
            $attachment = get_post($instance['attachment_id']);
        }
        if ($attachment) {
            $caption = '';
            if (!isset($instance['caption'])) {
                $caption = $attachment->post_excerpt;
            } elseif (trim($instance['caption'])) {
                $caption = $instance['caption'];
            }
            $image_attributes = array('class' => sprintf('image wp-image-%d %s', $attachment->ID, $instance['image_classes']), 'style' => 'max-width: 100%; height: auto;');
            if (!empty($instance['image_title'])) {
                $image_attributes['title'] = $instance['image_title'];
            }
            if ($instance['alt']) {
                $image_attributes['alt'] = $instance['alt'];
            }
            $size = $instance['size'];
            if ('custom' === $size || !in_array($size, array_merge(get_intermediate_image_sizes(), array('full')), true)) {
                $size = array($instance['width'], $instance['height']);
                $width = $instance['width'];
            } else {
                $caption_size = _wp_get_image_size_from_meta($instance['size'], wp_get_attachment_metadata($attachment->ID));
                $width = empty($caption_size[0]) ? 0 : $caption_size[0];
            }
            $image_attributes['class'] .= sprintf(' attachment-%1$s size-%1$s', is_array($size) ? implode('x', $size) : $size);
            $image = wp_get_attachment_image($attachment->ID, $size, false, $image_attributes);
        } else {
            if (empty($instance['url'])) {
                return;
            }
            $instance['size'] = 'custom';
            $caption = $instance['caption'];
            $width = $instance['width'];
            $classes = 'image ' . $instance['image_classes'];
            if (0 === $instance['width']) {
                $instance['width'] = '';
            }
            if (0 === $instance['height']) {
                $instance['height'] = '';
            }
            $image = sprintf('<img class="%1$s" src="%2$s" alt="%3$s" width="%4$s" height="%5$s" />', esc_attr($classes), esc_url($instance['url']), esc_attr($instance['alt']), esc_attr($instance['width']), esc_attr($instance['height']));
        }
        $url = '';
        if ('file' === $instance['link_type']) {
            $url = $attachment ? wp_get_attachment_url($attachment->ID) : $instance['url'];
        } elseif ($attachment && 'post' === $instance['link_type']) {
            $url = get_attachment_link($attachment->ID);
        } elseif ('custom' === $instance['link_type'] && !empty($instance['link_url'])) {
            $url = $instance['link_url'];
        }
        if ($url) {
            $link = sprintf('<a href="%s"', esc_url($url));
            if (!empty($instance['link_classes'])) {
                $link .= sprintf(' class="%s"', esc_attr($instance['link_classes']));
            }
            if (!empty($instance['link_rel'])) {
                $link .= sprintf(' rel="%s"', esc_attr($instance['link_rel']));
            }
            if (!empty($instance['link_target_blank'])) {
                $link .= ' target="_blank"';
            }
            $link .= '>';
            $link .= $image;
            $link .= '</a>';
            $image = wp_targeted_link_rel($link);
        }
        if ($caption) {
            $image = img_caption_shortcode(array('width' => $width, 'caption' => $caption), $image);
        }
        echo $image;
    }
    public function enqueue_admin_scripts()
    {
        parent::enqueue_admin_scripts();
        $handle = 'media-image-widget';
        wp_enqueue_script($handle);
        $exported_schema = array();
        foreach ($this->get_instance_schema() as $field => $field_schema) {
            $exported_schema[$field] = wp_array_slice_assoc($field_schema, array('type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update'));
        }
        wp_add_inline_script($handle, sprintf('wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;', wp_json_encode($this->id_base), wp_json_encode($exported_schema)));
        wp_add_inline_script($handle, sprintf('
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s;
					wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s );
				', wp_json_encode($this->id_base), wp_json_encode($this->widget_options['mime_type']), wp_json_encode($this->l10n)));
    }
    public function render_control_template_scripts()
    {
        parent::render_control_template_scripts();
        ?>
		<script type="text/html" id="tmpl-wp-media-widget-image-fields">
			<# var elementIdPrefix = 'el' + String( Math.random() ) + '_'; #>
			<# if ( data.url ) { #>
			<p class="media-widget-image-link">
				<label for="{{ elementIdPrefix }}linkUrl"><?php 
        esc_html_e('Link to:');
        ?></label>
				<input id="{{ elementIdPrefix }}linkUrl" type="text" class="widefat link" value="{{ data.link_url }}" placeholder="https://" pattern="((\w+:)?\/\/\w.*|\w+:(?!\/\/$)|\/|\?|#).*">
			</p>
			<# } #>
		</script>
		<script type="text/html" id="tmpl-wp-media-widget-image-preview">
			<# if ( data.error && 'missing_attachment' === data.error ) { #>
				<div class="notice notice-error notice-alt notice-missing-attachment">
					<p><?php 
        echo $this->l10n['missing_attachment'];
        ?></p>
				</div>
			<# } else if ( data.error ) { #>
				<div class="notice notice-error notice-alt">
					<p><?php 
        _e('Unable to preview media due to an unknown error.');
        ?></p>
				</div>
			<# } else if ( data.url ) { #>
				<img class="attachment-thumb" src="{{ data.url }}" draggable="false" alt="{{ data.alt }}"
					<# if ( ! data.alt && data.currentFilename ) { #>
						aria-label="
						<?php 
        echo esc_attr(sprintf(__('The current image has no alternative text. The file name is: %s'), '{{ data.currentFilename }}'));
        ?>
						"
					<# } #>
				/>
			<# } #>
		</script>
		<?php 
    }
}