/**
     * Add form item. Returns form item with selected arguments.
     *
     * @since 4.0.0
     * @param array $args Input argument name => argument value
     */
    public function add_form_item($args = array())
    {
        $default = array('class' => '', 'inline_style' => '', 'type' => '', 'value' => '', 'multiple' => false, 'max_value' => '100', 'min_value' => '0', 'step_value' => '1', 'default_value' => '', 'options' => '', 'placeholder' => '', 'upload_button_text' => __('Choose Media', 'cherry'), 'remove_button_text' => __('Remove Media', 'cherry'), 'return_data_type' => 'id', 'multi_upload' => true, 'display_image' => true, 'display_input' => true, 'library_type' => '', 'label' => '', 'title' => '', 'description' => '', 'hint' => '', 'toggle' => array('true_toggle' => __('On', 'cherry'), 'false_toggle' => __('Off', 'cherry')));
        extract(array_merge($default, $args));
        $value = $value == '' || $value == false && $value != 0 ? $default_value : $value;
        $item_id = $id;
        $name = $this->generate_field_name($id);
        $id = $this->generate_field_id($id);
        $item_inline_style = $inline_style ? 'style="' . $inline_style . '"' : '';
        $output = '';
        if (is_array($this->options['hidden_items']) && in_array($item_id, $this->options['hidden_items'])) {
            return;
        }
        switch ($type) {
            case 'submit':
                // $output .= '<input ' . $item_inline_style . ' class="' . $class . ' '.$this->options['class']['submit'].'" id="' . $id . '" name="' . $name . '" type="'.$type.'" value="' . esc_html( $value ) . '" >';
                $type .= ' ' . $class;
                $item_inline_style .= ' id=' . $id;
                $output .= get_submit_button($value, $type, $name, false, $item_inline_style);
                break;
            case 'reset':
                $output .= '<input ' . $item_inline_style . ' class="' . $class . ' ' . $this->options['class']['submit'] . '" id="' . $id . '" name="' . $name . '" type="reset" value="' . esc_html($value) . '" >';
                break;
            case 'text':
                $ui_text = new UI_Text(array('id' => $id, 'name' => $name, 'value' => $value, 'placeholder' => $placeholder, 'class' => $class));
                $output .= $ui_text->render();
                break;
            case 'textarea':
                $ui_textarea = new UI_Textarea(array('id' => $id, 'name' => $name, 'value' => $value, 'placeholder' => $placeholder, 'class' => $class));
                $output .= $ui_textarea->render();
                break;
            case 'select':
                $ui_select = new UI_Select(array('id' => $id, 'name' => $name, 'multiple' => $multiple, 'value' => $value, 'options' => $options, 'class' => $class));
                $output .= $ui_select->render();
                break;
            case 'checkbox':
                $ui_checkbox = new UI_Checkbox(array('id' => $id, 'name' => $name, 'value' => $value, 'options' => $options, 'class' => $class));
                $output .= $ui_checkbox->render();
                break;
            case 'radio':
                $ui_radio = new UI_Radio(array('id' => $id, 'name' => $name, 'value' => $value, 'options' => $options, 'class' => $class));
                $output .= $ui_radio->render();
                break;
            case 'switcher':
                $ui_switcher = new UI_Switcher(array('id' => $id, 'name' => $name, 'value' => $value, 'toggle' => $toggle, 'class' => $class));
                $output .= $ui_switcher->render();
                break;
            case 'stepper':
                $ui_stepper = new UI_Stepper(array('id' => $id, 'name' => $name, 'value' => $value, 'max_value' => $max_value, 'min_value' => $min_value, 'step_value' => $step_value, 'class' => $class));
                $output .= $ui_stepper->render();
                break;
            case 'slider':
                $ui_slider = new UI_Slider(array('id' => $id, 'name' => $name, 'value' => $value, 'max_value' => $max_value, 'min_value' => $min_value, 'step_value' => $step_value, 'class' => $class));
                $output .= $ui_slider->render();
                break;
            case 'rangeslider':
                $ui_range_slider = new UI_Range_Slider(array('id' => $id, 'name' => $name, 'value' => $value, 'max_value' => $max_value, 'min_value' => $min_value, 'step_value' => $step_value, 'class' => $class));
                $output .= $ui_range_slider->render();
                break;
            case 'colorpicker':
                $ui_colorpicker = new UI_Colorpicker(array('id' => $id, 'name' => $name, 'value' => $value, 'class' => $class));
                $output .= $ui_colorpicker->render();
                break;
            case 'media':
                $ui_media = new UI_Media(array('id' => $id, 'name' => $name, 'value' => $value, 'multi_upload' => $multi_upload, 'library_type' => $library_type, 'class' => $class));
                $output .= $ui_media->render();
                break;
            case 'background':
                $ui_background = new UI_Background(array('id' => $id, 'name' => $name, 'value' => $value, 'multi_upload' => $multi_upload, 'library_type' => $library_type, 'class' => $class));
                $output .= $ui_background->render();
                break;
            case 'typography':
                $ui_typography = new UI_Typography(array('id' => $id, 'name' => $name, 'value' => $value, 'class' => $class));
                $output .= $ui_typography->render();
                break;
            case 'ace-editor':
                $ui_ace_editor = new UI_Ace_Editor(array('id' => $id, 'name' => $name, 'value' => $value, 'class' => $class));
                $output .= $ui_ace_editor->render();
                break;
            case 'repeater':
                $ui_repeater = new UI_Repeater(array('id' => $id, 'name' => $name, 'value' => $value, 'class' => $class));
                $output .= $ui_repeater->render();
                break;
            case 'static_area_editor':
                $ui_statics = new UI_Static_Area_Editor(array('id' => $id, 'name' => $name, 'value' => $value, 'options' => $options, 'class' => $class));
                $output .= $ui_statics->render();
                break;
            case 'layouteditor':
                $ui_layout_editor = new UI_Layout_Editor(array('id' => $id, 'name' => $name, 'value' => $value, 'class' => $class));
                $output .= $ui_layout_editor->render();
                break;
            case 'editor':
                //$wrap = false;
                ob_start();
                $settings = array('textarea_name' => $name, 'media_buttons' => 1, 'teeny' => 0, 'textarea_rows' => 10, 'tinymce' => array('setup' => 'function(ed) {
								ed.onChange.add(function(ed) {
									tinyMCE.triggerSave();
								});
							}'));
                wp_editor($value, $id, $settings);
                $output .= ob_get_clean();
                _WP_Editors::editor_js();
                _WP_Editors::enqueue_scripts();
                break;
        }
        return $this->wrap_item($output, $id, 'cherry-section cherry-' . $type . ' ' . $this->options['class']['section'], $title, $label, $description, $hint);
    }
 /**
  * Render html UI_Typography.
  *
  * @since  4.0.0
  */
 public function render()
 {
     $html = '';
     $text_align = array('notdefined' => __('Not defined', 'cherry'), 'inherit' => __('Inherit', 'cherry'), 'left' => __('Left', 'cherry'), 'right' => __('Right', 'cherry'), 'center' => __('Center', 'cherry'), 'justify' => __('Justify', 'cherry'));
     $google_fonts_array = $this->get_google_font();
     $standart_fonts_array = $this->get_standart_font();
     $character_array = array();
     $style_array = array();
     $fonttype = '';
     $html .= '<div class="cherry-ui-typography-wrap">';
     //Font Family
     $html .= '<div class="cherry-column-section">';
     $html .= '<div class="inner">';
     $html .= '<div class="field-font-family">';
     $html .= '<label for="' . $this->settings['id'] . '-family">' . __('Font Family', 'cherry') . '</label> ';
     $html .= '<select id="' . $this->settings['id'] . '-family" class="cherry-ui-select cherry-font-family" name="' . $this->settings['name'] . '[family]">';
     if ($standart_fonts_array && !empty($standart_fonts_array) && is_array($standart_fonts_array)) {
         $html .= '<optgroup label="' . __('Standart Webfonts', 'cherry') . '" data-font-type="standart">';
         foreach ($standart_fonts_array as $font_key => $font_value) {
             $category = is_array($font_value['category']) ? implode(",", $font_value['category']) : $font_value['category'];
             $style = is_array($font_value['variants']) ? implode(",", $font_value['variants']) : $font_value['variants'];
             $character = is_array($font_value['subsets']) ? implode(",", $font_value['subsets']) : $font_value['subsets'];
             $selected_state = '';
             if ($this->settings['value']['family'] && !empty($this->settings['value']['family'])) {
                 if (!is_array($this->settings['value']['family'])) {
                     $this->settings['value']['family'] = array($this->settings['value']['family']);
                 }
                 foreach ($this->settings['value']['family'] as $key => $value) {
                     $selected_state = selected($value, $font_value['family'], false);
                     if ($selected_state == " selected='selected'") {
                         $fonttype = 'standart';
                         break;
                     }
                 }
             }
             $html .= '<option value="' . $font_value['family'] . '" data-category="' . $category . '" data-style="' . $style . '" data-character="' . $character . '" ' . $selected_state . '>' . esc_html($font_value['family']) . '</option>';
         }
         $html .= '</optgroup>';
     }
     if ($google_fonts_array && !empty($google_fonts_array) && is_array($google_fonts_array)) {
         $html .= '<optgroup label="' . __('Google Webfonts', 'cherry') . '" data-font-type="web">';
         foreach ($google_fonts_array as $font_key => $font_value) {
             $category = is_array($font_value['category']) ? implode(",", $font_value['category']) : $font_value['category'];
             $style = is_array($font_value['variants']) ? implode(",", $font_value['variants']) : $font_value['variants'];
             $character = is_array($font_value['subsets']) ? implode(",", $font_value['subsets']) : $font_value['subsets'];
             foreach ($font_value['variants'] as $style_key => $style_value) {
                 if (!array_key_exists($style_value, $style_array)) {
                     $text_piece_1 = preg_replace('/[0-9]/s', '', $style_value);
                     $text_piece_2 = preg_replace('/[A-Za-z]/s', ' ', $style_value);
                     $value_text = ucwords($text_piece_2 . ' ' . $text_piece_1);
                     $style_array[$style_value] = $value_text;
                 }
             }
             foreach ($font_value['subsets'] as $character_key => $character_value) {
                 if (!array_key_exists($character_value, $character_array)) {
                     $value_text = str_replace('-ext', ' Extended', $character_value);
                     $value_text = ucwords($value_text);
                     $character_array[$character_value] = $value_text;
                 }
             }
             $selected_state = '';
             if ($this->settings['value']['family'] && !empty($this->settings['value']['family'])) {
                 if (!is_array($this->settings['value']['family'])) {
                     $this->settings['value']['family'] = array($this->settings['value']['family']);
                 }
                 foreach ($this->settings['value']['family'] as $key => $value) {
                     $selected_state = selected($value, $font_value['family'], false);
                     if ($selected_state == " selected='selected'") {
                         $fonttype = 'web';
                         break;
                     }
                 }
             }
             $html .= '<option value="' . $font_value['family'] . '" data-category="' . $category . '" data-style="' . $style . '" data-character="' . $character . '" ' . $selected_state . '>' . esc_html($font_value['family']) . '</option>';
         }
         $html .= '</optgroup>';
     }
     $html .= '</select>';
     $html .= '</div>';
     $html .= '<div class="field-font-style">';
     if ($style_array && !empty($style_array) && is_array($style_array)) {
         $html .= '<label for="' . $this->settings['id'] . '-style">' . __('Font Style', 'cherry') . '</label> ';
         $ui_style_select = new UI_Select(array('id' => $this->settings['id'] . '-style', 'name' => $this->settings['name'] . '[style]', 'value' => $this->settings['value']['style'], 'options' => $style_array, 'class' => 'cherry-font-style'));
         $html .= $ui_style_select->render();
     }
     $html .= '</div>';
     $html .= '<div class="field-font-character">';
     if ($character_array && !empty($character_array) && is_array($character_array)) {
         $html .= '<label for="' . $this->settings['id'] . '-character">' . __('Character Sets', 'cherry') . '</label> ';
         $ui_character_select = new UI_Select(array('id' => $this->settings['id'] . '-character', 'name' => $this->settings['name'] . '[character]', 'value' => $this->settings['value']['character'], 'options' => $character_array, 'class' => 'cherry-font-character'));
         $html .= $ui_character_select->render();
     }
     $html .= '</div>';
     $html .= '</div>';
     $html .= '</div>';
     $html .= '<div class="cherry-column-section">';
     $html .= '<div class="inner">';
     $html .= '<div class="field-font-size">';
     $html .= '<label for="' . $this->settings['id'] . '-size">' . __('Size', 'cherry') . '</label> ';
     $ui_size_stepper = new UI_Stepper(array('id' => $this->settings['id'] . '-size>', 'name' => $this->settings['name'] . '[size]', 'value' => $this->settings['value']['size'], 'max_value' => 500, 'min_value' => 0, 'step_value' => 1, 'class' => 'font-size'));
     $html .= $ui_size_stepper->render();
     $html .= '</div>';
     $html .= '<div class="field-font-lineheight">';
     $html .= '<label for="' . $this->settings['id'] . '-lineheight">' . __('Line-height', 'cherry') . '</label> ';
     $ui_lineheight_stepper = new UI_Stepper(array('id' => $this->settings['id'] . '-lineheight>', 'name' => $this->settings['name'] . '[lineheight]', 'value' => $this->settings['value']['lineheight'], 'max_value' => 500, 'min_value' => 0, 'step_value' => 1, 'class' => 'font-lineheight'));
     $html .= $ui_lineheight_stepper->render();
     $html .= '</div>';
     $html .= '<div class="field-font-letter-spacing">';
     $html .= '<label for="' . $this->settings['id'] . '-letterspacing">' . __('Letter-spacing', 'cherry') . '</label> ';
     $ui_letterspacing_stepper = new UI_Stepper(array('id' => $this->settings['id'] . '-letterspacing>', 'name' => $this->settings['name'] . '[letterspacing]', 'value' => $this->settings['value']['letterspacing'], 'max_value' => 50, 'min_value' => -50, 'step_value' => 1, 'class' => 'font-letterspacing'));
     $html .= $ui_letterspacing_stepper->render();
     $html .= '</div>';
     $html .= '<div class="field-font-color">';
     $html .= '<label for="' . $this->settings['id'] . '-color">' . __('Font color', 'cherry') . '</label> ';
     $ui_colorpicker = new UI_Colorpicker(array('id' => $this->settings['id'] . '-color', 'name' => $this->settings['name'] . '[color]', 'value' => $this->settings['value']['color'], 'class' => 'cherry-color-picker'));
     $html .= $ui_colorpicker->render();
     $html .= '</div>';
     $html .= '<div class="field-font-align">';
     $html .= '<label for="' . $this->settings['id'] . '-align">' . __('Text align', 'cherry') . '</label> ';
     $ui_align_select = new UI_Select(array('id' => $this->settings['id'] . '-align', 'name' => $this->settings['name'] . '[align]', 'value' => $this->settings['value']['align'], 'options' => $text_align, 'class' => 'cherry-text-align'));
     $html .= $ui_align_select->render();
     $html .= '</div>';
     $html .= '<div class="clear"></div>';
     $html .= '</div>';
     $html .= '</div>';
     $html .= '<div class="clear"></div>';
     $ui_preview_textarea = new UI_Textarea(array('id' => $this->settings['id'] . '-preview', 'name' => 'none', 'value' => "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", 'rows' => 4, 'class' => 'cherry-font-preview'));
     $html .= $ui_preview_textarea->render();
     $html .= '<input class="cherry-font-category" name="' . $this->settings['name'] . '[category]" value=""  type="hidden" />';
     $html .= '<input class="font-type" name="' . $this->settings['name'] . '[fonttype]" type="hidden" value="' . esc_html($fonttype) . '">';
     $html .= '</div>';
     return $html;
 }
 /**
  * Get shortcode input HTML
  *
  * @return string|null
  */
 public function get_shortcode_input()
 {
     if (!file_exists($this->get_path('ui/ui-textarea/ui-textarea.php'))) {
         return null;
     }
     require_once $this->get_path('ui/ui-textarea/ui-textarea.php');
     $ui_control = new UI_Textarea(array('id' => 'generated-shortcode', 'name' => 'generated-shortcode', 'label' => __('Generated shortcode:', $this->plugin), 'rows' => 4));
     return sprintf('<div class="cherry-sg-shortcode">%s</div>', $ui_control->render());
 }