PageSourceSearch

https://yoder-homes.com/wp-content/plugins/estatik/includes/classes/framework/assets/js/framework.js?ver=7.0.5

js yoder-homes.com collected 2026-10-08 04:51:04 UTC 42,054 bytes, 1,019 lines download raw bytes

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