Completed
Push — master ( 51e04c...0e8edf )
by Stephanie
03:25
created

FrmFieldsHelper::clear_on_focus_html()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 3
nop 3
dl 0
loc 15
rs 9.4285
c 0
b 0
f 0
1
<?php
2
if ( ! defined('ABSPATH') ) {
3
	die( 'You are not allowed to call this page directly.' );
4
}
5
6
class FrmFieldsHelper {
7
8
	public static function setup_new_vars( $type = '', $form_id = '' ) {
9
10
        if ( strpos($type, '|') ) {
11
            list($type, $setting) = explode('|', $type);
12
        }
13
14
        $defaults = self::get_default_field_opts($type, $form_id);
15
        $defaults['field_options']['custom_html'] = self::get_default_html($type);
16
17
        $values = array();
18
19
        foreach ( $defaults as $var => $default ) {
20
            if ( $var == 'field_options' ) {
21
                $values['field_options'] = array();
22
                foreach ( $default as $opt_var => $opt_default ) {
23
                    $values['field_options'][ $opt_var ] = $opt_default;
24
                    unset($opt_var, $opt_default);
25
                }
26
            } else {
27
                $values[ $var ] = $default;
28
            }
29
            unset($var, $default);
30
        }
31
32
        if ( isset( $setting ) && ! empty( $setting ) ) {
33
            if ( in_array( $type, array( 'data', 'lookup' ) ) ) {
34
                $values['field_options']['data_type'] = $setting;
35
            } else {
36
                $values['field_options'][ $setting ] = 1;
37
            }
38
        }
39
40
        if ( $type == 'radio' || $type == 'checkbox' ) {
41
            $values['options'] = serialize( array(
42
                __( 'Option 1', 'formidable' ),
43
                __( 'Option 2', 'formidable' ),
44
            ) );
45
        } else if ( $type == 'select' ) {
46
            $values['options'] = serialize( array(
47
                '', __( 'Option 1', 'formidable' ),
48
            ) );
49
        } else if ( $type == 'textarea' ) {
50
            $values['field_options']['max'] = '5';
51
        } else if ( $type == 'captcha' ) {
52
            $frm_settings = FrmAppHelper::get_settings();
53
            $values['invalid'] = $frm_settings->re_msg;
54
        } else if ( 'url' == $type ) {
55
            $values['name'] = __( 'Website', 'formidable' );
56
        }
57
58
		$fields = FrmField::field_selection();
59
        $fields = array_merge($fields, FrmField::pro_field_selection());
60
61
        if ( isset( $fields[ $type ] ) ) {
62
            $values['name'] = is_array( $fields[ $type ] ) ? $fields[ $type ]['name'] : $fields[ $type ];
63
        }
64
65
        unset($fields);
66
67
        return $values;
68
    }
69
70
	public static function get_html_id( $field, $plus = '' ) {
71
		return apply_filters( 'frm_field_html_id', 'field_' . $field['field_key'] . $plus, $field );
72
    }
73
74
    public static function setup_edit_vars( $record, $doing_ajax = false ) {
75
		$values = array( 'id' => $record->id, 'form_id' => $record->form_id );
76
		$defaults = array(
77
			'name'          => $record->name,
78
			'description'   => $record->description,
79
			'field_key'     => $record->field_key,
80
			'type'          => $record->type,
81
			'default_value' => $record->default_value,
82
			'field_order'   => $record->field_order,
83
			'required'      => $record->required,
84
		);
85
86
		if ( $doing_ajax ) {
87
            $values = $values + $defaults;
88
            $values['form_name'] = '';
89
		} else {
90
			foreach ( $defaults as $var => $default ) {
91
                $values[ $var ] = FrmAppHelper::get_param( $var, $default, 'get', 'htmlspecialchars' );
92
                unset($var, $default);
93
            }
94
95
			$values['form_name'] = $record->form_id ? FrmForm::getName( $record->form_id ) : '';
96
        }
97
98
		unset( $defaults );
99
100
        $values['options'] = $record->options;
101
        $values['field_options'] = $record->field_options;
102
103
        $defaults = self::get_default_field_opts($values['type'], $record, true);
104
105
		if ( $values['type'] == 'captcha' ) {
106
            $frm_settings = FrmAppHelper::get_settings();
107
            $defaults['invalid'] = $frm_settings->re_msg;
108
        }
109
110
		foreach ( $defaults as $opt => $default ) {
111
            $values[ $opt ] = isset( $record->field_options[ $opt ] ) ? $record->field_options[ $opt ] : $default;
112
            unset($opt, $default);
113
        }
114
115
        $values['custom_html'] = (isset($record->field_options['custom_html'])) ? $record->field_options['custom_html'] : self::get_default_html($record->type);
116
117
		return apply_filters( 'frm_setup_edit_field_vars', $values, array( 'doing_ajax' => $doing_ajax ) );
118
    }
119
120
    public static function get_default_field_opts( $type, $field, $limit = false ) {
121
        $field_options = array(
122
            'size' => '', 'max' => '', 'label' => '', 'blank' => '',
123
            'required_indicator' => '*', 'invalid' => '', 'separate_value' => 0,
124
            'clear_on_focus' => 0, 'default_blank' => 0, 'classes' => '',
125
			'custom_html' => '', 'captcha_size' => 'default', 'captcha_theme' => 'light',
126
        );
127
128
		if ( $limit ) {
129
            return $field_options;
130
		}
131
132
        global $wpdb;
133
134
        $form_id = (is_numeric($field)) ? $field : $field->form_id;
135
136
		$key = is_numeric( $field ) ? FrmAppHelper::get_unique_key( '', $wpdb->prefix . 'frm_fields', 'field_key' ) : $field->field_key;
137
138
        $field_count = FrmDb::get_var( 'frm_fields', array( 'form_id' => $form_id ), 'field_order', array( 'order_by' => 'field_order DESC' ) );
139
140
        $frm_settings = FrmAppHelper::get_settings();
141
        return array(
142
            'name' => __( 'Untitled', 'formidable' ), 'description' => '',
143
			'field_key' => $key, 'type' => $type, 'options' => '', 'default_value' => '',
144
			'field_order' => $field_count + 1, 'required' => false,
145
            'blank' => $frm_settings->blank_msg, 'unique_msg' => $frm_settings->unique_msg,
146
            'invalid' => __( 'This field is invalid', 'formidable' ), 'form_id' => $form_id,
147
			'field_options' => $field_options,
148
        );
149
    }
150
151
    public static function fill_field( &$values, $field, $form_id, $new_key = '' ) {
152
        global $wpdb;
153
154
		$values['field_key'] = FrmAppHelper::get_unique_key( $new_key, $wpdb->prefix . 'frm_fields', 'field_key' );
155
        $values['form_id'] = $form_id;
156
        $values['options'] = maybe_serialize($field->options);
157
        $values['default_value'] = maybe_serialize($field->default_value);
158
159
        foreach ( array( 'name', 'description', 'type', 'field_order', 'field_options', 'required' ) as $col ) {
160
            $values[ $col ] = $field->{$col};
161
        }
162
    }
163
164
    /**
165
     * @since 2.0
166
     */
167
	public static function get_error_msg( $field, $error ) {
168
		$frm_settings = FrmAppHelper::get_settings();
169
		$default_settings = $frm_settings->default_options();
170
		$field_name = is_array( $field ) ? $field['name'] : $field->name;
171
172
		$conf_msg = __( 'The entered values do not match', 'formidable' );
173
		$defaults = array(
174
			'unique_msg' => array( 'full' => $default_settings['unique_msg'], 'part' => sprintf( __('%s must be unique', 'formidable' ), $field_name ) ),
175
			'invalid'   => array( 'full' => __( 'This field is invalid', 'formidable' ), 'part' => sprintf( __('%s is invalid', 'formidable' ), $field_name ) ),
176
			'blank'     => array( 'full' => $frm_settings->blank_msg, 'part' => $frm_settings->blank_msg ),
177
			'conf_msg'  => array( 'full' => $conf_msg, 'part' => $conf_msg ),
178
		);
179
180
		$msg = FrmField::get_option( $field, $error );
181
		$msg = empty( $msg ) ? $defaults[ $error ]['part'] : $msg;
182
		$msg = do_shortcode( $msg );
183
		return $msg;
184
	}
185
186
    public static function get_form_fields( $form_id, $error = false ) {
187
        $fields = FrmField::get_all_for_form($form_id);
188
        $fields = apply_filters('frm_get_paged_fields', $fields, $form_id, $error);
189
        return $fields;
190
    }
191
192
	public static function get_default_html( $type = 'text' ) {
193
		if ( apply_filters( 'frm_normal_field_type_html', true, $type ) ) {
194
			$input = ( in_array( $type, array( 'radio', 'checkbox', 'data' ) ) ) ? '<div class="frm_opt_container">[input]</div>' : '[input]';
195
            $for = '';
196
			if ( ! in_array( $type, array( 'radio', 'checkbox', 'data', 'scale' ) ) ) {
197
                $for = 'for="field_[key]"';
198
            }
199
200
            $default_html = <<<DEFAULT_HTML
201
<div id="frm_field_[id]_container" class="frm_form_field form-field [required_class][error_class]">
202
    <label $for class="frm_primary_label">[field_name]
203
        <span class="frm_required">[required_label]</span>
204
    </label>
205
    $input
206
    [if description]<div class="frm_description">[description]</div>[/if description]
207
    [if error]<div class="frm_error">[error]</div>[/if error]
208
</div>
209
DEFAULT_HTML;
210
        } else {
211
			$default_html = apply_filters('frm_other_custom_html', '', $type);
212
        }
213
214
        return apply_filters('frm_custom_html', $default_html, $type);
215
    }
216
217
	public static function replace_shortcodes( $html, $field, $errors = array(), $form = false, $args = array() ) {
218
        $html = apply_filters('frm_before_replace_shortcodes', $html, $field, $errors, $form);
219
220
        $defaults = array(
221
			'field_name'    => 'item_meta[' . $field['id'] . ']',
222
			'field_id'      => $field['id'],
223
            'field_plus_id' => '',
224
            'section_id'    => '',
225
        );
226
        $args = wp_parse_args($args, $defaults);
227
        $field_name = $args['field_name'];
228
        $field_id = $args['field_id'];
229
        $html_id = self::get_html_id($field, $args['field_plus_id']);
230
231
        if ( FrmField::is_multiple_select($field) ) {
232
            $field_name .= '[]';
233
        }
234
235
        //replace [id]
236
        $html = str_replace('[id]', $field_id, $html);
237
238
        // Remove the for attribute for captcha
239
        if ( $field['type'] == 'captcha' ) {
240
            $html = str_replace(' for="field_[key]"', '', $html);
241
        }
242
243
        // set the label for
244
        $html = str_replace('field_[key]', $html_id, $html);
245
246
        //replace [key]
247
        $html = str_replace('[key]', $field['field_key'], $html);
248
249
        //replace [description] and [required_label] and [error]
250
		$required = FrmField::is_required( $field ) ? $field['required_indicator'] : '';
251
        if ( ! is_array( $errors ) ) {
252
            $errors = array();
253
        }
254
		$error = isset( $errors[ 'field' . $field_id ] ) ? $errors[ 'field' . $field_id ] : false;
255
256
        //If field type is section heading, add class so a bottom margin can be added to either the h3 or description
257
        if ( $field['type'] == 'divider' ) {
258
            if ( FrmField::is_option_true( $field, 'description' ) ) {
259
                $html = str_replace( 'frm_description', 'frm_description frm_section_spacing', $html );
260
            } else {
261
                $html = str_replace('[label_position]', '[label_position] frm_section_spacing', $html);
262
            }
263
        }
264
265
		foreach ( array( 'description' => $field['description'], 'required_label' => $required, 'error' => $error ) as $code => $value ) {
266
            self::remove_inline_conditions( ( $value && $value != '' ), $code, $value, $html );
267
        }
268
269
        //replace [required_class]
270
		$required_class = FrmField::is_required( $field ) ? ' frm_required_field' : '';
271
        $html = str_replace('[required_class]', $required_class, $html);
272
273
        //replace [label_position]
274
        $field['label'] = apply_filters('frm_html_label_position', $field['label'], $field, $form);
275
        $field['label'] = ( $field['label'] && $field['label'] != '' ) ? $field['label'] : 'top';
276
		$html = str_replace( '[label_position]', ( ( in_array( $field['type'], array( 'divider', 'end_divider', 'break' ) ) ) ? $field['label'] : ' frm_primary_label' ), $html );
277
278
        //replace [field_name]
279
        $html = str_replace('[field_name]', $field['name'], $html);
280
281
		self::add_field_div_classes( $field_id, $field, $errors, $html );
282
283
        //replace [entry_key]
284
        $entry_key = FrmAppHelper::simple_get( 'entry', 'sanitize_title' );
285
        $html = str_replace('[entry_key]', $entry_key, $html);
286
287
        //replace [input]
288
        preg_match_all("/\[(input|deletelink)\b(.*?)(?:(\/))?\]/s", $html, $shortcodes, PREG_PATTERN_ORDER);
289
        global $frm_vars;
290
        $frm_settings = FrmAppHelper::get_settings();
291
292
        foreach ( $shortcodes[0] as $short_key => $tag ) {
293
            $atts = shortcode_parse_atts( $shortcodes[2][ $short_key ] );
294
			$tag = self::get_shortcode_tag( $shortcodes, $short_key, array( 'conditional' => false, 'conditional_check' => false ) );
295
296
            $replace_with = '';
297
298
            if ( $tag == 'input' ) {
299
                if ( isset($atts['opt']) ) {
300
                    $atts['opt']--;
301
                }
302
303
                $field['input_class'] = isset($atts['class']) ? $atts['class'] : '';
304
                if ( isset($atts['class']) ) {
305
                    unset($atts['class']);
306
                }
307
308
                $field['shortcodes'] = $atts;
309
                ob_start();
310
				include( FrmAppHelper::plugin_path() . '/classes/views/frm-fields/input.php' );
311
                $replace_with = ob_get_contents();
312
                ob_end_clean();
313
            } else if ( $tag == 'deletelink' && FrmAppHelper::pro_is_installed() ) {
314
                $replace_with = FrmProEntriesController::entry_delete_link($atts);
315
            }
316
317
            $html = str_replace( $shortcodes[0][ $short_key ], $replace_with, $html );
318
        }
319
320
		if ( $form ) {
321
            $form = (array) $form;
322
323
            //replace [form_key]
324
            $html = str_replace('[form_key]', $form['form_key'], $html);
325
326
            //replace [form_name]
327
            $html = str_replace('[form_name]', $form['name'], $html);
328
        }
329
        $html .= "\n";
330
331
        //Return html if conf_field to prevent loop
332
        if ( isset($field['conf_field']) && $field['conf_field'] == 'stop' ) {
333
            return $html;
334
        }
335
336
        //If field is in repeating section
337
        if ( $args['section_id'] ) {
338
            $html = apply_filters('frm_replace_shortcodes', $html, $field, array( 'errors' => $errors, 'form' => $form, 'field_name' => $field_name, 'field_id' => $field_id, 'field_plus_id' => $args['field_plus_id'], 'section_id' => $args['section_id'] ));
339
        } else {
340
            $html = apply_filters('frm_replace_shortcodes', $html, $field, array( 'errors' => $errors, 'form' => $form ));
341
        }
342
343
		self::remove_collapse_shortcode( $html );
344
345
		if ( apply_filters( 'frm_do_html_shortcodes', true ) ) {
346
			$html = do_shortcode( $html );
347
		}
348
349
        return $html;
350
    }
351
352
	/**
353
	 * Add classes to a field div
354
	 *
355
	 * @since 2.02.05
356
	 *
357
	 * @param string $field_id
358
	 * @param array $field
359
	 * @param array $errors
360
	 * @param string $html
361
	 */
362
	private static function add_field_div_classes( $field_id, $field, $errors, &$html ) {
363
		$classes = self::get_field_div_classes( $field_id, $field, $errors, $html );
364
365
		if ( $field['type'] == 'html' && strpos( $html, '[error_class]' ) === false ) {
366
			// there is no error_class shortcode for HTML fields
367
			$html = str_replace( 'class="frm_form_field', 'class="frm_form_field ' . $classes, $html );
368
		}
369
		$html = str_replace( '[error_class]', $classes, $html );
370
	}
371
372
	/**
373
	 * Get the classes for a field div
374
	 *
375
	 * @since 2.02.05
376
	 *
377
	 * @param string $field_id
378
	 * @param array $field
379
	 * @param array $errors
380
	 * @param string $html
381
	 * @return string $classes
382
	 */
383
	private static function get_field_div_classes( $field_id, $field, $errors, $html ) {
384
		// Add error class
385
		$classes = isset( $errors[ 'field' . $field_id ] ) ? ' frm_blank_field' : '';
386
387
		// Add label position class
388
		$classes .= ' frm_' . $field['label'] . '_container';
389
390
		// Add CSS layout classes
391
		if ( ! empty( $field['classes'] ) ) {
392
			if ( ! strpos( $html, 'frm_form_field ') ) {
393
				$classes .= ' frm_form_field';
394
			}
395
			$classes .= ' ' . $field['classes'];
396
		}
397
398
		// Get additional classes
399
		$classes = apply_filters( 'frm_field_div_classes', $classes, $field, array( 'field_id' => $field_id ) );
400
401
		return $classes;
402
	}
403
404
    public static function remove_inline_conditions( $no_vars, $code, $replace_with, &$html ) {
405
        if ( $no_vars ) {
406
			$html = str_replace( '[if ' . $code . ']', '', $html );
407
			$html = str_replace( '[/if ' . $code . ']', '', $html );
408
        } else {
409
			$html = preg_replace( '/(\[if\s+' . $code . '\])(.*?)(\[\/if\s+' . $code . '\])/mis', '', $html );
410
        }
411
412
		$html = str_replace( '[' . $code . ']', $replace_with, $html );
413
    }
414
415
	public static function get_shortcode_tag( $shortcodes, $short_key, $args ) {
416
		$args = wp_parse_args( $args, array( 'conditional' => false, 'conditional_check' => false, 'foreach' => false ) );
417
        if ( ( $args['conditional'] || $args['foreach'] ) && ! $args['conditional_check'] ) {
418
            $args['conditional_check'] = true;
419
        }
420
421
        $prefix = '';
422
        if ( $args['conditional_check'] ) {
423
            if ( $args['conditional'] ) {
424
                $prefix = 'if ';
425
            } else if ( $args['foreach'] ) {
426
                $prefix = 'foreach ';
427
            }
428
        }
429
430
        $with_tags = $args['conditional_check'] ? 3 : 2;
431
        if ( ! empty( $shortcodes[ $with_tags ][ $short_key ] ) ) {
432
            $tag = str_replace( '[' . $prefix, '', $shortcodes[0][ $short_key ] );
433
            $tag = str_replace(']', '', $tag);
434
            $tags = explode(' ', $tag);
435
            if ( is_array($tags) ) {
436
                $tag = $tags[0];
437
            }
438
        } else {
439
            $tag = $shortcodes[ $with_tags - 1 ][ $short_key ];
440
        }
441
442
        return $tag;
443
    }
444
445
	/**
446
	 * Remove [collapse_this] if it's still included after all processing
447
	 * @since 2.0.8
448
	 */
449
	private static function remove_collapse_shortcode( &$html ) {
450
		if ( preg_match( '/\[(collapse_this)\]/s', $html ) ) {
451
			$html = str_replace( '[collapse_this]', '', $html );
452
		}
453
	}
454
455
	public static function get_checkbox_id( $field, $opt_key ) {
456
		$id = $field['id'];
457
		if ( isset( $field['in_section'] ) && $field['in_section'] ) {
458
			$id .= '-' . $field['in_section'];
459
		}
460
		return 'frm_checkbox_' . $id . '-' . $opt_key;
461
	}
462
463
	public static function display_recaptcha( $field ) {
464
		$frm_settings = FrmAppHelper::get_settings();
465
		$lang = apply_filters( 'frm_recaptcha_lang', $frm_settings->re_lang, $field );
466
467
		$class_prefix = '';
468
		$api_js_url = 'https://www.google.com/recaptcha/api.js?';
469
470
		$allow_mutiple = $frm_settings->re_multi;
471
		if ( $allow_mutiple ) {
472
			$api_js_url .= '&onload=frmRecaptcha&render=explicit';
473
			$class_prefix = 'frm-';
474
		}
475
476
        if ( $lang != 'en' ) {
477
			$api_js_url .= '&hl=' . $lang;
478
        }
479
		$api_js_url = apply_filters( 'frm_recaptcha_js_url', $api_js_url );
480
481
        wp_register_script( 'recaptcha-api', $api_js_url, '', true );
482
        wp_enqueue_script( 'recaptcha-api' );
483
484
?>
485
<div id="field_<?php echo esc_attr( $field['field_key'] ) ?>" class="<?php echo esc_attr( $class_prefix ) ?>g-recaptcha" data-sitekey="<?php echo esc_attr( $frm_settings->pubkey ) ?>" data-size="<?php echo esc_attr( $field['captcha_size'] ) ?>" data-theme="<?php echo esc_attr( $field['captcha_theme'] ) ?>"></div>
486
<?php
487
    }
488
489
	public static function show_single_option( $field ) {
490
        $field_name = $field['name'];
491
        $html_id = self::get_html_id($field);
492
        foreach ( $field['options'] as $opt_key => $opt ) {
493
            $field_val = apply_filters('frm_field_value_saved', $opt, $opt_key, $field);
494
            $opt = apply_filters('frm_field_label_seen', $opt, $opt_key, $field);
495
496
            // If this is an "Other" option, get the HTML for it
497
			if ( self::is_other_opt( $opt_key ) ) {
498
                // Get string for Other text field, if needed
499
				$other_val = self::get_other_val( compact( 'opt_key', 'field' ) );
500
				require( FrmAppHelper::plugin_path() . '/pro/classes/views/frmpro-fields/other-option.php' );
501
            } else {
502
				require( FrmAppHelper::plugin_path() . '/classes/views/frm-fields/single-option.php' );
503
            }
504
        }
505
    }
506
507
	public static function get_term_link( $tax_id ) {
508
        $tax = get_taxonomy($tax_id);
509
        if ( ! $tax ) {
510
            return;
511
        }
512
513
        $link = sprintf(
514
            __( 'Please add options from the WordPress "%1$s" page', 'formidable' ),
515
			'<a href="' . esc_url( admin_url( 'edit-tags.php?taxonomy=' . $tax->name ) ) . '" target="_blank">' . ( empty( $tax->labels->name ) ? __( 'Categories' ) : $tax->labels->name ) . '</a>'
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '('
Loading history...
516
        );
517
        unset($tax);
518
519
        return $link;
520
    }
521
522
	public static function value_meets_condition( $observed_value, $cond, $hide_opt ) {
523
		// Remove white space from hide_opt
524
		if ( ! is_array( $hide_opt ) ) {
525
			$hide_opt = rtrim( $hide_opt );
526
		}
527
528
		$observed_value = wp_kses_post( $observed_value );
529
		$hide_opt = wp_kses_post( $hide_opt );
530
531
        if ( is_array($observed_value) ) {
532
            return self::array_value_condition($observed_value, $cond, $hide_opt);
533
        }
534
535
        $m = false;
536
        if ( $cond == '==' ) {
537
            $m = $observed_value == $hide_opt;
538
        } else if ( $cond == '!=' ) {
539
            $m = $observed_value != $hide_opt;
540
        } else if ( $cond == '>' ) {
541
            $m = $observed_value > $hide_opt;
542
        } else if ( $cond == '<' ) {
543
            $m = $observed_value < $hide_opt;
544
        } else if ( $cond == 'LIKE' || $cond == 'not LIKE' ) {
545
            $m = stripos($observed_value, $hide_opt);
546
            if ( $cond == 'not LIKE' ) {
547
                $m = ( $m === false ) ? true : false;
548
            } else {
549
                $m = ( $m === false ) ? false : true;
550
            }
551
        }
552
        return $m;
553
    }
554
555
	public static function array_value_condition( $observed_value, $cond, $hide_opt ) {
556
        $m = false;
557
        if ( $cond == '==' ) {
558
            if ( is_array($hide_opt) ) {
559
                $m = array_intersect($hide_opt, $observed_value);
560
                $m = empty($m) ? false : true;
561
            } else {
562
                $m = in_array($hide_opt, $observed_value);
563
            }
564
        } else if ( $cond == '!=' ) {
565
            $m = ! in_array($hide_opt, $observed_value);
566
        } else if ( $cond == '>' ) {
567
            $min = min($observed_value);
568
            $m = $min > $hide_opt;
569
        } else if ( $cond == '<' ) {
570
            $max = max($observed_value);
571
            $m = $max < $hide_opt;
572
        } else if ( $cond == 'LIKE' || $cond == 'not LIKE' ) {
573
            foreach ( $observed_value as $ob ) {
574
                $m = strpos($ob, $hide_opt);
575
                if ( $m !== false ) {
576
                    $m = true;
577
                    break;
578
                }
579
            }
580
581
            if ( $cond == 'not LIKE' ) {
582
                $m = ( $m === false ) ? true : false;
583
            }
584
        }
585
586
        return $m;
587
    }
588
589
    /**
590
     * Replace a few basic shortcodes and field ids
591
     * @since 2.0
592
     * @return string
593
     */
594
	public static function basic_replace_shortcodes( $value, $form, $entry ) {
595
        if ( strpos($value, '[sitename]') !== false ) {
596
            $new_value = wp_specialchars_decode( FrmAppHelper::site_name(), ENT_QUOTES );
597
            $value = str_replace('[sitename]', $new_value, $value);
598
        }
599
600
        $value = apply_filters('frm_content', $value, $form, $entry);
601
        $value = do_shortcode($value);
602
603
        return $value;
604
    }
605
606
	public static function get_shortcodes( $content, $form_id ) {
607
        if ( FrmAppHelper::pro_is_installed() ) {
608
            return FrmProDisplaysHelper::get_shortcodes($content, $form_id);
609
        }
610
611
        $fields = FrmField::getAll( array( 'fi.form_id' => (int) $form_id, 'fi.type not' => FrmField::no_save_fields() ) );
612
613
        $tagregexp = self::allowed_shortcodes($fields);
614
615
        preg_match_all("/\[(if )?($tagregexp)\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?/s", $content, $matches, PREG_PATTERN_ORDER);
616
617
        return $matches;
618
    }
619
620
	public static function allowed_shortcodes( $fields = array() ) {
621
        $tagregexp = array(
622
            'editlink', 'id', 'key', 'ip',
623
            'siteurl', 'sitename', 'admin_email',
624
            'post[-|_]id', 'created[-|_]at', 'updated[-|_]at', 'updated[-|_]by',
625
			'parent[-|_]id',
626
        );
627
628
        foreach ( $fields as $field ) {
629
            $tagregexp[] = $field->id;
630
            $tagregexp[] = $field->field_key;
631
        }
632
633
        $tagregexp = implode('|', $tagregexp);
634
        return $tagregexp;
635
    }
636
637
	public static function replace_content_shortcodes( $content, $entry, $shortcodes ) {
638
        $shortcode_values = array(
639
           'id'     => $entry->id,
640
           'key'    => $entry->item_key,
641
           'ip'     => $entry->ip,
642
        );
643
644
        foreach ( $shortcodes[0] as $short_key => $tag ) {
645
            $atts = shortcode_parse_atts( $shortcodes[3][ $short_key ] );
646
647
            if ( ! empty( $shortcodes[3][ $short_key ] ) ) {
648
				$tag = str_replace( array( '[', ']' ), '', $shortcodes[0][ $short_key ] );
649
                $tags = explode(' ', $tag);
650
                if ( is_array($tags) ) {
651
                    $tag = $tags[0];
652
                }
653
            } else {
654
                $tag = $shortcodes[2][ $short_key ];
655
            }
656
657
            switch ( $tag ) {
658
                case 'id':
659
                case 'key':
660
                case 'ip':
661
                    $replace_with = $shortcode_values[ $tag ];
662
                break;
663
664
                case 'user_agent':
665
                case 'user-agent':
666
                    $entry->description = maybe_unserialize($entry->description);
667
					$replace_with = FrmEntryFormat::get_browser( $entry->description['browser'] );
668
                break;
669
670
                case 'created_at':
671
                case 'created-at':
672
                case 'updated_at':
673
                case 'updated-at':
674
                    if ( isset($atts['format']) ) {
675
                        $time_format = ' ';
676
                    } else {
677
                        $atts['format'] = get_option('date_format');
678
                        $time_format = '';
679
                    }
680
681
                    $this_tag = str_replace('-', '_', $tag);
682
                    $replace_with = FrmAppHelper::get_formatted_time($entry->{$this_tag}, $atts['format'], $time_format);
683
                    unset($this_tag);
684
                break;
685
686
                case 'created_by':
687
                case 'created-by':
688
                case 'updated_by':
689
                case 'updated-by':
690
                    $this_tag = str_replace('-', '_', $tag);
691
					$replace_with = self::get_display_value( $entry->{$this_tag}, (object) array( 'type' => 'user_id' ), $atts );
692
                    unset($this_tag);
693
                break;
694
695
                case 'admin_email':
696
                case 'siteurl':
697
                case 'frmurl':
698
                case 'sitename':
699
                case 'get':
700
                    $replace_with = self::dynamic_default_values( $tag, $atts );
701
                break;
702
703
                default:
704
                    $field = FrmField::getOne( $tag );
705
                    if ( ! $field ) {
706
                        break;
707
                    }
708
709
                    $sep = isset($atts['sep']) ? $atts['sep'] : ', ';
710
711
                    $replace_with = FrmEntryMeta::get_meta_value( $entry, $field->id );
712
713
                    $atts['entry_id'] = $entry->id;
714
                    $atts['entry_key'] = $entry->item_key;
715
716
                    if ( isset($atts['show']) && $atts['show'] == 'field_label' ) {
717
                        $replace_with = $field->name;
718
                    } else if ( isset($atts['show']) && $atts['show'] == 'description' ) {
719
                        $replace_with = $field->description;
720
					} else {
721
						$string_value = $replace_with;
722
						if ( is_array( $replace_with ) ) {
723
							$string_value = implode( $sep, $replace_with );
724
						}
725
726
						if ( empty( $string_value ) && $string_value != '0' ) {
727
							$replace_with = '';
728
						} else {
729
							$replace_with = self::get_display_value( $replace_with, $field, $atts );
730
						}
731
					}
732
733
                    unset($field);
734
                break;
735
            }
736
737
            if ( isset($replace_with) ) {
738
                $content = str_replace( $shortcodes[0][ $short_key ], $replace_with, $content );
739
            }
740
741
            unset($atts, $conditional, $replace_with);
742
		}
743
744
		return $content;
745
    }
746
747
    /**
748
     * Get the value to replace a few standard shortcodes
749
     *
750
     * @since 2.0
751
     * @return string
752
     */
753
    public static function dynamic_default_values( $tag, $atts = array(), $return_array = false ) {
754
        $new_value = '';
755
        switch ( $tag ) {
756
            case 'admin_email':
757
                $new_value = get_option('admin_email');
758
                break;
759
            case 'siteurl':
760
                $new_value = FrmAppHelper::site_url();
761
                break;
762
            case 'frmurl':
763
                $new_value = FrmAppHelper::plugin_url();
764
                break;
765
            case 'sitename':
766
                $new_value = FrmAppHelper::site_name();
767
                break;
768
            case 'get':
769
                $new_value = self::process_get_shortcode( $atts, $return_array );
770
                break;
771
        }
772
773
        return $new_value;
774
    }
775
776
    /**
777
     * Process the [get] shortcode
778
     *
779
     * @since 2.0
780
     * @return string|array
781
     */
782
    public static function process_get_shortcode( $atts, $return_array = false ) {
783
        if ( ! isset($atts['param']) ) {
784
            return '';
785
        }
786
787
        if ( strpos($atts['param'], '&#91;') ) {
788
            $atts['param'] = str_replace('&#91;', '[', $atts['param']);
789
            $atts['param'] = str_replace('&#93;', ']', $atts['param']);
790
        }
791
792
        $new_value = FrmAppHelper::get_param($atts['param'], '');
793
        $new_value = FrmAppHelper::get_query_var( $new_value, $atts['param'] );
794
795
        if ( $new_value == '' ) {
796
            if ( ! isset($atts['prev_val']) ) {
797
                $atts['prev_val'] = '';
798
            }
799
800
            $new_value = isset($atts['default']) ? $atts['default'] : $atts['prev_val'];
801
        }
802
803
        if ( is_array($new_value) && ! $return_array ) {
804
            $new_value = implode(', ', $new_value);
805
        }
806
807
        return $new_value;
808
    }
809
810
	public static function get_display_value( $replace_with, $field, $atts = array() ) {
811
		$sep = isset( $atts['sep'] ) ? $atts['sep'] : ', ';
812
813
		$replace_with = apply_filters( 'frm_get_' . $field->type . '_display_value', $replace_with, $field, $atts );
814
		$replace_with = apply_filters( 'frm_get_display_value', $replace_with, $field, $atts );
815
816
        if ( $field->type == 'textarea' || $field->type == 'rte' ) {
817
            $autop = isset($atts['wpautop']) ? $atts['wpautop'] : true;
818
            if ( apply_filters('frm_use_wpautop', $autop) ) {
819
                if ( is_array($replace_with) ) {
820
                    $replace_with = implode("\n", $replace_with);
821
                }
822
                $replace_with = wpautop($replace_with);
823
            }
824
			unset( $autop );
825
		} else if ( is_array( $replace_with ) ) {
826
			$replace_with = implode( $sep, $replace_with );
827
		}
828
829
		return $replace_with;
830
	}
831
832
	public static function get_field_types( $type ) {
833
        $single_input = array(
834
            'text', 'textarea', 'rte', 'number', 'email', 'url',
835
            'image', 'file', 'date', 'phone', 'hidden', 'time',
836
            'user_id', 'tag', 'password',
837
        );
838
		$multiple_input = array( 'radio', 'checkbox', 'select', 'scale', 'lookup' );
839
		$other_type = array( 'html', 'break' );
840
841
		$field_selection = array_merge( FrmField::pro_field_selection(), FrmField::field_selection() );
842
843
        $field_types = array();
844
        if ( in_array($type, $single_input) ) {
845
            self::field_types_for_input( $single_input, $field_selection, $field_types );
846
        } else if ( in_array($type, $multiple_input) ) {
847
            self::field_types_for_input( $multiple_input, $field_selection, $field_types );
848
        } else if ( in_array($type, $other_type) ) {
849
            self::field_types_for_input( $other_type, $field_selection, $field_types );
850
		} else if ( isset( $field_selection[ $type ] ) ) {
851
            $field_types[ $type ] = $field_selection[ $type ];
852
        }
853
854
		$field_types = apply_filters( 'frm_switch_field_types', $field_types, compact( 'type' ) );
855
        return $field_types;
856
    }
857
858
    private static function field_types_for_input( $inputs, $fields, &$field_types ) {
859
        foreach ( $inputs as $input ) {
860
            $field_types[ $input ] = $fields[ $input ];
861
            unset($input);
862
        }
863
    }
864
865
    /**
866
    * Check if current field option is an "other" option
867
    *
868
    * @since 2.0.6
869
    *
870
    * @param string $opt_key
871
    * @return boolean Returns true if current field option is an "Other" option
872
    */
873
    public static function is_other_opt( $opt_key ) {
874
        return $opt_key && strpos( $opt_key, 'other' ) !== false;
875
    }
876
877
    /**
878
    * Get value that belongs in "Other" text box
879
    *
880
    * @since 2.0.6
881
    *
882
    * @param array $args
883
    */
884
    public static function get_other_val( $args ) {
885
		$defaults = array(
886
			'opt_key' => 0, 'field' => array(),
887
			'parent' => false, 'pointer' => false,
888
		);
889
		$args = wp_parse_args( $args, $defaults );
890
891
		$opt_key = $args['opt_key'];
892
		$field = $args['field'];
893
		$parent = $args['parent'];
894
		$pointer = $args['pointer'];
895
		$other_val = '';
896
897
		// If option is an "other" option and there is a value set for this field,
898
		// check if the value belongs in the current "Other" option text field
899
		if ( ! FrmFieldsHelper::is_other_opt( $opt_key ) || ! FrmField::is_option_true( $field, 'value' ) ) {
900
			return $other_val;
901
		}
902
903
		// Check posted vals before checking saved values
904
905
		// For fields inside repeating sections - note, don't check if $pointer is true because it will often be zero
906
		if ( $parent && isset( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ] ) ) {
907
			if ( FrmField::is_field_with_multiple_values( $field ) ) {
908
				$other_val = isset( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ][ $opt_key ] ) ? sanitize_text_field( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ][ $opt_key ] ) : '';
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
909
			} else {
910
				$other_val = sanitize_text_field( $_POST['item_meta'][ $parent ][ $pointer ]['other'][ $field['id'] ] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
911
			}
912
			return $other_val;
913
914
		} else if ( isset( $field['id'] ) && isset( $_POST['item_meta']['other'][ $field['id'] ] ) ) {
915
			// For normal fields
916
917
			if ( FrmField::is_field_with_multiple_values( $field ) ) {
918
				$other_val = isset( $_POST['item_meta']['other'][ $field['id'] ][ $opt_key ] ) ? sanitize_text_field( $_POST['item_meta']['other'][ $field['id'] ][ $opt_key ] ) : '';
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
919
			} else {
920
				$other_val = sanitize_text_field( $_POST['item_meta']['other'][ $field['id'] ] );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
921
			}
922
			return $other_val;
923
		}
924
925
		// For checkboxes
926
		if ( $field['type'] == 'checkbox' && is_array( $field['value'] ) ) {
927
			// Check if there is an "other" val in saved value and make sure the
928
			// "other" val is not equal to the Other checkbox option
929
			if ( isset( $field['value'][ $opt_key ] ) && $field['options'][ $opt_key ] != $field['value'][ $opt_key ] ) {
930
				$other_val = $field['value'][ $opt_key ];
931
			}
932
		} else {
933
			/**
934
			 * For radio buttons and dropdowns
935
			 * Check if saved value equals any of the options. If not, set it as the other value.
936
			 */
937
			foreach ( $field['options'] as $opt_key => $opt_val ) {
938
				$temp_val = is_array( $opt_val ) ? $opt_val['value'] : $opt_val;
939
				// Multi-select dropdowns - key is not preserved
940
				if ( is_array( $field['value'] ) ) {
941
					$o_key = array_search( $temp_val, $field['value'] );
942
					if ( isset( $field['value'][ $o_key ] ) ) {
943
						unset( $field['value'][ $o_key ], $o_key );
944
					}
945
				} else if ( $temp_val == $field['value'] ) {
946
					// For radio and regular dropdowns
947
					return '';
948
				} else {
949
					$other_val = $field['value'];
950
				}
951
				unset( $opt_key, $opt_val, $temp_val );
952
			}
953
			// For multi-select dropdowns only
954
			if ( is_array( $field['value'] ) && ! empty( $field['value'] ) ) {
955
				$other_val = reset( $field['value'] );
956
			}
957
		}
958
959
		return $other_val;
960
    }
961
962
    /**
963
    * Check if there is a saved value for the "Other" text field. If so, set it as the $other_val.
964
    * Intended for front-end use
965
    *
966
    * @since 2.0.6
967
    *
968
    * @param array $args should include field, opt_key and field name
969
    * @param boolean $other_opt
970
    * @param string $checked
971
    * @return string $other_val
972
    */
973
    public static function prepare_other_input( $args, &$other_opt, &$checked ) {
974
		//Check if this is an "Other" option
975
		if ( ! self::is_other_opt( $args['opt_key'] ) ) {
976
			return;
977
		}
978
979
		$other_opt = true;
980
		$other_args = array();
981
982
		self::set_other_name( $args, $other_args );
983
		self::set_other_value( $args, $other_args );
984
985
		if ( $other_args['value'] ) {
986
			$checked = 'checked="checked" ';
987
		}
988
989
        return $other_args;
990
    }
991
992
	/**
993
	 * @param array $args
994
	 * @param array $other_args
995
	 * @since 2.0.6
996
	 */
997
	private static function set_other_name( $args, &$other_args ) {
998
		//Set up name for other field
999
		$other_args['name'] = str_replace( '[]', '', $args['field_name'] );
1000
		$other_args['name'] = preg_replace('/\[' . $args['field']['id'] . '\]$/', '', $other_args['name']);
1001
		$other_args['name'] = $other_args['name'] . '[other]' . '[' . $args['field']['id'] . ']';
1002
1003
		//Converts item_meta[field_id] => item_meta[other][field_id] and
1004
		//item_meta[parent][0][field_id] => item_meta[parent][0][other][field_id]
1005
		if ( FrmField::is_field_with_multiple_values( $args['field'] ) ) {
1006
			$other_args['name'] .= '[' . $args['opt_key'] . ']';
1007
		}
1008
	}
1009
1010
	/**
1011
	 * Find the parent and pointer, and get text for "other" text field
1012
	 * @param array $args
1013
	 * @param array $other_args
1014
	 *
1015
	 * @since 2.0.6
1016
	 */
1017
	private static function set_other_value( $args, &$other_args ) {
1018
		$parent = $pointer = '';
1019
1020
		// Check for parent ID and pointer
1021
		$temp_array = explode( '[', $args['field_name'] );
1022
1023
		// Count should only be greater than 3 if inside of a repeating section
1024
		if ( count( $temp_array ) > 3 ) {
1025
			$parent = str_replace( ']', '', $temp_array[1] );
1026
			$pointer = str_replace( ']', '', $temp_array[2]);
1027
		}
1028
1029
		// Get text for "other" text field
1030
		$other_args['value'] = self::get_other_val( array( 'opt_key' => $args['opt_key'], 'field' => $args['field'], 'parent' => $parent, 'pointer' => $pointer ) );
1031
	}
1032
1033
	/**
1034
	 * If this field includes an other option, show it
1035
	 * @param $args array
1036
	 * @since 2.0.6
1037
	 */
1038
	public static function include_other_input( $args ) {
1039
        if ( ! $args['other_opt'] ) {
1040
        	return;
1041
		}
1042
1043
		$classes = array( 'frm_other_input' );
1044
		if ( ! $args['checked'] || trim( $args['checked'] ) == '' ) {
1045
			// hide the field if the other option is not selected
1046
			$classes[] = 'frm_pos_none';
1047
		}
1048
		if ( $args['field']['type'] == 'select' && $args['field']['multiple'] ) {
1049
			$classes[] = 'frm_other_full';
1050
		}
1051
1052
		// Set up HTML ID for Other field
1053
		$other_id = self::get_other_field_html_id( $args['field']['type'], $args['html_id'], $args['opt_key'] );
1054
1055
		?><input type="text" id="<?php echo esc_attr( $other_id ) ?>" class="<?php echo sanitize_text_field( implode( ' ', $classes ) ) ?>" <?php
1056
		echo ( $args['read_only'] ? ' readonly="readonly" disabled="disabled"' : '' );
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '('
Loading history...
1057
		?> name="<?php echo esc_attr( $args['name'] ) ?>" value="<?php echo esc_attr( $args['value'] ); ?>" /><?php
1058
	}
1059
1060
	/**
1061
	* Get the HTML id for an "Other" text field
1062
	* Note: This does not affect fields in repeating sections
1063
	*
1064
	* @since 2.0.08
1065
	* @param string $type - field type
1066
	* @param string $html_id
1067
	* @param string|boolean $opt_key
1068
	* @return string $other_id
1069
	*/
1070
	public static function get_other_field_html_id( $type, $html_id, $opt_key = false ) {
1071
		$other_id = $html_id;
1072
1073
		// If hidden radio field, add an opt key of 0
1074
		if ( $type == 'radio' && $opt_key === false ) {
1075
			$opt_key = 0;
1076
		}
1077
1078
		if ( $opt_key !== false ) {
1079
			$other_id .= '-' . $opt_key;
1080
		}
1081
1082
		$other_id .= '-otext';
1083
1084
		return $other_id;
1085
	}
1086
1087
	public static function clear_on_focus_html( $field, $display, $id = '' ) {
1088
		if ( $display['clear_on_focus'] ) {
1089
			echo '<span id="frm_clear_on_focus_' . esc_attr( $field['id'] . $id ) . '" class="frm-show-click">';
1090
1091
			if ( $display['default_blank'] ) {
1092
				self::show_default_blank_js( $field['default_blank'] );
1093
				echo '<input type="hidden" name="field_options[default_blank_' . esc_attr( $field['id'] ) . ']" value="' . esc_attr( $field['default_blank'] ) . '" />';
1094
			}
1095
1096
			self::show_onfocus_js( $field['clear_on_focus'] );
1097
			echo '<input type="hidden" name="field_options[clear_on_focus_' . esc_attr( $field['id'] ) . ']" value="' . esc_attr( $field['clear_on_focus'] ) . '" />';
1098
1099
			echo '</span>';
1100
		}
1101
	}
1102
1103 View Code Duplication
	public static function show_onfocus_js( $is_selected ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1104
		$atts = array(
1105
			'icon'        => 'frm_reload_icon',
1106
			'message'     => $is_selected ? __( 'Clear default value when typing', 'formidable' ) : __( 'Do not clear default value when typing', 'formidable' ),
1107
			'is_selected' => $is_selected,
1108
		);
1109
		self::show_icon_link_js( $atts );
1110
	}
1111
1112 View Code Duplication
	public static function show_default_blank_js( $is_selected ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1113
		$atts = array(
1114
			'icon'        => 'frm_error_icon',
1115
			'message'     => $is_selected ? __( 'Default value will NOT pass form validation', 'formidable' ) : __( 'Default value will pass form validation', 'formidable' ),
1116
			'is_selected' => $is_selected,
1117
		);
1118
		self::show_icon_link_js( $atts );
1119
	}
1120
1121
	public static function show_icon_link_js( $atts ) {
1122
		$atts['icon'] .= $atts['is_selected'] ? ' ' : ' frm_inactive_icon ';
1123
		?><a href="javascript:void(0)" class="frm_bstooltip <?php echo esc_attr( $atts['icon'] ); ?>frm_default_val_icons frm_action_icon frm_icon_font" title="<?php echo esc_attr( $atts['message'] ); ?>"></a><?php
1124
	}
1125
1126
	public static function switch_field_ids( $val ) {
1127
        global $frm_duplicate_ids;
1128
        $replace = array();
1129
        $replace_with = array();
1130
        foreach ( (array) $frm_duplicate_ids as $old => $new ) {
1131
			$replace[] = '[if ' . $old . ']';
1132
			$replace_with[] = '[if ' . $new . ']';
1133
			$replace[] = '[if ' . $old . ' ';
1134
			$replace_with[] = '[if ' . $new . ' ';
1135
			$replace[] = '[/if ' . $old . ']';
1136
			$replace_with[] = '[/if ' . $new . ']';
1137
			$replace[] = '[foreach ' . $old . ']';
1138
			$replace_with[] = '[foreach ' . $new . ']';
1139
			$replace[] = '[/foreach ' . $old . ']';
1140
			$replace_with[] = '[/foreach ' . $new . ']';
1141
			$replace[] = '[' . $old . ']';
1142
			$replace_with[] = '[' . $new . ']';
1143
			$replace[] = '[' . $old . ' ';
1144
			$replace_with[] = '[' . $new . ' ';
1145
            unset($old, $new);
1146
        }
1147
		if ( is_array( $val ) ) {
1148
			foreach ( $val as $k => $v ) {
1149
                $val[ $k ] = str_replace( $replace, $replace_with, $v );
1150
                unset($k, $v);
1151
            }
1152
        } else {
1153
            $val = str_replace($replace, $replace_with, $val);
1154
        }
1155
1156
        return $val;
1157
    }
1158
1159
    public static function get_us_states() {
1160
        return apply_filters( 'frm_us_states', array(
1161
            'AL' => 'Alabama', 'AK' => 'Alaska', 'AR' => 'Arkansas', 'AZ' => 'Arizona',
1162
            'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware',
1163
            'DC' => 'District of Columbia',
1164
            'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho',
1165
            'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas',
1166
            'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine','MD' => 'Maryland',
1167
            'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi',
1168
            'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada',
1169
            'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York',
1170
            'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma',
1171
            'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina',
1172
            'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah',
1173
            'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia',
1174
            'WI' => 'Wisconsin', 'WY' => 'Wyoming',
1175
        ) );
1176
    }
1177
1178
    public static function get_countries() {
1179
        return apply_filters( 'frm_countries', array(
1180
            __( 'Afghanistan', 'formidable' ), __( 'Albania', 'formidable' ), __( 'Algeria', 'formidable' ),
1181
            __( 'American Samoa', 'formidable' ), __( 'Andorra', 'formidable' ), __( 'Angola', 'formidable' ),
1182
            __( 'Anguilla', 'formidable' ), __( 'Antarctica', 'formidable' ), __( 'Antigua and Barbuda', 'formidable' ),
1183
            __( 'Argentina', 'formidable' ), __( 'Armenia', 'formidable' ), __( 'Aruba', 'formidable' ),
1184
            __( 'Australia', 'formidable' ), __( 'Austria', 'formidable' ), __( 'Azerbaijan', 'formidable' ),
1185
            __( 'Bahamas', 'formidable' ), __( 'Bahrain', 'formidable' ), __( 'Bangladesh', 'formidable' ),
1186
            __( 'Barbados', 'formidable' ), __( 'Belarus', 'formidable' ), __( 'Belgium', 'formidable' ),
1187
            __( 'Belize', 'formidable' ), __( 'Benin', 'formidable' ), __( 'Bermuda', 'formidable' ),
1188
            __( 'Bhutan', 'formidable' ), __( 'Bolivia', 'formidable' ), __( 'Bosnia and Herzegovina', 'formidable' ),
1189
            __( 'Botswana', 'formidable' ), __( 'Brazil', 'formidable' ), __( 'Brunei', 'formidable' ),
1190
            __( 'Bulgaria', 'formidable' ), __( 'Burkina Faso', 'formidable' ), __( 'Burundi', 'formidable' ),
1191
            __( 'Cambodia', 'formidable' ), __( 'Cameroon', 'formidable' ), __( 'Canada', 'formidable' ),
1192
            __( 'Cape Verde', 'formidable' ), __( 'Cayman Islands', 'formidable' ), __( 'Central African Republic', 'formidable' ),
1193
            __( 'Chad', 'formidable' ), __( 'Chile', 'formidable' ), __( 'China', 'formidable' ),
1194
            __( 'Colombia', 'formidable' ), __( 'Comoros', 'formidable' ), __( 'Congo', 'formidable' ),
1195
            __( 'Costa Rica', 'formidable' ), __( 'C&ocirc;te d\'Ivoire', 'formidable' ), __( 'Croatia', 'formidable' ),
1196
            __( 'Cuba', 'formidable' ), __( 'Cyprus', 'formidable' ), __( 'Czech Republic', 'formidable' ),
1197
            __( 'Denmark', 'formidable' ), __( 'Djibouti', 'formidable' ), __( 'Dominica', 'formidable' ),
1198
            __( 'Dominican Republic', 'formidable' ), __( 'East Timor', 'formidable' ), __( 'Ecuador', 'formidable' ),
1199
            __( 'Egypt', 'formidable' ), __( 'El Salvador', 'formidable' ), __( 'Equatorial Guinea', 'formidable' ),
1200
            __( 'Eritrea', 'formidable' ), __( 'Estonia', 'formidable' ), __( 'Ethiopia', 'formidable' ),
1201
            __( 'Fiji', 'formidable' ), __( 'Finland', 'formidable' ), __( 'France', 'formidable' ),
1202
            __( 'French Guiana', 'formidable' ), __( 'French Polynesia', 'formidable' ), __( 'Gabon', 'formidable' ),
1203
            __( 'Gambia', 'formidable' ), __( 'Georgia', 'formidable' ), __( 'Germany', 'formidable' ),
1204
            __( 'Ghana', 'formidable' ), __( 'Gibraltar', 'formidable' ), __( 'Greece', 'formidable' ),
1205
            __( 'Greenland', 'formidable' ), __( 'Grenada', 'formidable' ), __( 'Guam', 'formidable' ),
1206
            __( 'Guatemala', 'formidable' ), __( 'Guinea', 'formidable' ), __( 'Guinea-Bissau', 'formidable' ),
1207
            __( 'Guyana', 'formidable' ), __( 'Haiti', 'formidable' ), __( 'Honduras', 'formidable' ),
1208
            __( 'Hong Kong', 'formidable' ), __( 'Hungary', 'formidable' ), __( 'Iceland', 'formidable' ),
1209
            __( 'India', 'formidable' ), __( 'Indonesia', 'formidable' ), __( 'Iran', 'formidable' ),
1210
            __( 'Iraq', 'formidable' ), __( 'Ireland', 'formidable' ), __( 'Israel', 'formidable' ),
1211
            __( 'Italy', 'formidable' ), __( 'Jamaica', 'formidable' ), __( 'Japan', 'formidable' ),
1212
            __( 'Jordan', 'formidable' ), __( 'Kazakhstan', 'formidable' ), __( 'Kenya', 'formidable' ),
1213
            __( 'Kiribati', 'formidable' ), __( 'North Korea', 'formidable' ), __( 'South Korea', 'formidable' ),
1214
            __( 'Kuwait', 'formidable' ), __( 'Kyrgyzstan', 'formidable' ), __( 'Laos', 'formidable' ),
1215
            __( 'Latvia', 'formidable' ), __( 'Lebanon', 'formidable' ), __( 'Lesotho', 'formidable' ),
1216
            __( 'Liberia', 'formidable' ), __( 'Libya', 'formidable' ), __( 'Liechtenstein', 'formidable' ),
1217
            __( 'Lithuania', 'formidable' ), __( 'Luxembourg', 'formidable' ), __( 'Macedonia', 'formidable' ),
1218
            __( 'Madagascar', 'formidable' ), __( 'Malawi', 'formidable' ), __( 'Malaysia', 'formidable' ),
1219
            __( 'Maldives', 'formidable' ), __( 'Mali', 'formidable' ), __( 'Malta', 'formidable' ),
1220
            __( 'Marshall Islands', 'formidable' ), __( 'Mauritania', 'formidable' ), __( 'Mauritius', 'formidable' ),
1221
            __( 'Mexico', 'formidable' ), __( 'Micronesia', 'formidable' ), __( 'Moldova', 'formidable' ),
1222
            __( 'Monaco', 'formidable' ), __( 'Mongolia', 'formidable' ), __( 'Montenegro', 'formidable' ),
1223
            __( 'Montserrat', 'formidable' ), __( 'Morocco', 'formidable' ), __( 'Mozambique', 'formidable' ),
1224
            __( 'Myanmar', 'formidable' ), __( 'Namibia', 'formidable' ), __( 'Nauru', 'formidable' ),
1225
            __( 'Nepal', 'formidable' ), __( 'Netherlands', 'formidable' ), __( 'New Zealand', 'formidable' ),
1226
            __( 'Nicaragua', 'formidable' ), __( 'Niger', 'formidable' ), __( 'Nigeria', 'formidable' ),
1227
            __( 'Norway', 'formidable' ), __( 'Northern Mariana Islands', 'formidable' ), __( 'Oman', 'formidable' ),
1228
            __( 'Pakistan', 'formidable' ), __( 'Palau', 'formidable' ), __( 'Palestine', 'formidable' ),
1229
            __( 'Panama', 'formidable' ), __( 'Papua New Guinea', 'formidable' ), __( 'Paraguay', 'formidable' ),
1230
            __( 'Peru', 'formidable' ), __( 'Philippines', 'formidable' ), __( 'Poland', 'formidable' ),
1231
            __( 'Portugal', 'formidable' ), __( 'Puerto Rico', 'formidable' ), __( 'Qatar', 'formidable' ),
1232
            __( 'Romania', 'formidable' ), __( 'Russia', 'formidable' ), __( 'Rwanda', 'formidable' ),
1233
            __( 'Saint Kitts and Nevis', 'formidable' ), __( 'Saint Lucia', 'formidable' ),
1234
            __( 'Saint Vincent and the Grenadines', 'formidable' ), __( 'Samoa', 'formidable' ),
1235
            __( 'San Marino', 'formidable' ), __( 'Sao Tome and Principe', 'formidable' ), __( 'Saudi Arabia', 'formidable' ),
1236
            __( 'Senegal', 'formidable' ), __( 'Serbia and Montenegro', 'formidable' ), __( 'Seychelles', 'formidable' ),
1237
            __( 'Sierra Leone', 'formidable' ), __( 'Singapore', 'formidable' ), __( 'Slovakia', 'formidable' ),
1238
            __( 'Slovenia', 'formidable' ), __( 'Solomon Islands', 'formidable' ), __( 'Somalia', 'formidable' ),
1239
            __( 'South Africa', 'formidable' ), __( 'South Sudan', 'formidable' ),
1240
            __( 'Spain', 'formidable' ), __( 'Sri Lanka', 'formidable' ),
1241
            __( 'Sudan', 'formidable' ), __( 'Suriname', 'formidable' ), __( 'Swaziland', 'formidable' ),
1242
            __( 'Sweden', 'formidable' ), __( 'Switzerland', 'formidable' ), __( 'Syria', 'formidable' ),
1243
            __( 'Taiwan', 'formidable' ), __( 'Tajikistan', 'formidable' ), __( 'Tanzania', 'formidable' ),
1244
            __( 'Thailand', 'formidable' ), __( 'Togo', 'formidable' ), __( 'Tonga', 'formidable' ),
1245
            __( 'Trinidad and Tobago', 'formidable' ), __( 'Tunisia', 'formidable' ), __( 'Turkey', 'formidable' ),
1246
            __( 'Turkmenistan', 'formidable' ), __( 'Tuvalu', 'formidable' ), __( 'Uganda', 'formidable' ),
1247
            __( 'Ukraine', 'formidable' ), __( 'United Arab Emirates', 'formidable' ), __( 'United Kingdom', 'formidable' ),
1248
            __( 'United States', 'formidable' ), __( 'Uruguay', 'formidable' ), __( 'Uzbekistan', 'formidable' ),
1249
            __( 'Vanuatu', 'formidable' ), __( 'Vatican City', 'formidable' ), __( 'Venezuela', 'formidable' ),
1250
            __( 'Vietnam', 'formidable' ), __( 'Virgin Islands, British', 'formidable' ),
1251
            __( 'Virgin Islands, U.S.', 'formidable' ), __( 'Yemen', 'formidable' ), __( 'Zambia', 'formidable' ),
1252
            __( 'Zimbabwe', 'formidable' ),
1253
        ) );
1254
    }
1255
1256
	public static function get_bulk_prefilled_opts( array &$prepop ) {
1257
		$prepop[ __( 'Countries', 'formidable' ) ] = FrmFieldsHelper::get_countries();
1258
1259
        $states = FrmFieldsHelper::get_us_states();
1260
        $state_abv = array_keys($states);
1261
        sort($state_abv);
1262
		$prepop[ __( 'U.S. State Abbreviations', 'formidable' ) ] = $state_abv;
1263
1264
        $states = array_values($states);
1265
        sort($states);
1266
		$prepop[ __( 'U.S. States', 'formidable' ) ] = $states;
1267
        unset($state_abv, $states);
1268
1269
		$prepop[ __( 'Age', 'formidable' ) ] = array(
1270
            __( 'Under 18', 'formidable' ), __( '18-24', 'formidable' ), __( '25-34', 'formidable' ),
1271
            __( '35-44', 'formidable' ), __( '45-54', 'formidable' ), __( '55-64', 'formidable' ),
1272
            __( '65 or Above', 'formidable' ), __( 'Prefer Not to Answer', 'formidable' ),
1273
        );
1274
1275
		$prepop[ __( 'Satisfaction', 'formidable' ) ] = array(
1276
            __( 'Very Satisfied', 'formidable' ), __( 'Satisfied', 'formidable' ), __( 'Neutral', 'formidable' ),
1277
            __( 'Unsatisfied', 'formidable' ), __( 'Very Unsatisfied', 'formidable' ), __( 'N/A', 'formidable' ),
1278
        );
1279
1280
		$prepop[ __( 'Importance', 'formidable' ) ] = array(
1281
            __( 'Very Important', 'formidable' ), __( 'Important', 'formidable' ), __( 'Neutral', 'formidable' ),
1282
            __( 'Somewhat Important', 'formidable' ), __( 'Not at all Important', 'formidable' ), __( 'N/A', 'formidable' ),
1283
        );
1284
1285
		$prepop[ __( 'Agreement', 'formidable' ) ] = array(
1286
            __( 'Strongly Agree', 'formidable' ), __( 'Agree', 'formidable' ), __( 'Neutral', 'formidable' ),
1287
            __( 'Disagree', 'formidable' ), __( 'Strongly Disagree', 'formidable' ), __( 'N/A', 'formidable' ),
1288
        );
1289
1290
		$prepop = apply_filters( 'frm_bulk_field_choices', $prepop );
1291
    }
1292
1293
	public static function field_selection() {
1294
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::field_selection' );
1295
		return FrmField::field_selection();
1296
	}
1297
1298
	public static function pro_field_selection() {
1299
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::pro_field_selection' );
1300
		return FrmField::pro_field_selection();
1301
	}
1302
1303
	public static function is_no_save_field( $type ) {
1304
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_no_save_field' );
1305
		return FrmField::is_no_save_field( $type );
1306
	}
1307
1308
	public static function no_save_fields() {
1309
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::no_save_fields' );
1310
		return FrmField::no_save_fields();
1311
	}
1312
1313
	public static function is_multiple_select( $field ) {
1314
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_multiple_select' );
1315
		return FrmField::is_multiple_select( $field );
1316
	}
1317
1318
	public static function is_field_with_multiple_values( $field ) {
1319
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_field_with_multiple_values' );
1320
		return FrmField::is_field_with_multiple_values( $field );
1321
	}
1322
1323
	public static function is_required_field( $field ) {
1324
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::is_required' );
1325
		return FrmField::is_required( $field );
1326
	}
1327
1328
    public static function maybe_get_field( &$field ) {
1329
		_deprecated_function( __FUNCTION__, '2.0.9', 'FrmField::maybe_get_field' );
1330
		FrmField::maybe_get_field( $field );
1331
    }
1332
1333
	public static function dropdown_categories( $args ) {
1334
		_deprecated_function( __FUNCTION__, '2.02.07', 'FrmProPost::get_category_dropdown' );
1335
1336
		if ( FrmAppHelper::pro_is_installed() ) {
1337
			$args['location'] = 'front';
1338
			$dropdown = FrmProPost::get_category_dropdown( $args['field'], $args );
1339
		} else {
1340
			$dropdown = '';
1341
		}
1342
1343
		return $dropdown;
1344
	}
1345
}
1346