
    const IDX_thisScript = document.currentScript;
    ! function() {
        IDX_insertWidgetHtml();
    }()

    function IDX_insertWidgetHtml() {
        const cities = {"message":"Incorrect credentials"};
        const url = "https:\/\/app.locallysavvybizsolutions.com\/v2\/preview\/zH0GHLtLKwq033fpzGbV";
        console.log(cities, url)
        const settings = {"city":null,"sort":"priceDesc","fields":null,"styles":null,"new_tab":"false","criteria":{"max_price_to":2000000,"min_price_to":1000000,"max_price_from":1000000,"min_price_from":0,"price_interval":100000},"search_url":"https:\/\/app.locallysavvybizsolutions.com\/v2\/preview\/zH0GHLtLKwq033fpzGbV"};
        const {
            criteria
        } = settings;
        const generateCities = () => {
            let html = '';

            if (cities !== null) {
                // Sort alphabetically by name
                const sorted = [...cities].sort((a, b) =>
                    a.name.localeCompare(b.name)
                );

                sorted.forEach(city => {
                    html += `<li>${city.name}</li>`;
                });
            }

            return html;
        };
        const generatePrice = (from, to, interval = 50000) => {
            from = Number(from);
            to = Number(to);
            interval = Number(interval);

            if (!interval || interval <= 0) return '';

            let html = '';
            for (let i = from; i <= to; i += interval) {
                html += `<li>$${i.toLocaleString()}</li>`;
            }
            return html;
        };
        let html = ` 
        <style>.omnisearch-wrapper *,
.omnisearch-wrapper {
    box-sizing: border-box;
    font-family: inherit;
    padding: 0;
    margin: 0;
}

.omnisearch-wrapper {
    --font-size: 16px;
    --wrapper-bg-color: #f8f8f8;
    --wrapper-padding-y: 20px;
    --wrapper-padding-x: 20px;
    --wrapper-border-size: 1px;
    --wrapper-border-color: #f8f8f8;
    --wrapper-border-radius: 5px;
    --input-bg-color: #fff;
    --input-padding-y: 5px;
    --input-padding-x: 5px;
    --input-border-size: 1px;
    --input-border-color: #cccccc;
    --input-border-radius: 5px;
    --input-color: #000;
    --button-bg-color: rgb(30 64 175);
    --button-padding-y: 5px;
    --button-padding-x: 5px;
    --button-border-size: 1px;
    --button-border-color: rgb(30 64 175);
    --button-border-radius: 5px;
    --button-color: white;
}

.omnisearch-wrapper {
    width: 100%;
    padding: var(--wrapper-padding-y) var(--wrapper-padding-x);
    background-color: var(--wrapper-bg-color);
    border: var(--wrapper-border-size) solid var(--wrapper-border-color);
    border-radius: var(--wrapper-border-radius);
    display: flex;
    justify-content: space-around;
    align-items: center;
    gap: 10px;
    margin: 0 auto;
    box-sizing: border-box;
    max-width: 1300px;
}

@media (max-width: 950px) {
    .omnisearch-wrapper {
        flex-wrap: wrap;
    }

}

.omnisearch-wrapper input {
    width: 100%;
    border: none;
    color: var(--input-color);
    font-size: var(--font-size);
    outline: none;
}

.omnisearch-wrapper input:focus {
    outline: none;
}

.omnisearch-dropdown,
.omnisearch-input-container {
    position: relative;
    display: flex;
    align-items: center;
    background-color: var(--input-bg-color);
    border: var(--input-border-size) solid var(--input-border-color);
    border-radius: var(--input-border-radius);
    padding: var(--input-padding-y) var(--input-padding-x);
    gap: 5px;
    width: 100%;
}

.omnisearch-price {
    flex: 1 0 8rem;
}

.omnisearch-input-container {
    flex: 1 0 8rem;
}

.omnisearch-dropdown svg,
.omnisearch-input-container svg {
    width: var(--font-size);
    height: var(--font-size);
}

.omnisearch-dropdown-menu {
    position: absolute;
    padding: 10px 20px;
    margin-top: 10px;
    top: 100%;
    left: 0;
    background-color: var(--input-bg-color);
    border: var(--input-border-size) solid var(--input-border-color);
    border-radius: var(--input-border-radius);
    z-index: 5;
    display: none;
    min-width: 100%;
    max-height: 250px;
    overflow: hidden;
    overflow-y: scroll;
}

.omnisearch-dropdown-menu.active {
    display: block;
}

.omnisearch-dropdown-menu li {
    list-style: none;
    font-size: var(--font-size);
    color: var(--input-color);
    padding: 10px 5px;
    cursor: pointer;
    transition: background-color 0.3s ease;
}

.omnisearch-dropdown-menu li:hover {
    background-color: #f0f0f0;
}

.omnisearch-button {
    all: unset;
    display: flex;
    justify-content: center;
    padding: var(--button-padding-y) var(--button-padding-x);
    background-color: var(--button-bg-color);
    color: var(--button-color);
    border: var(--button-border-size) solid var(--button-border-color);
    border-radius: var(--button-border-radius);
    font-size: var(--font-size);
    cursor: pointer;
    width: 100%;
    flex: 1 0 8rem;
}</style>
        <form class="omnisearch-wrapper" id="omni-search">
            <div class="omnisearch-dropdown" data-field="city">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome  - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"/></svg>
                    <input type="text" name="city" placeholder="City" id="city" autocomplete="off">
                <menu class="omnisearch-dropdown-menu">
                ${generateCities()}
                </menu>
            </div>
            <div class="omnisearch-dropdown omnisearch-price" data-field="min_price">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.5.1 by @fontawesome  - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M160 0c17.7 0 32 14.3 32 32V67.7c1.6 .2 3.1 .4 4.7 .7c.4 .1 .7 .1 1.1 .2l48 8.8c17.4 3.2 28.9 19.9 25.7 37.2s-19.9 28.9-37.2 25.7l-47.5-8.7c-31.3-4.6-58.9-1.5-78.3 6.2s-27.2 18.3-29 28.1c-2 10.7-.5 16.7 1.2 20.4c1.8 3.9 5.5 8.3 12.8 13.2c16.3 10.7 41.3 17.7 73.7 26.3l2.9 .8c28.6 7.6 63.6 16.8 89.6 33.8c14.2 9.3 27.6 21.9 35.9 39.5c8.5 17.9 10.3 37.9 6.4 59.2c-6.9 38-33.1 63.4-65.6 76.7c-13.7 5.6-28.6 9.2-44.4 11V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V445.1c-.4-.1-.9-.1-1.3-.2l-.2 0 0 0c-24.4-3.8-64.5-14.3-91.5-26.3c-16.1-7.2-23.4-26.1-16.2-42.2s26.1-23.4 42.2-16.2c20.9 9.3 55.3 18.5 75.2 21.6c31.9 4.7 58.2 2 76-5.3c16.9-6.9 24.6-16.9 26.8-28.9c1.9-10.6 .4-16.7-1.3-20.4c-1.9-4-5.6-8.4-13-13.3c-16.4-10.7-41.5-17.7-74-26.3l-2.8-.7 0 0C119.4 279.3 84.4 270 58.4 253c-14.2-9.3-27.5-22-35.8-39.6c-8.4-17.9-10.1-37.9-6.1-59.2C23.7 116 52.3 91.2 84.8 78.3c13.3-5.3 27.9-8.9 43.2-11V32c0-17.7 14.3-32 32-32z"/></svg>
                    <input type="text" name="min_price" placeholder="Min Price" id="min_price" inputmode="numeric">
                <menu class="omnisearch-dropdown-menu">
                   ${generatePrice(criteria.min_price_from, criteria.min_price_to, criteria.price_interval)}
                </menu>
            </div>
            <div class="omnisearch-dropdown omnisearch-price" data-field="max_price">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.5.1 by @fontawesome  - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M160 0c17.7 0 32 14.3 32 32V67.7c1.6 .2 3.1 .4 4.7 .7c.4 .1 .7 .1 1.1 .2l48 8.8c17.4 3.2 28.9 19.9 25.7 37.2s-19.9 28.9-37.2 25.7l-47.5-8.7c-31.3-4.6-58.9-1.5-78.3 6.2s-27.2 18.3-29 28.1c-2 10.7-.5 16.7 1.2 20.4c1.8 3.9 5.5 8.3 12.8 13.2c16.3 10.7 41.3 17.7 73.7 26.3l2.9 .8c28.6 7.6 63.6 16.8 89.6 33.8c14.2 9.3 27.6 21.9 35.9 39.5c8.5 17.9 10.3 37.9 6.4 59.2c-6.9 38-33.1 63.4-65.6 76.7c-13.7 5.6-28.6 9.2-44.4 11V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V445.1c-.4-.1-.9-.1-1.3-.2l-.2 0 0 0c-24.4-3.8-64.5-14.3-91.5-26.3c-16.1-7.2-23.4-26.1-16.2-42.2s26.1-23.4 42.2-16.2c20.9 9.3 55.3 18.5 75.2 21.6c31.9 4.7 58.2 2 76-5.3c16.9-6.9 24.6-16.9 26.8-28.9c1.9-10.6 .4-16.7-1.3-20.4c-1.9-4-5.6-8.4-13-13.3c-16.4-10.7-41.5-17.7-74-26.3l-2.8-.7 0 0C119.4 279.3 84.4 270 58.4 253c-14.2-9.3-27.5-22-35.8-39.6c-8.4-17.9-10.1-37.9-6.1-59.2C23.7 116 52.3 91.2 84.8 78.3c13.3-5.3 27.9-8.9 43.2-11V32c0-17.7 14.3-32 32-32z"/></svg>
                    <input type="text" name="max_price" placeholder="Max Price" id="max_price" inputmode="numeric">
                <menu class="omnisearch-dropdown-menu">
                    ${generatePrice(criteria.max_price_from, criteria.max_price_to, criteria.price_interval)}

                </menu>
            </div>
            <label class="omnisearch-input-container" for="beds" data-field="beds">
                <input type="text" name=beds placeholder="Beds" id="beds" inputmode="numeric">
            </label>
            <label class="omnisearch-input-container" for="baths" data-field="baths">
                <input type="text" name="baths" placeholder="Baths" inputmode="numeric">
            </label>
            <button class="omnisearch-button" type="submit">Search</button>
        </form>`;
        // Get a reference to the current script element
        const IDX_currentScript = document.currentScript;
        // Insert the HTML after the current script element
        if (IDX_currentScript) {
            IDX_currentScript.insertAdjacentHTML('afterend', html);
        }
        initSearchWidget(settings, cities, url);

    }

    function initSearchWidget(settings, cities, url) {
        const omniSearch = document.getElementById('omni-search');
        const dropdowns = document.querySelectorAll('.omnisearch-dropdown');
        const inputs = document.querySelectorAll('.omnisearch-wrapper input');
        const fields = document.querySelectorAll('.omnisearch-wrapper [data-field]');
        const fieldsValues = {
            city: '',
            min_price: 0,
            max_price: 0,
            beds: 0,
            baths: 0
        };

        function setStyles() {
            if(!settings.styles) return;
            for (const [key, value] of Object.entries(settings.styles)) {
                omniSearch.style.setProperty(key, value);
            }
        }

        function formatCurrency(value) {
            return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
        }

        function addEventToMenuItems(menu, input) {
            menu.querySelectorAll('li').forEach(li => {
                li.addEventListener('click', (e) => {
                    e.stopPropagation();
                    menu.classList.remove('active');
                    input.value = li.textContent;
                    const inputType = input.getAttribute('inputmode');
                    if (inputType === 'numeric') {
                        input.value = input.value.replace(/[^0-9.]/g, "");
                        fieldsValues[input.getAttribute('name')] = input.value;
                        input.value = formatCurrency(input.value);
                        return;
                    }
                    fieldsValues[input.getAttribute('name')] = input.value;
                });
            });
        }

        function fieldsVisibles() {
            if(!settings.fields) return;
            fields.forEach(field => {
                if (field && settings.fields[field.getAttribute('data-field')]) {
                    field.style.display = 'none';
                }
            });
        }

        function getCityId(cityName) {
            if(!cityName) return '';
            
            const city = cities.find(city => city.name === cityName);
            return city.id;
        }

        dropdowns.forEach(dropdown => {
            const input = dropdown.querySelector('input');
            const menu = dropdown.querySelector('.omnisearch-dropdown-menu');

            dropdown.addEventListener('click', (e) => {
                menu.classList.add('active');
                input.focus();
            });
            if (input.getAttribute('name') === 'city') {
                input.addEventListener('input', () => {
                    const value = input.value;
                    const filteredCities = cities.filter(city => city.name.toLowerCase().includes(value
                        .toLowerCase()));
                    menu.innerHTML = '';
                    filteredCities.forEach(city => {
                        menu.innerHTML += `<li>${city.name}</li>`;
                    });
                    addEventToMenuItems(menu, input);
                });
            }
            addEventToMenuItems(menu, input);

            document.addEventListener('click', event => {
                if (!menu.contains(event.target) && !dropdown.contains(event.target)) {
                    menu.classList.remove('active');
                }
            });
        });

        inputs.forEach(input => {
            input.addEventListener('input', () => {
                const inputType = input.getAttribute('inputmode');
                const key = input.getAttribute('name');
                if (inputType === 'numeric') {
                    input.value = input.value.replace(/[^0-9.]/g, "");
                    fieldsValues[key] = input.value;
                    input.value = formatCurrency(input.value);
                    return;
                }
                fieldsValues[key] = input.value;
            });
        });

        omniSearch.addEventListener('submit', event => {
            event.preventDefault();
            const {
                city,
                min_price,
                max_price,
                beds,
                baths
            } = fieldsValues;
            const apiUrl = `${url}?minListPrice=${min_price}&maxListPrice=${max_price}&bedrooms=${beds}&bathCount=${baths}&propertyType=SFR,CND&status=active&sort=${settings.sort}&cityId=${settings.city?? getCityId(city)}`;

            
            
            // check if settings has new_tab first exists and is true
            if( settings.new_tab && settings.new_tab === true ){
                window.open(apiUrl, '_blank');
            }else{
                window.location.href = apiUrl;
            }
       
        });

        fieldsVisibles();
        setStyles();
    }

