public function validate_subscription($html)
 {
     $sub = Shortcode_Tracker::shortcode_exists_current('stripe_subscription');
     $uea = Shortcode_Tracker::shortcode_exists_current('stripe_amount');
     //$html = '';
     // Neither exist so we can just exit now
     if ($sub === false && $uea === false) {
         return $html;
     }
     $sub_id = isset($sub['attr']['id']) ? true : false;
     $sub_children = isset($sub['children']) ? true : false;
     $use_amount = isset($sub['attr']['use_amount']) && $sub['attr']['use_amount'] == 'true' ? true : false;
     // Can't have both an ID and UEA
     if (($sub_id || $sub_children) && $uea) {
         Shortcode_Tracker::update_error_count();
         if (current_user_can('manage_options')) {
             Shortcode_Tracker::add_error_message('<h6>' . __('Subscriptions must specify a plan ID or include a user-entered amount field. You cannot include both or omit both.', 'sc_sub') . '</h6>');
         }
     }
     if (empty($sub_id) && ($uea || $use_amount) && $sub != false) {
         $interval = isset($sub['attr']['interval']) ? $sub['attr']['interval'] : 'month';
         $interval_count = isset($sub['attr']['interval_count']) ? $sub['attr']['interval_count'] : 1;
         $statement_description = isset($sub['attr']['statement_description']) ? $sub['attr']['statement_description'] : '';
         $html .= '<input type="hidden" name="sc_sub_id" class="sc_sub_id" value="" />';
         $html .= '<input type="hidden" name="sc_sub_interval" class="sc_sub_interval" value="' . $interval . '" />';
         $html .= '<input type="hidden" name="sc_sub_interval_count" class="sc_sub_interval_count" value="' . $interval_count . '" />';
         $html .= '<input type="hidden" name="sc_sub_statement_description" class="sc_sub_statement_description" value="' . $statement_description . '" />';
     }
     if (empty($sub_id) && !$uea && empty($sub_children) && $use_amount === false) {
         Shortcode_Tracker::update_error_count();
         if (current_user_can('manage_options')) {
             Shortcode_Tracker::add_error_message('<h6>' . __('Subscriptions must specify a plan ID or include a user-entered amount field. You cannot include both or omit both.', 'sc_sub') . '</h6>');
         }
     }
     return $html;
 }
 /**
  * Render code for [stripe_coupon]
  * 
  * @since 2.0.0
  */
 function stripe_coupon($attr)
 {
     global $sc_options;
     static $counter = 1;
     if (Shortcode_Tracker::shortcode_exists_current('stripe_coupon')) {
         Shortcode_Tracker::update_error_count();
         if (current_user_can('manage_options')) {
             Shortcode_Tracker::add_error_message(__('Admin note: Only one coupon code per form is allowed.', 'stripe'));
         } else {
             return '';
         }
     }
     $attr = shortcode_atts(array('label' => !null === $sc_options->get_setting_value('sc_coup_label') ? $sc_options->get_setting_value('sc_coup_label') : '', 'placeholder' => '', 'apply_button_style' => !(null === $sc_options->get_setting_value('sc_coup_apply_button_style')) && $sc_options->get_setting_value('sc_coup_apply_button_style') == 'stripe' ? 'stripe' : ''), $attr, 'stripe_coupon');
     $label = $attr['label'];
     $placeholder = $attr['placeholder'];
     $apply_button_style = $attr['apply_button_style'];
     Shortcode_Tracker::add_new_shortcode('stripe_coupon_' . $counter, 'stripe_coupon', $attr, false);
     $html = !empty($label) ? '<label for="sc-coup-coupon-' . $counter . '">' . $label . '</label>' : '';
     $html .= '<div class="' . apply_filters('sc_coup_coupon_container_class', 'sc-coup-coupon-container') . '">';
     $html .= '<input type="text" class="' . apply_filters('sc_form_control_class', 'sc-form-control') . ' ' . apply_filters('sc_coup_coupon_class', 'sc-coup-coupon') . '" id="sc-coup-coupon-' . $counter . '" name="sc_coup_coupon" placeholder="' . esc_attr($placeholder) . '" ';
     // Make Parsley JS validation ignore this field entirely.
     $html .= 'data-parsley-ui-enabled="false">';
     // Store valid applied coupon code in hidden field.
     $html .= '<input type="hidden" class="sc-coup-coupon-applied" name="sc_coup_coupon_applied" />';
     // Apply button (using "stripe" style if indicated).
     $html .= '<button class="sc-coup-apply-btn' . ($apply_button_style == 'stripe' ? ' stripe-button-el' : '') . '"><span>' . __('Apply', 'stripe') . '</span></button>';
     $html .= '</div>';
     //sc-coup-coupon-container
     // Loading indicator and validation message.
     $html .= '<div class="sc-coup-loading"><img src="' . SC_DIR_URL . 'assets/images/loading.gif" /></div>';
     $html .= '<div class="sc-coup-validation-message"></div>';
     // Success message and removal link.
     $html .= '<div class="sc-coup-success-row">';
     $html .= '<span class="sc-coup-success-message"></span>';
     $html .= ' <span class="sc-coup-remove-coupon">(<a href="#">' . __('remove', 'stripe') . '</a>)</span>';
     $html .= '</div>';
     //sc-coup-success-row
     $args = $this->get_args('', $attr, $counter);
     $counter++;
     $this->total_fields();
     return '<div class="' . apply_filters('sc_form_group_class', 'sc-form-group') . '">' . apply_filters('sc_stripe_coupon', $html, $args) . '</div>';
 }