Issues (865)

Security Analysis    4 potential vulnerabilities

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection (1)
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection (2)
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting (1)
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

wp-ayecode-ui/includes/ayecode-ui-settings.php (27 issues)

1
<?php
2
/**
3
 * A class for adjusting AyeCode UI settings on WordPress
4
 *
5
 * This class can be added to any plugin or theme and will add a settings screen to WordPress to control Bootstrap settings.
6
 *
7
 * @link https://github.com/AyeCode/wp-ayecode-ui
8
 *
9
 * @internal This file should not be edited directly but pulled from the github repo above.
10
 */
11
12
/**
13
 * Bail if we are not in WP.
14
 */
15
if ( ! defined( 'ABSPATH' ) ) {
16
	exit;
17
}
18
19
/**
20
 * Only add if the class does not already exist.
21
 */
22
if ( ! class_exists( 'AyeCode_UI_Settings' ) ) {
23
24
	/**
25
	 * A Class to be able to change settings for Font Awesome.
26
	 *
27
	 * Class AyeCode_UI_Settings
28
	 * @ver 1.0.0
29
	 * @todo decide how to implement textdomain
30
	 */
31
	class AyeCode_UI_Settings {
32
33
		/**
34
		 * Class version version.
35
		 *
36
		 * @var string
37
		 */
38
		public $version = '0.2.41';
39
40
		/**
41
		 * Class textdomain.
42
		 *
43
		 * @var string
44
		 */
45
		public $textdomain = 'aui';
46
47
		/**
48
		 * Latest version of Bootstrap at time of publish published.
49
		 *
50
		 * @var string
51
		 */
52
		public $latest = "5.2.2";
53
54
		/**
55
		 * Current version of select2 being used.
56
		 *
57
		 * @var string
58
		 */
59
		public $select2_version = "4.0.11";
60
61
		/**
62
		 * The title.
63
		 *
64
		 * @var string
65
		 */
66
		public $name = 'AyeCode UI';
67
68
		/**
69
		 * The relative url to the assets.
70
		 *
71
		 * @var string
72
		 */
73
		public $url = '';
74
75
		/**
76
		 * Holds the settings values.
77
		 *
78
		 * @var array
79
		 */
80
		private $settings;
81
82
		/**
83
		 * AyeCode_UI_Settings instance.
84
		 *
85
		 * @access private
86
		 * @since  1.0.0
87
		 * @var    AyeCode_UI_Settings There can be only one!
88
		 */
89
		private static $instance = null;
90
91
92
		/**
93
		 * Main AyeCode_UI_Settings Instance.
94
		 *
95
		 * Ensures only one instance of AyeCode_UI_Settings is loaded or can be loaded.
96
		 *
97
		 * @since 1.0.0
98
		 * @static
99
		 * @return AyeCode_UI_Settings - Main instance.
100
		 */
101
		public static function instance() {
102
			if ( ! isset( self::$instance ) && ! ( self::$instance instanceof AyeCode_UI_Settings ) ) {
103
104
				self::$instance = new AyeCode_UI_Settings;
105
106
				add_action( 'init', array( self::$instance, 'init' ) ); // set settings
107
108
				if ( is_admin() ) {
109
					add_action( 'admin_menu', array( self::$instance, 'menu_item' ) );
110
					add_action( 'admin_init', array( self::$instance, 'register_settings' ) );
111
112
					// Maybe show example page
113
					add_action( 'template_redirect', array( self::$instance,'maybe_show_examples' ) );
114
115
					if ( defined( 'BLOCKSTRAP_VERSION' ) ) {
116
						add_filter( 'sd_aui_colors', array( self::$instance,'sd_aui_colors' ), 10, 3 );
117
					}
118
				}
119
120
				add_action( 'customize_register', array( self::$instance, 'customizer_settings' ));
121
122
				do_action( 'ayecode_ui_settings_loaded' );
123
			}
124
125
			return self::$instance;
126
		}
127
128
		/**
129
		 * Add custom colors to the color selector.
130
		 *
131
		 * @param $theme_colors
132
		 * @param $include_outlines
133
		 * @param $include_branding
134
		 *
135
		 * @return mixed
136
		 */
137
		public function sd_aui_colors( $theme_colors, $include_outlines, $include_branding ){
0 ignored issues
show
The parameter $include_outlines is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

137
		public function sd_aui_colors( $theme_colors, /** @scrutinizer ignore-unused */ $include_outlines, $include_branding ){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $include_branding is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

137
		public function sd_aui_colors( $theme_colors, $include_outlines, /** @scrutinizer ignore-unused */ $include_branding ){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
138
139
140
			$setting = wp_get_global_settings();
141
142
			if(!empty($setting['color']['palette']['custom'])){
143
				foreach($setting['color']['palette']['custom'] as $color){
144
					$theme_colors[$color['slug']] = esc_attr($color['name']);
145
				}
146
			}
147
148
			return $theme_colors;
149
		}
150
151
		/**
152
		 * Setup some constants.
153
		 */
154
		public function constants(){
155
			define( 'AUI_PRIMARY_COLOR_ORIGINAL', "#1e73be" );
156
			define( 'AUI_SECONDARY_COLOR_ORIGINAL', '#6c757d' );
157
			define( 'AUI_INFO_COLOR_ORIGINAL', '#17a2b8' );
158
			define( 'AUI_WARNING_COLOR_ORIGINAL', '#ffc107' );
159
			define( 'AUI_DANGER_COLOR_ORIGINAL', '#dc3545' );
160
			define( 'AUI_SUCCESS_COLOR_ORIGINAL', '#44c553' );
161
			define( 'AUI_LIGHT_COLOR_ORIGINAL', '#f8f9fa' );
162
			define( 'AUI_DARK_COLOR_ORIGINAL', '#343a40' );
163
			define( 'AUI_WHITE_COLOR_ORIGINAL', '#fff' );
164
			define( 'AUI_PURPLE_COLOR_ORIGINAL', '#ad6edd' );
165
			define( 'AUI_SALMON_COLOR_ORIGINAL', '#ff977a' );
166
			define( 'AUI_CYAN_COLOR_ORIGINAL', '#35bdff' );
167
			define( 'AUI_GRAY_COLOR_ORIGINAL', '#ced4da' );
168
			define( 'AUI_INDIGO_COLOR_ORIGINAL', '#502c6c' );
169
			define( 'AUI_ORANGE_COLOR_ORIGINAL', '#orange' );
170
			define( 'AUI_BLACK_COLOR_ORIGINAL', '#000' );
171
172
			if ( ! defined( 'AUI_PRIMARY_COLOR' ) ) {
173
				define( 'AUI_PRIMARY_COLOR', AUI_PRIMARY_COLOR_ORIGINAL );
174
			}
175
			if ( ! defined( 'AUI_SECONDARY_COLOR' ) ) {
176
				define( 'AUI_SECONDARY_COLOR', AUI_SECONDARY_COLOR_ORIGINAL );
177
			}
178
			if ( ! defined( 'AUI_INFO_COLOR' ) ) {
179
				define( 'AUI_INFO_COLOR', AUI_INFO_COLOR_ORIGINAL );
180
			}
181
			if ( ! defined( 'AUI_WARNING_COLOR' ) ) {
182
				define( 'AUI_WARNING_COLOR', AUI_WARNING_COLOR_ORIGINAL );
183
			}
184
			if ( ! defined( 'AUI_DANGER_COLOR' ) ) {
185
				define( 'AUI_DANGER_COLOR', AUI_DANGER_COLOR_ORIGINAL );
186
			}
187
			if ( ! defined( 'AUI_SUCCESS_COLOR' ) ) {
188
				define( 'AUI_SUCCESS_COLOR', AUI_SUCCESS_COLOR_ORIGINAL );
189
			}
190
			if ( ! defined( 'AUI_LIGHT_COLOR' ) ) {
191
				define( 'AUI_LIGHT_COLOR', AUI_LIGHT_COLOR_ORIGINAL );
192
			}
193
			if ( ! defined( 'AUI_DARK_COLOR' ) ) {
194
				define( 'AUI_DARK_COLOR', AUI_DARK_COLOR_ORIGINAL );
195
			}
196
			if ( ! defined( 'AUI_WHITE_COLOR' ) ) {
197
				define( 'AUI_WHITE_COLOR', AUI_WHITE_COLOR_ORIGINAL );
198
			}
199
			if ( ! defined( 'AUI_PURPLE_COLOR' ) ) {
200
				define( 'AUI_PURPLE_COLOR', AUI_PURPLE_COLOR_ORIGINAL );
201
			}
202
			if ( ! defined( 'AUI_SALMON_COLOR' ) ) {
203
				define( 'AUI_SALMON_COLOR', AUI_SALMON_COLOR_ORIGINAL );
204
			}
205
			if ( ! defined( 'AUI_CYAN_COLOR' ) ) {
206
				define( 'AUI_CYAN_COLOR', AUI_CYAN_COLOR_ORIGINAL );
207
			}
208
			if ( ! defined( 'AUI_GRAY_COLOR' ) ) {
209
				define( 'AUI_GRAY_COLOR', AUI_GRAY_COLOR_ORIGINAL );
210
			}
211
			if ( ! defined( 'AUI_INDIGO_COLOR' ) ) {
212
				define( 'AUI_INDIGO_COLOR', AUI_INDIGO_COLOR_ORIGINAL );
213
			}
214
			if ( ! defined( 'AUI_ORANGE_COLOR' ) ) {
215
				define( 'AUI_ORANGE_COLOR', AUI_ORANGE_COLOR_ORIGINAL );
216
			}
217
			if ( ! defined( 'AUI_BLACK_COLOR' ) ) {
218
				define( 'AUI_BLACK_COLOR', AUI_BLACK_COLOR_ORIGINAL );
219
			}
220
221
		}
222
223
		public static function get_colors( $original = false){
224
225
			if ( ! defined( 'AUI_PRIMARY_COLOR' ) ) {
226
				return array();
227
			}
228
			if ( $original ) {
229
				return array(
230
					'primary'   => AUI_PRIMARY_COLOR_ORIGINAL,
231
					'secondary' => AUI_SECONDARY_COLOR_ORIGINAL,
232
					'info'      => AUI_INFO_COLOR_ORIGINAL,
233
					'warning'   => AUI_WARNING_COLOR_ORIGINAL,
234
					'danger'    => AUI_DANGER_COLOR_ORIGINAL,
235
					'success'   => AUI_SUCCESS_COLOR_ORIGINAL,
236
					'light'     => AUI_LIGHT_COLOR_ORIGINAL,
237
					'dark'      => AUI_DARK_COLOR_ORIGINAL,
238
					'white'     => AUI_WHITE_COLOR_ORIGINAL,
239
					'purple'    => AUI_PURPLE_COLOR_ORIGINAL,
240
					'salmon'    => AUI_SALMON_COLOR_ORIGINAL,
241
					'cyan'      => AUI_CYAN_COLOR_ORIGINAL,
242
					'gray'      => AUI_GRAY_COLOR_ORIGINAL,
243
					'indigo'    => AUI_INDIGO_COLOR_ORIGINAL,
244
					'orange'    => AUI_ORANGE_COLOR_ORIGINAL,
245
					'black'     => AUI_BLACK_COLOR_ORIGINAL,
246
				);
247
			}
248
249
			return array(
250
				'primary'   => AUI_PRIMARY_COLOR,
251
				'secondary' => AUI_SECONDARY_COLOR,
252
				'info'      => AUI_INFO_COLOR,
253
				'warning'   => AUI_WARNING_COLOR,
254
				'danger'    => AUI_DANGER_COLOR,
255
				'success'   => AUI_SUCCESS_COLOR,
256
				'light'     => AUI_LIGHT_COLOR,
257
				'dark'      => AUI_DARK_COLOR,
258
				'white'     => AUI_WHITE_COLOR,
259
				'purple'    => AUI_PURPLE_COLOR,
260
				'salmon'    => AUI_SALMON_COLOR,
261
				'cyan'      => AUI_CYAN_COLOR,
262
				'gray'      => AUI_GRAY_COLOR,
263
				'indigo'    => AUI_INDIGO_COLOR,
264
				'orange'    => AUI_ORANGE_COLOR,
265
				'black'     => AUI_BLACK_COLOR,
266
			);
267
		}
268
269
		/**
270
		 * Add admin body class to show when BS5 is active.
271
		 *
272
		 * @param $classes
273
		 *
274
		 * @return mixed
275
		 */
276
		public function add_bs5_admin_body_class( $classes = '' ) {
277
			$classes .= ' aui_bs5';
278
279
			return $classes;
280
		}
281
282
		/**
283
		 * Add a body class to show when BS5 is active.
284
		 *
285
		 * @param $classes
286
		 *
287
		 * @return mixed
288
		 */
289
		public function add_bs5_body_class( $classes ) {
290
			$classes[] = 'aui_bs5';
291
292
			return $classes;
293
		}
294
295
		/**
296
		 * Initiate the settings and add the required action hooks.
297
		 */
298
		public function init() {
299
            global $aui_bs5;
300
301
			// Maybe fix settings
302
			if ( ! empty( $_REQUEST['aui-fix-admin'] ) && !empty($_REQUEST['nonce']) && wp_verify_nonce( $_REQUEST['nonce'], "aui-fix-admin" ) ) {
303
				$db_settings = get_option( 'ayecode-ui-settings' );
304
				if ( ! empty( $db_settings ) ) {
305
					$db_settings['css_backend'] = 'compatibility';
306
					$db_settings['js_backend'] = 'core-popper';
307
					update_option( 'ayecode-ui-settings', $db_settings );
308
					wp_safe_redirect(admin_url("options-general.php?page=ayecode-ui-settings&updated=true"));
309
				}
310
			}
311
312
			$this->constants();
313
			$this->settings = $this->get_settings();
314
			$this->url = $this->get_url();
315
316
            // define the version
317
			$aui_bs5 = $this->settings['bs_ver'] === '5';
318
319
			if ( $aui_bs5 ) {
320
				include_once( dirname( __FILE__ ) . '/inc/bs-conversion.php' );
321
				add_filter( 'admin_body_class', array( $this, 'add_bs5_admin_body_class' ), 99, 1 );
322
				add_filter( 'body_class', array( $this, 'add_bs5_body_class' ) );
323
			}
324
325
			/**
326
			 * Maybe load CSS
327
			 *
328
			 * We load super early in case there is a theme version that might change the colors
329
			 */
330
			if ( $this->settings['css'] ) {
331
				$priority = $this->is_bs3_compat() ? 100 : 1;
332
                $priority = $aui_bs5 ? 10 : $priority;
333
				add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ), $priority );
334
			}
335
			if ( $this->settings['css_backend'] && $this->load_admin_scripts() ) {
336
				add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_style' ), 1 );
337
			}
338
339
			// maybe load JS
340
			if ( $this->settings['js'] ) {
341
				$priority = $this->is_bs3_compat() ? 100 : 1;
342
				add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), $priority );
343
			}
344
			if ( $this->settings['js_backend'] && $this->load_admin_scripts() ) {
345
				add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 1 );
346
			}
347
348
			// Maybe set the HTML font size
349
			if ( $this->settings['html_font_size'] ) {
350
				add_action( 'wp_footer', array( $this, 'html_font_size' ), 10 );
351
			}
352
353
			// Maybe show backend style error
354
			if( $this->settings['css_backend'] != 'compatibility' || $this->settings['js_backend'] != 'core-popper' ){
355
				add_action( 'admin_notices', array( $this, 'show_admin_style_notice' ) );
356
			}
357
358
		}
359
360
		/**
361
		 * Show admin notice if backend scripts not loaded.
362
		 */
363
		public function show_admin_style_notice(){
364
			$fix_url = admin_url("options-general.php?page=ayecode-ui-settings&aui-fix-admin=true&nonce=".wp_create_nonce('aui-fix-admin'));
365
			$button = '<a href="'.esc_url($fix_url).'" class="button-primary">Fix Now</a>';
366
			$message = __( '<b>Style Issue:</b> AyeCode UI is disable or set wrong.')." " .$button;
367
			echo '<div class="notice notice-error aui-settings-error-notice"><p>'. wp_kses_post( $message ).'</p></div>';
368
		}
369
370
		/**
371
		 * Check if we should load the admin scripts or not.
372
		 *
373
		 * @return bool
374
		 */
375
		public function load_admin_scripts(){
376
			$result = true;
377
378
			// check if specifically disabled
379
			if(!empty($this->settings['disable_admin'])){
380
				$url_parts = explode("\n",$this->settings['disable_admin']);
381
				foreach($url_parts as $part){
382
					if( strpos($_SERVER['REQUEST_URI'], trim($part)) !== false ){
383
						return false; // return early, no point checking further
384
					}
385
				}
386
			}
387
388
			return $result;
389
		}
390
391
		/**
392
		 * Add a html font size to the footer.
393
		 */
394
		public function html_font_size(){
395
			$this->settings = $this->get_settings();
396
			echo "<style>html{font-size:".absint($this->settings['html_font_size'])."px;}</style>";
397
		}
398
399
		/**
400
		 * Check if the current admin screen should load scripts.
401
		 *
402
		 * @return bool
403
		 */
404
		public function is_aui_screen(){
405
//			echo '###';exit;
406
			$load = false;
407
			// check if we should load or not
408
			if ( is_admin() ) {
409
				// Only enable on set pages
410
				$aui_screens = array(
411
					'page',
412
                    //'docs',
413
					'post',
414
					'settings_page_ayecode-ui-settings',
415
					'appearance_page_gutenberg-widgets',
416
					'widgets',
417
					'ayecode-ui-settings',
418
					'site-editor'
419
				);
420
				$screen_ids = apply_filters( 'aui_screen_ids', $aui_screens );
421
422
				$screen = get_current_screen();
0 ignored issues
show
Are you sure the assignment to $screen is correct as get_current_screen() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
423
424
//				echo '###'.$screen->id;
425
426
				// check if we are on a AUI screen
427
				if ( $screen && in_array( $screen->id, $screen_ids ) ) {
0 ignored issues
show
$screen is of type null, thus it always evaluated to false.
Loading history...
428
					$load = true;
429
				}
430
431
				//load for widget previews in WP 5.8
432
				if( !empty($_REQUEST['legacy-widget-preview'])){
433
					$load = true;
434
				}
435
			}
436
437
438
439
			return apply_filters( 'aui_load_on_admin' , $load );
440
		}
441
442
		/**
443
		 * Check if the current theme is a block theme.
444
		 *
445
		 * @return bool
446
		 */
447
		public static function is_block_theme() {
448
			if ( function_exists( 'wp_is_block_theme' && wp_is_block_theme() ) ) {
0 ignored issues
show
'wp_is_block_theme' && wp_is_block_theme() of type boolean is incompatible with the type string expected by parameter $function of function_exists(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

448
			if ( function_exists( /** @scrutinizer ignore-type */ 'wp_is_block_theme' && wp_is_block_theme() ) ) {
Loading history...
449
				return true;
450
			}
451
452
			return false;
453
		}
454
455
		/**
456
		 * Adds the styles.
457
		 */
458
		public function enqueue_style() {
459
            global $aui_bs5;
460
461
            $load_fse = false;
462
463
			if ( is_admin() && ! $this->is_aui_screen() ) {
464
				// Don't add wp-admin scripts if not requested to.
465
			} else {
466
				$css_setting = current_action() == 'wp_enqueue_scripts' ? 'css' : 'css_backend';
467
				$rtl = is_rtl() && ! $aui_bs5 ? '-rtl' : '';
468
                $bs_ver = $this->settings['bs_ver'] == '5' ? '-v5' : '';
469
470
				if ( $this->settings[ $css_setting ] ) {
471
					$compatibility = $this->settings[$css_setting]=='core' ? false : true;
472
					$url = $this->settings[$css_setting]=='core' ? $this->url.'assets'.$bs_ver.'/css/ayecode-ui'.$rtl.'.css' : $this->url.'assets'.$bs_ver.'/css/ayecode-ui-compatibility'.$rtl.'.css';
473
474
					wp_register_style( 'ayecode-ui', $url, array(), $this->version );
475
					wp_enqueue_style( 'ayecode-ui' );
476
477
					if ( is_admin() && ( !empty($_REQUEST['postType']) || self::is_block_editor() ) && ( defined( 'BLOCKSTRAP_VERSION' ) || defined( 'AUI_FSE' ) )  ) {
478
						$url = $this->url.'assets'.$bs_ver.'/css/ayecode-ui-fse.css';
479
						wp_register_style( 'ayecode-ui-fse', $url, array(), $this->version );
480
						wp_enqueue_style( 'ayecode-ui-fse' );
481
						$load_fse = true;
482
					}
483
484
					// flatpickr
485
					wp_register_style( 'flatpickr', $this->url.'assets'.$bs_ver.'/css/flatpickr.min.css', array(), $this->version );
486
487
					// fix some wp-admin issues
488
					if(is_admin()){
489
						$custom_css = "
490
                body{
491
                    background-color: #f1f1f1;
492
                    font-family: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif;
493
                    font-size:13px;
494
                }
495
                a {
496
				    color: #0073aa;
497
				    text-decoration: underline;
498
				}
499
                label {
500
				    display: initial;
501
				    margin-bottom: 0;
502
				}
503
				input, select {
504
				    margin: 1px;
505
				    line-height: initial;
506
				}
507
				th, td, div, h2 {
508
				    box-sizing: content-box;
509
				}
510
				h1, h2, h3, h4, h5, h6 {
511
				    display: block;
512
				    font-weight: 600;
513
				}
514
				h2,h3 {
515
				    font-size: 1.3em;
516
				    margin: 1em 0
517
				}
518
				.blocks-widgets-container .bsui *{
519
					box-sizing: border-box;
520
				}
521
				.bs-tooltip-top .arrow{
522
					margin-left:0px;
523
				}
524
				.custom-switch input[type=checkbox]{
525
				    display:none;
526
				}
527
                ";
528
529
						// @todo, remove once fixed :: fix for this bug https://github.com/WordPress/gutenberg/issues/14377
530
						$custom_css .= "
531
						.edit-post-sidebar input[type=color].components-text-control__input{
532
						    padding: 0;
533
						}
534
					";
535
						wp_add_inline_style( 'ayecode-ui', $custom_css );
536
					}
537
538
					// custom changes
539
					if ( $load_fse ) {
540
						wp_add_inline_style( 'ayecode-ui-fse', self::custom_css($compatibility, true) );
541
					}else{
542
						wp_add_inline_style( 'ayecode-ui', self::custom_css($compatibility) );
543
					}
544
				}
545
			}
546
		}
547
548
		/**
549
		 * Get inline script used if bootstrap enqueued
550
		 *
551
		 * If this remains small then its best to use this than to add another JS file.
552
		 */
553
		public function inline_script() {
554
            global $aui_bs5;
555
			// Flatpickr calendar locale
556
			$flatpickr_locale = self::flatpickr_locale();
0 ignored issues
show
The assignment to $flatpickr_locale is dead and can be removed.
Loading history...
557
558
			ob_start();
559
			if ( $aui_bs5 ) {
560
				include_once( dirname( __FILE__ ) . '/inc/bs5-js.php' );
561
			}else{
562
				include_once( dirname( __FILE__ ) . '/inc/bs4-js.php' );
563
            }
564
565
			$output = ob_get_clean();
566
567
			/*
568
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
569
			 */
570
			return str_replace( array(
571
				'<script>',
572
				'</script>'
573
			), '', self::minify_js($output) );
574
		}
575
576
577
		/**
578
		 * JS to help with conflict issues with other plugins and themes using bootstrap v3.
579
		 *
580
		 * @TODO we may need this when other conflicts arrise.
581
		 * @return mixed
582
		 */
583
		public static function bs3_compat_js() {
584
			ob_start();
585
			?>
586
            <script>
587
				<?php if( defined( 'FUSION_BUILDER_VERSION' ) ){ ?>
588
                /* With Avada builder */
589
590
				<?php } ?>
591
            </script>
592
			<?php
593
			return str_replace( array(
594
				'<script>',
595
				'</script>'
596
			), '', ob_get_clean());
597
		}
598
599
		/**
600
		 * Get inline script used if bootstrap file browser enqueued.
601
		 *
602
		 * If this remains small then its best to use this than to add another JS file.
603
		 */
604
		public function inline_script_file_browser(){
605
			ob_start();
606
			?>
607
            <script>
608
                // run on doc ready
609
                jQuery(document).ready(function () {
610
                    bsCustomFileInput.init();
611
                });
612
            </script>
613
			<?php
614
			$output = ob_get_clean();
615
616
			/*
617
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
618
			 */
619
			return str_replace( array(
620
				'<script>',
621
				'</script>'
622
			), '', $output );
623
		}
624
625
		/**
626
		 * Adds the Font Awesome JS.
627
		 */
628
		public function enqueue_scripts() {
629
			if( is_admin() && !$this->is_aui_screen()){
630
				// Don't add wp-admin scripts if not requested to.
631
			} else {
632
				$js_setting = current_action() == 'wp_enqueue_scripts' ? 'js' : 'js_backend';
633
634
				$bs_ver = $this->settings['bs_ver'] == '5' ? '-v5' : '';
635
636
				// select2
637
				wp_register_script( 'select2', $this->url . 'assets/js/select2.min.js', array( 'jquery' ), $this->select2_version );
638
639
				// flatpickr
640
				wp_register_script( 'flatpickr', $this->url . 'assets/js/flatpickr.min.js', array(), $this->version );
641
642
				// iconpicker
643
				if ( defined( 'FAS_ICONPICKER_JS_URL' ) ) {
644
					wp_register_script( 'iconpicker', FAS_ICONPICKER_JS_URL, array(), $this->version );
645
				}else{
646
					wp_register_script( 'iconpicker', $this->url . 'assets/js/fa-iconpicker.min.js', array(), $this->version );
647
				}
648
649
				// Bootstrap file browser
650
				wp_register_script( 'aui-custom-file-input', $url = $this->url . 'assets/js/bs-custom-file-input.min.js', array( 'jquery' ), $this->select2_version );
651
				wp_add_inline_script( 'aui-custom-file-input', $this->inline_script_file_browser() );
652
653
				$load_inline = false;
654
655
				// Load select2 only when required.
656
				if ( $this->force_load_select2() ) {
657
					$dependency = array( 'select2', 'jquery' );
658
				} else {
659
					$dependency = array( 'jquery' );
660
				}
661
662
				if ( $this->settings[ $js_setting ] == 'core-popper' ) {
663
					// Bootstrap bundle
664
					$url = $this->url . 'assets' . $bs_ver . '/js/bootstrap.bundle.min.js';
665
					wp_register_script( 'bootstrap-js-bundle', $url, $dependency, $this->version, $this->is_bs3_compat() );
666
667
					// If in admin then add to footer for compatibility.
668
					is_admin() ? wp_enqueue_script( 'bootstrap-js-bundle', '', null, null, true ) : wp_enqueue_script( 'bootstrap-js-bundle' );
669
670
					$script = $this->inline_script();
671
					wp_add_inline_script( 'bootstrap-js-bundle', $script );
672
				} elseif ( $this->settings[ $js_setting ] == 'popper' ) {
673
					$url = $this->url . 'assets/js/popper.min.js'; // @todo we need to update this to bs5
674
					wp_register_script( 'bootstrap-js-popper', $url, $dependency, $this->version );
675
					wp_enqueue_script( 'bootstrap-js-popper' );
676
					$load_inline = true;
677
				} else {
678
					$load_inline = true;
679
				}
680
681
				// Load needed inline scripts by faking the loading of a script if the main script is not being loaded
682
				if ( $load_inline ) {
683
					wp_register_script( 'bootstrap-dummy', '', $dependency );
684
					wp_enqueue_script( 'bootstrap-dummy' );
685
686
					$script = $this->inline_script();
687
					wp_add_inline_script( 'bootstrap-dummy', $script );
688
				}
689
			}
690
		}
691
692
		/**
693
		 * Enqueue select2 if called.
694
		 *
695
		 * @since 0.2.29
696
		 */
697
		public function force_load_select2() {
698
			global $aui_select2_enqueued;
699
700
			$conditional_select2 = apply_filters( 'aui_is_conditional_select2', true );
701
702
			if ( $conditional_select2 !== true ) {
703
				return true;
704
			}
705
706
			$load = is_admin() && ! $aui_select2_enqueued;
707
708
			return apply_filters( 'aui_force_load_select2', $load );
709
		}
710
711
		/**
712
		 * Enqueue select2 if called.
713
		 *
714
		 * @since 0.2.29
715
		 */
716
		public function enqueue_select2() {
717
			wp_enqueue_script( 'select2' );
718
		}
719
720
		/**
721
		 * Enqueue flatpickr if called.
722
		 */
723
		public function enqueue_flatpickr(){
724
			wp_enqueue_style( 'flatpickr' );
725
			wp_enqueue_script( 'flatpickr' );
726
		}
727
728
		/**
729
		 * Enqueue iconpicker if called.
730
		 */
731
		public function enqueue_iconpicker(){
732
			wp_enqueue_style( 'iconpicker' );
733
			wp_enqueue_script( 'iconpicker' );
734
		}
735
736
        /**
737
         * Get the url path to the current folder.
738
         *
739
         * This can be called very early, hence the need for the dynamic way of getting the URL.
740
         *
741
         * @since 0.2.31 changed to support edge cases like bitnami containers.
742
         * @return string
743
         */
744
        public function get_url() {
745
            $content_dir = wp_normalize_path( untrailingslashit( WP_CONTENT_DIR ) );
746
            $content_url = untrailingslashit( WP_CONTENT_URL );
747
748
            // maybe Replace http:// to https://.
749
            if ( strpos( $content_url, 'http://' ) === 0 && strpos( plugins_url(), 'https://' ) === 0 ) {
750
                $content_url = str_replace( 'http://', 'https://', $content_url );
751
            }
752
753
            // First find where in the path our content directory starts
754
            $content_basename = basename($content_dir);
755
            $file_dir = str_replace( "/includes", "", wp_normalize_path( dirname( __FILE__ ) ) );
756
757
            // Find the relative path by matching from content directory name
758
            $after_content = substr($file_dir, strpos($file_dir, '/' . $content_basename . '/') + strlen('/' . $content_basename . '/'));
759
760
            // Build URL using WP_CONTENT_URL and the relative path
761
            $url = trailingslashit($content_url) . $after_content;
762
763
            // some hosts end up with /wp-content/wp-content/
764
            $url = str_replace( '/wp-content/wp-content/', '/wp-content/', $url );
765
766
            return trailingslashit($url);
767
        }
768
769
		/**
770
		 * Get the url path to the current folder.
771
		 * @todo remove
772
		 * @return string
773
		 */
774
		public function get_url_old() {
775
776
			$url = '';
777
			// check if we are inside a plugin
778
			$file_dir = str_replace( "/includes","", wp_normalize_path( dirname( __FILE__ ) ) );
779
780
			// add check in-case user has changed wp-content dir name.
781
			$wp_content_folder_name = basename(WP_CONTENT_DIR);
782
			$dir_parts = explode("/$wp_content_folder_name/",$file_dir);
783
			$url_parts = explode("/$wp_content_folder_name/",plugins_url());
784
785
			if(!empty($url_parts[0]) && !empty($dir_parts[1])){
786
				$url = trailingslashit( $url_parts[0]."/$wp_content_folder_name/".$dir_parts[1] );
787
			}
788
789
			return $url;
790
		}
791
792
		/**
793
		 * Register the database settings with WordPress.
794
		 */
795
		public function register_settings() {
796
			register_setting( 'ayecode-ui-settings', 'ayecode-ui-settings' );
797
		}
798
799
		/**
800
		 * Add the WordPress settings menu item.
801
		 * @since 1.0.10 Calling function name direct will fail theme check so we don't.
802
		 */
803
		public function menu_item() {
804
			$menu_function = 'add' . '_' . 'options' . '_' . 'page'; // won't pass theme check if function name present in theme
805
			call_user_func( $menu_function, $this->name, $this->name, 'manage_options', 'ayecode-ui-settings', array(
806
				$this,
807
				'settings_page'
808
			) );
809
		}
810
811
		/**
812
		 * Get a list of themes and their default JS settings.
813
		 *
814
		 * @return array
815
		 */
816
		public function theme_js_settings(){
817
			return array(
818
				'ayetheme' => 'popper',
819
				'listimia' => 'required',
820
				'listimia_backend' => 'core-popper',
821
				//'avada'    => 'required', // removed as we now add compatibility
822
			);
823
		}
824
825
		/**
826
         * Get the date the site was installed.
827
         *
828
		 * @return false|string
829
		 */
830
        public function get_site_install_date() {
831
	        global $wpdb; // This gives you access to the WordPress database object
832
833
	        // Prepare the SQL query to get the oldest registration date
834
	        $query = "SELECT MIN(user_registered) AS oldest_registration_date FROM {$wpdb->users}";
835
836
	        // Execute the query
837
	        $date = $wpdb->get_var( $query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
838
839
	        return $date ? $date : false;
840
        }
841
842
		/**
843
		 * Show admin notice if backend scripts not loaded.
844
		 */
845
		public function show_admin_version_notice(){
846
			$fix_url = admin_url("options-general.php?page=ayecode-ui-settings" );
847
			$button = '<a href="'.esc_url($fix_url).'" class="button-primary">View Settings</a>';
848
			$message = __( '<b>Style Issue:</b> AyeCode UI has changed its default version from v4 to v5, if you notice unwanted style changes, please revert to v4 (saving the settings page will remove this notice)')." " .$button;
849
			echo '<div class="notice notice-error aui-settings-error-notice"><p>'. wp_kses_post( $message ).'</p></div>';
850
		}
851
852
		/**
853
		 * Get the current Font Awesome output settings.
854
		 *
855
		 * @return array The array of settings.
856
		 */
857
		public function get_settings() {
858
			$db_settings = get_option( 'ayecode-ui-settings' );
859
860
			// Maybe show default version notice
861
			if ( empty( $db_settings ) ) {
862
				$site_install_date = new DateTime( self::get_site_install_date() );
0 ignored issues
show
It seems like self::get_site_install_date() can also be of type false; however, parameter $datetime of DateTime::__construct() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

862
				$site_install_date = new DateTime( /** @scrutinizer ignore-type */ self::get_site_install_date() );
Loading history...
Bug Best Practice introduced by
The method AyeCode_UI_Settings::get_site_install_date() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

862
				$site_install_date = new DateTime( self::/** @scrutinizer ignore-call */ get_site_install_date() );
Loading history...
863
				$switch_over_date = new DateTime( "2024-02-01" );
864
865
				if ( $site_install_date < $switch_over_date ) {
866
					add_action( 'admin_notices', array( $this, 'show_admin_version_notice' ) );
867
				}
868
			}
869
870
			$js_default = 'core-popper';
871
			$js_default_backend = $js_default;
872
873
			// maybe set defaults (if no settings set)
874
			if(empty($db_settings)){
875
				$active_theme = strtolower( get_template() ); // active parent theme.
876
				$theme_js_settings = self::theme_js_settings();
0 ignored issues
show
Bug Best Practice introduced by
The method AyeCode_UI_Settings::theme_js_settings() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

876
				/** @scrutinizer ignore-call */ 
877
    $theme_js_settings = self::theme_js_settings();
Loading history...
877
				if(isset($theme_js_settings[$active_theme])){
878
					$js_default = $theme_js_settings[$active_theme];
879
					$js_default_backend = isset($theme_js_settings[$active_theme."_backend"]) ? $theme_js_settings[$active_theme."_backend"] : $js_default;
880
				}
881
			}
882
883
			/**
884
			 * Filter the default settings.
885
			 */
886
			$defaults = apply_filters( 'ayecode-ui-default-settings', array(
887
				'css'            => 'compatibility', // core, compatibility
888
				'js'             => $js_default, // js to load, core-popper, popper
889
				'html_font_size' => '16', // js to load, core-popper, popper
890
				'css_backend'    => 'compatibility', // core, compatibility
891
				'js_backend'     => $js_default_backend, // js to load, core-popper, popper
892
				'disable_admin'  => '', // URL snippets to disable loading on admin
893
                'bs_ver'         => '5', // The default bootstrap version to sue by default
894
			), $db_settings );
895
896
			$settings = wp_parse_args( $db_settings, $defaults );
897
898
			/**
899
			 * Filter the Bootstrap settings.
900
			 *
901
			 * @todo if we add this filer people might use it and then it defeats the purpose of this class :/
902
			 */
903
			return $this->settings = apply_filters( 'ayecode-ui-settings', $settings, $db_settings, $defaults );
904
		}
905
906
907
		/**
908
		 * The settings page html output.
909
		 */
910
		public function settings_page() {
911
			if ( ! current_user_can( 'manage_options' ) ) {
912
				wp_die( esc_attr__( 'You do not have sufficient permissions to access this page.', 'ayecode-connect' ) );
913
			}
914
            $overrides = apply_filters( 'ayecode-ui-settings', array(), array(), array() );
915
916
			?>
917
            <div class="wrap">
918
                <h1><?php echo esc_attr( $this->name ); ?></h1>
919
                <p><?php echo esc_html( apply_filters( 'ayecode-ui-settings-message', __("Here you can adjust settings if you are having compatibility issues.", 'ayecode-connect' ) ) );?></p>
920
                <form method="post" action="options.php">
921
					<?php
922
					settings_fields( 'ayecode-ui-settings' );
923
					do_settings_sections( 'ayecode-ui-settings' );
924
					?>
925
926
                    <h2><?php esc_html_e( 'BootStrap Version', 'ayecode-connect' ); ?></h2>
927
                    <p><?php echo esc_html( apply_filters( 'ayecode-ui-version-settings-message', __("V5 is recommended, however if you have another plugin installed using v4, you may need to use v4 also.", 'ayecode-connect' ) ) );?></p>
928
	                <div class="bsui"><?php
929
	                if ( ! empty( $overrides ) ) {
930
		                echo aui()->alert(array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
931
			                'type'=> 'info',
932
			                'content'=> esc_attr__("Some options are disabled as your current theme is overriding them.", 'ayecode-connect' )
933
		                ));
934
	                }
935
	                ?>
936
                    </div>
937
                    <table class="form-table wpbs-table-version-settings">
938
                        <tr valign="top">
939
                            <th scope="row"><label for="wpbs-css"><?php esc_html_e( 'Version', 'ayecode-connect' ); ?></label></th>
940
                            <td>
941
                                <select name="ayecode-ui-settings[bs_ver]" id="wpbs-css" <?php echo !empty($overrides['bs_ver']) ? 'disabled' : ''; ?>>
942
                                    <option	value="5" <?php selected( $this->settings['bs_ver'], '5' ); ?>><?php esc_html_e( 'v5 (recommended)', 'ayecode-connect' ); ?></option>
943
                                    <option value="4" <?php selected( $this->settings['bs_ver'], '4' ); ?>><?php esc_html_e( 'v4 (legacy)', 'ayecode-connect' ); ?></option>
944
                                </select>
945
                            </td>
946
                        </tr>
947
                    </table>
948
949
                    <h2><?php esc_html_e( 'Frontend', 'ayecode-connect' ); ?></h2>
950
                    <table class="form-table wpbs-table-settings">
951
                        <tr valign="top">
952
                            <th scope="row"><label for="wpbs-css"><?php esc_html_e( 'Load CSS', 'ayecode-connect' ); ?></label></th>
953
                            <td>
954
                                <select name="ayecode-ui-settings[css]" id="wpbs-css" <?php echo !empty($overrides['css']) ? 'disabled' : ''; ?>>
955
                                    <option	value="compatibility" <?php selected( $this->settings['css'], 'compatibility' ); ?>><?php esc_html_e( 'Compatibility Mode (default)', 'ayecode-connect' ); ?></option>
956
                                    <option value="core" <?php selected( $this->settings['css'], 'core' ); ?>><?php esc_html_e( 'Full Mode', 'ayecode-connect' ); ?></option>
957
                                    <option	value="" <?php selected( $this->settings['css'], '' ); ?>><?php esc_html_e( 'Disabled', 'ayecode-connect' ); ?></option>
958
                                </select>
959
                            </td>
960
                        </tr>
961
962
                        <tr valign="top">
963
                            <th scope="row"><label for="wpbs-js"><?php esc_html_e( 'Load JS', 'ayecode-connect' ); ?></label></th>
964
                            <td>
965
                                <select name="ayecode-ui-settings[js]" id="wpbs-js" <?php echo !empty($overrides['js']) ? 'disabled' : ''; ?>>
966
                                    <option	value="core-popper" <?php selected( $this->settings['js'], 'core-popper' ); ?>><?php esc_html_e( 'Core + Popper (default)', 'ayecode-connect' ); ?></option>
967
                                    <option value="popper" <?php selected( $this->settings['js'], 'popper' ); ?>><?php esc_html_e( 'Popper', 'ayecode-connect' ); ?></option>
968
                                    <option value="required" <?php selected( $this->settings['js'], 'required' ); ?>><?php esc_html_e( 'Required functions only', 'ayecode-connect' ); ?></option>
969
                                    <option	value="" <?php selected( $this->settings['js'], '' ); ?>><?php esc_html_e( 'Disabled (not recommended)', 'ayecode-connect' ); ?></option>
970
                                </select>
971
                            </td>
972
                        </tr>
973
974
                        <tr valign="top">
975
                            <th scope="row"><label for="wpbs-font_size"><?php esc_html_e( 'HTML Font Size (px)', 'ayecode-connect' ); ?></label></th>
976
                            <td>
977
                                <input type="number" name="ayecode-ui-settings[html_font_size]" id="wpbs-font_size" value="<?php echo absint( $this->settings['html_font_size']); ?>" placeholder="16" <?php echo !empty($overrides['html_font_size']) ? 'disabled' : ''; ?> />
978
                                <p class="description" ><?php esc_html_e("Our font sizing is rem (responsive based) here you can set the html font size in-case your theme is setting it too low.", 'ayecode-connect' );?></p>
979
                            </td>
980
                        </tr>
981
982
                    </table>
983
984
                    <h2><?php esc_html_e( 'Backend', 'ayecode-connect' ); ?> (wp-admin)</h2>
985
                    <table class="form-table wpbs-table-settings">
986
                        <tr valign="top">
987
                            <th scope="row"><label for="wpbs-css-admin"><?php esc_html_e( 'Load CSS', 'ayecode-connect' ); ?></label></th>
988
                            <td>
989
                                <select name="ayecode-ui-settings[css_backend]" id="wpbs-css-admin" <?php echo !empty($overrides['css_backend']) ? 'disabled' : ''; ?>>
990
                                    <option	value="compatibility" <?php selected( $this->settings['css_backend'], 'compatibility' ); ?>><?php esc_html_e( 'Compatibility Mode (default)', 'ayecode-connect' ); ?></option>
991
                                    <option value="core" <?php selected( $this->settings['css_backend'], 'core' ); ?>><?php esc_html_e( 'Full Mode (will cause style issues)', 'ayecode-connect' ); ?></option>
992
                                    <option	value="" <?php selected( $this->settings['css_backend'], '' ); ?>><?php esc_html_e( 'Disabled', 'ayecode-connect' ); ?></option>
993
                                </select>
994
                            </td>
995
                        </tr>
996
997
                        <tr valign="top">
998
                            <th scope="row"><label for="wpbs-js-admin"><?php esc_html_e( 'Load JS', 'ayecode-connect' ); ?></label></th>
999
                            <td>
1000
                                <select name="ayecode-ui-settings[js_backend]" id="wpbs-js-admin" <?php echo !empty($overrides['js_backend']) ? 'disabled' : ''; ?>>
1001
                                    <option	value="core-popper" <?php selected( $this->settings['js_backend'], 'core-popper' ); ?>><?php esc_html_e( 'Core + Popper (default)', 'ayecode-connect' ); ?></option>
1002
                                    <option value="popper" <?php selected( $this->settings['js_backend'], 'popper' ); ?>><?php esc_html_e( 'Popper', 'ayecode-connect' ); ?></option>
1003
                                    <option value="required" <?php selected( $this->settings['js_backend'], 'required' ); ?>><?php esc_html_e( 'Required functions only', 'ayecode-connect' ); ?></option>
1004
                                    <option	value="" <?php selected( $this->settings['js_backend'], '' ); ?>><?php esc_html_e( 'Disabled (not recommended)', 'ayecode-connect' ); ?></option>
1005
                                </select>
1006
                            </td>
1007
                        </tr>
1008
1009
                        <tr valign="top">
1010
                            <th scope="row"><label for="wpbs-disable-admin"><?php esc_html_e( 'Disable load on URL', 'ayecode-connect' ); ?></label></th>
1011
                            <td>
1012
                                <p><?php esc_html_e( 'If you have backend conflict you can enter a partial URL argument that will disable the loading of AUI on those pages. Add each argument on a new line.', 'ayecode-connect' ); ?></p>
1013
                                <textarea name="ayecode-ui-settings[disable_admin]" rows="10" cols="50" id="wpbs-disable-admin" class="large-text code" spellcheck="false" placeholder="myplugin.php &#10;action=go"><?php echo esc_textarea( $this->settings['disable_admin'] );?></textarea>
1014
                            </td>
1015
                        </tr>
1016
                    </table>
1017
1018
					<?php
1019
					submit_button();
1020
					?>
1021
                </form>
1022
                <div id="wpbs-version" data-aui-source="<?php echo esc_attr( $this->get_load_source() ); ?>"><?php echo esc_html( $this->version ); ?></div>
1023
            </div>
1024
			<?php
1025
		}
1026
1027
        public function get_load_source(){
1028
	        $file = str_replace( array( "/", "\\" ), "/", realpath( __FILE__ ) );
1029
	        $plugins_dir = str_replace( array( "/", "\\" ), "/", realpath( WP_PLUGIN_DIR ) );
1030
1031
	        // Find source plugin/theme of SD
1032
	        $source = array();
1033
	        if ( strpos( $file, $plugins_dir ) !== false ) {
1034
		        $source = explode( "/", plugin_basename( $file ) );
1035
	        } else if ( function_exists( 'get_theme_root' ) ) {
1036
		        $themes_dir = str_replace( array( "/", "\\" ), "/", realpath( get_theme_root() ) );
1037
1038
		        if ( strpos( $file, $themes_dir ) !== false ) {
1039
			        $source = explode( "/", ltrim( str_replace( $themes_dir, "", $file ), "/" ) );
1040
		        }
1041
	        }
1042
1043
            return isset($source[0]) ? esc_attr($source[0]) : '';
1044
        }
1045
1046
		public function customizer_settings($wp_customize){
1047
			$wp_customize->add_section('aui_settings', array(
1048
				'title'    => __('AyeCode UI', 'ayecode-connect' ),
1049
				'priority' => 120,
1050
			));
1051
1052
			//  =============================
1053
			//  = Color Picker              =
1054
			//  =============================
1055
			$wp_customize->add_setting('aui_options[color_primary]', array(
1056
				'default'           => AUI_PRIMARY_COLOR,
1057
				'sanitize_callback' => 'sanitize_hex_color',
1058
				'capability'        => 'edit_theme_options',
1059
				'type'              => 'option',
1060
				'transport'         => 'refresh',
1061
			));
1062
			$wp_customize->add_control( new WP_Customize_Color_Control($wp_customize, 'color_primary', array(
1063
				'label'    => __('Primary Color', 'ayecode-connect' ),
1064
				'section'  => 'aui_settings',
1065
				'settings' => 'aui_options[color_primary]',
1066
			)));
1067
1068
			$wp_customize->add_setting('aui_options[color_secondary]', array(
1069
				'default'           => '#6c757d',
1070
				'sanitize_callback' => 'sanitize_hex_color',
1071
				'capability'        => 'edit_theme_options',
1072
				'type'              => 'option',
1073
				'transport'         => 'refresh',
1074
			));
1075
			$wp_customize->add_control( new WP_Customize_Color_Control($wp_customize, 'color_secondary', array(
1076
				'label'    => __('Secondary Color', 'ayecode-connect' ),
1077
				'section'  => 'aui_settings',
1078
				'settings' => 'aui_options[color_secondary]',
1079
			)));
1080
		}
1081
1082
		/**
1083
		 * CSS to help with conflict issues with other plugins and themes using bootstrap v3.
1084
		 *
1085
		 * @return mixed
1086
		 */
1087
		public static function bs3_compat_css() {
1088
			ob_start();
1089
			?>
1090
            <style>
1091
                /* Bootstrap 3 compatibility */
1092
                body.modal-open .modal-backdrop.show:not(.in) {opacity:0.5;}
1093
                body.modal-open .modal.show:not(.in)  {opacity:1;z-index: 99999}
1094
                body.modal-open .modal.show:not(.in) .modal-content  {box-shadow: none;}
1095
                body.modal-open .modal.show:not(.in)  .modal-dialog {transform: initial;}
1096
1097
                body.modal-open .modal.bsui .modal-dialog{left: auto;}
1098
1099
                .collapse.show:not(.in){display: inherit;}
1100
                .fade.show{opacity: 1;}
1101
1102
                <?php if( defined( 'SVQ_THEME_VERSION' ) ){ ?>
1103
                /* KLEO theme specific */
1104
                .kleo-main-header .navbar-collapse.collapse.show:not(.in){display: block !important;}
1105
                <?php } ?>
1106
1107
                <?php if( defined( 'FUSION_BUILDER_VERSION' ) ){ ?>
1108
                /* With Avada builder */
1109
                body.modal-open .modal.in  {opacity:1;z-index: 99999}
1110
                body.modal-open .modal.bsui.in .modal-content  {box-shadow: none;}
1111
                .bsui .collapse.in{display: inherit;}
1112
                .bsui .collapse.in.row.show{display: flex;}
1113
                .bsui .collapse.in.row:not(.show){display: none;}
1114
1115
                <?php } ?>
1116
            </style>
1117
			<?php
1118
			return str_replace( array(
1119
				'<style>',
1120
				'</style>'
1121
			), '', self::minify_css( ob_get_clean() ) );
1122
		}
1123
1124
		public static function custom_css( $compatibility = true, $is_fse = false ) {
1125
			global $aui_bs5;
1126
1127
			$colors = array();
1128
1129
			if ( defined( 'BLOCKSTRAP_VERSION' ) ) {
1130
				$setting = wp_get_global_settings();
1131
1132
				if ( ! empty( $setting['color']['palette']['theme'] ) ) {
1133
					foreach ( $setting['color']['palette']['theme'] as $color ) {
1134
						$colors[$color['slug']] = esc_attr( $color['color'] );
1135
					}
1136
				}
1137
1138
				if ( ! empty( $setting['color']['palette']['custom'] ) ) {
1139
					foreach ( $setting['color']['palette']['custom'] as $color ) {
1140
						$colors[$color['slug']] = esc_attr( $color['color'] );
1141
					}
1142
				}
1143
			} else {
1144
				$settings = get_option( 'aui_options' );
1145
1146
				$colors = array(
1147
					'primary'   => ! empty( $settings['color_primary'] ) ? $settings['color_primary'] : AUI_PRIMARY_COLOR,
1148
					'secondary' => ! empty( $settings['color_secondary'] ) ? $settings['color_secondary'] : AUI_SECONDARY_COLOR
1149
				);
1150
			}
1151
1152
			ob_start();
1153
			?><style><?php
1154
			// BS v3 compat
1155
			if( self::is_bs3_compat() ){
1156
				echo self::bs3_compat_css(); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1157
			}
1158
1159
			//$is_fse = false;
1160
			//if ( is_admin() && ( !empty($_REQUEST['postType']) || self::is_block_editor() ) && ( defined( 'BLOCKSTRAP_VERSION' ) || defined( 'AUI_FSE' ) )  ) {
1161
				//$is_fse = true;
1162
			//}
1163
1164
			$custom_front = ! is_admin() ? true : apply_filters('ayecode_ui_custom_front', false );
1165
			$custom_admin = $is_fse || self::is_preview() ? true : apply_filters('ayecode_ui_custom_admin', false );
1166
            $bs_custom_css = apply_filters( 'ayecode_ui_bs_custom_css', $custom_admin || $custom_front );
1167
			//$bs_custom_css = true; // Force true to fix any color issue.
1168
1169
			$colors_css = '';
1170
			if ( ! empty( $colors ) && $bs_custom_css ) {
1171
				$d_colors = self::get_colors(true);
1172
1173
				foreach ( $colors as $key => $color ) {
1174
					if ( ( empty( $d_colors[$key]) || $d_colors[$key] != $color) || $is_fse ) {
1175
						$var = $is_fse ? "var(--wp--preset--color--$key)" : $color;
1176
						$compat = $is_fse ? '.editor-styles-wrapper' : $compatibility;
1177
1178
						$colors_css .= $aui_bs5 ? self::css_overwrite_bs5( $key,$var, $compat, $color ) : self::css_overwrite( $key, $var, $compat, $color );
1179
					}
1180
				}
1181
			}
1182
1183
			if ( $colors_css ) {
1184
				echo $colors_css; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1185
			}
1186
1187
			// Set admin bar z-index lower when modal is open.
1188
			echo ' body.modal-open #wpadminbar{z-index:999}.embed-responsive-16by9 .fluid-width-video-wrapper{padding:0 !important;position:initial}';
1189
1190
			if ( is_admin() ) {
1191
				echo ' body.modal-open #adminmenuwrap{z-index:999} body.modal-open #wpadminbar{z-index:1025}';
1192
			}
1193
1194
			$custom_css = '';
1195
1196
			if ( $aui_bs5 && defined( 'BLOCKSTRAP_VERSION' ) && $bs_custom_css ) {
1197
				$css = '';
1198
				$theme_settings = wp_get_global_styles();
1199
1200
				// Font face
1201
				if( !empty( $theme_settings['typography']['fontFamily'] ) ){
1202
					$t_fontface = str_replace( array('var:preset|','font-family|'), array('--wp--preset--','font-family--'), $theme_settings['typography']['fontFamily']  ); //var(--wp--preset--font-family--poppins)
1203
					$css .= '--bs-body-font-family: ' . esc_attr($t_fontface) . ';';
1204
				}
1205
1206
				// font size
1207
				if( !empty( $theme_settings['typography']['fontSize'] ) ){
1208
					$css .= '--bs-body-font-size: ' . esc_attr( $theme_settings['typography']['fontSize'] ) . ' ;';
1209
				}
1210
1211
				// line height
1212
				 if( !empty( $theme_settings['typography']['lineHeight'] ) ){
1213
					$css .= '--bs-body-line-height: ' . esc_attr( $theme_settings['typography']['lineHeight'] ) . ';';
1214
				}
1215
1216
1217
				   // font weight
1218
				 if( !empty( $theme_settings['typography']['fontWeight'] ) ){
1219
					$css .= '--bs-body-font-weight: ' . esc_attr( $theme_settings['typography']['fontWeight'] ) . ';';
1220
				}
1221
1222
				// Background
1223
				 if( !empty( $theme_settings['color']['background'] ) ){
1224
					$css .= '--bs-body-bg: ' . esc_attr( $theme_settings['color']['background'] ) . ';';
1225
				}
1226
1227
				 // Background Gradient
1228
				 if( !empty( $theme_settings['color']['gradient'] ) ){
1229
					$css .= 'background: ' . esc_attr( $theme_settings['color']['gradient'] ) . ';';
1230
				}
1231
1232
				   // Background Gradient
1233
				 if( !empty( $theme_settings['color']['gradient'] ) ){
1234
					$css .= 'background: ' . esc_attr( $theme_settings['color']['gradient'] ) . ';';
1235
				}
1236
1237
				// text color
1238
				if( !empty( $theme_settings['color']['text'] ) ){
1239
					$css .= '--bs-body-color: ' . esc_attr( $theme_settings['color']['text'] ) . ';';
1240
				}
1241
1242
1243
				// link colors
1244
				if( !empty( $theme_settings['elements']['link']['color']['text'] ) ){
1245
					$css .= '--bs-link-color: ' . esc_attr( $theme_settings['elements']['link']['color']['text'] ) . ';';
1246
				}
1247
				if( !empty( $theme_settings['elements']['link'][':hover']['color']['text'] ) ){
1248
					$css .= '--bs-link-hover-color: ' . esc_attr( $theme_settings['elements']['link'][':hover']['color']['text'] ) . ';';
1249
				}
1250
1251
				if($css){
1252
					$custom_css .= $is_fse ? 'body.editor-styles-wrapper{' . esc_attr( $css ) . '}' : 'body{' . esc_attr( $css ) . '}';
1253
				}
1254
1255
				$bep = $is_fse ? 'body.editor-styles-wrapper ' : '';
1256
1257
				// Headings
1258
				$headings_css = '';
1259
				if( !empty( $theme_settings['elements']['heading']['color']['text'] ) ){
1260
					$headings_css .= "color: " . esc_attr( $theme_settings['elements']['heading']['color']['text'] ) . ";";
1261
				}
1262
1263
				// heading background
1264
				if( !empty( $theme_settings['elements']['heading']['color']['background'] ) ){
1265
					$headings_css .= 'background: ' . esc_attr( $theme_settings['elements']['heading']['color']['background'] ) . ';';
1266
				}
1267
1268
				 // heading font family
1269
				if( !empty( $theme_settings['elements']['heading']['typography']['fontFamily'] ) ){
1270
					$headings_css .= 'font-family: ' . esc_attr( $theme_settings['elements']['heading']['typography']['fontFamily']  ) . ';';
1271
				}
1272
1273
				if( $headings_css ){
1274
					$custom_css .= "$bep h1,$bep h2,$bep h3, $bep h4,$bep h5,$bep h6{ " . esc_attr( $headings_css ) . "}";
1275
				}
1276
1277
				$hs = array('h1','h2','h3','h4','h5','h6');
1278
1279
				foreach($hs as $hn){
1280
					$h_css = '';
1281
					 if( !empty( $theme_settings['elements'][$hn]['color']['text'] ) ){
1282
						$h_css .= 'color: ' . esc_attr( $theme_settings['elements'][$hn]['color']['text'] ) . ';';
1283
					 }
1284
1285
					  if( !empty( $theme_settings['elements'][$hn]['typography']['fontSize'] ) ){
1286
						$h_css .= 'font-size: ' . esc_attr( $theme_settings['elements'][$hn]['typography']['fontSize']  ) . ';';
1287
					 }
1288
1289
					  if( !empty( $theme_settings['elements'][$hn]['typography']['fontFamily'] ) ){
1290
						$h_css .= 'font-family: ' . esc_attr( $theme_settings['elements'][$hn]['typography']['fontFamily']  ) . ';';
1291
					 }
1292
1293
					 if($h_css){
1294
						$custom_css .= esc_attr( $bep  . $hn ) . '{'.esc_attr( $h_css ).'}';
1295
					 }
1296
				}
1297
			}
1298
			
1299
			if ( $custom_css ) {
1300
				echo $custom_css; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1301
			}
1302
1303
			// Pagination on Hello Elementor theme.
1304
			if ( function_exists( 'hello_elementor_setup' ) ) {
1305
				echo '.aui-nav-links .pagination{justify-content:inherit}';
1306
			}
1307
1308
            // Astra theme - when woocommerce active they add compatibility CSS which breaks select2 in modals
1309
            if( defined('ASTRA_THEME_VERSION')){
1310
                echo '.woocommerce-js.modal-open .select2-container .select2-dropdown, .woocommerce-js.modal-open .select2-container .select2-search__field, .woocommerce-page.modal-open .select2-container .select2-dropdown, .woocommerce-page.modal-open .select2-container .select2-search__field{z-index: 1056;}';
1311
            }
1312
1313
			?></style><?php
1314
			$custom_css = ob_get_clean();
1315
1316
			/*
1317
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1318
			 */
1319
			return str_replace( array(
1320
				'<style>',
1321
				'</style>'
1322
			), '', self::minify_css( $custom_css ) );
1323
		}
1324
1325
		/**
1326
		 * Check if we should add booststrap 3 compatibility changes.
1327
		 *
1328
		 * @return bool
1329
		 */
1330
		public static function is_bs3_compat(){
1331
			return defined('AYECODE_UI_BS3_COMPAT') || defined('SVQ_THEME_VERSION') || defined('FUSION_BUILDER_VERSION');
1332
		}
1333
1334
		public static function hex_to_rgb( $hex ) {
1335
			// Remove '#' if present
1336
			$hex = str_replace( '#', '', $hex );
1337
1338
			// Check if input is RGB
1339
			if ( strpos( $hex, 'rgba(' ) === 0 || strpos( $hex, 'rgb(' ) === 0 ) {
1340
				$_rgb = explode( ',', str_replace( array( 'rgba(', 'rgb(', ')' ), '', $hex ) );
1341
1342
				$rgb = ( isset( $_rgb[0] ) ? (int) trim( $_rgb[0] ) : '0' ) . ',';
1343
				$rgb .= ( isset( $_rgb[1] ) ? (int) trim( $_rgb[1] ) : '0' ) . ',';
1344
				$rgb .= ( isset( $_rgb[2] ) ? (int) trim( $_rgb[2] ) : '0' );
1345
1346
				return $rgb;
1347
			}
1348
1349
			// Convert 3-digit hex to 6-digit hex
1350
			if ( strlen( $hex ) == 3 ) {
1351
				$hex = str_repeat( substr( $hex, 0, 1 ), 2 ) . str_repeat( substr( $hex, 1, 1 ), 2 ) . str_repeat( substr( $hex, 2, 1 ), 2 );
1352
			}
1353
1354
			// Convert hex to RGB
1355
			$r = hexdec( substr( $hex, 0, 2 ) );
1356
			$g = hexdec( substr( $hex, 2, 2 ) );
1357
			$b = hexdec( substr( $hex, 4, 2 ) );
1358
1359
			// Return RGB values as an array
1360
			return $r . ',' . $g . ',' . $b;
1361
		}
1362
1363
		/**
1364
		 * Build the CSS to overwrite a bootstrap color variable.
1365
		 *
1366
		 * @param $type
1367
		 * @param $color_code
1368
		 * @param $compatibility
1369
		 *
1370
		 * @return string
1371
		 */
1372
		public static function css_overwrite_bs5($type,$color_code,$compatibility, $hex = '' ){
1373
			global $aui_bs5;
1374
1375
			$is_var = false;
1376
			$is_custom = strpos($type, 'custom-') !== false ? true : false;
1377
			if(!$color_code){return '';}
1378
			if(strpos($color_code, 'var') !== false){
1379
				//if(!sanitize_hex_color($color_code)){
1380
				$color_code = esc_attr($color_code);
1381
				$is_var = true;
1382
//				$color_code = "rgba($color_code, 0.5)";
1383
//                echo '###1'.$color_code.'###';//exit;
1384
			}
1385
1386
//            echo '@@@'.$color_code.'==='.self::hex_to_rgb($color_code);exit;
1387
1388
			if(!$color_code){return '';}
1389
1390
			$rgb = self::hex_to_rgb($hex);
1391
1392
			if($compatibility===true || $compatibility===1){
1393
				$compatibility = '.bsui';
1394
			}elseif(!$compatibility){
1395
				$compatibility = '';
1396
			}else{
1397
				$compatibility = esc_attr($compatibility);
1398
			}
1399
1400
			$prefix = $compatibility ? $compatibility . " " : "";
1401
1402
1403
            $output = '';
1404
1405
//            echo '####'.$color_code;exit;
1406
1407
			$type = sanitize_html_class($type);
1408
1409
			/**
1410
			 * c = color, b = background color, o = border-color, f = fill
1411
			 */
1412
			$selectors = array(
1413
				".btn-{$type}"                                              => array( 'b', 'o' ),
1414
				".btn-{$type}.disabled"                                     => array( 'b', 'o' ),
1415
				".btn-{$type}:disabled"                                     => array( 'b', 'o' ),
1416
				".btn-outline-{$type}"                                      => array( 'c', 'o' ),
1417
				".btn-outline-{$type}:hover"                                => array( 'b', 'o' ),
1418
				".btn-outline-{$type}:not(:disabled):not(.disabled).active" => array( 'b', 'o' ),
1419
				".btn-outline-{$type}:not(:disabled):not(.disabled):active" => array( 'b', 'o' ),
1420
				".show>.btn-outline-{$type}.dropdown-toggle"                => array( 'b', 'o' ),
1421
				".badge-{$type}"                                            => array( 'b' ),
1422
				".alert-{$type}"                                            => array( 'b', 'o' ),
1423
				".bg-{$type}"                                               => array( 'b', 'f' ),
1424
				".btn-link.btn-{$type}"                                     => array( 'c' ),
1425
				".text-{$type}"                                     => array( 'c' ),
1426
			);
1427
1428
			if ( $aui_bs5 ) {
1429
				unset($selectors[".alert-{$type}" ]);
1430
			}
1431
1432
			if ( $type == 'primary' ) {
1433
				$selectors = $selectors + array(
1434
						'a'                                                                                                    => array( 'c' ),
1435
						'.btn-link'                                                                                            => array( 'c' ),
1436
						'.dropdown-item.active'                                                                                => array( 'b' ),
1437
						'.custom-control-input:checked~.custom-control-label::before'                                          => array(
1438
							'b',
1439
							'o'
1440
						),
1441
						'.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before'                   => array(
1442
							'b',
1443
							'o'
1444
						),
1445
						'.nav-pills .nav-link.active'                                                                          => array( 'b' ),
1446
						'.nav-pills .show>.nav-link'                                                                           => array( 'b' ),
1447
						'.page-link'                                                                                           => array( 'c' ),
1448
						'.page-item.active .page-link'                                                                         => array(
1449
							'b',
1450
							'o'
1451
						),
1452
						'.progress-bar'                                                                                        => array( 'b' ),
1453
						'.list-group-item.active'                                                                              => array(
1454
							'b',
1455
							'o'
1456
						),
1457
						'.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array( 'b' ),
1458
					);
1459
			}
1460
1461
1462
1463
            // link
1464
			if ( $type === 'primary' ) {
1465
				$output .= 'html body {--bs-link-hover-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .75); --bs-link-color: var(--bs-'.esc_attr($type).'); }';
1466
				$output .= $prefix . ' .breadcrumb{--bs-breadcrumb-item-active-color: '.esc_attr($color_code).';  }';
1467
				$output .= $prefix . ' .navbar { --bs-nav-link-hover-color: '.esc_attr($color_code).'; --bs-navbar-hover-color: '.esc_attr($color_code).'; --bs-navbar-active-color: '.esc_attr($color_code).'; }';
1468
1469
				$output .= $prefix . ' a{color: var(--bs-'.esc_attr($type).');}';
1470
				$output .= $prefix . ' .text-primary{color: var(--bs-'.esc_attr($type).') !important;}';
1471
1472
                // dropdown
1473
				$output .= $prefix . ' .dropdown-menu{--bs-dropdown-link-hover-color: var(--bs-'.esc_attr($type).'); --bs-dropdown-link-active-color: var(--bs-'.esc_attr($type).');}';
1474
1475
                // pagination
1476
				$output .= $prefix . ' .pagination{--bs-pagination-hover-color: var(--bs-'.esc_attr($type).'); --bs-pagination-active-bg: var(--bs-'.esc_attr($type).');}';
1477
1478
			} else if ( $aui_bs5 ) {
1479
				$output .= $prefix . ' .text-' . sanitize_key( $type ) . '{color: var(--bs-' . sanitize_key( $type ) . ') !important;}';
1480
			}
1481
1482
			$output .= $prefix . ' .link-'.esc_attr($type).' {color: var(--bs-'.esc_attr($type).'-rgb) !important;}';
1483
			$output .= $prefix . ' .link-'.esc_attr($type).':hover {color: rgba(var(--bs-'.esc_attr($type).'-rgb), .8) !important;}';
1484
1485
			//  buttons
1486
			$output .= $prefix . ' .btn-'.esc_attr($type).'{';
1487
			$output .= ' 
1488
            --bs-btn-bg: '.esc_attr($color_code).';
1489
            --bs-btn-border-color: '.esc_attr($color_code).';
1490
            --bs-btn-hover-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1491
            --bs-btn-hover-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1492
            --bs-btn-focus-shadow-rgb: --bs-'.esc_attr($type).'-rgb;
1493
            --bs-btn-active-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1494
            --bs-btn-active-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1495
            --bs-btn-active-shadow: unset;
1496
            --bs-btn-disabled-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .5);
1497
            --bs-btn-disabled-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .1);
1498
            ';
1499
//			$output .= '
1500
//		    --bs-btn-color: #fff;
1501
//			--bs-btn-hover-color: #fff;
1502
//			--bs-btn-active-color: #fff;
1503
//			--bs-btn-disabled-color: #fff;
1504
//            ';
1505
			$output .= '}';
1506
1507
			//  buttons outline
1508
			$output .= $prefix . ' .btn-outline-'.esc_attr($type).'{';
1509
			$output .= ' 
1510
			--bs-btn-color: '.esc_attr($color_code).';
1511
            --bs-btn-border-color: '.esc_attr($color_code).';
1512
            --bs-btn-hover-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1513
            --bs-btn-hover-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1514
            --bs-btn-focus-shadow-rgb: --bs-'.esc_attr($type).'-rgb;
1515
            --bs-btn-active-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1516
            --bs-btn-active-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1517
            --bs-btn-active-shadow: unset;
1518
            --bs-btn-disabled-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .5);
1519
            --bs-btn-disabled-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .1);
1520
            ';
1521
//			$output .= '
1522
//		    --bs-btn-color: #fff;
1523
//			--bs-btn-hover-color: #fff;
1524
//			--bs-btn-active-color: #fff;
1525
//			--bs-btn-disabled-color: #fff;
1526
//            ';
1527
			$output .= '}';
1528
1529
            // button hover
1530
			$output .= $prefix . ' .btn-'.esc_attr($type).':hover{';
1531
			$output .= ' 
1532
            box-shadow: 0 0.25rem 0.25rem 0.125rem rgb(var(--bs-'.esc_attr($type).'-rgb), .1), 0 0.375rem 0.75rem -0.125rem rgb(var(--bs-'.esc_attr($type).'-rgb) , .4);
1533
            }
1534
            ';
1535
1536
			if ( $aui_bs5 ) {
1537
				// translucent primary
1538
				if ( $type == 'primary' ) {
1539
					$output .= $prefix . ' .btn-translucent-primary{color:rgb(var(--bs-primary-rgb));}';
1540
					$output .= $prefix . ' .btn-translucent-primary:hover,' . $prefix . ' .btn-translucent-primary:focus,' . $prefix . ' .btn-translucent-primary.focus{background-color: rgb(var(--bs-primary-rgb));}';
1541
				}
1542
1543
//				$output .= $is_var ? 'html body {--bs-'.esc_attr($type).'-rgb: '.$color_code.'; }' : 'html body {--bs-'.esc_attr($type).'-rgb: '.self::hex_to_rgb($color_code).'; }';
1544
				$output .= 'html body {--bs-'.esc_attr($type).': '.esc_attr($color_code).'; }';
1545
				$output .= 'html body {--bs-'.esc_attr($type).'-rgb: '.$rgb.'; }';
1546
			}
1547
1548
1549
			if ( $is_custom ) {
1550
1551
//				echo '###'.$type;exit;
1552
1553
				// build rules into each type
1554
				foreach($selectors as $selector => $types){
1555
					$selector = $compatibility ? $compatibility . " ".$selector : $selector;
1556
					$types = array_combine($types,$types);
1557
					if(isset($types['c'])){$color[] = $selector;}
1558
					if(isset($types['b'])){$background[] = $selector;}
1559
					if(isset($types['o'])){$border[] = $selector;}
1560
					if(isset($types['f'])){$fill[] = $selector;}
1561
				}
1562
1563
//				// build rules into each type
1564
//				foreach($important_selectors as $selector => $types){
1565
//					$selector = $compatibility ? $compatibility . " ".$selector : $selector;
1566
//					$types = array_combine($types,$types);
1567
//					if(isset($types['c'])){$color_i[] = $selector;}
1568
//					if(isset($types['b'])){$background_i[] = $selector;}
1569
//					if(isset($types['o'])){$border_i[] = $selector;}
1570
//					if(isset($types['f'])){$fill_i[] = $selector;}
1571
//				}
1572
1573
				// add any color rules
1574
				if(!empty($color)){
1575
					$output .= implode(",",$color) . "{color: $color_code;} ";
1576
				}
1577
				if(!empty($color_i)){
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $color_i does not exist. Did you maybe mean $color?
Loading history...
1578
					$output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1579
				}
1580
1581
				// add any background color rules
1582
				if(!empty($background)){
1583
					$output .= implode(",",$background) . "{background-color: $color_code;} ";
1584
				}
1585
				if(!empty($background_i)){
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $background_i does not exist. Did you maybe mean $background?
Loading history...
1586
					$output .= $aui_bs5 ? '' : implode(",",$background_i) . "{background-color: $color_code !important;} ";
1587
//				$output .= implode(",",$background_i) . "{background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;} ";
1588
				}
1589
1590
				// add any border color rules
1591
				if(!empty($border)){
1592
					$output .= implode(",",$border) . "{border-color: $color_code;} ";
1593
				}
1594
				if(!empty($border_i)){
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $border_i does not exist. Did you maybe mean $border?
Loading history...
1595
					$output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1596
				}
1597
1598
				// add any fill color rules
1599
				if(!empty($fill)){
1600
					$output .= implode(",",$fill) . "{fill: $color_code;} ";
1601
				}
1602
				if(!empty($fill_i)){
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $fill_i does not exist. Did you maybe mean $fill?
Loading history...
1603
					$output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1604
				}
1605
1606
			}
1607
1608
1609
1610
1611
			$transition = $is_var ? 'transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,filter 0.15s ease-in-out;' : '';
1612
			// darken
1613
			$darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,"-0.075");
0 ignored issues
show
'-0.075' of type string is incompatible with the type double expected by parameter $adjustPercent of AyeCode_UI_Settings::css_hex_lighten_darken(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1613
			$darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,/** @scrutinizer ignore-type */ "-0.075");
Loading history...
1614
			$darker_10 = $is_var ? $color_code.';filter:brightness(0.9)' : self::css_hex_lighten_darken($color_code,"-0.10");
1615
			$darker_125 = $is_var ? $color_code.';filter:brightness(0.875)' : self::css_hex_lighten_darken($color_code,"-0.125");
1616
			$darker_40 = $is_var ? $color_code.';filter:brightness(0.6)' : self::css_hex_lighten_darken($color_code,"-0.4");
0 ignored issues
show
The assignment to $darker_40 is dead and can be removed.
Loading history...
1617
1618
			// lighten
1619
			$lighten_25 = $is_var ? $color_code.';filter:brightness(1.25)' :self::css_hex_lighten_darken($color_code,"0.25");
0 ignored issues
show
The assignment to $lighten_25 is dead and can be removed.
Loading history...
1620
1621
			// opacity see https://css-tricks.com/8-digit-hex-codes/
1622
			$op_25 = $color_code."40"; // 25% opacity
1623
1624
1625
			// button states
1626
			$output .= $is_var ? $prefix ." .btn-{$type}{{$transition }} " : '';
1627
			$output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: ".$darker_075.";    border-color: ".$darker_10.";} ";
1628
//			$output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: #000;    border-color: #000;} ";
1629
			$output .= $prefix ." .btn-outline-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-{$type}.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1630
			$output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active, $prefix .btn-{$type}:not(:disabled):not(.disabled).active, .show>$prefix .btn-{$type}.dropdown-toggle{background-color: ".$darker_10.";    border-color: ".$darker_125.";} ";
1631
            $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-{$type}.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
1632
            $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled):focus {box-shadow: 0 0.25rem 0.25rem 0.125rem rgba(var(--bs-{$type}-rgb), 0.1), 0 0.375rem 0.75rem -0.125rem rgba(var(--bs-{$type}-rgb), 0.4);} ";
1633
1634
			// text
1635
//			$output .= $prefix .".xxx, .text-{$type} {color: var(--bs-".esc_attr($type).");} ";
1636
1637
1638
//			if ( $type == 'primary' ) {
1639
//				// dropdown's
1640
//				$output .= $prefix . " .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
1641
//
1642
//				// input states
1643
//				$output .= $prefix . " .form-control:focus{border-color: " . $lighten_25 . ";box-shadow: 0 0 0 0.2rem $op_25;} ";
1644
//
1645
//				// page link
1646
//				$output .= $prefix . " .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1647
//			}
1648
1649
			// alerts
1650
			if ( $aui_bs5 ) {
1651
//				$output .= $is_var ? '' : $prefix ." .alert-{$type} {background-color: ".$color_code."20;    border-color: ".$color_code."30;color:$darker_40} ";
1652
				$output .= $prefix ." .alert-{$type} {--bs-alert-bg: rgba(var(--bs-{$type}-rgb), .1 ) !important;--bs-alert-border-color: rgba(var(--bs-{$type}-rgb), .25 ) !important;--bs-alert-color: rgba(var(--bs-{$type}-rgb), 1 ) !important;} ";
1653
			}
1654
1655
			return $output;
1656
		}
1657
1658
		/**
1659
		 * Build the CSS to overwrite a bootstrap color variable.
1660
		 *
1661
		 * @param $type
1662
		 * @param $color_code
1663
		 * @param $compatibility
1664
		 *
1665
		 * @return string
1666
		 */
1667
		public static function css_overwrite($type,$color_code,$compatibility, $hex = '' ){
1668
            global $aui_bs5;
1669
1670
			$is_var = false;
1671
			if(!$color_code){return '';}
1672
			if(strpos($color_code, 'var') !== false){
1673
				//if(!sanitize_hex_color($color_code)){
1674
				$color_code = esc_attr($color_code);
1675
				$is_var = true;
1676
//				$color_code = "rgba($color_code, 0.5)";
1677
//                echo '###1'.$color_code.'###';//exit;
1678
			}
1679
1680
//            echo '@@@'.$color_code.'==='.self::hex_to_rgb($color_code);exit;
1681
1682
			if(!$color_code){return '';}
1683
1684
            $rgb = self::hex_to_rgb($hex);
1685
1686
			if($compatibility===true || $compatibility===1){
1687
				$compatibility = '.bsui';
1688
			}elseif(!$compatibility){
1689
				$compatibility = '';
1690
			}else{
1691
				$compatibility = esc_attr($compatibility);
1692
			}
1693
1694
1695
1696
//            echo '####'.$color_code;exit;
1697
1698
			$type = sanitize_html_class($type);
1699
1700
			/**
1701
			 * c = color, b = background color, o = border-color, f = fill
1702
			 */
1703
			$selectors = array(
1704
				".btn-{$type}"                                              => array( 'b', 'o' ),
1705
				".btn-{$type}.disabled"                                     => array( 'b', 'o' ),
1706
				".btn-{$type}:disabled"                                     => array( 'b', 'o' ),
1707
				".btn-outline-{$type}"                                      => array( 'c', 'o' ),
1708
				".btn-outline-{$type}:hover"                                => array( 'b', 'o' ),
1709
				".btn-outline-{$type}:not(:disabled):not(.disabled).active" => array( 'b', 'o' ),
1710
				".btn-outline-{$type}:not(:disabled):not(.disabled):active" => array( 'b', 'o' ),
1711
				".show>.btn-outline-{$type}.dropdown-toggle"                => array( 'b', 'o' ),
1712
				".badge-{$type}"                                            => array( 'b' ),
1713
				".alert-{$type}"                                            => array( 'b', 'o' ),
1714
				".bg-{$type}"                                               => array( 'b', 'f' ),
1715
				".btn-link.btn-{$type}"                                     => array( 'c' ),
1716
			);
1717
1718
			if ( $aui_bs5 ) {
1719
                unset($selectors[".alert-{$type}" ]);
1720
			}
1721
1722
			if ( $type == 'primary' ) {
1723
				$selectors = $selectors + array(
1724
						'a'                                                                                                    => array( 'c' ),
1725
						'.btn-link'                                                                                            => array( 'c' ),
1726
						'.dropdown-item.active'                                                                                => array( 'b' ),
1727
						'.custom-control-input:checked~.custom-control-label::before'                                          => array(
1728
							'b',
1729
							'o'
1730
						),
1731
						'.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before'                   => array(
1732
							'b',
1733
							'o'
1734
						),
1735
						'.nav-pills .nav-link.active'                                                                          => array( 'b' ),
1736
						'.nav-pills .show>.nav-link'                                                                           => array( 'b' ),
1737
						'.page-link'                                                                                           => array( 'c' ),
1738
						'.page-item.active .page-link'                                                                         => array(
1739
							'b',
1740
							'o'
1741
						),
1742
						'.progress-bar'                                                                                        => array( 'b' ),
1743
						'.list-group-item.active'                                                                              => array(
1744
							'b',
1745
							'o'
1746
						),
1747
						'.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array( 'b' ),
1748
//				    '.custom-range::-webkit-slider-thumb' => array('b'), // these break the inline rules...
1749
//				    '.custom-range::-moz-range-thumb' => array('b'),
1750
//				    '.custom-range::-ms-thumb' => array('b'),
1751
					);
1752
			}
1753
1754
			$important_selectors = array(
1755
				".bg-{$type}" => array('b','f'),
1756
				".border-{$type}" => array('o'),
1757
				".text-{$type}" => array('c'),
1758
			);
1759
1760
			$color = array();
1761
			$color_i = array();
1762
			$background = array();
1763
			$background_i = array();
1764
			$border = array();
1765
			$border_i = array();
1766
			$fill = array();
1767
			$fill_i = array();
1768
1769
			$output = '';
1770
1771
			if ( $aui_bs5 ) {
1772
//				$output .= $is_var ? 'html body {--bs-'.esc_attr($type).'-rgb: '.$color_code.'; }' : 'html body {--bs-'.esc_attr($type).'-rgb: '.self::hex_to_rgb($color_code).'; }';
1773
				$output .= 'html body {--bs-'.esc_attr($type).'-rgb: '.$rgb.'; }';
1774
			}
1775
1776
			// build rules into each type
1777
			foreach($selectors as $selector => $types){
1778
				$selector = $compatibility ? $compatibility . " ".$selector : $selector;
1779
				$types = array_combine($types,$types);
1780
				if(isset($types['c'])){$color[] = $selector;}
1781
				if(isset($types['b'])){$background[] = $selector;}
1782
				if(isset($types['o'])){$border[] = $selector;}
1783
				if(isset($types['f'])){$fill[] = $selector;}
1784
			}
1785
1786
			// build rules into each type
1787
			foreach($important_selectors as $selector => $types){
1788
				$selector = $compatibility ? $compatibility . " ".$selector : $selector;
1789
				$types = array_combine($types,$types);
1790
				if(isset($types['c'])){$color_i[] = $selector;}
1791
				if(isset($types['b'])){$background_i[] = $selector;}
1792
				if(isset($types['o'])){$border_i[] = $selector;}
1793
				if(isset($types['f'])){$fill_i[] = $selector;}
1794
			}
1795
1796
			// add any color rules
1797
			if(!empty($color)){
1798
				$output .= implode(",",$color) . "{color: $color_code;} ";
1799
			}
1800
			if(!empty($color_i)){
1801
				$output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1802
			}
1803
1804
			// add any background color rules
1805
			if(!empty($background)){
1806
				$output .= implode(",",$background) . "{background-color: $color_code;} ";
1807
			}
1808
			if(!empty($background_i)){
1809
				$output .= $aui_bs5 ? '' : implode(",",$background_i) . "{background-color: $color_code !important;} ";
1810
//				$output .= implode(",",$background_i) . "{background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;} ";
1811
			}
1812
1813
			// add any border color rules
1814
			if(!empty($border)){
1815
				$output .= implode(",",$border) . "{border-color: $color_code;} ";
1816
			}
1817
			if(!empty($border_i)){
1818
				$output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1819
			}
1820
1821
			// add any fill color rules
1822
			if(!empty($fill)){
1823
				$output .= implode(",",$fill) . "{fill: $color_code;} ";
1824
			}
1825
			if(!empty($fill_i)){
1826
				$output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1827
			}
1828
1829
1830
			$prefix = $compatibility ? $compatibility . " " : "";
1831
1832
			$transition = $is_var ? 'transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,filter 0.15s ease-in-out;' : '';
1833
			// darken
1834
			$darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,"-0.075");
0 ignored issues
show
'-0.075' of type string is incompatible with the type double expected by parameter $adjustPercent of AyeCode_UI_Settings::css_hex_lighten_darken(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1834
			$darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,/** @scrutinizer ignore-type */ "-0.075");
Loading history...
1835
			$darker_10 = $is_var ? $color_code.';filter:brightness(0.9)' : self::css_hex_lighten_darken($color_code,"-0.10");
1836
			$darker_125 = $is_var ? $color_code.';filter:brightness(0.875)' : self::css_hex_lighten_darken($color_code,"-0.125");
1837
			$darker_40 = $is_var ? $color_code.';filter:brightness(0.6)' : self::css_hex_lighten_darken($color_code,"-0.4");
0 ignored issues
show
The assignment to $darker_40 is dead and can be removed.
Loading history...
1838
1839
			// lighten
1840
			$lighten_25 = $is_var ? $color_code.';filter:brightness(1.25)' :self::css_hex_lighten_darken($color_code,"0.25");
1841
1842
			// opacity see https://css-tricks.com/8-digit-hex-codes/
1843
			$op_25 = $color_code."40"; // 25% opacity
1844
1845
1846
			// button states
1847
			$output .= $is_var ? $prefix ." .btn-{$type}{{$transition }} " : '';
1848
			$output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: ".$darker_075.";    border-color: ".$darker_10.";} ";
1849
//			$output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: #000;    border-color: #000;} ";
1850
			$output .= $prefix ." .btn-outline-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-{$type}.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1851
			$output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active, $prefix .btn-{$type}:not(:disabled):not(.disabled).active, .show>$prefix .btn-{$type}.dropdown-toggle{background-color: ".$darker_10.";    border-color: ".$darker_125.";} ";
1852
			$output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-{$type}.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
1853
1854
			if ( $type == 'primary' ) {
1855
				// dropdown's
1856
				$output .= $prefix . " .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
1857
1858
				// input states
1859
				$output .= $prefix . " .form-control:focus{border-color: " . $lighten_25 . ";box-shadow: 0 0 0 0.2rem $op_25;} ";
1860
1861
				// page link
1862
				$output .= $prefix . " .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1863
			}
1864
1865
            // alerts
1866
			if ( $aui_bs5 ) {
1867
//				$output .= $is_var ? '' : $prefix ." .alert-{$type} {background-color: ".$color_code."20;    border-color: ".$color_code."30;color:$darker_40} ";
1868
				$output .= $prefix ." .alert-{$type} {--bs-alert-bg: rgba(var(--bs-{$type}-rgb), .1 ) !important;--bs-alert-border-color: rgba(var(--bs-{$type}-rgb), .25 ) !important;--bs-alert-color: rgba(var(--bs-{$type}-rgb), 1 ) !important;} ";
1869
			}
1870
1871
			return $output;
1872
		}
1873
1874
		/**
1875
		 *
1876
		 * @deprecated 0.1.76 Use css_overwrite()
1877
		 *
1878
		 * @param $color_code
1879
		 * @param $compatibility
1880
		 * @param $use_variable
1881
		 *
1882
		 * @return string
1883
		 */
1884
		public static function css_primary($color_code,$compatibility, $use_variable = false){
1885
1886
			if(!$use_variable){
1887
				$color_code = sanitize_hex_color($color_code);
1888
				if(!$color_code){return '';}
1889
			}
1890
1891
			/**
1892
			 * c = color, b = background color, o = border-color, f = fill
1893
			 */
1894
			$selectors = array(
1895
				'a' => array('c'),
1896
				'.btn-primary' => array('b','o'),
1897
				'.btn-primary.disabled' => array('b','o'),
1898
				'.btn-primary:disabled' => array('b','o'),
1899
				'.btn-outline-primary' => array('c','o'),
1900
				'.btn-outline-primary:hover' => array('b','o'),
1901
				'.btn-outline-primary:not(:disabled):not(.disabled).active' => array('b','o'),
1902
				'.btn-outline-primary:not(:disabled):not(.disabled):active' => array('b','o'),
1903
				'.show>.btn-outline-primary.dropdown-toggle' => array('b','o'),
1904
				'.btn-link' => array('c'),
1905
				'.dropdown-item.active' => array('b'),
1906
				'.custom-control-input:checked~.custom-control-label::before' => array('b','o'),
1907
				'.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before' => array('b','o'),
1908
//				'.custom-range::-webkit-slider-thumb' => array('b'), // these break the inline rules...
1909
//				'.custom-range::-moz-range-thumb' => array('b'),
1910
//				'.custom-range::-ms-thumb' => array('b'),
1911
				'.nav-pills .nav-link.active' => array('b'),
1912
				'.nav-pills .show>.nav-link' => array('b'),
1913
				'.page-link' => array('c'),
1914
				'.page-item.active .page-link' => array('b','o'),
1915
				'.badge-primary' => array('b'),
1916
				'.alert-primary' => array('b','o'),
1917
				'.progress-bar' => array('b'),
1918
				'.list-group-item.active' => array('b','o'),
1919
				'.bg-primary' => array('b','f'),
1920
				'.btn-link.btn-primary' => array('c'),
1921
				'.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array('b'),
1922
			);
1923
1924
			$important_selectors = array(
1925
				'.bg-primary' => array('b','f'),
1926
				'.border-primary' => array('o'),
1927
				'.text-primary' => array('c'),
1928
			);
1929
1930
			$color = array();
1931
			$color_i = array();
1932
			$background = array();
1933
			$background_i = array();
1934
			$border = array();
1935
			$border_i = array();
1936
			$fill = array();
1937
			$fill_i = array();
1938
1939
			$output = '';
1940
1941
			// build rules into each type
1942
			foreach($selectors as $selector => $types){
1943
				$selector = $compatibility ? ".bsui ".$selector : $selector;
1944
				$types = array_combine($types,$types);
1945
				if(isset($types['c'])){$color[] = $selector;}
1946
				if(isset($types['b'])){$background[] = $selector;}
1947
				if(isset($types['o'])){$border[] = $selector;}
1948
				if(isset($types['f'])){$fill[] = $selector;}
1949
			}
1950
1951
			// build rules into each type
1952
			foreach($important_selectors as $selector => $types){
1953
				$selector = $compatibility ? ".bsui ".$selector : $selector;
1954
				$types = array_combine($types,$types);
1955
				if(isset($types['c'])){$color_i[] = $selector;}
1956
				if(isset($types['b'])){$background_i[] = $selector;}
1957
				if(isset($types['o'])){$border_i[] = $selector;}
1958
				if(isset($types['f'])){$fill_i[] = $selector;}
1959
			}
1960
1961
			// add any color rules
1962
			if(!empty($color)){
1963
				$output .= implode(",",$color) . "{color: $color_code;} ";
1964
			}
1965
			if(!empty($color_i)){
1966
				$output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1967
			}
1968
1969
			// add any background color rules
1970
			if(!empty($background)){
1971
				$output .= implode(",",$background) . "{background-color: $color_code;} ";
1972
			}
1973
			if(!empty($background_i)){
1974
				$output .= implode(",",$background_i) . "{background-color: $color_code !important;} ";
1975
			}
1976
1977
			// add any border color rules
1978
			if(!empty($border)){
1979
				$output .= implode(",",$border) . "{border-color: $color_code;} ";
1980
			}
1981
			if(!empty($border_i)){
1982
				$output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1983
			}
1984
1985
			// add any fill color rules
1986
			if(!empty($fill)){
1987
				$output .= implode(",",$fill) . "{fill: $color_code;} ";
1988
			}
1989
			if(!empty($fill_i)){
1990
				$output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1991
			}
1992
1993
1994
			$prefix = $compatibility ? ".bsui " : "";
1995
1996
			// darken
1997
			$darker_075 = self::css_hex_lighten_darken($color_code,"-0.075");
0 ignored issues
show
'-0.075' of type string is incompatible with the type double expected by parameter $adjustPercent of AyeCode_UI_Settings::css_hex_lighten_darken(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1997
			$darker_075 = self::css_hex_lighten_darken($color_code,/** @scrutinizer ignore-type */ "-0.075");
Loading history...
1998
			$darker_10 = self::css_hex_lighten_darken($color_code,"-0.10");
1999
			$darker_125 = self::css_hex_lighten_darken($color_code,"-0.125");
2000
2001
			// lighten
2002
			$lighten_25 = self::css_hex_lighten_darken($color_code,"0.25");
2003
2004
			// opacity see https://css-tricks.com/8-digit-hex-codes/
2005
			$op_25 = $color_code."40"; // 25% opacity
2006
2007
2008
			// button states
2009
			$output .= $prefix ." .btn-primary:hover, $prefix .btn-primary:focus, $prefix .btn-primary.focus{background-color: ".$darker_075.";    border-color: ".$darker_10.";} ";
2010
			$output .= $prefix ." .btn-outline-primary:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-primary.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2011
			$output .= $prefix ." .btn-primary:not(:disabled):not(.disabled):active, $prefix .btn-primary:not(:disabled):not(.disabled).active, .show>$prefix .btn-primary.dropdown-toggle{background-color: ".$darker_10.";    border-color: ".$darker_125.";} ";
2012
			$output .= $prefix ." .btn-primary:not(:disabled):not(.disabled):active:focus, $prefix .btn-primary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-primary.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
2013
2014
2015
			// dropdown's
2016
			$output .= $prefix ." .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
2017
2018
2019
			// input states
2020
			$output .= $prefix ." .form-control:focus{border-color: ".$lighten_25.";box-shadow: 0 0 0 0.2rem $op_25;} ";
2021
2022
			// page link
2023
			$output .= $prefix ." .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2024
2025
			return $output;
2026
		}
2027
2028
		/**
2029
		 *
2030
		 * @deprecated 0.1.76 Use css_overwrite()
2031
		 *
2032
		 * @param $color_code
2033
		 * @param $compatibility
2034
		 *
2035
		 * @return string
2036
		 */
2037
		public static function css_secondary($color_code,$compatibility){;
2038
			$color_code = sanitize_hex_color($color_code);
2039
			if(!$color_code){return '';}
2040
			/**
2041
			 * c = color, b = background color, o = border-color, f = fill
2042
			 */
2043
			$selectors = array(
2044
				'.btn-secondary' => array('b','o'),
2045
				'.btn-secondary.disabled' => array('b','o'),
2046
				'.btn-secondary:disabled' => array('b','o'),
2047
				'.btn-outline-secondary' => array('c','o'),
2048
				'.btn-outline-secondary:hover' => array('b','o'),
2049
				'.btn-outline-secondary.disabled' => array('c'),
2050
				'.btn-outline-secondary:disabled' => array('c'),
2051
				'.btn-outline-secondary:not(:disabled):not(.disabled):active' => array('b','o'),
2052
				'.btn-outline-secondary:not(:disabled):not(.disabled).active' => array('b','o'),
2053
				'.btn-outline-secondary.dropdown-toggle' => array('b','o'),
2054
				'.badge-secondary' => array('b'),
2055
				'.alert-secondary' => array('b','o'),
2056
				'.btn-link.btn-secondary' => array('c'),
2057
			);
2058
2059
			$important_selectors = array(
2060
				'.bg-secondary' => array('b','f'),
2061
				'.border-secondary' => array('o'),
2062
				'.text-secondary' => array('c'),
2063
			);
2064
2065
			$color = array();
2066
			$color_i = array();
2067
			$background = array();
2068
			$background_i = array();
2069
			$border = array();
2070
			$border_i = array();
2071
			$fill = array();
2072
			$fill_i = array();
2073
2074
			$output = '';
2075
2076
			// build rules into each type
2077
			foreach($selectors as $selector => $types){
2078
				$selector = $compatibility ? ".bsui ".$selector : $selector;
2079
				$types = array_combine($types,$types);
2080
				if(isset($types['c'])){$color[] = $selector;}
2081
				if(isset($types['b'])){$background[] = $selector;}
2082
				if(isset($types['o'])){$border[] = $selector;}
2083
				if(isset($types['f'])){$fill[] = $selector;}
2084
			}
2085
2086
			// build rules into each type
2087
			foreach($important_selectors as $selector => $types){
2088
				$selector = $compatibility ? ".bsui ".$selector : $selector;
2089
				$types = array_combine($types,$types);
2090
				if(isset($types['c'])){$color_i[] = $selector;}
2091
				if(isset($types['b'])){$background_i[] = $selector;}
2092
				if(isset($types['o'])){$border_i[] = $selector;}
2093
				if(isset($types['f'])){$fill_i[] = $selector;}
2094
			}
2095
2096
			// add any color rules
2097
			if(!empty($color)){
2098
				$output .= implode(",",$color) . "{color: $color_code;} ";
2099
			}
2100
			if(!empty($color_i)){
2101
				$output .= implode(",",$color_i) . "{color: $color_code !important;} ";
2102
			}
2103
2104
			// add any background color rules
2105
			if(!empty($background)){
2106
				$output .= implode(",",$background) . "{background-color: $color_code;} ";
2107
			}
2108
			if(!empty($background_i)){
2109
				$output .= implode(",",$background_i) . "{background-color: $color_code !important;} ";
2110
			}
2111
2112
			// add any border color rules
2113
			if(!empty($border)){
2114
				$output .= implode(",",$border) . "{border-color: $color_code;} ";
2115
			}
2116
			if(!empty($border_i)){
2117
				$output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
2118
			}
2119
2120
			// add any fill color rules
2121
			if(!empty($fill)){
2122
				$output .= implode(",",$fill) . "{fill: $color_code;} ";
2123
			}
2124
			if(!empty($fill_i)){
2125
				$output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
2126
			}
2127
2128
2129
			$prefix = $compatibility ? ".bsui " : "";
2130
2131
			// darken
2132
			$darker_075 = self::css_hex_lighten_darken($color_code,"-0.075");
0 ignored issues
show
'-0.075' of type string is incompatible with the type double expected by parameter $adjustPercent of AyeCode_UI_Settings::css_hex_lighten_darken(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2132
			$darker_075 = self::css_hex_lighten_darken($color_code,/** @scrutinizer ignore-type */ "-0.075");
Loading history...
2133
			$darker_10 = self::css_hex_lighten_darken($color_code,"-0.10");
2134
			$darker_125 = self::css_hex_lighten_darken($color_code,"-0.125");
2135
2136
			// lighten
2137
			$lighten_25 = self::css_hex_lighten_darken($color_code,"0.25");
0 ignored issues
show
The assignment to $lighten_25 is dead and can be removed.
Loading history...
2138
2139
			// opacity see https://css-tricks.com/8-digit-hex-codes/
2140
			$op_25 = $color_code."40"; // 25% opacity
2141
2142
2143
			// button states
2144
			$output .= $prefix ." .btn-secondary:hover{background-color: ".$darker_075.";    border-color: ".$darker_10.";} ";
2145
			$output .= $prefix ." .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-secondary.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2146
			$output .= $prefix ." .btn-secondary:not(:disabled):not(.disabled):active, $prefix .btn-secondary:not(:disabled):not(.disabled).active, .show>$prefix .btn-secondary.dropdown-toggle{background-color: ".$darker_10.";    border-color: ".$darker_125.";} ";
2147
			$output .= $prefix ." .btn-secondary:not(:disabled):not(.disabled):active:focus, $prefix .btn-secondary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-secondary.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
2148
2149
2150
			return $output;
2151
		}
2152
2153
		/**
2154
		 * Increases or decreases the brightness of a color by a percentage of the current brightness.
2155
		 *
2156
		 * @param   string  $hexCode        Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
2157
		 * @param   float   $adjustPercent  A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
2158
		 *
2159
		 * @return  string
2160
		 */
2161
		public static function css_hex_lighten_darken($hexCode, $adjustPercent) {
2162
			$hexCode = ltrim($hexCode, '#');
2163
2164
			if ( strpos( $hexCode, 'rgba(' ) !== false || strpos( $hexCode, 'rgb(' ) !== false ) {
2165
				return $hexCode;
2166
			}
2167
2168
			if (strlen($hexCode) == 3) {
2169
				$hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
2170
			}
2171
2172
			$hexCode = array_map('hexdec', str_split($hexCode, 2));
0 ignored issues
show
It seems like str_split($hexCode, 2) can also be of type true; however, parameter $array of array_map() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2172
			$hexCode = array_map('hexdec', /** @scrutinizer ignore-type */ str_split($hexCode, 2));
Loading history...
2173
2174
			foreach ($hexCode as & $color) {
2175
				$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
2176
				$adjustAmount = ceil($adjustableLimit * $adjustPercent);
2177
2178
				$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
0 ignored issues
show
$color + $adjustAmount of type double is incompatible with the type integer expected by parameter $num of dechex(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2178
				$color = str_pad(dechex(/** @scrutinizer ignore-type */ $color + $adjustAmount), 2, '0', STR_PAD_LEFT);
Loading history...
2179
			}
2180
2181
			return '#' . implode($hexCode);
2182
		}
2183
2184
		/**
2185
		 * Check if we should display examples.
2186
		 */
2187
		public function maybe_show_examples(){
2188
			if(current_user_can('manage_options') && isset($_REQUEST['preview-aui'])){
2189
				echo "<head>";
2190
				wp_head();
2191
				echo "</head>";
2192
				echo "<body>";
2193
				echo $this->get_examples(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2194
				echo "</body>";
2195
				exit;
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
2196
			}
2197
		}
2198
2199
		/**
2200
		 * Get developer examples.
2201
		 *
2202
		 * @return string
2203
		 */
2204
		public function get_examples(){
2205
			$output = '';
2206
2207
2208
			// open form
2209
			$output .= "<form class='p-5 m-5 border rounded'>";
2210
2211
			// input example
2212
			$output .= aui()->input(array(
2213
				'type'  =>  'text',
2214
				'id'    =>  'text-example',
2215
				'name'    =>  'text-example',
2216
				'placeholder'   => 'text placeholder',
2217
				'title'   => 'Text input example',
2218
				'value' =>  '',
2219
				'required'  => false,
2220
				'help_text' => 'help text',
2221
				'label' => 'Text input example label'
2222
			));
2223
2224
			// input example
2225
			$output .= aui()->input(array(
2226
				'type'  =>  'url',
2227
				'id'    =>  'text-example2',
2228
				'name'    =>  'text-example',
2229
				'placeholder'   => 'url placeholder',
2230
				'title'   => 'Text input example',
2231
				'value' =>  '',
2232
				'required'  => false,
2233
				'help_text' => 'help text',
2234
				'label' => 'Text input example label'
2235
			));
2236
2237
			// checkbox example
2238
			$output .= aui()->input(array(
2239
				'type'  =>  'checkbox',
2240
				'id'    =>  'checkbox-example',
2241
				'name'    =>  'checkbox-example',
2242
				'placeholder'   => 'checkbox-example',
2243
				'title'   => 'Checkbox example',
2244
				'value' =>  '1',
2245
				'checked'   => true,
2246
				'required'  => false,
2247
				'help_text' => 'help text',
2248
				'label' => 'Checkbox checked'
2249
			));
2250
2251
			// checkbox example
2252
			$output .= aui()->input(array(
2253
				'type'  =>  'checkbox',
2254
				'id'    =>  'checkbox-example2',
2255
				'name'    =>  'checkbox-example2',
2256
				'placeholder'   => 'checkbox-example',
2257
				'title'   => 'Checkbox example',
2258
				'value' =>  '1',
2259
				'checked'   => false,
2260
				'required'  => false,
2261
				'help_text' => 'help text',
2262
				'label' => 'Checkbox un-checked'
2263
			));
2264
2265
			// switch example
2266
			$output .= aui()->input(array(
2267
				'type'  =>  'checkbox',
2268
				'id'    =>  'switch-example',
2269
				'name'    =>  'switch-example',
2270
				'placeholder'   => 'checkbox-example',
2271
				'title'   => 'Switch example',
2272
				'value' =>  '1',
2273
				'checked'   => true,
2274
				'switch'    => true,
2275
				'required'  => false,
2276
				'help_text' => 'help text',
2277
				'label' => 'Switch on'
2278
			));
2279
2280
			// switch example
2281
			$output .= aui()->input(array(
2282
				'type'  =>  'checkbox',
2283
				'id'    =>  'switch-example2',
2284
				'name'    =>  'switch-example2',
2285
				'placeholder'   => 'checkbox-example',
2286
				'title'   => 'Switch example',
2287
				'value' =>  '1',
2288
				'checked'   => false,
2289
				'switch'    => true,
2290
				'required'  => false,
2291
				'help_text' => 'help text',
2292
				'label' => 'Switch off'
2293
			));
2294
2295
			// close form
2296
			$output .= "</form>";
2297
2298
			return $output;
2299
		}
2300
2301
		/**
2302
		 * Calendar params.
2303
		 *
2304
		 * @since 0.1.44
2305
		 *
2306
		 * @return array Calendar params.
2307
		 */
2308
		public static function calendar_params() {
2309
			$params = array(
2310
				'month_long_1' => __( 'January', 'ayecode-connect' ),
2311
				'month_long_2' => __( 'February', 'ayecode-connect' ),
2312
				'month_long_3' => __( 'March', 'ayecode-connect' ),
2313
				'month_long_4' => __( 'April', 'ayecode-connect' ),
2314
				'month_long_5' => __( 'May', 'ayecode-connect' ),
2315
				'month_long_6' => __( 'June', 'ayecode-connect' ),
2316
				'month_long_7' => __( 'July', 'ayecode-connect' ),
2317
				'month_long_8' => __( 'August', 'ayecode-connect' ),
2318
				'month_long_9' => __( 'September', 'ayecode-connect' ),
2319
				'month_long_10' => __( 'October', 'ayecode-connect' ),
2320
				'month_long_11' => __( 'November', 'ayecode-connect' ),
2321
				'month_long_12' => __( 'December', 'ayecode-connect' ),
2322
				'month_s_1' => _x( 'Jan', 'January abbreviation', 'ayecode-connect' ),
2323
				'month_s_2' => _x( 'Feb', 'February abbreviation', 'ayecode-connect' ),
2324
				'month_s_3' => _x( 'Mar', 'March abbreviation', 'ayecode-connect' ),
2325
				'month_s_4' => _x( 'Apr', 'April abbreviation', 'ayecode-connect' ),
2326
				'month_s_5' => _x( 'May', 'May abbreviation', 'ayecode-connect' ),
2327
				'month_s_6' => _x( 'Jun', 'June abbreviation', 'ayecode-connect' ),
2328
				'month_s_7' => _x( 'Jul', 'July abbreviation', 'ayecode-connect' ),
2329
				'month_s_8' => _x( 'Aug', 'August abbreviation', 'ayecode-connect' ),
2330
				'month_s_9' => _x( 'Sep', 'September abbreviation', 'ayecode-connect' ),
2331
				'month_s_10' => _x( 'Oct', 'October abbreviation', 'ayecode-connect' ),
2332
				'month_s_11' => _x( 'Nov', 'November abbreviation', 'ayecode-connect' ),
2333
				'month_s_12' => _x( 'Dec', 'December abbreviation', 'ayecode-connect' ),
2334
				'day_s1_1' => _x( 'S', 'Sunday initial', 'ayecode-connect' ),
2335
				'day_s1_2' => _x( 'M', 'Monday initial', 'ayecode-connect' ),
2336
				'day_s1_3' => _x( 'T', 'Tuesday initial', 'ayecode-connect' ),
2337
				'day_s1_4' => _x( 'W', 'Wednesday initial', 'ayecode-connect' ),
2338
				'day_s1_5' => _x( 'T', 'Friday initial', 'ayecode-connect' ),
2339
				'day_s1_6' => _x( 'F', 'Thursday initial', 'ayecode-connect' ),
2340
				'day_s1_7' => _x( 'S', 'Saturday initial', 'ayecode-connect' ),
2341
				'day_s2_1' => __( 'Su', 'ayecode-connect' ),
2342
				'day_s2_2' => __( 'Mo', 'ayecode-connect' ),
2343
				'day_s2_3' => __( 'Tu', 'ayecode-connect' ),
2344
				'day_s2_4' => __( 'We', 'ayecode-connect' ),
2345
				'day_s2_5' => __( 'Th', 'ayecode-connect' ),
2346
				'day_s2_6' => __( 'Fr', 'ayecode-connect' ),
2347
				'day_s2_7' => __( 'Sa', 'ayecode-connect' ),
2348
				'day_s3_1' => __( 'Sun', 'ayecode-connect' ),
2349
				'day_s3_2' => __( 'Mon', 'ayecode-connect' ),
2350
				'day_s3_3' => __( 'Tue', 'ayecode-connect' ),
2351
				'day_s3_4' => __( 'Wed', 'ayecode-connect' ),
2352
				'day_s3_5' => __( 'Thu', 'ayecode-connect' ),
2353
				'day_s3_6' => __( 'Fri', 'ayecode-connect' ),
2354
				'day_s3_7' => __( 'Sat', 'ayecode-connect' ),
2355
				'day_s5_1' => __( 'Sunday', 'ayecode-connect' ),
2356
				'day_s5_2' => __( 'Monday', 'ayecode-connect' ),
2357
				'day_s5_3' => __( 'Tuesday', 'ayecode-connect' ),
2358
				'day_s5_4' => __( 'Wednesday', 'ayecode-connect' ),
2359
				'day_s5_5' => __( 'Thursday', 'ayecode-connect' ),
2360
				'day_s5_6' => __( 'Friday', 'ayecode-connect' ),
2361
				'day_s5_7' => __( 'Saturday', 'ayecode-connect' ),
2362
				'am_lower' => __( 'am', 'ayecode-connect' ),
2363
				'pm_lower' => __( 'pm', 'ayecode-connect' ),
2364
				'am_upper' => __( 'AM', 'ayecode-connect' ),
2365
				'pm_upper' => __( 'PM', 'ayecode-connect' ),
2366
				'firstDayOfWeek' => (int) get_option( 'start_of_week' ),
2367
				'time_24hr' => false,
2368
				'year' => __( 'Year', 'ayecode-connect' ),
2369
				'hour' => __( 'Hour', 'ayecode-connect' ),
2370
				'minute' => __( 'Minute', 'ayecode-connect' ),
2371
				'weekAbbreviation' => __( 'Wk', 'ayecode-connect' ),
2372
				'rangeSeparator' => __( ' to ', 'ayecode-connect' ),
2373
				'scrollTitle' => __( 'Scroll to increment', 'ayecode-connect' ),
2374
				'toggleTitle' => __( 'Click to toggle', 'ayecode-connect' )
2375
			);
2376
2377
			return apply_filters( 'ayecode_ui_calendar_params', $params );
2378
		}
2379
2380
		/**
2381
		 * Flatpickr calendar localize.
2382
		 *
2383
		 * @since 0.1.44
2384
		 *
2385
		 * @return string Calendar locale.
2386
		 */
2387
		public static function flatpickr_locale() {
2388
			$params = self::calendar_params();
2389
2390
			if ( is_string( $params ) ) {
0 ignored issues
show
The condition is_string($params) is always false.
Loading history...
2391
				$params = html_entity_decode( $params, ENT_QUOTES, 'UTF-8' );
2392
			} else {
2393
				foreach ( (array) $params as $key => $value ) {
2394
					if ( ! is_scalar( $value ) ) {
2395
						continue;
2396
					}
2397
2398
					$params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2399
				}
2400
			}
2401
2402
			$day_s3 = array();
2403
			$day_s5 = array();
2404
2405
			for ( $i = 1; $i <= 7; $i ++ ) {
2406
				$day_s3[] = addslashes( $params[ 'day_s3_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2407
				$day_s5[] = addslashes( $params[ 'day_s3_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2408
			}
2409
2410
			$month_s = array();
2411
			$month_long = array();
2412
2413
			for ( $i = 1; $i <= 12; $i ++ ) {
2414
				$month_s[] = addslashes( $params[ 'month_s_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2415
				$month_long[] = addslashes( $params[ 'month_long_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2416
			}
2417
2418
			ob_start();
2419
		if ( 0 ) { ?><script><?php } ?>
2420
                {
2421
                    weekdays: {
2422
                        shorthand: ['<?php echo implode( "','", $day_s3 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2423
                            longhand: ['<?php echo implode( "','", $day_s5 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2424
                    },
2425
                    months: {
2426
                        shorthand: ['<?php echo implode( "','", $month_s ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2427
                            longhand: ['<?php echo implode( "','", $month_long ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2428
                    },
2429
                    daysInMonth: [31,28,31,30,31,30,31,31,30,31,30,31],
2430
                        firstDayOfWeek: <?php echo (int) $params[ 'firstDayOfWeek' ]; ?>,
2431
                    ordinal: function (nth) {
2432
                        var s = nth % 100;
2433
                        if (s > 3 && s < 21)
2434
                            return "th";
2435
                        switch (s % 10) {
2436
                            case 1:
2437
                                return "st";
2438
                            case 2:
2439
                                return "nd";
2440
                            case 3:
2441
                                return "rd";
2442
                            default:
2443
                                return "th";
2444
                        }
2445
                    },
2446
                    rangeSeparator: '<?php echo esc_attr( $params[ 'rangeSeparator' ] ); ?>',
2447
                        weekAbbreviation: '<?php echo esc_attr( $params[ 'weekAbbreviation' ] ); ?>',
2448
                    scrollTitle: '<?php echo esc_attr( $params[ 'scrollTitle' ] ); ?>',
2449
                    toggleTitle: '<?php echo esc_attr( $params[ 'toggleTitle' ] ); ?>',
2450
                    amPM: ['<?php echo esc_attr( $params[ 'am_upper' ] ); ?>','<?php echo esc_attr( $params[ 'pm_upper' ] ); ?>'],
2451
                    yearAriaLabel: '<?php echo esc_attr( $params[ 'year' ] ); ?>',
2452
                    hourAriaLabel: '<?php echo esc_attr( $params[ 'hour' ] ); ?>',
2453
                    minuteAriaLabel: '<?php echo esc_attr( $params[ 'minute' ] ); ?>',
2454
                    time_24hr: <?php echo ( $params[ 'time_24hr' ] ? 'true' : 'false' ) ; ?>
2455
                }
2456
				<?php if ( 0 ) { ?></script><?php } ?>
2457
			<?php
2458
			$locale = ob_get_clean();
2459
2460
			return apply_filters( 'ayecode_ui_flatpickr_locale', trim( $locale ) );
2461
		}
2462
2463
		/**
2464
		 * Select2 JS params.
2465
		 *
2466
		 * @since 0.1.44
2467
		 *
2468
		 * @return array Select2 JS params.
2469
		 */
2470
		public static function select2_params() {
2471
			$params = array(
2472
				'i18n_select_state_text'    => esc_attr__( 'Select an option&hellip;', 'ayecode-connect' ),
2473
				'i18n_no_matches'           => _x( 'No matches found', 'enhanced select', 'ayecode-connect' ),
2474
				'i18n_ajax_error'           => _x( 'Loading failed', 'enhanced select', 'ayecode-connect' ),
2475
				'i18n_input_too_short_1'    => _x( 'Please enter 1 or more characters', 'enhanced select', 'ayecode-connect' ),
2476
				'i18n_input_too_short_n'    => _x( 'Please enter %item% or more characters', 'enhanced select', 'ayecode-connect' ),
2477
				'i18n_input_too_long_1'     => _x( 'Please delete 1 character', 'enhanced select', 'ayecode-connect' ),
2478
				'i18n_input_too_long_n'     => _x( 'Please delete %item% characters', 'enhanced select', 'ayecode-connect' ),
2479
				'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'ayecode-connect' ),
2480
				'i18n_selection_too_long_n' => _x( 'You can only select %item% items', 'enhanced select', 'ayecode-connect' ),
2481
				'i18n_load_more'            => _x( 'Loading more results&hellip;', 'enhanced select', 'ayecode-connect' ),
2482
				'i18n_searching'            => _x( 'Searching&hellip;', 'enhanced select', 'ayecode-connect' )
2483
			);
2484
2485
			return apply_filters( 'ayecode_ui_select2_params', $params );
2486
		}
2487
2488
		/**
2489
		 * Select2 JS localize.
2490
		 *
2491
		 * @since 0.1.44
2492
		 *
2493
		 * @return string Select2 JS locale.
2494
		 */
2495
		public static function select2_locale() {
2496
			$params = self::select2_params();
2497
2498
			foreach ( (array) $params as $key => $value ) {
2499
				if ( ! is_scalar( $value ) ) {
2500
					continue;
2501
				}
2502
2503
				$params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2504
			}
2505
2506
			$locale = json_encode( $params );
2507
2508
			return apply_filters( 'ayecode_ui_select2_locale', trim( $locale ) );
2509
		}
2510
2511
		/**
2512
		 * Time ago JS localize.
2513
		 *
2514
		 * @since 0.1.47
2515
		 *
2516
		 * @return string Time ago JS locale.
2517
		 */
2518
		public static function timeago_locale() {
2519
			$params = array(
2520
				'prefix_ago' => '',
2521
				'suffix_ago' => ' ' . _x( 'ago', 'time ago', 'ayecode-connect' ),
2522
				'prefix_after' => _x( 'after', 'time ago', 'ayecode-connect' ) . ' ',
2523
				'suffix_after' => '',
2524
				'seconds' => _x( 'less than a minute', 'time ago', 'ayecode-connect' ),
2525
				'minute' => _x( 'about a minute', 'time ago', 'ayecode-connect' ),
2526
				'minutes' => _x( '%d minutes', 'time ago', 'ayecode-connect' ),
2527
				'hour' => _x( 'about an hour', 'time ago', 'ayecode-connect' ),
2528
				'hours' => _x( 'about %d hours', 'time ago', 'ayecode-connect' ),
2529
				'day' => _x( 'a day', 'time ago', 'ayecode-connect' ),
2530
				'days' => _x( '%d days', 'time ago', 'ayecode-connect' ),
2531
				'month' => _x( 'about a month', 'time ago', 'ayecode-connect' ),
2532
				'months' => _x( '%d months', 'time ago', 'ayecode-connect' ),
2533
				'year' => _x( 'about a year', 'time ago', 'ayecode-connect' ),
2534
				'years' => _x( '%d years', 'time ago', 'ayecode-connect' ),
2535
			);
2536
2537
			$params = apply_filters( 'ayecode_ui_timeago_params', $params );
2538
2539
			foreach ( (array) $params as $key => $value ) {
2540
				if ( ! is_scalar( $value ) ) {
2541
					continue;
2542
				}
2543
2544
				$params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2545
			}
2546
2547
			$locale = json_encode( $params );
2548
2549
			return apply_filters( 'ayecode_ui_timeago_locale', trim( $locale ) );
2550
		}
2551
2552
		/**
2553
		 * JavaScript Minifier
2554
		 *
2555
		 * @param $input
2556
		 *
2557
		 * @return mixed
2558
		 */
2559
		public static function minify_js($input) {
2560
			if(trim($input) === "") return $input;
2561
			return preg_replace(
2562
				array(
2563
					// Remove comment(s)
2564
					'#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#',
2565
					// Remove white-space(s) outside the string and regex
2566
					'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s',
2567
					// Remove the last semicolon
2568
					'#;+\}#',
2569
					// Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}`
2570
					'#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i',
2571
					// --ibid. From `foo['bar']` to `foo.bar`
2572
					'#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i'
2573
				),
2574
				array(
2575
					'$1',
2576
					'$1$2',
2577
					'}',
2578
					'$1$3',
2579
					'$1.$3'
2580
				),
2581
				$input);
2582
		}
2583
2584
		/**
2585
		 * Minify CSS
2586
		 *
2587
		 * @param $input
2588
		 *
2589
		 * @return mixed
2590
		 */
2591
		public static function minify_css($input) {
2592
			if(trim($input) === "") return $input;
2593
			return preg_replace(
2594
				array(
2595
					// Remove comment(s)
2596
					'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')|\/\*(?!\!)(?>.*?\*\/)|^\s*|\s*$#s',
2597
					// Remove unused white-space(s)
2598
					'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/))|\s*+;\s*+(})\s*+|\s*+([*$~^|]?+=|[{};,>~]|\s(?![0-9\.])|!important\b)\s*+|([[(:])\s++|\s++([])])|\s++(:)\s*+(?!(?>[^{}"\']++|"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')*+{)|^\s++|\s++\z|(\s)\s+#si',
2599
					// Replace `0(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)` with `0`
2600
					'#(?<=[\s:])(0)(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)#si',
2601
					// Replace `:0 0 0 0` with `:0`
2602
					'#:(0\s+0|0\s+0\s+0\s+0)(?=[;\}]|\!important)#i',
2603
					// Replace `background-position:0` with `background-position:0 0`
2604
					'#(background-position):0(?=[;\}])#si',
2605
					// Replace `0.6` with `.6`, but only when preceded by `:`, `,`, `-` or a white-space
2606
					'#(?<=[\s:,\-])0+\.(\d+)#s',
2607
					// Minify string value
2608
					'#(\/\*(?>.*?\*\/))|(?<!content\:)([\'"])([a-z_][a-z0-9\-_]*?)\2(?=[\s\{\}\];,])#si',
2609
					'#(\/\*(?>.*?\*\/))|(\burl\()([\'"])([^\s]+?)\3(\))#si',
2610
					// Minify HEX color code
2611
					'#(?<=[\s:,\-]\#)([a-f0-6]+)\1([a-f0-6]+)\2([a-f0-6]+)\3#i',
2612
					// Replace `(border|outline):none` with `(border|outline):0`
2613
					'#(?<=[\{;])(border|outline):none(?=[;\}\!])#',
2614
					// Remove empty selector(s)
2615
					'#(\/\*(?>.*?\*\/))|(^|[\{\}])(?:[^\s\{\}]+)\{\}#s'
2616
				),
2617
				array(
2618
					'$1',
2619
					'$1$2$3$4$5$6$7',
2620
					'$1',
2621
					':0',
2622
					'$1:0 0',
2623
					'.$1',
2624
					'$1$3',
2625
					'$1$2$4$5',
2626
					'$1$2$3',
2627
					'$1:0',
2628
					'$1$2'
2629
				),
2630
				$input);
2631
		}
2632
2633
		/**
2634
		 * Get the conditional fields JavaScript.
2635
		 *
2636
		 * @return mixed
2637
		 */
2638
		public function conditional_fields_js() {
2639
			ob_start();
2640
			?>
2641
            <script>
2642
                /**
2643
                 * Conditional Fields
2644
                 */
2645
                var aui_cf_field_rules = [], aui_cf_field_key_rules = {}, aui_cf_field_default_values = {};
2646
2647
                jQuery(function($) {
2648
                    aui_cf_field_init_rules($);
2649
                });
2650
2651
                /**
2652
                 * Conditional fields init.
2653
                 */
2654
                function aui_cf_field_init_rules($) {
2655
                    if (!$('[data-has-rule]').length) {
2656
                        return;
2657
                    }
2658
                    $('input.select2-search__field').attr('data-ignore-rule','');
2659
                    $('[data-rule-key]').on('change keypress keyup gdclear', 'input, textarea', function() {
2660
                        if (!$(this).hasClass('select2-search__field')) {
2661
                            aui_cf_field_apply_rules($(this));
2662
                        }
2663
                    });
2664
2665
                    $('[data-rule-key]').on('change change.select2 gdclear', 'select', function() {
2666
                        aui_cf_field_apply_rules($(this));
2667
                    });
2668
2669
                    aui_cf_field_setup_rules($);
2670
                }
2671
2672
                /**
2673
                 * Setup conditional field rules.
2674
                 */
2675
                function aui_cf_field_setup_rules($) {
2676
                    var aui_cf_field_keys = [];
2677
2678
                    $('[data-rule-key]').each(function() {
2679
                        var key = $(this).data('rule-key'), irule = parseInt($(this).data('has-rule'));
2680
                        if (key) {
2681
                            aui_cf_field_keys.push(key);
2682
                        }
2683
2684
                        var parse_conds = {};
2685
                        if ($(this).data('rule-fie-0')) {
2686
                            $(this).find('input,select,textarea').each(function() {
2687
                                if ($(this).attr('required') || $(this).attr('oninvalid')) {
2688
                                    $(this).addClass('aui-cf-req');
2689
                                    if ($(this).attr('required')) {
2690
                                        $(this).attr('data-rule-req', true);
2691
                                    }
2692
                                    if ($(this).attr('oninvalid')) {
2693
                                        $(this).attr('data-rule-oninvalid', $(this).attr('oninvalid'));
2694
                                    }
2695
                                }
2696
                            });
2697
                            for (var i = 0; i < irule; i++) {
2698
                                var field = $(this).data('rule-fie-' + i);
2699
                                if (typeof parse_conds[i] === 'undefined') {
2700
                                    parse_conds[i] = {};
2701
                                }
2702
                                parse_conds[i]['action'] = $(this).data('rule-act-' + i);
2703
                                parse_conds[i]['field'] = $(this).data('rule-fie-' + i);
2704
                                parse_conds[i]['condition'] = $(this).data('rule-con-' + i);
2705
                                parse_conds[i]['value'] = $(this).data('rule-val-' + i);
2706
                            }
2707
2708
                            $.each(parse_conds, function(j, data) {
2709
                                var item = {
2710
                                    'field': {
2711
                                        key: key,
2712
                                        action: data.action,
2713
                                        field: data.field,
2714
                                        condition: data.condition,
2715
                                        value: data.value,
2716
                                        rule: {
2717
                                            key: key,
2718
                                            action: data.action,
2719
                                            condition: data.condition,
2720
                                            value: data.value
2721
                                        }
2722
                                    }
2723
                                };
2724
                                aui_cf_field_rules.push(item);
2725
                            });
2726
                        }
2727
                        aui_cf_field_default_values[$(this).data('rule-key')] = aui_cf_field_get_default_value($(this));
2728
                    });
2729
2730
                    $.each(aui_cf_field_keys, function(i, fkey) {
2731
                        aui_cf_field_key_rules[fkey] = aui_cf_field_get_children(fkey);
2732
                    });
2733
2734
                    $('[data-rule-key]:visible').each(function() {
2735
                        var conds = aui_cf_field_key_rules[$(this).data('rule-key')];
2736
                        if (conds && conds.length) {
2737
                            var $main_el = $(this), el = aui_cf_field_get_element($main_el);
2738
                            if ($(el).length) {
2739
                                aui_cf_field_apply_rules($(el));
2740
                            }
2741
                        }
2742
                    });
2743
                }
2744
2745
                /**
2746
                 * Apply conditional field rules.
2747
                 */
2748
                function aui_cf_field_apply_rules($el) {
2749
                    if (!$el.parents('[data-rule-key]').length) {
2750
                        return;
2751
                    }
2752
2753
                    if ($el.data('no-rule')) {
2754
                        return;
2755
                    }
2756
2757
                    var key = $el.parents('[data-rule-key]').data('rule-key');
2758
                    var conditions = aui_cf_field_key_rules[key];
2759
                    if (typeof conditions === 'undefined') {
2760
                        return;
2761
                    }
2762
                    var field_type = aui_cf_field_get_type($el.parents('[data-rule-key]')), current_value = aui_cf_field_get_value($el);
2763
                    var $keys = {}, $keys_values = {}, $key_rules = {};
2764
2765
                    jQuery.each(conditions, function(index, condition) {
2766
                        if (typeof $keys_values[condition.key] == 'undefined') {
2767
                            $keys_values[condition.key] = [];
2768
                            $key_rules[condition.key] = {}
2769
                        }
2770
2771
                        $keys_values[condition.key].push(condition.value);
2772
                        $key_rules[condition.key] = condition;
2773
                    });
2774
2775
                    jQuery.each(conditions, function(index, condition) {
2776
                        if (typeof $keys[condition.key] == 'undefined') {
2777
                            $keys[condition.key] = {};
2778
                        }
2779
2780
                        if (condition.condition === 'empty') {
2781
                            var field_value = Array.isArray(current_value) ? current_value.join('') : current_value;
2782
                            if (!field_value || field_value === '') {
2783
                                $keys[condition.key][index] = true;
2784
                            } else {
2785
                                $keys[condition.key][index] = false;
2786
                            }
2787
                        } else if (condition.condition === 'not empty') {
2788
                            var field_value = Array.isArray(current_value) ? current_value.join('') : current_value;
2789
                            if (field_value && field_value !== '') {
2790
                                $keys[condition.key][index] = true;
2791
                            } else {
2792
                                $keys[condition.key][index] = false;
2793
                            }
2794
                        } else if (condition.condition === 'equals to') {
2795
                            var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2796
                            if (((condition.value && condition.value == condition.value) || (condition.value === field_value)) && aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2797
                                $keys[condition.key][index] = true;
2798
                            } else {
2799
                                $keys[condition.key][index] = false;
2800
                            }
2801
                        } else if (condition.condition === 'not equals') {
2802
                            var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2803
                            if (jQuery.isNumeric(condition.value) && parseInt(field_value) !== parseInt(condition.value) && field_value && !aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2804
                                $keys[condition.key][index] = true;
2805
                            } else if (condition.value != field_value && !aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2806
                                $keys[condition.key][index] = true;
2807
                            } else {
2808
                                $keys[condition.key][index] = false;
2809
                            }
2810
                        } else if (condition.condition === 'greater than') {
2811
                            var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2812
                            if (jQuery.isNumeric(condition.value) && parseInt(field_value) > parseInt(condition.value)) {
2813
                                $keys[condition.key][index] = true;
2814
                            } else {
2815
                                $keys[condition.key][index] = false;
2816
                            }
2817
                        } else if (condition.condition === 'less than') {
2818
                            var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2819
                            if (jQuery.isNumeric(condition.value) && parseInt(field_value) < parseInt(condition.value)) {
2820
                                $keys[condition.key][index] = true;
2821
                            } else {
2822
                                $keys[condition.key][index] = false;
2823
                            }
2824
                        } else if (condition.condition === 'contains') {
2825
                            var avalues = condition.value;
2826
                            if (!Array.isArray(avalues)) {
2827
                                if (jQuery.isNumeric(avalues)) {
2828
                                    avalues = [avalues];
2829
                                } else {
2830
                                    avalues = avalues.split(",");
2831
                                }
2832
                            }
2833
                            switch (field_type) {
2834
                                case 'multiselect':
2835
                                    var found = false;
2836
                                    for (var key in avalues) {
2837
                                        var svalue = jQuery.isNumeric(avalues[key]) ? avalues[key] : (avalues[key]).trim();
2838
                                        if (!found && current_value && ((!Array.isArray(current_value) && current_value.indexOf(svalue) >= 0) || (Array.isArray(current_value) && aui_cf_field_in_array(svalue, current_value)))) {
2839
                                            found = true;
2840
                                        }
2841
                                    }
2842
                    
2843
                                    if (found) {
2844
                                        $keys[condition.key][index] = true;
2845
                                    } else {
2846
                                        $keys[condition.key][index] = false;
2847
                                    }
2848
                                    break;
2849
                                case 'checkbox':
2850
                                    if (current_value && ((!Array.isArray(current_value) && current_value.indexOf(condition.value) >= 0) || (Array.isArray(current_value) && aui_cf_field_in_array(condition.value, current_value)))) {
2851
                                        $keys[condition.key][index] = true;
2852
                                    } else {
2853
                                        $keys[condition.key][index] = false;
2854
                                    }
2855
                                    break;
2856
                                default:
2857
                                    if (typeof $keys[condition.key][index] === 'undefined') {
2858
                                        if (current_value && current_value.indexOf(condition.value) >= 0 && aui_cf_field_in_array(current_value, $keys_values[condition.key], false, true)) {
2859
                                            $keys[condition.key][index] = true;
2860
                                        } else {
2861
                                            $keys[condition.key][index] = false;
2862
                                        }
2863
                                    }
2864
                                    break;
2865
                            }
2866
                        }
2867
                    });
2868
2869
                    jQuery.each($keys, function(index, field) {
2870
                        if (aui_cf_field_in_array(true, field)) {
2871
                            aui_cf_field_apply_action($el, $key_rules[index], true);
2872
                        } else {
2873
                            aui_cf_field_apply_action($el, $key_rules[index], false);
2874
                        }
2875
                    });
2876
2877
                    /* Trigger field change */
2878
                    if ($keys.length) {
2879
                        $el.trigger('aui_cf_field_on_change');
2880
                    }
2881
                }
2882
2883
                /**
2884
                 * Get the field element.
2885
                 */
2886
                function aui_cf_field_get_element($el) {
2887
                    var el = $el.find('input:not("[data-ignore-rule]"),textarea,select'), type = aui_cf_field_get_type($el);
2888
                    if (type && window._aui_cf_field_elements && typeof window._aui_cf_field_elements == 'object' && typeof window._aui_cf_field_elements[type] != 'undefined') {
2889
                        el = window._aui_cf_field_elements[type];
2890
                    }
2891
                    return el;
2892
                }
2893
2894
                /**
2895
                 * Get the field type.
2896
                 */
2897
                function aui_cf_field_get_type($el) {
2898
                    return $el.data('rule-type');
2899
                }
2900
2901
                /**
2902
                 * Get the field value.
2903
                 */
2904
                function aui_cf_field_get_value($el) {
2905
                    var current_value = $el.val();
2906
2907
                    if ($el.is(':checkbox')) {
2908
                        current_value = '';
2909
                        if ($el.parents('[data-rule-key]').find('input:checked').length > 1) {
2910
                            $el.parents('[data-rule-key]').find('input:checked').each(function() {
2911
                                current_value = current_value + jQuery(this).val() + ' ';
2912
                            });
2913
                        } else {
2914
                            if ($el.parents('[data-rule-key]').find('input:checked').length >= 1) {
2915
                                current_value = $el.parents('[data-rule-key]').find('input:checked').val();
2916
                            }
2917
                        }
2918
                    }
2919
2920
                    if ($el.is(':radio')) {
2921
                        current_value = $el.parents('[data-rule-key]').find('input[type=radio]:checked').val();
2922
                    }
2923
2924
                    return current_value;
2925
                }
2926
2927
                /**
2928
                 * Get the field default value.
2929
                 */
2930
                function aui_cf_field_get_default_value($el) {
2931
                    var value = '', type = aui_cf_field_get_type($el);
2932
2933
                    switch (type) {
2934
                        case 'text':
2935
                        case 'number':
2936
                        case 'date':
2937
                        case 'textarea':
2938
                        case 'select':
2939
                            value = $el.find('input:text,input[type="number"],textarea,select').val();
2940
                            break;
2941
                        case 'phone':
2942
                        case 'email':
2943
                        case 'color':
2944
                        case 'url':
2945
                        case 'hidden':
2946
                        case 'password':
2947
                        case 'file':
2948
                            value = $el.find('input[type="' + type + '"]').val();
2949
                            break;
2950
                        case 'multiselect':
2951
                            value = $el.find('select').val();
2952
                            break;
2953
                        case 'radio':
2954
                            if ($el.find('input[type="radio"]:checked').length >= 1) {
2955
                                value = $el.find('input[type="radio"]:checked').val();
2956
                            }
2957
                            break;
2958
                        case 'checkbox':
2959
                            if ($el.find('input[type="checkbox"]:checked').length >= 1) {
2960
                                if ($el.find('input[type="checkbox"]:checked').length > 1) {
2961
                                    var values = [];
2962
                                    values.push(value);
2963
                                    $el.find('input[type="checkbox"]:checked').each(function() {
2964
                                        values.push(jQuery(this).val());
2965
                                    });
2966
                                    value = values;
2967
                                } else {
2968
                                    value = $el.find('input[type="checkbox"]:checked').val();
2969
                                }
2970
                            }
2971
                            break;
2972
                        default:
2973
                            if (window._aui_cf_field_default_values && typeof window._aui_cf_field_default_values == 'object' && typeof window._aui_cf_field_default_values[type] != 'undefined') {
2974
                                value = window._aui_cf_field_default_values[type];
2975
                            }
2976
                            break;
2977
                    }
2978
                    return {
2979
                        type: type,
2980
                        value: value
2981
                    };
2982
                }
2983
2984
                /**
2985
                 * Reset field default value.
2986
                 */
2987
                function aui_cf_field_reset_default_value($el, bHide, setVal) {
2988
                    if (!($el && $el.length)) {
2989
                        return;
2990
                    }
2991
                    var type = aui_cf_field_get_type($el), key = $el.data('rule-key'), field = aui_cf_field_default_values[key];
2992
                    if (typeof setVal === 'undefined' || (typeof setVal !== 'undefined' && setVal === null)) {
2993
                        setVal = field.value;
2994
                    }
2995
2996
                    switch (type) {
2997
                        case 'text':
2998
                        case 'number':
2999
                        case 'date':
3000
                        case 'textarea':
3001
                            $el.find('input:text,input[type="number"],textarea').val(setVal);
3002
                            break;
3003
                        case 'phone':
3004
                        case 'email':
3005
                        case 'color':
3006
                        case 'url':
3007
                        case 'hidden':
3008
                        case 'password':
3009
                        case 'file':
3010
                            $el.find('input[type="' + type + '"]').val(setVal);
3011
                            break;
3012
                        case 'select':
3013
                            $el.find('select').find('option').prop('selected', false);
3014
                            $el.find('select').val(setVal);
3015
                            $el.find('select').trigger('change');
3016
                            break;
3017
                        case 'multiselect':
3018
                            $el.find('select').find('option').prop('selected', false);
3019
                            if ((typeof setVal === 'object' || typeof setVal === 'array') && !setVal.length && $el.find('select option:first').text() == '') {
3020
                                $el.find('select option:first').remove(); // Clear first option to show placeholder.
3021
                            }
3022
                            if (typeof setVal === 'string') {
3023
                                $el.find('select').val(setVal);
3024
                            } else {
3025
                                jQuery.each(setVal, function(i, v) {
3026
                                    $el.find('select').find('option[value="' + v + '"]').prop('selected', true);
3027
                                });
3028
                            }
3029
                            $el.find('select').trigger('change');
3030
                            break;
3031
                        case 'checkbox':
3032
                            if ($el.find('input[type="checkbox"]:checked').length >= 1) {
3033
                                $el.find('input[type="checkbox"]:checked').prop('checked', false).removeAttr('checked');
3034
                            }
3035
                            if (Array.isArray(setVal)) {
3036
                                jQuery.each(setVal, function(i, v) {
3037
                                    $el.find('input[type="checkbox"][value="' + v + '"]').prop('checked', true);
3038
                                });
3039
                            } else {
3040
                                $el.find('input[type="checkbox"][value="' + setVal + '"]').prop('checked', true);
3041
                            }
3042
                            break;
3043
                        case 'radio':
3044
                            setTimeout(function() {
3045
                                if ($el.find('input[type="radio"]:checked').length >= 1) {
3046
                                    $el.find('input[type="radio"]:checked').prop('checked', false).removeAttr('checked');
3047
                                }
3048
                                $el.find('input[type="radio"][value="' + setVal + '"]').prop('checked', true);
3049
                            }, 100);
3050
                            break;
3051
                        default:
3052
                            jQuery(document.body).trigger('aui_cf_field_reset_default_value', type, $el, field);
3053
                            break;
3054
                    }
3055
3056
                    if (!$el.hasClass('aui-cf-field-has-changed')) {
3057
                        var el = aui_cf_field_get_element($el);
3058
                        if (type === 'radio' || type === 'checkbox') {
3059
                            el = el.find(':checked');
3060
                        }
3061
                        if (el) {
3062
                            el.trigger('change');
3063
                            $el.addClass('aui-cf-field-has-changed');
3064
                        }
3065
                    }
3066
                }
3067
3068
                /**
3069
                 * Get the field children.
3070
                 */
3071
                function aui_cf_field_get_children(field_key) {
3072
                    var rules = [];
3073
                    jQuery.each(aui_cf_field_rules, function(j, rule) {
3074
                        if (rule.field.field === field_key) {
3075
                            rules.push(rule.field.rule);
3076
                        }
3077
                    });
3078
                    return rules;
3079
                }
3080
3081
                /**
3082
                 * Check in array field value.
3083
                 */
3084
                function aui_cf_field_in_array(find, item, exact, match) {
3085
                    var found = false, key;
3086
                    exact = !!exact;
3087
3088
                    for (key in item) {
3089
                        if ((exact && item[key] === find) || (!exact && item[key] == find) || (match && (typeof find === 'string' || typeof find === 'number') && (typeof item[key] === 'string' || typeof item[key] === 'number') && find.length && find.indexOf(item[key]) >= 0)) {
3090
                            found = true;
3091
                            break;
3092
                        }
3093
                    }
3094
                    return found;
3095
                }
3096
3097
                /**
3098
                 * App the field condition action.
3099
                 */
3100
                function aui_cf_field_apply_action($el, rule, isTrue) {
3101
                    var $destEl = jQuery('[data-rule-key="' + rule.key + '"]'), $inputEl = (rule.key && $destEl.find('[name="' + rule.key + '"]').length) ? $destEl.find('[name="' + rule.key + '"]') : null;
3102
3103
                    if (rule.action === 'show' && isTrue) {
3104
                        if ($destEl.is(':hidden') && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3105
                            aui_cf_field_reset_default_value($destEl);
3106
                        }
3107
                        aui_cf_field_show_element($destEl);
3108
                    } else if (rule.action === 'show' && !isTrue) {
3109
                        if ((!$destEl.is(':hidden') || ($destEl.is(':hidden') && ($destEl.hasClass('aui-cf-force-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')) || ($destEl.closest('.aui-cf-use-parent').length && $destEl.closest('.aui-cf-use-parent').is(':hidden'))))) && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3110
                            var _setVal = $destEl.hasClass('aui-cf-force-empty') || ($inputEl && $inputEl.hasClass('aui-cf-force-empty')) ? '' : null;
3111
                            aui_cf_field_reset_default_value($destEl, true, _setVal);
3112
                        }
3113
                        aui_cf_field_hide_element($destEl);
3114
                    } else if (rule.action === 'hide' && isTrue) {
3115
                        if ((!$destEl.is(':hidden') || ($destEl.is(':hidden') && ($destEl.hasClass('aui-cf-force-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')) || ($destEl.closest('.aui-cf-use-parent').length && $destEl.closest('.aui-cf-use-parent').is(':hidden'))))) && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3116
                            var _setVal = $destEl.hasClass('aui-cf-force-empty') || ($inputEl && $inputEl.hasClass('aui-cf-force-empty')) ? '' : null;
3117
                            aui_cf_field_reset_default_value($destEl, true, _setVal);
3118
                        }
3119
                        aui_cf_field_hide_element($destEl);
3120
                    } else if (rule.action === 'hide' && !isTrue) {
3121
                        if ($destEl.is(':hidden') && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3122
                            aui_cf_field_reset_default_value($destEl);
3123
                        }
3124
                        aui_cf_field_show_element($destEl);
3125
                    }
3126
                    return $el.removeClass('aui-cf-field-has-changed');
3127
                }
3128
3129
                /**
3130
                 * Show field element.
3131
                 */
3132
                function aui_cf_field_show_element($el) {
3133
                    $el.removeClass('d-none').show();
3134
3135
                    $el.find('.aui-cf-req').each(function() {
3136
                        if (jQuery(this).data('rule-req')) {
3137
                            jQuery(this).removeAttr('required').prop('required', true);
3138
                        }
3139
                        if (jQuery(this).data('rule-oninvalid')) {
3140
                            jQuery(this).removeAttr('oninvalid').attr('oninvalid', jQuery(this).data('rule-oninvalid'));
3141
                        }
3142
                    });
3143
3144
                    if (window && window.navigator.userAgent.indexOf("MSIE") !== -1) {
3145
                        $el.css({
3146
                            "visibility": "visible"
3147
                        });
3148
                    }
3149
                }
3150
3151
                /**
3152
                 * Hide field element.
3153
                 */
3154
                function aui_cf_field_hide_element($el) {
3155
                    $el.addClass('d-none').hide();
3156
3157
                    $el.find('.aui-cf-req').each(function() {
3158
                        if (jQuery(this).data('rule-req')) {
3159
                            jQuery(this).removeAttr('required');
3160
                        }
3161
                        if (jQuery(this).data('rule-oninvalid')) {
3162
                            jQuery(this).removeAttr('oninvalid');
3163
                        }
3164
                    });
3165
3166
                    if (window && window.navigator.userAgent.indexOf("MSIE") !== -1) {
3167
                        $el.css({
3168
                            "visibility": "hidden"
3169
                        });
3170
                    }
3171
                }
3172
				<?php do_action( 'aui_conditional_fields_js', $this ); ?>
3173
            </script>
3174
			<?php
3175
			$output = ob_get_clean();
3176
3177
			return str_replace( array( '<script>', '</script>' ), '', self::minify_js( $output ) );
3178
		}
3179
3180
		/**
3181
		 * Check if block editor page.
3182
		 *
3183
		 * @since 0.2.27
3184
		 *
3185
		 * @return bool
3186
		 */
3187
		public static function is_block_editor() {
3188
			if ( is_admin() ) {
3189
				$current_screen = function_exists('get_current_screen' ) ? get_current_screen() : array();
0 ignored issues
show
Are you sure the usage of get_current_screen() is correct as it seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
3190
3191
				if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
3192
					return true;
3193
				}
3194
			}
3195
3196
			return false;
3197
		}
3198
3199
		/**
3200
		 * Checks if the current call is a ajax call to get the block content.
3201
		 *
3202
		 * This can be used in your widget to return different content as the block content.
3203
		 *
3204
		 * @since 0.2.27
3205
		 *
3206
		 * @return bool
3207
		 */
3208
		public static function is_block_content_call() {
3209
			$result = false;
3210
			if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
3211
				$result = true;
3212
			}
3213
3214
			return $result;
3215
		}
3216
3217
		/**
3218
		 * Tests if the current output is inside a Divi preview.
3219
		 *
3220
		 * @since 0.2.27
3221
		 *
3222
		 * @return bool
3223
		 */
3224
		public static function is_divi_preview() {
3225
			$result = false;
3226
			if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
3227
				$result = true;
3228
			}
3229
3230
			return $result;
3231
		}
3232
3233
		/**
3234
		 * Tests if the current output is inside a elementor preview.
3235
		 *
3236
		 *
3237
		 * @since 0.2.27
3238
		 *
3239
		 * @return bool
3240
		 */
3241
		public static function is_elementor_preview() {
3242
			$result = false;
3243
			if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
3244
				$result = true;
3245
			}
3246
3247
			return $result;
3248
		}
3249
3250
		/**
3251
		 * Tests if the current output is inside a Beaver builder preview.
3252
		 *
3253
		 * @since 0.2.27
3254
		 *
3255
		 * @return bool
3256
		 */
3257
		public static function is_beaver_preview() {
3258
			$result = false;
3259
			if ( isset( $_REQUEST['fl_builder'] ) ) {
3260
				$result = true;
3261
			}
3262
3263
			return $result;
3264
		}
3265
3266
		/**
3267
		 * Tests if the current output is inside a siteorigin builder preview.
3268
		 *
3269
		 * @since 0.2.27
3270
		 *
3271
		 * @return bool
3272
		 */
3273
		public static function is_siteorigin_preview() {
3274
			$result = false;
3275
			if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
3276
				$result = true;
3277
			}
3278
3279
			return $result;
3280
		}
3281
3282
		/**
3283
		 * Tests if the current output is inside a cornerstone builder preview.
3284
		 *
3285
		 * @since 0.2.27
3286
		 *
3287
		 * @return bool
3288
		 */
3289
		public static function is_cornerstone_preview() {
3290
			$result = false;
3291
			if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
3292
				$result = true;
3293
			}
3294
3295
			return $result;
3296
		}
3297
3298
		/**
3299
		 * Tests if the current output is inside a fusion builder preview.
3300
		 *
3301
		 * @return bool
3302
		 *@since 1.1.0
3303
		 */
3304
		public static function is_fusion_preview() {
3305
			$result = false;
3306
			if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
3307
				$result = true;
3308
			}
3309
3310
			return $result;
3311
		}
3312
3313
		/**
3314
		 * Tests if the current output is inside a Oxygen builder preview.
3315
		 *
3316
		 * @return bool
3317
		 *@since 1.0.18
3318
		 */
3319
		public static function is_oxygen_preview() {
3320
			$result = false;
3321
			if ( ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) ) {
3322
				$result = true;
3323
			}
3324
3325
			return $result;
3326
		}
3327
3328
		/**
3329
		 * Check for Kallyas theme Zion builder preview.
3330
		 *
3331
		 * @since 0.2.27
3332
		 *
3333
		 * @return bool
3334
		 */
3335
		public static function is_kallyas_zion_preview() {
3336
			$result = false;
3337
3338
			if ( function_exists( 'znhg_kallyas_theme_config' ) && ! empty( $_REQUEST['zn_pb_edit'] ) ) {
3339
				$result = true;
3340
			}
3341
3342
			return $result;
3343
		}
3344
3345
		/**
3346
		 * Check for Bricks theme builder preview.
3347
		 *
3348
		 * @since 0.2.27
3349
		 *
3350
		 * @return bool
3351
		 */
3352
		public static function is_bricks_preview() {
3353
			$result = false;
3354
3355
			if ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || bricks_is_builder_call() ) ) {
0 ignored issues
show
The function bricks_is_builder_call was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

3355
			if ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || /** @scrutinizer ignore-call */ bricks_is_builder_call() ) ) {
Loading history...
3356
				$result = true;
3357
			}
3358
3359
			return $result;
3360
		}
3361
3362
		/**
3363
		 * General function to check if we are in a preview situation.
3364
		 *
3365
		 * @since 0.2.27
3366
		 *
3367
		 * @return bool
3368
		 */
3369
		public static function is_preview() {
3370
			$preview = false;
3371
3372
			if ( self::is_block_editor() ) {
3373
				return true;
3374
			}
3375
3376
			if( self::is_block_content_call() ) {
3377
				$preview = true;
3378
			} elseif ( self::is_divi_preview() ) {
3379
				$preview = true;
3380
			} elseif ( self::is_elementor_preview() ) {
3381
				$preview = true;
3382
			} elseif ( self::is_beaver_preview() ) {
3383
				$preview = true;
3384
			} elseif ( self::is_siteorigin_preview() ) {
3385
				$preview = true;
3386
			} elseif ( self::is_cornerstone_preview() ) {
3387
				$preview = true;
3388
			} elseif ( self::is_fusion_preview() ) {
3389
				$preview = true;
3390
			} elseif ( self::is_oxygen_preview() ) {
3391
				$preview = true;
3392
			} elseif( self::is_kallyas_zion_preview() ) {
3393
				$preview = true;
3394
			} elseif( self::is_bricks_preview() ) {
3395
				$preview = true;
3396
			}
3397
3398
			return $preview;
3399
		}
3400
	}
3401
3402
	global $ayecode_ui_settings;
3403
3404
	/**
3405
	 * Run the class if found.
3406
	 */
3407
	$ayecode_ui_settings = AyeCode_UI_Settings::instance();
3408
}