/* Minification failed. Returning unminified contents.
(391,50-51): run-time error JS1195: Expected expression: >
(391,87-88): run-time error JS1195: Expected expression: )
(392,1-2): run-time error JS1002: Syntax error: }
 */
$.urlParam = function (name) {
    var params = new URLSearchParams(window.location.search);
    var aValues = params.getAll(name);
    return aValues.length == 1 ? aValues[0] : aValues;
}

$.insertUrlParameter = function (key, value) {

    if (history.pushState) {

        var currentUrl = window.location.href;

        currentUrl = $.removeParameterFromUrl(currentUrl, key);

        var queryStart;

        if (currentUrl.indexOf('?') !== -1)
            queryStart = '&';
        else
            queryStart = '?';

        var newurl = currentUrl + queryStart + key + '=' + value

        if (newurl != window.location.href)
            window.history.replaceState({ path: newurl }, '', newurl);
    }
}

$.removeParameterFromUrl = function (url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts = url.split('?');
    if (urlparts.length >= 2) {

        var prefix = encodeURIComponent(parameter) + '=';
        var pars = urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i = pars.length; i-- > 0;) {
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                pars.splice(i, 1);
            }
        }

        url = urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
        return url;
    } else {
        return url;
    }
}

$.generateUUID = function () {
    var d = new Date().getTime();
    if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
        d += performance.now();
    }
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = (d + Math.random() * 16) % 16 | 0;
        d = Math.floor(d / 16);
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}

$.serializeSearchBox = function (params) {
    for (key in params) {
        if (typeof params[key] == 'undefined' || params[key] == null || params[key] == "" || params[key].length == 0) {
            delete params[key];
        }
    }
    return $.param(params, true);
}

$.searchBoxParam = function () {
    var queryString = null;

    if (window.location.search !== "") {
        queryString = {};
        queryString.region = $.urlParam('rg');
        queryString.resort = $.urlParam('rs');
        queryString.country = $.urlParam('co');
        queryString.countryGroup = $.urlParam('cg');
        queryString.regionGroup = $.urlParam('rgg');
        queryString.resortGroup = $.urlParam('rsg');
        queryString.property = $.urlParam('p');
        queryString.attributes = $.urlParam('at');
        queryString.departureAirport = $.urlParam('da');
        queryString.arrivalAirport = $.urlParam('aa');
        queryString.departureAirportGroup = $.urlParam('dag');
        queryString.duration = $.urlParam('du');
        queryString.departureDate = $.urlParam('dd');
        queryString.startDate = $.urlParam('sd');
        queryString.endDate = $.urlParam('ed');
        queryString.flexibility = $.urlParam('f');
        queryString.rooms = $.urlParam('r');
        queryString.sessionGuid = $.urlParam('gu');
        queryString.liveSessionGuid = $.urlParam('lgu');
        queryString.mealBasisId = $.urlParam('mb');
        queryString.searchExecuted = $.urlParam('se');
    }

    return queryString;
}

$.parseRoomQueryString = function (room) {
    var response = {};
    response.adults = 0;
    response.children = 0;
    response.infants = 0;
    response.childAges = [];

    const regex = /^(?:a([\d]*))(?:c([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?(?:ca([\d]*))?/gm;

    var roomGroups = regex.exec(room);
    if (roomGroups.length > 0) {
        roomGroups.forEach(function (match, groupIndex) {
            if (groupIndex == 1 && typeof match != 'undefined') {
                response.adults = match;
            } else if (groupIndex == 2 && typeof match != 'undefined') {
                response.children = match;
            } else if (groupIndex > 2 && typeof match != 'undefined') {
                response.childAges.push(match);
            }
        });
    }

    if (response.children > 0) {
        response.childAges.forEach(function (item, i) {
            if (item < 2) {
                response.children--;
                response.infants++;
            }
        });
    }

    return response;
}

$.getCropUrl = function (externalUrl, width, height) {
    var url = new URL(externalUrl);
    var newUrl = '/remote.axd/' + url.hostname + url.pathname + url.search + '?quality=75';
    var addMode = '';

    if (!isNaN(width) && width != null && width !== '') {
        newUrl = newUrl + '&width=' + width;
        addMode = 'crop';
    }

    if (!isNaN(height) && height != null && height !== '') {
        newUrl = newUrl + '&height=' + height;
        addMode = 'crop';
    }

    if (addMode !== '') {
        newUrl = newUrl + '&mode=' + addMode;
    }

    return newUrl;
}

$.validateEmail = function (email) {
    var expression = /(?!.*\.{2})^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i;
    return expression.test(String(email).toLowerCase());
}

$.checkCardNumber = function (cardNumber) {

    function luhn_checksum(code) {
        var len = code.length
        var parity = len % 2
        var sum = 0
        for (var i = len - 1; i >= 0; i--) {
            var d = parseInt(code.charAt(i))
            if (i % 2 == parity) { d *= 2 }
            if (d > 9) { d -= 9 }
            sum += d
        }
        return sum % 10
    }

    function luhn_validate(fullcode) {
        return luhn_checksum(fullcode) == 0
    }

    return cardNumber != "" ? luhn_validate(cardNumber) : false;
}

$.validateDate = function (dateStr) {

    if (dateStr) {

        var parms = dateStr.split(/[\.\-\/]/);
        var yyyy = parseInt(parms[2], 10);
        var mm = parseInt(parms[1], 10);
        var dd = parseInt(parms[0], 10);
        var date = moment([yyyy, mm - 1, dd]);

        if (date.isValid() && date > moment("1900-01-01T00:00:00"))
            return true;
        else
            return false;
    }
    else {

        return false;
    }
}

$.fn.scrollView = function () {
    return this.each(function () {
        $('html, body').animate({
            scrollTop: $(this).offset().top - 100
        }, 1000);
    });
}

$.validationNewsletter = function (nameField, event) {

    var form = $(event.target).parents('form.my-newsletter');
    var formField = null;
    var value = "";
    var valid = null;

    switch (nameField) {
        case 'name':
            formField = form.find("input[type='text']");
            value = formField.val();
            valid = value != "" ? true : false;
            break;
        case 'email':
            formField = form.find("input[type='email']");
            value = formField.val();
            valid = $.validateEmail(value);
            break;
        case 'checkbox':
            formField = form.find("input[type='checkbox']");
            valid = formField.get(0).checked;
            formField = formField.parents('div.my-newsletter');
    }

    if (!valid) {
        formField.removeClass('border-0');
        formField.addClass('border border-1 border-danger rounded');
    }
    else {
        formField.removeClass('border border-1 border-danger rounded');
        formField.addClass('border-0');
    }

    return {
        value: value,
        validity: (valid)
    };
}

$.getCookie = function (name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
}

function bindAlphaOnly() {
    $('.alphaonly').unbind('keyup blur').bind('keyup blur', function () {
        $(this).val($(this).val().replace(/[^a-zA-Z\s]/g, ''));
    });
}

// Newsletter
$(document).ready(function () {
    $('[data-toggle="tooltip"]').tooltip();

    $('.carousel-deals').on('setPosition', function (event, slick, currentSlide, nextSlide) {
        $('[data-toggle="tooltip"]').tooltip();
    });

    $('[data-toggle="menu-offcanvas"]').on("click", function () {
        $('.auto-open').removeClass('active');
    });

    bindAlphaOnly();

    if ($('.quote-carousel').length > 0) {
        CardImageCarousel();
    }

    $('button.my-newsletter').click(function (e) {

        var btn = $(this);

        let container = $(e.target).parents('.newsletter')[0];

        if (typeof container == 'undefined')
            container = $(e.target).parents('.bottom__newsletter')[0];

        let content = $(container).find('.newsletter__content');
        let confirmation = $(container).find('.confirm');

        $(e.target).parents('form.my-newsletter').data('search', true)

        var validName = $.validationNewsletter('name', e);
        var validEmail = $.validationNewsletter('email', e);
        var validCheck = $.validationNewsletter('checkbox', e);

        if (validName.validity && validEmail.validity && validCheck.validity) {

            $(btn).addClass('active');

            var request = {
                fname: validName.value,
                sname: "",
                email: validEmail.value,
                according: validCheck.validity
            }

            $.ajax({
                url: window.location.protocol + "//" + window.location.host + "/Umbraco/Api/NewsletterApi/SubscribeNewsletter",
                type: "POST",
                data: request,
                success: function (result) {
                    $(btn).removeClass('active');

                    if (result) {

                        $(content).hide();
                        $(confirmation).fadeIn(500);
                        $(container).css('background-image', 'none');
                    }
                    else {
                        Swal.fire({
                            title: 'Something went wrong!',
                            text: 'Error on subscribe',
                            type: 'error',
                            confirmButtonText: 'Ok',
                            customClass: {
                                confirmButton: 'btn btn-default',
                                cancelButton: 'btn btn-primary'
                            },
                            buttonsStyling: false
                        });
                    }
                },
                error: function (error) {
                    $(btn).removeClass('active');

                    Swal.fire({
                        title: 'Something went wrong!',
                        text: 'Error on subscribe',
                        type: 'error',
                        confirmButtonText: 'Ok',
                        customClass: {
                            confirmButton: 'btn btn-default',
                            cancelButton: 'btn btn-primary'
                        },
                        buttonsStyling: false
                    });
                }
            });
        }
    });

    $('form.my-newsletter').find("input[type='text'], input[type='email']").blur(function (e) {
        if ($(e.target).parents('form.my-newsletter').data('search')) {
            if ($(e.target).is(':text')) $.validationNewsletter('name', e);
            if ($(e.target).is("[data-type='email']")) $.validationNewsletter('email', e);
        }
    });

    $('form.my-newsletter').find(':checkbox').click(function (e) {
        if ($(e.target).parents('form.my-newsletter').data('search')) {
            if ($(e.target).is(":checkbox")) $.validationNewsletter('checkbox', e);
        }
    });

    if (isInternetExplorer())
        showIncompatibleBrowserModal();
    else if (!isES6())
        alert('Unfortunately, our website does not work in outdated browsers. To continue to browse, please update your browser');

    adjustPopsHeight();
    validateEnquiryForm();

    $(".navbar-nav .dropdown-sm a.nav-link").on('click', function (e) {
        e.stopPropagation();
    });

    $('.carousel-images-link').on('click', function (event) {
        if (event.target.className.includes('slick-arrow'))
            return false;
    });

    //remove enter key action from searchbox search input
    $('[name="search-box-input"]').keypress((e) => { if (e.which == 13) return false });
});

// cookie functions
//(function () {
//    if (typeof $.getCookie('BT_COOKIE') !== 'undefined') {
//        $('#stickycookiePolicy .Close').parent().parent().parent().fadeOut();
//    }
//})();
//$.acceptCookie = function () {
//    $('#stickycookiePolicy .Close').parent().parent().parent().fadeOut();
//    var expire = new Date();
//    expire.setTime(expire.getTime() + (90 * 24 * 60 * 60 * 1000));
//    document.cookie = "BT_COOKIE=true; expires=" + expire.toUTCString() + ";";
//}

var cal;

$(function () {
    if ($('#calendar-infinite').length > 0) {
        cal = new InfiniteCal();
        cal.Init();
    }
});

function clearInfiniteCal() {
    if (cal) {
        cal.Init();
    }
}

function isInternetExplorer() {

    return /MSIE|Trident/.test(window.navigator.userAgent);
}

function showIncompatibleBrowserModal() {

    $('#modal-incompatible-browser').modal('toggle');
}

function isDesktop() {

    var isMobile = /iphone|ipad|ipod|android|webos/i.test(navigator.userAgent.toLowerCase());

    return !isMobile;
}

function isES6() {

    try {

        Function("() => {};"); return true;
    }
    catch (exception) {

        return false;
    }
}

//pop's
function adjustPopsHeight() {
    //$('.carousel-deals .slick-slide h3').matchHeight({ property: 'min-height' });
    //$('.carousel-deals .slick-slide .card-map').matchHeight({ property: 'min-height' });
    //$('.carousel-deals .slick-slide .card-features').matchHeight({ property: 'min-height' });
    //$('.carousel-deals .slick-slide .card-body').matchHeight({ property: 'min-height' });
    //$('.carousel-deals .slick-slide .card-bell-pop').matchHeight({ property: 'min-height' });
    //$('.carousel-deals .slick-slide .price-badge').matchHeight({ property: 'height' });

    //$('.cards_list .card .card-body h3').matchHeight({ property: 'min-height' });
    //$('.cards_list .card .card-map').matchHeight({ property: 'min-height' });
    //$('.cards_list .card .card-features').matchHeight({ property: 'min-height' });
    //$('.cards_list .card .card-body').matchHeight({ property: 'min-height' });
    //$('.cards_list .card .card-bell').matchHeight({ property: 'min-height' });
    //$('.cards_list .card .price-badge').matchHeight({ property: 'min-height' });

    //$('.featured-facilities-container').matchHeight({ property: 'min-height' });
}

function scrollToselectedDate() {

    let startDate = $('td.active.start');
    let isSelected = !$('#calendarMobileLabel').text().toUpperCase().includes('SELECT');

    if (startDate.length > 0 && isSelected) {

        $('#calendarModal').animate({
            scrollTop: startDate.offset().top - 200
        }, 500)
    };
}

function checkUrlUSA() {

    try {
        if (document.location.href.indexOf('holidays-usa') >= 0)
            $.insertUrlParameter('us', '1');
    }
    catch (e) { }
}

checkUrlUSA();

/* Prevent show cache page */
window.onpageshow = function (event) {
    if (event.persisted)
        window.location.reload();
};

var validateEnquiryForm = function () {

    var formValues = [];

    $('.frmEnquiry').each(function () {
        $(this).validate({
            focusInvalid: false,
            submitHandler: function (form) {

                var validateResponse = validateFields($('.form-value', form), form);

                if (validateResponse.IsValid) {

                    //Get default fields
                    if (typeof enquiryDefaultField != 'undefined' && enquiryDefaultField.fields.length > 0) {

                        $(enquiryDefaultField.fields).each(function (index, field) {

                            if (field.panelIndex === $('.frmEnquiry').index(form)) {
                                formValues.push(field);
                            }
                        });
                    }

                    $('.form-value', form).each(function () {

                        let row = $(this);

                        let value = '';

                        let name = '';

                        let label = row.data('formlabel');

                        if (row.find('input').length > 0 && row.find('div.option-other').length <= 0) {

                            let input = row.find('input');

                            name = input.attr('name');

                            if (input.attr('type') == 'checkbox') {

                                value = input.is(':checked');

                                if (value) {

                                    value = 'Yes';
                                } else {

                                    value = 'No';
                                }

                            } else {

                                value = input.val();
                            }

                            formValues.push({ key: label, Value: value, Name: name });

                        } else if (row.find('select').length > 0) {

                            let select = row.find('select');

                            value = select.val();

                            if (value.trim().toUpperCase() == 'OTHER') {
                                value = row.find('div.option-other input').val();
                            }

                            name = select.attr('name');

                            formValues.push({ Key: label, Value: value, Name: name });

                        } else if (row.find('textarea').length > 0) {

                            let textarea = row.find('textarea');

                            name = textarea.attr('name');

                            formValues.push({ Key: label, Value: textarea.val(), Name: name });
                        }
                    });

                    if ($('.form-passengers', form).length > 0) {

                        let adults = parseInt($('#txtAdults').val());
                        let children = parseInt($('#txtChildren').val());
                        let childrenAges = '';

                        if (children > 0) {
                            for (var i = 0; i < children; i++) {
                                childrenAges += $('#selChildAge-' + i).val();

                                if (i != (children - 1))
                                    childrenAges += ', ';
                            }
                        }

                        formValues.push(
                            { Key: 'Adults', Name: 'enq-Adults', Value: adults },
                            { Key: 'Children', Name: 'enq-Children', Value: children },
                            { Key: 'ChildrenAges', Name: 'enq-ChildrenAges', Value: childrenAges }
                        );
                    }

                    let emailFrom = $('.emailFrom', form).text();
                    let emailTo = $('.emailTo', form).text();
                    let confirmationMessage = $('.confirmationMessage', form).html();
                    let enquiryType = setEnquiryType($('.enquiryType', form).text());
                    let isiVectorEnquiry = $('.sendToiVector', form).text();

                    var data = {
                        emailFrom: emailFrom,
                        emailTo: emailTo,
                        formValues: formValues,
                        confirmationMessage: confirmationMessage,
                        url: window.document.location.href,
                        referrerUrl: window.document.referrer,
                        type: enquiryType,
                        sendToiVector: isiVectorEnquiry,
                        brandId: 3,
                        sendEmail: true
                    };

                    $.post(window.location.protocol + "//" + window.location.host + "/Umbraco/Api/PhoenixApi/SendEnquiry", data, function (result) {
                        if (result.Success) {
                            $('.confirmation-container', form).length > 0 ? $('.confirmation-container', form).show() : $('.confirmation-container').show();
                            $('.enquiry-form-content', form).length > 0 ? $('.enquiry-form-content', form).hide() : $('.enquiry-form-content').hide();
                            scrollToTop(form);
                            cleanFields(form);
                        } else {
                            Swal.fire({
                                title: 'Something went wrong!',
                                text: result.Message,
                                type: 'error',
                                confirmButtonText: 'Ok',
                                customClass: {
                                    confirmButton: 'btn btn-brand',
                                    cancelButton: 'btn btn-default'
                                },
                                buttonsStyling: false
                            });
                        }
                    });
                } else {
                    //Show error message
                    if (validateResponse.Placement) {
                        $(validateResponse.Placement).append(validateResponse.ErrorMsg);
                    }
                }

                formValues = [];
            },
            errorPlacement: function (error, element) {
                var placement = $(element).data('error');
                if (placement) {
                    $(placement).append(error)
                }
            },
            invalidHandler: function (form, validator) {

                if (!validator.numberOfInvalids())
                    return;

                $('html, body').animate({
                    scrollTop: $(validator.errorList[0].element).offset().top - 100
                }, 100);
            }
        });
    });

    $('.form-value select').on('change', function () {

        let formValues = $('.form-value.has-select');

        if (formValues.find('select').length > 0) {

            formValues.each(function (index) {

                if ($(this).find('select').val().trim().toUpperCase() == 'OTHER') {
                    $(this).find('div.option-other').show();
                } else {
                    $(this).find('div.option-other').hide();
                }
            });
        }
    });

    $(".enquiry-pax").inputSpinner({
        decrementButton: "<strong><i class='fas fa-minus'></i></strong>",
        incrementButton: "<strong><i class='fas fa-plus'></i></strong>",
        buttonsClass: "btn-spin",
        buttonsWidth: "32px"
    });

    $('#txtChildren').on('change', function () {
        var to = parseInt($('#txtChildren').val());
        $('.childre-age').hide();

        for (var i = 0; i < to; i++) {
            $('.child-' + i).show();
        }
    });

    var validateFields = function (fields, form) {

        let response = null;

        let isValid = false;

        let errorMsg = '';

        let errorLabel = '';

        let field = '';

        if (fields.length > 0) {

            fields.each(function () {

                let row = $(this);

                let type = row.data('formtype');

                //Date verification
                if (type.trim().toUpperCase() == 'DATE') {

                    let isValidMonth = false;

                    let isValidDay = false;

                    field = row.find('input');

                    errorLabel = field.data('error');

                    let date = field.val().split('/');

                    if (Array.isArray(date) && date.length === 3) {

                        isValidMonth = parseInt(date[1]) > 12 || parseInt(date[1]) < 1 ? false : true;

                        isValidDay = parseInt(date[0]) > 32 || parseInt(date[0]) < 1 ? false : true;

                        isValid = isValidMonth && isValidDay ? true : false;

                    }

                    if (!isValid) {
                        errorMsg += 'Invalid date!'

                        return false;
                    }
                }

                if (type.trim().toUpperCase().includes('TEXT') || type.trim().toUpperCase() === 'EMAIL') {

                    field = row.find('input').length > 0 ? row.find('input') : row.find('textarea');

                    errorLabel = field.data('error');

                    if (field.length !== 0) {

                        isValid = true;
                    } else {

                        return false;
                    }
                }
            });
        }

        response = { IsValid: isValid, ErrorMsg: errorMsg, Placement: errorLabel }

        return response;
    }

    var cleanFields = function (form) {

        $('.form-value', form).each(function () {

            let row = $(this);

            if (row.find('input').length > 0 && row.find('div.option-other').length <= 0) {

                let input = row.find('input');

                if (!input.attr('type') == 'checkbox')
                    input.val('');

            } else if (row.find('select').length > 0) {

                row.find('select').val('');

            } else if (row.find('textarea').length > 0) {

                row.find('textarea').val('');
            }
        });

    }

    var scrollToTop = function (form) {

        let confirmation = '';

        if ($('.confirmation-container', form).length > 0) {

            $('html, body').animate({
                scrollTop: $('.confirmation-container', form).offset().top - 100
            }, 1000);
        } else {

            $('html, body').animate({
                scrollTop: $('.confirmation-container').offset().top - 100
            }, 1000);
        }
    }

    var setEnquiryType = function (enqTypeStr) {

        let typeId = null;

        switch (enqTypeStr.toUpperCase()) {

            case 'HOTEL':
                typeId = 1;
                break;

            case 'FLIGHT':
                typeId = 2;
                break;

            case 'PACKAGE':
                typeId = 3;
                break;

            case 'OTHER':
                typeId = 4;
                break;
        }

        return typeId
    }
};
