' );\n\t\t\t\t\t$parent.append( $ul );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// append\n\t\t\t$ul.append( $li );\n\t\t},\n\n\t\tselectTerm: function ( id ) {\n\t\t\tif ( this.getRelatedType() == 'select' ) {\n\t\t\t\tthis.select2.selectOption( id );\n\t\t\t} else {\n\t\t\t\tvar $input = this.$( 'input[value=\"' + id + '\"]' );\n\t\t\t\t$input.prop( 'checked', true ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\tonClickRadio: function ( e, $el ) {\n\t\t\t// vars\n\t\t\tvar $label = $el.parent( 'label' );\n\t\t\tvar selected = $label.hasClass( 'selected' );\n\n\t\t\t// remove previous selected\n\t\t\tthis.$( '.selected' ).removeClass( 'selected' );\n\n\t\t\t// add active class\n\t\t\t$label.addClass( 'selected' );\n\n\t\t\t// allow null\n\t\t\tif ( this.get( 'allow_null' ) && selected ) {\n\t\t\t\t$label.removeClass( 'selected' );\n\t\t\t\t$el.prop( 'checked', false ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.models.DatePickerField.extend( {\n\t\ttype: 'time_picker',\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-time-picker' );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// vars\n\t\t\tvar $input = this.$input();\n\t\t\tvar $inputText = this.$inputText();\n\n\t\t\t// args\n\t\t\tvar args = {\n\t\t\t\ttimeFormat: this.get( 'time_format' ),\n\t\t\t\taltField: $input,\n\t\t\t\taltFieldTimeOnly: false,\n\t\t\t\taltTimeFormat: 'HH:mm:ss',\n\t\t\t\tshowButtonPanel: true,\n\t\t\t\tcontrolType: 'select',\n\t\t\t\toneLine: true,\n\t\t\t\tcloseText: acf.get( 'dateTimePickerL10n' ).selectText,\n\t\t\t\ttimeOnly: true,\n\t\t\t};\n\n\t\t\t// add custom 'Close = Select' functionality\n\t\t\targs.onClose = function ( value, dp_instance, t_instance ) {\n\t\t\t\t// vars\n\t\t\t\tvar $close = dp_instance.dpDiv.find( '.ui-datepicker-close' );\n\n\t\t\t\t// if clicking close button\n\t\t\t\tif ( ! value && $close.is( ':hover' ) ) {\n\t\t\t\t\tt_instance._updateDateTime();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// filter\n\t\t\targs = acf.applyFilters( 'time_picker_args', args, this );\n\n\t\t\t// add date time picker\n\t\t\tacf.newTimePicker( $inputText, args );\n\n\t\t\t// action\n\t\t\tacf.doAction( 'time_picker_init', $inputText, args, this );\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n\n\t// add\n\tacf.newTimePicker = function ( $input, args ) {\n\t\t// bail early if no datepicker library\n\t\tif ( typeof $.timepicker === 'undefined' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// defaults\n\t\targs = args || {};\n\n\t\t// initialize\n\t\t$input.timepicker( args );\n\n\t\t// wrap the datepicker (only if it hasn't already been wrapped)\n\t\tif ( $( 'body > #ui-datepicker-div' ).exists() ) {\n\t\t\t$( 'body > #ui-datepicker-div' ).wrap(\n\t\t\t\t''\n\t\t\t);\n\t\t}\n\t};\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'true_false',\n\n\t\tevents: {\n\t\t\t'change .acf-switch-input': 'onChange',\n\t\t\t'focus .acf-switch-input': 'onFocus',\n\t\t\t'blur .acf-switch-input': 'onBlur',\n\t\t\t'keypress .acf-switch-input': 'onKeypress',\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'input[type=\"checkbox\"]' );\n\t\t},\n\n\t\t$switch: function () {\n\t\t\treturn this.$( '.acf-switch' );\n\t\t},\n\n\t\tgetValue: function () {\n\t\t\treturn this.$input().prop( 'checked' ) ? 1 : 0;\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\tthis.render();\n\t\t},\n\n\t\trender: function () {\n\t\t\t// vars\n\t\t\tvar $switch = this.$switch();\n\n\t\t\t// bail early if no $switch\n\t\t\tif ( ! $switch.length ) return;\n\n\t\t\t// vars\n\t\t\tvar $on = $switch.children( '.acf-switch-on' );\n\t\t\tvar $off = $switch.children( '.acf-switch-off' );\n\t\t\tvar width = Math.max( $on.width(), $off.width() );\n\n\t\t\t// bail early if no width\n\t\t\tif ( ! width ) return;\n\n\t\t\t// set widths\n\t\t\t$on.css( 'min-width', width );\n\t\t\t$off.css( 'min-width', width );\n\t\t},\n\n\t\tswitchOn: function () {\n\t\t\tthis.$input().prop( 'checked', true );\n\t\t\tthis.$switch().addClass( '-on' );\n\t\t},\n\n\t\tswitchOff: function () {\n\t\t\tthis.$input().prop( 'checked', false );\n\t\t\tthis.$switch().removeClass( '-on' );\n\t\t},\n\n\t\tonChange: function ( e, $el ) {\n\t\t\tif ( $el.prop( 'checked' ) ) {\n\t\t\t\tthis.switchOn();\n\t\t\t} else {\n\t\t\t\tthis.switchOff();\n\t\t\t}\n\t\t},\n\n\t\tonFocus: function ( e, $el ) {\n\t\t\tthis.$switch().addClass( '-focus' );\n\t\t},\n\n\t\tonBlur: function ( e, $el ) {\n\t\t\tthis.$switch().removeClass( '-focus' );\n\t\t},\n\n\t\tonKeypress: function ( e, $el ) {\n\t\t\t// left\n\t\t\tif ( e.keyCode === 37 ) {\n\t\t\t\treturn this.switchOff();\n\t\t\t}\n\n\t\t\t// right\n\t\t\tif ( e.keyCode === 39 ) {\n\t\t\t\treturn this.switchOn();\n\t\t\t}\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'url',\n\n\t\tevents: {\n\t\t\t'keyup input[type=\"url\"]': 'onkeyup',\n\t\t},\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-input-wrap' );\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'input[type=\"url\"]' );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\tthis.render();\n\t\t},\n\n\t\tisValid: function () {\n\t\t\t// vars\n\t\t\tvar val = this.val();\n\n\t\t\t// bail early if no val\n\t\t\tif ( ! val ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// url\n\t\t\tif ( val.indexOf( '://' ) !== -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// protocol relative url\n\t\t\tif ( val.indexOf( '//' ) === 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn false;\n\t\t},\n\n\t\trender: function () {\n\t\t\t// add class\n\t\t\tif ( this.isValid() ) {\n\t\t\t\tthis.$control().addClass( '-valid' );\n\t\t\t} else {\n\t\t\t\tthis.$control().removeClass( '-valid' );\n\t\t\t}\n\t\t},\n\n\t\tonkeyup: function ( e, $el ) {\n\t\t\tthis.render();\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.models.SelectField.extend( {\n\t\ttype: 'user',\n\t} );\n\n\tacf.registerFieldType( Field );\n\n\tacf.addFilter(\n\t\t'select2_ajax_data',\n\t\tfunction ( data, args, $input, field, select2 ) {\n\t\t\tif ( ! field ) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\tconst query_nonce = field.get( 'queryNonce' );\n\t\t\tif ( query_nonce && query_nonce.length ) {\n\t\t\t\tdata.user_query_nonce = query_nonce;\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\t);\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'wysiwyg',\n\n\t\twait: 'load',\n\n\t\tevents: {\n\t\t\t'mousedown .acf-editor-wrap.delay': 'onMousedown',\n\t\t\tunmountField: 'disableEditor',\n\t\t\tremountField: 'enableEditor',\n\t\t\tremoveField: 'disableEditor',\n\t\t},\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-editor-wrap' );\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'textarea' );\n\t\t},\n\n\t\tgetMode: function () {\n\t\t\treturn this.$control().hasClass( 'tmce-active' )\n\t\t\t\t? 'visual'\n\t\t\t\t: 'text';\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// initializeEditor if no delay\n\t\t\tif ( ! this.$control().hasClass( 'delay' ) ) {\n\t\t\t\tthis.initializeEditor();\n\t\t\t}\n\t\t},\n\n\t\tinitializeEditor: function () {\n\t\t\t// vars\n\t\t\tvar $wrap = this.$control();\n\t\t\tvar $textarea = this.$input();\n\t\t\tvar args = {\n\t\t\t\ttinymce: true,\n\t\t\t\tquicktags: true,\n\t\t\t\ttoolbar: this.get( 'toolbar' ),\n\t\t\t\tmode: this.getMode(),\n\t\t\t\tfield: this,\n\t\t\t};\n\n\t\t\t// generate new id\n\t\t\tvar oldId = $textarea.attr( 'id' );\n\t\t\tvar newId = acf.uniqueId( 'acf-editor-' );\n\n\t\t\t// Backup textarea data.\n\t\t\tvar inputData = $textarea.data();\n\t\t\tvar inputVal = $textarea.val();\n\n\t\t\t// rename\n\t\t\tacf.rename( {\n\t\t\t\ttarget: $wrap,\n\t\t\t\tsearch: oldId,\n\t\t\t\treplace: newId,\n\t\t\t\tdestructive: true,\n\t\t\t} );\n\n\t\t\t// update id\n\t\t\tthis.set( 'id', newId, true );\n\n\t\t\t// apply data to new textarea (acf.rename creates a new textarea element due to destructive mode)\n\t\t\t// fixes bug where conditional logic \"disabled\" is lost during \"screen_check\"\n\t\t\tthis.$input().data( inputData ).val( inputVal );\n\n\t\t\t// initialize\n\t\t\tacf.tinymce.initialize( newId, args );\n\t\t},\n\n\t\tonMousedown: function ( e ) {\n\t\t\t// prevent default\n\t\t\te.preventDefault();\n\n\t\t\t// remove delay class\n\t\t\tvar $wrap = this.$control();\n\t\t\t$wrap.removeClass( 'delay' );\n\t\t\t$wrap.find( '.acf-editor-toolbar' ).remove();\n\n\t\t\t// initialize\n\t\t\tthis.initializeEditor();\n\t\t},\n\n\t\tenableEditor: function () {\n\t\t\tif ( this.getMode() == 'visual' ) {\n\t\t\t\tacf.tinymce.enable( this.get( 'id' ) );\n\t\t\t}\n\t\t},\n\n\t\tdisableEditor: function () {\n\t\t\tacf.tinymce.destroy( this.get( 'id' ) );\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t// vars\n\tvar storage = [];\n\n\t/**\n\t * acf.Field\n\t *\n\t * description\n\t *\n\t * @date\t23/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.Field = acf.Model.extend( {\n\t\t// field type\n\t\ttype: '',\n\n\t\t// class used to avoid nested event triggers\n\t\teventScope: '.acf-field',\n\n\t\t// initialize events on 'ready'\n\t\twait: 'ready',\n\n\t\t/**\n\t\t * setup\n\t\t *\n\t\t * Called during the constructor function to setup this field ready for initialization\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tjQuery $field The field element.\n\t\t * @return\tvoid\n\t\t */\n\n\t\tsetup: function ( $field ) {\n\t\t\t// set $el\n\t\t\tthis.$el = $field;\n\n\t\t\t// inherit $field data\n\t\t\tthis.inherit( $field );\n\n\t\t\t// inherit controll data\n\t\t\tthis.inherit( this.$control() );\n\t\t},\n\n\t\t/**\n\t\t * val\n\t\t *\n\t\t * Sets or returns the field's value\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tmixed val Optional. The value to set\n\t\t * @return\tmixed\n\t\t */\n\n\t\tval: function ( val ) {\n\t\t\t// Set.\n\t\t\tif ( val !== undefined ) {\n\t\t\t\treturn this.setValue( val );\n\n\t\t\t\t// Get.\n\t\t\t} else {\n\t\t\t\treturn this.prop( 'disabled' ) ? null : this.getValue();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * getValue\n\t\t *\n\t\t * returns the field's value\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tmixed\n\t\t */\n\n\t\tgetValue: function () {\n\t\t\treturn this.$input().val();\n\t\t},\n\n\t\t/**\n\t\t * setValue\n\t\t *\n\t\t * sets the field's value and returns true if changed\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tmixed val\n\t\t * @return\tboolean. True if changed.\n\t\t */\n\n\t\tsetValue: function ( val ) {\n\t\t\treturn acf.val( this.$input(), val );\n\t\t},\n\n\t\t/**\n\t\t * __\n\t\t *\n\t\t * i18n helper to be removed\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t__: function ( string ) {\n\t\t\treturn acf._e( this.type, string );\n\t\t},\n\n\t\t/**\n\t\t * $control\n\t\t *\n\t\t * returns the control jQuery element used for inheriting data. Uses this.control setting.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tjQuery\n\t\t */\n\n\t\t$control: function () {\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * $input\n\t\t *\n\t\t * returns the input jQuery element used for saving values. Uses this.input setting.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tjQuery\n\t\t */\n\n\t\t$input: function () {\n\t\t\treturn this.$( '[name]:first' );\n\t\t},\n\n\t\t/**\n\t\t * $inputWrap\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t12/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t$inputWrap: function () {\n\t\t\treturn this.$( '.acf-input:first' );\n\t\t},\n\n\t\t/**\n\t\t * $inputWrap\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t12/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t$labelWrap: function () {\n\t\t\treturn this.$( '.acf-label:first' );\n\t\t},\n\n\t\t/**\n\t\t * getInputName\n\t\t *\n\t\t * Returns the field's input name\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tstring\n\t\t */\n\n\t\tgetInputName: function () {\n\t\t\treturn this.$input().attr( 'name' ) || '';\n\t\t},\n\n\t\t/**\n\t\t * parent\n\t\t *\n\t\t * returns the field's parent field or false on failure.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tobject|false\n\t\t */\n\n\t\tparent: function () {\n\t\t\t// vars\n\t\t\tvar parents = this.parents();\n\n\t\t\t// return\n\t\t\treturn parents.length ? parents[ 0 ] : false;\n\t\t},\n\n\t\t/**\n\t\t * parents\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t9/7/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\tparents: function () {\n\t\t\t// vars\n\t\t\tvar $parents = this.$el.parents( '.acf-field' );\n\n\t\t\t// convert\n\t\t\tvar parents = acf.getFields( $parents );\n\n\t\t\t// return\n\t\t\treturn parents;\n\t\t},\n\n\t\tshow: function ( lockKey, context ) {\n\t\t\t// show field and store result\n\t\t\tvar changed = acf.show( this.$el, lockKey );\n\n\t\t\t// do action if visibility has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'hidden', false );\n\t\t\t\tacf.doAction( 'show_field', this, context );\n\n\t\t\t\tif ( context === 'conditional_logic' ) {\n\t\t\t\t\tthis.setFieldSettingsLastVisible();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\thide: function ( lockKey, context ) {\n\t\t\t// hide field and store result\n\t\t\tvar changed = acf.hide( this.$el, lockKey );\n\n\t\t\t// do action if visibility has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'hidden', true );\n\t\t\t\tacf.doAction( 'hide_field', this, context );\n\n\t\t\t\tif ( context === 'conditional_logic' ) {\n\t\t\t\t\tthis.setFieldSettingsLastVisible();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tsetFieldSettingsLastVisible: function () {\n\t\t\t// Ensure this conditional logic trigger has happened inside a field settings tab.\n\t\t\tvar $parents = this.$el.parents( '.acf-field-settings-main' );\n\t\t\tif ( ! $parents.length ) return;\n\n\t\t\tvar $fields = $parents.find( '.acf-field' );\n\n\t\t\t$fields.removeClass( 'acf-last-visible' );\n\t\t\t$fields.not( '.acf-hidden' ).last().addClass( 'acf-last-visible' );\n\t\t},\n\n\t\tenable: function ( lockKey, context ) {\n\t\t\t// enable field and store result\n\t\t\tvar changed = acf.enable( this.$el, lockKey );\n\n\t\t\t// do action if disabled has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'disabled', false );\n\t\t\t\tacf.doAction( 'enable_field', this, context );\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tdisable: function ( lockKey, context ) {\n\t\t\t// disabled field and store result\n\t\t\tvar changed = acf.disable( this.$el, lockKey );\n\n\t\t\t// do action if disabled has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'disabled', true );\n\t\t\t\tacf.doAction( 'disable_field', this, context );\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tshowEnable: function ( lockKey, context ) {\n\t\t\t// enable\n\t\t\tthis.enable.apply( this, arguments );\n\n\t\t\t// show and return true if changed\n\t\t\treturn this.show.apply( this, arguments );\n\t\t},\n\n\t\thideDisable: function ( lockKey, context ) {\n\t\t\t// disable\n\t\t\tthis.disable.apply( this, arguments );\n\n\t\t\t// hide and return true if changed\n\t\t\treturn this.hide.apply( this, arguments );\n\t\t},\n\n\t\tshowNotice: function ( props ) {\n\t\t\t// ensure object\n\t\t\tif ( typeof props !== 'object' ) {\n\t\t\t\tprops = { text: props };\n\t\t\t}\n\n\t\t\t// remove old notice\n\t\t\tif ( this.notice ) {\n\t\t\t\tthis.notice.remove();\n\t\t\t}\n\n\t\t\t// create new notice\n\t\t\tprops.target = this.$inputWrap();\n\t\t\tthis.notice = acf.newNotice( props );\n\t\t},\n\n\t\tremoveNotice: function ( timeout ) {\n\t\t\tif ( this.notice ) {\n\t\t\t\tthis.notice.away( timeout || 0 );\n\t\t\t\tthis.notice = false;\n\t\t\t}\n\t\t},\n\n\t\tshowError: function ( message ) {\n\t\t\t// add class\n\t\t\tthis.$el.addClass( 'acf-error' );\n\n\t\t\t// add message\n\t\t\tif ( message !== undefined ) {\n\t\t\t\tthis.showNotice( {\n\t\t\t\t\ttext: message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\tdismiss: false,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// action\n\t\t\tacf.doAction( 'invalid_field', this );\n\n\t\t\t// add event\n\t\t\tthis.$el.one(\n\t\t\t\t'focus change',\n\t\t\t\t'input, select, textarea',\n\t\t\t\t$.proxy( this.removeError, this )\n\t\t\t);\n\t\t},\n\n\t\tremoveError: function () {\n\t\t\t// remove class\n\t\t\tthis.$el.removeClass( 'acf-error' );\n\n\t\t\t// remove notice\n\t\t\tthis.removeNotice( 250 );\n\n\t\t\t// action\n\t\t\tacf.doAction( 'valid_field', this );\n\t\t},\n\n\t\ttrigger: function ( name, args, bubbles ) {\n\t\t\t// allow some events to bubble\n\t\t\tif ( name == 'invalidField' ) {\n\t\t\t\tbubbles = true;\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn acf.Model.prototype.trigger.apply( this, [\n\t\t\t\tname,\n\t\t\t\targs,\n\t\t\t\tbubbles,\n\t\t\t] );\n\t\t},\n\t} );\n\n\t/**\n\t * newField\n\t *\n\t * description\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.newField = function ( $field ) {\n\t\t// vars\n\t\tvar type = $field.data( 'type' );\n\t\tvar mid = modelId( type );\n\t\tvar model = acf.models[ mid ] || acf.Field;\n\n\t\t// instantiate\n\t\tvar field = new model( $field );\n\n\t\t// actions\n\t\tacf.doAction( 'new_field', field );\n\n\t\t// return\n\t\treturn field;\n\t};\n\n\t/**\n\t * mid\n\t *\n\t * Calculates the model ID for a field type\n\t *\n\t * @date\t15/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tstring type\n\t * @return\tstring\n\t */\n\n\tvar modelId = function ( type ) {\n\t\treturn acf.strPascalCase( type || '' ) + 'Field';\n\t};\n\n\t/**\n\t * registerFieldType\n\t *\n\t * description\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.registerFieldType = function ( model ) {\n\t\t// vars\n\t\tvar proto = model.prototype;\n\t\tvar type = proto.type;\n\t\tvar mid = modelId( type );\n\n\t\t// store model\n\t\tacf.models[ mid ] = model;\n\n\t\t// store reference\n\t\tstorage.push( type );\n\t};\n\n\t/**\n\t * acf.getFieldType\n\t *\n\t * description\n\t *\n\t * @date\t1/2/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getFieldType = function ( type ) {\n\t\tvar mid = modelId( type );\n\t\treturn acf.models[ mid ] || false;\n\t};\n\n\t/**\n\t * acf.getFieldTypes\n\t *\n\t * description\n\t *\n\t * @date\t1/2/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getFieldTypes = function ( args ) {\n\t\t// defaults\n\t\targs = acf.parseArgs( args, {\n\t\t\tcategory: '',\n\t\t\t// hasValue: true\n\t\t} );\n\n\t\t// clonse available types\n\t\tvar types = [];\n\n\t\t// loop\n\t\tstorage.map( function ( type ) {\n\t\t\t// vars\n\t\t\tvar model = acf.getFieldType( type );\n\t\t\tvar proto = model.prototype;\n\n\t\t\t// check operator\n\t\t\tif ( args.category && proto.category !== args.category ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// append\n\t\t\ttypes.push( model );\n\t\t} );\n\n\t\t// return\n\t\treturn types;\n\t};\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * findFields\n\t *\n\t * Returns a jQuery selection object of acf fields.\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tobject $args {\n\t *\t\tOptional. Arguments to find fields.\n\t *\n\t *\t\t@type string\t\t\tkey\t\t\tThe field's key (data-attribute).\n\t *\t\t@type string\t\t\tname\t\tThe field's name (data-attribute).\n\t *\t\t@type string\t\t\ttype\t\tThe field's type (data-attribute).\n\t *\t\t@type string\t\t\tis\t\t\tjQuery selector to compare against.\n\t *\t\t@type jQuery\t\t\tparent\t\tjQuery element to search within.\n\t *\t\t@type jQuery\t\t\tsibling\t\tjQuery element to search alongside.\n\t *\t\t@type limit\t\t\t\tint\t\t\tThe number of fields to find.\n\t *\t\t@type suppressFilters\tbool\t\tWhether to allow filters to add/remove results. Default behaviour will ignore clone fields.\n\t * }\n\t * @return\tjQuery\n\t */\n\n\tacf.findFields = function ( args ) {\n\t\t// vars\n\t\tvar selector = '.acf-field';\n\t\tvar $fields = false;\n\n\t\t// args\n\t\targs = acf.parseArgs( args, {\n\t\t\tkey: '',\n\t\t\tname: '',\n\t\t\ttype: '',\n\t\t\tis: '',\n\t\t\tparent: false,\n\t\t\tsibling: false,\n\t\t\tlimit: false,\n\t\t\tvisible: false,\n\t\t\tsuppressFilters: false,\n\t\t\texcludeSubFields: false,\n\t\t} );\n\n\t\t// filter args\n\t\tif ( ! args.suppressFilters ) {\n\t\t\targs = acf.applyFilters( 'find_fields_args', args );\n\t\t}\n\n\t\t// key\n\t\tif ( args.key ) {\n\t\t\tselector += '[data-key=\"' + args.key + '\"]';\n\t\t}\n\n\t\t// type\n\t\tif ( args.type ) {\n\t\t\tselector += '[data-type=\"' + args.type + '\"]';\n\t\t}\n\n\t\t// name\n\t\tif ( args.name ) {\n\t\t\tselector += '[data-name=\"' + args.name + '\"]';\n\t\t}\n\n\t\t// is\n\t\tif ( args.is ) {\n\t\t\tselector += args.is;\n\t\t}\n\n\t\t// visibility\n\t\tif ( args.visible ) {\n\t\t\tselector += ':visible';\n\t\t}\n\n\t\tif ( ! args.suppressFilters ) {\n\t\t\tselector = acf.applyFilters(\n\t\t\t\t'find_fields_selector',\n\t\t\t\tselector,\n\t\t\t\targs\n\t\t\t);\n\t\t}\n\n\t\t// query\n\t\tif ( args.parent ) {\n\t\t\t$fields = args.parent.find( selector );\n\t\t\t// exclude sub fields if required (only if a parent is provided)\n\t\t\tif ( args.excludeSubFields ) {\n\t\t\t\t$fields = $fields.not( args.parent.find( '.acf-is-subfields .acf-field' ) );\n\t\t\t}\n\t\t} else if ( args.sibling ) {\n\t\t\t$fields = args.sibling.siblings( selector );\n\t\t} else {\n\t\t\t$fields = $( selector );\n\t\t}\n\n\t\t// filter\n\t\tif ( ! args.suppressFilters ) {\n\t\t\t$fields = $fields.not( '.acf-clone .acf-field' );\n\t\t\t$fields = acf.applyFilters( 'find_fields', $fields );\n\t\t}\n\n\t\t// limit\n\t\tif ( args.limit ) {\n\t\t\t$fields = $fields.slice( 0, args.limit );\n\t\t}\n\n\t\t// return\n\t\treturn $fields;\n\t};\n\n\t/**\n\t * findField\n\t *\n\t * Finds a specific field with jQuery\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tstring key \t\tThe field's key.\n\t * @param\tjQuery $parent\tjQuery element to search within.\n\t * @return\tjQuery\n\t */\n\n\tacf.findField = function ( key, $parent ) {\n\t\treturn acf.findFields( {\n\t\t\tkey: key,\n\t\t\tlimit: 1,\n\t\t\tparent: $parent,\n\t\t\tsuppressFilters: true,\n\t\t} );\n\t};\n\n\t/**\n\t * getField\n\t *\n\t * Returns a field instance\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery|string $field\tjQuery element or field key.\n\t * @return\tobject\n\t */\n\n\tacf.getField = function ( $field ) {\n\t\t// allow jQuery\n\t\tif ( $field instanceof jQuery ) {\n\t\t\t// find fields\n\t\t} else {\n\t\t\t$field = acf.findField( $field );\n\t\t}\n\n\t\t// instantiate\n\t\tvar field = $field.data( 'acf' );\n\t\tif ( ! field ) {\n\t\t\tfield = acf.newField( $field );\n\t\t}\n\n\t\t// return\n\t\treturn field;\n\t};\n\n\t/**\n\t * getFields\n\t *\n\t * Returns multiple field instances\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery|object $fields\tjQuery elements or query args.\n\t * @return\tarray\n\t */\n\n\tacf.getFields = function ( $fields ) {\n\t\t// allow jQuery\n\t\tif ( $fields instanceof jQuery ) {\n\t\t\t// find fields\n\t\t} else {\n\t\t\t$fields = acf.findFields( $fields );\n\t\t}\n\n\t\t// loop\n\t\tvar fields = [];\n\t\t$fields.each( function () {\n\t\t\tvar field = acf.getField( $( this ) );\n\t\t\tfields.push( field );\n\t\t} );\n\n\t\t// return\n\t\treturn fields;\n\t};\n\n\t/**\n\t * findClosestField\n\t *\n\t * Returns the closest jQuery field element\n\t *\n\t * @date\t9/4/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tjQuery $el\n\t * @return\tjQuery\n\t */\n\n\tacf.findClosestField = function ( $el ) {\n\t\treturn $el.closest( '.acf-field' );\n\t};\n\n\t/**\n\t * getClosestField\n\t *\n\t * Returns the closest field instance\n\t *\n\t * @date\t22/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery $el\n\t * @return\tobject\n\t */\n\n\tacf.getClosestField = function ( $el ) {\n\t\tvar $field = acf.findClosestField( $el );\n\t\treturn this.getField( $field );\n\t};\n\n\t/**\n\t * addGlobalFieldAction\n\t *\n\t * Sets up callback logic for global field actions\n\t *\n\t * @date\t15/6/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tstring action\n\t * @return\tvoid\n\t */\n\n\tvar addGlobalFieldAction = function ( action ) {\n\t\t// vars\n\t\tvar globalAction = action;\n\t\tvar pluralAction = action + '_fields'; // ready_fields\n\t\tvar singleAction = action + '_field'; // ready_field\n\n\t\t// global action\n\t\tvar globalCallback = function ( $el /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( action, arguments );\n\n\t\t\t// get args [$el, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// find fields\n\t\t\tvar fields = acf.getFields( { parent: $el } );\n\n\t\t\t// check\n\t\t\tif ( fields.length ) {\n\t\t\t\t// pluralAction\n\t\t\t\tvar pluralArgs = [ pluralAction, fields ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, pluralArgs );\n\t\t\t}\n\t\t};\n\n\t\t// plural action\n\t\tvar pluralCallback = function ( fields /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( pluralAction, arguments );\n\n\t\t\t// get args [fields, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// loop\n\t\t\tfields.map( function ( field, i ) {\n\t\t\t\t//setTimeout(function(){\n\t\t\t\t// singleAction\n\t\t\t\tvar singleArgs = [ singleAction, field ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, singleArgs );\n\t\t\t\t//}, i * 100);\n\t\t\t} );\n\t\t};\n\n\t\t// add actions\n\t\tacf.addAction( globalAction, globalCallback );\n\t\tacf.addAction( pluralAction, pluralCallback );\n\n\t\t// also add single action\n\t\taddSingleFieldAction( action );\n\t};\n\n\t/**\n\t * addSingleFieldAction\n\t *\n\t * Sets up callback logic for single field actions\n\t *\n\t * @date\t15/6/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tstring action\n\t * @return\tvoid\n\t */\n\n\tvar addSingleFieldAction = function ( action ) {\n\t\t// vars\n\t\tvar singleAction = action + '_field'; // ready_field\n\t\tvar singleEvent = action + 'Field'; // readyField\n\n\t\t// single action\n\t\tvar singleCallback = function ( field /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( singleAction, arguments );\n\n\t\t\t// get args [field, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// action variations (ready_field/type=image)\n\t\t\tvar variations = [ 'type', 'name', 'key' ];\n\t\t\tvariations.map( function ( variation ) {\n\t\t\t\t// vars\n\t\t\t\tvar prefix = '/' + variation + '=' + field.get( variation );\n\n\t\t\t\t// singleAction\n\t\t\t\targs = [ singleAction + prefix, field ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, args );\n\t\t\t} );\n\n\t\t\t// event\n\t\t\tif ( singleFieldEvents.indexOf( action ) > -1 ) {\n\t\t\t\tfield.trigger( singleEvent, extraArgs );\n\t\t\t}\n\t\t};\n\n\t\t// add actions\n\t\tacf.addAction( singleAction, singleCallback );\n\t};\n\n\t// vars\n\tvar globalFieldActions = [\n\t\t'prepare',\n\t\t'ready',\n\t\t'load',\n\t\t'append',\n\t\t'remove',\n\t\t'unmount',\n\t\t'remount',\n\t\t'sortstart',\n\t\t'sortstop',\n\t\t'show',\n\t\t'hide',\n\t\t'unload',\n\t];\n\tvar singleFieldActions = [\n\t\t'valid',\n\t\t'invalid',\n\t\t'enable',\n\t\t'disable',\n\t\t'new',\n\t\t'duplicate',\n\t];\n\tvar singleFieldEvents = [\n\t\t'remove',\n\t\t'unmount',\n\t\t'remount',\n\t\t'sortstart',\n\t\t'sortstop',\n\t\t'show',\n\t\t'hide',\n\t\t'unload',\n\t\t'valid',\n\t\t'invalid',\n\t\t'enable',\n\t\t'disable',\n\t\t'duplicate',\n\t];\n\n\t// add\n\tglobalFieldActions.map( addGlobalFieldAction );\n\tsingleFieldActions.map( addSingleFieldAction );\n\n\t/**\n\t * fieldsEventManager\n\t *\n\t * Manages field actions and events\n\t *\n\t * @date\t15/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tvoid\n\t * @param\tvoid\n\t */\n\n\tvar fieldsEventManager = new acf.Model( {\n\t\tid: 'fieldsEventManager',\n\t\tevents: {\n\t\t\t'click .acf-field a[href=\"#\"]': 'onClick',\n\t\t\t'change .acf-field': 'onChange',\n\t\t},\n\t\tonClick: function ( e ) {\n\t\t\t// prevent default of any link with an href of #\n\t\t\te.preventDefault();\n\t\t},\n\t\tonChange: function () {\n\t\t\t// preview hack allows post to save with no title or content\n\t\t\t$( '#_acf_changed' ).val( 1 );\n\n\t\t\tif ( acf.isGutenbergPostEditor() ) {\n\t\t\t\ttry {\n\t\t\t\t\twp.data.dispatch('core/editor').editPost({ meta: { _acf_changed: 1 } });\n\t\t\t\t} catch ( error ) {\n\t\t\t\t\tconsole.log( 'ACF: Failed to update _acf_changed meta', error );\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\t} );\n\n\tvar duplicateFieldsManager = new acf.Model( {\n\t\tid: 'duplicateFieldsManager',\n\t\tactions: {\n\t\t\tduplicate: 'onDuplicate',\n\t\t\tduplicate_fields: 'onDuplicateFields',\n\t\t},\n\t\tonDuplicate: function ( $el, $el2 ) {\n\t\t\tvar fields = acf.getFields( { parent: $el } );\n\t\t\tif ( fields.length ) {\n\t\t\t\tvar $fields = acf.findFields( { parent: $el2 } );\n\t\t\t\tacf.doAction( 'duplicate_fields', fields, $fields );\n\t\t\t}\n\t\t},\n\t\tonDuplicateFields: function ( fields, duplicates ) {\n\t\t\tfields.map( function ( field, i ) {\n\t\t\t\tacf.doAction( 'duplicate_field', field, $( duplicates[ i ] ) );\n\t\t\t} );\n\t\t},\n\t} );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * refreshHelper\n\t *\n\t * description\n\t *\n\t * @date\t1/7/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar refreshHelper = new acf.Model( {\n\t\tpriority: 90,\n\t\tactions: {\n\t\t\tnew_field: 'refresh',\n\t\t\tshow_field: 'refresh',\n\t\t\thide_field: 'refresh',\n\t\t\tremove_field: 'refresh',\n\t\t\tunmount_field: 'refresh',\n\t\t\tremount_field: 'refresh',\n\t\t},\n\t\trefresh: function () {\n\t\t\tacf.refresh();\n\t\t},\n\t} );\n\n\t/**\n\t * mountHelper\n\t *\n\t * Adds compatiblity for the 'unmount' and 'remount' actions added in 5.8.0\n\t *\n\t * @date\t7/3/19\n\t * @since\t5.7.14\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\tvar mountHelper = new acf.Model( {\n\t\tpriority: 1,\n\t\tactions: {\n\t\t\tsortstart: 'onSortstart',\n\t\t\tsortstop: 'onSortstop',\n\t\t},\n\t\tonSortstart: function ( $item ) {\n\t\t\tacf.doAction( 'unmount', $item );\n\t\t},\n\t\tonSortstop: function ( $item ) {\n\t\t\tacf.doAction( 'remount', $item );\n\t\t},\n\t} );\n\n\t/**\n\t * sortableHelper\n\t *\n\t * Adds compatibility for sorting a
element\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\n\tvar sortableHelper = new acf.Model( {\n\t\tactions: {\n\t\t\tsortstart: 'onSortstart',\n\t\t},\n\t\tonSortstart: function ( $item, $placeholder ) {\n\t\t\t// if $item is a tr, apply some css to the elements\n\t\t\tif ( $item.is( 'tr' ) ) {\n\t\t\t\t// replace $placeholder children with a single td\n\t\t\t\t// fixes \"width calculation issues\" due to conditional logic hiding some children\n\t\t\t\t$placeholder.html(\n\t\t\t\t\t'
'\n\t\t\t\t);\n\n\t\t\t\t// add helper class to remove absolute positioning\n\t\t\t\t$item.addClass( 'acf-sortable-tr-helper' );\n\n\t\t\t\t// set fixed widths for children\n\t\t\t\t$item.children().each( function () {\n\t\t\t\t\t$( this ).width( $( this ).width() );\n\t\t\t\t} );\n\n\t\t\t\t// mimic height\n\t\t\t\t$placeholder.height( $item.height() + 'px' );\n\n\t\t\t\t// remove class\n\t\t\t\t$item.removeClass( 'acf-sortable-tr-helper' );\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * duplicateHelper\n\t *\n\t * Fixes browser bugs when duplicating an element\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\n\tvar duplicateHelper = new acf.Model( {\n\t\tactions: {\n\t\t\tafter_duplicate: 'onAfterDuplicate',\n\t\t},\n\t\tonAfterDuplicate: function ( $el, $el2 ) {\n\t\t\t// get original values\n\t\t\tvar vals = [];\n\t\t\t$el.find( 'select' ).each( function ( i ) {\n\t\t\t\tvals.push( $( this ).val() );\n\t\t\t} );\n\n\t\t\t// set duplicate values\n\t\t\t$el2.find( 'select' ).each( function ( i ) {\n\t\t\t\t$( this ).val( vals[ i ] );\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * tableHelper\n\t *\n\t * description\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar tableHelper = new acf.Model( {\n\t\tid: 'tableHelper',\n\n\t\tpriority: 20,\n\n\t\tactions: {\n\t\t\trefresh: 'renderTables',\n\t\t},\n\n\t\trenderTables: function ( $el ) {\n\t\t\t// loop\n\t\t\tvar self = this;\n\t\t\t$( '.acf-table:visible' ).each( function () {\n\t\t\t\tself.renderTable( $( this ) );\n\t\t\t} );\n\t\t},\n\n\t\trenderTable: function ( $table ) {\n\t\t\t// vars\n\t\t\tvar $ths = $table.find( '> thead > tr:visible > th[data-key]' );\n\t\t\tvar $tds = $table.find( '> tbody > tr:visible > td[data-key]' );\n\n\t\t\t// bail early if no thead\n\t\t\tif ( ! $ths.length || ! $tds.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// visiblity\n\t\t\t$ths.each( function ( i ) {\n\t\t\t\t// vars\n\t\t\t\tvar $th = $( this );\n\t\t\t\tvar key = $th.data( 'key' );\n\t\t\t\tvar $cells = $tds.filter( '[data-key=\"' + key + '\"]' );\n\t\t\t\tvar $hidden = $cells.filter( '.acf-hidden' );\n\n\t\t\t\t// always remove empty and allow cells to be hidden\n\t\t\t\t$cells.removeClass( 'acf-empty' );\n\n\t\t\t\t// hide $th if all cells are hidden\n\t\t\t\tif ( $cells.length === $hidden.length ) {\n\t\t\t\t\tacf.hide( $th );\n\n\t\t\t\t\t// force all hidden cells to appear empty\n\t\t\t\t} else {\n\t\t\t\t\tacf.show( $th );\n\t\t\t\t\t$hidden.addClass( 'acf-empty' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// clear width\n\t\t\t$ths.css( 'width', 'auto' );\n\n\t\t\t// get visible\n\t\t\t$ths = $ths.not( '.acf-hidden' );\n\n\t\t\t// vars\n\t\t\tvar availableWidth = 100;\n\t\t\tvar colspan = $ths.length;\n\n\t\t\t// set custom widths first\n\t\t\tvar $fixedWidths = $ths.filter( '[data-width]' );\n\t\t\t$fixedWidths.each( function () {\n\t\t\t\tvar width = $( this ).data( 'width' );\n\t\t\t\t$( this ).css( 'width', width + '%' );\n\t\t\t\tavailableWidth -= width;\n\t\t\t} );\n\n\t\t\t// set auto widths\n\t\t\tvar $auoWidths = $ths.not( '[data-width]' );\n\t\t\tif ( $auoWidths.length ) {\n\t\t\t\tvar width = availableWidth / $auoWidths.length;\n\t\t\t\t$auoWidths.css( 'width', width + '%' );\n\t\t\t\tavailableWidth = 0;\n\t\t\t}\n\n\t\t\t// avoid stretching issue\n\t\t\tif ( availableWidth > 0 ) {\n\t\t\t\t$ths.last().css( 'width', 'auto' );\n\t\t\t}\n\n\t\t\t// update colspan on collapsed\n\t\t\t$tds.filter( '.-collapsed-target' ).each( function () {\n\t\t\t\t// vars\n\t\t\t\tvar $td = $( this );\n\n\t\t\t\t// check if collapsed\n\t\t\t\tif ( $td.parent().hasClass( '-collapsed' ) ) {\n\t\t\t\t\t$td.attr( 'colspan', $ths.length );\n\t\t\t\t} else {\n\t\t\t\t\t$td.removeAttr( 'colspan' );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * fieldsHelper\n\t *\n\t * description\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar fieldsHelper = new acf.Model( {\n\t\tid: 'fieldsHelper',\n\n\t\tpriority: 30,\n\n\t\tactions: {\n\t\t\trefresh: 'renderGroups',\n\t\t},\n\n\t\trenderGroups: function () {\n\t\t\t// loop\n\t\t\tvar self = this;\n\t\t\t$( '.acf-fields:visible' ).each( function () {\n\t\t\t\tself.renderGroup( $( this ) );\n\t\t\t} );\n\t\t},\n\n\t\trenderGroup: function ( $el ) {\n\t\t\t// vars\n\t\t\tvar top = 0;\n\t\t\tvar height = 0;\n\t\t\tvar $row = $();\n\n\t\t\t// get fields\n\t\t\tvar $fields = $el.children( '.acf-field[data-width]:visible' );\n\n\t\t\t// bail early if no fields\n\t\t\tif ( ! $fields.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// bail early if is .-left\n\t\t\tif ( $el.hasClass( '-left' ) ) {\n\t\t\t\t$fields.removeAttr( 'data-width' );\n\t\t\t\t$fields.css( 'width', 'auto' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// reset fields\n\t\t\t$fields.removeClass( '-r0 -c0' ).css( { 'min-height': 0 } );\n\n\t\t\t// loop\n\t\t\t$fields.each( function ( i ) {\n\t\t\t\t// vars\n\t\t\t\tvar $field = $( this );\n\t\t\t\tvar position = $field.position();\n\t\t\t\tvar thisTop = Math.ceil( position.top );\n\t\t\t\tvar thisLeft = Math.ceil( position.left );\n\n\t\t\t\t// detect change in row\n\t\t\t\tif ( $row.length && thisTop > top ) {\n\t\t\t\t\t// set previous heights\n\t\t\t\t\t$row.css( { 'min-height': height + 'px' } );\n\n\t\t\t\t\t// update position due to change in row above\n\t\t\t\t\tposition = $field.position();\n\t\t\t\t\tthisTop = Math.ceil( position.top );\n\t\t\t\t\tthisLeft = Math.ceil( position.left );\n\n\t\t\t\t\t// reset vars\n\t\t\t\t\ttop = 0;\n\t\t\t\t\theight = 0;\n\t\t\t\t\t$row = $();\n\t\t\t\t}\n\n\t\t\t\t// rtl\n\t\t\t\tif ( acf.get( 'rtl' ) ) {\n\t\t\t\t\tthisLeft = Math.ceil(\n\t\t\t\t\t\t$field.parent().width() -\n\t\t\t\t\t\t\t( position.left + $field.outerWidth() )\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// add classes\n\t\t\t\tif ( thisTop == 0 ) {\n\t\t\t\t\t$field.addClass( '-r0' );\n\t\t\t\t} else if ( thisLeft == 0 ) {\n\t\t\t\t\t$field.addClass( '-c0' );\n\t\t\t\t}\n\n\t\t\t\t// get height after class change\n\t\t\t\t// - add 1 for subpixel rendering\n\t\t\t\tvar thisHeight = Math.ceil( $field.outerHeight() ) + 1;\n\n\t\t\t\t// set height\n\t\t\t\theight = Math.max( height, thisHeight );\n\n\t\t\t\t// set y\n\t\t\t\ttop = Math.max( top, thisTop );\n\n\t\t\t\t// append\n\t\t\t\t$row = $row.add( $field );\n\t\t\t} );\n\n\t\t\t// clean up\n\t\t\tif ( $row.length ) {\n\t\t\t\t$row.css( { 'min-height': height + 'px' } );\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * Adds a body class when holding down the \"shift\" key.\n\t *\n\t * @date\t06/05/2020\n\t * @since\t5.9.0\n\t */\n\tvar bodyClassShiftHelper = new acf.Model( {\n\t\tid: 'bodyClassShiftHelper',\n\t\tevents: {\n\t\t\tkeydown: 'onKeyDown',\n\t\t\tkeyup: 'onKeyUp',\n\t\t},\n\t\tisShiftKey: function ( e ) {\n\t\t\treturn e.keyCode === 16;\n\t\t},\n\t\tonKeyDown: function ( e ) {\n\t\t\tif ( this.isShiftKey( e ) ) {\n\t\t\t\t$( 'body' ).addClass( 'acf-keydown-shift' );\n\t\t\t}\n\t\t},\n\t\tonKeyUp: function ( e ) {\n\t\t\tif ( this.isShiftKey( e ) ) {\n\t\t\t\t$( 'body' ).removeClass( 'acf-keydown-shift' );\n\t\t\t}\n\t\t},\n\t} );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * acf.newMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.newMediaPopup = function ( args ) {\n\t\t// args\n\t\tvar popup = null;\n\t\tvar args = acf.parseArgs( args, {\n\t\t\tmode: 'select', // 'select', 'edit'\n\t\t\ttitle: '', // 'Upload Image'\n\t\t\tbutton: '', // 'Select Image'\n\t\t\ttype: '', // 'image', ''\n\t\t\tfield: false, // field instance\n\t\t\tallowedTypes: '', // '.jpg, .png, etc'\n\t\t\tlibrary: 'all', // 'all', 'uploadedTo'\n\t\t\tmultiple: false, // false, true, 'add'\n\t\t\tattachment: 0, // the attachment to edit\n\t\t\tautoOpen: true, // open the popup automatically\n\t\t\topen: function () {}, // callback after close\n\t\t\tselect: function () {}, // callback after select\n\t\t\tclose: function () {}, // callback after close\n\t\t} );\n\n\t\t// initialize\n\t\tif ( args.mode == 'edit' ) {\n\t\t\tpopup = new acf.models.EditMediaPopup( args );\n\t\t} else {\n\t\t\tpopup = new acf.models.SelectMediaPopup( args );\n\t\t}\n\n\t\t// open popup (allow frame customization before opening)\n\t\tif ( args.autoOpen ) {\n\t\t\tsetTimeout( function () {\n\t\t\t\tpopup.open();\n\t\t\t}, 1 );\n\t\t}\n\n\t\t// action\n\t\tacf.doAction( 'new_media_popup', popup );\n\n\t\t// return\n\t\treturn popup;\n\t};\n\n\t/**\n\t * getPostID\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar getPostID = function () {\n\t\tvar postID = acf.get( 'post_id' );\n\t\treturn acf.isNumeric( postID ) ? postID : 0;\n\t};\n\n\t/**\n\t * acf.getMimeTypes\n\t *\n\t * description\n\t *\n\t * @date\t11/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getMimeTypes = function () {\n\t\treturn this.get( 'mimeTypes' );\n\t};\n\n\tacf.getMimeType = function ( name ) {\n\t\t// vars\n\t\tvar allTypes = acf.getMimeTypes();\n\n\t\t// search\n\t\tif ( allTypes[ name ] !== undefined ) {\n\t\t\treturn allTypes[ name ];\n\t\t}\n\n\t\t// some types contain a mixed key such as \"jpg|jpeg|jpe\"\n\t\tfor ( var key in allTypes ) {\n\t\t\tif ( key.indexOf( name ) !== -1 ) {\n\t\t\t\treturn allTypes[ key ];\n\t\t\t}\n\t\t}\n\n\t\t// return\n\t\treturn false;\n\t};\n\n\t/**\n\t * MediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar MediaPopup = acf.Model.extend( {\n\t\tid: 'MediaPopup',\n\t\tdata: {},\n\t\tdefaults: {},\n\t\tframe: false,\n\n\t\tsetup: function ( props ) {\n\t\t\t$.extend( this.data, props );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// vars\n\t\t\tvar options = this.getFrameOptions();\n\n\t\t\t// add states\n\t\t\tthis.addFrameStates( options );\n\n\t\t\t// create frame\n\t\t\tvar frame = wp.media( options );\n\n\t\t\t// add args reference\n\t\t\tframe.acf = this;\n\n\t\t\t// add events\n\t\t\tthis.addFrameEvents( frame, options );\n\n\t\t\t// strore frame\n\t\t\tthis.frame = frame;\n\t\t},\n\n\t\topen: function () {\n\t\t\tthis.frame.open();\n\t\t},\n\n\t\tclose: function () {\n\t\t\tthis.frame.close();\n\t\t},\n\n\t\tremove: function () {\n\t\t\tthis.frame.detach();\n\t\t\tthis.frame.remove();\n\t\t},\n\n\t\tgetFrameOptions: function () {\n\t\t\t// vars\n\t\t\tvar options = {\n\t\t\t\ttitle: this.get( 'title' ),\n\t\t\t\tmultiple: this.get( 'multiple' ),\n\t\t\t\tlibrary: {},\n\t\t\t\tstates: [],\n\t\t\t};\n\n\t\t\t// type\n\t\t\tif ( this.get( 'type' ) ) {\n\t\t\t\toptions.library.type = this.get( 'type' );\n\t\t\t}\n\n\t\t\t// type\n\t\t\tif ( this.get( 'library' ) === 'uploadedTo' ) {\n\t\t\t\toptions.library.uploadedTo = getPostID();\n\t\t\t}\n\n\t\t\t// attachment\n\t\t\tif ( this.get( 'attachment' ) ) {\n\t\t\t\toptions.library.post__in = [ this.get( 'attachment' ) ];\n\t\t\t}\n\n\t\t\t// button\n\t\t\tif ( this.get( 'button' ) ) {\n\t\t\t\toptions.button = {\n\t\t\t\t\ttext: this.get( 'button' ),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn options;\n\t\t},\n\n\t\taddFrameStates: function ( options ) {\n\t\t\t// create query\n\t\t\tvar Query = wp.media.query( options.library );\n\n\t\t\t// add _acfuploader\n\t\t\t// this is super wack!\n\t\t\t// if you add _acfuploader to the options.library args, new uploads will not be added to the library view.\n\t\t\t// this has been traced back to the wp.media.model.Query initialize function (which can't be overriden)\n\t\t\t// Adding any custom args will cause the Attahcments to not observe the uploader queue\n\t\t\t// To bypass this security issue, we add in the args AFTER the Query has been initialized\n\t\t\t// options.library._acfuploader = settings.field;\n\t\t\tif (\n\t\t\t\tthis.get( 'field' ) &&\n\t\t\t\tacf.isset( Query, 'mirroring', 'args' )\n\t\t\t) {\n\t\t\t\tQuery.mirroring.args._acfuploader = this.get( 'field' );\n\t\t\t}\n\n\t\t\t// add states\n\t\t\toptions.states.push(\n\t\t\t\t// main state\n\t\t\t\tnew wp.media.controller.Library( {\n\t\t\t\t\tlibrary: Query,\n\t\t\t\t\tmultiple: this.get( 'multiple' ),\n\t\t\t\t\ttitle: this.get( 'title' ),\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\tfilterable: 'all',\n\t\t\t\t\teditable: true,\n\t\t\t\t\tallowLocalEdits: true,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\t// edit image functionality (added in WP 3.9)\n\t\t\tif ( acf.isset( wp, 'media', 'controller', 'EditImage' ) ) {\n\t\t\t\toptions.states.push( new wp.media.controller.EditImage() );\n\t\t\t}\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// log all events\n\t\t\t//frame.on('all', function( e ) {\n\t\t\t//\tconsole.log( 'frame all: %o', e );\n\t\t\t//});\n\n\t\t\t// add class\n\t\t\tframe.on(\n\t\t\t\t'open',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.closest( '.media-modal' )\n\t\t\t\t\t\t.addClass(\n\t\t\t\t\t\t\t'acf-media-modal -' + this.acf.get( 'mode' )\n\t\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// edit image view\n\t\t\t// source: media-views.js:2410 editImageContent()\n\t\t\tframe.on(\n\t\t\t\t'content:render:edit-image',\n\t\t\t\tfunction () {\n\t\t\t\t\tvar image = this.state().get( 'image' );\n\t\t\t\t\tvar view = new wp.media.view.EditImage( {\n\t\t\t\t\t\tmodel: image,\n\t\t\t\t\t\tcontroller: this,\n\t\t\t\t\t} ).render();\n\t\t\t\t\tthis.content.set( view );\n\n\t\t\t\t\t// after creating the wrapper view, load the actual editor via an ajax call\n\t\t\t\t\tview.loadEditor();\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// update toolbar button\n\t\t\t//frame.on( 'toolbar:create:select', function( toolbar ) {\n\t\t\t//\ttoolbar.view = new wp.media.view.Toolbar.Select({\n\t\t\t//\t\ttext: frame.options._button,\n\t\t\t//\t\tcontroller: this\n\t\t\t//\t});\n\t\t\t//}, frame );\n\n\t\t\t// on select\n\t\t\tframe.on( 'select', function () {\n\t\t\t\t// vars\n\t\t\t\tvar selection = frame.state().get( 'selection' );\n\n\t\t\t\t// if selecting images\n\t\t\t\tif ( selection ) {\n\t\t\t\t\t// loop\n\t\t\t\t\tselection.each( function ( attachment, i ) {\n\t\t\t\t\t\tframe.acf\n\t\t\t\t\t\t\t.get( 'select' )\n\t\t\t\t\t\t\t.apply( frame.acf, [ attachment, i ] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// on close\n\t\t\tframe.on( 'close', function () {\n\t\t\t\t// callback and remove\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tframe.acf.get( 'close' ).apply( frame.acf );\n\t\t\t\t\tframe.acf.remove();\n\t\t\t\t}, 1 );\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * acf.models.SelectMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.models.SelectMediaPopup = MediaPopup.extend( {\n\t\tid: 'SelectMediaPopup',\n\t\tsetup: function ( props ) {\n\t\t\t// default button\n\t\t\tif ( ! props.button ) {\n\t\t\t\tprops.button = acf._x( 'Select', 'verb' );\n\t\t\t}\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.setup.apply( this, arguments );\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// plupload\n\t\t\t// adds _acfuploader param to validate uploads\n\t\t\tif (\n\t\t\t\tacf.isset( _wpPluploadSettings, 'defaults', 'multipart_params' )\n\t\t\t) {\n\t\t\t\t// add _acfuploader so that Uploader will inherit\n\t\t\t\t_wpPluploadSettings.defaults.multipart_params._acfuploader = this.get(\n\t\t\t\t\t'field'\n\t\t\t\t);\n\n\t\t\t\t// remove acf_field so future Uploaders won't inherit\n\t\t\t\tframe.on( 'open', function () {\n\t\t\t\t\tdelete _wpPluploadSettings\n\t\t\t\t\t\t.defaults.multipart_params._acfuploader;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// browse\n\t\t\tframe.on( 'content:activate:browse', function () {\n\t\t\t\t// vars\n\t\t\t\tvar toolbar = false;\n\n\t\t\t\t// populate above vars making sure to allow for failure\n\t\t\t\t// perhaps toolbar does not exist because the frame open is Upload Files\n\t\t\t\ttry {\n\t\t\t\t\ttoolbar = frame.content.get().toolbar;\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tconsole.log( e );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// callback\n\t\t\t\tframe.acf.customizeFilters.apply( frame.acf, [ toolbar ] );\n\t\t\t} );\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.addFrameEvents.apply( this, arguments );\n\t\t},\n\n\t\tcustomizeFilters: function ( toolbar ) {\n\t\t\t// vars\n\t\t\tvar filters = toolbar.get( 'filters' );\n\n\t\t\t// image\n\t\t\tif ( this.get( 'type' ) == 'image' ) {\n\t\t\t\t// update all\n\t\t\t\tfilters.filters.all.text = acf.__( 'All images' );\n\n\t\t\t\t// remove some filters\n\t\t\t\tdelete filters.filters.audio;\n\t\t\t\tdelete filters.filters.video;\n\t\t\t\tdelete filters.filters.image;\n\n\t\t\t\t// update all filters to show images\n\t\t\t\t$.each( filters.filters, function ( i, filter ) {\n\t\t\t\t\tfilter.props.type = filter.props.type || 'image';\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// specific types\n\t\t\tif ( this.get( 'allowedTypes' ) ) {\n\t\t\t\t// convert \".jpg, .png\" into [\"jpg\", \"png\"]\n\t\t\t\tvar allowedTypes = this.get( 'allowedTypes' )\n\t\t\t\t\t.split( ' ' )\n\t\t\t\t\t.join( '' )\n\t\t\t\t\t.split( '.' )\n\t\t\t\t\t.join( '' )\n\t\t\t\t\t.split( ',' );\n\n\t\t\t\t// loop\n\t\t\t\tallowedTypes.map( function ( name ) {\n\t\t\t\t\t// get type\n\t\t\t\t\tvar mimeType = acf.getMimeType( name );\n\n\t\t\t\t\t// bail early if no type\n\t\t\t\t\tif ( ! mimeType ) return;\n\n\t\t\t\t\t// create new filter\n\t\t\t\t\tvar newFilter = {\n\t\t\t\t\t\ttext: mimeType,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tstatus: null,\n\t\t\t\t\t\t\ttype: mimeType,\n\t\t\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\t\t\torderby: 'date',\n\t\t\t\t\t\t\torder: 'DESC',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpriority: 20,\n\t\t\t\t\t};\n\n\t\t\t\t\t// append\n\t\t\t\t\tfilters.filters[ mimeType ] = newFilter;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// uploaded to post\n\t\t\tif ( this.get( 'library' ) === 'uploadedTo' ) {\n\t\t\t\t// vars\n\t\t\t\tvar uploadedTo = this.frame.options.library.uploadedTo;\n\n\t\t\t\t// remove some filters\n\t\t\t\tdelete filters.filters.unattached;\n\t\t\t\tdelete filters.filters.uploaded;\n\n\t\t\t\t// add uploadedTo to filters\n\t\t\t\t$.each( filters.filters, function ( i, filter ) {\n\t\t\t\t\tfilter.text +=\n\t\t\t\t\t\t' (' + acf.__( 'Uploaded to this post' ) + ')';\n\t\t\t\t\tfilter.props.uploadedTo = uploadedTo;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// add _acfuploader to filters\n\t\t\tvar field = this.get( 'field' );\n\t\t\t$.each( filters.filters, function ( k, filter ) {\n\t\t\t\tfilter.props._acfuploader = field;\n\t\t\t} );\n\n\t\t\t// add _acfuplaoder to search\n\t\t\tvar search = toolbar.get( 'search' );\n\t\t\tsearch.model.attributes._acfuploader = field;\n\n\t\t\t// render (custom function added to prototype)\n\t\t\tif ( filters.renderFilters ) {\n\t\t\t\tfilters.renderFilters();\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * acf.models.EditMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.models.EditMediaPopup = MediaPopup.extend( {\n\t\tid: 'SelectMediaPopup',\n\t\tsetup: function ( props ) {\n\t\t\t// default button\n\t\t\tif ( ! props.button ) {\n\t\t\t\tprops.button = acf._x( 'Update', 'verb' );\n\t\t\t}\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.setup.apply( this, arguments );\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// add class\n\t\t\tframe.on(\n\t\t\t\t'open',\n\t\t\t\tfunction () {\n\t\t\t\t\t// add class\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.closest( '.media-modal' )\n\t\t\t\t\t\t.addClass( 'acf-expanded' );\n\n\t\t\t\t\t// set to browse\n\t\t\t\t\tif ( this.content.mode() != 'browse' ) {\n\t\t\t\t\t\tthis.content.mode( 'browse' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// set selection\n\t\t\t\t\tvar state = this.state();\n\t\t\t\t\tvar selection = state.get( 'selection' );\n\t\t\t\t\tvar attachment = wp.media.attachment(\n\t\t\t\t\t\tframe.acf.get( 'attachment' )\n\t\t\t\t\t);\n\t\t\t\t\tselection.add( attachment );\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.addFrameEvents.apply( this, arguments );\n\t\t},\n\t} );\n\n\t/**\n\t * customizePrototypes\n\t *\n\t * description\n\t *\n\t * @date\t11/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar customizePrototypes = new acf.Model( {\n\t\tid: 'customizePrototypes',\n\t\twait: 'ready',\n\n\t\tinitialize: function () {\n\t\t\t// bail early if no media views\n\t\t\tif ( ! acf.isset( window, 'wp', 'media', 'view' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// fix bug where CPT without \"editor\" does not set post.id setting which then prevents uploadedTo from working\n\t\t\tvar postID = getPostID();\n\t\t\tif (\n\t\t\t\tpostID &&\n\t\t\t\tacf.isset( wp, 'media', 'view', 'settings', 'post' )\n\t\t\t) {\n\t\t\t\twp.media.view.settings.post.id = postID;\n\t\t\t}\n\n\t\t\t// customize\n\t\t\tthis.customizeAttachmentsButton();\n\t\t\tthis.customizeAttachmentsRouter();\n\t\t\tthis.customizeAttachmentFilters();\n\t\t\tthis.customizeAttachmentCompat();\n\t\t\tthis.customizeAttachmentLibrary();\n\t\t},\n\n\t\tcustomizeAttachmentsButton: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Button' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Extend\n\t\t\tvar Button = wp.media.view.Button;\n\t\t\twp.media.view.Button = Button.extend( {\n\t\t\t\t// Fix bug where \"Select\" button appears blank after editing an image.\n\t\t\t\t// Do this by simplifying Button initialize function and avoid deleting this.options.\n\t\t\t\tinitialize: function () {\n\t\t\t\t\tvar options = _.defaults( this.options, this.defaults );\n\t\t\t\t\tthis.model = new Backbone.Model( options );\n\t\t\t\t\tthis.listenTo( this.model, 'change', this.render );\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentsRouter: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Router' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar Parent = wp.media.view.Router;\n\n\t\t\t// extend\n\t\t\twp.media.view.Router = Parent.extend( {\n\t\t\t\taddExpand: function () {\n\t\t\t\t\t// vars\n\t\t\t\t\tvar $a = $(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t\tacf.__( 'Expand Details' ) +\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t\tacf.__( 'Collapse Details' ) +\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t].join( '' )\n\t\t\t\t\t);\n\n\t\t\t\t\t// add events\n\t\t\t\t\t$a.on( 'click', function ( e ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvar $div = $( this ).closest( '.media-modal' );\n\t\t\t\t\t\tif ( $div.hasClass( 'acf-expanded' ) ) {\n\t\t\t\t\t\t\t$div.removeClass( 'acf-expanded' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$div.addClass( 'acf-expanded' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t// append\n\t\t\t\t\tthis.$el.append( $a );\n\t\t\t\t},\n\n\t\t\t\tinitialize: function () {\n\t\t\t\t\t// initialize\n\t\t\t\t\tParent.prototype.initialize.apply( this, arguments );\n\n\t\t\t\t\t// add buttons\n\t\t\t\t\tthis.addExpand();\n\n\t\t\t\t\t// return\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentFilters: function () {\n\t\t\t// validate\n\t\t\tif (\n\t\t\t\t! acf.isset( wp, 'media', 'view', 'AttachmentFilters', 'All' )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar Parent = wp.media.view.AttachmentFilters.All;\n\n\t\t\t// renderFilters\n\t\t\t// copied from media-views.js:6939\n\t\t\tParent.prototype.renderFilters = function () {\n\t\t\t\t// Build `' )\n\t\t\t\t\t\t\t\t\t.val( value )\n\t\t\t\t\t\t\t\t\t.html( filter.text )[ 0 ],\n\t\t\t\t\t\t\t\tpriority: filter.priority || 50,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}, this )\n\t\t\t\t\t\t.sortBy( 'priority' )\n\t\t\t\t\t\t.pluck( 'el' )\n\t\t\t\t\t\t.value()\n\t\t\t\t);\n\t\t\t};\n\t\t},\n\n\t\tcustomizeAttachmentCompat: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'AttachmentCompat' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar AttachmentCompat = wp.media.view.AttachmentCompat;\n\t\t\tvar timeout = false;\n\n\t\t\t// extend\n\t\t\twp.media.view.AttachmentCompat = AttachmentCompat.extend( {\n\t\t\t\trender: function () {\n\t\t\t\t\t// WP bug\n\t\t\t\t\t// When multiple media frames exist on the same page (WP content, WYSIWYG, image, file ),\n\t\t\t\t\t// WP creates multiple instances of this AttachmentCompat view.\n\t\t\t\t\t// Each instance will attempt to render when a new modal is created.\n\t\t\t\t\t// Use a property to avoid this and only render once per instance.\n\t\t\t\t\tif ( this.rendered ) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t// render HTML\n\t\t\t\t\tAttachmentCompat.prototype.render.apply( this, arguments );\n\n\t\t\t\t\t// when uploading, render is called twice.\n\t\t\t\t\t// ignore first render by checking for #acf-form-data element\n\t\t\t\t\tif ( ! this.$( '#acf-form-data' ).length ) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t// clear timeout\n\t\t\t\t\tclearTimeout( timeout );\n\n\t\t\t\t\t// setTimeout\n\t\t\t\t\ttimeout = setTimeout(\n\t\t\t\t\t\t$.proxy( function () {\n\t\t\t\t\t\t\tthis.rendered = true;\n\t\t\t\t\t\t\tacf.doAction( 'append', this.$el );\n\t\t\t\t\t\t}, this ),\n\t\t\t\t\t\t50\n\t\t\t\t\t);\n\n\t\t\t\t\t// return\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tsave: function ( event ) {\n\t\t\t\t\tvar data = {};\n\n\t\t\t\t\tif ( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\t\t//_.each( this.$el.serializeArray(), function( pair ) {\n\t\t\t\t\t//\tdata[ pair.name ] = pair.value;\n\t\t\t\t\t//});\n\n\t\t\t\t\t// Serialize data more thoroughly to allow chckbox inputs to save.\n\t\t\t\t\tdata = acf.serializeForAjax( this.$el );\n\n\t\t\t\t\tthis.controller.trigger( 'attachment:compat:waiting', [\n\t\t\t\t\t\t'waiting',\n\t\t\t\t\t] );\n\t\t\t\t\tthis.model\n\t\t\t\t\t\t.saveCompat( data )\n\t\t\t\t\t\t.always( _.bind( this.postSave, this ) );\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentLibrary: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Attachment', 'Library' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar AttachmentLibrary = wp.media.view.Attachment.Library;\n\n\t\t\t// extend\n\t\t\twp.media.view.Attachment.Library = AttachmentLibrary.extend( {\n\t\t\t\trender: function () {\n\t\t\t\t\t// vars\n\t\t\t\t\tvar popup = acf.isget( this, 'controller', 'acf' );\n\t\t\t\t\tvar attributes = acf.isget( this, 'model', 'attributes' );\n\n\t\t\t\t\t// check vars exist to avoid errors\n\t\t\t\t\tif ( popup && attributes ) {\n\t\t\t\t\t\t// show errors\n\t\t\t\t\t\tif ( attributes.acf_errors ) {\n\t\t\t\t\t\t\tthis.$el.addClass( 'acf-disabled' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// disable selected\n\t\t\t\t\t\tvar selected = popup.get( 'selected' );\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\tselected.indexOf( attributes.id ) > -1\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.$el.addClass( 'acf-selected' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// render\n\t\t\t\t\treturn AttachmentLibrary.prototype.render.apply(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\targuments\n\t\t\t\t\t);\n\t\t\t\t},\n\n\t\t\t\t/*\n\t\t\t\t * toggleSelection\n\t\t\t\t *\n\t\t\t\t * This function is called before an attachment is selected\n\t\t\t\t * A good place to check for errors and prevent the 'select' function from being fired\n\t\t\t\t *\n\t\t\t\t * @type\tfunction\n\t\t\t\t * @date\t29/09/2016\n\t\t\t\t * @since\t5.4.0\n\t\t\t\t *\n\t\t\t\t * @param\toptions (object)\n\t\t\t\t * @return\tn/a\n\t\t\t\t */\n\n\t\t\t\ttoggleSelection: function ( options ) {\n\t\t\t\t\t// vars\n\t\t\t\t\t// source: wp-includes/js/media-views.js:2880\n\t\t\t\t\tvar collection = this.collection,\n\t\t\t\t\t\tselection = this.options.selection,\n\t\t\t\t\t\tmodel = this.model,\n\t\t\t\t\t\tsingle = selection.single();\n\n\t\t\t\t\t// vars\n\t\t\t\t\tvar frame = this.controller;\n\t\t\t\t\tvar errors = acf.isget(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\t'model',\n\t\t\t\t\t\t'attributes',\n\t\t\t\t\t\t'acf_errors'\n\t\t\t\t\t);\n\t\t\t\t\tvar $sidebar = frame.$el.find(\n\t\t\t\t\t\t'.media-frame-content .media-sidebar'\n\t\t\t\t\t);\n\n\t\t\t\t\t// remove previous error\n\t\t\t\t\t$sidebar.children( '.acf-selection-error' ).remove();\n\n\t\t\t\t\t// show attachment details\n\t\t\t\t\t$sidebar.children().removeClass( 'acf-hidden' );\n\n\t\t\t\t\t// add message\n\t\t\t\t\tif ( frame && errors ) {\n\t\t\t\t\t\t// vars\n\t\t\t\t\t\tvar filename = acf.isget(\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t'model',\n\t\t\t\t\t\t\t'attributes',\n\t\t\t\t\t\t\t'filename'\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// hide attachment details\n\t\t\t\t\t\t// Gallery field continues to show previously selected attachment...\n\t\t\t\t\t\t$sidebar.children().addClass( 'acf-hidden' );\n\n\t\t\t\t\t\t// append message\n\t\t\t\t\t\t$sidebar.prepend(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'
' );\n\t\t\t\t\t$parent.append( $ul );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// append\n\t\t\t$ul.append( $li );\n\t\t},\n\n\t\tselectTerm: function ( id ) {\n\t\t\tif ( this.getRelatedType() == 'select' ) {\n\t\t\t\tthis.select2.selectOption( id );\n\t\t\t} else {\n\t\t\t\tvar $input = this.$( 'input[value=\"' + id + '\"]' );\n\t\t\t\t$input.prop( 'checked', true ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\n\t\tonClickRadio: function ( e, $el ) {\n\t\t\t// vars\n\t\t\tvar $label = $el.parent( 'label' );\n\t\t\tvar selected = $label.hasClass( 'selected' );\n\n\t\t\t// remove previous selected\n\t\t\tthis.$( '.selected' ).removeClass( 'selected' );\n\n\t\t\t// add active class\n\t\t\t$label.addClass( 'selected' );\n\n\t\t\t// allow null\n\t\t\tif ( this.get( 'allow_null' ) && selected ) {\n\t\t\t\t$label.removeClass( 'selected' );\n\t\t\t\t$el.prop( 'checked', false ).trigger( 'change' );\n\t\t\t}\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.models.DatePickerField.extend( {\n\t\ttype: 'time_picker',\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-time-picker' );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// vars\n\t\t\tvar $input = this.$input();\n\t\t\tvar $inputText = this.$inputText();\n\n\t\t\t// args\n\t\t\tvar args = {\n\t\t\t\ttimeFormat: this.get( 'time_format' ),\n\t\t\t\taltField: $input,\n\t\t\t\taltFieldTimeOnly: false,\n\t\t\t\taltTimeFormat: 'HH:mm:ss',\n\t\t\t\tshowButtonPanel: true,\n\t\t\t\tcontrolType: 'select',\n\t\t\t\toneLine: true,\n\t\t\t\tcloseText: acf.get( 'dateTimePickerL10n' ).selectText,\n\t\t\t\ttimeOnly: true,\n\t\t\t};\n\n\t\t\t// add custom 'Close = Select' functionality\n\t\t\targs.onClose = function ( value, dp_instance, t_instance ) {\n\t\t\t\t// vars\n\t\t\t\tvar $close = dp_instance.dpDiv.find( '.ui-datepicker-close' );\n\n\t\t\t\t// if clicking close button\n\t\t\t\tif ( ! value && $close.is( ':hover' ) ) {\n\t\t\t\t\tt_instance._updateDateTime();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// filter\n\t\t\targs = acf.applyFilters( 'time_picker_args', args, this );\n\n\t\t\t// add date time picker\n\t\t\tacf.newTimePicker( $inputText, args );\n\n\t\t\t// action\n\t\t\tacf.doAction( 'time_picker_init', $inputText, args, this );\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n\n\t// add\n\tacf.newTimePicker = function ( $input, args ) {\n\t\t// bail early if no datepicker library\n\t\tif ( typeof $.timepicker === 'undefined' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// defaults\n\t\targs = args || {};\n\n\t\t// initialize\n\t\t$input.timepicker( args );\n\n\t\t// wrap the datepicker (only if it hasn't already been wrapped)\n\t\tif ( $( 'body > #ui-datepicker-div' ).exists() ) {\n\t\t\t$( 'body > #ui-datepicker-div' ).wrap(\n\t\t\t\t''\n\t\t\t);\n\t\t}\n\t};\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'true_false',\n\n\t\tevents: {\n\t\t\t'change .acf-switch-input': 'onChange',\n\t\t\t'focus .acf-switch-input': 'onFocus',\n\t\t\t'blur .acf-switch-input': 'onBlur',\n\t\t\t'keypress .acf-switch-input': 'onKeypress',\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'input[type=\"checkbox\"]' );\n\t\t},\n\n\t\t$switch: function () {\n\t\t\treturn this.$( '.acf-switch' );\n\t\t},\n\n\t\tgetValue: function () {\n\t\t\treturn this.$input().prop( 'checked' ) ? 1 : 0;\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\tthis.render();\n\t\t},\n\n\t\trender: function () {\n\t\t\t// vars\n\t\t\tvar $switch = this.$switch();\n\n\t\t\t// bail early if no $switch\n\t\t\tif ( ! $switch.length ) return;\n\n\t\t\t// vars\n\t\t\tvar $on = $switch.children( '.acf-switch-on' );\n\t\t\tvar $off = $switch.children( '.acf-switch-off' );\n\t\t\tvar width = Math.max( $on.width(), $off.width() );\n\n\t\t\t// bail early if no width\n\t\t\tif ( ! width ) return;\n\n\t\t\t// set widths\n\t\t\t$on.css( 'min-width', width );\n\t\t\t$off.css( 'min-width', width );\n\t\t},\n\n\t\tswitchOn: function () {\n\t\t\tthis.$input().prop( 'checked', true );\n\t\t\tthis.$switch().addClass( '-on' );\n\t\t},\n\n\t\tswitchOff: function () {\n\t\t\tthis.$input().prop( 'checked', false );\n\t\t\tthis.$switch().removeClass( '-on' );\n\t\t},\n\n\t\tonChange: function ( e, $el ) {\n\t\t\tif ( $el.prop( 'checked' ) ) {\n\t\t\t\tthis.switchOn();\n\t\t\t} else {\n\t\t\t\tthis.switchOff();\n\t\t\t}\n\t\t},\n\n\t\tonFocus: function ( e, $el ) {\n\t\t\tthis.$switch().addClass( '-focus' );\n\t\t},\n\n\t\tonBlur: function ( e, $el ) {\n\t\t\tthis.$switch().removeClass( '-focus' );\n\t\t},\n\n\t\tonKeypress: function ( e, $el ) {\n\t\t\t// left\n\t\t\tif ( e.keyCode === 37 ) {\n\t\t\t\treturn this.switchOff();\n\t\t\t}\n\n\t\t\t// right\n\t\t\tif ( e.keyCode === 39 ) {\n\t\t\t\treturn this.switchOn();\n\t\t\t}\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'url',\n\n\t\tevents: {\n\t\t\t'keyup input[type=\"url\"]': 'onkeyup',\n\t\t},\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-input-wrap' );\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'input[type=\"url\"]' );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\tthis.render();\n\t\t},\n\n\t\tisValid: function () {\n\t\t\t// vars\n\t\t\tvar val = this.val();\n\n\t\t\t// bail early if no val\n\t\t\tif ( ! val ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// url\n\t\t\tif ( val.indexOf( '://' ) !== -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// protocol relative url\n\t\t\tif ( val.indexOf( '//' ) === 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn false;\n\t\t},\n\n\t\trender: function () {\n\t\t\t// add class\n\t\t\tif ( this.isValid() ) {\n\t\t\t\tthis.$control().addClass( '-valid' );\n\t\t\t} else {\n\t\t\t\tthis.$control().removeClass( '-valid' );\n\t\t\t}\n\t\t},\n\n\t\tonkeyup: function ( e, $el ) {\n\t\t\tthis.render();\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.models.SelectField.extend( {\n\t\ttype: 'user',\n\t} );\n\n\tacf.registerFieldType( Field );\n\n\tacf.addFilter( 'select2_ajax_data', function ( data, args, $input, field, select2 ) {\n\t\tif ( ! field || 'user' !== field.get( 'type' ) ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tconst query_nonce = field.get( 'queryNonce' );\n\t\tif ( query_nonce && query_nonce.toString().length ) {\n\t\t\tdata.user_query_nonce = query_nonce;\n\t\t}\n\n\t\treturn data;\n\t} );\n} )( jQuery );\n","( function ( $, undefined ) {\n\tvar Field = acf.Field.extend( {\n\t\ttype: 'wysiwyg',\n\n\t\twait: 'load',\n\n\t\tevents: {\n\t\t\t'mousedown .acf-editor-wrap.delay': 'onMousedown',\n\t\t\tunmountField: 'disableEditor',\n\t\t\tremountField: 'enableEditor',\n\t\t\tremoveField: 'disableEditor',\n\t\t},\n\n\t\t$control: function () {\n\t\t\treturn this.$( '.acf-editor-wrap' );\n\t\t},\n\n\t\t$input: function () {\n\t\t\treturn this.$( 'textarea' );\n\t\t},\n\n\t\tgetMode: function () {\n\t\t\treturn this.$control().hasClass( 'tmce-active' )\n\t\t\t\t? 'visual'\n\t\t\t\t: 'text';\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// initializeEditor if no delay\n\t\t\tif ( ! this.$control().hasClass( 'delay' ) ) {\n\t\t\t\tthis.initializeEditor();\n\t\t\t}\n\t\t},\n\n\t\tinitializeEditor: function () {\n\t\t\t// vars\n\t\t\tvar $wrap = this.$control();\n\t\t\tvar $textarea = this.$input();\n\t\t\tvar args = {\n\t\t\t\ttinymce: true,\n\t\t\t\tquicktags: true,\n\t\t\t\ttoolbar: this.get( 'toolbar' ),\n\t\t\t\tmode: this.getMode(),\n\t\t\t\tfield: this,\n\t\t\t};\n\n\t\t\t// generate new id\n\t\t\tvar oldId = $textarea.attr( 'id' );\n\t\t\tvar newId = acf.uniqueId( 'acf-editor-' );\n\n\t\t\t// Backup textarea data.\n\t\t\tvar inputData = $textarea.data();\n\t\t\tvar inputVal = $textarea.val();\n\n\t\t\t// rename\n\t\t\tacf.rename( {\n\t\t\t\ttarget: $wrap,\n\t\t\t\tsearch: oldId,\n\t\t\t\treplace: newId,\n\t\t\t\tdestructive: true,\n\t\t\t} );\n\n\t\t\t// update id\n\t\t\tthis.set( 'id', newId, true );\n\n\t\t\t// apply data to new textarea (acf.rename creates a new textarea element due to destructive mode)\n\t\t\t// fixes bug where conditional logic \"disabled\" is lost during \"screen_check\"\n\t\t\tthis.$input().data( inputData ).val( inputVal );\n\n\t\t\t// initialize\n\t\t\tacf.tinymce.initialize( newId, args );\n\t\t},\n\n\t\tonMousedown: function ( e ) {\n\t\t\t// prevent default\n\t\t\te.preventDefault();\n\n\t\t\t// remove delay class\n\t\t\tvar $wrap = this.$control();\n\t\t\t$wrap.removeClass( 'delay' );\n\t\t\t$wrap.find( '.acf-editor-toolbar' ).remove();\n\n\t\t\t// initialize\n\t\t\tthis.initializeEditor();\n\t\t},\n\n\t\tenableEditor: function () {\n\t\t\tif ( this.getMode() == 'visual' ) {\n\t\t\t\tacf.tinymce.enable( this.get( 'id' ) );\n\t\t\t}\n\t\t},\n\n\t\tdisableEditor: function () {\n\t\t\tacf.tinymce.destroy( this.get( 'id' ) );\n\t\t},\n\t} );\n\n\tacf.registerFieldType( Field );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t// vars\n\tvar storage = [];\n\n\t/**\n\t * acf.Field\n\t *\n\t * description\n\t *\n\t * @date\t23/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.Field = acf.Model.extend( {\n\t\t// field type\n\t\ttype: '',\n\n\t\t// class used to avoid nested event triggers\n\t\teventScope: '.acf-field',\n\n\t\t// initialize events on 'ready'\n\t\twait: 'ready',\n\n\t\t/**\n\t\t * setup\n\t\t *\n\t\t * Called during the constructor function to setup this field ready for initialization\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tjQuery $field The field element.\n\t\t * @return\tvoid\n\t\t */\n\n\t\tsetup: function ( $field ) {\n\t\t\t// set $el\n\t\t\tthis.$el = $field;\n\n\t\t\t// inherit $field data\n\t\t\tthis.inherit( $field );\n\n\t\t\t// inherit controll data\n\t\t\tthis.inherit( this.$control() );\n\t\t},\n\n\t\t/**\n\t\t * val\n\t\t *\n\t\t * Sets or returns the field's value\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tmixed val Optional. The value to set\n\t\t * @return\tmixed\n\t\t */\n\n\t\tval: function ( val ) {\n\t\t\t// Set.\n\t\t\tif ( val !== undefined ) {\n\t\t\t\treturn this.setValue( val );\n\n\t\t\t\t// Get.\n\t\t\t} else {\n\t\t\t\treturn this.prop( 'disabled' ) ? null : this.getValue();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * getValue\n\t\t *\n\t\t * returns the field's value\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tmixed\n\t\t */\n\n\t\tgetValue: function () {\n\t\t\treturn this.$input().val();\n\t\t},\n\n\t\t/**\n\t\t * setValue\n\t\t *\n\t\t * sets the field's value and returns true if changed\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tmixed val\n\t\t * @return\tboolean. True if changed.\n\t\t */\n\n\t\tsetValue: function ( val ) {\n\t\t\treturn acf.val( this.$input(), val );\n\t\t},\n\n\t\t/**\n\t\t * __\n\t\t *\n\t\t * i18n helper to be removed\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t__: function ( string ) {\n\t\t\treturn acf._e( this.type, string );\n\t\t},\n\n\t\t/**\n\t\t * $control\n\t\t *\n\t\t * returns the control jQuery element used for inheriting data. Uses this.control setting.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tjQuery\n\t\t */\n\n\t\t$control: function () {\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * $input\n\t\t *\n\t\t * returns the input jQuery element used for saving values. Uses this.input setting.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tjQuery\n\t\t */\n\n\t\t$input: function () {\n\t\t\treturn this.$( '[name]:first' );\n\t\t},\n\n\t\t/**\n\t\t * $inputWrap\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t12/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t$inputWrap: function () {\n\t\t\treturn this.$( '.acf-input:first' );\n\t\t},\n\n\t\t/**\n\t\t * $inputWrap\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t12/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\t$labelWrap: function () {\n\t\t\treturn this.$( '.acf-label:first' );\n\t\t},\n\n\t\t/**\n\t\t * getInputName\n\t\t *\n\t\t * Returns the field's input name\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tstring\n\t\t */\n\n\t\tgetInputName: function () {\n\t\t\treturn this.$input().attr( 'name' ) || '';\n\t\t},\n\n\t\t/**\n\t\t * parent\n\t\t *\n\t\t * returns the field's parent field or false on failure.\n\t\t *\n\t\t * @date\t8/5/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\tvoid\n\t\t * @return\tobject|false\n\t\t */\n\n\t\tparent: function () {\n\t\t\t// vars\n\t\t\tvar parents = this.parents();\n\n\t\t\t// return\n\t\t\treturn parents.length ? parents[ 0 ] : false;\n\t\t},\n\n\t\t/**\n\t\t * parents\n\t\t *\n\t\t * description\n\t\t *\n\t\t * @date\t9/7/18\n\t\t * @since\t5.6.9\n\t\t *\n\t\t * @param\ttype $var Description. Default.\n\t\t * @return\ttype Description.\n\t\t */\n\n\t\tparents: function () {\n\t\t\t// vars\n\t\t\tvar $parents = this.$el.parents( '.acf-field' );\n\n\t\t\t// convert\n\t\t\tvar parents = acf.getFields( $parents );\n\n\t\t\t// return\n\t\t\treturn parents;\n\t\t},\n\n\t\tshow: function ( lockKey, context ) {\n\t\t\t// show field and store result\n\t\t\tvar changed = acf.show( this.$el, lockKey );\n\n\t\t\t// do action if visibility has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'hidden', false );\n\t\t\t\tacf.doAction( 'show_field', this, context );\n\n\t\t\t\tif ( context === 'conditional_logic' ) {\n\t\t\t\t\tthis.setFieldSettingsLastVisible();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\thide: function ( lockKey, context ) {\n\t\t\t// hide field and store result\n\t\t\tvar changed = acf.hide( this.$el, lockKey );\n\n\t\t\t// do action if visibility has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'hidden', true );\n\t\t\t\tacf.doAction( 'hide_field', this, context );\n\n\t\t\t\tif ( context === 'conditional_logic' ) {\n\t\t\t\t\tthis.setFieldSettingsLastVisible();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tsetFieldSettingsLastVisible: function () {\n\t\t\t// Ensure this conditional logic trigger has happened inside a field settings tab.\n\t\t\tvar $parents = this.$el.parents( '.acf-field-settings-main' );\n\t\t\tif ( ! $parents.length ) return;\n\n\t\t\tvar $fields = $parents.find( '.acf-field' );\n\n\t\t\t$fields.removeClass( 'acf-last-visible' );\n\t\t\t$fields.not( '.acf-hidden' ).last().addClass( 'acf-last-visible' );\n\t\t},\n\n\t\tenable: function ( lockKey, context ) {\n\t\t\t// enable field and store result\n\t\t\tvar changed = acf.enable( this.$el, lockKey );\n\n\t\t\t// do action if disabled has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'disabled', false );\n\t\t\t\tacf.doAction( 'enable_field', this, context );\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tdisable: function ( lockKey, context ) {\n\t\t\t// disabled field and store result\n\t\t\tvar changed = acf.disable( this.$el, lockKey );\n\n\t\t\t// do action if disabled has changed\n\t\t\tif ( changed ) {\n\t\t\t\tthis.prop( 'disabled', true );\n\t\t\t\tacf.doAction( 'disable_field', this, context );\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn changed;\n\t\t},\n\n\t\tshowEnable: function ( lockKey, context ) {\n\t\t\t// enable\n\t\t\tthis.enable.apply( this, arguments );\n\n\t\t\t// show and return true if changed\n\t\t\treturn this.show.apply( this, arguments );\n\t\t},\n\n\t\thideDisable: function ( lockKey, context ) {\n\t\t\t// disable\n\t\t\tthis.disable.apply( this, arguments );\n\n\t\t\t// hide and return true if changed\n\t\t\treturn this.hide.apply( this, arguments );\n\t\t},\n\n\t\tshowNotice: function ( props ) {\n\t\t\t// ensure object\n\t\t\tif ( typeof props !== 'object' ) {\n\t\t\t\tprops = { text: props };\n\t\t\t}\n\n\t\t\t// remove old notice\n\t\t\tif ( this.notice ) {\n\t\t\t\tthis.notice.remove();\n\t\t\t}\n\n\t\t\t// create new notice\n\t\t\tprops.target = this.$inputWrap();\n\t\t\tthis.notice = acf.newNotice( props );\n\t\t},\n\n\t\tremoveNotice: function ( timeout ) {\n\t\t\tif ( this.notice ) {\n\t\t\t\tthis.notice.away( timeout || 0 );\n\t\t\t\tthis.notice = false;\n\t\t\t}\n\t\t},\n\n\t\tshowError: function ( message, location = 'before' ) {\n\t\t\t// add class\n\t\t\tthis.$el.addClass( 'acf-error' );\n\n\t\t\t// add message\n\t\t\tif ( message !== undefined ) {\n\t\t\t\tthis.showNotice( {\n\t\t\t\t\ttext: message,\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\tdismiss: false,\n\t\t\t\t\tlocation: location,\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// action\n\t\t\tacf.doAction( 'invalid_field', this );\n\n\t\t\t// add event\n\t\t\tthis.$el.one(\n\t\t\t\t'focus change',\n\t\t\t\t'input, select, textarea',\n\t\t\t\t$.proxy( this.removeError, this )\n\t\t\t);\n\t\t},\n\n\t\tremoveError: function () {\n\t\t\t// remove class\n\t\t\tthis.$el.removeClass( 'acf-error' );\n\n\t\t\t// remove notice\n\t\t\tthis.removeNotice( 250 );\n\n\t\t\t// action\n\t\t\tacf.doAction( 'valid_field', this );\n\t\t},\n\n\t\ttrigger: function ( name, args, bubbles ) {\n\t\t\t// allow some events to bubble\n\t\t\tif ( name == 'invalidField' ) {\n\t\t\t\tbubbles = true;\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn acf.Model.prototype.trigger.apply( this, [\n\t\t\t\tname,\n\t\t\t\targs,\n\t\t\t\tbubbles,\n\t\t\t] );\n\t\t},\n\t} );\n\n\t/**\n\t * newField\n\t *\n\t * description\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.newField = function ( $field ) {\n\t\t// vars\n\t\tvar type = $field.data( 'type' );\n\t\tvar mid = modelId( type );\n\t\tvar model = acf.models[ mid ] || acf.Field;\n\n\t\t// instantiate\n\t\tvar field = new model( $field );\n\n\t\t// actions\n\t\tacf.doAction( 'new_field', field );\n\n\t\t// return\n\t\treturn field;\n\t};\n\n\t/**\n\t * mid\n\t *\n\t * Calculates the model ID for a field type\n\t *\n\t * @date\t15/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tstring type\n\t * @return\tstring\n\t */\n\n\tvar modelId = function ( type ) {\n\t\treturn acf.strPascalCase( type || '' ) + 'Field';\n\t};\n\n\t/**\n\t * registerFieldType\n\t *\n\t * description\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.registerFieldType = function ( model ) {\n\t\t// vars\n\t\tvar proto = model.prototype;\n\t\tvar type = proto.type;\n\t\tvar mid = modelId( type );\n\n\t\t// store model\n\t\tacf.models[ mid ] = model;\n\n\t\t// store reference\n\t\tstorage.push( type );\n\t};\n\n\t/**\n\t * acf.getFieldType\n\t *\n\t * description\n\t *\n\t * @date\t1/2/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getFieldType = function ( type ) {\n\t\tvar mid = modelId( type );\n\t\treturn acf.models[ mid ] || false;\n\t};\n\n\t/**\n\t * acf.getFieldTypes\n\t *\n\t * description\n\t *\n\t * @date\t1/2/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getFieldTypes = function ( args ) {\n\t\t// defaults\n\t\targs = acf.parseArgs( args, {\n\t\t\tcategory: '',\n\t\t\t// hasValue: true\n\t\t} );\n\n\t\t// clonse available types\n\t\tvar types = [];\n\n\t\t// loop\n\t\tstorage.map( function ( type ) {\n\t\t\t// vars\n\t\t\tvar model = acf.getFieldType( type );\n\t\t\tvar proto = model.prototype;\n\n\t\t\t// check operator\n\t\t\tif ( args.category && proto.category !== args.category ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// append\n\t\t\ttypes.push( model );\n\t\t} );\n\n\t\t// return\n\t\treturn types;\n\t};\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * findFields\n\t *\n\t * Returns a jQuery selection object of acf fields.\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tobject $args {\n\t *\t\tOptional. Arguments to find fields.\n\t *\n\t *\t\t@type string\t\t\tkey\t\t\tThe field's key (data-attribute).\n\t *\t\t@type string\t\t\tname\t\tThe field's name (data-attribute).\n\t *\t\t@type string\t\t\ttype\t\tThe field's type (data-attribute).\n\t *\t\t@type string\t\t\tis\t\t\tjQuery selector to compare against.\n\t *\t\t@type jQuery\t\t\tparent\t\tjQuery element to search within.\n\t *\t\t@type jQuery\t\t\tsibling\t\tjQuery element to search alongside.\n\t *\t\t@type limit\t\t\t\tint\t\t\tThe number of fields to find.\n\t *\t\t@type suppressFilters\tbool\t\tWhether to allow filters to add/remove results. Default behaviour will ignore clone fields.\n\t * }\n\t * @return\tjQuery\n\t */\n\n\tacf.findFields = function ( args ) {\n\t\t// vars\n\t\tvar selector = '.acf-field';\n\t\tvar $fields = false;\n\n\t\t// args\n\t\targs = acf.parseArgs( args, {\n\t\t\tkey: '',\n\t\t\tname: '',\n\t\t\ttype: '',\n\t\t\tis: '',\n\t\t\tparent: false,\n\t\t\tsibling: false,\n\t\t\tlimit: false,\n\t\t\tvisible: false,\n\t\t\tsuppressFilters: false,\n\t\t\texcludeSubFields: false,\n\t\t} );\n\n\t\t// filter args\n\t\tif ( ! args.suppressFilters ) {\n\t\t\targs = acf.applyFilters( 'find_fields_args', args );\n\t\t}\n\n\t\t// key\n\t\tif ( args.key ) {\n\t\t\tselector += '[data-key=\"' + args.key + '\"]';\n\t\t}\n\n\t\t// type\n\t\tif ( args.type ) {\n\t\t\tselector += '[data-type=\"' + args.type + '\"]';\n\t\t}\n\n\t\t// name\n\t\tif ( args.name ) {\n\t\t\tselector += '[data-name=\"' + args.name + '\"]';\n\t\t}\n\n\t\t// is\n\t\tif ( args.is ) {\n\t\t\tselector += args.is;\n\t\t}\n\n\t\t// visibility\n\t\tif ( args.visible ) {\n\t\t\tselector += ':visible';\n\t\t}\n\n\t\tif ( ! args.suppressFilters ) {\n\t\t\tselector = acf.applyFilters(\n\t\t\t\t'find_fields_selector',\n\t\t\t\tselector,\n\t\t\t\targs\n\t\t\t);\n\t\t}\n\n\t\t// query\n\t\tif ( args.parent ) {\n\t\t\t$fields = args.parent.find( selector );\n\t\t\t// exclude sub fields if required (only if a parent is provided)\n\t\t\tif ( args.excludeSubFields ) {\n\t\t\t\t$fields = $fields.not( args.parent.find( '.acf-is-subfields .acf-field' ) );\n\t\t\t}\n\t\t} else if ( args.sibling ) {\n\t\t\t$fields = args.sibling.siblings( selector );\n\t\t} else {\n\t\t\t$fields = $( selector );\n\t\t}\n\n\t\t// filter\n\t\tif ( ! args.suppressFilters ) {\n\t\t\t$fields = $fields.not( '.acf-clone .acf-field' );\n\t\t\t$fields = acf.applyFilters( 'find_fields', $fields );\n\t\t}\n\n\t\t// limit\n\t\tif ( args.limit ) {\n\t\t\t$fields = $fields.slice( 0, args.limit );\n\t\t}\n\n\t\t// return\n\t\treturn $fields;\n\t};\n\n\t/**\n\t * findField\n\t *\n\t * Finds a specific field with jQuery\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tstring key \t\tThe field's key.\n\t * @param\tjQuery $parent\tjQuery element to search within.\n\t * @return\tjQuery\n\t */\n\n\tacf.findField = function ( key, $parent ) {\n\t\treturn acf.findFields( {\n\t\t\tkey: key,\n\t\t\tlimit: 1,\n\t\t\tparent: $parent,\n\t\t\tsuppressFilters: true,\n\t\t} );\n\t};\n\n\t/**\n\t * getField\n\t *\n\t * Returns a field instance\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery|string $field\tjQuery element or field key.\n\t * @return\tobject\n\t */\n\n\tacf.getField = function ( $field ) {\n\t\t// allow jQuery\n\t\tif ( $field instanceof jQuery ) {\n\t\t\t// find fields\n\t\t} else {\n\t\t\t$field = acf.findField( $field );\n\t\t}\n\n\t\t// instantiate\n\t\tvar field = $field.data( 'acf' );\n\t\tif ( ! field ) {\n\t\t\tfield = acf.newField( $field );\n\t\t}\n\n\t\t// return\n\t\treturn field;\n\t};\n\n\t/**\n\t * getFields\n\t *\n\t * Returns multiple field instances\n\t *\n\t * @date\t14/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery|object $fields\tjQuery elements or query args.\n\t * @return\tarray\n\t */\n\n\tacf.getFields = function ( $fields ) {\n\t\t// allow jQuery\n\t\tif ( $fields instanceof jQuery ) {\n\t\t\t// find fields\n\t\t} else {\n\t\t\t$fields = acf.findFields( $fields );\n\t\t}\n\n\t\t// loop\n\t\tvar fields = [];\n\t\t$fields.each( function () {\n\t\t\tvar field = acf.getField( $( this ) );\n\t\t\tfields.push( field );\n\t\t} );\n\n\t\t// return\n\t\treturn fields;\n\t};\n\n\t/**\n\t * findClosestField\n\t *\n\t * Returns the closest jQuery field element\n\t *\n\t * @date\t9/4/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tjQuery $el\n\t * @return\tjQuery\n\t */\n\n\tacf.findClosestField = function ( $el ) {\n\t\treturn $el.closest( '.acf-field' );\n\t};\n\n\t/**\n\t * getClosestField\n\t *\n\t * Returns the closest field instance\n\t *\n\t * @date\t22/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\tjQuery $el\n\t * @return\tobject\n\t */\n\n\tacf.getClosestField = function ( $el ) {\n\t\tvar $field = acf.findClosestField( $el );\n\t\treturn this.getField( $field );\n\t};\n\n\t/**\n\t * addGlobalFieldAction\n\t *\n\t * Sets up callback logic for global field actions\n\t *\n\t * @date\t15/6/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tstring action\n\t * @return\tvoid\n\t */\n\n\tvar addGlobalFieldAction = function ( action ) {\n\t\t// vars\n\t\tvar globalAction = action;\n\t\tvar pluralAction = action + '_fields'; // ready_fields\n\t\tvar singleAction = action + '_field'; // ready_field\n\n\t\t// global action\n\t\tvar globalCallback = function ( $el /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( action, arguments );\n\n\t\t\t// get args [$el, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// find fields\n\t\t\tvar fields = acf.getFields( { parent: $el } );\n\n\t\t\t// check\n\t\t\tif ( fields.length ) {\n\t\t\t\t// pluralAction\n\t\t\t\tvar pluralArgs = [ pluralAction, fields ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, pluralArgs );\n\t\t\t}\n\t\t};\n\n\t\t// plural action\n\t\tvar pluralCallback = function ( fields /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( pluralAction, arguments );\n\n\t\t\t// get args [fields, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// loop\n\t\t\tfields.map( function ( field, i ) {\n\t\t\t\t//setTimeout(function(){\n\t\t\t\t// singleAction\n\t\t\t\tvar singleArgs = [ singleAction, field ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, singleArgs );\n\t\t\t\t//}, i * 100);\n\t\t\t} );\n\t\t};\n\n\t\t// add actions\n\t\tacf.addAction( globalAction, globalCallback );\n\t\tacf.addAction( pluralAction, pluralCallback );\n\n\t\t// also add single action\n\t\taddSingleFieldAction( action );\n\t};\n\n\t/**\n\t * addSingleFieldAction\n\t *\n\t * Sets up callback logic for single field actions\n\t *\n\t * @date\t15/6/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tstring action\n\t * @return\tvoid\n\t */\n\n\tvar addSingleFieldAction = function ( action ) {\n\t\t// vars\n\t\tvar singleAction = action + '_field'; // ready_field\n\t\tvar singleEvent = action + 'Field'; // readyField\n\n\t\t// single action\n\t\tvar singleCallback = function ( field /*, arg1, arg2, etc*/ ) {\n\t\t\t//console.log( singleAction, arguments );\n\n\t\t\t// get args [field, ...]\n\t\t\tvar args = acf.arrayArgs( arguments );\n\t\t\tvar extraArgs = args.slice( 1 );\n\n\t\t\t// action variations (ready_field/type=image)\n\t\t\tvar variations = [ 'type', 'name', 'key' ];\n\t\t\tvariations.map( function ( variation ) {\n\t\t\t\t// vars\n\t\t\t\tvar prefix = '/' + variation + '=' + field.get( variation );\n\n\t\t\t\t// singleAction\n\t\t\t\targs = [ singleAction + prefix, field ].concat( extraArgs );\n\t\t\t\tacf.doAction.apply( null, args );\n\t\t\t} );\n\n\t\t\t// event\n\t\t\tif ( singleFieldEvents.indexOf( action ) > -1 ) {\n\t\t\t\tfield.trigger( singleEvent, extraArgs );\n\t\t\t}\n\t\t};\n\n\t\t// add actions\n\t\tacf.addAction( singleAction, singleCallback );\n\t};\n\n\t// vars\n\tvar globalFieldActions = [\n\t\t'prepare',\n\t\t'ready',\n\t\t'load',\n\t\t'append',\n\t\t'remove',\n\t\t'unmount',\n\t\t'remount',\n\t\t'sortstart',\n\t\t'sortstop',\n\t\t'show',\n\t\t'hide',\n\t\t'unload',\n\t];\n\tvar singleFieldActions = [\n\t\t'valid',\n\t\t'invalid',\n\t\t'enable',\n\t\t'disable',\n\t\t'new',\n\t\t'duplicate',\n\t];\n\tvar singleFieldEvents = [\n\t\t'remove',\n\t\t'unmount',\n\t\t'remount',\n\t\t'sortstart',\n\t\t'sortstop',\n\t\t'show',\n\t\t'hide',\n\t\t'unload',\n\t\t'valid',\n\t\t'invalid',\n\t\t'enable',\n\t\t'disable',\n\t\t'duplicate',\n\t];\n\n\t// add\n\tglobalFieldActions.map( addGlobalFieldAction );\n\tsingleFieldActions.map( addSingleFieldAction );\n\n\t/**\n\t * fieldsEventManager\n\t *\n\t * Manages field actions and events\n\t *\n\t * @date\t15/12/17\n\t * @since\t5.6.5\n\t *\n\t * @param\tvoid\n\t * @param\tvoid\n\t */\n\n\tvar fieldsEventManager = new acf.Model( {\n\t\tid: 'fieldsEventManager',\n\t\tevents: {\n\t\t\t'click .acf-field a[href=\"#\"]': 'onClick',\n\t\t\t'change .acf-field': 'onChange',\n\t\t},\n\t\tonClick: function ( e ) {\n\t\t\t// prevent default of any link with an href of #\n\t\t\te.preventDefault();\n\t\t},\n\t\tonChange: function () {\n\t\t\t// preview hack allows post to save with no title or content\n\t\t\t$( '#_acf_changed' ).val( 1 );\n\n\t\t\tif ( acf.isGutenbergPostEditor() ) {\n\t\t\t\ttry {\n\t\t\t\t\twp.data.dispatch('core/editor').editPost({ meta: { _acf_changed: 1 } });\n\t\t\t\t} catch ( error ) {\n\t\t\t\t\tconsole.log( 'ACF: Failed to update _acf_changed meta', error );\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\t} );\n\n\tvar duplicateFieldsManager = new acf.Model( {\n\t\tid: 'duplicateFieldsManager',\n\t\tactions: {\n\t\t\tduplicate: 'onDuplicate',\n\t\t\tduplicate_fields: 'onDuplicateFields',\n\t\t},\n\t\tonDuplicate: function ( $el, $el2 ) {\n\t\t\tvar fields = acf.getFields( { parent: $el } );\n\t\t\tif ( fields.length ) {\n\t\t\t\tvar $fields = acf.findFields( { parent: $el2 } );\n\t\t\t\tacf.doAction( 'duplicate_fields', fields, $fields );\n\t\t\t}\n\t\t},\n\t\tonDuplicateFields: function ( fields, duplicates ) {\n\t\t\tfields.map( function ( field, i ) {\n\t\t\t\tacf.doAction( 'duplicate_field', field, $( duplicates[ i ] ) );\n\t\t\t} );\n\t\t},\n\t} );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * refreshHelper\n\t *\n\t * description\n\t *\n\t * @date\t1/7/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar refreshHelper = new acf.Model( {\n\t\tpriority: 90,\n\t\tactions: {\n\t\t\tnew_field: 'refresh',\n\t\t\tshow_field: 'refresh',\n\t\t\thide_field: 'refresh',\n\t\t\tremove_field: 'refresh',\n\t\t\tunmount_field: 'refresh',\n\t\t\tremount_field: 'refresh',\n\t\t},\n\t\trefresh: function () {\n\t\t\tacf.refresh();\n\t\t},\n\t} );\n\n\t/**\n\t * mountHelper\n\t *\n\t * Adds compatiblity for the 'unmount' and 'remount' actions added in 5.8.0\n\t *\n\t * @date\t7/3/19\n\t * @since\t5.7.14\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\tvar mountHelper = new acf.Model( {\n\t\tpriority: 1,\n\t\tactions: {\n\t\t\tsortstart: 'onSortstart',\n\t\t\tsortstop: 'onSortstop',\n\t\t},\n\t\tonSortstart: function ( $item ) {\n\t\t\tacf.doAction( 'unmount', $item );\n\t\t},\n\t\tonSortstop: function ( $item ) {\n\t\t\tacf.doAction( 'remount', $item );\n\t\t},\n\t} );\n\n\t/**\n\t * sortableHelper\n\t *\n\t * Adds compatibility for sorting a
element\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\n\tvar sortableHelper = new acf.Model( {\n\t\tactions: {\n\t\t\tsortstart: 'onSortstart',\n\t\t},\n\t\tonSortstart: function ( $item, $placeholder ) {\n\t\t\t// if $item is a tr, apply some css to the elements\n\t\t\tif ( $item.is( 'tr' ) ) {\n\t\t\t\t// replace $placeholder children with a single td\n\t\t\t\t// fixes \"width calculation issues\" due to conditional logic hiding some children\n\t\t\t\t$placeholder.html(\n\t\t\t\t\t'
'\n\t\t\t\t);\n\n\t\t\t\t// add helper class to remove absolute positioning\n\t\t\t\t$item.addClass( 'acf-sortable-tr-helper' );\n\n\t\t\t\t// set fixed widths for children\n\t\t\t\t$item.children().each( function () {\n\t\t\t\t\t$( this ).width( $( this ).width() );\n\t\t\t\t} );\n\n\t\t\t\t// mimic height\n\t\t\t\t$placeholder.height( $item.height() + 'px' );\n\n\t\t\t\t// remove class\n\t\t\t\t$item.removeClass( 'acf-sortable-tr-helper' );\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * duplicateHelper\n\t *\n\t * Fixes browser bugs when duplicating an element\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\tvoid\n\t * @return\tvoid\n\t */\n\n\tvar duplicateHelper = new acf.Model( {\n\t\tactions: {\n\t\t\tafter_duplicate: 'onAfterDuplicate',\n\t\t},\n\t\tonAfterDuplicate: function ( $el, $el2 ) {\n\t\t\t// get original values\n\t\t\tvar vals = [];\n\t\t\t$el.find( 'select' ).each( function ( i ) {\n\t\t\t\tvals.push( $( this ).val() );\n\t\t\t} );\n\n\t\t\t// set duplicate values\n\t\t\t$el2.find( 'select' ).each( function ( i ) {\n\t\t\t\t$( this ).val( vals[ i ] );\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * tableHelper\n\t *\n\t * description\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar tableHelper = new acf.Model( {\n\t\tid: 'tableHelper',\n\n\t\tpriority: 20,\n\n\t\tactions: {\n\t\t\trefresh: 'renderTables',\n\t\t},\n\n\t\trenderTables: function ( $el ) {\n\t\t\t// loop\n\t\t\tvar self = this;\n\t\t\t$( '.acf-table:visible' ).each( function () {\n\t\t\t\tself.renderTable( $( this ) );\n\t\t\t} );\n\t\t},\n\n\t\trenderTable: function ( $table ) {\n\t\t\t// vars\n\t\t\tvar $ths = $table.find( '> thead > tr:visible > th[data-key]' );\n\t\t\tvar $tds = $table.find( '> tbody > tr:visible > td[data-key]' );\n\n\t\t\t// bail early if no thead\n\t\t\tif ( ! $ths.length || ! $tds.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// visiblity\n\t\t\t$ths.each( function ( i ) {\n\t\t\t\t// vars\n\t\t\t\tvar $th = $( this );\n\t\t\t\tvar key = $th.data( 'key' );\n\t\t\t\tvar $cells = $tds.filter( '[data-key=\"' + key + '\"]' );\n\t\t\t\tvar $hidden = $cells.filter( '.acf-hidden' );\n\n\t\t\t\t// always remove empty and allow cells to be hidden\n\t\t\t\t$cells.removeClass( 'acf-empty' );\n\n\t\t\t\t// hide $th if all cells are hidden\n\t\t\t\tif ( $cells.length === $hidden.length ) {\n\t\t\t\t\tacf.hide( $th );\n\n\t\t\t\t\t// force all hidden cells to appear empty\n\t\t\t\t} else {\n\t\t\t\t\tacf.show( $th );\n\t\t\t\t\t$hidden.addClass( 'acf-empty' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// clear width\n\t\t\t$ths.css( 'width', 'auto' );\n\n\t\t\t// get visible\n\t\t\t$ths = $ths.not( '.acf-hidden' );\n\n\t\t\t// vars\n\t\t\tvar availableWidth = 100;\n\t\t\tvar colspan = $ths.length;\n\n\t\t\t// set custom widths first\n\t\t\tvar $fixedWidths = $ths.filter( '[data-width]' );\n\t\t\t$fixedWidths.each( function () {\n\t\t\t\tvar width = $( this ).data( 'width' );\n\t\t\t\t$( this ).css( 'width', width + '%' );\n\t\t\t\tavailableWidth -= width;\n\t\t\t} );\n\n\t\t\t// set auto widths\n\t\t\tvar $auoWidths = $ths.not( '[data-width]' );\n\t\t\tif ( $auoWidths.length ) {\n\t\t\t\tvar width = availableWidth / $auoWidths.length;\n\t\t\t\t$auoWidths.css( 'width', width + '%' );\n\t\t\t\tavailableWidth = 0;\n\t\t\t}\n\n\t\t\t// avoid stretching issue\n\t\t\tif ( availableWidth > 0 ) {\n\t\t\t\t$ths.last().css( 'width', 'auto' );\n\t\t\t}\n\n\t\t\t// update colspan on collapsed\n\t\t\t$tds.filter( '.-collapsed-target' ).each( function () {\n\t\t\t\t// vars\n\t\t\t\tvar $td = $( this );\n\n\t\t\t\t// check if collapsed\n\t\t\t\tif ( $td.parent().hasClass( '-collapsed' ) ) {\n\t\t\t\t\t$td.attr( 'colspan', $ths.length );\n\t\t\t\t} else {\n\t\t\t\t\t$td.removeAttr( 'colspan' );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * fieldsHelper\n\t *\n\t * description\n\t *\n\t * @date\t6/3/18\n\t * @since\t5.6.9\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar fieldsHelper = new acf.Model( {\n\t\tid: 'fieldsHelper',\n\n\t\tpriority: 30,\n\n\t\tactions: {\n\t\t\trefresh: 'renderGroups',\n\t\t},\n\n\t\trenderGroups: function () {\n\t\t\t// loop\n\t\t\tvar self = this;\n\t\t\t$( '.acf-fields:visible' ).each( function () {\n\t\t\t\tself.renderGroup( $( this ) );\n\t\t\t} );\n\t\t},\n\n\t\trenderGroup: function ( $el ) {\n\t\t\t// vars\n\t\t\tvar top = 0;\n\t\t\tvar height = 0;\n\t\t\tvar $row = $();\n\n\t\t\t// get fields\n\t\t\tvar $fields = $el.children( '.acf-field[data-width]:visible' );\n\n\t\t\t// bail early if no fields\n\t\t\tif ( ! $fields.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// bail early if is .-left\n\t\t\tif ( $el.hasClass( '-left' ) ) {\n\t\t\t\t$fields.removeAttr( 'data-width' );\n\t\t\t\t$fields.css( 'width', 'auto' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// reset fields\n\t\t\t$fields.removeClass( '-r0 -c0' ).css( { 'min-height': 0 } );\n\n\t\t\t// loop\n\t\t\t$fields.each( function ( i ) {\n\t\t\t\t// vars\n\t\t\t\tvar $field = $( this );\n\t\t\t\tvar position = $field.position();\n\t\t\t\tvar thisTop = Math.ceil( position.top );\n\t\t\t\tvar thisLeft = Math.ceil( position.left );\n\n\t\t\t\t// detect change in row\n\t\t\t\tif ( $row.length && thisTop > top ) {\n\t\t\t\t\t// set previous heights\n\t\t\t\t\t$row.css( { 'min-height': height + 'px' } );\n\n\t\t\t\t\t// update position due to change in row above\n\t\t\t\t\tposition = $field.position();\n\t\t\t\t\tthisTop = Math.ceil( position.top );\n\t\t\t\t\tthisLeft = Math.ceil( position.left );\n\n\t\t\t\t\t// reset vars\n\t\t\t\t\ttop = 0;\n\t\t\t\t\theight = 0;\n\t\t\t\t\t$row = $();\n\t\t\t\t}\n\n\t\t\t\t// rtl\n\t\t\t\tif ( acf.get( 'rtl' ) ) {\n\t\t\t\t\tthisLeft = Math.ceil(\n\t\t\t\t\t\t$field.parent().width() -\n\t\t\t\t\t\t\t( position.left + $field.outerWidth() )\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// add classes\n\t\t\t\tif ( thisTop == 0 ) {\n\t\t\t\t\t$field.addClass( '-r0' );\n\t\t\t\t} else if ( thisLeft == 0 ) {\n\t\t\t\t\t$field.addClass( '-c0' );\n\t\t\t\t}\n\n\t\t\t\t// get height after class change\n\t\t\t\t// - add 1 for subpixel rendering\n\t\t\t\tvar thisHeight = Math.ceil( $field.outerHeight() ) + 1;\n\n\t\t\t\t// set height\n\t\t\t\theight = Math.max( height, thisHeight );\n\n\t\t\t\t// set y\n\t\t\t\ttop = Math.max( top, thisTop );\n\n\t\t\t\t// append\n\t\t\t\t$row = $row.add( $field );\n\t\t\t} );\n\n\t\t\t// clean up\n\t\t\tif ( $row.length ) {\n\t\t\t\t$row.css( { 'min-height': height + 'px' } );\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * Adds a body class when holding down the \"shift\" key.\n\t *\n\t * @date\t06/05/2020\n\t * @since\t5.9.0\n\t */\n\tvar bodyClassShiftHelper = new acf.Model( {\n\t\tid: 'bodyClassShiftHelper',\n\t\tevents: {\n\t\t\tkeydown: 'onKeyDown',\n\t\t\tkeyup: 'onKeyUp',\n\t\t},\n\t\tisShiftKey: function ( e ) {\n\t\t\treturn e.keyCode === 16;\n\t\t},\n\t\tonKeyDown: function ( e ) {\n\t\t\tif ( this.isShiftKey( e ) ) {\n\t\t\t\t$( 'body' ).addClass( 'acf-keydown-shift' );\n\t\t\t}\n\t\t},\n\t\tonKeyUp: function ( e ) {\n\t\t\tif ( this.isShiftKey( e ) ) {\n\t\t\t\t$( 'body' ).removeClass( 'acf-keydown-shift' );\n\t\t\t}\n\t\t},\n\t} );\n} )( jQuery );\n","( function ( $, undefined ) {\n\t/**\n\t * acf.newMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.newMediaPopup = function ( args ) {\n\t\t// args\n\t\tvar popup = null;\n\t\tvar args = acf.parseArgs( args, {\n\t\t\tmode: 'select', // 'select', 'edit'\n\t\t\ttitle: '', // 'Upload Image'\n\t\t\tbutton: '', // 'Select Image'\n\t\t\ttype: '', // 'image', ''\n\t\t\tfield: false, // field instance\n\t\t\tallowedTypes: '', // '.jpg, .png, etc'\n\t\t\tlibrary: 'all', // 'all', 'uploadedTo'\n\t\t\tmultiple: false, // false, true, 'add'\n\t\t\tattachment: 0, // the attachment to edit\n\t\t\tautoOpen: true, // open the popup automatically\n\t\t\topen: function () {}, // callback after close\n\t\t\tselect: function () {}, // callback after select\n\t\t\tclose: function () {}, // callback after close\n\t\t} );\n\n\t\t// initialize\n\t\tif ( args.mode == 'edit' ) {\n\t\t\tpopup = new acf.models.EditMediaPopup( args );\n\t\t} else {\n\t\t\tpopup = new acf.models.SelectMediaPopup( args );\n\t\t}\n\n\t\t// open popup (allow frame customization before opening)\n\t\tif ( args.autoOpen ) {\n\t\t\tsetTimeout( function () {\n\t\t\t\tpopup.open();\n\t\t\t}, 1 );\n\t\t}\n\n\t\t// action\n\t\tacf.doAction( 'new_media_popup', popup );\n\n\t\t// return\n\t\treturn popup;\n\t};\n\n\t/**\n\t * getPostID\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar getPostID = function () {\n\t\tvar postID = acf.get( 'post_id' );\n\t\treturn acf.isNumeric( postID ) ? postID : 0;\n\t};\n\n\t/**\n\t * acf.getMimeTypes\n\t *\n\t * description\n\t *\n\t * @date\t11/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.getMimeTypes = function () {\n\t\treturn this.get( 'mimeTypes' );\n\t};\n\n\tacf.getMimeType = function ( name ) {\n\t\t// vars\n\t\tvar allTypes = acf.getMimeTypes();\n\n\t\t// search\n\t\tif ( allTypes[ name ] !== undefined ) {\n\t\t\treturn allTypes[ name ];\n\t\t}\n\n\t\t// some types contain a mixed key such as \"jpg|jpeg|jpe\"\n\t\tfor ( var key in allTypes ) {\n\t\t\tif ( key.indexOf( name ) !== -1 ) {\n\t\t\t\treturn allTypes[ key ];\n\t\t\t}\n\t\t}\n\n\t\t// return\n\t\treturn false;\n\t};\n\n\t/**\n\t * MediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar MediaPopup = acf.Model.extend( {\n\t\tid: 'MediaPopup',\n\t\tdata: {},\n\t\tdefaults: {},\n\t\tframe: false,\n\n\t\tsetup: function ( props ) {\n\t\t\t$.extend( this.data, props );\n\t\t},\n\n\t\tinitialize: function () {\n\t\t\t// vars\n\t\t\tvar options = this.getFrameOptions();\n\n\t\t\t// add states\n\t\t\tthis.addFrameStates( options );\n\n\t\t\t// create frame\n\t\t\tvar frame = wp.media( options );\n\n\t\t\t// add args reference\n\t\t\tframe.acf = this;\n\n\t\t\t// add events\n\t\t\tthis.addFrameEvents( frame, options );\n\n\t\t\t// strore frame\n\t\t\tthis.frame = frame;\n\t\t},\n\n\t\topen: function () {\n\t\t\tthis.frame.open();\n\t\t},\n\n\t\tclose: function () {\n\t\t\tthis.frame.close();\n\t\t},\n\n\t\tremove: function () {\n\t\t\tthis.frame.detach();\n\t\t\tthis.frame.remove();\n\t\t},\n\n\t\tgetFrameOptions: function () {\n\t\t\t// vars\n\t\t\tvar options = {\n\t\t\t\ttitle: this.get( 'title' ),\n\t\t\t\tmultiple: this.get( 'multiple' ),\n\t\t\t\tlibrary: {},\n\t\t\t\tstates: [],\n\t\t\t};\n\n\t\t\t// type\n\t\t\tif ( this.get( 'type' ) ) {\n\t\t\t\toptions.library.type = this.get( 'type' );\n\t\t\t}\n\n\t\t\t// type\n\t\t\tif ( this.get( 'library' ) === 'uploadedTo' ) {\n\t\t\t\toptions.library.uploadedTo = getPostID();\n\t\t\t}\n\n\t\t\t// attachment\n\t\t\tif ( this.get( 'attachment' ) ) {\n\t\t\t\toptions.library.post__in = [ this.get( 'attachment' ) ];\n\t\t\t}\n\n\t\t\t// button\n\t\t\tif ( this.get( 'button' ) ) {\n\t\t\t\toptions.button = {\n\t\t\t\t\ttext: this.get( 'button' ),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// return\n\t\t\treturn options;\n\t\t},\n\n\t\taddFrameStates: function ( options ) {\n\t\t\t// create query\n\t\t\tvar Query = wp.media.query( options.library );\n\n\t\t\t// add _acfuploader\n\t\t\t// this is super wack!\n\t\t\t// if you add _acfuploader to the options.library args, new uploads will not be added to the library view.\n\t\t\t// this has been traced back to the wp.media.model.Query initialize function (which can't be overriden)\n\t\t\t// Adding any custom args will cause the Attahcments to not observe the uploader queue\n\t\t\t// To bypass this security issue, we add in the args AFTER the Query has been initialized\n\t\t\t// options.library._acfuploader = settings.field;\n\t\t\tif (\n\t\t\t\tthis.get( 'field' ) &&\n\t\t\t\tacf.isset( Query, 'mirroring', 'args' )\n\t\t\t) {\n\t\t\t\tQuery.mirroring.args._acfuploader = this.get( 'field' );\n\t\t\t}\n\n\t\t\t// add states\n\t\t\toptions.states.push(\n\t\t\t\t// main state\n\t\t\t\tnew wp.media.controller.Library( {\n\t\t\t\t\tlibrary: Query,\n\t\t\t\t\tmultiple: this.get( 'multiple' ),\n\t\t\t\t\ttitle: this.get( 'title' ),\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\tfilterable: 'all',\n\t\t\t\t\teditable: true,\n\t\t\t\t\tallowLocalEdits: true,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\t// edit image functionality (added in WP 3.9)\n\t\t\tif ( acf.isset( wp, 'media', 'controller', 'EditImage' ) ) {\n\t\t\t\toptions.states.push( new wp.media.controller.EditImage() );\n\t\t\t}\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// log all events\n\t\t\t//frame.on('all', function( e ) {\n\t\t\t//\tconsole.log( 'frame all: %o', e );\n\t\t\t//});\n\n\t\t\t// add class\n\t\t\tframe.on(\n\t\t\t\t'open',\n\t\t\t\tfunction () {\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.closest( '.media-modal' )\n\t\t\t\t\t\t.addClass(\n\t\t\t\t\t\t\t'acf-media-modal -' + this.acf.get( 'mode' )\n\t\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// edit image view\n\t\t\t// source: media-views.js:2410 editImageContent()\n\t\t\tframe.on(\n\t\t\t\t'content:render:edit-image',\n\t\t\t\tfunction () {\n\t\t\t\t\tvar image = this.state().get( 'image' );\n\t\t\t\t\tvar view = new wp.media.view.EditImage( {\n\t\t\t\t\t\tmodel: image,\n\t\t\t\t\t\tcontroller: this,\n\t\t\t\t\t} ).render();\n\t\t\t\t\tthis.content.set( view );\n\n\t\t\t\t\t// after creating the wrapper view, load the actual editor via an ajax call\n\t\t\t\t\tview.loadEditor();\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// update toolbar button\n\t\t\t//frame.on( 'toolbar:create:select', function( toolbar ) {\n\t\t\t//\ttoolbar.view = new wp.media.view.Toolbar.Select({\n\t\t\t//\t\ttext: frame.options._button,\n\t\t\t//\t\tcontroller: this\n\t\t\t//\t});\n\t\t\t//}, frame );\n\n\t\t\t// on select\n\t\t\tframe.on( 'select', function () {\n\t\t\t\t// vars\n\t\t\t\tvar selection = frame.state().get( 'selection' );\n\n\t\t\t\t// if selecting images\n\t\t\t\tif ( selection ) {\n\t\t\t\t\t// loop\n\t\t\t\t\tselection.each( function ( attachment, i ) {\n\t\t\t\t\t\tframe.acf\n\t\t\t\t\t\t\t.get( 'select' )\n\t\t\t\t\t\t\t.apply( frame.acf, [ attachment, i ] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// on close\n\t\t\tframe.on( 'close', function () {\n\t\t\t\t// callback and remove\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tframe.acf.get( 'close' ).apply( frame.acf );\n\t\t\t\t\tframe.acf.remove();\n\t\t\t\t}, 1 );\n\t\t\t} );\n\t\t},\n\t} );\n\n\t/**\n\t * acf.models.SelectMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.models.SelectMediaPopup = MediaPopup.extend( {\n\t\tid: 'SelectMediaPopup',\n\t\tsetup: function ( props ) {\n\t\t\t// default button\n\t\t\tif ( ! props.button ) {\n\t\t\t\tprops.button = acf._x( 'Select', 'verb' );\n\t\t\t}\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.setup.apply( this, arguments );\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// plupload\n\t\t\t// adds _acfuploader param to validate uploads\n\t\t\tif (\n\t\t\t\tacf.isset( _wpPluploadSettings, 'defaults', 'multipart_params' )\n\t\t\t) {\n\t\t\t\t// add _acfuploader so that Uploader will inherit\n\t\t\t\t_wpPluploadSettings.defaults.multipart_params._acfuploader = this.get(\n\t\t\t\t\t'field'\n\t\t\t\t);\n\n\t\t\t\t// remove acf_field so future Uploaders won't inherit\n\t\t\t\tframe.on( 'open', function () {\n\t\t\t\t\tdelete _wpPluploadSettings\n\t\t\t\t\t\t.defaults.multipart_params._acfuploader;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// browse\n\t\t\tframe.on( 'content:activate:browse', function () {\n\t\t\t\t// vars\n\t\t\t\tvar toolbar = false;\n\n\t\t\t\t// populate above vars making sure to allow for failure\n\t\t\t\t// perhaps toolbar does not exist because the frame open is Upload Files\n\t\t\t\ttry {\n\t\t\t\t\ttoolbar = frame.content.get().toolbar;\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tconsole.log( e );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// callback\n\t\t\t\tframe.acf.customizeFilters.apply( frame.acf, [ toolbar ] );\n\t\t\t} );\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.addFrameEvents.apply( this, arguments );\n\t\t},\n\n\t\tcustomizeFilters: function ( toolbar ) {\n\t\t\t// vars\n\t\t\tvar filters = toolbar.get( 'filters' );\n\n\t\t\t// image\n\t\t\tif ( this.get( 'type' ) == 'image' ) {\n\t\t\t\t// update all\n\t\t\t\tfilters.filters.all.text = acf.__( 'All images' );\n\n\t\t\t\t// remove some filters\n\t\t\t\tdelete filters.filters.audio;\n\t\t\t\tdelete filters.filters.video;\n\t\t\t\tdelete filters.filters.image;\n\n\t\t\t\t// update all filters to show images\n\t\t\t\t$.each( filters.filters, function ( i, filter ) {\n\t\t\t\t\tfilter.props.type = filter.props.type || 'image';\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// specific types\n\t\t\tif ( this.get( 'allowedTypes' ) ) {\n\t\t\t\t// convert \".jpg, .png\" into [\"jpg\", \"png\"]\n\t\t\t\tvar allowedTypes = this.get( 'allowedTypes' )\n\t\t\t\t\t.split( ' ' )\n\t\t\t\t\t.join( '' )\n\t\t\t\t\t.split( '.' )\n\t\t\t\t\t.join( '' )\n\t\t\t\t\t.split( ',' );\n\n\t\t\t\t// loop\n\t\t\t\tallowedTypes.map( function ( name ) {\n\t\t\t\t\t// get type\n\t\t\t\t\tvar mimeType = acf.getMimeType( name );\n\n\t\t\t\t\t// bail early if no type\n\t\t\t\t\tif ( ! mimeType ) return;\n\n\t\t\t\t\t// create new filter\n\t\t\t\t\tvar newFilter = {\n\t\t\t\t\t\ttext: mimeType,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tstatus: null,\n\t\t\t\t\t\t\ttype: mimeType,\n\t\t\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\t\t\torderby: 'date',\n\t\t\t\t\t\t\torder: 'DESC',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpriority: 20,\n\t\t\t\t\t};\n\n\t\t\t\t\t// append\n\t\t\t\t\tfilters.filters[ mimeType ] = newFilter;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// uploaded to post\n\t\t\tif ( this.get( 'library' ) === 'uploadedTo' ) {\n\t\t\t\t// vars\n\t\t\t\tvar uploadedTo = this.frame.options.library.uploadedTo;\n\n\t\t\t\t// remove some filters\n\t\t\t\tdelete filters.filters.unattached;\n\t\t\t\tdelete filters.filters.uploaded;\n\n\t\t\t\t// add uploadedTo to filters\n\t\t\t\t$.each( filters.filters, function ( i, filter ) {\n\t\t\t\t\tfilter.text +=\n\t\t\t\t\t\t' (' + acf.__( 'Uploaded to this post' ) + ')';\n\t\t\t\t\tfilter.props.uploadedTo = uploadedTo;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// add _acfuploader to filters\n\t\t\tvar field = this.get( 'field' );\n\t\t\t$.each( filters.filters, function ( k, filter ) {\n\t\t\t\tfilter.props._acfuploader = field;\n\t\t\t} );\n\n\t\t\t// add _acfuplaoder to search\n\t\t\tvar search = toolbar.get( 'search' );\n\t\t\tsearch.model.attributes._acfuploader = field;\n\n\t\t\t// render (custom function added to prototype)\n\t\t\tif ( filters.renderFilters ) {\n\t\t\t\tfilters.renderFilters();\n\t\t\t}\n\t\t},\n\t} );\n\n\t/**\n\t * acf.models.EditMediaPopup\n\t *\n\t * description\n\t *\n\t * @date\t10/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tacf.models.EditMediaPopup = MediaPopup.extend( {\n\t\tid: 'SelectMediaPopup',\n\t\tsetup: function ( props ) {\n\t\t\t// default button\n\t\t\tif ( ! props.button ) {\n\t\t\t\tprops.button = acf._x( 'Update', 'verb' );\n\t\t\t}\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.setup.apply( this, arguments );\n\t\t},\n\n\t\taddFrameEvents: function ( frame, options ) {\n\t\t\t// add class\n\t\t\tframe.on(\n\t\t\t\t'open',\n\t\t\t\tfunction () {\n\t\t\t\t\t// add class\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.closest( '.media-modal' )\n\t\t\t\t\t\t.addClass( 'acf-expanded' );\n\n\t\t\t\t\t// set to browse\n\t\t\t\t\tif ( this.content.mode() != 'browse' ) {\n\t\t\t\t\t\tthis.content.mode( 'browse' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// set selection\n\t\t\t\t\tvar state = this.state();\n\t\t\t\t\tvar selection = state.get( 'selection' );\n\t\t\t\t\tvar attachment = wp.media.attachment(\n\t\t\t\t\t\tframe.acf.get( 'attachment' )\n\t\t\t\t\t);\n\t\t\t\t\tselection.add( attachment );\n\t\t\t\t},\n\t\t\t\tframe\n\t\t\t);\n\n\t\t\t// parent\n\t\t\tMediaPopup.prototype.addFrameEvents.apply( this, arguments );\n\t\t},\n\t} );\n\n\t/**\n\t * customizePrototypes\n\t *\n\t * description\n\t *\n\t * @date\t11/1/18\n\t * @since\t5.6.5\n\t *\n\t * @param\ttype $var Description. Default.\n\t * @return\ttype Description.\n\t */\n\n\tvar customizePrototypes = new acf.Model( {\n\t\tid: 'customizePrototypes',\n\t\twait: 'ready',\n\n\t\tinitialize: function () {\n\t\t\t// bail early if no media views\n\t\t\tif ( ! acf.isset( window, 'wp', 'media', 'view' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// fix bug where CPT without \"editor\" does not set post.id setting which then prevents uploadedTo from working\n\t\t\tvar postID = getPostID();\n\t\t\tif (\n\t\t\t\tpostID &&\n\t\t\t\tacf.isset( wp, 'media', 'view', 'settings', 'post' )\n\t\t\t) {\n\t\t\t\twp.media.view.settings.post.id = postID;\n\t\t\t}\n\n\t\t\t// customize\n\t\t\tthis.customizeAttachmentsButton();\n\t\t\tthis.customizeAttachmentsRouter();\n\t\t\tthis.customizeAttachmentFilters();\n\t\t\tthis.customizeAttachmentCompat();\n\t\t\tthis.customizeAttachmentLibrary();\n\t\t},\n\n\t\tcustomizeAttachmentsButton: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Button' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Extend\n\t\t\tvar Button = wp.media.view.Button;\n\t\t\twp.media.view.Button = Button.extend( {\n\t\t\t\t// Fix bug where \"Select\" button appears blank after editing an image.\n\t\t\t\t// Do this by simplifying Button initialize function and avoid deleting this.options.\n\t\t\t\tinitialize: function () {\n\t\t\t\t\tvar options = _.defaults( this.options, this.defaults );\n\t\t\t\t\tthis.model = new Backbone.Model( options );\n\t\t\t\t\tthis.listenTo( this.model, 'change', this.render );\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentsRouter: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Router' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar Parent = wp.media.view.Router;\n\n\t\t\t// extend\n\t\t\twp.media.view.Router = Parent.extend( {\n\t\t\t\taddExpand: function () {\n\t\t\t\t\t// vars\n\t\t\t\t\tvar $a = $(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t\tacf.__( 'Expand Details' ) +\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t\tacf.__( 'Collapse Details' ) +\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t].join( '' )\n\t\t\t\t\t);\n\n\t\t\t\t\t// add events\n\t\t\t\t\t$a.on( 'click', function ( e ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvar $div = $( this ).closest( '.media-modal' );\n\t\t\t\t\t\tif ( $div.hasClass( 'acf-expanded' ) ) {\n\t\t\t\t\t\t\t$div.removeClass( 'acf-expanded' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$div.addClass( 'acf-expanded' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t// append\n\t\t\t\t\tthis.$el.append( $a );\n\t\t\t\t},\n\n\t\t\t\tinitialize: function () {\n\t\t\t\t\t// initialize\n\t\t\t\t\tParent.prototype.initialize.apply( this, arguments );\n\n\t\t\t\t\t// add buttons\n\t\t\t\t\tthis.addExpand();\n\n\t\t\t\t\t// return\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentFilters: function () {\n\t\t\t// validate\n\t\t\tif (\n\t\t\t\t! acf.isset( wp, 'media', 'view', 'AttachmentFilters', 'All' )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar Parent = wp.media.view.AttachmentFilters.All;\n\n\t\t\t// renderFilters\n\t\t\t// copied from media-views.js:6939\n\t\t\tParent.prototype.renderFilters = function () {\n\t\t\t\t// Build `' )\n\t\t\t\t\t\t\t\t\t.val( value )\n\t\t\t\t\t\t\t\t\t.html( filter.text )[ 0 ],\n\t\t\t\t\t\t\t\tpriority: filter.priority || 50,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}, this )\n\t\t\t\t\t\t.sortBy( 'priority' )\n\t\t\t\t\t\t.pluck( 'el' )\n\t\t\t\t\t\t.value()\n\t\t\t\t);\n\t\t\t};\n\t\t},\n\n\t\tcustomizeAttachmentCompat: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'AttachmentCompat' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar AttachmentCompat = wp.media.view.AttachmentCompat;\n\t\t\tvar timeout = false;\n\n\t\t\t// extend\n\t\t\twp.media.view.AttachmentCompat = AttachmentCompat.extend( {\n\t\t\t\trender: function () {\n\t\t\t\t\t// WP bug\n\t\t\t\t\t// When multiple media frames exist on the same page (WP content, WYSIWYG, image, file ),\n\t\t\t\t\t// WP creates multiple instances of this AttachmentCompat view.\n\t\t\t\t\t// Each instance will attempt to render when a new modal is created.\n\t\t\t\t\t// Use a property to avoid this and only render once per instance.\n\t\t\t\t\tif ( this.rendered ) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t// render HTML\n\t\t\t\t\tAttachmentCompat.prototype.render.apply( this, arguments );\n\n\t\t\t\t\t// when uploading, render is called twice.\n\t\t\t\t\t// ignore first render by checking for #acf-form-data element\n\t\t\t\t\tif ( ! this.$( '#acf-form-data' ).length ) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t// clear timeout\n\t\t\t\t\tclearTimeout( timeout );\n\n\t\t\t\t\t// setTimeout\n\t\t\t\t\ttimeout = setTimeout(\n\t\t\t\t\t\t$.proxy( function () {\n\t\t\t\t\t\t\tthis.rendered = true;\n\t\t\t\t\t\t\tacf.doAction( 'append', this.$el );\n\t\t\t\t\t\t}, this ),\n\t\t\t\t\t\t50\n\t\t\t\t\t);\n\n\t\t\t\t\t// return\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tsave: function ( event ) {\n\t\t\t\t\tvar data = {};\n\n\t\t\t\t\tif ( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\t\t//_.each( this.$el.serializeArray(), function( pair ) {\n\t\t\t\t\t//\tdata[ pair.name ] = pair.value;\n\t\t\t\t\t//});\n\n\t\t\t\t\t// Serialize data more thoroughly to allow chckbox inputs to save.\n\t\t\t\t\tdata = acf.serializeForAjax( this.$el );\n\n\t\t\t\t\tthis.controller.trigger( 'attachment:compat:waiting', [\n\t\t\t\t\t\t'waiting',\n\t\t\t\t\t] );\n\t\t\t\t\tthis.model\n\t\t\t\t\t\t.saveCompat( data )\n\t\t\t\t\t\t.always( _.bind( this.postSave, this ) );\n\t\t\t\t},\n\t\t\t} );\n\t\t},\n\n\t\tcustomizeAttachmentLibrary: function () {\n\t\t\t// validate\n\t\t\tif ( ! acf.isset( wp, 'media', 'view', 'Attachment', 'Library' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// vars\n\t\t\tvar AttachmentLibrary = wp.media.view.Attachment.Library;\n\n\t\t\t// extend\n\t\t\twp.media.view.Attachment.Library = AttachmentLibrary.extend( {\n\t\t\t\trender: function () {\n\t\t\t\t\t// vars\n\t\t\t\t\tvar popup = acf.isget( this, 'controller', 'acf' );\n\t\t\t\t\tvar attributes = acf.isget( this, 'model', 'attributes' );\n\n\t\t\t\t\t// check vars exist to avoid errors\n\t\t\t\t\tif ( popup && attributes ) {\n\t\t\t\t\t\t// show errors\n\t\t\t\t\t\tif ( attributes.acf_errors ) {\n\t\t\t\t\t\t\tthis.$el.addClass( 'acf-disabled' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// disable selected\n\t\t\t\t\t\tvar selected = popup.get( 'selected' );\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\tselected.indexOf( attributes.id ) > -1\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.$el.addClass( 'acf-selected' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// render\n\t\t\t\t\treturn AttachmentLibrary.prototype.render.apply(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\targuments\n\t\t\t\t\t);\n\t\t\t\t},\n\n\t\t\t\t/*\n\t\t\t\t * toggleSelection\n\t\t\t\t *\n\t\t\t\t * This function is called before an attachment is selected\n\t\t\t\t * A good place to check for errors and prevent the 'select' function from being fired\n\t\t\t\t *\n\t\t\t\t * @type\tfunction\n\t\t\t\t * @date\t29/09/2016\n\t\t\t\t * @since\t5.4.0\n\t\t\t\t *\n\t\t\t\t * @param\toptions (object)\n\t\t\t\t * @return\tn/a\n\t\t\t\t */\n\n\t\t\t\ttoggleSelection: function ( options ) {\n\t\t\t\t\t// vars\n\t\t\t\t\t// source: wp-includes/js/media-views.js:2880\n\t\t\t\t\tvar collection = this.collection,\n\t\t\t\t\t\tselection = this.options.selection,\n\t\t\t\t\t\tmodel = this.model,\n\t\t\t\t\t\tsingle = selection.single();\n\n\t\t\t\t\t// vars\n\t\t\t\t\tvar frame = this.controller;\n\t\t\t\t\tvar errors = acf.isget(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\t'model',\n\t\t\t\t\t\t'attributes',\n\t\t\t\t\t\t'acf_errors'\n\t\t\t\t\t);\n\t\t\t\t\tvar $sidebar = frame.$el.find(\n\t\t\t\t\t\t'.media-frame-content .media-sidebar'\n\t\t\t\t\t);\n\n\t\t\t\t\t// remove previous error\n\t\t\t\t\t$sidebar.children( '.acf-selection-error' ).remove();\n\n\t\t\t\t\t// show attachment details\n\t\t\t\t\t$sidebar.children().removeClass( 'acf-hidden' );\n\n\t\t\t\t\t// add message\n\t\t\t\t\tif ( frame && errors ) {\n\t\t\t\t\t\t// vars\n\t\t\t\t\t\tvar filename = acf.isget(\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t'model',\n\t\t\t\t\t\t\t'attributes',\n\t\t\t\t\t\t\t'filename'\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// hide attachment details\n\t\t\t\t\t\t// Gallery field continues to show previously selected attachment...\n\t\t\t\t\t\t$sidebar.children().addClass( 'acf-hidden' );\n\n\t\t\t\t\t\t// append message\n\t\t\t\t\t\t$sidebar.prepend(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'