/**
 * Admin utilities (for internal use only!)
 *
 * @package ThemeREX Addons
 * @since v1.0
 */

/* global jQuery, TRX_ADDONS_STORAGE */

(function() {

	"use strict";

	if ( typeof TRX_ADDONS_STORAGE == 'undefined' ) window.TRX_ADDONS_STORAGE = {};

	var $document = jQuery( document ),
		$body = jQuery( 'body' );
	
	$document.ready( function() {
	
		// Trigger 'admin_action.init_hidden_elements' on meta box hide and show
		$document.on('postbox-toggled', function() {
			$document.trigger('admin_action.init_hidden_elements');
		});
		// Trigger 'admin_action.init_hidden_elements' on sorting meta boxes
		jQuery('.meta-box-sortables').on( 'sortstop', function() {
			$document.trigger('admin_action.init_hidden_elements');
		});

		// Scroll to the theme panel after page reloaded
		trx_addons_document_animate_to( jQuery( '.trx_addons_scroll_to' ).eq(0) );


		// Hide admin notice
		jQuery( '.trx_addons_admin_notice .notice-dismiss' )
			.on( 'click', function(e) {
				jQuery.post(
					TRX_ADDONS_STORAGE['ajax_url'], {
						'action': 'trx_addons_hide_' + jQuery( this ).parent().data( 'notice' ) + '_notice',
						'nonce': TRX_ADDONS_STORAGE['ajax_nonce']
					},
					function(response){}
				);
				e.preventDefault();
				return false;
			}
		);
		
		
		// Check fields dependencies in widgets
		//-----------------------------------------------------------------------------------

		var in_widgets = false;

		// Check dependencies in widgets in admin menu
		jQuery( '.widget-liquid-right,.widgets-holder-wrap.inactive-sidebar,.edit-widgets-block-editor' )
			.on( 'change', '[data-param-name]', function() {
				trx_addons_admin_check_dependencies(jQuery(this).parents('form'));
			} )
			.each( function () {
				var $area = jQuery( this );
				in_widgets = true;
				if ( $area.hasClass( 'edit-widgets-block-editor' ) ) {
					trx_addons_admin_check_dependencies( $area );
				} else {
					$area.find( 'form' ).each( function() {
						trx_addons_admin_check_dependencies(jQuery(this));
					} );
				}
			} );

		// Check dependencies in widgets inside Customize sections (before open for dinamically created sections)
		jQuery( '#customize-theme-controls .control-section' )
			// WordPress 5.7- (classic widgets panel)
			.on( 'click', '.widget-title', function() {
				var widget = jQuery( this ).parents('.widget').eq(0).find('.form');
				if ( widget.length > 0 ) {
					trx_addons_admin_check_dependencies( widget );
				}
			} )
			// WordPress 5.8+ (widgets block editor)
			.on( 'click', '.wp-block-legacy-widget__edit-preview', function() {
				setTimeout( function() {
					var widget = jQuery( this ).siblings('.wp-block-legacy-widget__edit-form').eq(0).find('.form');
					if ( widget.length > 0 ) {
						trx_addons_admin_check_dependencies( widget );
					}
				}, 500 );
			} );
		jQuery('#customize-theme-controls .control-section')
			.on( 'change', '[data-param-name]', function() {
				trx_addons_admin_check_dependencies(jQuery(this).parents('.form').eq(0));
			} );

		// Check dependencies after the widget added or updated
		$document.on( 'widget-added widget-updated', function(e, widget) {
			if ( widget ) {
				var widget_form = jQuery(widget).find('form');
				if ( widget_form.length > 0 ) {
					trx_addons_admin_check_dependencies( widget_form );
				}
			}
		} );

		// Check for dependencies
		function trx_addons_admin_check_dependencies(cont) {
			cont.find('[data-param-name]').each( function() {
				var ctrl = jQuery(this),
					id = ctrl.data('param-name'),
					depend = ctrl.data('param-dependency');
				if ( !id || !depend) return;
				if ( depend ) {
					var dep_cnt = 0, dep_all = 0;
					var dep_cmp = typeof depend.compare != 'undefined' ? depend.compare.toLowerCase() : 'and';
					var dep_strict = typeof depend.strict != 'undefined';
					var fld=null, val='', name='', subname='', i;
					var parts = '', parts2 = '';
					for (i in depend) {
						if (i == 'compare' || i == 'strict') continue;
						dep_all++;
						name = i;
						subname = '';
						if (name.indexOf('[') > 0) {
							parts = name.split('[');
							name = parts[0];
							subname = parts[1].replace(']', '');
						}
						fld = cont.find('[data-param-name="'+name+'"]');
						if (fld.length > 0) {
							val = trx_addons_admin_get_field_value(fld);
							if (subname !== '') {
								parts = val.split('|');
								for (var p=0; p < parts.length; p++) {
									parts2 = parts[p].split('=');
									if (parts2[0]==subname) {
										val = parts2[1];
									}
								}
							}
							for (var j in depend[i]) {
								if ( 
									   (depend[i][j]=='not_empty' && val !== '')	// Main field value is not empty - show current field
									|| (depend[i][j]=='is_empty' && val === '')		// Main field value is empty - show current field
									|| (val !== '' && (!isNaN(depend[i][j]) 		// Main field value equal to specified value - show current field
														? val==depend[i][j]
														: (dep_strict 
																? val==depend[i][j]
																: (''+val).indexOf(depend[i][j])===0
															)
													)
										)
									|| (val !== '' && (""+depend[i][j]).charAt(0) == '^' && (''+val).indexOf(depend[i][j].substr(1))==-1)
																				// Main field value not equal to specified value - show current field
								) {
									dep_cnt++;
									break;
								}
							}
						} else {
							dep_all--;
						}
						if (dep_cnt > 0 && dep_cmp == 'or')
							break;
					}
					if (((dep_cnt > 0 || dep_all === 0) && dep_cmp == 'or') || (dep_cnt == dep_all && dep_cmp == 'and')) {
						ctrl.parents('[class^="widget_field_type_"]').slideDown().removeClass('trx_addons_options_no_use');
					} else {
						ctrl.parents('[class^="widget_field_type_"]').slideUp().addClass('trx_addons_options_no_use');
					}
				}
			});
		}

		function trx_addons_admin_get_field_value(fld) {
			var ctrl = fld.parents('[class^="widget_field_type_"]');
			var val = fld.attr('type')=='checkbox' || fld.attr('type')=='radio' 
						? (ctrl.find('input[type="'+fld.attr('type')+'"]:checked').length > 0
							? (ctrl.find('input[type="'+fld.attr('type')+'"]:checked').val() !== ''
								&& ''+ctrl.find('input[type="'+fld.attr('type')+'"]:checked').val() !== '0'
									? ctrl.find('input[type="'+fld.attr('type')+'"]:checked').val()
									: 1
								)
							: 0
							)
						: fld.val();
			if (val===undefined || val===null) val = '';
			return val;
		}


		// Refresh taxonomies and terms lists when post type is changed
		//-----------------------------------------------------------------------------------
		
		// In widgets mode
		jQuery('.widget-liquid-right,.widgets-holder-wrap,.customize-control-widget_form,.edit-widgets-block-editor,.customize-control-sidebar_block_editor')
			.on('change', '.trx_addons_post_type_selector,.trx_addons_taxonomy_selector', function() {
				var field = jQuery(this),
					num = 0;
				field
					.parent()
					.nextAll()
					.find( field.attr('class').indexOf('_post_type_selector') > 0 ? 'select[class*="_taxonomy_selector"]' : 'select[class*="_terms_selector"]')
					.each(function() {
						var cat_fld = jQuery(this);
						var cat_lbl = cat_fld.prev('label');
						setTimeout(function(){
							trx_addons_refresh_list(cat_fld.attr('class').indexOf('_taxonomy_selector') > 0
													? 'taxonomies'
													: 'terms',
												field.val(),
												cat_fld,
												cat_lbl);
						}, 300*num);
						num++;
					});
				return false;
			});
	
		// In ThemeREX Addons Options
		jQuery('.trx_addons_options')
			.on('change', '.trx_addons_post_type_selector,.trx_addons_taxonomy_selector', function() {
				var field_container = jQuery(this).parents('.trx_addons_options_item');
				var cat_fld = field_container.next().find('[class*="_selector"]');
				var cat_lbl = field_container.next().find('.trx_addons_options_item_title');
				if (cat_fld.length > 0) {
					trx_addons_refresh_list(cat_fld.hasClass('trx_addons_taxonomy_selector')
												? 'taxonomies' 
												: 'terms',
											jQuery(this).val(),
											cat_fld,
											cat_lbl);
				}
				return false;
			});
		
		// In VC editor
		// Attention! Code of this handler is moved to the api/js_composer/js_composer.admin.js
		
		// In Elementor editor
		// Attention! Code of this handler is moved to the api/elementor/elementor.editor.js


		// Refresh link on the post editor when select with layout is changed
		// in Theme Options, VC editor or Elementor editor
		//--------------------------------------------------------------------
		$body.on('change', 'select', function () {
			var selector = jQuery(this),
				parent = selector.data('setting') !== undefined
							? selector.closest('.elementor-control-content').eq(0)
							: selector.parent().parent();
			var a = parent.find('a.trx_addons_post_editor');
			if (a.length > 0) trx_addons_layout_selector_refresh_link(a);
		});
		
		window.trx_addons_layout_selector_refresh_link = function(a) {
			var parent = a.closest('.elementor-control-content').length > 0
							? a.closest('.elementor-control-content').eq(0)
							: a.parent().parent();
			var selector = parent.find('select');
			if (selector.length > 0) {
				var id = Number(selector.val());
				if (isNaN(id) || id <= 0) id = 0;
				a.attr('href', a.attr('href').replace(/post=[0-9]{1,5}/, "post="+id));
				if (id == 0) {
					a.addClass('trx_addons_hidden');
				} else {
					a.removeClass('trx_addons_hidden');
				}
			}
		};

		// Menu item settings
		//---------------------------------------------------
		if ( location.href.indexOf('nav-menus.php') > 0 ) {
			window.TrxNavMenuSettings = {
				currentItemId: null,
				currentItemDepth: null,
	
				init: function() {
					var _this = this;

					jQuery( '#menu-to-edit').on( 'click', '.menu-item-actions .item-settings', function(e) {
						e.preventDefault();
						_this.openItemSettings(_this, e);
						return false;
					} );

					jQuery( '#trx-addons-nav-menu-item-save').on( 'click', function( e ) {
						e.preventDefault();
						var $button = jQuery( this);
						_this.saveItemSettings( _this, $button );
						_this.closeItemSettings();
						return false;
					} );

					jQuery( '.trx-addons-dialog-header-button-close').on( 'click', this.closeItemSettings );
	
					jQuery( document).on( 'click', '.trx-addons-dialog', function (e) {
						if ( jQuery( e.target).closest( ".trx-addons-dialog-modal" ).length < 1 ) {
							window.TrxNavMenuSettings.closeItemSettings();
						}
					} );

					jQuery( '#save_menu_footer').on( 'click', function() {
						trx_addons_options_changed( false );
					} );
				},

				openItemSettings: function( _this, e ) {
					var $item = jQuery(  e.target ).closest('.menu-item');
					_this.currentItemId = _this.getItemId( $item );
					_this.currentItemDepth = _this.getItemDepth( $item );
	
					_this.updateFields( _this, $item );

					// Show popup
					jQuery( '.trx-addons-nav-menu-item-settings').show();
				},
	
				updateFields: function( _this, $item ) {
					var $form = jQuery( '.trx-addons-nav-menu-item-settings' ),
						settings = $item.find( '#edit-menu-item-settings-' + _this.currentItemId ).val(),
						$fld, val;
	
					if ( ! $form.length ) return;

					settings = settings ? JSON.parse( settings ) : {};
					settings = trx_addons_object_merge( _this.defaultItemSettings( _this, $form ), typeof settings == 'object' ? settings : {} );
					settings.submenu_depth = _this.currentItemDepth;

					for ( var param_name in settings ) {
						$fld = $form.find( '[name="trx_addons_options_field_' + param_name + '"]' );
						val = settings[param_name];
						if ( $fld.attr('type') == 'radio' || $fld.attr('type') == 'checkbox' ) {
							$fld.removeAttr( 'checked' );
							$fld.each( function() {
								var item = jQuery(this);
								if ( item.val() == val ) {
									item.get(0).checked = true;
									item.attr( 'checked', 'checked' ).trigger('change');
								}
							} );
						} else if ( $fld.hasClass('trx_addons_color_selector') ) {
							$fld.val( val ).wpColorPicker( 'color', val ).trigger('change');
						} else if ( $fld.next().hasClass('trx_addons_icon_selector') ) {
							if ( val == '' || val == 'none' ) {
								$fld.next().attr( 'class', 'trx_addons_icon_selector' );
							} else {
								$fld.next().addClass( val ).css('background-image', 'none');
							}
							$fld.val( val ).trigger('change');
						} else {
							$fld.val( val ).trigger('change');
						}
					}
					trx_addons_options_changed( false );
				},

				defaultItemSettings: function( _this, $form ) {
					var settings = {};
					$form.find( '[name^="trx_addons_options_field_"]').each( function() {
						var $fld = jQuery( this ),
							name = $fld.attr( 'name' ).replace( 'trx_addons_options_field_', '' ),
							std = $fld.data('std');
						settings[name] = std;
					} );
					return settings;
				},

				saveItemSettings: function( _this, $btn ) {
					var $form = jQuery( '.trx-addons-nav-menu-item-settings' ),
						$settings_field = jQuery( '#edit-menu-item-settings-' + _this.currentItemId ),
						settings = {};
					
					$form.find( '[name^="trx_addons_options_field_"]').each( function() {
						var $fld = jQuery( this ),
							name = $fld.attr( 'name' ).replace( 'trx_addons_options_field_', '' ),
							val = $fld.attr('type') == 'checkbox'
									? ( $fld.prop('checked') ? $fld.val() : '' )
									: ( $fld.attr('type') == 'radio'
										? $form.find( '[name="trx_addons_options_field_' + name + '"]:checked').val()
										: $fld.val()
										);
						settings[name] = val;
					} );
					$settings_field.val( JSON.stringify( settings ) ).trigger('change');
					// Update menu item classes
					$settings_field.closest('.menu-item')
						.toggleClass('menu-item-has-submenu-layout', settings.layout_submenu > 0 )
						.toggleClass('menu-item-has-submenu-settings', ( settings.icon && settings.icon != 'none' ) || settings.badge_text != '' );
				},
	
				closeItemSettings: function() {
					jQuery( '.trx-addons-nav-menu-item-settings').hide();
				},
	
				getItemId: function( $item ) {
					return jQuery( $item).attr('id').replace('menu-item-', '');
				},
	
				getItemDepth: function( $item ) {
					var depth = jQuery( $item).attr('class').match(/menu-item-depth-\d/);
					if ( depth.length ) {
						return depth[0].replace( 'menu-item-depth-', '' );
					} else {
						return 0;
					}
				}
			}
	
			window.TrxNavMenuSettings.init();

			// Check max input vars
			var checkMaxInputVars = function() {
				var form = jQuery('#menu-to-edit');
				if ( form.length > 0 ) {
					// var fields = form.find('input[name^="menu-item"], select[name^="menu-item"], textarea[name^="menu-item"]');
					var fields = form.find('input,select,textarea');
					var count = fields.length;
					var max_input_vars = TRX_ADDONS_STORAGE['max_input_vars'];
					if ( count > max_input_vars ) {
						trx_addons_msgbox_attention( TRX_ADDONS_STORAGE['msg_max_input_vars'].replace('{{count}}', count).replace('{{max_input_vars}}', max_input_vars), TRX_ADDONS_STORAGE['msg_caption_attention'] );
					}
				}
			};
			checkMaxInputVars();
			jQuery( '.submit-add-to-menu').on( 'click', checkMaxInputVars );
		}

		// Prepare media selector params
		//---------------------------------------------------
		if ( typeof( TRX_ADDONS_STORAGE['media_frame'] ) == 'undefined' ) {
			TRX_ADDONS_STORAGE['media_frame'] = {};
			TRX_ADDONS_STORAGE['media_link'] = {};
		}

		// Add extra parameters to all links on page
		//---------------------------------------------------
		if ( TRX_ADDONS_STORAGE['add_to_links_url'] ) {
			trx_addons_add_extra_args_to_links( TRX_ADDONS_STORAGE['add_to_links_url'] );

			// Add extra parameters to all links on events
			if ( TRX_ADDONS_STORAGE['add_to_links_url_events'] ) {
				for ( var i = 0; i < TRX_ADDONS_STORAGE['add_to_links_url_events'].length; i++ ) {
					jQuery( TRX_ADDONS_STORAGE['add_to_links_url_events'][i]['selector'] )
						.data( 'trx-addons-add-to-links-url-event-delay', TRX_ADDONS_STORAGE['add_to_links_url_events'][i]['delay'] ? TRX_ADDONS_STORAGE['add_to_links_url_events'][i]['delay'] : 0 )
						.on( TRX_ADDONS_STORAGE['add_to_links_url_events'][i]['event'], function() {
							var delay = jQuery(this).data( 'trx-addons-add-to-links-url-event-delay' ) || 0;
							if ( delay > 0 ) {
								setTimeout( function() {
									trx_addons_add_extra_args_to_links( TRX_ADDONS_STORAGE['add_to_links_url'] );
								}, delay );
							} else {
								trx_addons_add_extra_args_to_links( TRX_ADDONS_STORAGE['add_to_links_url'] );
							}
						} );
				}
			}
		}

		// First run init fields
		//----------------------------------------------------
		trx_addons_admin_init_fields();

		$document.on( 'action.init_hidden_elements', trx_addons_admin_init_fields );

		// Fix for WordPress 5.8+ Widgets Block Editor
		//$document.on( 'widget-added', function ( $control ) {
		//	$document.trigger( 'action.init_hidden_elements', [ jQuery( $control ) ] );
		//} );

		// Init hidden elements after the page is loaded
		setTimeout( function() {
			$document.trigger( 'action.init_hidden_elements', [ $body ] );
		}, 0 );
	} );

	

	// Init fields at first run and after clone group
	// -------------------------------------------------------------------------------------
	function trx_addons_admin_init_fields(e, container) {
		
//		if (container === undefined) container = $body;
		container = $body;
	
		// Init jQuery Tabs
		if ( jQuery.ui && jQuery.ui.tabs ) {
			var $tabs = container.find( '.trx_addons_tabs_vertical:not(.inited)' );
			if ( $tabs.length > 0 ) {
				$tabs
					.on( 'click', '.trx_addons_tabs_title:not(.trx_addons_tabs_title_sub)', function(e) {
						var sup = jQuery(this),
							stop = false,
							first = true;
						sup.siblings( '.trx_addons_tabs_title_super' ).removeClass( 'ui-tabs-active ui-state-active ui-state-focus' );
						sup.siblings( '.trx_addons_tabs_title_sub' ).stop().slideUp();
						sup.nextAll().each( function() {
							var sub = jQuery(this);
							if ( ! stop ) {
								if ( sub.hasClass( 'trx_addons_tabs_title_sub' ) ) {
									sub.stop().slideDown();
									if ( first ) {
										first = false;
										sup.removeClass('ui-state-focus');							
										sub.addClass('ui-tabs-active ui-state-active ui-state-focus');							
									}
								} else {
									stop = true;
								}
							}
						});
						// Animated scroll to the top of the tabs block
						trx_addons_document_animate_to( jQuery( '.trx_addons_options' ).eq(0) );
					} )
					.on( 'click', '.trx_addons_tabs_title_sub', function(e) {
						var sub = jQuery(this),
							prev = sub.prev(),
							stop = false;
						sub.siblings( '.trx_addons_tabs_title_sub' ).removeClass( 'ui-tabs-active ui-state-active ui-state-focus' );
						while ( prev.length == 1 ) {
							if ( prev.hasClass( 'trx_addons_tabs_title_super' ) ) {
								prev.addClass('ui-tabs-active ui-state-active ui-state-focus');
								break;
							}
							prev = prev.prev();
						}
						// Animated scroll to the top of the tabs block
						trx_addons_document_animate_to( jQuery( '.trx_addons_options' ).eq(0) );
					} );
			}
			// Init all tabs
			container.find('.trx_addons_tabs:not(.inited)')
				.addClass('inited')
				.tabs( {
					create: function( event, ui ) {
						if (ui.panel.length > 0) $document.trigger('admin_action.init_hidden_elements', [ui.panel]);
					},
					activate: function( event, ui ) {
						if (ui.newPanel.length > 0) $document.trigger('admin_action.init_hidden_elements', [ui.newPanel]);
					}
				} );
			// Check hash and open tab
			var hash  = window.location.hash;
			if (hash && jQuery('a[href="'+hash+'"]').length > 0) {
				setTimeout(function() {
					jQuery('a[href="'+hash+'"]').trigger('click');
				}, 10);
			}
			// Open first panel
			if ( $tabs.length > 0 ) {
				$tabs.each( function() {
					var $first_title = jQuery( this ).find( '.trx_addons_tabs_title' ).eq(0);
					if ( $first_title.length > 0 && $first_title.hasClass( 'trx_addons_tabs_title_super' ) ) {
						$first_title.trigger( 'click' );
					}
				} );
			}
		}
		
		// Init jQuery Accordion
		if ( jQuery.ui && jQuery.ui.accordion ) {
			container.find('.trx_addons_accordion:not(.inited)')
				.addClass('inited')
				.accordion({
					'header': '.trx_addons_accordion_title',
					'heightStyle': 'content',
					create: function( event, ui ) {
						if (ui.panel.length > 0) $document.trigger('admin_action.init_hidden_elements', [ui.panel]);
					},
					activate: function( event, ui ) {
						if (ui.newPanel.length > 0) $document.trigger('admin_action.init_hidden_elements', [ui.newPanel]);
					}
				});
		}

		// Standard WP Color Picker
		if ( container.find('.trx_addons_color_selector:not(.inited)').length > 0 ) {
			container.find('.trx_addons_color_selector:not(.inited)')
				.addClass('inited')
				.wpColorPicker({
					// you can declare a default color here,
					// or in the data-default-color attribute on the input
					//defaultColor: false,
			
					// a callback to fire whenever the color changes to a valid color
					change: function(e, ui){
						jQuery(e.target).val(ui.color).trigger('change');
					},
			
					// a callback to fire when the input is emptied or an invalid color
					clear: function(e) {
						jQuery(e.target).prev().trigger('change');
					}
			
					// hide the color picker controls on load
					//hide: true,
			
					// show a group of common colors beneath the square
					// or, supply an array of colors to customize further
					//palettes: true
				});
		}
		
		// Icon selector
		// Attention! Init container, because icon_selector appear in a cloneable blocks
		if ( ! container.hasClass( 'trx_addons_icon_selector_inited' ) ) {
			container
				.addClass('trx_addons_icon_selector_inited')
				.on( 'keydown', '.trx_addons_icon_selector', function( e ) {
					// If 'Enter' or 'Space' is pressed - switch state of the icons list
					if ( [ 13, 32 ].indexOf( e.which ) >= 0 ) {
						jQuery( this ).trigger( 'click' );
						e.preventDefault();
						return false;
					}
					return true;
				})
				.on('click', '.trx_addons_icon_selector', function(e) {
					var selector = jQuery(this);
					var list = selector.next('.trx_addons_list_icons');
					if (list.length > 0) {
						if (list.css('display') == 'block') {
							list.fadeOut(100);	//.slideUp();
							selector.get(0).focus();
						} else {
							var css_obj = {};
							if (selector.parents('#trx_addons_meta_box').length > 0) {
								css_obj = { 
									'position': 'relative',
									'left': 'auto',
									'top': 'auto'
								};
							} else {
								var pos = selector.position();
								css_obj = {
									'position': 'absolute',
									'left': pos.left,
									'top': pos.top+selector.height()+10
								};
							}
							list.find('.trx_addons_list_icons_search').val('');
							list.find('span').removeClass('trx_addons_list_hidden');
							list.css(css_obj)
								//.slideDown( function() {
								.fadeIn( 100, function() {
																	list.find('.trx_addons_list_icons_search').get(0).focus();
																});
						}
					}
					e.preventDefault();
					return false;
				})
				.on('keyup', '.trx_addons_list_icons_search', function(e) {
					var list = jQuery(this).parent(),
						val = jQuery(this).val();
					list.find('span').removeClass('trx_addons_list_hidden');
					if (val !== '') list.find('span:not([data-icon*="'+val+'"])').addClass('trx_addons_list_hidden');
				})
				.on( 'keydown', '.trx_addons_list_icons span', function( e ) {
					var handled = false,
						icons = jQuery( this ).siblings( 'span' );
					// If 'Enter' or 'Space' is pressed - switch state of the icons list
					if ( [ 13, 32 ].indexOf( e.which ) >= 0 ) {
						jQuery( this ).trigger( 'click' );
						handled = true;
					} else if ( 37 == e.which ) {
						icons.get( Math.max( 0, jQuery( this ).index() - 1 ) ).focus();
						handled = true;
					} else if ( 38 == e.which ) {
						icons.get( Math.max( 0, jQuery( this ).index() - 8 ) ).focus();
						handled = true;
					} else if ( 39 == e.which ) {
						icons.get( Math.min( icons.length - 1, jQuery( this ).index() ) ).focus();
						handled = true;
					} else if ( 40 == e.which ) {
						icons.get( Math.min( icons.length - 1, jQuery( this ).index() + 7 ) ).focus();
						handled = true;
					} else if ( [ 27 ].indexOf( e.which ) >= 0 ) {
						jQuery( this ).parents('.trx_addons_list_icons').prev('.trx_addons_icon_selector').trigger('click');
						handled = true;
					}
					if ( handled ) {
						e.preventDefault();
						return false;
					}
					return true;
				})
				.on('click', '.trx_addons_list_icons span', function(e) {
					var list = jQuery(this).parents('.trx_addons_list_icons');
					list.find('.trx_addons_active').removeClass('trx_addons_active');
					var selector = list.prev('.trx_addons_icon_selector');
					var input = selector.length==1 ? selector.prev('input') : list.prev('input');
					var icon = jQuery(this).addClass('trx_addons_active').data('icon');
					input.val(icon).trigger('change');
					if (selector.length > 0) {
						list.fadeOut();
						var bg = jQuery( this ).css( 'background-image' );
						selector
							.attr('class', trx_addons_chg_icon_class(selector.attr('class'), bg && bg != 'none' ? 'image-selected' : icon))
							.css('background-image', bg && bg != 'none' ? bg : 'none')
							.get(0).focus();
					}
					e.preventDefault();
					return false;
				});
		}
		
		// Media selector
		container.find('#customize-theme-controls:not(.inited)'
						+',.widget-liquid-right:not(.inited)'
						+',.widgets-holder-wrap:not(.inited)'
						+',.widget_field_type_image:not(.inited)'
						+',.form-field:not(.inited)'
						+',.trx_addons_options_item_field:not(.inited)'
						+',.postbox-container:not(.inited)'
						+',#elementor-panel:not(.inited_media_selector)'
						+',.edit-widgets-block-editor:not(.inited)'
						)
			.addClass('inited inited_media_selector')
			.on('click', '.trx_addons_media_selector', function(e) {
				trx_addons_show_media_manager(this);
				e.preventDefault();
				return false;
			})
			.on( 'keydown', '.trx_addons_media_selector_preview > .trx_addons_media_selector_preview_image', function(e) {
				// If 'Enter' or 'Space' is pressed - remove image
				if ( [ 13, 32 ].indexOf( e.which ) >= 0 ) {
					jQuery( this ).trigger('click');
					e.preventDefault();
					return false;
				}
				return true;
			} )
			.on( 'click', '.trx_addons_media_selector_preview > .trx_addons_media_selector_preview_image', function(e) {
				var image = jQuery(this),
					preview = image.parent(),
					button = preview.siblings('.trx_addons_media_selector'),
					field = jQuery('#'+button.data('linked-field'));
				if (field.length === 0) return true;
				if (button.data('multiple') == 1) {
					var val = field.val().split('|');
					val.splice(image.index(), 1);
					field.val(val.join('|'));
					image.remove();
				} else {
					field.val('');
					image.remove();
				}
				preview.toggleClass('trx_addons_media_selector_preview_with_image', preview.find('> .trx_addons_media_selector_preview_image').length > 0);
				e.preventDefault();
				return false;
			} );

	}
	
	
	// Show WP Media manager to select image
	// -------------------------------------------------------------------------------------
	function trx_addons_show_media_manager(el) {
	
		var media_id = jQuery(el).attr('id');
		TRX_ADDONS_STORAGE['media_link'][media_id] = jQuery(el);
		// If the media frame already exists, reopen it.
		if ( TRX_ADDONS_STORAGE['media_frame'][media_id] ) {
			TRX_ADDONS_STORAGE['media_frame'][media_id].open();
			return false;
		}
	
		// Create the media frame
		var type = TRX_ADDONS_STORAGE['media_link'][media_id].data('type') 
						? TRX_ADDONS_STORAGE['media_link'][media_id].data('type') 
						: 'image';
		var args = {
			// Set the title of the modal.
			title: TRX_ADDONS_STORAGE['media_link'][media_id].data('choose'),
			// Multiple choise
			multiple: TRX_ADDONS_STORAGE['media_link'][media_id].data('multiple')==1 
						? 'add' 
						: false,
			// Customize the submit button.
			button: {
				// Set the text of the button.
				text: TRX_ADDONS_STORAGE['media_link'][media_id].data('update'),
				// Tell the button not to close the modal, since we're
				// going to refresh the page when the image is selected.
				close: true
			}
		};
		// Allow sizes and filters for the images
		if (type == 'image') {
			args['frame'] = 'post';
		}
		// Tell the modal to show only selected post types
		if (type == 'image' || type == 'audio' || type == 'video') {
			args['library'] = {
				type: type
			};
		}
		TRX_ADDONS_STORAGE['media_frame'][media_id] = wp.media(args);
	
		// When an image is selected, run a callback.
		TRX_ADDONS_STORAGE['media_frame'][media_id].on( 'insert select', function(selection) {
			// Grab the selected attachment.
			var field = jQuery("#"+TRX_ADDONS_STORAGE['media_link'][media_id].data('linked-field')).eq(0);
			var attachment = null, attachment_url = '';
			if (TRX_ADDONS_STORAGE['media_link'][media_id].data('multiple')==1) {
				TRX_ADDONS_STORAGE['media_frame'][media_id].state().get('selection').map( function( att ) {
					attachment_url += (attachment_url ? "|" : "") + att.toJSON().url;
				});
				var val = field.val();
				attachment_url = val + (val ? "|" : '') + attachment_url;
			} else {
				attachment = TRX_ADDONS_STORAGE['media_frame'][media_id].state().get('selection').first().toJSON();
				attachment_url = attachment.url;
				// Get attachment size (for compatibility with old versions)
				if ( false && type == 'image' ) {
					var sizes_selector = jQuery('.media-modal-content .attachment-display-settings select.size');
					if (sizes_selector.length > 0) {
						var size = trx_addons_get_listbox_selected_value(sizes_selector.get(0));
						if (size !== '') attachment_url = attachment.sizes[size].url;
					}
				}
			}
			// Display images in the preview area
			var preview = field.siblings('.trx_addons_media_selector_preview');
			if (preview.length === 0) {
				jQuery('<span class="trx_addons_media_selector_preview"></span>').insertAfter(field);
				preview = field.siblings('.trx_addons_media_selector_preview');
			}
			if (preview.length !== 0) preview.find('.trx_addons_media_selector_preview_image').remove();
			var images = attachment_url.split("|");
			for (var i=0; i < images.length; i++) {
				if (preview.length !== 0) {
					var ext = trx_addons_get_file_ext(images[i]);
					preview.append('<span class="trx_addons_media_selector_preview_image" tabindex="0">'
									+ (ext=='gif' || ext=='jpg' || ext=='jpeg' || ext=='png' 
											? '<img src="'+images[i]+'">'
											: '<a href="'+images[i]+'">'+trx_addons_get_file_name(images[i])+'</a>'
										)
									+ '</span>');
				}
			}
			preview.toggleClass('trx_addons_media_selector_preview_with_image', preview.find('> .trx_addons_media_selector_preview_image').length > 0);
			// Update field
			field.val(attachment_url).trigger('change');
		});
	
		// Finally, open the modal.
		TRX_ADDONS_STORAGE['media_frame'][media_id].open();
		return false;
	}


	// Rotate banners (global)
	window.trx_addons_banners_rotator = function( banners_wrap ) {
		var banners = jQuery( banners_wrap + ' .trx_banners_item' );
		if ( banners.length === 0 ) {
			return;
		}
		var active = jQuery( banners_wrap + ' .trx_banners_item_active' ).index(),
			next = ( active + 1 ) % banners.length,
			duration = 20000;
		if ( active >= 0 ) {
			banners.eq( active ).fadeOut( function() {
				jQuery( this ).removeClass( 'trx_banners_item_active' );
				banners.eq( next ).fadeIn().addClass( 'trx_banners_item_active' );
			});
		} else {
			banners.eq( next ).fadeIn().addClass( 'trx_banners_item_active' );
		}
		if ( ! isNaN( banners.eq( next ).data( 'duration' ) ) ) {
			duration = Math.max( 1000, Math.min( 60000, Number( banners.eq( next ).data( 'duration' ) ) ) );
		}
		setTimeout( function() { trx_addons_banners_rotator( banners_wrap ); }, duration );
	};

})();