/* Minification failed. Returning unminified contents.
(675,22-23): run-time error JS1014: Invalid character: `
(675,60-61): run-time error JS1014: Invalid character: `
 */
(function () {
    "use strict";

    window.currentCulture = function() {
        return document.location.href.split("/")[3];
    };

    if (!window.debounce) {
        //Debounce Function taken from http://underscorejs.org/
        // Returns a function, that, as long as it continues to be invoked, will not
        // be triggered. The function will be called after it stops being called for
        // N milliseconds. If `immediate` is passed, trigger the function on the
        // leading edge, instead of the trailing.
        window.debounce = function (func, wait, immediate) {
            var timeout;
            return function () {
                var context = this;
                var args = arguments;
                const later = function () {
                    timeout = null;
                    if (!immediate) {
                        func.apply(context, args);
                    }
                };
                const callNow = immediate && !timeout;
                clearTimeout(timeout);
                timeout = setTimeout(later, wait);
                if (callNow) {
                    func.apply(context, args);
                }
            };
        };
    }

    window.dateDiff = function (date1, date2) {
        date1.setHours(0);
        date1.setMinutes(0, 0, 0);
        date2.setHours(0);
        date2.setMinutes(0, 0, 0);
        const datediff = Math.abs(date1.getTime() - date2.getTime()); // difference
        return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value
    };

    if (!window.parseDate) {
        window.parseDate = function(dateString) {

            dateString = dateString.substr(6, 4) + "/" + dateString.substr(3, 2) + "/" + dateString.substr(0, 2);

            //make the datestring a full ISO date string, even safari can't screw that up
            if (/Invalid|NaN/.test(new Date(dateString).toString()) && !/T\d{2}:\d{2}:\d{2}.\d{1}Z/.test(dateString)) {
                dateString = dateString + "T00:00:00.0Z";
            }

            return new Date(dateString);
        };
    }

    if (!window.applyDatepickers) {
        window.applyDatepickers = function(baseElement) {
            $(baseElement).find("input.date").datepicker({
                dateFormat: "dd/mm/yy", changeYear: true
            });
            $(baseElement).find("input.dob").datepicker({
                dateFormat: "dd/mm/yy", changeYear: true
            });
        };
    }

    /*
     * detect IE
     * returns version of IE or false, if browser is not Internet Explorer
     */
    function detectIE() {
        const ua = window.navigator.userAgent;

        // Test values; Uncomment to check result …

        // IE 10
        // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';

        // IE 11
        // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';

        // Edge 12 (Spartan)
        // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';

        // Edge 13
        // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';

        const msie = ua.indexOf("MSIE ");
        if (msie > 0) {
            // IE 10 or older => return version number
            return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10);
        }

        const trident = ua.indexOf("Trident/");
        if (trident > 0) {
            // IE 11 => return version number
            const rv = ua.indexOf("rv:");
            return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10);
        }

        const edge = ua.indexOf("Edge/");
        if (edge > 0) {
            // Edge (IE 12+) => return version number
            return parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10);
        }

        // other browser
        return false;
    }

    window.applyEndDateDatePicker = function (startDateElement, endDateElement) {
        startDateElement = startDateElement || $(".start-date");
        endDateElement = endDateElement || $(".end-date");
        const startDate = $.datepicker.parseDate("dd/mm/yy", startDateElement.val());
        const minDate = new Date(startDate);
        const maxDate = new Date(startDate);
        const endDate = endDateElement.val();

        endDateElement.rules("remove", "isInFuture");
        endDateElement.rules("add", {
            isInFuture: true
        });

        endDateElement.datepicker("option", "minDate", new Date(minDate.setDate(minDate.getDate() + 1)));
        endDateElement.datepicker("option", "maxDate", new Date(maxDate.setDate(maxDate.getDate() + 375)));
        // Set end date value here again because this will be overwrite by the minDate value
        endDateElement.val(endDate);
    }

    String.prototype.format = function () {
        var a = this;
        for (let k in arguments) {
            if (arguments.hasOwnProperty(k)) {
                a = a.replace(new RegExp("\\{" + k + "\\}", "g"), arguments[k]);
            }
        }
        return a;
    }

    // Create our number formatter.
    window.formatter = function() {
        return new Intl.NumberFormat('en-AU',
            {
                style: 'currency',
                currency: 'AUD',
                minimumFractionDigits: 2
                // the default value for minimumFractionDigits depends on the currency
                // and is usually already 2
            });
    };

    function getDistanceFromTop(el) {
        const scrollTop = $(window).scrollTop();
        const elementOffset = el.offset().top;
        const distance = (elementOffset - scrollTop);
        return distance;
    }

    var tooltipOptions = function() {
        const options = {
            html: true,
            placement: function (context, source) {
                const position = $(source).offset();

                $(context).appendTo("#body");
                const toolTipPadding = 40;
                const contextHeight = $(context).height() + toolTipPadding;
                $(context).remove();

                const distanceFromTop = getDistanceFromTop($(source));

                if (distanceFromTop < contextHeight) {
                    if (position.left < 515) {
                        return "right";
                    }

                    return "bottom";
                } else {
                    return "top";
                }
            }
        };

        return options;
    }

    var popoverOptions = function () {
        const options = {
            html: true        
        };

        return options;
    }

    window.showMinimumPremiumDisclaimer = function (paymentFrequency) {
        if (paymentFrequency === "fortnightly") {
            $(".minimumPremiumDisclaimer").show();
        } else {
            $(".minimumPremiumDisclaimer").hide();
        }
    };

    window.isMobileView = function () {
        return getPageWidth() <= 767;
    }

    // Source: https://stackoverflow.com/a/59497960
    window.getPageWidth = function () {
        const bodyMax = document.body
            ? Math.max(document.body.scrollWidth, document.body.offsetWidth)
            : 0;

        const docElementMax = document.documentElement
            ? Math.max(
                document.documentElement.scrollWidth,
                document.documentElement.offsetWidth,
                document.documentElement.clientWidth
            )
            : 0;

        return Math.max(bodyMax, docElementMax);
    };

    window.isNumberKey = function(evt) {
        const charCode = (evt.which) ? evt.which : event.keyCode;
        if (charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }
        return true;
    }

    window.scrollTo = function (position) {
        $('html, body').animate({ scrollTop: position }, 1000);
    }

    $(document).ready(function () {
        $(".minimumPremiumDisclaimer").hide();
        $('[data-toggle="tooltip"]').tooltip(tooltipOptions());

        // the popovers we have start their life invisible; we need to only apply the popover script to them when they become visible because of an accordian expand
        var p_options = popoverOptions();
        $(".feature-row-children").on("shown.bs.collapse", function () {
            //p_options.container = ;
            $(this).find('[data-toggle="popover"]').popover(p_options);
        });

        $('.click-tooltip').click(function (e) {
            // Cancel the default action
            e.preventDefault();
        });

        // Only one tooltip should ever be open at a time
        /*$('[data-toggle="popover"]').on('show.bs.popover', function (e) {
            $('[data-toggle="popover"]').not(this).popover('hide');
        });
        // Hide popover when click outside
        $(document).on('click', function (e) {
            $('[data-toggle="popover"],[data-original-title]').each(function () {
                //the 'is' for buttons that trigger popups
                //the 'has' for icons within a button that triggers a popup
                if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
                    (($(this).popover('hide').data('bs.popover') || {}).inState || {}).click = false  // fix for BS 3.3.6
                }

            });
        });*/

        // Resize Language Selector drop down
        const arrowWidth = 15;
        const languageSelector = $("#culture");
        const text = languageSelector.find("option:selected").text();
        const $test = $("<span style=\"font-size:" + languageSelector.css("font-size") + "\">").html(text);
        // add to body, get width, and get out
        $test.appendTo("footer");
        const width = $test.width();
        $test.remove();
        // set select width
        languageSelector.width(width + arrowWidth);

        delete $.validator.methods.date;
        $.validator.addMethod("date",
            function (value, element) {
                if (this.optional(element)) {
                    return true;
                }

                var ok = true;

                try {
                    $.datepicker.parseDate("dd/mm/yy", value);
                }
                catch (err) {
                    ok = false;
                }
                return ok;

            });

        applyDatepickers($("body"));

        $(".collapse-lite .collapse-lite-value").change(function () {
            const element = $(this);
            const elementType = element.attr("type");

            var collapse = true;
            switch (elementType) {
                case "radio":
                    if (!element.is(":checked")) {
                        return;
                    }
                    collapse = collapse && element.data("collapse-lite-value");
                    break;
                default:
                    collapse = collapse && element.data("collapse-lite-value");
                    break;
            }

            $(this).parents(".collapse-lite").toggleClass("collapse-lite-collapsed", collapse);
        }).change();

        $(".digits-only, .type-digits-only").keypress(function (event) {
            return event.charCode >= 48 && event.charCode <= 57;
        });

        $("body").on("keypress", ".text-only", function (event) {
            return event.charCode < 48 || event.charCode > 57;
        });

        if ($(".digits-only") && $(".digits-only").length > 0) {
            $(".digits-only").each(function() {
                $(this).rules("add", {
                    digits: true
                });
            });
        }

        $(".format-bsb").keyup(function () {
            var value = $(this).val();
            if (value && value.length > 3) {
                const dashIndex = value.indexOf("-");
                if (dashIndex > 0 && dashIndex === 4) return;

                if (dashIndex > 0 && dashIndex !== 4) {
                    value = value.slice(0, dashIndex) + value.slice(dashIndex + 1);
                }

                $(this).val(value.slice(0, 3) + "-" + value.slice(3));
            }
        });

        $(".no-copy-paste").bind("cut copy paste", function (e) {
            e.preventDefault();
        });

        // during payment processing a lightbox is presented
        // and a loading (spin) animation is loaded
        // this code checks if the browser can handle SVG (good browsers) or
        // the browser is IE and therefore we should show GIF
        const version = detectIE();
        if (version !== false) {
            $(".loading-spin").addClass("ie");
        }

        // handle custom number box plus and minus buttons
        $(".numberWithControls button").click(function (e) {
            e.preventDefault();
            let input = $(this).siblings("input")[0];

            let targetValue = parseInt($(input).val()) + ($(this).hasClass("plus") ? 1 : -1);

            let min = parseInt($(input).attr("min"));
            let max = parseInt($(input).attr("max"));

            if (targetValue >= min && targetValue <= max)
                $(input).val(targetValue);
            else
                return;

            if (targetValue === max || targetValue === min)
                $(this).attr("disabled", "disabled");
            else
                $(this).parent().children(":disabled").removeAttr("disabled");
        });

        // different style on selects when a non-empty option is selected
        $("select").change(function (e) {
            if ($(this).val() == "")
                $(this).css("fontWeight", "300");
            else
                $(this).css("fontWeight", "500");
        });

        $("select").each(function () {
            if ($(this).val() == "")
                $(this).css("fontWeight", "300");
            else
                $(this).css("fontWeight", "500");
        })

        $(".to-top").on("click", function () {
            $("html,body").animate({ scrollTop: "0" }, 1000);
        });
        

    });

}());;
(function () {
    "use strict";

    // Override jquery validation message
    jQuery.extend(jQuery.validator.messages, {
        required: fieldRequired,
        remote: fieldRemote,
        email: fieldMustBeValidEmail,
        url: fieldUrlError,
        date: fieldDateError,
        dateISO: fieldDateIsoError,
        number: fieldNumberError,
        digits: fieldDigitsError,
        creditcard: fieldCreditCardError,
        equalTo: fieldEqualToError,
        accept: fieldAcceptError,
        maxlength: jQuery.validator.format(fieldMaxLengthError),
        minlength: jQuery.validator.format(fieldMinLengthError),
        rangelength: jQuery.validator.format(fieldRangeLengthError),
        range: jQuery.validator.format(fieldRangeError),
        max: jQuery.validator.format(fieldMaxError),
        min: jQuery.validator.format(fieldMinError)
    });


    /* globals Card */
    window.jQuery.validator.addMethod("enforcetrue", function (value, element) {
        return element.checked;
    });
    window.jQuery.validator.unobtrusive.adapters.addBool("enforcetrue");

    // This validation is very specific to Additional Person.
    // TODO: refactor this to be more general to be able to use elsewhere maybe.
    window.jQuery.validator.addMethod("validategender", function (value, element) {
        var isValid = false;
        const genderTypeMale = "0";
        const genderTypeFemale = "1";
        const genderTypeOther = "2";

        const currentAdditionalPersonForm = $(element).closest(".additional-person");

        const currentRelationship = currentAdditionalPersonForm.find(".relationships-list").val();
        const selectedRelationshipGenderType =
            currentAdditionalPersonForm.find(".relationships-list option:selected").attr("gendertype");
        const currentTitle = currentAdditionalPersonForm.find(".titles-list").val();

        const selectedTitleRelationshipGenderType =
            currentAdditionalPersonForm.find(".titles-list option:selected").attr("gendertype");
        const selectedGender = value;

        if (currentRelationship !== "") {
            if (selectedGender.toLowerCase() === "male" && selectedRelationshipGenderType !== genderTypeFemale) {
                isValid = true;
            } else if (selectedGender.toLowerCase() === "female" && selectedRelationshipGenderType !== genderTypeMale) {
                isValid = true;
            }
        }
        return isValid;
    });
    window.jQuery.validator.unobtrusive.adapters.add("validategender", function (options) {
        options.rules["validategender"] = true;
        options.messages["validategender"] = options.message;
    });

    // to make sure HAMBS doesn't thrown the error "The EffectiveDate field must have a value greater than or equal to today's date"
    var getCurrentDatetimeUTCPlusEleven = function () {
        // get current datetime from operating system's regional settings
        const currentDatetimeFromOS = new Date();
        // get UTC time from currentDatetimeFromOS
        const currentUTCDatetime = new Date(
            currentDatetimeFromOS.getUTCFullYear(),
            currentDatetimeFromOS.getUTCMonth(),
            currentDatetimeFromOS.getUTCDate(),
            currentDatetimeFromOS.getUTCHours(),
            currentDatetimeFromOS.getUTCMinutes(),
            currentDatetimeFromOS.getUTCSeconds());
        const currentUTCDatetimePlusEleven = currentUTCDatetime;
        // set currentUTCDatetime to Australia latest offset
        currentUTCDatetimePlusEleven.setUTCHours(currentUTCDatetimePlusEleven.getUTCHours() + 11);
        return currentUTCDatetimePlusEleven;
    };

    window.jQuery.validator.addMethod("isInFuture", function (value, element, params) {
        var minDaysDiff = 0;
        const currentDate = getCurrentDatetimeUTCPlusEleven();

        if (params.VisaCategory !== undefined && params.VisaCategory.toLowerCase() !== "workingvisa") {
            minDaysDiff = defaultStartDatePeriod;
        }

        if ($(element).attr("data-additionaldaysinfuture") !== undefined &&
            $(element).attr("data-additionaldaysinfuture") !== "") {
            currentDate.setDate(currentDate.getDate() + parseInt($(element).attr("data-additionalDaysInFuture")));
        }

        const daysDiff = dateDiff(currentDate, parseDate($(element).val()));

        return parseDate($(element).val()) >= currentDate && daysDiff >= minDaysDiff;
    }, function (params) {
        if (params.VisaCategory !== undefined && params.VisaCategory.toLowerCase() !== "workingvisa") {
            return $.validator.format(dateMinimumCoverageInXDaysError)(defaultStartDatePeriod);
        } else {
            return dateIsInFutureError;
        }
    });

    window.jQuery.validator.addMethod("isInXDays", function (value, element, params) {
        const requiredDays = params.NumberOfDays;
        const date = getCurrentDatetimeUTCPlusEleven();
        date.setDate(date.getDate() + requiredDays);

        return this.optional(element) || parseDate($(element).val()) < date;
    }, function (params) {
        return $.validator.format("Date must be within " + params.NumberOfDays + " days from policy start date");
    });

    var isWithin12MonthsErrorMsg = dateMustBeWithin12Months;

    window.jQuery.validator.addMethod("isInXDaysFromStartDate", function (value, element, params) {
        const requiredDays = params.NumberOfDays;
        const startDateValue = params.StartDate;
        const startDate = new Date(startDateValue);
        const endDateValue = $.datepicker.parseDate("dd/mm/yy", value);
        const endDate = new Date(endDateValue);
        const endDateIn12Months = new Date(startDateValue.setDate(startDateValue.getDate() + requiredDays));
        startDateValue.setDate(startDateValue.getDate() - requiredDays);

        try {
            if (endDate > startDate && endDate <= endDateIn12Months) {
                return true;
            }
        } catch (e) {
            console.log(e);
        }

        isWithin12MonthsErrorMsg = "Date must be within " + params.NumberOfDays + " days from policy start date";
        if (endDate < startDate) {
            isWithin12MonthsErrorMsg = endDateMustAfterStartDate;
        }

        return false;
    }, function (params) {
        return $.validator.format("Date must be within " + params.NumberOfDays + " days from policy start date");
    });


    window.jQuery.validator.addMethod("isWithin12Months", function (value, element, params) {
        const startDateValue = params.StartDate;
        const startDate = new Date(startDateValue);
        const endDateValue = $.datepicker.parseDate("dd/mm/yy", value);
        const endDate = new Date(endDateValue);
        const endDateIn12Months = new Date(startDateValue.setMonth(startDateValue.getMonth() + 12));
        startDateValue.setMonth(startDateValue.getMonth() - 12);

        try {
            if (endDate > startDate && endDate <= endDateIn12Months) {
                return true;
            }
        } catch (e) {
            console.log(e);
        }

        isWithin12MonthsErrorMsg = dateMustBeWithin12Months;
        if (endDate < startDate) {
            isWithin12MonthsErrorMsg = endDateMustAfterStartDate;
        }

        return false;
    }, function () { return isWithin12MonthsErrorMsg; });

    window.jQuery.validator.addMethod("cardValidation", function (value, element) {
        return $(element).hasClass("jp-card-valid");
    }, invalidCardInformation);

    window.jQuery.validator.addMethod("cardValidToValidation", function (value, element) {
        $(".ccardValidToEntry")
            .each(function () {
                if ($(this).hasClass("jp-card-valid")) {
                    $(this).removeClass("input-validation-error");
                }
            });

        return $(element).hasClass("jp-card-valid");
    }, invalidCardInformation);

    window.jQuery.validator.addMethod("cardTypeValidation", function (value, element) {
        return !$(".jp-card").hasClass("jp-card-unknown");
    }, cardTypeNotSupported);

    window.jQuery.validator.addMethod("isOnePartner", function (value, element) {
        if (relationshipOptions.some(function (o) {
            return o.Code === value && o.Type !== "Partner";
        })) {
            return true;
        }

        const partners = $(".relationships-list")
            .filter(function (idx) {
                return relationshipOptions.some(function (o) {
                    const optionValue = $($(".relationships-list")[idx]).val();
                    return o.Code === optionValue && o.Type === "Partner";
                });
            });
        return partners.length < 2;
    }, isOnePartnerError);

    var isAdditionalPeopleDobValidErrorMessage = "";
    window.jQuery.validator.addMethod("isAdditionalPeopleDobValid",
        function(value, element) {
            const relationshipType1 = ["Sps", "Ptnr"];
            const relationshipType2 = ["Son", "Dtr", "OthCh"];

            const relationship = $(element).closest(".additional-person").find(".relationships-list").val().trim();
            $(element).rules("remove", "overLegalAge");

            // Spouse / Partner has to be over 16 years old
            if (jQuery.inArray(relationship, relationshipType1) >= 0) {
                $(element).rules("add",
                    {
                        overLegalAge: {
                            minimumLegalAge: 16,
                            errorMessage: additionalPeopleOverLegalAge
                        }
                    });

                return true;
            }
            // Children must be under 18 years of age.
            else if (jQuery.inArray(relationship, relationshipType2) >= 0) {
                const minimumLegalAge = 18;
                const dobValue = moment($(element).val(), "DD/MM/YYYY");
                const today = moment();
                const age = today.diff(dobValue,
                    'years',
                    false); // false to not include fraction values, it's not round it up.
                isAdditionalPeopleDobValidErrorMessage = additionalPeopleUnderLegalAge;
                return this.optional(element) || age <= minimumLegalAge;
            }
            return true;
        }, function () { return isAdditionalPeopleDobValidErrorMessage; });


    window.jQuery.validator.addMethod("overLegalAge", function (value, element, params) {

        const dobValue = moment($(element).val(), "DD/MM/YYYY");
        const today = moment();
        const age = today.diff(dobValue, 'years', false); // false to not include fraction values, it's not round it up.
        const minimumLegalAge = params.minimumLegalAge;

        return this.optional(element) || age >= minimumLegalAge;

    }, function (params) {
            return params.errorMessage;
    });

    window.jQuery.validator.addMethod("validDateOfBirth",
        function (value, element, params) {
            const today = moment();
            const personDob = value;
            const isValidDoB = !moment(personDob, "DD/MM/YYYY").isAfter(today);

            return isValidDoB;
        }, dateOfBirthDateError);

    window.isSessionExpired = function () {
        return $.get(`/${currentCulture()}/IsSessionTimeout`, function (data) {
            if (data.toLowerCase() === "true") {
                alert(sessionExpiredError);
            }
        });
    };

}());;
