// source --> https://bravoregroup.com/wp-content/plugins/estatik4_premium/includes/classes/framework/assets/js/framework.js?ver=6.9.4 
( function( $ ) {
    'use strict';

    window.EstatikFramework = { initFields: initFields };

    function esSafeHash(hash) {
        // Дозволяємо тільки id формату #someId, без пробілів і спецсимволів
        if (typeof hash !== 'string') return '';
        if (!/^#[A-Za-z0-9_-]+$/.test(hash)) return '';
        return hash;
    }

    /**
     * @param size
     * @returns {string}
     */
    function humanFileSize(size) {
        var i = Math.floor( Math.log(size) / Math.log(1024) );
        return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
    }

    var uploadFiles = [];

    /**
     * Upload and append files to the uploader area.
     *
     * @param $wrapper
     * @param files
     */
    function esUploadFiles( $wrapper, files ) {
        var item = $wrapper.find( '.js-es-hidden-item' ).html();
        var form_data;

        console.log(files);

        Array.prototype.forEach.call( files, function( file ) {
            var reader = new FileReader();
            var uniqid = Date.now() + Math.random();

            uploadFiles[ uniqid ] = file;

            reader.addEventListener( 'load', function( event ) {
                var html = item
                    .replaceAll( '{name}', file.name )
                    .replaceAll( '{caption}', '' )
                    .replaceAll( '{size}', humanFileSize( file.size ) );

                var $html = $( html ).addClass( 'es-media--uploading' );
                $html.find( '.es-media__image img' ).attr( 'src', event.target.result );
                $html.data( 'uniqid', uniqid );
                $wrapper.find( '.js-files-list' ).append( $html );

                form_data = new FormData();
                form_data.append( 'file', file );
                form_data.append( '_file-nonce', $wrapper.data( 'nonce' ) );
                form_data.append( 'action', $wrapper.data( 'ajax-action' ) );
                form_data.append( 'mime_allowed', $wrapper.data( 'mime-allowed' ) );

                $.ajax( {
                    type: 'POST',
                    url: Es_Framework.ajaxurl,
                    contentType: false,
                    processData: false,
                    dataType: 'json',
                    data: form_data,
                    success:function( response ) {
                        $html.removeClass( 'es-media--uploading' );
                        if ( response.status === 'success' ) {
                            $html.find( '.js-es-caption' ).data( 'attachment-id', response.attachment_id );
                            $html.find( '.js-es-media-field' ).val( response.attachment_id );
                        } else {
                            $html.addClass( 'es-media--failed' )
                                .find( '.js-es-file__msg' )
                                .addClass( 'es-file__msg--error' )
                                .html( Es_Framework.tr.failed );
                        }
                    },
                    xhr: function(){
                        // get the native XmlHttpRequest object
                        var xhr = $.ajaxSettings.xhr() ;
                        // set the onprogress event handler
                        xhr.upload.onprogress = function( evt ) {
                            var progress = evt.loaded / evt.total * 100;
                            $html.find( '.js-es-progress' ).animate( {width: progress + '%'}, 400 );
                        } ;
                        // set the onload event handler
                        xhr.upload.onload = function() {
                            $html.find( '.js-es-progress' ).animate( {width:'100%'}, 400 );
                        };
                        return xhr ;
                    }
                } ).fail( function() {
                    $html.addClass( 'es-media--failed' )
                        .find( '.js-es-file__msg' )
                        .addClass( 'es-file__msg--error' )
                        .html( Es_Framework.tr.failed );
                } );
            } );

            reader.readAsDataURL( file );
        } );
    }

    function initFields( $context ) {

        $context = $context || $( document );

        $context.find( '.js-es-field__date' ).each( function() {
            var format = $( this ).data( 'date-format' ) || 'm/d/y';
            if ( ! $( this ).is( ':disabled' ) ) {
                $( this ).datetimepicker( {
                    format: format,
                    dateFormat: format,
                    timepicker: false
                } );
            }
        } );

        $context.find( '.js-es-f-select2' ).each( function() {
            var config = {};
            var $el = $( this );

            $el.select2( config );
        } );

        $context.find( '.js-es-field__date-time' ).each( function() {
            var format = $( this ).data( 'date-format' ) || 'm/d/y';
            if ( ! $( this ).is( ':disabled' ) ) {
                $( this ).datetimepicker( {
                    format: format,
                    dateFormat: format,
                    timepicker: true
                } );
            }
        } );

        if ( typeof $.fn.wpColorPicker !== 'undefined' ) {
            $( '.js-es-iris-color-picker:not([disabled])', $context ).wpColorPicker();
        }

        $context.find( '.js-es-items' ).each( function() {
            var $list = $( this );

            $( this ).sortable( {
                change: function() {
                    $list.find( 'input' ).eq( 0 ).trigger( 'change' );
                }
            } );
            $( this ).disableSelection();
        } );

        $context.find( '.js-es-select2-search:visible:not(:disabled)' ).each( function() {
            var $field = $( this );

            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {
                var config = {
                    width: '100%',
                };

                if ( $field.data( 'placeholder' ) ) {
                    config.placeholder = $field.data( 'placeholder' );
                }

                if ( $field.data( 'formatNoMatches' ) ) {
                    config.formatNoMatches = function () {
                        return $field.data( 'formatNoMatches' )
                    }
                }

                if ( $field.data( 'request' ) ) {
                    config.ajax = {
                        delay: 300,
                        url: Es_Framework.ajaxurl,
                        dataType: 'json',
                        data: function (params) {
                            var request_params = $field.data( 'request' );

                            if ( params.hasOwnProperty( 'term' ) ) {
                                request_params.s = params.term;
                            }

                            return request_params;
                        },
                    };
                }

                $field.select2( config );
            }
        } );

        $context.find( '.js-es-entities-items-search:visible:not(:disabled)' ).each( function() {
            var $field = $( this );

            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {
                $field.select2( {
                    width: '100%',
                    dropdownCssClass: "es-select2__dropdown",
                    placeholder: $field.data( 'placeholder' ),
                    ajax: {
                        delay: 300,
                        url: Es_Framework.ajaxurl,
                        dataType: 'json',
                        data: function (params) {
                            var request_params = $field.data( 'request' );

                            if ( params.hasOwnProperty( 'term' ) ) {
                                request_params.s = params.term;
                            }

                            return request_params;
                        },
                        processResults: function (data) {
                            data = data || {};

                            if ( ! data.message ) {
                                data = [];
                                $field.find( 'option' ).each(function ( i, e ) {
                                    var object = { id: e.value, text: e.text };
                                    if ( $.inArray( object, data.items ) === -1 ) {
                                        data.push( object );
                                    }
                                } );
                            } else {
                                data = data.message;
                            }

                            // Transforms the top-level key of the response object from 'items' to 'results'
                            return {
                                results: data
                            };
                        }
                    }
                } ).change( function() {
                    var value = $( this ).val();
                    var item_markup = $( this ).data( 'item-markup' );
                    var $field = $( this );

                    if ( value ) {
                        $field.prop( 'disabled', 'disabled' ).attr( 'disabled', 'disabled' );

                        $.get( Es_Framework.ajaxurl, {value: value, action: $( this ).data( 'action' ) }, function( response ) {
                            response = response || {};

                            if ( response.id ) {
                                var $wrapper = $field.closest( '.js-es-entities-list-field' ).find( '.js-es-items' );
                                var $existing_item = $wrapper.find( '.entity-box--' + response.id );

                                if ( ! $existing_item.length ) {
                                    item_markup = item_markup
                                        .replace( '{value}', response.id )
                                        .replace( '{id}', response.id )
                                        .replace( '{title}', response.text )
                                        .replace( '{subtitle}', response.subtitle )
                                        .replace( '{image}', response.image );

                                    $wrapper.append( item_markup );

                                    $field.val( null ).trigger( 'change' );
                                } else {
                                    $existing_item.animate( {opacity: 0.5}, 300, function() {
                                        $existing_item.animate( {opacity: 1}, 300 );
                                    } );
                                }
                            }
                        }, 'json' ).always( function() {
                            $field.removeProp( 'disabled' ).removeAttr( 'disabled' );
                        } );
                    }
                } );
            }
        } );

        $context.find( '.js-es-phone-field:visible:not(:disabled)' ).each( function() {
            var $field = $( this );

            if ( ! $field.hasClass( 'select2-hidden-accessible' ) ) {

                $field.select2({
                    minimumResultsForSearch: -1,
                    dropdownCssClass: 'es-phone-dropdown content-font es-select2__dropdown--positioning',
                    escapeMarkup: function (m) {
                        return m;
                    },
                    templateSelection: function (option) {
                        var country_icons = $field.data('icons');
                        if (typeof country_icons[option.id] === 'undefined') {
                            return option.text;
                        } else {
                            return '<img alt="' + option.id + '" src="' + country_icons[option.id] + '"/>';
                        }
                    },
                    templateResult: function (option) {
                        var country_icons = $field.data('icons');
                        var codes = $field.data('codes');
                        if (typeof country_icons[option.id] !== 'undefined') {
                            return '<img alt="' + option.id + '" src="' + country_icons[option.id] + '"/>' +
                                option.text +
                                '<span class="es-country-code">' + codes[option.id] + '</span>';
                        } else {
                            return '<div class="es-flag-space"></div>' + option.text;
                        }
                    }
                } ).on( 'change', function () {
                    var codes = $field.data('codes');
                    var code = $field.val();
                    var tel_code = codes[ code ];
                    var $tel = $field.closest( '.es-field--phone' ).find( '.js-es-phone' );
                    var replaced = false;

                    Object.entries( codes ).forEach( function( codes_item ) {
                        if ( $tel.val().indexOf( codes_item[1] ) !== -1 && codes_item[1].length ) {
                            $tel.val( $tel.val().replace( codes_item[1], tel_code ) );
                            replaced = true;
                        }
                    } );

                    if ( ! replaced && tel_code !== undefined && tel_code.length ) {
                        $tel.val( tel_code );
                    }

                    if (typeof tel_code === "undefined") {
                        $tel.val( '' );
                    }
                } ).trigger( 'change' );

            }

        } );

        $( 'input[data-toggle-container]:not([data-save-field]), input[data-inactive-container]:not(data-save-field), input[data-toggle-disabled]' ).trigger( 'change' );
    }

    $( function() {

        initFields();

        $( document ).on( 'change', '.js-es-fr-submit-on-change', function() {
            $( this ).closest( 'form' ).submit();
        } );

        $( document ).on( 'widget-added', function ( $control ) {
            initFields();
        } );

        $( document ).on( 'click', '.es-field [type=radio]', function( e ) {
            if ( e.ctrlKey || e.metaKey ) {
                $( this ).removeProp( 'checked' ).removeAttr( 'checked' );
            }
        } );

        $( document ).on( 'change', '.js-es-upload-files', function(e) {
            if ( $( this )[0].files[0] === undefined ) return;

            var formData = new FormData();
            var $button = $( this ).parent().find( '.es-btn' );
            var dataRequest = $( this ).data( 'request' );

            formData.append( "file", $( this )[0].files[0] );
            formData.append( "action", 'es_framework_upload_file' );
            formData.append( '_file-nonce', $( this ).data( 'nonce' ) );
            formData.append( 'mime_allowed', $( this ).data( 'mime-allowed' ) );

            if ( ! $.isEmptyObject( dataRequest ) ) {
                for ( const [key, value] of Object.entries( dataRequest ) ) {
                    formData.append( key, value );
                }
            }

            if ( $button.hasClass( 'es-btn' ) ) {
                $button.addClass( 'es-preload' );
            }

            // console.log(dataRequest.file_type, $button,  $button.hasClass( 'es-btn' ));

            $.ajax({
                type: 'POST',
                url: Es_Framework.ajaxurl,
                contentType: false,
                processData: false,
                dataType: 'json',
                data: formData,
                success: function (response) {
                    response = response || {}
                    if ( response.status === 'success' ) {
                        if ( dataRequest.file_type === 'icon-uploader' ) {
                            $( '.es-icons-overlay ul' ).each( function() {
                                $( this ).append( response.icon );
                            } );
                        }
                    } else if ( response.status === 'error' ) {
                        alert( response.message );
                    }
                },
            }).always( function() {
                $button.removeClass( 'es-preload' );
            } );

            e.preventDefault();
        } );

        $( '.js-files-list' ).sortable();

        $( document ).on( 'click', '.js-es-reload-media', function() {
            var $wrapper = $( this ).closest( '.js-es-file' );
            var uniqid = $wrapper.data( 'uniqid' );
            var file = uploadFiles[ uniqid ];

            console.log(file, uniqid, $wrapper, $wrapper.data());
            var files = [];
            files.push( file );

            esUploadFiles( $wrapper.closest( '.js-es-uploader-area' ), files );

            uploadFiles[ uniqid ] = null;
            $wrapper.remove();
            return false;
        } );

        $( document ).on( 'click', '.js-es-delete-media', function() {
            $( this ).closest( '.js-es-file' ).remove();
            return false;
        } );

        $( document ).on( 'drop', '.js-es-uploader-area', function(e) {
            e.preventDefault();
            var $wrapper = $( this );
            var files = e.originalEvent.dataTransfer.files;

            if ( files.length ) {
                esUploadFiles( $wrapper, files );
            }
        } );

        $( document ).on( 'change', '[data-value-container]', function() {
            var default_value = $( this ).data( 'value-default' ) || '';
            var suffix = $( this ).data( 'value-suffix' );
            var value = +$( this ).val() ? $( this ).val() + suffix : default_value;
            $( $( this ).data( 'value-container' ) ).html( value );
        } );

        $( '[data-value-container]' ).trigger( 'change' );

        $( document ).on( 'change', '.js-es-drag-files-field', function(e) {
            e.preventDefault();
            var files = $( this )[0].files;
            var $wrapper = $( this ).closest( '.js-es-uploader-area' );

            if ( files ) {
                esUploadFiles( $wrapper, files );
            }
        } );

        $( document ).on( 'dragenter dragover', '.js-es-uploader-area', function() {
            $( this ).addClass( 'es-uploader-area--focused' );
        } );

        $( document ).on( 'dragleave drop', '.js-es-uploader-area', function() {
            $( this ).removeClass( 'es-uploader-area--focused' );
        } );

        $( document ).on( 'dragover', '.js-es-uploader-area', function() {
            return false;
        } );

        $( '.js-es-tabs' ).on( 'tab_changed', function() {
            initFields( $( this ) );
        } );

        $( document ).on( 'change', '.js-es-password-field', function() {
            var val = $( this ).val();
            var email_val = $( this ).data( 'email' ) ?
                $( this ).data( 'email' ) : $( this ).closest( 'form' ).find( '[type="email"]' ).val();
            var $list = $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__validate-list' );
            var validate1 = false;
            var validate2 = false;
            var validate3 = false;

            if ( val && val.length ) {
                if ( email_val.length && email_val !== val ) {
                    $list.find( '.es-validate-item__contain' ).addClass( 'es-validate-item--active' );
                    validate1 = true;
                } else {
                    $list.find( '.es-validate-item__contain' ).removeClass( 'es-validate-item--active' );
                    validate1 = false;
                }

                if ( val.length >= 8 ) {
                    validate2 = true;
                    $list.find( '.es-validate-item__length' ).addClass( 'es-validate-item--active' );
                } else {
                    validate2 = false;
                    $list.find( '.es-validate-item__length' ).removeClass( 'es-validate-item--active' );
                }

                var regExp = /[a-zA-Z0-9]/g;

                if ( regExp.test( val ) ) {
                    validate3 = true;
                    $list.find( '.es-validate-item__char' ).addClass( 'es-validate-item--active' );
                } else {
                    validate3 = false;
                    $list.find( '.es-validate-item__char' ).removeClass( 'es-validate-item--active' );
                }
            }

            if ( validate1 && validate2 && validate3 ) {
                $( this ).closest( 'form' ).find( '[type=submit]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
            } else {
                $( this ).closest( 'form' ).find( '[type=submit]' ).prop( 'disabled', 'disabled' );
            }
        } );

        $( '.js-es-password-field' ).trigger( 'change' );

        $( document ).on( 'click', '.js-es-toggle-pwd', function() {
            var $field = $( this ).closest( '.es-field, .js-es-field' ).find( 'input' );
            $( this ).toggleClass( 'es-secondary-color' );
            if ( $field.attr( 'type' ) === 'text' ) {
                $field.prop( 'type', 'password' );
            } else {
                $field.prop( 'type', 'text' );
            }

            return false;
        } );

        $( document ).on( 'input', '.es-field__input[maxlength]', function() {
            var length = $( this ).val().length;

            $( this ).closest( '.es-field, .js-es-field' ).find( '.js-es-strlen' ).html( length );
        } );

        $( document ).on( 'click', '[data-trigger-click]', function() {
            $( $( this ).data( 'trigger-click' ) ).trigger( 'click' );

            return false;
        } );

        $( document ).on( 'click', '.js-es-delete-entity', function() {
            $( this ).closest( '.js-es-entity-box' ).remove();
            return false;
        } );

        // Input on register page.
        $( '.js-es-image-field' ).change( function() {
            var el = this;

            var reader = new FileReader();

            if ( el.files.length ) {
                reader.onload = function( e ) {
                    $( el ).closest( 'div' ).find( $( el ).data( 'img' ) )
                        .attr( 'src', e.target.result )
                        .attr( 'srcset', '' );

                    $( el ).closest( '.js-es-photo' ).find( '.js-es-delete-photo' ).removeClass( 'es-hidden' );
                };

                reader.readAsDataURL( el.files[0] );
            }
        } );

        $( '.js-es-delete-photo' ).click( function() {
            var $wrapper = $( this ).closest( '.js-es-photo' );
            $wrapper.find( '.js-es-image-field' ).val('').trigger( 'change' ).trigger( 'input' );
            $wrapper.find( '.js-es-avatar-field' ).val('').trigger( 'change' ).trigger( 'input' );
            var img = $wrapper.find( '.js-es-photo__image' ).data( 'photo' );
            $( this ).addClass( 'es-hidden' );

            $wrapper.find( '.js-es-photo__image img' ).replaceWith( img );
            return false;
        } );

        $( document ).on( 'click', '.js-es-reset-value', function() {
            $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__input' ).val( $( this ).data( 'value' ) ).trigger( 'change' );
            return false;
        } );

        $( document ).on( 'click', '.js-es-field__show-more', function() {
            $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field--visibility' ).toggleClass( 'es-hidden' );
            return false;
        } );

        $( '.js-es-media-files' ).sortable();

        $( document ).on( 'click', '.js-es-delete-fields-item', function() {
            $( this ).closest( '.es-item' ).remove();
            return false;
        } );

        $( document ).on( 'click', '.js-es-field--rating .js-es-rating .es-star', function() {
            var $el = $( this );
            var value = $el.data( 'value' );
            var $rating_wrap = $( this ).closest( '.js-es-rating' );
            var $input = $( this ).closest( '.js-es-field--rating' ).find( '.es-field__input' );

            if ( $el.hasClass( 'es-star--active' ) ) {
                value -= 1;
            }

            $input.val( value );
            $rating_wrap.find( '.es-star' ).removeClass( 'es-star--active' );

            $rating_wrap.find( '.es-star:nth-child(-n+' + value +  ')' ).addClass( 'es-star--active' );
        } );

        $( document ).on( 'click', '.js-es-add-fields-item', function() {
            var $selector = $( this ).closest( '.es-fields-list__selector' ).find( '.js-es-items-selector' );
            var field = $selector.val();
            var item_html = $selector.data( 'item' );
            var $list = $( this ).closest( '.es-field--fields-list-selector' ).find( '.js-es-items' );
            var label = $selector.find( 'option:selected' ).html();

            if ( field && ! $list.find( '[data-item-id="' + field + '"]' ).length ) {
                $selector.val( '' ).trigger( 'change' );
                $list.append( item_html.replace( '{value}', field ).replace( '{field_name}', label ).replace( '{item-id}' ) );
            } else {
                $list.find( '[data-item-id="' + field + '"]' ).animate( {opacity: 0.5}, 300, function() {
                    $( this ).animate( {opacity: 1}, 300 );
                } );
                $selector.val( '' ).trigger( 'change' );
            }

            return false;
        } );

        $( document ).on( 'change', '.js-es-items-selector', function() {
            var $selector = $( this );
            var field = $selector.val();
            var $button = $selector.closest( '.es-fields-list__selector' ).find( '.js-es-add-fields-item' );
            $button.prop( 'disabled', ! field );
        } );

        $( document ).on( 'click', '.js-es-icon-field', function() {
            var $el = $( this );

            $el.closest( '.es-icon-field-wrap' ).toggleClass( 'es-icon-field--active' );
        } );

        $( document ).on( 'click', '.es-file__caption-container, .js-es-file__caption-field', function( e ) {
            e.stopPropagation();
        } );

        $( document ).on( 'click', '.js-es-icon-item', function() {
            var $el = $( this );
            var icon_config = $el.data( 'icon' );
            $el.closest( '.es-icon-field-wrap' )
                .removeClass( 'es-icon-field--active' )
                .find( '.js-es-icon-html' )
                .html( icon_config.icon );

            $el.closest( '.es-icon-field-wrap' ).find( '.es-field__input' ).val( JSON.stringify( icon_config ) );
        } );

        $( document ).click( function( e ) {
            if ( ! $( e.target ).closest( '.es-icon-field-wrap' ).length ) {
                $( '.es-icon-field-wrap' ).removeClass( 'es-icon-field--active' );
            }

            //if you click on anything except the modal itself or the "open modal" link, close the modal
            if ( ! $( e.target ).closest( ".es-file__caption-container").length ) {
                $( '.es-file__caption-container.es-file__caption--edit' ).each( function() {
                    var $el = $( this );
                    var $input = $el.find( '.js-es-file__caption-field' );

                    $.post( Es_Framework.ajaxurl, {
                        attachment_id: $input.data( 'attachment-id' ),
                        caption: $input.val(),
                        action: 'es_framework_attachment_save_caption',
                        nonce: Es_Framework.nonces.attachment_save_caption_nonce
                    } ).always( function() {
                        $el.removeClass( 'es-file__caption--edit' );

                        var $caption = $el.find( '.js-es-caption' );

                        if ( $input.val() ) {
                            if ( $caption.prop( 'tagName').toLowerCase() !== 'input' ) {
                                $el.find( '.js-es-caption' ).html( $input.val() ).removeClass( 'no-caption' );
                            }
                        } else {
                            if ( $caption.prop( 'tagName').toLowerCase() !== 'input' ) {
                                $el.find('.js-es-caption').html(Es_Framework.tr.add_caption).addClass('no-caption');
                            }
                        }
                    } );
                } );
            }
        });

        // $( '.es-icons-overlay' ).on( 'click', function(e) {
        //     e.stopPropagation();
        // } );

        // Add repeater item button handler.
        $( document ).on( 'click', '.js-es-repeater__add-item', function() {
            var $el = $( this );
            var $field_wrapper = $el.closest( '.es-field--repeater' );
            var $wrapper = $field_wrapper.find( '.js-es-repeater__wrapper' );
            var index = +$wrapper.data( 'index' );
            var $to_clone = $field_wrapper.find( '.js-es-to-clone .js-es-repeater-item' );

            var $cloned = $to_clone.clone();
            $cloned.data( 'item-index', index );

            $wrapper.find( '.js-es-repeater__items' ).append( $cloned );

            $cloned.find( '[disabled]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
            $cloned.find( '.es-field--disabled' ).removeClass( 'es-field--disabled' );

            $cloned.find( '[for]' ).each( function() {
                $( this ).prop( 'for', $( this ).prop( 'for' ).replaceAll( '{#index}', index ) );
            } );

            $cloned.find( '.es-field__label' ).each( function() {
                $( this ).text( $( this ).text().replaceAll( '{#index}', index + 1 ) );
            } );

            $cloned.find( '[name], [id], [for], [value]' ).each( function() {
                var $el = $( this );
                ['name', 'id', 'value', 'for'].forEach( function( selector ) {
                    if ( $el.prop( selector ) ) {
                        var modified = $el.prop( selector ).replaceAll( '{#index}', index );
                        $el.prop( selector, modified ).attr( selector, modified );
                    }
                } );
            } );

            $wrapper.data( 'index', index + 1 );

            $cloned.find('[disabled]').removeProp( 'disabled' ).removeAttr( 'disabled' );
            $cloned.find( '.es-switcher--disabled' ).removeClass( 'es-switcher--disabled' );

            $cloned.find( 'input:not([type=radio])' ).trigger( 'change' );

            if ( typeof $.fn.wpColorPicker !== 'undefined' ) {
                $cloned.find('.js-es-iris-color-picker:not([disabled])').wpColorPicker();
            }
            initFields( $cloned );

            return false;
        } );

        // Remove repeater item button handler.
        $( document ).on( 'click', '.js-es-repeater__delete-item', function() {
            var $el = $( this );
            var $wrapper = $el.closest( '.js-es-repeater__wrapper' );
            var index = $wrapper.data( 'index' );           
            $el.closest( '.js-es-repeater-item' ).remove();

            $wrapper.data( 'index', index - 1 );

            $wrapper.find( 'input:not([type=radio])' ).trigger( 'change' );

            return false;
        } );

        // Upload file handler.
        if ( typeof wp !== 'undefined' && wp.media && wp.media.editor ) {

            $( document ).on( 'click', '.js-es-media-editor', function() {
                var frame = wp.media( { multiple: false } );
                var $field = $( this ).closest( '.es-field, .js-es-field' ).find( '.es-field__input' );

                frame.open();

                // When an image is selected in the media frame...
                frame.on( 'select', function() {

                    // Get media attachment details from the frame state
                    var attachments = frame.state().get('selection').toJSON();

                    // Attachment IDs array.
                    var ids = [];

                    if ( attachments.length ) {
                        var attachment = attachments[0];
                        $field.val( attachment.url );
                    }
                } );

                return false;
            } );

            $( document ).on( 'click', '.js-es-media-button', function () {
                var $button = $( this );
                var $wrapper = $button.parent();
                var $input = $wrapper.find( '.js-es-media-field' );
                var media_item_markup = $button.data( 'item-markup' );
                var is_multiple = $button.data( 'multiple' );
                var item;

                var frame = wp.media( { multiple: is_multiple } );

                frame.open();

                // When an image is selected in the media frame...
                frame.on( 'select', function() {

                    // Get media attachment details from the frame state
                    var attachments = frame.state().get('selection').toJSON();

                    // Attachment IDs array.
                    var ids = [];

                    if ( attachments.length ) {
                        var $files_container = $button.parent().find( '.js-es-media-files' );

                        for ( var i in attachments ) {
                            var file = attachments[i];
                            var filename = file.filename;
                            var url = file.url;
                            var caption = file.caption ? file.caption : false;

                            if ( typeof file.sizes !== 'undefined' ) {
                                url = file.url;
                            }

                            ids.push( attachments[i].id );

                            item = media_item_markup
                                .replaceAll( '{filename}', filename )
                                .replaceAll( '{attachment_id}', file.id )
                                .replaceAll( '{filesize}', file.filesizeHumanReadable )
                                .replaceAll( '{url}', url )
                                .replaceAll( '{caption}', caption ? caption : $button.data( 'caption' ) )
                                .replaceAll( '{input_caption}', caption ? caption : '' )
                                .replaceAll( '{no_caption}', caption ? '' : 'no-caption' );

                            var $repeater = $files_container.closest( '.js-es-repeater__wrapper' );

                            if ( $repeater.length ) {
                                var index = $files_container.closest( '.js-es-repeater-item' ).data( 'item-index' );
                                item = item.replaceAll( '{#index}', index );
                            }

                            if ( $button.data( 'multiple' ) ) {
                                $files_container.append( item );
                                $files_container.sortable();
                            } else {
                                $files_container.html( item );
                            }

                            $files_container.find( '[disabled]' ).removeProp( 'disabled' ).removeAttr( 'disabled' );
                        }
                    }
                } );

                return false;
            } );
        }

        $( document ).on( 'click', '.js-es-caption', function() {
            $( this ).closest( '.es-file__caption-container' ).addClass( 'es-file__caption--edit' );
            return false;
        } );

        $( document ).on( 'click', '.js-es-media-delete-attachment', function() {
            var $el = $( this );
            $el.closest( 'li, .js-es-file' ).remove();

            return false;
        } );

        $( document ).on( 'click', '.js-es-tabs .js-es-tabs__nav a.es-tabs__nav-link', function( e ) {
            var $wrapper = $( this ).closest( '.js-es-tabs' );
            var tabContainer = $( this ).data( 'tab' ) || $( this ).attr( 'href' );

            if ( $( tabContainer ).length ) {
                $wrapper.find( '.js-es-tabs__wrapper .js-es-tabs__content' ).addClass( 'es-hidden' );
                $wrapper.find( tabContainer ).removeClass( 'es-hidden' );
                $wrapper.find( '.js-es-tabs__nav li' ).removeClass( 'active' );
                $( this ).closest( 'li' ).addClass( 'active' );

                if ( history.pushState ) {
                    history.pushState( null, null, tabContainer );
                }
                else {
                    location.hash = tabContainer;
                }

                $wrapper.trigger( 'tab_changed', [ tabContainer, $wrapper, $( this ) ] );
            }

            return false;
        } );

        try {
            var hash = esSafeHash( window.location.hash );
            if ( hash && $( hash ).length ) {
                if ( $( hash ).hasClass( 'js-es-tabs__content' ) ) {
                    var $link = $( 'a[href="' + hash + '"]' );
                    $link.trigger( 'click' );
                }
            }
        } catch( e ) {}

        $( '[data-toggle-label]' ).click( function( e ) {
            var temp_label = $( this ).html();
            $( this ).html( $( this ).data( 'toggle-label' ) ).data(  'toggle-label', temp_label );

            e.preventDefault();
        } );


        $( '.js-es-tabs' ).each( function() {
            if ( ! $( this ).find( '.js-es-tabs__nav li.active' ).length ) {
                var $link = $( this ).find( '.js-es-tabs__nav li:first-child a.es-tabs__nav-link' );
                $link.trigger( 'click' );
            }

            window.scrollTo( 0, 0 );

            setTimeout( function() {
                window.scrollTo( 0, 0 );
            }, 1 );
        } );

        $( document ).ajaxComplete( function() {
           initFields();
        } );

        $( document ).on( 'click', '.js-incrementer-button', function() {
            var method = $( this ).data( 'method' );
            var $input = $( this ).closest( '.js-es-incrementer-field' ).find( '.es-field__input' );
            var max = $input.prop( 'max' );
            var min = $input.prop( 'min' );
            var step = + $input.prop( 'step' );
            step = step || 1;
            var val = $input.val() ? $input.val() : 0;

            if ( 'increment' === method ) {
                $input.val( ( +max && +max > +val ) || ! max ? + val + step : val );
            } else {
                $input.val((min && min < val) || min === '' ? +val - step : val);
            }

            $input.trigger( 'change' );

            return false;
        } );

        $( document ).on( 'change', 'input[data-toggle-disabled]',  function() {
            var $el = $( this );
            var $field = $( $el.data( 'toggle-disabled' ) );
            var revert = $el.data( 'revert-toggler' );

            if ( $field.length ) {
                var checked = $el.is( ':checked' );
                checked = revert ? ! checked : checked;
                if ( checked ) {
                    $field.prop( 'disabled', 'disabled' ).closest( '.es-field, .js-es-field' ).addClass( 'es-field--disabled' );
                } else {
                    $field.removeProp( 'disabled' ).removeAttr( 'disabled' ).closest( '.es-field, .js-es-field' ).removeClass( 'es-field--disabled' );
                }
            }
        } );

        $( document ).on( 'change', 'input[data-toggle-container], input[data-inactive-container]',  function() {
            var $el = $( this );
            var container = $el.data( 'toggle-container' );

            if ( container && container.length ) {
                var $container = $('body').find( container );

                if ( $el.is( ':checked' ) ) {
                    $container.removeClass( 'es-hidden' );
                } else {
                    $container.addClass( 'es-hidden' );
                }
            } else {
                var $active_container = $( $el.data( 'active-container' ) );
                var $inactive_container = $( $el.data( 'inactive-container' ) );
                var fields_selector = 'input:not(.js-es-repeater-input),select:not(.js-es-repeater-input),textarea:not(.js-es-repeater-input)';

                if ( $el.is( ':checked' ) ) {
                    $active_container.removeClass( 'es-hidden' );
                    $inactive_container.addClass( 'es-hidden' );

                    $active_container.find( fields_selector ).removeProp( 'disabled' ).removeAttr( 'disabled' );
                    $inactive_container.find( fields_selector ).prop( 'disabled', 'disabled' );
                } else {
                    $active_container.addClass( 'es-hidden' );
                    $inactive_container.removeClass( 'es-hidden' );

                    $active_container.find( fields_selector ).prop( 'disabled', 'disabled' );
                    $inactive_container.find( fields_selector ).removeProp( 'disabled' ).removeAttr( 'disabled' );
                }
            }
        } );

        $( 'input[data-toggle-container], input[data-inactive-container], input[data-toggle-disabled]' ).trigger( 'change' );

        $( document ).on( 'click', '[data-toggle-container]:not(input)', function(e) {
            $( $( this ).data( 'toggle-container' ) ).toggleClass( 'es-hidden' );
            e.preventDefault();
        } );

        $( document ).on( 'click', '.js-es-add-field', function() {
            return false;
        } );

        $( document ).on( 'click', '.js-es-price-input-type-container', function() {
            var value = $( this ).val();
            esPriceInputType( value );
        } );

        var esValuePriceInputType = $('.js-es-price-input-type-container:checked').val();

        esPriceInputType( esValuePriceInputType );

        function esPriceInputType( value ) {
            if( value && value === 'dropdown' ) {
                $( '.es-field__is_same_price_for_categories_enabled' ).removeClass( 'es-hidden' );
                $( '#es-same-price-list-container' ).show();
                $( '#es-diff-price-list-container' ).show();
                
            } else {
                $( '.es-field__is_same_price_for_categories_enabled' ).addClass( 'es-hidden' );
                $( '#es-same-price-list-container' ).hide();
                $( '#es-diff-price-list-container' ).hide();
            }
        }
    } );
} )( jQuery );
// source --> https://bravoregroup.com/wp-content/plugins/estatik4_premium/public/js/markerclusterer.min.js?ver=4.2.0 
var markerClusterer=function(t){"use strict";function e(t,e){var s={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(s[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(t);o<r.length;o++)e.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(t,r[o])&&(s[r[o]]=t[r[o]])}return s}class s{static isAdvancedMarkerAvailable(t){return google.maps.marker&&!0===t.getMapCapabilities().isAdvancedMarkersAvailable}static isAdvancedMarker(t){return google.maps.marker&&t instanceof google.maps.marker.AdvancedMarkerElement}static setMap(t,e){this.isAdvancedMarker(t)?t.map=e:t.setMap(e)}static getPosition(t){if(this.isAdvancedMarker(t)){if(t.position){if(t.position instanceof google.maps.LatLng)return t.position;if(t.position.lat&&t.position.lng)return new google.maps.LatLng(t.position.lat,t.position.lng)}return new google.maps.LatLng(null)}return t.getPosition()}static getVisible(t){return!!this.isAdvancedMarker(t)||t.getVisible()}}class r{constructor(t){let{markers:e,position:s}=t;this.markers=e,s&&(s instanceof google.maps.LatLng?this._position=s:this._position=new google.maps.LatLng(s))}get bounds(){if(0===this.markers.length&&!this._position)return;const t=new google.maps.LatLngBounds(this._position,this._position);for(const e of this.markers)t.extend(s.getPosition(e));return t}get position(){return this._position||this.bounds.getCenter()}get count(){return this.markers.filter((t=>s.getVisible(t))).length}push(t){this.markers.push(t)}delete(){this.marker&&(s.setMap(this.marker,null),this.marker=void 0),this.markers.length=0}}const o=(t,e,r,o)=>{const n=i(t.getBounds(),e,o);return r.filter((t=>n.contains(s.getPosition(t))))},i=(t,e,s)=>{const{northEast:r,southWest:o}=h(t,e),i=l({northEast:r,southWest:o},s);return c(i,e)},n=(t,e,s)=>{const r=i(t,e,s),o=r.getNorthEast(),n=r.getSouthWest();return[n.lng(),n.lat(),o.lng(),o.lat()]},a=(t,e)=>{const s=(e.lat-t.lat)*Math.PI/180,r=(e.lng-t.lng)*Math.PI/180,o=Math.sin(s/2),i=Math.sin(r/2),n=o*o+Math.cos(t.lat*Math.PI/180)*Math.cos(e.lat*Math.PI/180)*i*i;return 6371*(2*Math.atan2(Math.sqrt(n),Math.sqrt(1-n)))},h=(t,e)=>({northEast:e.fromLatLngToDivPixel(t.getNorthEast()),southWest:e.fromLatLngToDivPixel(t.getSouthWest())}),l=(t,e)=>{let{northEast:s,southWest:r}=t;return s.x+=e,s.y-=e,r.x-=e,r.y+=e,{northEast:s,southWest:r}},c=(t,e)=>{let{northEast:s,southWest:r}=t;const o=e.fromDivPixelToLatLng(r),i=e.fromDivPixelToLatLng(s);return new google.maps.LatLngBounds(o,i)};class u{constructor(t){let{maxZoom:e=16}=t;this.maxZoom=e}noop(t){let{markers:e}=t;return m(e)}}class p extends u{constructor(t){var{viewportPadding:s=60}=t;super(e(t,["viewportPadding"])),this.viewportPadding=60,this.viewportPadding=s}calculate(t){let{markers:e,map:s,mapCanvasProjection:r}=t;return s.getZoom()>=this.maxZoom?{clusters:this.noop({markers:e}),changed:!1}:{clusters:this.cluster({markers:o(s,r,e,this.viewportPadding),map:s,mapCanvasProjection:r})}}}const m=t=>t.map((t=>new r({position:s.getPosition(t),markers:[t]})));function d(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var g=function t(e,s){if(e===s)return!0;if(e&&s&&"object"==typeof e&&"object"==typeof s){if(e.constructor!==s.constructor)return!1;var r,o,i;if(Array.isArray(e)){if((r=e.length)!=s.length)return!1;for(o=r;0!=o--;)if(!t(e[o],s[o]))return!1;return!0}if(e.constructor===RegExp)return e.source===s.source&&e.flags===s.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===s.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===s.toString();if((r=(i=Object.keys(e)).length)!==Object.keys(s).length)return!1;for(o=r;0!=o--;)if(!Object.prototype.hasOwnProperty.call(s,i[o]))return!1;for(o=r;0!=o--;){var n=i[o];if(!t(e[n],s[n]))return!1}return!0}return e!=e&&s!=s},f=d(g);const k=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class w{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,s]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const r=s>>4;if(1!==r)throw new Error(`Got v${r} data when expected v1.`);const o=k[15&s];if(!o)throw new Error("Unrecognized array type.");const[i]=new Uint16Array(t,2,1),[n]=new Uint32Array(t,4,1);return new w(n,i,o,t)}constructor(t,e=64,s=Float64Array,r){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=s,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const o=k.indexOf(this.ArrayType),i=2*t*this.ArrayType.BYTES_PER_ELEMENT,n=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-n%8)%8;if(o<0)throw new Error(`Unexpected typed array class: ${s}.`);r&&r instanceof ArrayBuffer?(this.data=r,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+n+a,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+i+n+a),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+n+a,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+o]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const s=this._pos>>1;return this.ids[s]=s,this.coords[this._pos++]=t,this.coords[this._pos++]=e,s}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return y(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,s,r){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:o,coords:i,nodeSize:n}=this,a=[0,o.length-1,0],h=[];for(;a.length;){const l=a.pop()||0,c=a.pop()||0,u=a.pop()||0;if(c-u<=n){for(let n=u;n<=c;n++){const a=i[2*n],l=i[2*n+1];a>=t&&a<=s&&l>=e&&l<=r&&h.push(o[n])}continue}const p=u+c>>1,m=i[2*p],d=i[2*p+1];m>=t&&m<=s&&d>=e&&d<=r&&h.push(o[p]),(0===l?t<=m:e<=d)&&(a.push(u),a.push(p-1),a.push(1-l)),(0===l?s>=m:r>=d)&&(a.push(p+1),a.push(c),a.push(1-l))}return h}within(t,e,s){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:r,coords:o,nodeSize:i}=this,n=[0,r.length-1,0],a=[],h=s*s;for(;n.length;){const l=n.pop()||0,c=n.pop()||0,u=n.pop()||0;if(c-u<=i){for(let s=u;s<=c;s++)C(o[2*s],o[2*s+1],t,e)<=h&&a.push(r[s]);continue}const p=u+c>>1,m=o[2*p],d=o[2*p+1];C(m,d,t,e)<=h&&a.push(r[p]),(0===l?t-s<=m:e-s<=d)&&(n.push(u),n.push(p-1),n.push(1-l)),(0===l?t+s>=m:e+s>=d)&&(n.push(p+1),n.push(c),n.push(1-l))}return a}}function y(t,e,s,r,o,i){if(o-r<=s)return;const n=r+o>>1;M(t,e,n,r,o,i),y(t,e,s,r,n-1,1-i),y(t,e,s,n+1,o,1-i)}function M(t,e,s,r,o,i){for(;o>r;){if(o-r>600){const n=o-r+1,a=s-r+1,h=Math.log(n),l=.5*Math.exp(2*h/3),c=.5*Math.sqrt(h*l*(n-l)/n)*(a-n/2<0?-1:1);M(t,e,s,Math.max(r,Math.floor(s-a*l/n+c)),Math.min(o,Math.floor(s+(n-a)*l/n+c)),i)}const n=e[2*s+i];let a=r,h=o;for(v(t,e,r,s),e[2*o+i]>n&&v(t,e,r,o);a<h;){for(v(t,e,a,h),a++,h--;e[2*a+i]<n;)a++;for(;e[2*h+i]>n;)h--}e[2*r+i]===n?v(t,e,r,h):(h++,v(t,e,h,o)),h<=s&&(r=h+1),s<=h&&(o=h-1)}}function v(t,e,s,r){x(t,s,r),x(e,2*s,2*r),x(e,2*s+1,2*r+1)}function x(t,e,s){const r=t[e];t[e]=t[s],t[s]=r}function C(t,e,s,r){const o=t-s,i=e-r;return o*o+i*i}const P={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:t=>t},_=Math.fround||(E=new Float32Array(1),t=>(E[0]=+t,E[0]));var E;const A=3,b=5,L=6;class O{constructor(t){this.options=Object.assign(Object.create(P),t),this.trees=new Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[]}load(t){const{log:e,minZoom:s,maxZoom:r}=this.options;e&&console.time("total time");const o=`prepare ${t.length} points`;e&&console.time(o),this.points=t;const i=[];for(let e=0;e<t.length;e++){const s=t[e];if(!s.geometry)continue;const[r,o]=s.geometry.coordinates,n=_(T(r)),a=_(j(o));i.push(n,a,1/0,e,-1,1),this.options.reduce&&i.push(0)}let n=this.trees[r+1]=this._createTree(i);e&&console.timeEnd(o);for(let t=r;t>=s;t--){const s=+Date.now();n=this.trees[t]=this._createTree(this._cluster(n,t)),e&&console.log("z%d: %d clusters in %dms",t,n.numItems,+Date.now()-s)}return e&&console.timeEnd("total time"),this}getClusters(t,e){let s=((t[0]+180)%360+360)%360-180;const r=Math.max(-90,Math.min(90,t[1]));let o=180===t[2]?180:((t[2]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)s=-180,o=180;else if(s>o){const t=this.getClusters([s,r,180,i],e),n=this.getClusters([-180,r,o,i],e);return t.concat(n)}const n=this.trees[this._limitZoom(e)],a=n.range(T(s),j(i),T(o),j(r)),h=n.data,l=[];for(const t of a){const e=this.stride*t;l.push(h[e+b]>1?Z(h,e,this.clusterProps):this.points[h[e+A]])}return l}getChildren(t){const e=this._getOriginId(t),s=this._getOriginZoom(t),r="No cluster with the specified id.",o=this.trees[s];if(!o)throw new Error(r);const i=o.data;if(e*this.stride>=i.length)throw new Error(r);const n=this.options.radius/(this.options.extent*Math.pow(2,s-1)),a=i[e*this.stride],h=i[e*this.stride+1],l=o.within(a,h,n),c=[];for(const e of l){const s=e*this.stride;i[s+4]===t&&c.push(i[s+b]>1?Z(i,s,this.clusterProps):this.points[i[s+A]])}if(0===c.length)throw new Error(r);return c}getLeaves(t,e,s){e=e||10,s=s||0;const r=[];return this._appendLeaves(r,t,e,s,0),r}getTile(t,e,s){const r=this.trees[this._limitZoom(t)],o=Math.pow(2,t),{extent:i,radius:n}=this.options,a=n/i,h=(s-a)/o,l=(s+1+a)/o,c={features:[]};return this._addTileFeatures(r.range((e-a)/o,h,(e+1+a)/o,l),r.data,e,s,o,c),0===e&&this._addTileFeatures(r.range(1-a/o,h,1,l),r.data,o,s,o,c),e===o-1&&this._addTileFeatures(r.range(0,h,a/o,l),r.data,-1,s,o,c),c.features.length?c:null}getClusterExpansionZoom(t){let e=this._getOriginZoom(t)-1;for(;e<=this.options.maxZoom;){const s=this.getChildren(t);if(e++,1!==s.length)break;t=s[0].properties.cluster_id}return e}_appendLeaves(t,e,s,r,o){const i=this.getChildren(e);for(const e of i){const i=e.properties;if(i&&i.cluster?o+i.point_count<=r?o+=i.point_count:o=this._appendLeaves(t,i.cluster_id,s,r,o):o<r?o++:t.push(e),t.length===s)break}return o}_createTree(t){const e=new w(t.length/this.stride|0,this.options.nodeSize,Float32Array);for(let s=0;s<t.length;s+=this.stride)e.add(t[s],t[s+1]);return e.finish(),e.data=t,e}_addTileFeatures(t,e,s,r,o,i){for(const n of t){const t=n*this.stride,a=e[t+b]>1;let h,l,c;if(a)h=I(e,t,this.clusterProps),l=e[t],c=e[t+1];else{const s=this.points[e[t+A]];h=s.properties;const[r,o]=s.geometry.coordinates;l=T(r),c=j(o)}const u={type:1,geometry:[[Math.round(this.options.extent*(l*o-s)),Math.round(this.options.extent*(c*o-r))]],tags:h};let p;p=a||this.options.generateId?e[t+A]:this.points[e[t+A]].id,void 0!==p&&(u.id=p),i.features.push(u)}}_limitZoom(t){return Math.max(this.options.minZoom,Math.min(Math.floor(+t),this.options.maxZoom+1))}_cluster(t,e){const{radius:s,extent:r,reduce:o,minPoints:i}=this.options,n=s/(r*Math.pow(2,e)),a=t.data,h=[],l=this.stride;for(let s=0;s<a.length;s+=l){if(a[s+2]<=e)continue;a[s+2]=e;const r=a[s],c=a[s+1],u=t.within(a[s],a[s+1],n),p=a[s+b];let m=p;for(const t of u){const s=t*l;a[s+2]>e&&(m+=a[s+b])}if(m>p&&m>=i){let t,i=r*p,n=c*p,d=-1;const g=((s/l|0)<<5)+(e+1)+this.points.length;for(const r of u){const h=r*l;if(a[h+2]<=e)continue;a[h+2]=e;const c=a[h+b];i+=a[h]*c,n+=a[h+1]*c,a[h+4]=g,o&&(t||(t=this._map(a,s,!0),d=this.clusterProps.length,this.clusterProps.push(t)),o(t,this._map(a,h)))}a[s+4]=g,h.push(i/m,n/m,1/0,g,-1,m),o&&h.push(d)}else{for(let t=0;t<l;t++)h.push(a[s+t]);if(m>1)for(const t of u){const s=t*l;if(!(a[s+2]<=e)){a[s+2]=e;for(let t=0;t<l;t++)h.push(a[s+t])}}}}return h}_getOriginId(t){return t-this.points.length>>5}_getOriginZoom(t){return(t-this.points.length)%32}_map(t,e,s){if(t[e+b]>1){const r=this.clusterProps[t[e+L]];return s?Object.assign({},r):r}const r=this.points[t[e+A]].properties,o=this.options.map(r);return s&&o===r?Object.assign({},o):o}}function Z(t,e,s){return{type:"Feature",id:t[e+A],properties:I(t,e,s),geometry:{type:"Point",coordinates:[(r=t[e],360*(r-.5)),S(t[e+1])]}};var r}function I(t,e,s){const r=t[e+b],o=r>=1e4?`${Math.round(r/1e3)}k`:r>=1e3?Math.round(r/100)/10+"k":r,i=t[e+L],n=-1===i?{}:Object.assign({},s[i]);return Object.assign(n,{cluster:!0,cluster_id:t[e+A],point_count:r,point_count_abbreviated:o})}function T(t){return t/360+.5}function j(t){const e=Math.sin(t*Math.PI/180),s=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return s<0?0:s>1?1:s}function S(t){const e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}class z extends u{constructor(t){var{maxZoom:s,radius:r=60}=t,o=e(t,["maxZoom","radius"]);super({maxZoom:s}),this.state={zoom:-1},this.superCluster=new O(Object.assign({maxZoom:this.maxZoom,radius:r},o))}calculate(t){let e=!1;const r={zoom:t.map.getZoom()};if(!f(t.markers,this.markers)){e=!0,this.markers=[...t.markers];const r=this.markers.map((t=>{const e=s.getPosition(t);return{type:"Feature",geometry:{type:"Point",coordinates:[e.lng(),e.lat()]},properties:{marker:t}}}));this.superCluster.load(r)}return e||(this.state.zoom<=this.maxZoom||r.zoom<=this.maxZoom)&&(e=!f(this.state,r)),this.state=r,e&&(this.clusters=this.cluster(t)),{clusters:this.clusters,changed:e}}cluster(t){let{map:e}=t;return this.superCluster.getClusters([-180,-90,180,90],Math.round(e.getZoom())).map((t=>this.transformCluster(t)))}transformCluster(t){let{geometry:{coordinates:[e,o]},properties:i}=t;if(i.cluster)return new r({markers:this.superCluster.getLeaves(i.cluster_id,1/0).map((t=>t.properties.marker)),position:{lat:o,lng:e}});const n=i.marker;return new r({markers:[n],position:s.getPosition(n)})}}class U{constructor(t,e){this.markers={sum:t.length};const s=e.map((t=>t.count)),r=s.reduce(((t,e)=>t+e),0);this.clusters={count:e.length,markers:{mean:r/e.length,sum:r,min:Math.min(...s),max:Math.max(...s)}}}}class B{render(t,e,r){let{count:o,position:i}=t;const n=`<svg fill="${o>Math.max(10,e.clusters.markers.mean)?"#ff0000":"#0000ff"}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240" width="50" height="50">\n<circle cx="120" cy="120" opacity=".6" r="70" />\n<circle cx="120" cy="120" opacity=".3" r="90" />\n<circle cx="120" cy="120" opacity=".2" r="110" />\n<text x="50%" y="50%" style="fill:#fff" text-anchor="middle" font-size="50" dominant-baseline="middle" font-family="roboto,arial,sans-serif">${o}</text>\n</svg>`,a=`Cluster of ${o} markers`,h=Number(google.maps.Marker.MAX_ZINDEX)+o;if(s.isAdvancedMarkerAvailable(r)){const t=(new DOMParser).parseFromString(n,"image/svg+xml").documentElement;t.setAttribute("transform","translate(0 25)");const e={map:r,position:i,zIndex:h,title:a,content:t};return new google.maps.marker.AdvancedMarkerElement(e)}const l={position:i,zIndex:h,title:a,icon:{url:`data:image/svg+xml;base64,${btoa(n)}`,anchor:new google.maps.Point(25,25)}};return new google.maps.Marker(l)}}class D{constructor(){!function(t,e){for(let s in e.prototype)t.prototype[s]=e.prototype[s]}(D,google.maps.OverlayView)}}var N;t.MarkerClustererEvents=void 0,(N=t.MarkerClustererEvents||(t.MarkerClustererEvents={})).CLUSTERING_BEGIN="clusteringbegin",N.CLUSTERING_END="clusteringend",N.CLUSTER_CLICK="click";const F=(t,e,s)=>{s.fitBounds(e.bounds)};return t.AbstractAlgorithm=u,t.AbstractViewportAlgorithm=p,t.Cluster=r,t.ClusterStats=U,t.DefaultRenderer=B,t.GridAlgorithm=class extends p{constructor(t){var{maxDistance:s=4e4,gridSize:r=40}=t;super(e(t,["maxDistance","gridSize"])),this.clusters=[],this.state={zoom:-1},this.maxDistance=s,this.gridSize=r}calculate(t){let{markers:e,map:s,mapCanvasProjection:r}=t;const i={zoom:s.getZoom()};let n=!1;return this.state.zoom>=this.maxZoom&&i.zoom>=this.maxZoom||(n=!f(this.state,i)),this.state=i,s.getZoom()>=this.maxZoom?{clusters:this.noop({markers:e}),changed:n}:{clusters:this.cluster({markers:o(s,r,e,this.viewportPadding),map:s,mapCanvasProjection:r})}}cluster(t){let{markers:e,map:s,mapCanvasProjection:r}=t;return this.clusters=[],e.forEach((t=>{this.addToClosestCluster(t,s,r)})),this.clusters}addToClosestCluster(t,e,o){let n=this.maxDistance,h=null;for(let e=0;e<this.clusters.length;e++){const r=this.clusters[e],o=a(r.bounds.getCenter().toJSON(),s.getPosition(t).toJSON());o<n&&(n=o,h=r)}if(h&&i(h.bounds,o,this.gridSize).contains(s.getPosition(t)))h.push(t);else{const e=new r({markers:[t]});this.clusters.push(e)}}},t.MarkerClusterer=class extends D{constructor(t){let{map:e,markers:s=[],algorithmOptions:r={},algorithm:o=new z(r),renderer:i=new B,onClusterClick:n=F}=t;super(),this.markers=[...s],this.clusters=[],this.algorithm=o,this.renderer=i,this.onClusterClick=n,e&&this.setMap(e)}addMarker(t,e){this.markers.includes(t)||(this.markers.push(t),e||this.render())}addMarkers(t,e){t.forEach((t=>{this.addMarker(t,!0)})),e||this.render()}removeMarker(t,e){const r=this.markers.indexOf(t);return-1!==r&&(s.setMap(t,null),this.markers.splice(r,1),e||this.render(),!0)}removeMarkers(t,e){let s=!1;return t.forEach((t=>{s=this.removeMarker(t,!0)||s})),s&&!e&&this.render(),s}clearMarkers(t){this.markers.length=0,t||this.render()}render(){const e=this.getMap();if(e instanceof google.maps.Map&&e.getProjection()){google.maps.event.trigger(this,t.MarkerClustererEvents.CLUSTERING_BEGIN,this);const{clusters:r,changed:o}=this.algorithm.calculate({markers:this.markers,map:e,mapCanvasProjection:this.getProjection()});if(o||null==o){const t=new Set;for(const e of r)1==e.markers.length&&t.add(e.markers[0]);const e=[];for(const r of this.clusters)null!=r.marker&&(1==r.markers.length?t.has(r.marker)||s.setMap(r.marker,null):e.push(r.marker));this.clusters=r,this.renderClusters(),requestAnimationFrame((()=>e.forEach((t=>s.setMap(t,null)))))}google.maps.event.trigger(this,t.MarkerClustererEvents.CLUSTERING_END,this)}}onAdd(){this.idleListener=this.getMap().addListener("idle",this.render.bind(this)),this.render()}onRemove(){google.maps.event.removeListener(this.idleListener),this.reset()}reset(){this.markers.forEach((t=>s.setMap(t,null))),this.clusters.forEach((t=>t.delete())),this.clusters=[]}renderClusters(){const e=new U(this.markers,this.clusters),r=this.getMap();this.clusters.forEach((o=>{1===o.markers.length?o.marker=o.markers[0]:(o.marker=this.renderer.render(o,e,r),o.markers.forEach((t=>s.setMap(t,null))),this.onClusterClick&&o.marker.addListener("gmp-click",(e=>{google.maps.event.trigger(this,t.MarkerClustererEvents.CLUSTER_CLICK,o),this.onClusterClick(e,o,r)}))),s.setMap(o.marker,r)}))}},t.MarkerUtils=s,t.NoopAlgorithm=class extends u{constructor(t){super(e(t,[]))}calculate(t){let{markers:e,map:s,mapCanvasProjection:r}=t;return{clusters:this.cluster({markers:e,map:s,mapCanvasProjection:r}),changed:!1}}cluster(t){return this.noop(t)}},t.SuperClusterAlgorithm=z,t.SuperClusterViewportAlgorithm=class extends p{constructor(t){var{maxZoom:s,radius:r=60,viewportPadding:o=60}=t,i=e(t,["maxZoom","radius","viewportPadding"]);super({maxZoom:s,viewportPadding:o}),this.superCluster=new O(Object.assign({maxZoom:this.maxZoom,radius:r},i)),this.state={zoom:-1,view:[0,0,0,0]}}calculate(t){const e={zoom:Math.round(t.map.getZoom()),view:n(t.map.getBounds(),t.mapCanvasProjection,this.viewportPadding)};let r=!f(this.state,e);if(!f(t.markers,this.markers)){r=!0,this.markers=[...t.markers];const e=this.markers.map((t=>{const e=s.getPosition(t);return{type:"Feature",geometry:{type:"Point",coordinates:[e.lng(),e.lat()]},properties:{marker:t}}}));this.superCluster.load(e)}return r&&(this.clusters=this.cluster(t),this.state=e),{clusters:this.clusters,changed:r}}cluster(t){let{map:e,mapCanvasProjection:s}=t;const r={zoom:Math.round(e.getZoom()),view:n(e.getBounds(),s,this.viewportPadding)};return this.superCluster.getClusters(r.view,r.zoom).map((t=>this.transformCluster(t)))}transformCluster(t){let{geometry:{coordinates:[e,o]},properties:i}=t;if(i.cluster)return new r({markers:this.superCluster.getLeaves(i.cluster_id,1/0).map((t=>t.properties.marker)),position:{lat:o,lng:e}});const n=i.marker;return new r({markers:[n],position:s.getPosition(n)})}},t.defaultOnClusterClickHandler=F,t.distanceBetweenPoints=a,t.extendBoundsToPaddedViewport=i,t.extendPixelBounds=l,t.filterMarkersToPaddedViewport=o,t.getPaddedViewport=n,t.noop=m,t.pixelBoundsToLatLngBounds=c,Object.defineProperty(t,"__esModule",{value:!0}),t}({});