PageSourceSearch

https://www.eldoradoranch.com/real-estate/wp-content/plugins/estat…/classes/framework/assets/js/framework.js

js eldoradoranch.com collected 2026-10-08 02:01:19 UTC 41,574 bytes, 1,007 lines download raw bytes

1( function( $ ) {
2    'use strict';
3
4    window.EstatikFramework = { initFields: initFields };
5
6    /**
7     * @param size
8     * @returns {string}
9     */
10    function humanFileSize(size) {
11        var i = Math.floor( Math.log(size) / Math.log(1024) );
12        return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
13    }
14
15    var uploadFiles = [];
16
17    /**
18     * Upload and append files to the uploader area.
19     *
20     * @param $wrapper
21     * @param files
22     */
23    function esUploadFiles( $wrapper, files ) {
24        var item = $wrapper.find( '.js-es-hidden-item' ).html();
25        var form_data;
26
27        console.log(files);
28
29        Array.prototype.forEach.call( files, function( file ) {
30            var reader = new FileReader();
31            var uniqid = Date.now() + Math.random();
32
33            uploadFiles[ uniqid ] = file;
34
35            reader.addEventListener( 'load', function( event ) {
36                var html = item
37                    .replaceAll( '{name}', file.name )
38                    .replaceAll( '{caption}', '' )
39                    .replaceAll( '{size}', humanFileSize( file.size ) );
40
41                var $html = $( html ).addClass( 'es-media--uploading' );
42                $html.find( '.es-media__image img' ).attr( 'src', event.target.result );
43                $html.data( 'uniqid', uniqid );
44                $wrapper.find( '.js-files-list' ).append( $html );
45
46                form_data = new FormData();
47                form_data.append( 'file', file );
48                form_data.append( '_file-nonce', $wrapper.data( 'nonce' ) );
49                form_data.append( 'action', $wrapper.data( 'ajax-action' ) );
50                form_data.append( 'mime_allowed', $wrapper.data( 'mime-allowed' ) );
51
52                $.ajax( {
53                    type: 'POST',
54                    url: Es_Framework.ajaxurl,
55                    contentType: false,
56                    processData: false,
57                    dataType: 'json',
58                    data: form_data,
59                    success:function( response ) {
60                        $html.removeClass( 'es-media--uploading' );
61                        if ( response.status === 'success' ) {
62                            $html.find( '.js-es-caption' ).data( 'attachment-id', response.attachment_id );
63                            $html.find( '.js-es-media-field' ).val( response.attachment_id );
64                        } else {
65                            $html.addClass( 'es-media--failed' )
66                                .find( '.js-es-file__msg' )
67                                .addClass( 'es-file__msg--error' )
68                                .html( Es_Framework.tr.failed );
69                        }
70                    },
71                    xhr: function(){
72                        // get the native XmlHttpRequest object
73                        var xhr = $.ajaxSettings.xhr() ;
74                        // set the onprogress event handler
75                        xhr.upload.onprogress = function( evt ) {
76                            var progress = evt.loaded / evt.total * 100;
77                            $html.find( '.js-es-progress' ).animate( {width: progress + '%'}, 400 );
78                        } ;
79                        // set the onload event handler
80                        xhr.upload.onload = function() {
81                            $html.find( '.js-es-progress' ).animate( {width:'100%'}, 400 );
82                        };
83                        return xhr ;
84                    }
85                } ).fail( function() {
86                    $html.addClass( 'es-media--failed' )
87                        .find( '.js-es-file__msg' )
88                        .addClass( 'es-file__msg--error' )
89                        .html( Es_Framework.tr.failed );
90                } );
91            } );
92
93            reader.readAsDataURL( file );
94        } );
95    }
96
97    function initFields( $context ) {
98
99        $context = $context || $( document );
100
101        $context.find( '.js-es-field__date' ).each( function() {
102            var format = $( this ).data( 'date-format' ) || 'm/d/y';
103            if ( ! $( this ).is( ':disabled' ) ) {
104                $( this ).datetimepicker( {
105                    format: format,
106                    dateFormat: format,
107                    timepicker: false
108                } );
109            }
110        } );
111
112        $context.find( '.js-es-f-select2' ).each( function() {
113            var config = {};
114            var $el = $( this );
115
116            $el.select2( config );
117        } );
118
119        $context.find( '.js-es-field__date-time' ).each( function() {
120            var format = $( this ).data( 'date-format' ) || 'm/d/y';
121            if ( ! $( this ).is( ':disabled' ) ) {
122                $( this ).datetimepicker( {
123                    format: format,
124                    dateFormat: format,
125                    timepicker: true
126                } );
127            }
128        } );
129
130        if ( typeof $.fn.wpColorPicker !== 'undefined' ) {
131            $( '.js-es-iris-color-picker:not([disabled])', $context ).wpColorPicker();
132        }
133
134        $context.find( '.js-es-items' ).each( function() {
135            var $list = $( this );
136
137            $( this ).sortable( {
138                change: function() {
139                    $list.find( 'input' ).eq( 0 ).trigger( 'change' );
140                }
141            } );
142            $( this ).disableSelection();
143        } );
144
145        $context.find( '.js-es-select2-search:visible:not(:disabled)' ).each( function() {
146            var $field = $( this );
147
148            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {
149                var config = {
150                    width: '100%',
151                };
152
153                if ( $field.data( 'placeholder' ) ) {
154                    config.placeholder = $field.data( 'placeholder' );
155                }
156
157                if ( $field.data( 'formatNoMatches' ) ) {
158                    config.formatNoMatches = function () {
159                        return $field.data( 'formatNoMatches' )
160                    }
161                }
162
163                if ( $field.data( 'request' ) ) {
164                    config.ajax = {
165                        delay: 300,
166                        url: Es_Framework.ajaxurl,
167                        dataType: 'json',
168                        data: function (params) {
169                            var request_params = $field.data( 'request' );
170
171                            if ( params.hasOwnProperty( 'term' ) ) {
172                                request_params.s = params.term;
173                            }
174
175                            return request_params;
176                        },
177                    };
178                }
179
180                $field.select2( config );
181            }
182        } );
183
184        $context.find( '.js-es-entities-items-search:visible:not(:disabled)' ).each( function() {
185            var $field = $( this );
186
187            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {
188                $field.select2( {
189                    width: '100%',
190                    dropdownCssClass: "es-select2__dropdown",
191                    placeholder: $field.data( 'placeholder' ),
192                    ajax: {
193                        delay: 300,
194                        url: Es_Framework.ajaxurl,
195                        dataType: 'json',
196                        data: function (params) {
197                            var request_params = $field.data( 'request' );
198
199                            if ( params.hasOwnProperty( 'term' ) ) {
200                                request_params.s = params.term;
201                            }
202
203                            return request_params;
204                        },
205                        processResults: function (data) {
206                            data = data || {};
207
208                            if ( ! data.message ) {
209                                data = [];
210                                $field.find( 'option' ).each(function ( i, e ) {
211                                    var object = { id: e.value, text: e.text };
212                                    if ( $.inArray( object, data.items ) === -1 ) {
213                                        data.push( object );
214                                    }
215                                } );
216                            } else {
217                                data = data.message;
218                            }
219
220                            // Transforms the top-level key of the response object from 'items' to 'results'
221                            return {
222                                results: data
223                            };
224                        }
225                    }
226                } ).change( function() {
227                    var value = $( this ).val();
228                    var item_markup = $( this ).data( 'item-markup' );
229                    var $field = $( this );
230
231                    if ( value ) {
232                        $field.prop( 'disabled', 'disabled' ).attr( 'disabled', 'disabled' );
233
234                        $.get( Es_Framework.ajaxurl, {value: value, action: $( this ).data( 'action' ) }, function( response ) {
235                            response = response || {};
236
237                            if ( response.id ) {
238                                var $wrapper = $field.closest( '.js-es-entities-list-field' ).find( '.js-es-items' );
239                                var $existing_item = $wrapper.find( '.entity-box--' + response.id );
240
241                                if ( ! $existing_item.length ) {
242                                    item_markup = item_markup
243                                        .replace( '{value}', response.id )
244                                        .replace( '{id}', response.id )
245                                        .replace( '{title}', response.text )
246                                        .replace( '{subtitle}', response.subtitle )
247                                        .replace( '{image}', response.image );
248
249                                    $wrapper.append( item_markup );
250
251                                    $field.val( null ).trigger( 'change' );
252                                } else {
253                                    $existing_item.animate( {opacity: 0.5}, 300, function() {
254                                        $existing_item.animate( {opacity: 1}, 300 );
255                                    } );
256                                }
257                            }
258                        }, 'json' ).always( function() {
259                            $field.removeProp( 'disabled' ).removeAttr( 'disabled' );
260                        } );
261                    }
262                } );
263            }
264        } );
265
266        $context.find( '.js-es-phone-field:visible:not(:disabled)' ).each( function() {
267            var $field = $( this );
268
269            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {
270
271                $field.select2({
272                    minimumResultsForSearch: -1,
273                    dropdownCssClass: 'es-phone-dropdown content-font es-select2__dropdown--positioning',
274                    escapeMarkup: function (m) {
275                        return m;
276                    },
277                    templateSelection: function (option) {
278                        var country_icons = $field.data('icons');
279                        if (typeof country_icons[option.id] === 'undefined') {
280                            return option.text;
281                        } else {
282                            return '<img src="' + country_icons[option.id] + '"/>';
283                        }
284                    },
285                    templateResult: function (option) {
286                        var country_icons = $field.data('icons');
287                        var codes = $field.data('codes');
288                        if (typeof country_icons[option.id] !== 'undefined') {
289                            return '<img src="' + country_icons[option.id] + '"/>' +
290                                option.text +
291                                '<span class="es-country-code">' + codes[option.id] + '</span>';
292                        } else {
293                            return '<div class="es-flag-space"></div>' + option.text;
294                        }
295                    }
296                } ).on( 'change', function () {
297                    var codes = $field.data('codes');
298                    var code = $field.val();
299                    var tel_code = codes[ code ];
300                    var $tel = $field.closest( '.es-field--phone' ).find( '.js-es-phone' );
301                    var replaced = false;
302
303                    Object.entries( codes ).forEach( function( codes_item ) {
304                        if ( $tel.val().indexOf( codes_item[1] ) !== -1 && codes_item[1].length ) {
305                            $tel.val( $tel.val().replace( codes_item[1], tel_code ) );
306                            replaced = true;
307                        }
308                    } );
309
310                    if ( ! replaced && tel_code.length ) {
311                        $tel.val( tel_code );
312                    }
313                } ).trigger( 'change' );
314
315            }
316
317        } );
318
319        $( 'input[data-toggle-container]:not([data-save-field]), input[data-inactive-container]:not(data-save-field), input[data-toggle-disabled]' ).trigger( 'change' );
320    }
321
322    $( function() {
323
324        initFields();
325
326        $( document ).on( 'widget-added', function ( $control ) {
327            initFields();
328        } );
329
330        $( document ).on( 'click', '.es-field [type=radio]', function( e ) {
331            if ( e.ctrlKey || e.metaKey ) {
332                $( this ).removeProp( 'checked' ).removeAttr( 'checked' );
333            }
334        } );
335
336        $( document ).on( 'change', '.js-es-upload-files', function(e) {
337            if ( $( this )[0].files[0] === undefined ) return;
338
339            var formData = new FormData();
340            var $button = $( this ).next();
341            var dataRequest = $( this ).data( 'request' );
342
343            formData.append( "file", $( this )[0].files[0] );
344            formData.append( "action", 'es_framework_upload_file' );
345            formData.append( '_file-nonce', $( this ).data( 'nonce' ) );
346            formData.append( 'mime_allowed', $( this ).data( 'mime-allowed' ) );
347
348            if ( ! $.isEmptyObject( dataRequest ) ) {
349                for ( const [key, value] of Object.entries( dataRequest ) ) {
350                    formData.append( key, value );
351                }
352            }
353
354            if ( $button.hasClass( 'es-btn' ) ) {
355                $button.addClass( 'es-preload' );
356            }
357
358            $.ajax({
359                type: 'POST',
360                url: Es_Framework.ajaxurl,
361                contentType: false,
362                processData: false,
363                dataType: 'json',
364                data: formData,
365                success: function (response) {
366                    response = response || {}
367                    if ( response.status === 'success' ) {
368                        if ( dataRequest.file_type === 'icon-uploader' ) {
369                            $( '.es-icons-overlay ul' ).each( function() {
370                                $( this ).append( response.icon );
371                            } );
372                        }
373                    } else if ( response.status === 'error' ) {
374                        alert( response.message );
375                    }
376                },
377            }).always( function() {
378                $button.removeClass( 'es-preload' );
379            } );
380
381            e.preventDefault();
382        } );
383
384        $( '.js-files-list' ).sortable();
385
386        $( document ).on( 'click', '.js-es-reload-media', function() {
387            var $wrapper = $( this ).closest( '.js-es-file' );
388            var uniqid = $wrapper.data( 'uniqid' );
389            var file = uploadFiles[ uniqid ];
390
391            console.log(file, uniqid, $wrapper, $wrapper.data());
392            var files = [];
393            files.push( file );
394
395            esUploadFiles( $wrapper.closest( '.js-es-uploader-area' ), files );
396
397            uploadFiles[ uniqid ] = null;
398            $wrapper.remove();
399            return false;
400        } );
401
402        $( document ).on( 'click', '.js-es-delete-media', function() {
403            $( this ).closest( '.js-es-file' ).remove();
404            return false;
405        } );
406
407        $( document ).on( 'drop', '.js-es-uploader-area', function(e) {
408            e.preventDefault();
409            var $wrapper = $( this );
410            var files = e.originalEvent.dataTransfer.files;
411
412            if ( files.length ) {
413                esUploadFiles( $wrapper, files );
414            }
415        } );
416
417        $( document ).on( 'change', '[data-value-container]', function() {
418            var default_value = $( this ).data( 'value-default' ) || '';
419            var suffix = $( this ).data( 'value-suffix' );
420            var value = +$( this ).val() ? $( this ).val() + suffix : default_value;
421            $( $( this ).data( 'value-container' ) ).html( value );
422        } );
423
424        $( '[data-value-container]' ).trigger( 'change' );
425
426        $( document ).on( 'change', '.js-es-drag-files-field', function(e) {
427            e.preventDefault();
428            var files = $( this )[0].files;
429            var $wrapper = $( this ).closest( '.js-es-uploader-area' );
430
431            if ( files ) {
432                esUploadFiles( $wrapper, files );
433            }
434        } );
435
436        $( document ).on( 'dragenter dragover', '.js-es-uploader-area', function() {
437            $( this ).addClass( 'es-uploader-area--focused' );
438        } );
439
440        $( document ).on( 'dragleave drop', '.js-es-uploader-area', function() {
441            $( this ).removeClass( 'es-uploader-area--focused' );
442        } );
443
444        $( document ).on( 'dragover', '.js-es-uploader-area', function() {
445            return false;
446        } );
447
448        $( '.js-es-tabs' ).on( 'tab_changed', function() {
449            initFields( $( this ) );
450        } );
451
452        $( document ).on( 'change', '.js-es-password-field', function() {
453            var val = $( this ).val();
454            var email_val = $( this ).data( 'email' ) ?
455                $( this ).data( 'email' ) : $( this ).closest( 'form' ).find( '[type="email"]' ).val();
456            var $list = $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__validate-list' );
457            var validate1 = false;
458            var validate2 = false;
459            var validate3 = false;
460
461            if ( val && val.length ) {
462                if ( email_val.length && email_val !== val ) {
463                    $list.find( '.es-validate-item__contain' ).addClass( 'es-validate-item--active' );
464                    validate1 = true;
465                } else {
466                    $list.find( '.es-validate-item__contain' ).removeClass( 'es-validate-item--active' );
467                    validate1 = false;
468                }
469
470                if ( val.length >= 8 ) {
471                    validate2 = true;
472                    $list.find( '.es-validate-item__length' ).addClass( 'es-validate-item--active' );
473                } else {
474                    validate2 = false;
475                    $list.find( '.es-validate-item__length' ).removeClass( 'es-validate-item--active' );
476                }
477
478                var regExp = /[a-zA-Z0-9]/g;
479
480                if ( regExp.test( val ) ) {
481                    validate3 = true;
482                    $list.find( '.es-validate-item__char' ).addClass( 'es-validate-item--active' );
483                } else {
484                    validate3 = false;
485                    $list.find( '.es-validate-item__char' ).removeClass( 'es-validate-item--active' );
486                }
487            }
488
489            if ( validate1 && validate2 && validate3 ) {
490                $( this ).closest( 'form' ).find( '[type=submit]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
491            } else {
492                $( this ).closest( 'form' ).find( '[type=submit]' ).prop( 'disabled', 'disabled' );
493            }
494        } );
495
496        $( '.js-es-password-field' ).trigger( 'change' );
497
498        $( document ).on( 'click', '.js-es-toggle-pwd', function() {
499            var $field = $( this ).closest( '.es-field, .js-es-field' ).find( 'input' );
500            $( this ).toggleClass( 'es-secondary-color' );
501            if ( $field.attr( 'type' ) === 'text' ) {
502                $field.prop( 'type', 'password' );
503            } else {
504                $field.prop( 'type', 'text' );
505            }
506
507            return false;
508        } );
509
510        $( document ).on( 'input', '.es-field__input[maxlength]', function() {
511            var length = $( this ).val().length;
512
513            $( this ).closest( '.es-field, .js-es-field' ).find( '.js-es-strlen' ).html( length );
514        } );
515
516        $( document ).on( 'click', '[data-trigger-click]', function() {
517            $( $( this ).data( 'trigger-click' ) ).trigger( 'click' );
518
519            return false;
520        } );
521
522        $( document ).on( 'click', '.js-es-delete-entity', function() {
523            $( this ).closest( '.js-es-entity-box' ).remove();
524            return false;
525        } );
526
527        // Input on register page.
528        $( '.js-es-image-field' ).change( function() {
529            var el = this;
530
531            var reader = new FileReader();
532
533            if ( el.files.length ) {
534                reader.onload = function( e ) {
535                    $( el ).closest( 'div' ).find( $( el ).data( 'img' ) )
536                        .attr( 'src', e.target.result )
537                        .attr( 'srcset', '' );
538
539                    $( el ).closest( '.js-es-photo' ).find( '.js-es-delete-photo' ).removeClass( 'es-hidden' );
540                };
541
542                reader.readAsDataURL( el.files[0] );
543            }
544        } );
545
546        $( '.js-es-delete-photo' ).click( function() {
547            var $wrapper = $( this ).closest( '.js-es-photo' );
548            $wrapper.find( '.js-es-image-field' ).val('').trigger( 'change' ).trigger( 'input' );
549            $wrapper.find( '.js-es-avatar-field' ).val('').trigger( 'change' ).trigger( 'input' );
550            var img = $wrapper.find( '.js-es-photo__image' ).data( 'photo' );
551            $( this ).addClass( 'es-hidden' );
552
553            $wrapper.find( '.js-es-photo__image img' ).replaceWith( img );
554            return false;
555        } );
556
557        $( document ).on( 'click', '.js-es-reset-value', function() {
558            $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__input' ).val( $( this ).data( 'value' ) ).trigger( 'change' );
559            return false;
560        } );
561
562        $( document ).on( 'click', '.js-es-field__show-more', function() {
563            $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field--visibility' ).toggleClass( 'es-hidden' );
564            return false;
565        } );
566
567        $( '.js-es-media-files' ).sortable();
568
569        $( document ).on( 'click', '.js-es-delete-fields-item', function() {
570            $( this ).closest( '.es-item' ).remove();
571            return false;
572        } );
573
574        $( document ).on( 'click', '.js-es-field--rating .js-es-rating .es-star', function() {
575            var $el = $( this );
576            var value = $el.data( 'value' );
577            var $rating_wrap = $( this ).closest( '.js-es-rating' );
578            var $input = $( this ).closest( '.js-es-field--rating' ).find( '.es-field__input' );
579
580            if ( $el.hasClass( 'es-star--active' ) ) {
581                value -= 1;
582            }
583
584            $input.val( value );
585            $rating_wrap.find( '.es-star' ).removeClass( 'es-star--active' );
586
587            $rating_wrap.find( '.es-star:nth-child(-n+' + value +  ')' ).addClass( 'es-star--active' );
588        } );
589
590        $( document ).on( 'click', '.js-es-add-fields-item', function() {
591            var $selector = $( this ).closest( '.es-fields-list__selector' ).find( '.js-es-items-selector' );
592            var field = $selector.val();
593            var item_html = $selector.data( 'item' );
594            var $list = $( this ).closest( '.es-field--fields-list-selector' ).find( '.js-es-items' );
595            var label = $selector.find( 'option:selected' ).html();
596
597            if ( field && ! $list.find( '[data-item-id="' + field + '"]' ).length ) {
598                $selector.val( '' ).trigger( 'change' );
599                $list.append( item_html.replace( '{value}', field ).replace( '{field_name}', label ).replace( '{item-id}' ) );
600            } else {
601                $list.find( '[data-item-id="' + field + '"]' ).animate( {opacity: 0.5}, 300, function() {
602                    $( this ).animate( {opacity: 1}, 300 );
603                } );
604                $selector.val( '' ).trigger( 'change' );
605            }
606
607            return false;
608        } );
609
610        $( document ).on( 'change', '.js-es-items-selector', function() {
611            var $selector = $( this );
612            var field = $selector.val();
613            var $button = $selector.closest( '.es-fields-list__selector' ).find( '.js-es-add-fields-item' );
614            $button.prop( 'disabled', ! field );
615        } );
616
617        $( document ).on( 'click', '.js-es-icon-field', function() {
618            var $el = $( this );
619
620            $el.closest( '.es-icon-field-wrap' ).toggleClass( 'es-icon-field--active' );
621        } );
622
623        $( document ).on( 'click', '.es-file__caption-container, .js-es-file__caption-field', function( e ) {
624            e.stopPropagation();
625        } );
626
627        $( document ).on( 'click', '.js-es-icon-item', function() {
628            var $el = $( this );
629            var icon_config = $el.data( 'icon' );
630            $el.closest( '.es-icon-field-wrap' )
631                .removeClass( 'es-icon-field--active' )
632                .find( '.js-es-icon-html' )
633                .html( icon_config.icon );
634
635            $el.closest( '.es-icon-field-wrap' ).find( '.es-field__input' ).val( JSON.stringify( icon_config ) );
636        } );
637
638        $( document ).click( function( e ) {
639            if ( ! $( e.target ).closest( '.es-icon-field-wrap' ).length ) {
640                $( '.es-icon-field-wrap' ).removeClass( 'es-icon-field--active' );
641            }
642
643            //if you click on anything except the modal itself or the "open modal" link, close the modal
644            if ( ! $( e.target ).closest( ".es-file__caption-container").length ) {
645                $( '.es-file__caption-container.es-file__caption--edit' ).each( function() {
646                    var $el = $( this );
647                    var $input = $el.find( '.js-es-file__caption-field' );
648
649                    $.post( Es_Framework.ajaxurl, {
650                        attachment_id: $input.data( 'attachment-id' ),
651                        caption: $input.val(),
652                        action: 'es_framework_attachment_save_caption',
653                        nonce: Es_Framework.nonces.attachment_save_caption_nonce
654                    } ).always( function() {
655                        $el.removeClass( 'es-file__caption--edit' );
656
657                        var $caption = $el.find( '.js-es-caption' );
658
659                        if ( $input.val() ) {
660                            if ( $caption.prop( 'tagName').toLowerCase() !== 'input' ) {
661                                $el.find( '.js-es-caption' ).html( $input.val() ).removeClass( 'no-caption' );
662                            }
663                        } else {
664                            if ( $caption.prop( 'tagName').toLowerCase() !== 'input' ) {
665                                $el.find('.js-es-caption').html(Es_Framework.tr.add_caption).addClass('no-caption');
666                            }
667                        }
668                    } );
669                } );
670            }
671        });
672
673        // $( '.es-icons-overlay' ).on( 'click', function(e) {
674        //     e.stopPropagation();
675        // } );
676
677        // Add repeater item button handler.
678        $( document ).on( 'click', '.js-es-repeater__add-item', function() {
679            var $el = $( this );
680            var $field_wrapper = $el.closest( '.es-field--repeater' );
681            var $wrapper = $field_wrapper.find( '.js-es-repeater__wrapper' );
682            var index = +$wrapper.data( 'index' );
683            var $to_clone = $field_wrapper.find( '.js-es-to-clone .js-es-repeater-item' );
684
685            var $cloned = $to_clone.clone();
686            $cloned.data( 'item-index', index );
687
688            $wrapper.find( '.js-es-repeater__items' ).append( $cloned );
689
690            $cloned.find( '[disabled]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
691            $cloned.find( '.es-field--disabled' ).removeClass( 'es-field--disabled' );
692
693            $cloned.find( '[for]' ).each( function() {
694                $( this ).prop( 'for', $( this ).prop( 'for' ).replaceAll( '{#index}', index ) );
695            } );
696
697            $cloned.find( '.es-field__label' ).each( function() {
698                $( this ).text( $( this ).text().replaceAll( '{#index}', index + 1 ) );
699            } );
700
701            $cloned.find( '[name], [id], [for], [value]' ).each( function() {
702                var $el = $( this );
703                ['name', 'id', 'value', 'for'].forEach( function( selector ) {
704                    if ( $el.prop( selector ) ) {
705                        var modified = $el.prop( selector ).replaceAll( '{#index}', index );
706                        $el.prop( selector, modified ).attr( selector, modified );
707                    }
708                } );
709            } );
710
711            $wrapper.data( 'index', index + 1 );
712
713            $cloned.find('[disabled]').removeProp( 'disabled' ).removeAttr( 'disabled' );
714            $cloned.find( '.es-switcher--disabled' ).removeClass( 'es-switcher--disabled' );
715
716            $cloned.find( 'input:not([type=radio])' ).trigger( 'change' );
717
718            if ( typeof $.fn.wpColorPicker !== 'undefined' ) {
719                $cloned.find('.js-es-iris-color-picker:not([disabled])').wpColorPicker();
720            }
721            initFields( $cloned );
722
723            return false;
724        } );
725
726        // Remove repeater item button handler.
727        $( document ).on( 'click', '.js-es-repeater__delete-item', function() {
728            var $el = $( this );
729            var $wrapper = $el.closest( '.js-es-repeater__wrapper' );
730            var index = $wrapper.data( 'index' );
731            $el.closest( '.js-es-repeater-item' ).remove();
732
733            $wrapper.data( 'index', index - 1 );
734
735            $wrapper.find( 'input:not([type=radio])' ).trigger( 'change' );
736
737            return false;
738        } );
739
740        // Upload file handler.
741        if ( typeof wp !== 'undefined' && wp.media && wp.media.editor ) {
742
743            $( document ).on( 'click', '.js-es-media-editor', function() {
744                var frame = wp.media( { multiple: false } );
745                var $field = $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__input' );
746
747                frame.open();
748
749                // When an image is selected in the media frame...
750                frame.on( 'select', function() {
751
752                    // Get media attachment details from the frame state
753                    var attachments = frame.state().get('selection').toJSON();
754
755                    // Attachment IDs array.
756                    var ids = [];
757
758                    if ( attachments.length ) {
759                        var attachment = attachments[0];
760                        $field.val( attachment.url );
761                    }
762                } );
763
764                return false;
765            } );
766
767            $( document ).on( 'click', '.js-es-media-button', function () {
768                var $button = $( this );
769                var $wrapper = $button.parent();
770                var $input = $wrapper.find( '.js-es-media-field' );
771                var media_item_markup = $button.data( 'item-markup' );
772                var is_multiple = $button.data( 'multiple' );
773                var item;
774
775                var frame = wp.media( { multiple: is_multiple } );
776
777                frame.open();
778
779                // When an image is selected in the media frame...
780                frame.on( 'select', function() {
781
782                    // Get media attachment details from the frame state
783                    var attachments = frame.state().get('selection').toJSON();
784
785                    // Attachment IDs array.
786                    var ids = [];
787
788                    if ( attachments.length ) {
789                        var $files_container = $button.parent().find( '.js-es-media-files' );
790
791                        for ( var i in attachments ) {
792                            var file = attachments[i];
793                            var filename = file.filename;
794                            var url = file.url;
795                            var caption = file.caption ? file.caption : false;
796
797                            if ( typeof file.sizes !== 'undefined' ) {
798                                url = file.url;
799                            }
800
801                            ids.push( attachments[i].id );
802
803                            item = media_item_markup
804                                .replaceAll( '{filename}', filename )
805                                .replaceAll( '{attachment_id}', file.id )
806                                .replaceAll( '{filesize}', file.filesizeHumanReadable )
807                                .replaceAll( '{url}', url )
808                                .replaceAll( '{caption}', caption ? caption : $button.data( 'caption' ) )
809                                .replaceAll( '{input_caption}', caption ? caption : '' )
810                                .replaceAll( '{no_caption}', caption ? '' : 'no-caption' );
811
812                            var $repeater = $files_container.closest( '.js-es-repeater__wrapper' );
813
814                            if ( $repeater.length ) {
815                                var index = $files_container.closest( '.js-es-repeater-item' ).data( 'item-index' );
816                                item = item.replaceAll( '{#index}', index );
817                            }
818
819                            if ( $button.data( 'multiple' ) ) {
820                                $files_container.append( item );
821                                $files_container.sortable();
822                            } else {
823                                $files_container.html( item );
824                            }
825
826                            $files_container.find( '[disabled]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
827                        }
828                    }
829                } );
830
831                return false;
832            } );
833        }
834
835        $( document ).on( 'click', '.js-es-caption', function() {
836            $( this ).closest( '.es-file__caption-container' ).addClass( 'es-file__caption--edit' );
837            return false;
838        } );
839
840        $( document ).on( 'click', '.js-es-media-delete-attachment', function() {
841            var $el = $( this );
842            $el.closest( 'li' ).remove();
843
844            return false;
845        } );
846
847        $( document ).on( 'click', '.js-es-tabs .js-es-tabs__nav a.es-tabs__nav-link', function( e ) {
848            var $wrapper = $( this ).closest( '.js-es-tabs' );
849            var tabContainer = $( this ).data( 'tab' ) || $( this ).attr( 'href' );
850
851            if ( $( tabContainer ).length ) {
852                $wrapper.find( '.js-es-tabs__wrapper .js-es-tabs__content' ).addClass( 'es-hidden' );
853                $wrapper.find( tabContainer ).removeClass( 'es-hidden' );
854                $wrapper.find( '.js-es-tabs__nav li' ).removeClass( 'active' );
855                $( this ).closest( 'li' ).addClass( 'active' );
856
857                if ( history.pushState ) {
858                    history.pushState( null, null, tabContainer );
859                }
860                else {
861                    location.hash = tabContainer;
862                }
863
864                $wrapper.trigger( 'tab_changed', [ tabContainer, $wrapper, $( this ) ] );
865            }
866
867            return false;
868        } );
869
870        try {
871            if ( window.location.hash && $( window.location.hash ).length ) {
872                if ( $( window.location.hash ).hasClass( 'js-es-tabs__content' ) ) {
873                    var $link = $( 'a[href="' + window.location.hash + '"]' );
874                    $link.trigger( 'click' );
875                }
876            }
877        } catch( e ) {}
878
879        $( '[data-toggle-label]' ).click( function( e ) {
880            var temp_label = $( this ).html();
881            $( this ).html( $( this ).data( 'toggle-label' ) ).data(  'toggle-label', temp_label );
882
883            e.preventDefault();
884        } );
885
886
887        $( '.js-es-tabs' ).each( function() {
888            if ( ! $( this ).find( '.js-es-tabs__nav li.active' ).length ) {
889                var $link = $( this ).find( '.js-es-tabs__nav li:first-child a.es-tabs__nav-link' );
890                $link.trigger( 'click' );
891            }
892
893            window.scrollTo( 0, 0 );
894
895            setTimeout( function() {
896                window.scrollTo( 0, 0 );
897            }, 1 );
898        } );
899
900        $( document ).ajaxComplete( function() {
901           initFields();
902        } );
903
904        $( document ).on( 'click', '.js-incrementer-button', function() {
905            var method = $( this ).data( 'method' );
906            var $input = $( this ).closest( '.js-es-incrementer-field' ).find( '.es-field__input' );
907            var max = $input.prop( 'max' );
908            var min = $input.prop( 'min' );
909            var step = + $input.prop( 'step' );
910            step = step || 1;
911            var val = $input.val() ? $input.val() : 0;
912
913            if ( 'increment' === method ) {
914                $input.val( ( +max && +max > +val ) || ! max ? + val + step : val );
915            } else {
916                $input.val((min && min < val) || min === '' ? +val - step : val);
917            }
918
919            $input.trigger( 'change' );
920
921            return false;
922        } );
923
924        $( document ).on( 'change', 'input[data-toggle-disabled]',  function() {
925            var $el = $( this );
926            var $field = $( $el.data( 'toggle-disabled' ) );
927            var revert = $el.data( 'revert-toggler' );
928
929            if ( $field.length ) {
930                var checked = $el.is( ':checked' );
931                checked = revert ? ! checked : checked;
932                if ( checked ) {
933                    $field.prop( 'disabled', 'disabled' ).closest( '.es-field, .js-es-field' ).addClass( 'es-field--disabled' );
934                } else {
935                    $field.removeProp( 'disabled' ).removeAttr( 'disabled' ).closest( '.es-field, .js-es-field' ).removeClass( 'es-field--disabled' );
936                }
937            }
938        } );
939
940        $( document ).on( 'change', 'input[data-toggle-container], input[data-inactive-container]',  function() {
941            var $el = $( this );
942            var container = $el.data( 'toggle-container' );
943
944            if ( container && container.length ) {
945                var $container = $('body').find( container );
946
947                if ( $el.is( ':checked' ) ) {
948                    $container.removeClass( 'es-hidden' );
949                } else {
950                    $container.addClass( 'es-hidden' );
951                }
952            } else {
953                var $active_container = $( $el.data( 'active-container' ) );
954                var $inactive_container = $( $el.data( 'inactive-container' ) );
955                var fields_selector = 'input:not(.js-es-repeater-input),select:not(.js-es-repeater-input),textarea:not(.js-es-repeater-input)';
956
957                if ( $el.is( ':checked' ) ) {
958                    $active_container.removeClass( 'es-hidden' );
959                    $inactive_container.addClass( 'es-hidden' );
960
961                    $active_container.find( fields_selector ).removeProp( 'disabled' ).removeAttr( 'disabled' );
962                    $inactive_container.find( fields_selector ).prop( 'disabled', 'disabled' );
963                } else {
964                    $active_container.addClass( 'es-hidden' );
965                    $inactive_container.removeClass( 'es-hidden' );
966
967                    $active_container.find( fields_selector ).prop( 'disabled', 'disabled' );
968                    $inactive_container.find( fields_selector ).removeProp( 'disabled' ).removeAttr( 'disabled' );
969                }
970            }
971        } );
972
973        $( 'input[data-toggle-container], input[data-inactive-container], input[data-toggle-disabled]' ).trigger( 'change' );
974
975        $( document ).on( 'click', '[data-toggle-container]:not(input)', function(e) {
976            $( $( this ).data( 'toggle-container' ) ).toggleClass( 'es-hidden' );
977            e.preventDefault();
978        } );
979
980        $( document ).on( 'click', '.js-es-add-field', function() {
981            return false;
982        } );
983
984        $( document ).on( 'click', '.js-es-price-input-type-container', function() {
985            var value = $(this).val();
986            esPriceInputType( value );
987        } );
988
989        var esValuePriceInputType = $('.js-es-price-input-type-container:checked').val();
990
991        esPriceInputType( esValuePriceInputType );
992
993        function esPriceInputType( value ) {
994            if(value == 'dropdown') {
995                $( '.es-field__is_same_price_for_categories_enabled' ).removeClass( 'es-hidden' );
996                $( '#es-same-price-list-container' ).show();
997                $( '#es-diff-price-list-container' ).show();
998                
999            } else {
1000                $( '.es-field__is_same_price_for_categories_enabled' ).addClass( 'es-hidden' );
1001                $( '#es-same-price-list-container' ).hide();
1002                $( '#es-diff-price-list-container' ).hide();
1003            }
1004        }
1005
1006    } );
1007} )( jQuery );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.