1/* 2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). 3 * This devtool is neither made for production nor for readable output files. 4 * It uses "eval()" calls to create a separate source file in the browser devtools. 5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) 6 * or disable the default devtool with "devtool: false". 7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). 8 */ 9/******/ (() => { // webpackBootstrap 10/******/ var __webpack_modules__ = ({ 11 12/***/ 250: 13/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { 14 15"use strict"; 16eval("\n// EXTERNAL MODULE: ./node_modules/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js\nvar jquery_validate_unobtrusive = __webpack_require__(421);\n;// ./frontend/src/scripts/module/accordion.js\nfunction initAccordion() {\n $('.accordion .accordion-accordion-label').on('click', function () {\n var $label = $(this);\n var $item = $label.closest('.accordion-accordion-item');\n var $content = $item.find('.accordion-accordion-content');\n var $icon = $label.find('img');\n var $accordion = $label.closest('.accordion-accordion');\n\n // Close all other accordion items\n $accordion.find('.accordion-accordion-item').not($item).each(function () {\n var $otherContent = $(this).find('.accordion-accordion-content');\n var $otherIcon = $(this).find('.accordion-accordion-label img');\n $otherContent.slideUp(300);\n $otherContent.removeClass('show');\n $otherIcon.removeClass('accordion-expanded-arrow');\n $(this).find('.accordion-accordion-label').addClass('collapsed');\n });\n\n // Toggle current item\n if ($content.hasClass('show')) {\n $content.slideUp(300);\n $content.removeClass('show');\n $icon.removeClass('accordion-expanded-arrow');\n $label.addClass('collapsed');\n } else {\n $content.slideDown(300);\n $content.addClass('show');\n $icon.addClass('accordion-expanded-arrow');\n $label.removeClass('collapsed');\n }\n });\n}\n/* harmony default export */ const accordion = (initAccordion);\n;// ./frontend/src/scripts/module/jumpto.js\nif ($('section.jumpto').length !== 0) {\n $('section.breadcrumb').addClass('has-jumpto');\n}\nif ($('section.breadcrumb').length === 0) {\n $($('section.hero').addClass('homepage-padding'));\n}\nif ($('section.hero').hasClass('homepage-padding')) {\n if ($('section.jumpto').length > 0) {\n $('section.hero').addClass('language-page');\n $('section.jumpto').addClass('language-page');\n }\n}\n$('.jumpto a.accordion').on('click', function () {\n if ($(window).width() < 769) {\n const $content = $(this).closest('.content');\n const $title = $content.find('.jumpto-title');\n const $list = $content.find('.jumpto-list li');\n if ($content.hasClass('open')) {\n // CLOSE\n $content.removeClass('open');\n $title.removeClass('open');\n $list.addClass('d-none'); // hide items\n $('.jumpto .content').css('bottom', '50px');\n } else {\n // OPEN\n $content.addClass('open');\n $title.addClass('open');\n $list.removeClass('d-none'); // show items\n }\n console.log('Accordion working');\n }\n});\nfunction jumptoFix() {\n if ($(window).width() > 768) {\n $('.jumpto .content').css('bottom', '-150px');\n } else {\n $('.jumpto .content').css('bottom', '50px');\n }\n}\n// EXTERNAL MODULE: external \"jQuery\"\nvar external_jQuery_ = __webpack_require__(669);\nvar external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);\n;// ./frontend/src/scripts/module/hero-banner.js\n\nfunction adjustTitleLayoutOnMobileLandscape() {\n // if on mobile landscape and there is a jump to section, prevent the title from overlapping\n if (window.matchMedia('(max-height: 350px)').matches && external_jQuery_default()('section.jumpto')[0]) {\n external_jQuery_default()('.header .hero-content').removeClass('mobile-landscape-style');\n external_jQuery_default()('.header .hero-content').addClass('mobile-landscape-style');\n external_jQuery_default()('.header .hero-content').removeClass('sm');\n external_jQuery_default()('.header .hero-content').addClass('sm');\n } else if (window.matchMedia('(max-height: 414px)').matches && external_jQuery_default()('section.jumpto')[0]) {\n external_jQuery_default()('.header .hero-content').removeClass('mobile-landscape-style');\n external_jQuery_default()('.header .hero-content').addClass('mobile-landscape-style');\n external_jQuery_default()('.header .hero-content').removeClass('sm');\n } else {\n external_jQuery_default()('.header .hero-content').removeClass('mobile-landscape-style');\n external_jQuery_default()('.header .hero-content').removeClass('sm');\n }\n}\nfunction adjustTitleLayoutOnMobilePortrait() {\n // target all sizes until tablet\n if (window.matchMedia('(max-width: 991px)').matches && window.matchMedia('(min-height:100px)').matches) {\n // if jump to exists\n if (external_jQuery_default()('.jumpto > .content')[0]) {\n // console.log('jump to exists');\n var hero_content = external_jQuery_default()('.header-banner .hero-content');\n if (!hero_content.hasClass('mobile-portrait-style')) {\n hero_content.addClass('mobile-portrait-style');\n }\n if (!hero_content.hasClass('jump-to-exists')) {\n hero_content.addClass('jump-to-exists');\n }
16\n // if book now exists\n if (external_jQuery_default()('.btn-jumpto-cta')[0]) {\n // console.log('hero book now exists');\n if (!hero_content.hasClass('book-now-exists')) {\n hero_content.addClass('book-now-exists');\n }\n }\n }\n } else {\n var hero_content = external_jQuery_default()('.header .hero-content');\n hero_content.removeClass('mobile-portrait-style');\n hero_content.removeClass('jump-to-exists');\n hero_content.removeClass('book-now-exists');\n }\n}\nfunction bindHeroEvents() {\n // Info toggle (single, scoped handler)\n external_jQuery_default()(document).on('click', '.hero-info-btn', function () {\n external_jQuery_default()(this).next('.hero-info-text').toggleClass('on');\n });\n\n // Play video\n external_jQuery_default()(document).on('click', '.hero-play-btn', function () {\n const video = document.getElementById('heroVideo');\n if (!video) return;\n video.play();\n external_jQuery_default()('.hero-pause-btn').removeClass('hide');\n external_jQuery_default()(this).addClass('hide');\n });\n\n // Pause video\n external_jQuery_default()(document).on('click', '.hero-pause-btn', function () {\n const video = document.getElementById('heroVideo');\n if (!video) return;\n video.pause();\n external_jQuery_default()('.hero-play-btn').removeClass('hide');\n external_jQuery_default()(this).addClass('hide');\n });\n\n // Header search modal\n external_jQuery_default()(document).on('click', '.header a.search', function (e) {\n e.preventDefault();\n external_jQuery_default()('body').addClass('modal-is-open');\n external_jQuery_default()('section.modal').addClass('modal-open light');\n external_jQuery_default()('.hero-pause-btn').trigger('click');\n external_jQuery_default()('section.modal-container.search').addClass('open').attr('tabindex', -1).focus();\n });\n\n // Generic modal buttons\n external_jQuery_default()(document).on('click', 'button[data-modal=\"true\"]', function () {\n external_jQuery_default()('body').addClass('modal-is-open');\n external_jQuery_default()('section.modal').addClass('modal-open');\n external_jQuery_default()('.hero-pause-btn').trigger('click');\n external_jQuery_default()('section.modal-container.' + external_jQuery_default()(this).data('target-class')).addClass('open').attr('tabindex', -1).focus();\n });\n if (external_jQuery_default()('section.hero .video-container').length === 0) {\n external_jQuery_default()('section.hero .hero-background-image').append('<div class=\"image-overlay-med\"></div>');\n }\n}\nfunction handleInitialScrollState() {\n if (external_jQuery_default()(window).scrollTop() > external_jQuery_default()(window).height()) {\n external_jQuery_default()('.hero-pause-btn').trigger('click');\n }\n}\nfunction handleNoHeaderState() {\n const $header = external_jQuery_default()('section.header');\n if ($header.hasClass('no-header')) {\n // Prevent duplicate insertion\n if (!external_jQuery_default()('.no-header-pusher').length) {\n external_jQuery_default()('body').prepend('<div class=\"no-header-pusher\"></div>');\n }\n external_jQuery_default()('a.btn-link.header-btn-donate.light').removeClass('light').addClass('dark');\n external_jQuery_default()('.breadcrumb').addClass('no-header');\n }\n if (external_jQuery_default()('section.breadcrumb').hasClass('has-hero-social') && external_jQuery_default()('.header-social').length == 0) {\n external_jQuery_default()('section.breadcrumb').addClass('has-empty-social');\n }\n}\nfunction markNoHeaderSections() {\n external_jQuery_default()('.no-top-header').each(function () {\n external_jQuery_default()(this).closest('section').addClass('section-no-header');\n });\n external_jQuery_default()('div.cols.no-header').each(function () {\n external_jQuery_default()(this).closest('section').addClass('section-no-header');\n });\n}\nfunction scrollHandler() {\n var scrollTop = external_jQuery_default()(window).scrollTop();\n external_jQuery_default()('html').toggleClass('scrolled', scrollTop > 5);\n}\nfunction updateContainer() {\n const $hero = external_jQuery_default()('.no-header-hero');\n if (!external_jQuery_default()('.search-results').length) return;\n if (external_jQuery_default()(window).width() > 768) {\n $hero.css({\n paddingTop: '12px',\n paddingBottom: '0px'\n });\n } else {\n $hero.css({\n paddingTop: '30px',\n paddingBottom: '0px'\n });\n }\n}\nfunction initHeader() {\n handleNoHeaderState();\n markNoHeaderSections();\n}\nfunction initHero() {\n if (external_jQuery_default()('.jumpto').length) {\n external_jQuery_default()('.header .hero-content h1').addClass('condensed-header-h5');\n }\n}\nfunction initHeroHeader() {\n // Initial layout adjustments\n adjustTitleLayoutOnMobileLandscape();\n adjustTitleLayoutOnMobilePortrait();\n initHero();\n initHeader();\n bindHeroEvents();\n\n // Initial scroll state\n handleInitialScrollState();\n scrollHandler();\n\n // Responsive updates\n updateContainer();\n\n // Event listeners\n external_jQuery_default()(window).on('resize orientationchange', function () {\n adjustTitleLayoutOnMobileLandscape();\n adjustTitleLayoutOnMobilePortrait();\n updateContainer();\n });\n external_jQuery_default()(window).on('scroll', function () {\n scrollHandler();\n });\n}\n;// ./frontend/src/scripts/module/acknowledgement.js\n// Module 41 - Lightbox Module\nfunction initAcknowledgement() {\n $('.acknowledgement .acknowledgement-open-modal-btn').click(function () {\n $(this).closest('.acknowledgement').find('.acknowledgement-modal-overlay').addClass('acknowledgement-modal-open');\n $(this).addClass('acknowledgement-modal-open');\n $('body').css('overflow', 'hidden');\n });\n $('.acknowledgement-modal-overlay').click(function () {\n $(this).removeClass('acknowledgement-modal-open');\n $(this).closest('.acknowledgement').find('.acknowledgement-open-modal-btn').removeClass('acknowledgement-modal-open');\n $('body').css('overflow', 'unset');\n });\n $('.acknowledgement-modal-lightbox').click(function (e) {\n e.stopPropagation();\n });\n $('.acknowledgement-cancel').click(function () {\n $(this).closest('.acknowledgement-modal-overlay').removeClass('acknowledgement-modal-open');\n $(this).closest('.acknowledgement').find('.acknowledgement-open-modal-btn').removeClass('acknowledgement-modal-open');\n $('body').css('overflow', 'unset');\n });\n $('.acknowledgement-modal-lightbox .btn-link').click(function () {\n $(this).closest('.acknowledgement-modal-overlay').removeClass('acknowledgement-modal-open');\n $(this).closest('.acknowledgement').find('.acknowledgement-open-modal-btn').removeClass('acknowledgement-modal-open');\n $('body').css('overflow', 'unset');\n });\n $('.acknowledgement-modal-lightbox .button-primary').click(function () {\n const $acknowledgement = $(this).closest('.acknowledgement');\n $acknowledgement.find('.acknowledgement-modal-overlay').removeClass('acknowledgement-modal-open');\n $acknowledgement.find('.acknowledgement-open-modal-btn').removeClass('acknowledgement-modal-open');\n document.body.style.removeProperty('overflow');\n });\n}\nfunction disableScroll() {\n $('body').css('overflow', 'hidden');\n}\nwindow.showLightBox = function () {\n // Directly add the class instead of triggering click on hidden button\n $('.acknowledgement-modal-overlay').addClass('acknowledgement-modal-open');\n $('.acknowledgement-open-modal-btn').addClass('acknowledgement-modal-open');\n disableScroll();\n};\nwindow.disableScroll = disableScroll;\n/* harmony default export */ const acknowledgement = (initAcknowledgement);\n// EXTERNAL MODULE: ./frontend/src/scripts/plugins/datepicker.js\nvar datepicker = __webpack_require__(288);\n;// ./frontend/src/scripts/module/accommodation.js\n\nconst RMS_BOOKING_URL = \"https://ibe12.rmscloud.com/4544/1\";
16\nfunction formatRmsDate(date) {\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const year = date.getFullYear();\n return `${month}/${day}/${year}`;\n}\nfunction buildRmsBookingUrl({\n categoryIds,\n arrivalDate,\n departureDate,\n adults,\n children,\n infants,\n promocode = \"\"\n}) {\n const qs = new URLSearchParams({\n A: formatRmsDate(arrivalDate),\n D: formatRmsDate(departureDate),\n Ad: adults,\n C: children,\n I: infants\n });\n const normalizedCategoryIds = String(categoryIds || \"\").trim();\n if (normalizedCategoryIds && normalizedCategoryIds.toLowerCase() !== \"all\") {\n qs.append(\"catIds\", normalizedCategoryIds);\n }\n const normalizedPromocode = String(promocode || \"\").trim();\n if (normalizedPromocode) qs.append(\"Pc\", normalizedPromocode);\n qs.append(\"execute\", \"true\");\n return `${RMS_BOOKING_URL}?${qs.toString()}`;\n}\nfunction accommodation() {\n // Js for accommodation detial page\n $(document).ready(function () {\n if ($(\".accommodation-header\").length) {\n $(\"div.show-more\").on(\"click\", function () {\n if ($(this).hasClass(\"active\")) {\n $(this).parent().find(\"ul.acoommodation-amenities-list.show-more-itemes\").removeClass(\"active\");\n $(this).removeClass(\"active\");\n $(this).find(\"span.text\").text(\"Show all amenities\");\n } else {\n $(this).parent().find(\"ul.acoommodation-amenities-list.show-more-itemes\").addClass(\"active\");\n $(this).addClass(\"active\");\n $(this).find(\"span.text\").text(\"Show Less\");\n }\n });\n if ($(window).width() < 991) {\n $(\".right.sticky\").remove();\n } else {\n $(\".right.mobile\").remove();\n }\n var date = new Date();\n // js for datepicker\n $(\"#arrival\").datepicker({\n format: \"dd/mm/yyyy\",\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#from-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n }).on(\"pick.datepicker\", function (e) {\n // give the plugin a tick to run its formatter, then overwrite\n setTimeout(() => {\n var date = $(this).datepicker(\"getDate\");\n var dayName = $(this).datepicker(\"getDayName\", date.getDay(), true);\n var dayNumber = (\"0\" + date.getDate()).slice(-2);\n var monthName = $(this).datepicker(\"getMonthName\", date.getMonth(), true);\n var year = date.getFullYear();\n $(this).val(`${dayName} ${dayNumber} ${monthName} ${year}`);\n }, 0);\n });\n $(\"#departure\").datepicker({\n format: \"yyyy-MM-dd\",\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#to-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n }).on(\"pick.datepicker\", function (e) {\n // give the plugin a tick to run its formatter, then overwrite\n setTimeout(() => {\n var date = $(this).datepicker(\"getDate\");\n var dayName = $(this).datepicker(\"getDayName\", date.getDay(), true);\n var dayNumber = (\"0\" + date.getDate()).slice(-2);\n var monthName = $(this).datepicker(\"getMonthName\", date.getMonth(), true);\n var year = date.getFullYear();\n $(this).val(`${dayName} ${dayNumber} ${monthName} ${year}`);\n }, 0);\n });\n $(\"#arrival\").focus(function () {\n $(\"#arrival\").datepicker(\"show\");\n });\n $(\"#departure\").focus(function () {\n $(\"#departure\").datepicker(\"show\");\n });\n $(\"#arrival\").on(\"change\", function () {\n var fromDateObj = new Date($(this).val());\n var toDateObj = new Date($(\"#departure\").val());\n $(\".startDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Invalid Date Range\");\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\"#departure\").addClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", true);\n } else {\n $(\".endDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", false);\n }\n });\n $(\"#departure\").on(\"change\", function () {\n var fromDateObj = new Date($(\"#arrival\").val());\n var toDateObj = new Date($(this).val());\n $(\".startDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Invalid Date Range\");\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\"#departure\").addClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", true);\n } else {\n $(\".endDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", false);\n }\n });\n // js for guest counter\n $(function () {\n let counts = {\n adults: 0,\n children: 0,\n infants: 0\n };
16\n function updateField() {\n $(\"#guests\").val(`${counts.adults} Ad, ${counts.children} Ch, ${counts.infants} In`);\n }\n function updateUI() {\n for (let type in counts) {\n const count = counts[type];\n const $input = $(\"#\" + type + \"Count\");\n $input.val(count);\n $input.toggleClass(\"active\", count > 0);\n $('.minus[data-type=\"' + type + '\"]').toggleClass(\"active\", count > 0);\n }\n updateField(); // reflect in main input\n }\n function parseInput(val) {\n const regexMap = {\n adults: /([0-9]+)\\\\s*Ad/i,\n children: /([0-9]+)\\\\s*Ch/i,\n infants: /([0-9]+)\\\\s*In/i\n };\n for (let key in regexMap) {\n const match = val.match(regexMap[key]);\n counts[key] = match ? parseInt(match[1], 10) : 0;\n }\n }\n\n // Show dropdown\n $(\"#guests\").on(\"focus click\", function () {\n const $dropdown = $(\"#guestDropdown\");\n if ($(window).width() >= 768) {\n $dropdown.show();\n } else {\n const $input = $(this);\n const inputOffset = $input.offset();\n const inputHeight = $input.outerHeight();\n const dropdownHeight = $dropdown.outerHeight();\n const windowHeight = $(window).height();\n const scrollTop = $(window).scrollTop();\n const spaceBelow = windowHeight - (inputOffset.top - scrollTop + inputHeight);\n const spaceAbove = inputOffset.top - scrollTop;\n\n // Position the dropdown based on space\n if (spaceBelow < dropdownHeight && spaceAbove > dropdownHeight) {\n // Show above\n\n $dropdown.css({\n bottom: 50,\n top: \"unset\",\n position: \"absolute\"\n }).addClass(\"show-above\").removeClass(\"show-below\");\n } else {\n // Show below\n $dropdown.css({\n top: 50,\n bottom: \"unset\",\n position: \"absolute\"\n }).addClass(\"show-below\").removeClass(\"show-above\");\n }\n $dropdown.show();\n }\n });\n\n // Handle plus/minus clicks\n $(\".plus, .minus\").on(\"click\", function () {\n const type = $(this).data(\"type\");\n if ($(this).hasClass(\"plus\")) {\n counts[type]++;\n } else {\n counts[type] = Math.max(0, counts[type] - 1);\n }\n updateUI();\n });\n\n // Handle direct typing into input fields (adultsCount, childrenCount, infantsCount)\n $(\".count\").on(\"input\", function () {\n const type = this.id.replace(\"Count\", \"\");\n const val = parseInt($(this).val(), 10);\n counts[type] = isNaN(val) ? 0 : Math.max(0, val);\n $(\"#hiddenTotalGuests\").val(counts.adults + counts.children + counts.infants);\n updateUI();\n });\n\n // OK button\n $(\"#guestOk\").on(\"click\", function (e) {\n e.preventDefault();\n updateField();\n $(\"#hiddenTotalGuests\").val(counts.adults + counts.children + counts.infants);\n $(\"#guestDropdown\").hide();\n if ($(\"#hiddenTotalGuests\").val() > 0) {\n $(\".guestsError\").hide();\n $(\"#guests\").removeClass(\"invalid-guest-error\");\n }\n });\n });\n // 1) Parse the guest string\n function parseGuests(str) {\n // pulls out all numbers in order: [ adults, children, infants ]\n const nums = str.match(/\\d+/g).map(Number);\n return {\n adults: nums[0] || 0,\n children: nums[1] || 0,\n infants: nums[2] || 0\n };\n }\n\n // 2) Parse the \"Sun 13 Jul 2025\" into a JS Date\n function parseDate(str) {\n // [\"Sun\", \"13\", \"Jul\", \"2025\"]\n const [, day, mon, year] = str.split(\" \");\n const monthNames = {\n Jan: 0,\n Feb: 1,\n Mar: 2,\n Apr: 3,\n May: 4,\n Jun: 5,\n Jul: 6,\n Aug: 7,\n Sep: 8,\n Oct: 9,\n Nov: 10,\n Dec: 11\n };\n return new Date(Number(year), monthNames[mon], Number(day));\n }
16\n\n // js for book now button and url generation\n $(\"#detailPageBookNowButton\").on(\"click\", function (e) {\n e.preventDefault();\n let valid = true;\n //add validation per input add speareat validation for each input\n if ($(\"#arrival\").val() == \"\") {\n // alert('Please fill arrival date');\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\".startDateError\").show();\n $(\".startDateError\").html(\"Please fill arrival date\");\n valid = false;\n }\n if ($(\"#departure\").val() == \"\") {\n // alert('Please fill departure date');\n $(\"#departure\").addClass(\"invalid-date-error\");\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Please fill departure date\");\n valid = false;\n }\n if ($(\"#guests\").val() == \"\" || $(\"#hiddenTotalGuests\").val() == \"0\") {\n $(\"#guests\").addClass(\"invalid-date-error\");\n $(\".guestsError\").show();\n $(\".guestsError\").html(\"Please fill guests\");\n valid = false;\n }\n if (valid) {\n let propertyId = $(\"#rmsId\").val();\n const arrival = $(\"#arrival\").val();\n const departure = $(\"#departure\").val();\n const parsedarrival = parseDate(arrival);\n const parseddeparture = parseDate(departure);\n const guestStr = $(\"#guests\").val();\n const {\n adults,\n children,\n infants\n } = parseGuests(guestStr);\n let promocode = \"\";\n if ($(\"#promo\").val()) {\n promocode = $(\"#promo\").val().trim();\n }\n const url = buildRmsBookingUrl({\n categoryIds: propertyId,\n arrivalDate: parsedarrival,\n departureDate: parseddeparture,\n adults,\n children,\n infants,\n promocode\n });\n window.open(url, \"_blank\");\n }\n });\n }\n // js for accommodation listing page\n if ($(\".accommodation-listing\").length) {\n // js for open popup modal\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectGeneric\").on(\"change\", function () {\n $(\"#popupRmsId\").val($(this).val());\n });\n $(\".book-now-btn\").click(function (e) {\n e.preventDefault();\n if ($(this).hasClass(\"btn\") && $(this).hasClass(\"book-now\") && $(this).hasClass(\"btn-link\")) {\n const rmsId = $(this).data(\"rms-id\");\n console.log(rmsId);\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectGeneric\").hide();\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectIndividual\").show();\n setTimeout(() => {\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectIndividual\").attr(\"disabled\", true);\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectIndividual\").val(String(rmsId)).trigger(\"change\");\n const allOptions = $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectIndividual\").find(\"option\");\n for (let i = 0; i < allOptions.length; i++) {\n const element = allOptions[i];\n if (rmsId == element.value) {\n $(\"#popupRmsId\").val($(element).attr(\"data-categoryrmsid\"));\n }\n }\n }, 10);\n } else {\n if (!$(this).hasClass(\"popup-modal-btn\")) {\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect\").prop(\"selectedIndex\", 0);\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectIndividual\").hide();\n $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectGeneric\").show();\n const allOptions = $(\"body\").find(\".popup-modal-overlay\").find(\"#accommodationSelect.accommodationSelectGeneric\").find(\"option\");\n $(\"#popupRmsId\").val(allOptions.eq(0).val());\n }\n }\n $(\"body\").find(\".popup-modal-overlay\").addClass(\"popup-modal-open\");\n $(\"body\").css(\"overflow\", \"hidden\");\n });\n // js for close popup modal\n $(\".popup-modal .popup-modal-cancel\").click(function () {\n $(this).closest(\".popup-modal\").find(\".popup-modal-overlay\").removeClass(\"popup-modal-open\");\n $(this).closest(\".popup-modal\").find(\".popup-modal-open\").removeClass(\"popup-modal-open\");\n $(\"body\").css(\"overflow\", \"unset\");\n $(\"#accommodationSelect\").val(\"\");\n $(\"#arrival\").val(\"\");\n $(\"#departure\").val(\"\");\n $(\"#guests\").val(\"\");\n $(\"#promo\").val(\"\");\n });\n var date = new Date();\n // js for datepicker\n $(\"#arrival\").datepicker({\n format: \"dd/mm/yyyy\",\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#from-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n }).on(\"pick.datepicker\", function (e) {\n // give the plugin a tick to run its formatter, then overwrite\n setTimeout(() =>
16 {\n var date = $(this).datepicker(\"getDate\");\n var dayName = $(this).datepicker(\"getDayName\", date.getDay(), true);\n var dayNumber = (\"0\" + date.getDate()).slice(-2);\n var monthName = $(this).datepicker(\"getMonthName\", date.getMonth(), true);\n var year = date.getFullYear();\n $(this).val(`${dayName} ${dayNumber} ${monthName} ${year}`);\n }, 0);\n });\n $(\"#departure\").datepicker({\n format: \"yyyy-MM-dd\",\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#to-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n }).on(\"pick.datepicker\", function (e) {\n // give the plugin a tick to run its formatter, then overwrite\n setTimeout(() => {\n var date = $(this).datepicker(\"getDate\");\n var dayName = $(this).datepicker(\"getDayName\", date.getDay(), true);\n var dayNumber = (\"0\" + date.getDate()).slice(-2);\n var monthName = $(this).datepicker(\"getMonthName\", date.getMonth(), true);\n var year = date.getFullYear();\n $(this).val(`${dayName} ${dayNumber} ${monthName} ${year}`);\n }, 0);\n });\n $(\"#arrival\").focus(function () {\n $(\"#arrival\").datepicker(\"show\");\n });\n $(\"#departure\").focus(function () {\n $(\"#departure\").datepicker(\"show\");\n });\n $(\"#arrival\").on(\"change\", function () {\n var fromDateObj = new Date($(this).val());\n var toDateObj = new Date($(\"#departure\").val());\n $(\".startDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Invalid Date Range\");\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\"#departure\").addClass(\"invalid-date-error\");\n // $(\"#applyBtn\").prop('disabled', true);\n $(\"#detailPageBookNowButton\").prop(\"disabled\", true);\n } else {\n $(\".endDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", false);\n // $(\"#applyBtn\").prop('disabled', false);\n }\n });\n $(\"#departure\").on(\"change\", function () {\n var fromDateObj = new Date($(\"#arrival\").val());\n var toDateObj = new Date($(this).val());\n $(\".startDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Invalid Date Range\");\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\"#departure\").addClass(\"invalid-date-error\");\n // $(\"#applyBtn\").prop('disabled', true);\n $(\"#detailPageBookNowButton\").prop(\"disabled\", true);\n } else {\n $(\".endDateError\").hide();\n $(\"#arrival\").removeClass(\"invalid-date-error\");\n $(\"#departure\").removeClass(\"invalid-date-error\");\n $(\"#detailPageBookNowButton\").prop(\"disabled\", false);\n // $(\"#applyBtn\").prop('disabled', false);\n }\n });\n // js for guest counter\n $(function () {\n let counts = {\n adults: 0,\n children: 0,\n infants: 0\n };\n function updateField() {\n $(\"#guests\").val(`${counts.adults} Ad, ${counts.children} Ch, ${counts.infants} In`);\n }\n function updateUI() {\n for (let type in counts) {\n const count = counts[type];\n const $input = $(\"#\" + type + \"Count\");\n $input.val(count);\n $input.toggleClass(\"active\", count > 0);\n $('.minus[data-type=\"' + type + '\"]').toggleClass(\"active\", count > 0);\n }\n updateField(); // reflect in main input\n }\n function parseInput(val) {\n const regexMap = {\n adults: /([0-9]+)\\\\s*Ad/i,\n children: /([0-9]+)\\\\s*Ch/i,\n infants: /([0-9]+)\\\\s*In/i\n };\n for (let key in regexMap) {\n const match = val.match(regexMap[key]);\n counts[key] = match ? parseInt(match[1], 10) : 0;\n }\n }
16\n\n // Show dropdown\n $(\"#guests\").on(\"focus click\", function () {\n $(\"#guestDropdown\").show();\n });\n\n // Handle plus/minus clicks\n $(\".plus, .minus\").on(\"click\", function () {\n const type = $(this).data(\"type\");\n if ($(this).hasClass(\"plus\")) {\n counts[type]++;\n } else {\n counts[type] = Math.max(0, counts[type] - 1);\n }\n updateUI();\n });\n\n // Handle direct typing into input fields (adultsCount, childrenCount, infantsCount)\n $(\".count\").on(\"input\", function () {\n const type = this.id.replace(\"Count\", \"\");\n const val = parseInt($(this).val(), 10);\n counts[type] = isNaN(val) ? 0 : Math.max(0, val);\n $(\"#hiddenTotalGuests\").val(counts.adults + counts.children + counts.infants);\n updateUI();\n });\n\n // OK button\n $(\"#guestOk\").on(\"click\", function (e) {\n e.preventDefault();\n updateField();\n $(\"#hiddenTotalGuests\").val(counts.adults + counts.children + counts.infants);\n $(\"#guestDropdown\").hide();\n if ($(\"#hiddenTotalGuests\").val() > 0) {\n $(\".guestsError\").hide();\n $(\"#guests\").removeClass(\"invalid-guest-error\");\n }\n });\n });\n // 1) Parse the guest string\n function parseGuests(str) {\n // pulls out all numbers in order: [ adults, children, infants ]\n const nums = str.match(/\\d+/g).map(Number);\n return {\n adults: nums[0] || 0,\n children: nums[1] || 0,\n infants: nums[2] || 0\n };\n }\n\n // 2) Parse the \"Sun 13 Jul 2025\" into a JS Date\n function parseDate(str) {\n // [\"Sun\", \"13\", \"Jul\", \"2025\"]\n const [, day, mon, year] = str.split(\" \");\n const monthNames = {\n Jan: 0,\n Feb: 1,\n Mar: 2,\n Apr: 3,\n May: 4,\n Jun: 5,\n Jul: 6,\n Aug: 7,\n Sep: 8,\n Oct: 9,\n Nov: 10,\n Dec: 11\n };\n return new Date(Number(year), monthNames[mon], Number(day));\n }\n\n // js for book now button and url generation\n $(\"#detailPageBookNowButton\").on(\"click\", function (e) {\n e.preventDefault();\n let valid = true;\n //add validation per input add speareat validation for each input\n if ($(\"#arrival\").val() == \"\") {\n // alert('Please fill arrival date');\n $(\"#arrival\").addClass(\"invalid-date-error\");\n $(\".startDateError\").show();\n $(\".startDateError\").html(\"Please fill arrival date\");\n valid = false;\n }\n if ($(\"#departure\").val() == \"\") {\n // alert('Please fill departure date');\n $(\"#departure\").addClass(\"invalid-date-error\");\n $(\".endDateError\").show();\n $(\".endDateError\").html(\"Please fill departure date\");\n valid = false;\n }\n if ($(\"#guests\").val() == \"\" || $(\"#hiddenTotalGuests\").val() == \"0\") {\n $(\"#guests\").addClass(\"invalid-date-error\");\n $(\".guestsError\").show();\n $(\".guestsError\").html(\"Please fill guests\");\n valid = false;\n }\n if (valid) {\n let propertyId = $(\"#popupRmsId\").val();\n const arrival = $(\"#arrival\").val();\n const departure = $(\"#departure\").val();\n const parsedarrival = parseDate(arrival);\n const parseddeparture = parseDate(departure);\n const guestStr = $(\"#guests\").val();\n const {\n adults,\n children,\n infants\n } = parseGuests(guestStr);\n let promocode = \"\";\n if ($(\"#promo\").val()) {\n promocode = $(\"#promo\").val().trim();\n }\n const url = buildRmsBookingUrl({\n categoryIds: propertyId,\n arrivalDate: parsedarrival,\n departureDate: parseddeparture,\n adults,\n children,\n infants,\n promocode\n });\n window.open(url, \"_blank\");\n }\n });\n }\n });\n $(document).ready(function () {\n (function ($) {\n $.fn.simpleFilter = function (options) {\n const settings = $.extend({\n itemSelector: \".filtr-item\",\n controlSelector: \".filter-btn\",\n activeClass: \"active\",\n animationSpeed: 300,\n defaultFilterClass: \".filter-btn.active\",\n countSelector: null // ð New: optional element to show count\n }, options);\n const $container = this;\n const $items = $container.find(settings.itemSelector);\n const $controls = $(settings.controlSelector);\n function applyFilter(filter) {\n $(`.accommodation-listing #loader`).css(\"display\", \"flex\");\n let visibleCount = 0;\n $items.each(function () {\n const $item = $(this);\n const matches = filter === \"all\" || $item.is(`[data-category*=\"${filter}\"]`);\n if (matches) {\n visibleCount++;\n $item.stop(true).fadeIn(settings.animationSpeed);\n setTimeout(() =>
16 {\n $(`.accommodation-listing #loader`).css(\"display\", \"none\");\n }, 1500);\n } else {\n $item.stop(true).fadeOut(settings.animationSpeed);\n setTimeout(() => {\n $(`.accommodation-listing #loader`).css(\"display\", \"none\");\n }, 1500);\n }\n });\n\n // ð Update count in target element if provided\n if (settings.countSelector) {\n $(settings.countSelector).text(visibleCount);\n }\n return visibleCount;\n }\n $controls.on(\"click\", function (e) {\n e.preventDefault();\n const $this = $(this);\n const filter = $this.data(\"filter\");\n $controls.removeClass(settings.activeClass);\n $this.addClass(settings.activeClass);\n applyFilter(filter);\n });\n\n // Apply default filter on load\n const $default = $(settings.defaultFilterClass).first();\n if ($default.length) {\n const defaultFilter = $default.data(\"filter\");\n applyFilter(defaultFilter);\n }\n return this;\n };\n })(jQuery);\n if ($(\".accommodation-listing\").length > 0) {\n $(\".grid\").simpleFilter({\n itemSelector: \".element-item\",\n controlSelector: \".tab-button\",\n defaultFilterClass: \".tab-button.active\",\n animationSpeed: 400,\n countSelector: \"#itemCount\"\n });\n function toggleFilters() {\n const tabButtons = document.querySelector(\".tab-buttons-sm\");\n if (tabButtons.classList.contains(\"tab-show\")) {\n tabButtons.classList.remove(\"tab-show\");\n setTimeout(() => {\n tabButtons.style.display = \"none\";\n }, 300);\n } else {\n tabButtons.style.display = \"grid\";\n setTimeout(() => {\n tabButtons.classList.add(\"tab-show\");\n }, 10);\n }\n }\n window.toggleFilters = toggleFilters;\n }\n });\n $(document).ready(function () {\n const toggles = document.querySelectorAll(\".toggle-extra\");\n console.log(toggles);\n toggles.forEach(toggle => {\n toggle.addEventListener(\"click\", () => {\n const allDescriptions = document.querySelectorAll(\".extra-description\");\n const allToggles = document.querySelectorAll(\".toggle-extra\");\n const description = toggle.nextElementSibling;\n const isAlreadyOpen = description && description.style.display === \"block\";\n\n // Close all\n allDescriptions.forEach(desc => {\n desc.style.display = \"none\";\n });\n allToggles.forEach(tog => {\n tog.classList.remove(\"active\");\n });\n\n // Open the clicked one if it wasn't already open\n if (!isAlreadyOpen && description && description.classList.contains(\"extra-description\")) {\n description.style.display = \"block\";\n toggle.classList.add(\"active\");\n }\n });\n });\n });\n $(document).on('click', '.accommodation-page .gallery-nav-left', function (e) {\n $(this).closest('.owl-carousel').trigger('prev.owl.carousel');\n });\n $(document).on('click', '.accommodation-page .gallery-nav-right', function (e) {\n $(this).closest('.owl-carousel').trigger('next.owl.carousel');\n });\n}\n\n// Export the function\n/* harmony default export */ const module_accommodation = (accommodation);\n;// ./frontend/src/scripts/module/navigation.js\n// Navigation Menu Handler\n\nfunction mainNavigation() {\n $(\"#cssmenu\").menumaker({\n title: \"\",\n format: \"multitoggle\"\n });\n}\nfunction mainNavigationmobile() {\n $(\"#cssmenumobile\").menumakermobile({\n title: \"\",\n format: \"multitoggle\"\n });\n}\nfunction closeJqueryMenu($menu) {\n if (!$menu || !$menu.length) return;\n\n // Remove active states\n $menu.find('li.has-sub.active').removeClass('active');\n\n // Close main menu\n $menu.find('ul.open').removeClass('open').hide();\n\n // Reset menu button\n $menu.find('#menu-button').removeClass('menu-opened');\n\n // Global html class\n $('html').removeClass('reveal-out');\n}\n\n// jQuery menumaker plugin\n(function ($) {\n $.fn.menumaker = function (options) {\n var cssmenu = $(this),\n settings = $.extend({\n title: \"Menu\",\n format: \"dropdown\",\n breakpoint: 1086,\n sticky: fal
16se\n }, options);\n return this.each(function () {\n cssmenu.find('.main-menu > li:has(ul)').addClass('has-sub');\n if (settings.format != 'select') {\n cssmenu.prepend('<div id=\"menu-button\">' + settings.title + '</div>');\n $(this).find(\"#menu-button\").on('click', function () {\n $(\"html\").toggleClass('reveal-out');\n $(this).toggleClass('menu-opened');\n var mainmenu = $(this).next('ul');\n if (mainmenu.hasClass('open')) {\n mainmenu.hide().removeClass('open');\n } else {\n mainmenu.show().addClass('open');\n if (settings.format === \"dropdown\") {\n mainmenu.find('ul').show();\n }\n }\n });\n var multiTg = function () {\n cssmenu.find(\".has-sub\").prepend('<span class=\"submenu-button\"></span>');\n $('#cssmenu .main-menu > li').click(function () {\n $(this).toggleClass('active');\n $('#cssmenu .level-2 > li').removeClass('active');\n $('#cssmenu .main-menu > li').not(this).removeClass('active');\n });\n $('#cssmenu .level-2 > li').click(function (event) {\n $(this).toggleClass('active');\n $('#cssmenu .level-2 > li').not(this).removeClass('active');\n event.stopPropagation();\n });\n };\n if (settings.format === 'multitoggle') multiTg();else cssmenu.addClass('dropdown');\n // Close menu on outside click (DESKTOP)\n $(document).on('click.menumaker', function (e) {\n if (!$(e.target).closest('#cssmenu').length) {\n closeJqueryMenu($('#cssmenu'));\n }\n });\n }\n if (settings.sticky === true) cssmenu.css('position', 'fixed');\n var resizeFix = function () {\n if ($(window).width() > settings.breakpoint) {\n cssmenu.removeClass('small-screen');\n if (settings.format === 'select') {\n cssmenu.find('select').hide();\n } else {\n cssmenu.find(\"#menu-button\").removeClass(\"menu-opened\");\n }\n }\n if ($(window).width() <= settings.breakpoint && !cssmenu.hasClass(\"small-screen\")) {\n cssmenu.addClass('small-screen');\n if (settings.format === 'select') {\n cssmenu.find('select').show();\n }\n }\n };\n resizeFix();\n return $(window).on('resize', resizeFix);\n });\n };\n})(jQuery);\n\n// jQuery menumakermobile plugin\n(function ($) {\n $.fn.menumakermobile = function (options) {\n var cssmenu = $(this),\n settings = $.extend({\n title: \"Menu\",\n format: \"dropdown\",\n breakpoint: 1086,\n sticky: false\n }, options);\n return this.each(function () {\n cssmenu.find('.main-menu > li:has(ul)').addClass('has-sub');\n if (settings.format != 'select') {\n cssmenu.prepend('<div id=\"menu-button\">' + settings.title + '</div>');\n $(this).find(\"#menu-button\").on('click', function () {\n $(\"html\").toggleClass('reveal-out');\n $(this).toggleClass('menu-opened');\n var mainmenu = $(this).next('ul');\n if (mainmenu.hasClass('open')) {\n mainmenu.hide().removeClass('open');\n } else {\n mainmenu.show().addClass('open');\n if (settings.format === \"dropdown\") {\n mainmenu.find('ul').show();\n }\n }\n });\n var multiTg = function () {\n cssmenu.find(\".has-sub\").prepend('<span class=\"submenu-button\"></span>');\n $('#cssmenumobile .main-menu > li').click(function () {\n $(this).toggleClass('active');\n $('#cssmenumobile .level-2 > li').removeClass('active');\n $('#cssmenumobile .main-menu > li').not(this).removeClass('active');\n });\n $('#cssmenumobile .level-2 > li').click(function (event) {\n $(this).toggleClass('active');\n $('#cssmenumobile .level-2 > li').not(this).removeClass('active');\n event.stopPropagation();\n });\n };\n if (settings.format === 'multitoggle') multiTg();else cssmenu.addClass('dropdown');\n }\n if (settings.sticky === true) cssmenu.css('position', 'fixed');\n var resizeFix = function () {\n if ($(window).width() > settings.breakpoint) {\n cssmenu.removeClass('small-screen');\n if (settings.format === 'select') {\n cssmenu.find('select').hide();\n } else {\n cssmenu.find(\"#menu-button\").removeClass(\"menu-opened\");\n }\n }\n if ($(window).width() <= settings.breakpoint && !cssmenu.hasClass(\"small-screen\")) {\n cssmenu.addClass('small-screen');\n if (settings.format === 'select') {\n cssmenu.find('select').show();\n }\n }\n };\n resizeFix();\n return $(window).on('resize', resizeFix);\n });
16\n // Close menu on outside click (MOBILE)\n $(document).on('click.menumakermobile', function (e) {\n if (!$(e.target).closest('#cssmenumobile').length) {\n closeJqueryMenu($('#cssmenumobile'));\n }\n });\n };\n})(jQuery);\n;// ./frontend/src/scripts/module/languageDropdown.js\nfunction hideLanguageDropdowns() {\n $('.lang-selector').removeClass('open');\n $('.mobile-lang-container, .desktop-lang-container').addClass('hide');\n $('.lang-overlay').removeClass('on');\n $('.overlay').removeClass('on navlink');\n}\ndocument.addEventListener('click', function (e) {\n const trigger = e.target.closest('.header-lang-selector.lang-selector[role=\"button\"]');\n const isMobileTrigger = trigger?.closest('.header-mobile-right-container');\n const isDesktopTrigger = trigger?.closest('.header-top-right-container');\n if (trigger) {\n e.preventDefault();\n e.stopPropagation();\n const wasOpen = trigger.classList.contains('open');\n\n // Always close everything first\n hideLanguageDropdowns();\n\n // If it WAS NOT open, open it\n if (!wasOpen) {\n trigger.classList.add('open');\n if (isMobileTrigger) {\n document.querySelector('.mobile-lang-container')?.classList.remove('hide');\n }\n if (isDesktopTrigger) {\n document.querySelector('.desktop-lang-container')?.classList.remove('hide');\n }\n document.querySelector('.overlay')?.classList.add('on', 'navlink');\n }\n return;\n }\n\n // Click outside â close\n hideLanguageDropdowns();\n});\ndocument.querySelectorAll('.mobile-lang-container a, .desktop-lang-container a').forEach(link => {\n link.addEventListener('click', hideLanguageDropdowns);\n});\ndocument.querySelectorAll('.mobile-lang-container .lang a, .desktop-lang-container .lang a').forEach(link => {\n link.addEventListener('mouseenter', function () {\n this.closest('.lang')?.classList.add('hover');\n });\n link.addEventListener('mouseleave', function () {\n this.closest('.lang')?.classList.remove('hover');\n });\n});\n// EXTERNAL MODULE: ./node_modules/owl.carousel/dist/owl.carousel.js\nvar owl_carousel = __webpack_require__(764);\n;// ./frontend/src/scripts/module/gallery-sync.js\n\nvar syncing = false;\n\n/** Runs `fn` with the sync lock held; nested sync attempts are ignored. */\nfunction runSynced(fn) {\n if (syncing) {\n return;\n }\n syncing = true;\n try {\n fn();\n } finally {\n // Released after 400 ms â Owl fires onChange/onChanged asynchronously after\n // the 300 ms animation, so a 0-tick release lets echo events through.\n setTimeout(function () {\n syncing = false;\n }, 400);\n }\n}\nfunction isSyncing() {\n return syncing;\n}\nfunction slideIndex(e) {\n if (e && e.currentTarget && e.item && typeof e.item.index === \"number\") {\n var $item = external_jQuery_default()(e.currentTarget).find(\".owl-item\").eq(e.item.index).find(\"[data-item], [data-slide]\");\n if ($item.length) {\n var val = $item.attr(\"data-item\") !== undefined ? $item.attr(\"data-item\") : $item.attr(\"data-slide\");\n var parsed = parseInt(val, 10);\n if (!isNaN(parsed)) {\n return parsed;\n }\n }\n }\n if (e && e.currentTarget) {\n var $center = external_jQuery_default()(e.currentTarget).find(\".owl-item.center, .owl-item.active.center\").find(\"[data-item], [data-slide]\");\n if ($center.length) {\n var val = $center.attr(\"data-item\") !== undefined ? $center.attr(\"data-item\") : $center.attr(\"data-slide\");\n var parsed = parseInt(val, 10);\n if (!isNaN(parsed)) {\n return parsed;\n }\n }\n }\n var owl = e && e.relatedTarget;\n if (owl && typeof owl.relative === \"function\") {\n var index = owl.relative(e.item ? e.item.index : owl.current());\n if (typeof index === \"number\" && !isNaN(index)) {\n return index;\n }\n }\n return 0;\n}\nfunction slideCount(e) {\n return e && e.item ? e.item.count : 0;\n}\nfunction pad(value) {\n return value < 10 ? \"0\" + value : String(value);\n}\n\n/** The section a carousel lives in, used to scope every lookup. */\nfunction sectionOf(el) {\n var $section = external_jQuery_default()(el).closest(\"section\");\n return $section.length ? $section : external_jQuery_default()(el).parent();\n}\n\n/** Updates the \"01 / 09\" counter of the mobile navigation. */\nfunction updateCounter($section, index, count) {\n $section.find(\".mobile.gallery-navigation .gallery-navigation-pagenr\").html(pad(index + 1));\n if (count) {\n $section.find(\".mobile.gallery-navigation .gallery-navigation-total-pages\").html(pad(count));\n }\n}\nfunction syncSubnav($section, index) {\n var $subnav = $section.find(\".subnav-gallery-carousel.owl-carousel\");\n $section.find(\".gallery-subnav-item\").removeClass(\"actual\");
16\n $section.find('.gallery-subnav-item[data-slide=\"' + index + '\"]').addClass(\"actual\");\n if ($subnav.length && $subnav.data(\"owl.carousel\")) {\n $subnav.trigger(\"to.owl.carousel\", [index, 300]);\n }\n}\n\n/** Moves a carousel to `index` without letting the move echo back. */\nfunction goToSlide($carousel, index) {\n if (!$carousel.length || !$carousel.data(\"owl.carousel\")) {\n return;\n }\n $carousel.trigger(\"to.owl.carousel\", [index, 300]);\n}\n;// ./frontend/src/scripts/module/gallery-center.js\n\n\n\nfunction galleryCenterOwlCarousel() {\n external_jQuery_default()(\".gallery-center-owl-carousel\").each(function () {\n var $carousel = external_jQuery_default()(this);\n var $section = sectionOf($carousel);\n $carousel.owlCarousel({\n items: 3,\n center: true,\n loop: true,\n margin: 20,\n nav: false,\n dots: true,\n dotsEach: true,\n navText: ['←', '→'],\n autoHeight: false,\n responsive: {\n 0: {\n stagePadding: 0,\n margin: 20,\n dots: true,\n dotsEach: true\n },\n 991: {\n stagePadding: 0,\n margin: 19,\n dots: true,\n dotsEach: true\n }\n },\n onChange: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (isSyncing()) return;\n var idx = slideIndex(e);\n var count = slideCount(e) || $carousel.find('.owl-item:not(.cloned)').length;\n updateCounter($section, idx, count);\n },\n onChanged: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (isSyncing()) return;\n setTimeout(function () {\n var idx = slideIndex(e);\n var count = slideCount(e) || $carousel.find('.owl-item:not(.cloned)').length;\n updateCounter($section, idx, count);\n }, 33);\n }\n });\n });\n}\nexternal_jQuery_default()(document).on('click', '.gallery-center-carousel .gallery-mobile-nav-left', function (e) {\n e.preventDefault();\n e.stopPropagation();\n external_jQuery_default()(this).closest('.gallery-center-carousel').find('.gallery-center-owl-carousel.owl-carousel').trigger('prev.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-center-carousel .gallery-mobile-nav-right', function (e) {\n e.preventDefault();\n e.stopPropagation();\n external_jQuery_default()(this).closest('.gallery-center-carousel').find('.gallery-center-owl-carousel.owl-carousel').trigger('next.owl.carousel');\n});\nexternal_jQuery_default()(\".subnav-gallery-carousel.owl-carousel\").owlCarousel({\n center: true,\n loop: true,\n nav: false,\n autoHeight: false,\n responsive: {\n 0: {\n margin: 40,\n items: 1\n },\n 220: {\n margin: 40,\n items: 2\n },\n 320: {\n margin: 40,\n items: 3\n },\n 420: {\n margin: 40,\n items: 4\n },\n 520: {\n margin: 40,\n items: 5\n },\n 620: {\n margin: 40,\n items: 6\n },\n 769: {\n items: 4,\n margin: 0\n },\n 900: {\n items: 5,\n margin: 0\n },\n 1100: {\n items: 8,\n margin: -10\n }\n },\n onChange: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n var count = e.item.count;\n if (count > 6) {\n count = 6;\n }\n external_jQuery_default()(e.currentTarget).addClass('nr-of-items-' + count);\n external_jQuery_default()(e.currentTarget).find('.owl-stage-outer').addClass('nr-of-items-' + count);\n },\n onChanged: function (e) {}\n});\nexternal_jQuery_default()(document).on('click', '.gallery-subnav-slide-link', function (e) {\n e.preventDefault();\n var slide = external_jQuery_default()(this).parent().parent().attr('data-slide');\n external_jQuery_default()(this).parent().parent().parent().parent().find('.gallery-subnav-item').removeClass('actual');\n external_jQuery_default()(this).parent().parent().addClass('actual');\n var carousel = external_jQuery_default()(this).parent().parent().parent().parent().parent().parent().parent().find('.gallery.owl-carousel');\n var subcarousel = external_jQuery_default()(this).parent().parent().parent().parent().parent().parent().parent().find('.subnav-gallery-carousel.owl-carousel');\n if (external_jQuery_default()(window).width() < 769) {\n carousel = external_jQuery_default()(this).parent().parent().parent().parent().parent().parent().parent().find('.mobile-gallery.owl-carousel');\n }\n subcarousel.trigger('to.owl.carousel', slide);\n carousel.trigger('to.owl.carousel', slide);\n setTimeout(function () {\n external_jQuery_default()('.gallery-subnav-item.actual').each(function () {\n external_jQuery_default()(this).parent().addClass('active');\n });\n }, 50);\n setTimeout(function () {\n external_jQuery_default()('.gallery-subnav-item.actual').each(function () {\n external_jQuery_default()(this).parent().addClass('active');\n });\n }, 100);\n setTimeout(function () {\n external_jQuery_default()('.gallery-subnav-item.actual').each(function () {\n external_jQuery_default()(this).parent().addClass('active');\n });\n }, 250);\n});\nfunction galleryHeadingOwlCarousel() {\n external_jQuery_default()(\".subnav-gallery-carousel\").owlCarousel({\n items: 3,\n center: true,\n loop: true,\n margin: 20,\n nav: false,\n dots: false,\n navText: ['←', '→'],\n autoHeight: false,\n responsive: {\n 0: {\n stagePadding: 0,\n margin: 20,\n dots: true\n },\n 991: {\n stagePadding: 0,\n margin: 20,\n dots: true\n }\n },\n onInitialized: function (e) {\n if (external_jQuery_default()(window).width() <= 991) {\n updateDotsAriaLabels(external_jQuery_default()(e.currentTarget));\n }\n },\n onChange: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (isSyncing()) return;\n if (e.item) {\n var index = e.item.index + 1;\n var storeIndex = e.item.index + 1;\n var count = e.item.count;\n if (index > count) {\n index -= count;\n }\n if (index <= 0) {\n index += count;\n }\n }\n if (index < 10) {\n index = \"0\" + index;\n }\n if (count < 10) {\n count = \"0\" + count;\n }\n external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-pagenr').html(index);\n external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-total-pages').html(count);\n setTimeout(function () {\n var currPage = parseInt(external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-pagenr').text());\n external_jQuery_default()(e.currentTarget).parent().find('.subnav-gallery-carousel .owl-item').each(function () {\n if (!external_jQuery_default()(this).hasClass('cloned')) {\n if (parseInt(external_jQuery_default()(this).find('.gallery-subnav-item').attr('data-sli
16de')) == parseInt(currPage) - 1) {\n external_jQuery_default()(this).addClass('active').addClass('center');\n }\n }\n });\n }, 44);\n }\n });\n}\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-1 .gallery-mobile-nav-left', function (e) {\n external_jQuery_default()(this).closest('.gallery-image-var-1').find('.subnav-gallery-carousel.owl-carousel').trigger('prev.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-1 .gallery-mobile-nav-right', function (e) {\n external_jQuery_default()(this).closest('.gallery-image-var-1').find('.subnav-gallery-carousel.owl-carousel').trigger('next.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-2 .gallery-mobile-nav-left', function (e) {\n external_jQuery_default()(this).closest('.gallery-image-var-2').find('.subnav-gallery-carousel.owl-carousel').trigger('prev.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-2 .gallery-mobile-nav-right', function (e) {\n external_jQuery_default()(this).closest('.gallery-image-var-2').find('.subnav-gallery-carousel.owl-carousel').trigger('next.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-1 .gallery-nav-left, .gallery-image-var-2 .gallery-nav-left', function (e) {\n external_jQuery_default()(this).closest('.owl-carousel').trigger('prev.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-image-var-1 .gallery-nav-right, .gallery-image-var-2 .gallery-nav-right', function (e) {\n external_jQuery_default()(this).closest('.owl-carousel').trigger('next.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-mobile-nav-left', function () {\n sectionOf(this).find('.mobile-gallery.owl-carousel').trigger('prev.owl.carousel');\n});\nexternal_jQuery_default()(document).on('click', '.gallery-mobile-nav-right', function () {\n sectionOf(this).find('.mobile-gallery.owl-carousel').trigger('next.owl.carousel');\n});\n;// ./frontend/src/scripts/module/gallery.js\n\n\nfunction gallery() {\n var screenWidth = parseInt(external_jQuery_default()(window).width());\n var itemWidth = parseInt(865);\n var sPadding = parseInt((screenWidth - itemWidth - 0) / 2);\n setTimeout(() => {\n external_jQuery_default()(\".gallery.owl-carousel\").owlCarousel({\n items: 1,\n center: true,\n loop: true,\n nav: false,\n responsive: {\n 0: {\n stagePadding: 0,\n margin: 20\n },\n 768: {\n stagePadding: 0,\n margin: 20\n },\n 769: {\n stagePadding: 120,\n margin: 40\n },\n 1030: {\n stagePadding: 136,\n margin: 40\n },\n 1050: {\n stagePadding: 146,\n margin: 40\n },\n 1070: {\n stagePadding: 156,\n margin: 40\n },\n 1090: {\n stagePadding: 166,\n margin: 40\n },\n 1110: {\n stagePadding: 176,\n margin: 40\n },\n 1130: {\n stagePadding: 186,\n margin: 40\n },\n 1150: {\n stagePadding: 196,\n margin: 40\n },\n 1170: {\n stagePadding: 206,\n margin: 40\n },\n 1190: {\n stagePadding: 216,\n margin: 40\n },\n 1210: {\n stagePadding: 226,\n margin: 40\n },\n 1230: {\n stagePadding: 236,\n margin: 40\n },\n 1250: {\n stagePadding: 246,\n margin: 40\n },\n 1270: {\n stagePadding: 256,\n margin: 40\n },\n 1290: {\n stagePadding: 266,\n margin: 40\n },\n 1310: {\n stagePadding: 276,\n margin: 40\n },\n 1330: {\n stagePadding: 286,\n margin: 40\n },\n 1350: {\n stagePadding: 296,\n margin: 40\n },\n 1370: {\n stagePadding: 306,\n margin: 40\n },\n 1390: {\n stagePadding: 316,\n margin: 40\n },\n 1410: {\n stagePadding: 326,\n margin: 40\n },\n 1430: {\n stagePadding: 336,\n margin: 40\n },\n 1450: {\n stagePadding: 346,\n margin: 40\n },\n 1470: {\n stagePadding: 356,\n margin: 40\n },\n 1490: {\n stagePadding: 366,\n margin: 40\n },\n 1510: {\n stagePadding: 376,\n margin: 40\n },\n 1530: {\n stagePadding: 386,\n margin: 40\n },\n 1550: {\n stagePadding: 396,\n margin: 40\n },\n 1570: {\n stagePadding: 406,\n margin: 40\n },\n 1590: {\n stagePadding: 416,\n margin: 40\n },\n 1610: {\n stagePadding: 426,\n margin: 40\n },\n 1630: {\n stagePadding: 436,\n margin: 40\n },\n 1650: {\n stagePadding: 446,\n margin: 40\n },\n 1670: {\n stagePadding: 456,\n margin: 40\n },\n 1690: {\n stagePadding: 466,\n margin: 40\n },\n 1710: {\n stagePadding: 476,\n margin: 40\n },\n 1730: {\n stagePadding: 486,\n margin: 40\n },\n 1750: {\n stagePadding: 496,\n margin: 40\n },\n 1770: {\n stagePadding: 506,\n margin: 40\n },\n 1790: {\n stagePadding: 516,\n margin: 40\n },\n 1810: {\n stagePadding: 526,\n margin: 40\n },\n 1830: {\n stagePadding: 536,\n margin: 40\n },\n 1850: {\n stagePadding: 546,\n margin: 40\n },\n 1870: {\n stagePadding: 556,\n margin: 40\n },\n 1890: {\n stagePadding: 566,\n margin: 40\n },\n 1910: {\n stagePadding: 576,\n margin: 40\n },\n 1930: {\n stagePadding: 586,\n margin: 40\n },\n 1950: {\n stagePadding: 596,\n margin: 40\n },\n 1970: {\n stagePadding: 606,\n margin: 40\n },\n 1990: {\n stagePadding: 616,\n margin: 40\n },\n 2010: {\n stagePadding: 626,\n margin: 40\n },\n 2030: {\n stagePadding: 636,\n margin: 40\n },\n 2050: {\n stagePadding: 646,\n margin: 40\n },\n 2070: {\n stagePadding: 656,\n margin: 40\n },\n 2090: {\n stagePadding: 666,\n margin: 40\n },\n 2110: {\n stagePadding: 676,\n margin: 40\n },\n 2130: {\n stagePadding: 686,\n margin: 40\n },\n 2150: {\n stagePadding: 696,\n margin: 40\n },\n 2170: {\n stagePadding: 706,\n margin: 40\n },\n 2190: {\n stagePadding: 716,\n margin: 40\n },\n 2210: {\n stagePadding: 726,\n margin: 40\n },\n 2230: {\n stagePadding: 736,\n margin: 40\n },\n 2250: {\n stagePadding: 746,\n margin: 40\n },\n 2270: {\n stagePadding: 756,\n margin: 40\n },\n 2290: {\n stagePadding: 766,\n margin: 40\n },\n 2310: {\n stagePadding: 776,\n margin: 40\n },\n 2330: {\n stagePadding: 786,\n margin: 40\n },\n 2350: {\n stagePadding: 796,\n margin: 40\n },\n 2370: {\n stagePadding: 806,\n margin: 40\n },\n 2390: {\n stagePadding: 816,\n margin: 40\n },\n 2410: {\n stagePadding: 826,\n margin: 40\n },\n 2430: {\n stagePadding: 836,\n margin: 40\n },\n 2450: {\n stagePadding: 846,\n margin: 40\n },\n 2470: {\n stagePadding: 856,\n margin: 40\n },\n 2490: {\n stagePadding: 866,\n margin: 40\n },\n 2510: {\n stagePadding: 876,\n margin: 40\n },\n 2530: {\n stagePadding: 886,\n margin: 40\n },\n 2550: {\n stagePadding: 896,\n margin: 40\n },\n 2570: {\n stagePadding: 906,\n margin: 40\n },\n 2590: {\n stagePadding: 916,\n margin: 40\n },\n 2610: {\n stagePadding: 926,\n margin: 40\n },\n 2630: {\n stagePadding: 936,\n margin: 40\n },\n 2650: {\n stagePadding: 946,\n margin: 40\n },\n 2670: {\n stagePadding: 956,\n margin: 40\n },\n 2690: {\n stagePadding: 966,\n margin: 40\n },\n 2710: {\n stagePadding: 976,\n margin: 40\n },\n 2730: {\n stagePadding: 986,\n margin: 40\n },\n 2750: {\n stagePadding: 996,\n margin: 40\n },\n 2770: {\n stagePadding: 1006,\n margin: 40\n },\n 2790: {\n stagePadding: 1016,\n margin: 40\n },\n 2810: {\n stagePadding: 1026,\n margin: 40\n },\n 2830: {\n stagePadding: 1036,\n margin: 40\n },\n 2850: {\n stagePadding: 1046,\n margin: 40\n },\n 2870: {\n stagePadding: 1056,\n margin: 40\n },\n 2890: {\n stagePadding: 1066,\n margin: 40\n },\n 2910: {\n stagePadding: 1076,\n margin: 40\n },\n 2930: {\n stagePadding: 1086,\n margin: 40\n },\n 2950: {\n stagePadding: 1096,\n margin: 40\n },\n 2970: {\n stagePadding: 1106,\n margin: 40\n },\n 2990: {\n stagePadding: 1116,\n margin: 40\n },\n 3010: {\n stagePadding: 1126,\n margin: 40\n },\n 3030: {\n stagePadding: 1136,\n margin: 40\n },\n 3050: {\n stagePadding: 1146,\n margin: 40\n },\n 3070: {\n stagePadding: 1156,\n margin: 40\n },\n 3090: {\n stagePadding: 1166,\n margin: 40\n },\n 3110: {\n stagePadding: 1176,\n margin: 40\n },\n 3130: {\n stagePadding: 1186,\n margin: 40\n },\n 3150: {\n stagePadding: 1196,\n margin: 40\n },\n 3170: {\n stagePadding: 1206,\n margin: 40\n },\n 3190: {\n stagePadding: 1216,\n margin: 40\n },\n 3210: {\n stagePadding: 1226,\n margin: 40\n },\n 3230: {\n stagePadding: 1236,\n margin: 40\n },\n 3250: {\n stagePadding: 1246,\n margin: 40\n },\n 3270: {\n stagePadding: 1256,\n margin: 40\n },\n 3290: {\n stagePadding: 1266,\n margin: 40\n },\n 3310: {\n stagePadding: 1276,\n margin: 40\n },\n 3330: {\n stagePadding: 1286,\n margin: 40\n },\n 3350: {\n stagePadding: 1296,\n margin: 40\n },\n 3370: {\n stagePadding: 1306,\n margin: 40\n },\n 3390: {\n stagePadding: 1316,\n margin: 40\n },\n 3410: {\n stagePadding: 1326,\n margin: 40\n },\n 3430: {\n stagePadding: 1336,\n margin: 40\n },\n 3450: {\n stagePadding: 1346,\n margin: 40\n },\n 3470: {\n stagePadding: 1356,\n margin: 40\n },\n 3490: {\n stagePadding: 1366,\n margin: 40\n }\n },\n onChange: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (e.item) {\n var index = e.item.index - 1;\n var storeIndex = e.item.index - 1;\n var count = e.item.count;\n if (index > count) {\n index -= count;\n }\n if (index <= 0) {\n index += count;\n }\n }\n if (index < 10) {\n index = \"0\" + index;\n }\n if (count < 10) {\n count = \"0\" + count;\n }\n var gall = external_jQuery_default()(e.currentTarget);\n gall.parent().find(\".mobile.gallery-navigation .gallery-navigation-pagenr\").html(index);\n gall.parent().find(\".mobile.gallery-navigation .gallery-navigation-total-pages\").html(count);\n gall.parent().find(\".gallery-subnav-item\").removeClass(\"actual\");
16\n gall.parent().find('.gallery-subnav-item[data-slide=\"0\"]').addClass(\"actual\");\n resizeHomepageGallOverlay();\n },\n onChanged: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (isSyncing()) return;\n var $parent = external_jQuery_default()(e.currentTarget).parent();\n resizeHomepageGallOverlay();\n\n // Clear all subnav offset classes\n var $subnavStage = $parent.find('.subnav-gallery-carousel .owl-stage');\n var i = 0;\n while (i < 20) {\n $subnavStage.removeClass('offset-' + i);\n i++;\n }\n setTimeout(function () {\n // Read actual current slide from DOM (most reliable with loop clones)\n var index = parseInt(external_jQuery_default()(e.currentTarget).find('.owl-item.active.center').find('.item-container').attr('data-item')) + 1;\n\n // Scroll subnav strip via CSS only â no carousel trigger, no cascade\n $subnavStage.addClass('offset-' + index);\n\n // Update page counter\n var displayIndex = index < 10 ? '0' + index : String(index);\n $parent.find('.mobile.gallery-navigation .gallery-navigation-pagenr').html(displayIndex);\n\n // Highlight active subnav thumbnail\n $parent.find('.gallery-subnav-item').removeClass('actual');\n $parent.find('.gallery-subnav-item[data-slide=\"' + (index - 1) + '\"]').addClass('actual');\n }, 33);\n setTimeout(function () {\n galleryActive();\n }, 50);\n }\n });\n }, 1000);\n function galleryActive() {\n external_jQuery_default()(\"section.gallery .owl-stage\").each(function () {\n if (!external_jQuery_default()(this).hasClass(\"subnav-gallery-carousel\")) {\n external_jQuery_default()(this).find(\".owl-item\").each(function () {\n if (external_jQuery_default()(this).hasClass(\"center\")) {\n external_jQuery_default()(this).addClass(\"active\");\n } else {\n external_jQuery_default()(this).removeClass(\"active\");\n }\n });\n }\n });\n external_jQuery_default()(\".gallery-content.gallery-image-mobile\").each(function () {\n var height = external_jQuery_default()(this).parent().find(\".gallery-overlay-text\").height();\n var containerHeight = external_jQuery_default()(this).parent().height();\n if (height > 0) {\n external_jQuery_default()(this).parent().find(\".gallery-image-mobile\").css(\"height\", \"calc(\" + containerHeight + \"px - \" + height + \"px)\");\n }\n });\n }\n function resizeHomepageGallOverlay() {\n external_jQuery_default()(\".gallery.homepage\").find(\".gallery-overlay-text h3\").each(function () {\n var str = external_jQuery_default()(this).text().trim();\n var arr = str.split(\" \");\n var maxLength = 0;\n var arrayLength = arr.length;\n for (var i = 0; i < arrayLength; i++) {\n if (maxLength < arr[i].length) {\n maxLength = arr[i].length;\n }\n }\n var width = maxLength * 34;\n external_jQuery_default()(this).parent().css(\"width\", width + \"px\");\n external_jQuery_default()(this).parent().parent().find(\".gallery-overlay\").css(\"width\", width + 0 + \"px\");\n });\n }\n // The `.subnav-gallery-carousel` thumbnail strip is initialised once in\n // gallery-center.js (`galleryHeadingOwlCarousel`).\n\n external_jQuery_default()(\".mobile-gallery.owl-carousel\").owlCarousel({\n items: 1,\n center: true,\n loop: true,\n nav: false,\n autoHeight: false,\n responsive: {\n 0: {\n stagePadding: 30,\n margin: 20\n },\n 768: {\n stagePadding: 35,\n margin: 20\n }\n },\n onChange: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (e.item) {\n var index = e.item.index + 1;\n var storeIndex = e.item.index + 1;\n var count = e.item.count;\n if (index > count) {\n index -= count;\n }\n if (index <= 0) {\n index += count;\n }\n }\n if (index < 10) {\n index = \"0\" + index;\n }\n if (count < 10) {\n count = \"0\" + count;\n }\n external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-pagenr').html(index);\n external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-total-pages').html(count);\n setTimeout(function () {\n var currPage = parseInt(external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-pagenr').text());\n external_jQuery_default()(e.currentTarget).parent().find('.subnav-gallery-carousel .owl-item').each(function () {\n if (!external_jQuery_default()(this).hasClass('cloned')) {\n if (parseInt(external_jQuery_default()(this).find('.gallery-subnav-item').attr('data-sli
16de')) == parseInt(currPage) - 1) {\n external_jQuery_default()(this).addClass('active').addClass('center');\n }\n }\n });\n }, 44);\n },\n onChanged: function (e) {\n if (e.property && e.property.name !== \"position\") return;\n if (isSyncing()) return;\n var i = 0;\n while (i < 20) {\n external_jQuery_default()(e.currentTarget).parent().find('.subnav-gallery-carousel .owl-stage').removeClass('offset-' + i);\n i++;\n }\n setTimeout(function () {\n var index = parseInt(external_jQuery_default()(e.currentTarget).find('.owl-item.active.center').find('.item-container').attr('data-item')) + 1;\n external_jQuery_default()(e.currentTarget).parent().find('.subnav-gallery-carousel .owl-stage').addClass('offset-' + index);\n if (index < 10) {\n index = \"0\" + index;\n }\n external_jQuery_default()(e.currentTarget).parent().find('.mobile.gallery-navigation .gallery-navigation-pagenr').html(index);\n }, 33);\n external_jQuery_default()(e.currentTarget).parent().find('.gallery-subnav-item').removeClass('actual');\n external_jQuery_default()(e.currentTarget).parent().find('.gallery-subnav-item[data-slide=\"' + e.page.index + '\"]').addClass('actual');\n // Removed: .trigger('click') on subnav link - that was re-entering the carousel and creating an infinite loop\n }\n });\n // $(\".mobile-gallery.owl-carousel\").owlCarousel({\n // items: 1,\n // center: true,\n // loop: true,\n // nav: false,\n // autoHeight: false,\n // responsive: {\n // 0: {\n // stagePadding: 30,\n // margin: 20,\n // },\n // 768: {\n // stagePadding: 35,\n // margin: 20,\n // },\n // },\n // onChange: function (e) {\n // if (e.item) {\n // var index = e.item.index + 1;\n // var storeIndex = e.item.index + 1;\n // var count = e.item.count;\n // if (index > count) {\n // index -= count;\n // }\n // if (index <= 0) {\n // index += count;\n // }\n // }\n\n // if (index < 10) {\n // index = \"0\" + index;\n // }\n // if (count < 10) {\n // count = \"0\" + count;\n // }\n\n // $(e.currentTarget)\n // .parent()\n // .find(\".mobile.gallery-navigation .gallery-navigation-pagenr\")\n // .html(\"01\");\n // $(e.currentTarget)\n // .parent()\n // .find(\".mobile.gallery-navigation .gallery-navigation-total-pages\")\n // .html(count);\n\n // setTimeout(function () {\n // var currPage = parseInt(\n // $(e.currentTarget)\n // .parent()\n // .find(\".mobile.gallery-navigation .gallery-navigation-pagenr\")\n // .text()\n // );\n // $(e.currentTarget)\n // .parent()\n // .find(\".subnav-gallery-carousel .owl-item\")\n // .each(function () {\n // if (!$(this).hasClass(\"cloned\")) {\n // if (\n // parseInt(\n // $(this).find(\".gallery-subnav-item\").attr(\"data-slide\")\n // ) ==\n // parseInt(currPage) - 1\n // ) {\n // $(this).addClass(\"active\").addClass(\"center\");\n // }\n // }\n // });\n // }, 44);\n // },\n // onChanged: function (e) {\n // var i = 0;\n // while (i < 20) {\n // $(e.currentTarget)\n // .parent()\n // .find(\".subnav-gallery-carousel .owl-stage\")\n // .removeClass(\"offset-\" + i);\n // i++;\n // }\n\n // setTimeout(function () {\n // var index =\n // parseInt(\n // $(e.currentTarget)\n // .find(\".owl-item.active.center\")\n // .find(\".item-container\")\n // .attr(\"data-item\")\n // ) + 1;\n // $(e.currentTarget)\n // .parent()\n // .find(\".subnav-gallery-carousel .owl-stage\")\n // .addClass(\"offset-\" + index);\n // if (index < 10) {\n // index = \"0\" + index;\n // }\n // $(e.currentTarget)\n // .parent()\n // .find(\".mobile.gallery-navigation .gallery-navigation-pagenr\")\n // .html(index);\n // }, 33);\n\n // $(e.currentTarget)\n // .parent()\n // .find(\".gallery-subnav-item\")\n // .removeClass(\"actual\");\n // $(e.currentTarget)\n // .parent()\n // .find('.gallery-subnav-item[data-sli
16de=\"' + e.page.index + '\"]')\n // .addClass(\"actual\");\n // $(e.currentTarget)\n // .parent()\n // .find(\n // '.gallery-subnav-item[data-slide=\"' +\n // e.page.index +\n // '\"] .gallery-subnav-slide-link '\n // )\n // .trigger(\"click\");\n // },\n // });\n}\n;// ./frontend/src/scripts/module/sublistingSlider.js\n// three-column-tiles-with-carousel\n\n\n\n/* ================================\r\n SUBLISTING CAROUSEL\r\n================================ */\n\nfunction initSublistingSlider() {\n external_jQuery_default()(\".three-column-tiles-with-carousel\").each(function (index) {\n const $section = external_jQuery_default()(this);\n const $carousel = $section.find(\".owl-carousel.owl-theme\");\n const carouselId = `threeColumnTilesWithCarousel${index + 1}`;\n $carousel.attr(\"id\", carouselId);\n initCarouselWithFilter(`#${carouselId}`, $section);\n });\n\n // Re-init on resize (debounced)\n let resizeTimer;\n external_jQuery_default()(window).on(\"resize\", function () {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(function () {\n external_jQuery_default()(\".three-column-tiles-with-carousel\").each(function (index) {\n const $section = external_jQuery_default()(this);\n const $carousel = $section.find(\".owl-carousel.owl-theme\");\n destroyCarousel($carousel);\n initCarouselWithFilter(`#threeColumnTilesWithCarousel${index + 1}`, $section);\n });\n }, 250);\n });\n}\n\n/* ================================\r\n HELPERS\r\n================================ */\n\nfunction shouldLoop(itemCount) {\n const w = external_jQuery_default()(window).width();\n if (w >= 1200) return itemCount > 3;\n if (w >= 768) return itemCount > 2;\n return itemCount > 1;\n}\nfunction destroyCarousel($carousel) {\n if ($carousel.hasClass(\"owl-loaded\")) {\n $carousel.trigger(\"destroy.owl.carousel\");\n $carousel.removeClass(\"owl-loaded\");\n $carousel.find(\".owl-stage-outer\").children().unwrap();\n $carousel.removeAttr(\"style\");\n $carousel.find(\".owl-item\").removeAttr(\"style\").removeClass(\"owl-item\");\n }\n}\nfunction initCarousel($carousel, loop) {\n $carousel.owlCarousel({\n margin: 10,\n nav: true,\n dots: false,\n loop: loop,\n autoHeight: false,\n mouseDrag: false,\n navText: [\"❮\", \"❯\"],\n responsiveRefreshRate: 200,\n responsive: {\n 0: {\n items: 1\n },\n 768: {\n items: 2\n },\n 1200: {\n items: 3\n }\n }\n });\n}\n\n/* ================================\r\n FILTER + CAROUSEL LOGIC\r\n================================ */\n\nfunction initCarouselWithFilter(carouselSelector, $section) {\n const $carousel = $section.find(carouselSelector);\n\n // Clone original items once\n const $allItems = $section.find(\".all-items > .tile\").clone();\n\n // Initial load\n destroyCarousel($carousel);\n $carousel.html($allItems);\n initCarousel($carousel, shouldLoop($allItems.length));\n\n // Filter click\n $section.find(\".filter-btn\").off(\"click\").on(\"click\", function () {\n const $btn = external_jQuery_default()(this);\n $section.find(\".filter-btn\").removeClass(\"active\");\n $btn.addClass(\"active\");\n const filter = $btn.data(\"filter\");\n $section.find(\"#loader\").fadeIn(200);\n $carousel.fadeTo(200, 0, function () {\n destroyCarousel($carousel);\n $carousel.empty();\n let $filteredItems;\n if (filter === \"all\") {\n $filteredItems = $allItems;\n } else {\n $filteredItems = $allItems.filter(function () {\n const categories = (external_jQuery_default()(this).data(\"category\") || \"\").split(\" \");\n return categories.includes(filter);\n });\n }\n\n // Append & re-init\n $carousel.append($filteredItems);\n initCarousel($carousel, shouldLoop($filteredItems.length));\n $section.find(\"#loader\").fadeOut(200);\n $carousel.fadeTo(200, 1);\n });\n });\n}\n\n/* ================================\r\n VIDEO GALLERY (UNCHANGED)\r\n================================ */\n\nfunction initVideoGallery() {\n if (!external_jQuery_default()(\".video-gallery\").length) return;\n external_jQuery_default()(\".video-gallery .owl-carousel\").each(function (i) {\n external_jQuery_default()(this).attr(\"id\", `sync${i + 1}`);\n });\n function initVideoGalleryOwlCarousel(firstId, secondId) {\n const sync1 = external_jQuery_default()(firstId);\n const sync2 = external_jQuery_default()(secondId);\n const slidesPerPage = 4;\n sync1.on(\"initialized.owl.carousel\", function () {\n sync1.find(\".owl-video\").eq(0).find(\".owl-video-play-icon\").trigger(\"click\");\n }).owlCarousel({\n items: 1,\n dots: false,\n nav: false,\n video: true,\n loop: false,\n autoHeight: true,\n mouseDrag: false\n }).on(\"changed.owl.carousel\", syncPosition);\n sync2.on(\"initialized.owl.carousel\", function () {\n sync2.find(\".owl-item\").eq(0).addClass(\"current\");\n }).owlCarousel({\n items: slidesPerPage,\n dots: false,\n nav: true,\n video: true,\n mouseDrag: false,\n slideBy: slidesPerPage,\n responsive: {\n 0: {\n items: 2,\n slideBy: 2\n },\n 768: {\n items: 3,\n slideBy: 3\n },\n 1200: {\n items: 4,\n slideBy: 4\n }\n }\n }).on(\"changed.owl.carousel\", syncPosition2);\n function syncPosition(el) {\n const current = el.item.index;\n sync2.find(\".owl-item\").removeClass(\"current\").eq(current).addClass(\"current\");\n sync2.data(\"owl.carousel\").to(current, 100, true);\n }\n function syncPosition2(el) {\n const number = el.item.index;\n sync1.data(\"owl.carousel\").to(number, 100, true);\n }\n sync2.on(\"click\", \".owl-item\", function () {\n sync1.data(\"owl.carousel\").to(external_jQuery_default()(this).index(), 300, true);\n });\n }\n external_jQuery_default()(\".video-gallery .owl-carousel\").each(function (i) {\n if (i % 2 === 0) {\n initVideoGalleryOwlCarousel(`#sync${i + 1}`, `#sync${i + 2}`);\n }\n });\n}\n\n/* ================================\r\n EXPORT\r\n================================ */\n\nfunction initSublistingAndVideoGallery() {\n initSublistingSlider();\n initVideoGallery();\n}\n;// ./frontend/src/scripts/module/full-width-image.js\n\nfunction initFullWidthImageComponent(context = document) {\n external_jQuery_default()(context).find('.fullwidth-image-component').each(function () {\n const $section = external_jQuery_default()(this);\n const $button = $section.find('.hero-info-btn');\n const $text = $section.find('.hero-info-text');\n if (!$button.length || !$text.length) return;\n $button.on('click.fullWidthImage', function () {\n $button.toggleClass('on');\n $text.toggleClass('on');\n });\n });\n}\n;// ./frontend/src/scripts/module/helpful-link.js\n\n\nfunction initTilesSlider(context = document) {\n external_jQuery_default()('.helpful-links .owl-carousel', context).owlCarousel({\n rtl: false,\n loop: true,\n nav: false,\n dots: true,\n autoWidth: true,\n responsive: {\n 0: {\n items: 1\n },\n 768: {\n items: 1\n },\n 880: {\n items: 2\n },\n 1023: {\n items: 3\n },\n 1800: {\n items: 4\n },\n 2400: {\n items: 5\n }\n },\n onDrag: function (e) {\n external_jQuery_default()(e.currentTarget).find('.owl-stage .owl-item').each(function () {\n external_jQuery_default()(this).addClass('active');\n });\n },\n onInitialized(e) {\n const $carousel = external_jQuery_default()(e.currentTarget);\n $carousel.addClass('is-initialized');\n $carousel.find('.owl-item').addClass('tile-initialized');\n const $dots = $carousel.find('.owl-dots');\n if ($dots.length) {\n $dots.addClass('dots-initialized');\n $dots.find('.owl-dot').addClass('dot-initialized');\n }\n helpful_link_updateDotsAriaLabels($carousel);\n equalizeTileHeights($carousel);\n },\n onChanged(e) {\n const $carousel = external_jQuery_default()(e.currentTarget);\n equalizeTileHeights($carousel);\n helpful_link_updateDotsAriaLabels($carousel);\n }\n });\n}\nfunction equalizeTileHeights($carousel) {\n let maxHeight = 0;\n $carousel.find('.tile-body').css('min-height', '');\n $carousel.find('.tile-body').each(function () {\n maxHeight = Math.max(maxHeight, external_jQuery_default()(this).outerHeight());\n });\n $carousel.find('.tile-body').css('min-height', `${maxHeight}px`);\n}\nfunction helpful_link_updateDotsAriaLabels(carousel) {\n setTimeout(function () {\n carousel.find('.owl-dots .owl-dot').each(function (index) {\n external_jQuery_default()(this).attr('aria-label', 'Go to slide ' + (index + 1));\n });\n }, 500);\n}\n;// ./frontend/src/scripts/module/form.js\nfunction form_form() {\n $(\"#FormBuilderContainer .form-honeypot, #FormBuilderContainer .umbraco-forms-field.website\").each(function () {\n var $honeypot = $(this);\n $honeypot.attr(\"aria-hidden\", \"true\");\n $honeypot.find(\"input, textarea, select\").attr(\"tabindex\", \"-1\").attr(\"autocomplete\", \"off\");\n });\n if ($(\"#FormBuilderContainer .btn.prev\").length > 0) {\n $([document.documentElement, document.body]).animate({\n scrollTop: $(\"#FormBuilderContainer\").offset().top - 10\n }, 500);\n }\n if ($(\".two-column-text-with-form\").length > 0) {\n $('.two-column-text-with-form .accordion-accordion-label').on('click', function () {\n var $label = $(this);\n var $item = $label.closest('.accordion-accordion-item');\n var $content = $item.find('.accordion-accordion-content');\n var $icon = $label.find('img');\n var $accordion = $label.closest('.accordion-accordion');\n\n // Close all other accordion items\n $accordion.find('.accordion-accordion-item').not($item).each(function () {\n var $otherContent = $(this).find('.accordion-accordion-content');\n var $otherIcon = $(this).find('.accordion-accordion-label img');\n $otherContent.slideUp(300);\n $otherContent.removeClass('show');\n $otherIcon.removeClass('accordion-expanded-arrow');\n $(this).find('.accordion-accordion-label').addClass('collapsed');\n });\n\n // Toggle current item\n if ($content.hasClass('show')) {\n $content.slideUp(300);\n $content.removeClass('show');\n $icon.removeClass('accordion-expanded-arrow');\n $label.addClass('collapsed');\n } else {\n $content.slideDown(300);\n $content.addClass('show');\n $icon.addClass('accordion-expanded-arrow');\n $label.removeClass('collapsed');\n }\n });\n }\n}\n;// ./frontend/src/scripts/module/eventlisting.js\nfunction eventlisting() {\n if ($(\".eventcalendarlisting\").length) {\n for (let i = 0; i < $(\".eventcalendarlisting .filter-btn\").length;
16 i++) {\n $(\".eventcalendarlisting \").eq(i).on(\"click\", \".filter-btn\", function () {\n $(\".eventcalendarlisting .filter-btn\").removeClass(\"opened\");\n $(this).addClass(\"opened\");\n $(\".eventcalendarlisting .filter-btn\").children(\".dropdown\").removeClass(\"show\");\n $(this).children(\".dropdown\").addClass(\"show\");\n });\n }\n if ($(\".eventcalendarlisting .filter-btn\").find(\".radio-btn\").length) {\n for (let i = 0; i < $(\".eventcalendarlisting .filter-btn\").find(\".radio-btn\").length; i++) {\n $(\".filter-btn\").eq(i).on(\"click\", \".radio-btn\", function () {\n $(this).parent().parent().parent().removeClass(\"opened\").addClass(\"filter-selected\");\n });\n }\n }\n if ($(\".eventcalendarlisting .filter-btn\").find(\".checkbox-btn\").length) {\n for (let j = 0; j < $(\".eventcalendarlisting .filter-btn\").find(\".checkbox-btn\").length; j++) {\n for (let i = 0; i < $(\".eventcalendarlisting .filter-btn\").find(\".checkbox-btn\").length; i++) {\n $(\".filter-btn\").eq(i).on(\"click\", \".checkbox-btn\", function () {\n $(this).parent().parent().parent().removeClass(\"opened\").addClass(\"filter-selected\");\n });\n }\n }\n }\n for (let i = 0; i < $(\".eventcalendarlisting .filter-btn\").length; i++) {\n $(\".eventcalendarlisting .filter-btn\").eq(i).on(\"click\", \".apply-btn\", function () {\n $(this).parent().parent().parent().removeClass(\"opened\");\n $(this).parent().parent().removeClass(\"show\");\n });\n $(this).on(\"click\", \".clear-btn\", function () {});\n }\n $(\".mobile-filleter-toggle-btn\").on(\"click\", function () {\n $(\".filter-wrap\").toggleClass(\"visible-filter-btn\");\n $(\".mobile-filleter-toggle-btn .show-text\").toggleClass(\"hide\");\n $(\".mobile-filleter-toggle-btn .hide-text\").toggleClass(\"hide\");\n });\n for (let i = 1; i < 4; i++) {\n $(`#${i}`).change(function () {\n if ($(this).is(\":checked\")) {\n $(\".date-dropdown .date\").removeClass(\"active\");\n $(\".date-dropdown .date input\").prop(\"disabled\", true);\n } else {\n $(\".date-dropdown .date\").addClass(\"active\");\n }\n });\n }\n $(\"#4\").change(function () {\n if ($(this).is(\":checked\")) {\n $(\".date-dropdown .date\").addClass(\"active\");\n $(\".date-dropdown .date input\").prop(\"disabled\", false);\n } else {\n $(\".date-dropdown .date\").removeClass(\"active\");\n $(\".date-dropdown .date input\").prop(\"disabled\", true);\n }\n });\n if ($(\"#4\").is(\":checked\")) {\n $(\".date-dropdown .date\").addClass(\"active\");\n $(\".date-dropdown .date input\").prop(\"disabled\", false);\n } else {\n $(\".date-dropdown .date\").removeClass(\"active\");\n $(\".date-dropdown .date input\").prop(\"disabled\", true);\n }\n }\n if ($(\".header.innerPageHeader\").length) {\n if ($(\".jumpto\").find(\".content\").length) {\n $(\".header.innerPageHeader\").addClass(\"withJumpTo\");\n }\n }\n var queryString = window.location.search;\n let isClearFilterVisible = false;\n const params = new URLSearchParams(queryString);\n let paramObj = {};\n for (var value of params.keys()) {\n paramObj[value] = params.get(value);\n }\n let paramObjKeys = Object.keys(paramObj);\n if (paramObjKeys.length == 1) {\n if (paramObjKeys.includes(\"page\")) {\n isClearFilterVisible = false;\n } else {\n isClearFilterVisible = true;\n }\n } else {\n if (paramObjKeys.includes(\"page\") || paramObjKeys.includes(\"datetype\") || paramObjKeys.includes(\"location\") || paramObjKeys.includes(\"category\")) {\n isClearFilterVisible = true;\n }\n }\n\n // all 3 filter with page attribute \n if (paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"location\") && paramObjKeys.includes(\"category\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 4) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);
16\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n // all 3 filter without page attribute \n else if (paramObjKeys.includes(\"location\") && paramObjKeys.includes(\"category\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 3) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n // any 2 filter with page attribute \n else if (paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"location\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 3 || paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"category\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 3 || paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"location\") && paramObjKeys.includes(\"category\") && paramObjKeys.length == 3) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n // any 2 filter without page attribute \n else if (paramObjKeys.includes(\"location\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 2 || paramObjKeys.includes(\"category\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 2 || paramObjKeys.includes(\"category\") && paramObjKeys.includes(\"location\") && paramObjKeys.length == 2) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n // any 1 filter with page attribute \n else if (paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 2 || paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"category\") && paramObjKeys.length == 2 || paramObjKeys.includes(\"page\") && paramObjKeys.includes(\"location\") && paramObjKeys.length == 2) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n // any 1 filter without page attribute\n else if (paramObjKeys.includes(\"datetype\") && paramObj.datetype != 4 && paramObjKeys.length == 1 || paramObjKeys.includes(\"category\") && paramObjKeys.length == 1 || paramObjKeys.includes(\"location\") && paramObjKeys.length == 1 || paramObjKeys.includes(\"page\") && paramObjKeys.length == 1 || paramObjKeys.length == 0) {\n var now = new Date();\n var day = (\"0\" + now.getDate()).slice(-2);\n var month = (\"0\" + (now.getMonth() + 1)).slice(-2);\n var today = now.getFullYear() + \"-\" + month + \"-\" + day;\n $('.date-dropdown #startDate').val(today);\n $('.date-dropdown #endDate').val(today);\n }\n if (isClearFilterVisible) {\n if (queryString.match(\"datetype\") || queryString.match(\"location\") || queryString.match(\"category\")) {\n if ($(window).width() < 577) {\n if ($(\".mobile-clear-all-filters-btn\").length) {\n $(\".mobile-clear-all-filters-btn\").show();\n }\n $(\".mobile-filleter-toggle-btn\").addClass(\"filter-selected\");\n $(\".mobile-filleter-toggle-btn\").on(\"click\", function () {\n $(\".mobile-clear-all-filters-btn\").toggleClass(\"hide\");\n });\n } else {\n if ($(\".clear-all-filters-btn\").length) {\n $(\".clear-all-filters-btn\").show();\n $(\".clear-all-filters-btn\").removeClass(\"hide\");\n }\n }\n }\n if (queryString.match(\"datetype\")) {\n $(\".date-filter\").addClass(\"filter-selected\");\n }\n if (queryString.match(\"location\")) {\n $(\".location-filter\").addClass(\"filter-selected\");\n }\n if (queryString.match(\"category\")) {\n $(\".category-filter\").addClass(\"filter-selected\");\n }\n } else {\n $(\".mobile-clear-all-filters-btn\").addClass(\"hide\");\n $(\".clear-all-filters-btn\").addClass(\"hide\");\n }\n $(\".clear-all-filters-btn\").on(\"click\", function (e) {\n e.preventDefault();\n var currentUrl = window.location.href;\n const urlObj = new URL(currentUrl);\n window.location.replace(urlObj.origin + urlObj.pathname);\n });\n $(\".mobile-clear-all-filters-btn\").on(\"click\", function (e) {\n e.preventDefault();\n var currentUrl = window.location.href;\n const urlObj = new URL(currentUrl);\n window.location.replace(urlObj.origin + urlObj.pathname);\n });\n $(document).ready(function () {\n if ($(\".eventcalendarlisting\").length) {\n var date = new Date();\n $(\"#startDate\").datepicker({\n format: 'yyyy-MM-dd',\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#from-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n });\n $(\"#endDate\").datepicker({\n format: 'yyyy-MM-dd',\n autoHide: true,\n zIndex: 1000,\n weekStart: 1,\n trigger: \"#to-icon\",\n startDate: new Date(date.getFullYear(), date.getMonth(), date.getDate())\n });\n $(\"#startDate\").focus(function () {\n $(\"#startDate\").datepicker(\"show\");\n });\n $(\"#endDate\").focus(function () {\n $(\"#endDate\").datepicker(\"show\");\n });\n const $menu = $('.dropdown');\n let $datepickerContainerFirst;\n let $datepickerContainerSecond;\n $(\"#startDate\").on('show.datepicker', function () {\n $datepickerContainerFirst = $('.datepicker-container');\n });\n $(\"#endDate\").on('show.datepicker', function () {\n $datepickerContainerFirst = $('.datepicker-container').eq(0);\n $datepickerContainerSecond = $('.datepicker-container').eq(1);\n });\n const onMouseUp = e => {\n if ($datepickerContainerFirst == undefined && $datepickerContainerSecond == undefined) {\n if (!$menu.is(e.target) && $menu.has(e.target).length === 0) {\n {\n $menu.removeClass('show');\n $menu.parent().removeClass(\"opened\");\n }\n }\n } else if ($datepickerContainerSecond == undefined) {\n if (!$menu.is(e.target) && $menu.has(e.target).length === 0 && !$datepickerContainerFirst.is(e.target) && $datepickerContainerFirst.has(e.target).length === 0) {\n $menu.removeClass('show');\n $menu.parent().removeClass(\"opened\");\n }\n } else if ($datepickerContainerFirst == undefined) {\n if (!$menu.is(e.target) && $menu.has(e.target).length === 0 && !$datepickerContainerSecond.is(e.target) && $datepickerContainerSecond.has(e.target).length === 0) {\n $menu.removeClass('show');\n $menu.parent().removeClass(\"opened\");\n }\n } else {\n if (!$menu.is(e.target) && $menu.has(e.target).length === 0 && !$datepickerContainerFirst.is(e.target) && $datepickerContainerFirst.has(e.target).length === 0 && !$datepickerContainerSecond.is(e.target) && $datepickerContainerSecond.has(e.target).length === 0) {\n $menu.removeClass('show');\n $menu.parent().removeClass(\"opened\");\n }\n }\n };\n $('.filter-btn').on('click', () => {\n $menu.toggleClass('show').promise().done(() =>
16 {\n if ($menu.hasClass('show')) {\n $(document).on('mouseup', onMouseUp); // Only listen for mouseup when menu is active...\n } else {\n $(document).off('mouseup', onMouseUp); // else remove listener.\n }\n });\n });\n }\n $(\"#startDate\").on(\"change\", function () {\n var fromDateObj = new Date($(this).val());\n var toDateObj = new Date($(\"#endDate\").val());\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\"#startDate\").addClass(\"invalid-date-error\");\n $(\"#endDate\").addClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', true);\n } else {\n $(\".endDateError\").hide();\n $(\"#startDate\").removeClass(\"invalid-date-error\");\n $(\"#endDate\").removeClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', false);\n }\n });\n $(\"#endDate\").on(\"change\", function () {\n var fromDateObj = new Date($(\"#startDate\").val());\n var toDateObj = new Date($(this).val());\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\"#startDate\").addClass(\"invalid-date-error\");\n $(\"#endDate\").addClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', true);\n } else {\n $(\".endDateError\").hide();\n $(\"#startDate\").removeClass(\"invalid-date-error\");\n $(\"#endDate\").removeClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', false);\n }\n });\n var fromDateObj = new Date($(\"#startDate\").val());\n var toDateObj = new Date($(\"#endDate\").val());\n if (toDateObj < fromDateObj) {\n $(\".endDateError\").show();\n $(\"#startDate\").addClass(\"invalid-date-error\");\n $(\"#endDate\").addClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', true);\n } else {\n $(\".endDateError\").hide();\n $(\"#startDate\").removeClass(\"invalid-date-error\");\n $(\"#endDate\").removeClass(\"invalid-date-error\");\n $(\"#applyBtn\").prop('disabled', false);\n }\n // DATE CLEAR\n $(document).on(\"click\", \".date-filter .clear-btn\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n $('input[name=\"datetype\"]').prop('checked', false);\n $('#startDate').val('').prop(\"disabled\", true);\n $('#endDate').val('').prop(\"disabled\", true);\n $(\".date-filter .date\").removeClass(\"active\");\n $(\".date-filter\").removeClass(\"filter-selected\");\n $(\".endDateError\").hide();\n window.history.replaceState({}, document.title, window.location.pathname);\n });\n\n // CATEGORY CLEAR\n $(document).on(\"click\", \".category-filter .clear-btn\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n $('input[name=\"category\"]').prop('checked', false);\n $(\".category-filter\").removeClass(\"filter-selected\");\n window.history.replaceState({}, document.title, window.location.pathname);\n });\n\n // LOCATION CLEAR\n $(document).on(\"click\", \".location-filter .clear-btn\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n $('input[name=\"location\"]').prop('checked', false);\n $(\".location-filter\").removeClass(\"filter-selected\");\n window.history.replaceState({}, document.title, window.location.pathname);\n });\n });\n}\n;// ./frontend/src/scripts/module/news.js\n\nfunction applyBorderFix() {\n external_jQuery_default()('.news-donate-content-link-container').each(function (i) {\n if (i === 2) {\n external_jQuery_default()(this).find('div').addClass('border-bottom-none');\n }\n });\n}\n;// ./frontend/src/scripts/component.js\n// component only file\n\n// import plugin / include function\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Call function on document ready\n$(document).ready(function () {\n accordion();\n initSublistingAndVideoGallery();\n initHeroHeader();\n module_accommodation();\n acknowledgement();\n mainNavigation();\n mainNavigationmobile();\n hideLanguageDropdowns();\n form_form();\n applyBorderFix();\n $(window).on('resize', function () {\n jumptoFix();\n });\n});\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n gallery();\n galleryCenterOwlCarousel();\n galleryHeadingOwlCarousel();\n initFullWidthImageComponent();\n initTilesSlider();\n eventlisting();\n});\n\n//# sourceURL=webpack://umbracoframework/./frontend/src/scripts/component.js_+_16_modules?"); 17 18/***/ }), 19 20/***/ 288: 21/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 22 23eval("/*!\r\n * Datepicker v1.0.10\r\n * https://fengyuanchen.github.io/datepicker\r\n *\r\n * Copyright 2014-present
23Chen Fengyuan\r\n * Released under the MIT license\r\n *\r\n * Date: 2020-09-29T14:46:10.983Z\r\n */\n\n(function (global, factory) {\n true ? factory(__webpack_require__(669)) : 0;\n})(this, function ($) {\n 'use strict';\n\n $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n var DEFAULTS = {\n // Show the datepicker automatically when initialized\n autoShow: false,\n // Hide the datepicker automatically when picked\n autoHide: false,\n // Pick the initial date automatically when initialized\n autoPick: false,\n // Enable inline mode\n inline: false,\n // A element (or selector) for putting the datepicker\n container: null,\n // A element (or selector) for triggering the datepicker\n trigger: null,\n // The ISO language code (built-in: en-US)\n language: '',\n // The date string format\n format: 'mm/dd/yyyy',\n // The initial date\n date: null,\n // The start view date\n startDate: null,\n // The end view date\n endDate: null,\n // The start view when initialized\n startView: 0,\n // 0 for days, 1 for months, 2 for years\n // The start day of the week\n // 0 for Sunday, 1 for Monday, 2 for Tuesday, 3 for Wednesday,\n // 4 for Thursday, 5 for Friday, 6 for Saturday\n weekStart: 0,\n // Show year before month on the datepicker header\n yearFirst: false,\n // A string suffix to the year number.\n yearSuffix: '',\n // Days' name of the week.\n days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n // Shorter days' name\n daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n // Shortest days' name\n daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n // Months' name\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n // Shorter months' name\n monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n // A element tag for each item of years, months and days\n itemTag: 'li',\n // A class (CSS) for muted date item\n mutedClass: 'muted',\n // A class (CSS) for picked date item\n pickedClass: 'picked',\n // A class (CSS) for disabled date item\n disabledClass: 'disabled',\n // A class (CSS) for highlight date item\n highlightedClass: 'highlighted',\n // The template of the datepicker\n template: '<div class=\"datepicker-container\">' + '<div class=\"datepicker-panel\" data-view=\"years picker\">' + '<ul>' + '<li data-view=\"years prev\">‹</li>' + '<li data-view=\"years current\"></li>' + '<li data-view=\"years next\">
23›</li>' + '</ul>' + '<ul data-view=\"years\"></ul>' + '</div>' + '<div class=\"datepicker-panel\" data-view=\"months picker\">' + '<ul>' + '<li data-view=\"year prev\">‹</li>' + '<li data-view=\"year current\"></li>' + '<li data-view=\"year next\">›</li>' + '</ul>' + '<ul data-view=\"months\"></ul>' + '</div>' + '<div class=\"datepicker-panel\" data-view=\"days picker\">' + '<ul>' + '<li data-view=\"month prev\">‹</li>' + '<li data-view=\"month current\"></li>' + '<li data-view=\"month next\">›</li>' + '</ul>' + '<ul data-view=\"week\"></ul>' + '<ul data-view=\"days\"></ul>' + '</div>' + '</div>',\n // The offset top or bottom of the datepicker from the element\n offset: 10,\n // The `z-index` of the datepicker\n zIndex: 1000,\n // Filter each date item (return `false` to disable a date item)\n filter: null,\n // Event shortcuts\n show: null,\n hide: null,\n pick: null\n };\n var IS_BROWSER = typeof window !== 'undefined';\n var WINDOW = IS_BROWSER ? window : {};\n var IS_TOUCH_DEVICE = IS_BROWSER ? 'ontouchstart' in WINDOW.document.documentElement : false;\n var NAMESPACE = 'datepicker';\n var EVENT_CLICK = \"click.\".concat(NAMESPACE);\n var EVENT_FOCUS = \"focus.\".concat(NAMESPACE);\n var EVENT_HIDE = \"hide.\".concat(NAMESPACE);\n var EVENT_KEYUP = \"keyup.\".concat(NAMESPACE);\n var EVENT_PICK = \"pick.\".concat(NAMESPACE);\n var EVENT_RESIZE = \"resize.\".concat(NAMESPACE);\n var EVENT_SCROLL = \"scroll.\".concat(NAMESPACE);\n var EVENT_SHOW = \"show.\".concat(NAMESPACE);\n var EVENT_TOUCH_START = \"touchstart.\".concat(NAMESPACE);\n var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n var LANGUAGES = {};\n var VIEWS = {\n DAYS: 0,\n MONTHS: 1,\n YEARS: 2\n };\n var toString = Object.prototype.toString;\n function typeOf(obj) {\n return toString.call(obj).slice(8, -1).toLowerCase();\n }\n function isString(value) {\n return typeof value === 'string';\n }\n var isNaN = Number.isNaN || WINDOW.isNaN;\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n }\n function isUndefined(value) {\n return typeof value === 'undefined';\n }\n function isDate(value) {\n return typeOf(value) === 'date' && !isNaN(value.getTime());\n }\n function proxy(fn, context) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return function () {\n for (var _len2 = arguments.length, args2 = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args2[_key2] = arguments[_key2];\n }\n return fn.apply(context, args.concat(args2));\n };\n }\n function selectorOf(view) {\n return \"[data-view=\\\"\".concat(view, \"\\\"]\");\n }\n function isLeapYear(year) {\n return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n }\n function getDaysInMonth(year, month) {\n return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n }\n function getMinDay(year, month, day) {\n return Math.min(day, getDaysInMonth(year, month));\n }\n var formatParts = /(y|m|d)+/g;\n function parseFormat(format) {\n var source = String(format).toLowerCase();\n var parts = source.match(formatParts);\n if (!parts || parts.length === 0) {\n throw new Error('Invalid date format.');\n }\n format = {\n source: source,\n parts: parts\n };\n $.each(parts, function (i, part) {\n switch (part) {\n case 'dd':\n case 'd':\n format.hasDay = true;\n break;\n case 'mm':\n case 'm':\n format.hasMonth = true;\n break;\n case 'yyyy':\n case 'yy':\n format.hasYear = true;\n break;\n }\n });\n return format;\n }\n function getScrollParent(element) {\n var includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var $element = $(element);\n var position = $element.css('position');\n var excludeStaticParent = position === 'absolute';\n var overflowRegex = includeHidden ? /auto|scroll|hidden/ : /auto|scroll/;\n var scrollParent = $element.parents().filter(function (index, parent) {\n var $parent = $(parent);\n if (excludeStaticParent && $parent.css('position') === 'static') {\n return false;\n }\n return overflowRegex.test($parent.css('overflow') + $parent.css('overflow-y') + $parent.css('overflow-x'));\n }).eq(0);\n return position === 'fixed' || !scrollParent.length ? $(element.ownerDocument || document) : scrollParent;\n }\n /**\r\n * Add leading zeroes to the given value\r\n * @param {number} value - The value to add.\r\n * @param {number} [length=1] - The expected value length.\r\n * @returns {string} Returns converted value.\r\n */\n\n function addLeadingZero(value) {\n var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var str = String(Math.abs(value));\n var i = str.length;\n var result = '';\n if (value < 0) {\n result += '-';
23\n }\n while (i < length) {\n i += 1;\n result += '0';\n }\n return result + str;\n }\n var REGEXP_DIGITS = /\\d+/g;\n var methods = {\n // Show the datepicker\n show: function show() {\n if (!this.built) {\n this.build();\n }\n if (this.shown) {\n return;\n }\n if (this.trigger(EVENT_SHOW).isDefaultPrevented()) {\n return;\n }\n this.shown = true;\n this.$picker.removeClass(CLASS_HIDE).on(EVENT_CLICK, $.proxy(this.click, this));\n this.showView(this.options.startView);\n if (!this.inline) {\n this.$scrollParent.on(EVENT_SCROLL, $.proxy(this.place, this));\n $(window).on(EVENT_RESIZE, this.onResize = proxy(this.place, this));\n $(document).on(EVENT_CLICK, this.onGlobalClick = proxy(this.globalClick, this));\n $(document).on(EVENT_KEYUP, this.onGlobalKeyup = proxy(this.globalKeyup, this));\n if (IS_TOUCH_DEVICE) {\n $(document).on(EVENT_TOUCH_START, this.onTouchStart = proxy(this.touchstart, this));\n }\n this.place();\n }\n },\n // Hide the datepicker\n hide: function hide() {\n if (!this.shown) {\n return;\n }\n if (this.trigger(EVENT_HIDE).isDefaultPrevented()) {\n return;\n }\n this.shown = false;\n this.$picker.addClass(CLASS_HIDE).off(EVENT_CLICK, this.click);
23\n if (!this.inline) {\n this.$scrollParent.off(EVENT_SCROLL, this.place);\n $(window).off(EVENT_RESIZE, this.onResize);\n $(document).off(EVENT_CLICK, this.onGlobalClick);\n $(document).off(EVENT_KEYUP, this.onGlobalKeyup);\n if (IS_TOUCH_DEVICE) {\n $(document).off(EVENT_TOUCH_START, this.onTouchStart);\n }\n }\n },\n toggle: function toggle() {\n if (this.shown) {\n this.hide();\n } else {\n this.show();\n }\n },\n // Update the datepicker with the current input value\n update: function update() {\n var value = this.getValue();\n if (value === this.oldValue) {\n return;\n }\n this.setDate(value, true);\n this.oldValue = value;\n },\n /**\r\n * Pick the current date to the element\r\n *\r\n * @param {String} _view (private)\r\n */\n pick: function pick(_view) {\n var $this = this.$element;\n var date = this.date;\n if (this.trigger(EVENT_PICK, {\n view: _view || '',\n date: date\n }).isDefaultPrevented()) {\n return;\n }\n date = this.formatDate(this.date);\n this.setValue(date);\n if (this.isInput) {\n $this.trigger('input');\n $this.trigger('change');\n }\n },\n // Reset the datepicker\n reset: function reset() {\n this.setDate(this.initialDate, true);\n this.setValue(this.initialValue);\n if (this.shown) {\n this.showView(this.options.startView);\n }\n },\n /**\r\n * Get the month name with given argument or the current date\r\n *\r\n * @param {Number} month (optional)\r\n * @param {Boolean} shortForm (optional)\r\n * @return {String} (month name)\r\n */\n getMonthName: function getMonthName(month, shortForm) {\n var options = this.options;\n var monthsShort = options.monthsShort;\n var months = options.months;\n if ($.isNumeric(month)) {\n month = Number(month);\n } else if (isUndefined(shortForm)) {\n shortForm = month;\n }\n if (shortForm === true) {\n months = monthsShort;\n }\n return months[isNumber(month) ? month : this.date.getMonth()];\n },\n /**\r\n * Get the day name with given argument or the current date\r\n *\r\n * @param {Number} day (optional)\r\n * @param {Boolean} shortForm (optional)\r\n * @param {Boolean} min (optional)\r\n * @return {String} (day name)\r\n */\n getDayName: function getDayName(day, shortForm, min) {\n var options = this.options;\n var days = options.days;\n if ($.isNumeric(day)) {\n day = Number(day);\n } else {\n if (isUndefined(min)) {\n min = shortForm;\n }\n if (isUndefined(shortForm)) {\n shortForm = day;\n }\n }\n if (min) {\n days = options.daysMin;\n } else if (shortForm) {\n days = options.daysShort;\n }\n return days[isNumber(day) ? day : this.date.getDay()];\n },\n /**\r\n * Get the current date\r\n *\r\n * @param {Boolean} formatted (optional)\r\n * @return {Date|String} (date)\r\n */\n getDate: function getDate(formatted) {\n var date = this.date;\n return formatted ? this.formatDate(date) : new Date(date);\n },\n /**\r\n * Set the current date with a new date\r\n *\r\n * @param {Date} date\r\n * @param {Boolean} _updated (private)\r\n */\n setDate: function setDate(date, _updated) {\n var filter = this.options.filter;\n if (isDate(date) || isString(date)) {\n date = this.parseDate(date);\n if ($.isFunction(filter) && filter.call(this.$element, date, 'day') === false) {\n return;\n }\n this.date = date;\n this.viewDate = new Date(date);\n if (!_updated) {\n this.pick();\n }\n if (this.built) {\n this.render();\n }\n }\n },\n /**\r\n * Set the start view date with a new date\r\n *\r\n * @param {Date|string|null} date\r\n */\n setStartDate: function setStartDate(date) {\n if (isDate(date) || isString(date)) {\n this.startDate = this.parseDate(date);\n } else {\n this.startDate = null;\n }\n if (this.built) {\n this.render();\n }\n },\n /**\r\n * Set the end view date with a new date\r\n *\r\n * @param {Date|string|null} date\r\n */\n setEndDate: function setEndDate(date) {\n if (isDate(date) || isString(date)) {\n this.endDate = this.parseDate(date);\n } else {\n this.endDate = null;\n }\n if (this.built) {\n this.render();\n }\n },\n /**\r\n * Parse a date string with the set date format\r\n *\r\n * @param {String} date\r\n * @return {Date} (parsed date)\r\n */\n parseDate: function parseDate(date) {\n var format = this.format;\n var parts = [];\n if (!isDate(date)) {\n if (isString(date)) {\n parts = date.match(REGEXP_DIGITS) || [];\n }\n date = date ? new Date(date) : new Date();\n if (!isDate(date)) {\n date = new Date();\n }\n if (parts.length === format.parts.length) {\n // Set year and month first\n $.each(parts, function (i, part) {\n var value = parseInt(part, 10);\n switch (format.parts[i]) {\n case 'yy':\n date.setFullYear(2000 + value);\n break;\n case 'yyyy':\n // Converts 2-digit year to 2000+\n date.setFullYear(part.length === 2 ? 2000 + value : value);\n break;\n case 'mm':\n case 'm':\n date.setMonth(value - 1);\n break;\n }\n });
23 // Set day in the last to avoid converting `31/10/2019` to `01/10/2019`\n\n $.each(parts, function (i, part) {\n var value = parseInt(part, 10);\n switch (format.parts[i]) {\n case 'dd':\n case 'd':\n date.setDate(value);\n break;\n }\n });\n }\n } // Ignore hours, minutes, seconds and milliseconds to avoid side effect (#192)\n\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n },\n /**\r\n * Format a date object to a string with the set date format\r\n *\r\n * @param {Date} date\r\n * @return {String} (formatted date)\r\n */\n formatDate: function formatDate(date) {\n var format = this.format;\n var formatted = '';\n if (isDate(date)) {\n var year = date.getFullYear();\n var month = date.getMonth();\n var day = date.getDate();\n var values = {\n d: day,\n dd: addLeadingZero(day, 2),\n m: month + 1,\n mm: addLeadingZero(month + 1, 2),\n yy: String(year).substring(2),\n yyyy: addLeadingZero(year, 4)\n };\n formatted = format.source;\n $.each(format.parts, function (i, part) {\n formatted = formatted.replace(part, values[part]);\n });\n }\n return formatted;\n },\n // Destroy the datepicker and remove the instance from the target element\n destroy: function destroy() {\n this.unbind();\n this.unbuild();\n this.$element.removeData(NAMESPACE);\n }\n };\n var handlers = {\n click: function click(e) {\n var $target = $(e.target);\n var options = this.options,\n date = this.date,\n viewDate = this.viewDate,\n format = this.format;\n e.stopPropagation();\n e.preventDefault();\n if ($target.hasClass('disabled')) {\n return;\n }\n var view = $target.data('view');\n var viewYear = viewDate.getFullYear();\n var viewMonth = viewDate.getMonth();\n var viewDay = viewDate.getDate();\n switch (view) {\n case 'years prev':\n case 'years next':\n {\n viewYear = view === 'years prev' ? viewYear - 10 : viewYear + 10;\n viewDate.setFullYear(viewYear);\n viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));\n this.renderYears();\n break;\n }\n case 'year prev':\n case 'year next':\n viewYear = view === 'year prev' ? viewYear - 1 : viewYear + 1;\n viewDate.setFullYear(viewYear);\n viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));\n this.renderMonths();\n break;\n case 'year current':\n if (format.hasYear) {\n this.showView(VIEWS.YEARS);\n }\n break;\n case 'year picked':\n if (format.hasMonth) {\n this.showView(VIEWS.MONTHS);\n } else {\n $target.siblings(\".\".concat(options.pickedClass)).removeClass(options.pickedClass).data('view', 'year');\n this.hideView();\n }\n this.pick('year');\n break;\n case 'year':\n viewYear = parseInt($target.text(), 10); // Set date first to avoid month changing (#195)\n\n date.setDate(getMinDay(viewYear, viewMonth, viewDay));\n date.setFullYear(viewYear);\n viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));\n viewDate.setFullYear(viewYear);\n if (format.hasMonth) {\n this.showView(VIEWS.MONTHS);\n } else {\n $target.addClass(options.pickedClass).data('view', 'year picked').siblings(\".\".concat(options.pickedClass)).removeClass(options.pickedClass).data('view', 'year');\n this.hideView();\n }\n this.pick('year');\n break;\n case 'month prev':\n case 'month next':\n viewMonth = view === 'month prev' ? viewMonth - 1 : viewMonth + 1;\n if (viewMonth < 0) {\n viewYear -= 1;\n viewMonth += 12;\n } else if (viewMonth > 11) {\n viewYear += 1;\n viewMonth -= 12;\n }\n viewDate.setFullYear(viewYear);\n viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));\n viewDate.setMonth(viewMonth);\n this.renderDays();\n break;\n case 'month current':\n if (format.hasMonth) {\n this.showView(VIEWS.MONTHS);\n }\n break;\n case 'month picked':\n if (format.hasDay) {\n this.showView(VIEWS.DAYS);\n } else {\n $target.siblings(\".\".concat(options.pickedClass)).removeClass(options.pickedClass).data('view', 'month');\n this.hideView();\n }\n this.pick('month');\n break;\n case 'month':\n viewMonth = $.inArray($target.text(), options.monthsShort);\n date.setFullYear(viewYear); // Set date before month to avoid month changing (#195)\n\n date.setDate(getMinDay(viewYear, viewMonth, viewDay));\n date.setMonth(viewMonth);\n viewDate.setFullYear(viewYear);\n viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));\n viewDate.setMonth(viewMonth);\n if (format.hasDay) {\n this.showView(VIEWS.DAYS);\n } else {\n $target.addClass(options.pickedClass).data('view', 'month picked').siblings(\".\".concat(options.pickedClass)).removeClass(options.pickedClass).data('view', 'month');\n this.hideView();\n }\n this.pick('month');\n break;\n case 'day prev':\n case 'day next':\n case 'day':\n if (view === 'day prev') {\n viewMonth -= 1;\n } else if (view === 'day next') {\n viewMonth += 1;\n }\n viewDay = parseInt($target.text(), 10); // Set date to 1 to avoid month changing (#195)\n\n date.setDate(1);\n date.setFullYear(viewYear);\n date.setMonth(viewMonth);\n date.setDate(viewDay);\n viewDate.setDate(1);\n viewDate.setFullYear(viewYear);\n viewDate.setMonth(viewMonth);\n viewDate.setDate(viewDay);\n this.renderDays();\n if (view === 'day') {\n this.hideView();\n }\n this.pick('day');\n break;\n case 'day picked':\n this.hideView();\n this.pick('day');\n break;\n }\n },\n globalClick: function globalClick(_ref) {\n var target = _ref.target;\n var element = this.element,\n $trigger = this.$trigger;\n var trigger = $trigger[0];\n var hidden = true;\n while (target !== document) {\n if (target === trigger || target === element) {\n hidden = false;\n break;\n }\n target = target.parentNode;\n }\n if (hidden) {\n this.hide();\n }\n },\n keyup: function keyup() {\n this.update();\n },\n globalKeyup: function globalKeyup(_ref2) {\n var target = _ref2.target,\n key = _ref2.key,\
23n keyCode = _ref2.keyCode;\n if (this.isInput && target !== this.element && this.shown && (key === 'Tab' || keyCode === 9)) {\n this.hide();\n }\n },\n touchstart: function touchstart(_ref3) {\n var target = _ref3.target;\n\n // Emulate click in touch devices to support hiding the picker automatically (#197).\n if (this.isInput && target !== this.element && !$.contains(this.$picker[0], target)) {\n this.hide();\n this.element.blur();\n }\n }\n };\n var render = {\n render: function render() {\n this.renderYears();\n this.renderMonths();\n this.renderDays();\n },\n renderWeek: function renderWeek() {\n var _this = this;\n var items = [];\n var _this$options = this.options,\n weekStart = _this$options.weekStart,\n daysMin = _this$options.daysMin;\n weekStart = parseInt(weekStart, 10) % 7;\n daysMin = daysMin.slice(weekStart).concat(daysMin.slice(0, weekStart));\n $.each(daysMin, function (i, day) {\n items.push(_this.createItem({\n text: day\n }));\n });\n this.$week.html(items.join(''));\n },\n renderYears: function renderYears() {\n var options = this.options,\n startDate = this.startDate,\n endDate = this.endDate;\n var disabledClass = options.disabledClass,\n filter = options.filter,\n yearSuffix = options.yearSuffix;\n var viewYear = this.viewDate.getFullYear();\n var now = new Date();\n var thisYear = now.getFullYear();\n var year = this.date.getFullYear();\n var start = -5;\n var end = 6;\n var items = [];\n var prevDisabled = false;\n var nextDisabled = false;\n var i;\n for (i = start; i <= end; i += 1) {\n var date = new Date(viewYear + i, 1, 1);\n var disabled = false;\n if (startDate) {\n disabled = date.getFullYear() < startDate.getFullYear();\n if (i === start) {\n prevDisabled = disabled;\n }\n }\n if (!disabled && endDate) {\n disabled = date.getFullYear() > endDate.getFullYear();\n if (i === end) {\n nextDisabled = disabled;\n }\n }\n if (!disabled && filter) {\n disabled = filter.call(this.$element, date, 'year') === false;\n }\n var picked = viewYear + i === year;\n var view = picked ? 'year picked' : 'year';\n items.push(this.createItem({\n picked: picked,\n disabled: disabled,\n text: viewYear + i,\n view: disabled ? 'year disabled' : view,\n highlighted: date.getFullYear() === thisYear\n }));\n }\n this.$yearsPrev.toggleClass(disabledClass, prevDisabled);\n this.$yearsNext.toggleClass(disabledClass, nextDisabled);\n this.$yearsCurrent.toggleClass(disabledClass, true).html(\"\".concat(viewYear + start + yearSuffix, \" - \").concat(viewYear + end).concat(yearSuffix));\n this.$years.html(items.join(''));\n },\n renderMonths: function renderMonths() {\n var options = this.options,\n startDate = this.startDate,\n endDate = this.endDate,\n viewDate = this.viewDate;\n var disabledClass = options.disabledClass || '';\n var months = options.monthsShort;\n var filter = $.isFunction(options.filter) && options.filter;\n var viewYear = viewDate.getFullYear();\n var now = new Date();\n var thisYear = now.getFullYear();\n var thisMonth = now.getMonth();\n var year = this.date.getFullYear();\n var month = this.date.getMonth();\n var items = [];\n var prevDisabled = false;\n var nextDisabled = false;\n var i;\n for (i = 0; i <= 11; i += 1) {\n var date = new Date(viewYear, i, 1);\n var disabled = false;\n if (startDate) {\n prevDisabled = date.getFullYear() === startDate.getFullYear();\n disabled = prevDisabled && date.getMonth() < startDate.getMonth();\n }\n if (!disabled && endDate) {\n nextDisabled = date.getFullYear() === endDate.getFullYear();\n disabled = nextDisabled && date.getMonth() > endDate.getMonth();\n }\n if (!disabled && filter) {\n disabled = filter.call(this.$element, date, 'month') === false;\n }\n var picked = viewYear === year && i === month;\n var view = picked ? 'month picked' : 'month';\n items.push(this.createItem({\n disabled: disabled,\n picked: picked,\n highlighted: viewYear === thisYear && date.getMonth() === thisMonth,\n index: i,\n text: months[i],\n view: disabled ? 'month disabled' : view\n }));\n }\n this.$yearPrev.toggleClass(disabledClass, prevDisabled);\n this.$yearNext.toggleClass(disabledClass, nextDisabled);\n this.$yearCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(viewYear + options.yearSuffix || '');\n this.$months.html(items.join(''));\n },\n renderDays: function renderDays() {\n var $element = this.$element,\n options = this.options,\n startDate = this.startDate,\n endDate = this.endDate,\n viewDate = this.viewDate,\n currentDate = this.date;\n var disabledClass = options.disabledClass,\n filter = options.filter,\n months = options.months,\n weekStart = options.weekStart,\n yearSuffix = options.yearSuffix;
23\n var viewYear = viewDate.getFullYear();\n var viewMonth = viewDate.getMonth();\n var now = new Date();\n var thisYear = now.getFullYear();\n var thisMonth = now.getMonth();\n var thisDay = now.getDate();\n var year = currentDate.getFullYear();\n var month = currentDate.getMonth();\n var day = currentDate.getDate();\n var length;\n var i;\n var n; // Days of prev month\n // -----------------------------------------------------------------------\n\n var prevItems = [];\n var prevViewYear = viewYear;\n var prevViewMonth = viewMonth;\n var prevDisabled = false;\n if (viewMonth === 0) {\n prevViewYear -= 1;\n prevViewMonth = 11;\n } else {\n prevViewMonth -= 1;\n } // The length of the days of prev month\n\n length = getDaysInMonth(prevViewYear, prevViewMonth); // The first day of current month\n\n var firstDay = new Date(viewYear, viewMonth, 1); // The visible length of the days of prev month\n // [0,1,2,3,4,5,6] - [0,1,2,3,4,5,6] => [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6]\n\n n = firstDay.getDay() - parseInt(weekStart, 10) % 7; // [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6] => [1,2,3,4,5,6,7]\n\n if (n <= 0) {\n n += 7;\n }\n if (startDate) {\n prevDisabled = firstDay.getTime() <= startDate.getTime();\n }\n for (i = length - (n - 1); i <= length; i += 1) {\n var prevViewDate = new Date(prevViewYear, prevViewMonth, i);\n var disabled = false;\n if (startDate) {\n disabled = prevViewDate.getTime() < startDate.getTime();\n }\n if (!disabled && filter) {\n disabled = filter.call($element, prevViewDate, 'day') === false;\n }\n prevItems.push(this.createItem({\n disabled: disabled,\n highlighted: prevViewYear === thisYear && prevViewMonth === thisMonth && prevViewDate.getDate() === thisDay,\n muted: true,\n picked: prevViewYear === year && prevViewMonth === month && i === day,\n text: i,\n view: 'day prev'\n }));\n } // Days of next month\n // -----------------------------------------------------------------------\n\n var nextItems = [];\n var nextViewYear = viewYear;\n var nextViewMonth = viewMonth;\n var nextDisabled = false;\n if (viewMonth === 11) {\n nextViewYear += 1;\n nextViewMonth = 0;\n } else {\n nextViewMonth += 1;\n } // The length of the days of current month\n\n length = getDaysInMonth(viewYear, viewMonth); // The visible length of next month (42 means 6 rows and 7 columns)\n\n n = 42 - (prevItems.length + length); // The last day of current month\n\n var lastDate = new Date(viewYear, viewMonth, length);\n if (endDate) {\n nextDisabled = lastDate.getTime() >= endDate.getTime();\n }\n for (i = 1; i <= n; i += 1) {\n var date = new Date(nextViewYear, nextViewMonth, i);\n var picked = nextViewYear === year && nextViewMonth === month && i === day;\n var _disabled = false;\n if (endDate) {\n _disabled = date.getTime() > endDate.getTime();\n }\n if (!_disabled && filter) {\n _disabled = filter.call($element, date, 'day') === false;\n }\n nextItems.push(this.createItem({\n disabled: _disabled,\n picked: picked,\n highlighted: nextViewYear === thisYear && nextViewMonth === thisMonth && date.getDate() === thisDay,\n muted: true,\n text: i,\n view: 'day next'\n }));\n } // Days of current month\n // -----------------------------------------------------------------------\n\n var items = [];\n for (i = 1; i <= length; i += 1) {\n var _date = new Date(viewYear, viewMonth, i);\n var _disabled2 = false;\n if (startDate) {\n _disabled2 = _date.getTime() < startDate.getTime();\n }\n if (!_disabled2 && endDate) {\n _disabled2 = _date.getTime() > endDate.getTime();\n }\n if (!_disabled2 && filter) {\n _disabled2 = filter.call($element, _date, 'day') === false;\n }\n var _picked = viewYear === year && viewMonth === month && i === day;\n var view = _picked ? 'day picked' : 'day';\n items.push(this.createItem({\n disabled: _disabled2,\n picked: _picked,\n highlighted: viewYear === thisYear && viewMonth === thisMonth && _date.getDate() === thisDay,\n text: i,\n view: _disabled2 ? 'day disabled' : view\n }));\n } // Render days picker\n // -----------------------------------------------------------------------\n\n this.$monthPrev.toggleClass(disabledClass, prevDisabled);\n this.$monthNext.toggleClass(disabledClass, nextDisabled);\n this.$monthCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(options.yearFirst ? \"\".concat(viewYear + yearSuffix, \" \").concat(months[viewMonth]) : \"\".concat(months[viewMonth], \" \").concat(viewYear).concat(yearSuffix));\n this.$days.html(prevItems.join('') + items.join('') + nextItems.join(''));\n }\n };\n var CLASS_TOP_LEFT = \"\".concat(NAMESPACE, \"-top-left\");\n var CLASS_TOP_RIGHT = \"\".concat(NAMESPACE, \"-top-right\");\n var CLASS_BOTTOM_LEFT = \"\".concat(NAMESPACE, \"-bottom-left\");\n var CLASS_BOTTOM_RIGHT = \"\".concat(NAMESPACE, \"-bottom-right\");\n var CLASS_PLACEMENTS = [CLASS_TOP_LEFT, CLASS_TOP_RIGHT, CLASS_BOTTOM_LEFT, CLASS_BOTTOM_RIGHT].join(' ');\n var Datepicker = /*#__PURE__*/function () {\n function Datepicker(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n _classCallCheck(this, Datepicker);\n this.$element = $(element);\n this.element = element;\n this.options = $.extend({}, DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options);\n this.$scrollParent = getScrollParent(element, true);\n this.built = false;\n this.shown = false;\n this.isInput = false;\n this.inline = false;\n this.initialValue = '';\n this.initialDate = null;\n this.startDate = null;\n this.endDate = null;\n this.init();\n }\n _createClass(Datepicker, [{\n key: \"init\",\n value: function init(
23) {\n var $this = this.$element,\n options = this.options;\n var startDate = options.startDate,\n endDate = options.endDate,\n date = options.date;\n this.$trigger = $(options.trigger);\n this.isInput = $this.is('input') || $this.is('textarea');\n this.inline = options.inline && (options.container || !this.isInput);\n this.format = parseFormat(options.format);\n var initialValue = this.getValue();\n this.initialValue = initialValue;\n this.oldValue = initialValue;\n date = this.parseDate(date || initialValue);\n if (startDate) {\n startDate = this.parseDate(startDate);\n if (date.getTime() < startDate.getTime()) {\n date = new Date(startDate);\n }\n this.startDate = startDate;\n }\n if (endDate) {\n endDate = this.parseDate(endDate);\n if (startDate && endDate.getTime() < startDate.getTime()) {\n endDate = new Date(startDate);\n }\n if (date.getTime() > endDate.getTime()) {\n date = new Date(endDate);\n }\n this.endDate = endDate;\n }\n this.date = date;\n this.viewDate = new Date(date);\n this.initialDate = new Date(this.date);\n this.bind();\n if (options.autoShow || this.inline) {\n this.show();\n }\n if (options.autoPick) {\n this.pick();\n }\n }\n }, {\n key: \"build\",\n value: function build() {\n if (this.built) {\n return;\n }\n this.built = true;\n var $this = this.$element,\n options = this.options;\n var $picker = $(options.template);\n this.$picker = $picker;\n this.$week = $picker.find(selectorOf('week')); // Years view\n\n this.$yearsPicker = $picker.find(selectorOf('years picker'));\n this.$yearsPrev = $picker.find(selectorOf('years prev'));\n this.$yearsNext = $picker.find(selectorOf('years next'));\n this.$yearsCurrent = $picker.find(selectorOf('years current'));\n this.$years = $picker.find(selectorOf('years')); // Months view\n\n this.$monthsPicker = $picker.find(selectorOf('months picker'));\n this.$yearPrev = $picker.find(selectorOf('year prev'));\n this.$yearNext = $picker.find(selectorOf('year next'));\n this.$yearCurrent = $picker.find(selectorOf('year current'));\n this.$months = $picker.find(selectorOf('months')); // Days view\n\n this.$daysPicker = $picker.find(selectorOf('days picker'));\n this.$monthPrev = $picker.find(selectorOf('month prev'));\n this.$monthNext = $picker.find(selectorOf('month next'));\n this.$monthCurrent = $picker.find(selectorOf('month current'));\n this.$days = $picker.find(selectorOf('days'));\n if (this.inline) {\n $(options.container || $this).append($picker.addClass(\"\".concat(NAMESPACE, \"-inline\")));\n } else {\n $(document.body).append($picker.addClass(\"\".concat(NAMESPACE, \"-dropdown\")));\n $picker.addClass(CLASS_HIDE).css({\n zIndex: parseInt(options.zIndex, 10)\n });\n }\n this.renderWeek();\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.built) {\n return;\n }\n this.built = false;\n this.$picker.remove();\n }\n }, {\n key: \"bind\",\n value: function bind() {\n var options = this.options,\n $this = this.$element;\n if ($.isFunction(options.show)) {\n $this.on(EVENT_SHOW, options.show);\n }\n if ($.isFunction(options.hide)) {\n $this.on(EVENT_HIDE, options.hide);\n }\n if ($.isFunction(options.pick)) {\n $this.on(EVENT_PICK, options.pick);\n }\n if (this.isInput) {\n $this.on(EVENT_KEYUP, $.proxy(this.keyup, this));\n }
23\n if (!this.inline) {\n if (options.trigger) {\n this.$trigger.on(EVENT_CLICK, $.proxy(this.toggle, this));\n } else if (this.isInput) {\n $this.on(EVENT_FOCUS, $.proxy(this.show, this));\n } else {\n $this.on(EVENT_CLICK, $.proxy(this.show, this));\n }\n }\n }\n }, {\n key: \"unbind\",\n value: function unbind() {\n var $this = this.$element,\n options = this.options;\n if ($.isFunction(options.show)) {\n $this.off(EVENT_SHOW, options.show);\n }\n if ($.isFunction(options.hide)) {\n $this.off(EVENT_HIDE, options.hide);\n }\n if ($.isFunction(options.pick)) {\n $this.off(EVENT_PICK, options.pick);\n }\n if (this.isInput) {\n $this.off(EVENT_KEYUP, this.keyup);\n }\n if (!this.inline) {\n if (options.trigger) {\n this.$trigger.off(EVENT_CLICK, this.toggle);\n } else if (this.isInput) {\n $this.off(EVENT_FOCUS, this.show);\n } else {\n $this.off(EVENT_CLICK, this.show);\n }\n }\n }\n }, {\n key: \"showView\",\n value: function showView(view) {\n var $yearsPicker = this.$yearsPicker,\n $monthsPicker = this.$monthsPicker,\n $daysPicker = this.$daysPicker,\n format = this.format;\n if (format.hasYear || format.hasMonth || format.hasDay) {\n switch (Number(view)) {\n case VIEWS.YEARS:\n $monthsPicker.addClass(CLASS_HIDE);\n $daysPicker.addClass(CLASS_HIDE);\n if (format.hasYear) {\n this.renderYears();\n $yearsPicker.removeClass(CLASS_HIDE);\n this.place();\n } else {\n this.showView(VIEWS.DAYS);\n }\n break;\n case VIEWS.MONTHS:\n $yearsPicker.addClass(CLASS_HIDE);\n $daysPicker.addClass(CLASS_HIDE);\n if (format.hasMonth) {\n this.renderMonths();\n $monthsPicker.removeClass(CLASS_HIDE);\n this.place();\n } else {\n this.showView(VIEWS.YEARS);\n }\n break;\n // case VIEWS.DAYS:\n\n default:\n $yearsPicker.addClass(CLASS_HIDE);\n $monthsPicker.addClass(CLASS_HIDE);\n if (format.hasDay) {\n this.renderDays();\n $daysPicker.removeClass(CLASS_HIDE);\n this.place();\n } else {\n this.showView(VIEWS.MONTHS);\n }\n }\n }\n }\n }, {\n key: \"hideView\",\n value: function hideView() {\n if (!this.inl
23ine && this.options.autoHide) {\n this.hide();\n }\n }\n }, {\n key: \"place\",\n value: function place() {\n if (this.inline) {\n return;\n }\n var $this = this.$element,\n options = this.options,\n $picker = this.$picker;\n var containerWidth = $(document).outerWidth();\n var containerHeight = $(document).outerHeight();\n var elementWidth = $this.outerWidth();\n var elementHeight = $this.outerHeight();\n var width = $picker.width();\n var height = $picker.height();\n var _$this$offset = $this.offset(),\n left = _$this$offset.left,\n top = _$this$offset.top;\n var offset = parseFloat(options.offset);\n var placement = CLASS_TOP_LEFT;\n if (isNaN(offset)) {\n offset = 10;\n }\n if (top > height && top + elementHeight + height > containerHeight) {\n top -= height + offset;\n placement = CLASS_BOTTOM_LEFT;\n } else {\n top += elementHeight + offset;\n }\n if (left + width > containerWidth) {\n left += elementWidth - width;\n placement = placement.replace('left', 'right');\n }\n $picker.removeClass(CLASS_PLACEMENTS).addClass(placement).css({\n top: top,\n left: left\n });\n } // A shortcut for triggering custom events\n }, {\n key: \"trigger\",\n value: function trigger(type, data) {\n var e = $.Event(type, data);\n this.$element.trigger(e);\n return e;\n }\n }, {\n key: \"createItem\",\n value: function createItem(data) {\n var options = this.options;\n var itemTag = options.itemTag;\n var item = {\n text: '',\n view: '',\n muted: false,\n picked: false,\n disabled: false,\n highlighted: false\n };\n var classes = [];\n $.extend(item, data);\n if (item.muted) {\n classes.push(options.mutedClass);\n }\n if (item.highlighted) {\n classes.push(options.highlightedClass);\n }\n if (item.picked) {\n classes.push(options.pickedClass);\n }\n if (item.disabled) {\n classes.push(options.disabledClass);\n }\n return \"<\".concat(itemTag, \" class=\\\"\").concat(classes.join(' '), \"\\\" data-view=\\\"\").concat(item.view, \"\\\">\").concat(item.text, \"</\").concat(itemTag, \">\");\n }\n }, {\n key: \"getValue\",\n value: function getValue() {\n var $this = this.$element;\n return this.isInput ? $this.val() : $this.text();\n }\n }, {\n key: \"setValue\",\n value: function setValue() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var $this = this.$element;\n if (this.isInput) {\n $this.val(value);\n }
23 else if (!this.inline || this.options.container) {\n $this.text(value);\n }\n }\n }], [{\n key: \"setDefaults\",\n value: function setDefaults() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n $.extend(DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options);\n }\n }]);\n return Datepicker;\n }();\n if ($.extend) {\n $.extend(Datepicker.prototype, render, handlers, methods);\n }\n if ($.fn) {\n var AnotherDatepicker = $.fn.datepicker;\n $.fn.datepicker = function jQueryDatepicker(option) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result;\n this.each(function (i, element) {\n var $element = $(element);\n var isDestroy = option === 'destroy';\n var datepicker = $element.data(NAMESPACE);\n if (!datepicker) {\n if (isDestroy) {\n return;\n }\n var options = $.extend({}, $element.data(), $.isPlainObject(option) && option);\n datepicker = new Datepicker(element, options);\n $element.data(NAMESPACE, datepicker);\n }\n if (isString(option)) {\n var fn = datepicker[option];\n if ($.isFunction(fn)) {\n result = fn.apply(datepicker, args);\n if (isDestroy) {\n $element.removeData(NAMESPACE);\n }\n }\n }\n });\n return !isUndefined(result) ? result : this;\n };\n $.fn.datepicker.Constructor = Datepicker;\n $.fn.datepicker.languages = LANGUAGES;\n $.fn.datepicker.setDefaults = Datepicker.setDefaults;\n $.fn.datepicker.noConflict = function noConflict() {\n $.fn.datepicker = AnotherDatepicker;\n return this;\n };\n }\n});\n\n//# sourceURL=webpack://umbracoframework/./frontend/src/scripts/plugins/datepicker.js?"); 24 25/***/ }), 26 27/***/ 421: 28/***/ ((module, exports, __webpack_require__) => { 29 30eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Unobtrusive validation support library for jQuery and jQuery Validate\r\n// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n// @version v3.2.12\r\n\r\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\r\n/*global document: false, jQuery: false */\r\n\r\n(function (factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module.\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(960)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(function ($) {\r\n var $jQval = $.validator,\r\n adapters,\r\n data_validation = \"unobtrusiveValidation\";\r\n\r\n function setValidationValues(options, ruleName, value) {\r\n options.rules[ruleName] = value;\r\n if (options.message) {\r\n options.messages[ruleName] = options.message;\r\n }\r\n }\r\n\r\n function splitAndTrim(value) {\r\n return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\r\n }\r\n\r\n function escapeAttributeValue(value) {\r\n // As mentioned on http://api.jquery.com/category/selectors/\r\n return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\r\n }\r\n\r\n function getModelPrefix(fieldName) {\r\n return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\r\n }\r\n\r\n function appendModelPrefix(value, prefix) {\r\n if (value.indexOf(\"*.\") === 0) {\r\n value = value.replace(\"*.\", prefix);\r\n }\r\n return value;\r\n }\r\n\r\n function onError(error, inputElement) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\r\n replaceAttrValue = container.attr(\"data-valmsg-replace\"),\r\n replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\r\n\r\n container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\r\n error.data(\"unobtrusiveContainer\", container);\r\n\r\n if (replace) {\r\n container.empty();\r\n error.removeClass(\"input-validation-error\").appendTo(container);\r\n }\r\n else {\r\n error.hide();\r\n }\r\n }\r\n\r\n function onErrors(event, validator) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-summary=true]\"),\r\n list = container.find(\"ul\");\r\n\r\n if (list && list.length && validator.errorList.length) {\r\n list.empty();\r\n container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\r\n\r\n $.each(validator.errorList, function () {\r\n $(\"<li />
30\").html(this.message).appendTo(list);\r\n });\r\n }\r\n }\r\n\r\n function onSuccess(error) { // 'this' is the form element\r\n var container = error.data(\"unobtrusiveContainer\");\r\n\r\n if (container) {\r\n var replaceAttrValue = container.attr(\"data-valmsg-replace\"),\r\n replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\r\n\r\n container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\r\n error.removeData(\"unobtrusiveContainer\");\r\n\r\n if (replace) {\r\n container.empty();\r\n }\r\n }\r\n }\r\n\r\n function onReset(event) { // 'this' is the form element\r\n var $form = $(this),\r\n key = '__jquery_unobtrusive_validation_form_reset';\r\n if ($form.data(key)) {\r\n return;\r\n }\r\n // Set a flag that indicates we're currently resetting the form.\r\n $form.data(key, true);\r\n try {\r\n $form.data(\"validator\").resetForm();\r\n } finally {\r\n $form.removeData(key);\r\n }\r\n\r\n $form.find(\".validation-summary-errors\")\r\n .addClass(\"validation-summary-valid\")\r\n .removeClass(\"validation-summary-errors\");\r\n $form.find(\".field-validation-error\")\r\n .addClass(\"field-validation-valid\")\r\n .removeClass(\"field-validation-error\")\r\n .removeData(\"unobtrusiveContainer\")\r\n .find(\">*\") // If we were using valmsg-replace, get the underlying error\r\n .removeData(\"unobtrusiveContainer\");\r\n }\r\n\r\n function validationInfo(form) {\r\n var $form = $(form),\r\n result = $form.data(data_validation),\r\n onResetProxy = $.proxy(onReset, form),\r\n defaultOptions = $jQval.unobtrusive.options || {},\r\n execInContext = function (name, args) {\r\n var func = defaultOptions[name];\r\n func && $.isFunction(func) && func.apply(form, args);\r\n };\r\n\r\n if (!result) {\r\n result = {\r\n options: { // options structure passed to jQuery Validate's validate() method\r\n errorClass: defaultOptions.errorClass || \"input-validation-error\",\r\n errorElement: defaultOptions.errorElement || \"span\",\r\n errorPlacement: function () {\r\n onError.apply(form, arguments);\r\n execInContext(\"errorPlacement\", arguments);\r\n },\r\n invalidHandler: function () {\r\n onErrors.apply(form, arguments);\r\n execInContext(\"invalidHandler\", arguments);\r\n },\r\n messages: {},\r\n rules: {},\r\n success: function () {\r\n onSuccess.apply(form, arguments);\r\n execInContext(\"success\", arguments);\r\n }\r\n },\r\n attachValidation: function () {\r\n $form\r\n .off(\"reset.\" + data_validation, onResetProxy)\r\n .on(\"reset.\" + data_validation, onResetProxy)\r\n .validate(this.options);\r\n },\r\n validate: function () { // a validation function that is called by unobtrusive Ajax\r\n $form.validate();\r\n return $form.valid();\r\n }\r\n };\r\n $form.data(data_validation, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n $jQval.unobtrusive = {\r\n adapters: [],\r\n\r\n parseElement: function (element, skipAttach) {\r\n /// <summary>\r\n /// Parses a single HTML element for unobtrusive validation attributes.\r\n /// </summary>\r\n /// <param name=\"element\" domElement=\"true\">The HTML element to be parsed.</param>\r\n /// <param name=\"skipAttach\" type=\"Boolean\">[Optional] true to skip attaching the\r\n /// validation to the form. If parsing just this single element, you should specify true.\r\n /// If parsing several elements, you should specify false, and manually attach the validation\r\n /// to the form when you are finished. The default is false.</param>\r\n var $element = $(element),\r\n form = $element.parents(\"form\")[0],\r\n valInfo, rules, messages;\r\n\r\n if (!form) { // Cannot do client-side validation without a form\r\n return;\r\n }\r\n\r\n valInfo = validationInfo(form);\r\n valInfo.options.rules[element.name] = rules = {};\r\n valInfo.options.messages[element.name] = messages = {};\r\n\r\n $.each(this.adapters, function () {\r\n var prefix = \"data-val-\" + this.name,\r\n message = $element.attr(prefix),\r\n paramValues = {};\r\n\r\n if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)\r\n prefix += \"-\";\r\n\r\n $.each(this.params, function () {\r\n paramValues[this] = $element.attr(prefix + this);\r\n });\r\n\r\n this.adapt({\r\n element: element,\r\n form: form,\r\n message: message,\r\n params: paramValues,\r\n rules: rules,\r\n messages: messages\r\n });\r\n }\r\n });\r\n\r\n $.extend(rules, { \"__dummy__\": true });\r\n\r\n if (!skipAttach) {\r\n valInfo.attachValidation();\r\n }\r\n },\r\n\r\n parse: function (selector) {\r\n /// <summary>\r\n /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\r\n /// with the [data-val=true] attribute value and enables validation according to the data-val-*\r\n /// attribute values.\r\n /// </summary>\r\n /// <param name=\"selector\" type=\"String\">Any valid jQuery selector.</param>\r\n\r\n // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\r\n // element with data-val=true\r\n var $selector = $(selector),\r\n $forms = $selector.parents()\r\n .addBack()\r\n .filter(\"form\")\r\n .add($selector.find(\"form\"))\r\n .has(\"[data-val=true]\");\r\n\r\n $selector.find(\"[data-val=true]\").each(function () {\r\n $jQval.unobtrusive.parseElement(this, true);\r\n });\r\n\r\n $forms.each(function () {\r\n var info = validationInfo(this);\r\n if (info) {\r\n info.attachValidation();\r\n }\r\n });\r\n }\r\n };\r\n\r\n adapters = $jQval.unobtrusive.adapters;\r\n\r\n adapters.add = function (adapterName, params, fn) {\r\n /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>\r\n /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\r\n /// <param name=\"params\" type=\"Array\" optional=\"true\">[Optional] An array of parameter names (strings) that will\r\n /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\r\n /// mmmm is the parameter name).</param>\r\n /// <param name=\"fn\" type=\"Function\">The function to call, which adapts the values from the HTML\r\n /// attributes into jQuery Validate rules and/or messages.</param>\r\n /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\r\n if (!fn) { // Called with no params, just a function\r\n fn = params;\r\n params = [];\r\n }\r\n this.push({ name: adapterName, params: params, adapt: fn });\r\n return this;\r\n };\r\n\r\n adapters.addBool = function (adapterName, ruleName) {\r\n /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has no parameter values.</summary>\r\n /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\r\n /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.</param>\r\n /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\r\n return this.add(adapterName, function (options) {\r\n setValidationValues(options, ruleName || adapterName, true);\r\n });\r\n };\r\n\r\n adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\r\n /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\r\n /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>\r\n /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\r\n /// <param name=\"minRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\r\n /// have a minimum value.</param>\r\n /// <param name=\"maxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\r\n /// have a maximum value.</param>\r\n /// <param name=\"minMaxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you\r\n /// have both a minimum and maximum value.</param>\r\n /// <param name=\"minAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\r\n /// contains the minimum value. The default is \"min\".</param>\r\n /// <param name=\"maxAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\r\n /// contains the maximum value. The default is \"max\".</param>\r\n /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\r\n return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\r\n var min = options.params.min,\r\n max = options.params.max;\r\n\r\n if (min && max) {\r\n setValidationValues(options, minMaxRuleName, [min, max]);\r\n }\r\n else if (min) {\r\n setValidationValues(options, minRuleName, min);\r\n }\r\n else if (max) {\r\n setValidationValues(options, maxRuleName, max);\r\n }\r\n });\r\n };\r\n\r\n adapters.addSingleVal = function (adapterName, attribute, ruleName) {\r\n /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has a single value.</summary>\r\n /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>\r\n /// <param name=\"attribute\" type=\"String\">[Optional] The name of the HTML attribute that contains the value.\r\n /// The default is \"val\".</param>\r\n /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.</param>\r\n /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\r\n return this.add(adapterName, [attribute || \"val\"], function (options) {\r\n setValidationValues(options, ruleName || adapterName, options.params[attribute]);\r\n });\r\n };\r\n\r\n $jQval.addMethod(\"__dummy__\", function (value, element, params) {\r\n return true;\r\n });\r\n\r\n $jQval.addMethod(\"regex\", function (value, element, params) {\r\n var match;\r\n if (this.optional(element)) {\r\n return true;\r\n }\r\n\r\n match = new RegExp(params).exec(value);\r\n return (match && (match.index === 0) && (match[0].length === value.length));\r\n });\r\n\r\n $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\r\n var match;\r\n if (nonalphamin) {\r\n match = value.match(/\\W/g);\r\n match = match && match.length >= nonalphamin;\r\n }\r\n return match;\r\n });\r\n\r\n if ($jQval.methods.extension) {\r\n adapters.addSingleVal(\"accept\", \"mimtype\");\r\n adapters.addSingleVal(\"extension\", \"extension\");\r\n } else {\r\n // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\r\n // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\r\n // validating the extension, and ignore mime-type validations as they are not supported.\r\n adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\r\n }\r\n\r\n adapters.addSingleVal(\"regex\", \"pattern\");\r\n adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\r\n adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\r\n adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\r\n adapters.add(\"equalto\", [\"other\"], function (options) {\r\n var prefix = getModelPrefix(options.element.name),\r\n other = options.params.other,\r\n fullOtherName = appendModelPrefix(other, prefix),\r\n element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\r\n\r\n setValidationValues(options, \"equalTo\", element);\r\n });\r\n adapters.add(\"required\", function (options) {\r\n // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\r\n if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\r\n setValidationValues(options, \"required\", true);\r\n }\r\n });\r\n adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\r\n var value = {\r\n url: options.params.url,\r\n type: options.params.type || \"GET\",\r\n data: {}\r\n },\r\n prefix = getModelPrefix(options.element.name);\r\n\r\n $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\r\n var paramName = appendModelPrefix(fieldName, prefix);\r\n value.data[paramName] = function () {\r\n var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\r\n // For checkboxes and radio buttons, only pick up values from checked fields.\r\n
30 if (field.is(\":checkbox\")) {\r\n return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\r\n }\r\n else if (field.is(\":radio\")) {\r\n return field.filter(\":checked\").val() || '';\r\n }\r\n return field.val();\r\n };\r\n });\r\n\r\n setValidationValues(options, \"remote\", value);\r\n });\r\n adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\r\n if (options.params.min) {\r\n setValidationValues(options, \"minlength\", options.params.min);\r\n }\r\n if (options.params.nonalphamin) {\r\n setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\r\n }\r\n if (options.params.regex) {\r\n setValidationValues(options, \"regex\", options.params.regex);\r\n }\r\n });\r\n adapters.add(\"fileextensions\", [\"extensions\"], function (options) {\r\n setValidationValues(options, \"extension\", options.params.extensions);\r\n });\r\n\r\n $(function () {\r\n $jQval.unobtrusive.parse(document);\r\n });\r\n\r\n return $jQval.unobtrusive;\r\n}));\r\n\n\n//# sourceURL=webpack://umbracoframework/./node_modules/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js?"); 31 32/***/ }), 33 34/***/ 960: 35/***/ ((module, exports, __webpack_require__) => { 36 37eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery Validation Plugin v1.21.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2024 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( true ) {\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(669)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t// - A user defined a `submitHandler`\n\t\t\t\t\t// - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t// was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pen
37dingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && isContentEditable ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\nvar trim = function( str ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n};\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\
37n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tcustomElements: [],\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift => 16\n\t\t\t// Ctrl => 17\n\t\t\t// Alt => 18\n\t\t\t// Caps lock => 20\n\t\t\t// End => 35\n\t\t\t// Home => 36\n\t\t\t// Left arrow => 37\n\t\t\t// Up arrow => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow => 40\n\t\t\t// Insert => 45\n\t\t\t// Num lock => 144\n\t\t\t// AltGr key => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\
37n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar currentForm = this.currentForm,\n\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar focusListeners = [ \":text\", \"[type='password']\", \"[type='file']\", \"select\", \"textarea\", \"[type='number']\", \"[type='search']\",\n\t\t\t\t\t\t\t\t\"[type='tel']\", \"[type='url']\", \"[type='email']\", \"[type='datetime']\", \"[type='date']\", \"[type='month']\",\n\t\t\t\t\t\t\t\t\"[type='week']\", \"[type='time']\", \"[type='datetime-local']\", \"[type='range']\", \"[type='color']\",\n\t\t\t\t\t\t\t\t\"[type='radio']\", \"[type='checkbox']\", \"[contenteditable]\", \"[type='button']\" ];\n\t\t\tvar clickListeners = [ \"select\", \"option\", \"[type='radio']\", \"[type='checkbox']\" ];\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\", focusListeners.concat( this.settings.customElements ).join( \", \" ), delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", clickListeners.concat( this.settings.customElements ).join( \", \" ), delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invali
37d-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\
37n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.trigger( \"focus\" )\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focu
37sing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {},\n\t\t\t\tselectors = [ \"input\", \"select\", \"textarea\", \"[contenteditable]\" ];\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( selectors.concat( this.settings.customElements ).join( \", \" ) )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( isContentEditable ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;
37\n\n\t\t\t// Abort any pending Ajax request from a previous call to this method.\n\t\t\tthis.abortRequest( element );\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \". Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t// method: \"method name\",\n\t\t// parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;
37\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass );\n\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\tif ( string === undefined ) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.i
37d || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\telementAjaxPort: function( element ) {\n\t\t\treturn \"validate\" + element.name;\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {\n\t\t\t\t$( this.currentForm ).trigger( \"submit\" );\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tabortRequest: function( element ) {\n\t\t\tvar port;\n\n\t\t\tif ( this.pending[ element.name ] ) {\n\t\t\t\tport = this.elementAjaxPort( element );\n\t\t\t\t$.ajaxAbort( port );\n\n\t\t\t\tthis.pendingRequest--;\n\n\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t}\n\n\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\
37n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ type === \"date\" ? \"dateISO\" : method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\n\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = true;\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\
37n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?
37:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: ( function() {\n\t\t\tvar called = false;\n\n\t\t\treturn function( value, element ) {\n\t\t\t\tif ( !called ) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t};\n\t\t}() ),\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:-?\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\
37n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.valid !== null && previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tprevious.valid = null;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: this.elementAjaxPort( element ),\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// $.ajaxAbort( port );\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n// Abort the previous request without sending a new one\n$.ajaxAbort = function( port ) {\n\tif ( pendingRequests[ port ] ) {\n\t\tpendingRequests[ port ].abort();
37\n\t\tdelete pendingRequests[ port ];\n\t}\n};\nreturn $;\n}));\n\n//# sourceURL=webpack://umbracoframework/./node_modules/jquery-validation/dist/jquery.validate.js?"); 38 39/***/ }), 40 41/***/ 830: 42/***/ (() => { 43 44"use strict"; 45eval("// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://umbracoframework/./frontend/src/scss/component.scss?"); 46 47/***/ }), 48 49/***/ 764: 50/***/ (() => { 51 52eval("/**\n * Owl Carousel v2.3.4\n * Copyright 2013-2018 David Deutsch\n * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE\n */\n/**\n * Owl carousel\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n * @todo Lazy Load Icon\n * @todo prevent animationend bubling\n * @todo itemsScaleUp\n * @todo Test Zepto\n * @todo stagePadding calculate wrong active classes\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates a carousel.\n\t * @class The Owl Carousel.\n\t * @public\n\t * @param {HTMLElement|jQuery} element - The element to create the carousel for.\n\t * @param {Object} [options] - The options\n\t */\n\tfunction Owl(element, options) {\n\n\t\t/**\n\t\t * Current settings for the carousel.\n\t\t * @public\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * Current options set by the caller including defaults.\n\t\t * @public\n\t\t */\n\t\tthis.options = $.extend({}, Owl.Defaults, options);\n\n\t\t/**\n\t\t * Plugin element.\n\t\t * @public\n\t\t */\n\t\tthis.$element = $(element);\n\n\t\t/**\n\t\t * Proxied event handlers.\n\t\t * @protected\n\t\t */\n\t\tthis._handlers = {};\n\n\t\t/**\n\t\t * References to the running plugins of this carousel.\n\t\t * @protected\n\t\t */\n\t\tthis._plugins = {};\n\n\t\t/**\n\t\t * Currently suppressed events to prevent them from being retriggered.\n\t\t * @protected\n\t\t */\n\t\tthis._supress = {};\n\n\t\t/**\n\t\t * Absolute current position.\n\t\t * @protected\n\t\t */\n\t\tthis._current = null;\n\n\t\t/**\n\t\t * Animation speed in milliseconds.\n\t\t * @protected\n\t\t */\n\t\tthis._speed = null;\n\n\t\t/**\n\t\t * Coordinates of all items in pixel.\n\t\t * @todo The name of this member is missleading.\n\t\t * @protected\n\t\t */\n\t\tthis._coordinates = [];\n\n\t\t/**\n\t\t * Current breakpoint.\n\t\t * @todo Real media queries would be nice.\n\t\t * @protected\n\t\t */\n\t\tthis._breakpoint = null;\n\n\t\t/**\n\t\t * Current width of the plugin element.\n\t\t */\n\t\tthis._width = null;\n\n\t\t/**\n\t\t * All real items.\n\t\t * @protected\n\t\t */\n\t\tthis._items = [];\n\n\t\t/**\n\t\t * All cloned items.\n\t\t * @protected\n\t\t */\n\t\tthis._clones = [];\n\n\t\t/**\n\t\t * Merge values of all items.\n\t\t * @todo Maybe this could be part of a plugin.\n\t\t * @protected\n\t\t */\n\t\tthis._mergers = [];\n\n\t\t/**\n\t\t * Widths of all items.\n\t\t */\n\t\tthis._widths = [];\n\n\t\t/**\n\t\t * Invalidated parts within the update process.\n\t\t * @protected\n\t\t */\n\t\tthis._invalidated = {};\n\n\t\t/**\n\t\t * Ordered list of workers for the update process.\n\t\t * @protected\n\t\t */\n\t\tthis._pipe = [];\n\n\t\t/**\n\t\t * Current state information for the drag operation.\n\t\t * @todo #261\n\t\t * @protected\n\t\t */\n\t\tthis._drag = {\n\t\t\ttime: null,\n\t\t\ttarget: null,\n\t\t\tpointer: null,\n\t\t\tstage: {\n\t\t\t\tstart: null,\n\t\t\t\tcurrent: null\n\t\t\t},\n\t\t\tdirection: null\n\t\t};\n\n\t\t/**\n\t\t * Current state information and their tags.\n\t\t * @type {Object}\n\t\t * @protected\n\t\t */\n\t\tthis._states = {\n\t\t\tcurrent: {},\n\t\t\ttags: {\n\t\t\t\t'initializing': [ 'busy' ],\n\t\t\t\t'animating': [ 'busy' ],\n\t\t\t\t'dragging': [ 'interacting' ]\n\t\t\t}\n\t\t};\n\n\t\t$.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {\n\t\t\tthis._handlers[handler] = $.proxy(this[handler], this);\n\t\t}, this));\n\n\t\t$.each(Owl.Plugins, $.proxy(function(key, plugin) {\n\t\t\tthis._plugins[key.charAt(0).toLowerCase() + key.slice(1)]\n\t\t\t\t= new plugin(this);\n\t\t}, this));\n\n\t\t$.each(Owl.Workers, $.proxy(function(priority, worker) {\n\t\t\tthis._pipe.push({\n\t\t\t\t'filter': worker.filter,\n\t\t\t\t'run': $.proxy(worker.run, this)\n\t\t\t});\n\t\t}, this));\n\n\t\tthis.setup();\n\t\tthis.initialize();\n\t}\n\n\t/**\n\t * Default options for the carousel.\n\t * @public\n\t */\n\tOwl.Defaults = {\n\t\titems: 3,\n\t\tloop: false,\n\t\tcenter: false,\n\t\trewind: false,\n\t\tcheckVisibility: true,\n\n\t\tmouseDrag: true,\n\t\ttouchDrag: true,\n\t\tpullDrag: true,\n\t\tfreeDrag: false,\n\n\t\tmargin: 0,\n\t\tstagePadding: 0,\n\n\t\tmerge: false,\n\t\tmergeFit: true,\n\t\tautoWidth: false,\n\n\t\tstartPosition: 0,\n\t\trtl: false,\n\n\t\tsmartSpeed: 250,\n\t\tfluidSpeed: false,\n\t\tdragEndSpeed: false,\n\n\t\tresponsive: {},\n\t\tresponsiveRefreshRate: 200,\n\t\tresponsiveBaseElement: window,\n\n\t\tfallbackEasing: 'swing',\n\t\tslideTransition: '',\n\n\t\tinfo: false,\n\n\t\tnestedItemSelector: false,\n\t\titemElement: 'div',\n\t\tstageElement: 'div',\n\n\t\trefreshClass: 'owl-refresh',\n\t\tloadedClass: 'owl-loaded',\n\t\tloadingClass: 'owl-loading',\n\t\trtlClass: 'owl-rtl',\n\t\tresponsiveClass: 'owl-responsive',\n\t\tdragClass: 'owl-drag',\n\t\titemClass: 'owl-item',\n\t\tstageClass: 'owl-stage',\n\t\tstageOuterClass: 'owl-stage-outer',\n\t\tgrabClass: 'owl-grab'\n\t};\n\n\t/**\n\t * Enumeration for width.\n\t * @public\n\t * @readonly\n\t * @enum {String}\n\t */\n\tOwl.Width = {\n\t\tDefault: 'default',\n\t\tInner: 'inner',\n\t\tOuter: 'outer'\n\t};\n\n\t/**\n\t * Enumeration for types.\n\t * @public\n\t * @readonly\n\t * @enum {String}
52\n\t */\n\tOwl.Type = {\n\t\tEvent: 'event',\n\t\tState: 'state'\n\t};\n\n\t/**\n\t * Contains all registered plugins.\n\t * @public\n\t */\n\tOwl.Plugins = {};\n\n\t/**\n\t * List of workers involved in the update process.\n\t */\n\tOwl.Workers = [ {\n\t\tfilter: [ 'width', 'settings' ],\n\t\trun: function() {\n\t\t\tthis._width = this.$element.width();\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function(cache) {\n\t\t\tcache.current = this._items && this._items[this.relative(this._current)];\n\t\t}\n\t}, {\n\t\tfilter: [ 'items', 'settings' ],\n\t\trun: function() {\n\t\t\tthis.$stage.children('.cloned').remove();\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function(cache) {\n\t\t\tvar margin = this.settings.margin || '',\n\t\t\t\tgrid = !this.settings.autoWidth,\n\t\t\t\trtl = this.settings.rtl,\n\t\t\t\tcss = {\n\t\t\t\t\t'width': 'auto',\n\t\t\t\t\t'margin-left': rtl ? margin : '',\n\t\t\t\t\t'margin-right': rtl ? '' : margin\n\t\t\t\t};\n\n\t\t\t!grid && this.$stage.children().css(css);\n\n\t\t\tcache.css = css;\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function(cache) {\n\t\t\tvar width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,\n\t\t\t\tmerge = null,\n\t\t\t\titerator = this._items.length,\n\t\t\t\tgrid = !this.settings.autoWidth,\n\t\t\t\twidths = [];\n\n\t\t\tcache.items = {\n\t\t\t\tmerge: false,\n\t\t\t\twidth: width\n\t\t\t};\n\n\t\t\twhile (iterator--) {\n\t\t\t\tmerge = this._mergers[iterator];\n\t\t\t\tmerge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;\n\n\t\t\t\tcache.items.merge = merge > 1 || cache.items.merge;\n\n\t\t\t\twidths[iterator] = !grid ? this._items[iterator].width() : width * merge;\n\t\t\t}\n\n\t\t\tthis._widths = widths;\n\t\t}\n\t}, {\n\t\tfilter: [ 'items', 'settings' ],\n\t\trun: function() {\n\t\t\tvar clones = [],\n\t\t\t\titems = this._items,\n\t\t\t\tsettings = this.settings,\n\t\t\t\t// TODO: Should be computed from number of min width items in stage\n\t\t\t\tview = Math.max(settings.items * 2, 4),\n\t\t\t\tsize = Math.ceil(items.length / 2) * 2,\n\t\t\t\trepeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,\n\t\t\t\tappend = '',\n\t\t\t\tprepe
52nd = '';\n\n\t\t\trepeat /= 2;\n\n\t\t\twhile (repeat > 0) {\n\t\t\t\t// Switch to only using appended clones\n\t\t\t\tclones.push(this.normalize(clones.length / 2, true));\n\t\t\t\tappend = append + items[clones[clones.length - 1]][0].outerHTML;\n\t\t\t\tclones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));\n\t\t\t\tprepend = items[clones[clones.length - 1]][0].outerHTML + prepend;\n\t\t\t\trepeat -= 1;\n\t\t\t}\n\n\t\t\tthis._clones = clones;\n\n\t\t\t$(append).addClass('cloned').appendTo(this.$stage);\n\t\t\t$(prepend).addClass('cloned').prependTo(this.$stage);\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function() {\n\t\t\tvar rtl = this.settings.rtl ? 1 : -1,\n\t\t\t\tsize = this._clones.length + this._items.length,\n\t\t\t\titerator = -1,\n\t\t\t\tprevious = 0,\n\t\t\t\tcurrent = 0,\n\t\t\t\tcoordinates = [];\n\n\t\t\twhile (++iterator < size) {\n\t\t\t\tprevious = coordinates[iterator - 1] || 0;\n\t\t\t\tcurrent = this._widths[this.relative(iterator)] + this.settings.margin;\n\t\t\t\tcoordinates.push(previous + current * rtl);\n\t\t\t}\n\n\t\t\tthis._coordinates = coordinates;\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function() {\n\t\t\tvar padding = this.settings.stagePadding,\n\t\t\t\tcoordinates = this._coordinates,\n\t\t\t\tcss = {\n\t\t\t\t\t'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,\n\t\t\t\t\t'padding-left': padding || '',\n\t\t\t\t\t'padding-right': padding || ''\n\t\t\t\t};\n\n\t\t\tthis.$stage.css(css);\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function(cache) {\n\t\t\tvar iterator = this._coordinates.length,\n\t\t\t\tgrid = !this.settings.autoWidth,\n\t\t\t\titems = this.$stage.children();\n\n\t\t\tif (grid && cache.items.merge) {\n\t\t\t\twhile (iterator--) {\n\t\t\t\t\tcache.css.width = this._widths[this.relative(iterator)];\n\t\t\t\t\titems.eq(iterator).css(cache.css);\n\t\t\t\t}\n\t\t\t} else if (grid) {\n\t\t\t\tcache.css.width = cache.items.width;\n\t\t\t\titems.css(cache.css);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tfilter: [ 'items' ],\n\t\trun: function() {\n\t\t\tthis._coordinates.length < 1 && this.$stage.removeAttr('style');\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'items', 'settings' ],\n\t\trun: function(cache) {\n\t\t\tcache.current = cache.current ? this.$stage.children().index(cache.current) : 0;\n\t\t\tcache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));\n\t\t\tthis.reset(cache.current);\n\t\t}\n\t}, {\n\t\tfilter: [ 'position' ],\n\t\trun: function() {\n\t\t\tthis.animate(this.coordinates(this._current));\n\t\t}\n\t}, {\n\t\tfilter: [ 'width', 'position', 'items', 'settings' ],\n\t\trun: function() {\n\t\t\tvar rtl = this.settings.rtl ? 1 : -1,\n\t\t\t\tpadding = this.settings.stagePadding * 2,\n\t\t\t\tbegin = this.coordinates(this.current()) + padding,\n\t\t\t\tend = begin + this.width() * rtl,\n\t\t\t\tinner, outer, matches = [], i, n;\n\n\t\t\tfor (i = 0, n = this._coordinates.length; i < n; i++) {\n\t\t\t\tinner = this._coordinates[i - 1] || 0;\n\t\t\t\touter = Math.abs(this._coordinates[i]) + padding * rtl;\n\n\t\t\t\tif ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))\n\t\t\t\t\t|| (this.op(outer, '<', begin) && this.op(outer, '>', end))) {\n\t\t\t\t\tmatches.push(i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$stage.children('.active').removeClass('active');\n\t\t\tthis.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');\n\n\t\t\tthis.$stage.children('.center').removeClass('center');\n\t\t\tif (this.settings.center) {\n\t\t\t\tthis.$stage.children().eq(this.current()).addClass('center');\n\t\t\t}\n\t\t}\n\t} ];\n\n\t/**\n\t * Create the stage DOM element\n\t */\n\tOwl.prototype.initializeStage = function() {\n\t\tthis.$stage = this.$element.find('.' + this.settings.stageClass);\n\n\t\t// if the stage is already in the DOM, grab it and skip stage initialization\n\t\tif (this.$stage.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.$element.addClass(this.options.loadingClass);\n\n\t\t// create stage\n\t\tthis.$stage = $('<' + this.settings.stageElement + '>', {\n\t\t\t\"class\": this.settings.stageClass\n\t\t}).wrap( $( '<div/>', {\n\t\t\t\"class\": this.settings.stageOuterClass\n\t\t}));\n\n\t\t// append stage\n\t\tthis.$element.append(this.$stage.parent());\n\t};\n\n\t/**\n\t * Create item DOM elements\n\t */\n\tOwl.prototype.initializeItems = function() {\
52n\t\tvar $items = this.$element.find('.owl-item');\n\n\t\t// if the items are already in the DOM, grab them and skip item initialization\n\t\tif ($items.length) {\n\t\t\tthis._items = $items.get().map(function(item) {\n\t\t\t\treturn $(item);\n\t\t\t});\n\n\t\t\tthis._mergers = this._items.map(function() {\n\t\t\t\treturn 1;\n\t\t\t});\n\n\t\t\tthis.refresh();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// append content\n\t\tthis.replace(this.$element.children().not(this.$stage.parent()));\n\n\t\t// check visibility\n\t\tif (this.isVisible()) {\n\t\t\t// update view\n\t\t\tthis.refresh();\n\t\t} else {\n\t\t\t// invalidate width\n\t\t\tthis.invalidate('width');\n\t\t}\n\n\t\tthis.$element\n\t\t\t.removeClass(this.options.loadingClass)\n\t\t\t.addClass(this.options.loadedClass);\n\t};\n\n\t/**\n\t * Initializes the carousel.\n\t * @protected\n\t */\n\tOwl.prototype.initialize = function() {\n\t\tthis.enter('initializing');\n\t\tthis.trigger('initialize');\n\n\t\tthis.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);\n\n\t\tif (this.settings.autoWidth && !this.is('pre-loading')) {\n\t\t\tvar imgs, nestedSelector, width;\n\t\t\timgs = this.$element.find('img');\n\t\t\tnestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;\n\t\t\twidth = this.$element.children(nestedSelector).width();\n\n\t\t\tif (imgs.length && width <= 0) {\n\t\t\t\tthis.preloadAutoWidthImages(imgs);\n\t\t\t}\n\t\t}\n\n\t\tthis.initializeStage();\n\t\tthis.initializeItems();\n\n\t\t// register event handlers\n\t\tthis.registerEventHandlers();\n\n\t\tthis.leave('initializing');\n\t\tthis.trigger('initialized');\n\t};\n\n\t/**\n\t * @returns {Boolean} visibility of $element\n\t * if you know the carousel will always be visible you can set `checkVisibility` to `false` to\n\t * prevent the expensive browser layout forced reflow the $element.is(':visible') does\n\t */\n\tOwl.prototype.isVisible = function() {\n\t\treturn this.settings.checkVisibility\n\t\t\t? this.$element.is(':visible')\n\t\t\t: true;\n\t};\n\n\t/**\n\t * Setups the current settings.\n\t * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?\n\t * @todo Support for media queries by using `matchMedia` would be nice.\n\t * @public\n\t */\n\tOwl.prototype.setup = function() {\n\t\tvar viewport = this.viewport(),\n\t\t\toverwrites = this.options.responsive,\n\t\t\tmatch = -1,\n\t\t\tsettings = null;\n\n\t\tif (!overwrites) {\n\t\t\tsettings = $.extend({}, this.options);\n\t\t} else {\n\t\t\t$.each(overwrites, function(breakpoint) {\n\t\t\t\tif (breakpoint <= viewport && breakpoint > match) {\n\t\t\t\t\tmatch = Number(breakpoint);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsettings = $.extend({}, this.options, overwrites[match]);\n\t\t\tif (typeof settings.stagePadding === 'function') {\n\t\t\t\tsettings.stagePadding = settings.stagePadding();\n\t\t\t}\n\t\t\tdelete settings.responsive;\n\n\t\t\t// responsive class\n\t\t\tif (settings.responsiveClass) {\n\t\t\t\tthis.$element.attr('class',\n\t\t\t\t\tthis.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\\\S+\\\\s', 'g'), '$1' + match)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.trigger('change', { property: { name: 'settings', value: settings } });\n\t\tthis._breakpoint = match;\n\t\tthis.settings = settings;\n\t\tthis.invalidate('settings');\n\t\tthis.trigger('changed', { property: { name: 'settings', value: this.settings } });\n\t};\n\n\t/**\n\t * Updates option logic if necessery.\n\t * @protected\n\t */\n\tOwl.prototype.optionsLogic = function() {\n\t\tif (this.settings.autoWidth) {\n\t\t\tthis.settings.stagePadding = false;\n\t\t\tthis.settings.merge = false;\n\t\t}\n\t};\n\n\t/**\n\t * Prepares an item before add.\n\t * @todo Rename event parameter `content` to `item`.\n\t * @protected\n\t * @returns {jQuery|HTMLElement} - The item container.\n\t */\n\tOwl.prototype.prepare = function(item) {\n\t\tvar event = this.trigger('prepare', { content: item });\n\n\t\tif (!event.data) {\n\t\t\tevent.data = $('<' + this.settings.itemElement + '/>')\n\t\t\t\t.addClass(this.options.itemClass).append(item)\n\t\t}\n\n\t\tthis.trigger('prepared', { content: event.data });\n\n\t\treturn event.data;\n\t};\n\n\t/**\n\t * Updates the view.\n\t * @public\n\t */\n\tOwl.prototype.update = function() {\
52n\t\tvar i = 0,\n\t\t\tn = this._pipe.length,\n\t\t\tfilter = $.proxy(function(p) { return this[p] }, this._invalidated),\n\t\t\tcache = {};\n\n\t\twhile (i < n) {\n\t\t\tif (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {\n\t\t\t\tthis._pipe[i].run(cache);\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tthis._invalidated = {};\n\n\t\t!this.is('valid') && this.enter('valid');\n\t};\n\n\t/**\n\t * Gets the width of the view.\n\t * @public\n\t * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.\n\t * @returns {Number} - The width of the view in pixel.\n\t */\n\tOwl.prototype.width = function(dimension) {\n\t\tdimension = dimension || Owl.Width.Default;\n\t\tswitch (dimension) {\n\t\t\tcase Owl.Width.Inner:\n\t\t\tcase Owl.Width.Outer:\n\t\t\t\treturn this._width;\n\t\t\tdefault:\n\t\t\t\treturn this._width - this.settings.stagePadding * 2 + this.settings.margin;\n\t\t}\n\t};\n\n\t/**\n\t * Refreshes the carousel primarily for adaptive purposes.\n\t * @public\n\t */\n\tOwl.prototype.refresh = function() {\n\t\tthis.enter('refreshing');\n\t\tthis.trigger('refresh');\n\n\t\tthis.setup();\n\n\t\tthis.optionsLogic();\n\n\t\tthis.$element.addClass(this.options.refreshClass);\n\n\t\tthis.update();\n\n\t\tthis.$element.removeClass(this.options.refreshClass);\n\n\t\tthis.leave('refreshing');\n\t\tthis.trigger('refreshed');\n\t};\n\n\t/**\n\t * Checks window `resize` event.\n\t * @protected\n\t */\n\tOwl.prototype.onThrottledResize = function() {\n\t\twindow.clearTimeout(this.resizeTimer);\n\t\tthis.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);\n\t};\n\n\t/**\n\t * Checks window `resize` event.\n\t * @protected\n\t */\n\tOwl.prototype.onResize = function() {\n\t\tif (!this._items.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this._width === this.$element.width()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.isVisible()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.enter('resizing');\n\n\t\tif (this.trigger('resize').isDefaultPrevented()) {\n\t\t\tthis.leave('resizing');\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.invalidate('width');\n\n\t\tthis.refresh();\n\n\t\tthis.leave('resizing');\n\t\tthis.trigger('resized');\n\t};\n\n\t/**\n\t * Registers event handlers.\n\t * @todo Check `msPointerEnabled`\n\t * @todo #261\n\t * @protected\n\t */\n\tOwl.prototype.registerEventHandlers = function() {\n\t\tif ($.support.transition) {\n\t\t\tthis.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));\n\t\t}\n\n\t\tif (this.settings.responsive !== false) {\n\t\t\tthis.on(window, 'resize', this._handlers.onThrottledResize);\n\t\t}\n\n\t\tif (this.settings.mouseDrag) {\n\t\t\tthis.$element.addClass(this.options.dragClass);\n\t\t\tthis.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));\n\t\t\tthis.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });\n\t\t}\n\n\t\tif (this.settings.touchDrag){\n\t\t\tthis.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));\n\t\t\tthis.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));\n\t\t}\n\t};\n\n\t/**\n\t * Handles `touchstart` and `mousedown` events.\n\t * @todo Horizontal swipe threshold as option\n\t * @todo #261\n\t * @protected\n\t * @param {Event} event - The event arguments.\n\t */\n\tOwl.prototype.onDragStart = function(event) {\n\t\tvar stage = null;\n\n\t\tif (event.which === 3) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ($.support.transform) {\n\t\t\tstage = this.$stage.css('transform').replace(/.*\\(|\\)| /g, '').split(',');\n\t\t\tstage = {\n\t\t\t\tx: stage[stage.length === 16 ? 12 : 4],\n\t\t\t\ty: stage[stage.length === 16 ? 13 : 5]\n\t\t\t};\n\t\t} else {\n\t\t\tstage = this.$stage.position();\n\t\t\tstage = {\n\t\t\t\tx: this.settings.rtl ?\n\t\t\t\t\tstage.left + this.$stage.width() - this.width() + this.settings.margin :\n\t\t\t\t\tstage.left,\n\t\t\t\ty: stage.top\n\t\t\t};\n\t\t}\n\n\t\tif (this.is('animating')) {\n\t\t\t$.support.transform ? this.animate(stage.x) : this.$stage.stop()\n\t\t\tthis.invalidate('position');\n\t\t}\n\n\t\tthis.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');\n\n\t\tthis.speed(0);\n\n\t\tthis._drag.time = new Date().getTime();\n\t\tthis._drag.target = $(event.target);\n\t\tthis._drag.stage.start = stage;\n\t\tthis._drag.stage.current = stage;\n\t\tthis._drag.pointer = this.pointer(event);\n\n\t\t$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));\n\n\t\t$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {\n\t\t\tvar delta = this.difference(this._drag.pointer, this.pointer(event));\n\n\t\t\t$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));\n\n\t\t\tif (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {\
52n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.enter('dragging');\n\t\t\tthis.trigger('drag');\n\t\t}, this));\n\t};\n\n\t/**\n\t * Handles the `touchmove` and `mousemove` events.\n\t * @todo #261\n\t * @protected\n\t * @param {Event} event - The event arguments.\n\t */\n\tOwl.prototype.onDragMove = function(event) {\n\t\tvar minimum = null,\n\t\t\tmaximum = null,\n\t\t\tpull = null,\n\t\t\tdelta = this.difference(this._drag.pointer, this.pointer(event)),\n\t\t\tstage = this.difference(this._drag.stage.start, delta);\n\n\t\tif (!this.is('dragging')) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tif (this.settings.loop) {\n\t\t\tminimum = this.coordinates(this.minimum());\n\t\t\tmaximum = this.coordinates(this.maximum() + 1) - minimum;\n\t\t\tstage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;\n\t\t} else {\n\t\t\tminimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());\n\t\t\tmaximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());\n\t\t\tpull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;\n\t\t\tstage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);\n\t\t}\n\n\t\tthis._drag.stage.current = stage;\n\n\t\tthis.animate(stage.x);\n\t};\n\n\t/**\n\t * Handles the `touchend` and `mouseup` events.\n\t * @todo #261\n\t * @todo Threshold for click event\n\t * @protected\n\t * @param {Event} event - The event arguments.\n\t */\n\tOwl.prototype.onDragEnd = function(event) {\n\t\tvar delta = this.difference(this._drag.pointer, this.pointer(event)),\n\t\t\tstage = this._drag.stage.current,\n\t\t\tdirection = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';\n\n\t\t$(document).off('.owl.core');\n\n\t\tthis.$element.removeClass(this.options.grabClass);\n\n\t\tif (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {\n\t\t\tthis.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);\n\t\t\tthis.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));\n\t\t\tthis.invalidate('position');\n\t\t\tthis.update();\n\n\t\t\tthis._drag.direction = direction;\n\n\t\t\tif (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {\n\t\t\t\tthis._drag.target.one('click.owl.core', function() { return false; });\n\t\t\t}\n\t\t}\n\n\t\tif (!this.is('dragging')) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.leave('dragging');\n\t\tthis.trigger('dragged');\n\t};\n\n\t/**\n\t * Gets absolute position of the closest item for a coordinate.\n\t * @todo Setting `freeDrag` makes `closest` not reusable. See #165.\n\t * @protected\n\t * @param {Number} coordinate - The coordinate in pixel.\n\t * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.\n\t * @return {Number} - The absolute position of the closest item.\n\t */\n\tOwl.prototype.closest = function(coordinate, direction) {\n\t\tvar position = -1,\n\t\t\tpull = 30,\n\t\t\twidth = this.width(),\n\t\t\tcoordinates = this.coordinates();\n\n\t\tif (!this.settings.freeDrag) {\n\t\t\t// check closest item\n\t\t\t$.each(coordinates, $.proxy(function(index, value) {\n\t\t\t\t// on a left pull, check on current index\n\t\t\t\tif (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {\n\t\t\t\t\tposition = index;\n\t\t\t\t// on a right pull, check on previous index\n\t\t\t\t// to do so, subtract width from value and set position = index + 1\n\t\t\t\t} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {\n\t\t\t\t\tposition = index + 1;\n\t\t\t\t} else if (this.op(coordinate, '<', value)\n\t\t\t\t\t&& this.op(coordinate, '>', coordinates[index + 1] !== undefined ? coordinates[index + 1] : value - width)) {\n\t\t\t\t\tposition = direction === 'left' ? index + 1 : index;\n\t\t\t\t}\n\t\t\t\treturn position === -1;\n\t\t\t}, this));\n\t\t}\n\n\t\tif (!this.settings.loop) {\n\t\t\t// non loop boundries\n\t\t\tif (this.op(coordinate, '>', coordinates[this.minimum()])) {\n\t\t\t\tposition = coordinate = this.minimum();\n\t\t\t} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {\n\t\t\t\tposition = coordinate = this.maximum();\n\t\t\t}\n\t\t}\n\n\t\treturn position;\n\t};\n\n\t/**\n\t * Animates the stage.\n\t * @todo #270\n\t * @public\n\t * @param {Number} coordinate - The coordinate in pixels.\n\t */\n\tOwl.prototype.animate = function(coordinate) {\n\t\tvar animate = this.speed() > 0;\n\n\t\tthis.is('animating') && this.onTransitionEnd();\n\n\t\tif (animate) {\n\t\t\tthis.enter('animating');\n\t\t\tthis.trigger('translate');\n\t\t}
52\n\n\t\tif ($.support.transform3d && $.support.transition) {\n\t\t\tthis.$stage.css({\n\t\t\t\ttransform: 'translate3d(' + coordinate + 'px,0px,0px)',\n\t\t\t\ttransition: (this.speed() / 1000) + 's' + (\n\t\t\t\t\tthis.settings.slideTransition ? ' ' + this.settings.slideTransition : ''\n\t\t\t\t)\n\t\t\t});\n\t\t} else if (animate) {\n\t\t\tthis.$stage.animate({\n\t\t\t\tleft: coordinate + 'px'\n\t\t\t}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));\n\t\t} else {\n\t\t\tthis.$stage.css({\n\t\t\t\tleft: coordinate + 'px'\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Checks whether the carousel is in a specific state or not.\n\t * @param {String} state - The state to check.\n\t * @returns {Boolean} - The flag which indicates if the carousel is busy.\n\t */\n\tOwl.prototype.is = function(state) {\n\t\treturn this._states.current[state] && this._states.current[state] > 0;\n\t};\n\n\t/**\n\t * Sets the absolute position of the current item.\n\t * @public\n\t * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.\n\t * @returns {Number} - The absolute position of the current item.\n\t */\n\tOwl.prototype.current = function(position) {\n\t\tif (position === undefined) {\n\t\t\treturn this._current;\n\t\t}\n\n\t\tif (this._items.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tposition = this.normalize(position);\n\n\t\tif (this._current !== position) {\n\t\t\tvar event = this.trigger('change', { property: { name: 'position', value: position } });\n\n\t\t\tif (event.data !== undefined) {\n\t\t\t\tposition = this.normalize(event.data);\n\t\t\t}\n\n\t\t\tthis._current = position;\n\n\t\t\tthis.invalidate('position');\n\n\t\t\tthis.trigger('changed', { property: { name: 'position', value: this._current } });\n\t\t}\n\n\t\treturn this._current;\n\t};\n\n\t/**\n\t * Invalidates the given part of the update routine.\n\t * @param {String} [part] - The part to invalidate.\n\t * @returns {Array.<String>} - The invalidated parts.\n\t */\n\tOwl.prototype.invalidate = function(part) {\n\t\tif ($.type(part) === 'string') {\n\t\t\tthis._invalidated[part] = true;\n\t\t\tthis.is('valid') && this.leave('valid');\n\t\t}\n\t\treturn $.map(this._invalidated, function(v, i) { return i });\n\t};\n\n\t/**\n\t * Resets the absolute position of the current item.\n\t * @public\n\t * @param {Number} position - The absolute position of the new item.\n\t */\n\tOwl.prototype.reset = function(position) {\n\t\tposition = this.normalize(position);\n\n\t\tif (position === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._speed = 0;\n\t\tthis._current = position;\n\n\t\tthis.suppress([ 'translate', 'translated' ]);\n\n\t\tthis.animate(this.coordinates(position));\n\n\t\tthis.release([ 'translate', 'translated' ]);\n\t};\n\n\t/**\n\t * Normalizes an absolute or a relative position of an item.\n\t * @public\n\t * @param {Number} position - The absolute or relative position to normalize.\n\t * @param {Boolean} [relative=false] - Whether the given position is relative or not.\n\t * @returns {Number} - The normalized position.\n\t */\n\tOwl.prototype.normalize = function(position, relative) {\n\t\tvar n = this._items.length,\n\t\t\tm = relative ? 0 : this._clones.length;\n\n\t\tif (!this.isNumeric(position) || n < 1) {\n\t\t\tposition = undefined;\n\t\t} else if (position < 0 || position >= n + m) {\n\t\t\tposition = ((position - m / 2) % n + n) % n + m / 2;\n\t\t}\n\n\t\treturn position;\n\t};\n\n\t/**\n\t * Converts an absolute position of an item into a relative one.\n\t * @public\n\t * @param {Number} position - The absolute position to convert.\n\t * @returns {Number} - The converted position.\n\t */\n\tOwl.prototype.relative = function(position) {\n\t\tposition -= this._clones.length / 2;\n\t\treturn this.normalize(position, true);\n\t};\n\n\t/**\n\t * Gets the maximum position for the current item.\n\t * @public\n\t * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.\n\t * @returns {Number}\n\t */\n\tOwl.prototype.maximum = function(relative) {\n\t\tvar settings = this.settings,\n\t\t\tmaximum = this._coordinates.length,\n\t\t\titerator,\n\t\t\treciprocalItemsWidth,\n\t\t\telementWidth;\n\n\t\tif (settings.loop) {\n\t\t\tmaximum = this._clones.length / 2 + this._items.length - 1;\n\t\t} else if (settings.autoWidth || settings.merge) {\n\t\t\titerator = this._items.length;\n\t\t\tif (iterator) {\n\t\t\t\treciprocalItemsWidth = this._items[--iterator].width();\n\t\t\t\telementWidth = this.$element.width();\n\t\t\t\twhile (iterator--) {\n\t\t\t\t\treciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;\n\t\t\t\t\tif (reciprocalItemsWidth > elementWidth) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmaximum = iterator + 1;\n\t\t} else if (settings.center) {\n\t\t\tmaximum = this._items.length - 1;\n\t\t} else {\n\t\t\tmaximum = this._items.length - settings.items;\n\t\t}\n\n\t\tif (relative) {\n\t\t\tmaximum -= this._clones.length / 2;\n\t\t}\n\n\t\treturn Math.max(maximum, 0);\n\t};\n\n\t/**\n\t * Gets the minimum position for the current item.\n\t * @public\n\t * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.\n\t * @returns {Number}\n\t */\n\tOwl.prototype.minimum = function(relative) {\n\t\treturn relative ? 0 : this._clones.length / 2;\n\t};\n\n\t/**\n\t * Gets an item at the specified relative position.\n\t * @public\n\t * @param {Number} [position] - The relative position of the item.\n\t * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.\n\t */\n\tOwl.prototype.items = function(position) {\n\t\tif (position === undefined) {\n\t\t\treturn this._items.slice();\n\t\t}\n\n\t\tposition = this.normalize(position, true);\n\t\treturn this._items[position];\n\t};\n\n\t/**\n\t * Gets an item at the specified relative position.\n\t * @public\n\t * @param {Number} [position] - The relative position of the item.\n\t * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.\n\t */\n\tOwl.prototype.mergers = function(position) {\n\t\tif (position === undefined) {\n\t\t\treturn this._mergers.slice();\n\t\t}\n\n\t\tposition = this.normalize(position, true);\n\t\treturn this._mergers[position];\n\t};\n\n\t/**\n\t * Gets the absolute positions of clones for an item.\n\t * @public\n\t * @param {Number} [position] - The relative position of the item.\n\t * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.\n\t */\n\tOwl.prototype.clones = function(position) {\n\t\tvar odd = this._clones.length / 2,\n\t\t\teven = odd + this._items.length,\n\t\t\tmap = function(index) { return index % 2 === 0 ? even + index / 2 : odd
52- (index + 1) / 2 };\n\n\t\tif (position === undefined) {\n\t\t\treturn $.map(this._clones, function(v, i) { return map(i) });\n\t\t}\n\n\t\treturn $.map(this._clones, function(v, i) { return v === position ? map(i) : null });\n\t};\n\n\t/**\n\t * Sets the current animation speed.\n\t * @public\n\t * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.\n\t * @returns {Number} - The current animation speed in milliseconds.\n\t */\n\tOwl.prototype.speed = function(speed) {\n\t\tif (speed !== undefined) {\n\t\t\tthis._speed = speed;\n\t\t}\n\n\t\treturn this._speed;\n\t};\n\n\t/**\n\t * Gets the coordinate of an item.\n\t * @todo The name of this method is missleanding.\n\t * @public\n\t * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.\n\t * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.\n\t */\n\tOwl.prototype.coordinates = function(position) {\n\t\tvar multiplier = 1,\n\t\t\tnewPosition = position - 1,\n\t\t\tcoordinate;\n\n\t\tif (position === undefined) {\n\t\t\treturn $.map(this._coordinates, $.proxy(function(coordinate, index) {\n\t\t\t\treturn this.coordinates(index);\n\t\t\t}, this));\n\t\t}\n\n\t\tif (this.settings.center) {\n\t\t\tif (this.settings.rtl) {\n\t\t\t\tmultiplier = -1;\n\t\t\t\tnewPosition = position + 1;\n\t\t\t}\n\n\t\t\tcoordinate = this._coordinates[position];\n\t\t\tcoordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;\n\t\t} else {\n\t\t\tcoordinate = this._coordinates[newPosition] || 0;\n\t\t}\n\n\t\tcoordinate = Math.ceil(coordinate);\n\n\t\treturn coordinate;\n\t};\n\n\t/**\n\t * Calculates the speed for a translation.\n\t * @protected\n\t * @param {Number} from - The absolute position of the start item.\n\t * @param {Number} to - The absolute position of the target item.\n\t * @param {Number} [factor=undefined] - The time factor in milliseconds.\n\t * @returns {Number} - The time in milliseconds for the translation.\n\t */\n\tOwl.prototype.duration = function(from, to, factor) {\n\t\tif (factor === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));\n\t};\n\n\t/**\n\t * Slides to the specified item.\n\t * @public\n\t * @param {Number} position - The position of the item.\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\n\t */\n\tOwl.prototype.to = function(position, speed) {\n\t\tvar current = this.current(),\n\t\t\trevert = null,\n\t\t\tdistance = position - this.relative(current),\n\t\t\tdirection = (distance > 0) - (distance < 0),\n\t\t\titems = this._items.length,\n\t\t\tminimum = this.minimum(),\n\t\t\tmaximum = this.maximum();\n\n\t\tif (this.settings.loop) {\n\t\t\tif (!this.settings.rewind && Math.abs(distance) > items / 2) {\n\t\t\t\tdistance += direction * -1 * items;\n\t\t\t}\n\n\t\t\tposition = current + distance;\n\t\t\trevert = ((position - minimum) % items + items) % items + minimum;\n\n\t\t\tif (revert !== position && revert - distance <= maximum && revert - distance > 0) {\n\t\t\t\tcurrent = revert - distance;\n\t\t\t\tposition = revert;\n\t\t\t\tthis.reset(current);\n\t\t\t}\n\t\t} else if (this.settings.rewind) {\n\t\t\tmaximum += 1;\n\t\t\tposition = (position % maximum + maximum) % maximum;\n\t\t} else {\n\t\t\tposition = Math.max(minimum, Math.min(maximum, position));\n\t\t}\n\n\t\tthis.speed(this.duration(current, position, speed));\n\t\tthis.current(position);\n\n\t\tif (this.isVisible()) {\n\t\t\tthis.update();\n\t\t}\n\t};\n\n\t/**\n\t * Slides to the next item.\n\t * @public\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\n\t */\n\tOwl.prototype.next = function(speed) {\n\t\tspeed = speed || false;\n\t\tthis.to(this.relative(this.current()) + 1, speed);\n\t};\n\n\t/**\n\t * Slides to the previous item.\n\t * @public\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\n\t */\n\tOwl.prototype.prev = function(speed) {\n\t\tspeed = speed || false;\n\t\tthis.to(this.relative(this.current()) - 1, speed);\n\t};\n\n\t/**\n\t * Handles the end of an animation.\n\t * @protected\n\t * @param {Event} event - The event arguments.\n\t */\n\tOwl.prototype.onTransitionEnd = function(event) {\n\n\t\t// if css2 animation then event object is undefined\n\t\tif (event !== undefined) {\n\t\t\tevent.stopPropagation();\n\n\t\t\t// Catch only owl-stage transitionEnd event\n\t\t\tif ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.leave('animating');\n\t\tthis.trigger('translated');\n\t};\n\n\t/**\n\t * Gets viewport width.\n\t * @protected\n\t * @return {Number} - The width in pixel.\n\t */\n\tOwl.prototype.viewport = function() {\
52n\t\tvar width;\n\t\tif (this.options.responsiveBaseElement !== window) {\n\t\t\twidth = $(this.options.responsiveBaseElement).width();\n\t\t} else if (window.innerWidth) {\n\t\t\twidth = window.innerWidth;\n\t\t} else if (document.documentElement && document.documentElement.clientWidth) {\n\t\t\twidth = document.documentElement.clientWidth;\n\t\t} else {\n\t\t\tconsole.warn('Can not detect viewport width.');\n\t\t}\n\t\treturn width;\n\t};\n\n\t/**\n\t * Replaces the current content.\n\t * @public\n\t * @param {HTMLElement|jQuery|String} content - The new content.\n\t */\n\tOwl.prototype.replace = function(content) {\n\t\tthis.$stage.empty();\n\t\tthis._items = [];\n\n\t\tif (content) {\n\t\t\tcontent = (content instanceof jQuery) ? content : $(content);\n\t\t}\n\n\t\tif (this.settings.nestedItemSelector) {\n\t\t\tcontent = content.find('.' + this.settings.nestedItemSelector);\n\t\t}\n\n\t\tcontent.filter(function() {\n\t\t\treturn this.nodeType === 1;\n\t\t}).each($.proxy(function(index, item) {\n\t\t\titem = this.prepare(item);\n\t\t\tthis.$stage.append(item);\n\t\t\tthis._items.push(item);\n\t\t\tthis._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\n\t\t}, this));\n\n\t\tthis.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);\n\n\t\tthis.invalidate('items');\n\t};\n\n\t/**\n\t * Adds an item.\n\t * @todo Use `item` instead of `content` for the event arguments.\n\t * @public\n\t * @param {HTMLElement|jQuery|String} content - The item content to add.\n\t * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.\n\t */\n\tOwl.prototype.add = function(content, position) {\n\t\tvar current = this.relative(this._current);\n\n\t\tposition = position === undefined ? this._items.length : this.normalize(position, true);\n\t\tcontent = content instanceof jQuery ? content : $(content);\n\n\t\tthis.trigger('add', { content: content, position: position });\n\n\t\tcontent = this.prepare(content);\n\n\t\tif (this._items.length === 0 || position === this._items.length) {\n\t\t\tthis._items.length === 0 && this.$stage.append(content);\n\t\t\tthis._items.length !== 0 && this._items[position - 1].after(content);\n\t\t\tthis._items.push(content);\n\t\t\tthis._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\n\t\t} else {\n\t\t\tthis._items[position].before(content);\n\t\t\tthis._items.splice(position, 0, content);\n\t\t\tthis._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\n\t\t}\n\n\t\tthis._items[current] && this.reset(this._items[current].index());\n\n\t\tthis.invalidate('items');\n\n\t\tthis.trigger('added', { content: content, position: position });\n\t};\n\n\t/**\n\t * Removes an item by its position.\n\t * @todo Use `item` instead of `content` for the event arguments.\n\t * @public\n\t * @param {Number} position - The relative position of the item to remove.\n\t */\n\tOwl.prototype.remove = function(position) {\n\t\tposition = this.normalize(position, true);\n\n\t\tif (position === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.trigger('remove', { content: this._items[position], position: position });\n\n\t\tthis._items[position].remove();\n\t\tthis._items.splice(position, 1);\n\t\tthis._mergers.splice(position, 1);\n\n\t\tthis.invalidate('items');\n\n\t\tthis.trigger('removed', { content: null, position: position });\n\t};\n\n\t/**\n\t * Preloads images with auto width.\n\t * @todo Replace by a more generic approach\n\t * @protected\n\t */\n\tOwl.prototype.preloadAutoWidthImages = function(images) {\n\t\timages.each($.proxy(function(i, element) {\n\t\t\tthis.enter('pre-loading');\n\t\t\telement = $(element);\n\t\t\t$(new Image()).one('load', $.proxy(function(e) {\n\t\t\t\telement.attr('src', e.target.src);\n\t\t\t\telement.css('opacity', 1);\n\t\t\t\tthis.leave('pre-loading');\n\t\t\t\t!this.is('pre-loading') && !this.is('initializing') && this.refresh();\n\t\t\t}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));\n\t\t}, this));\n\t};\n\n\t/**\n\t * Destroys the carousel.\n\t * @public\n\t */\n\tOwl.prototype.destroy = function() {\
52n\n\t\tthis.$element.off('.owl.core');\n\t\tthis.$stage.off('.owl.core');\n\t\t$(document).off('.owl.core');\n\n\t\tif (this.settings.responsive !== false) {\n\t\t\twindow.clearTimeout(this.resizeTimer);\n\t\t\tthis.off(window, 'resize', this._handlers.onThrottledResize);\n\t\t}\n\n\t\tfor (var i in this._plugins) {\n\t\t\tthis._plugins[i].destroy();\n\t\t}\n\n\t\tthis.$stage.children('.cloned').remove();\n\n\t\tthis.$stage.unwrap();\n\t\tthis.$stage.children().contents().unwrap();\n\t\tthis.$stage.children().unwrap();\n\t\tthis.$stage.remove();\n\t\tthis.$element\n\t\t\t.removeClass(this.options.refreshClass)\n\t\t\t.removeClass(this.options.loadingClass)\n\t\t\t.removeClass(this.options.loadedClass)\n\t\t\t.removeClass(this.options.rtlClass)\n\t\t\t.removeClass(this.options.dragClass)\n\t\t\t.removeClass(this.options.grabClass)\n\t\t\t.attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\\\S+\\\\s', 'g'), ''))\n\t\t\t.removeData('owl.carousel');\n\t};\n\n\t/**\n\t * Operators to calculate right-to-left and left-to-right.\n\t * @protected\n\t * @param {Number} [a] - The left side operand.\n\t * @param {String} [o] - The operator.\n\t * @param {Number} [b] - The right side operand.\n\t */\n\tOwl.prototype.op = function(a, o, b) {\n\t\tvar rtl = this.settings.rtl;\n\t\tswitch (o) {\n\t\t\tcase '<':\n\t\t\t\treturn rtl ? a > b : a < b;\n\t\t\tcase '>':\n\t\t\t\treturn rtl ? a < b : a > b;\n\t\t\tcase '>=':\n\t\t\t\treturn rtl ? a <= b : a >= b;\n\t\t\tcase '<=':\n\t\t\t\treturn rtl ? a >= b : a <= b;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t/**\n\t * Attaches to an internal event.\n\t * @protected\n\t * @param {HTMLElement} element - The event source.\n\t * @param {String} event - The event name.\n\t * @param {Function} listener - The event handler to attach.\n\t * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.\n\t */\n\tOwl.prototype.on = function(element, event, listener, capture) {\n\t\tif (element.addEventListener) {\n\t\t\telement.addEventListener(event, listener, capture);\n\t\t} else if (element.attachEvent) {\n\t\t\telement.attachEvent('on' + event, listener);\n\t\t}\n\t};\n\n\t/**\n\t * Detaches from an internal event.\n\t * @protected\n\t * @param {HTMLElement} element - The event source.\n\t * @param {String} event - The event name.\n\t * @param {Function} listener - The attached event handler to detach.\n\t * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.\n\t */\n\tOwl.prototype.off = function(element, event, listener, capture) {\n\t\tif (element.removeEventListener) {\n\t\t\telement.removeEventListener(event, listener, capture);\n\t\t} else if (element.detachEvent) {\n\t\t\telement.detachEvent('on' + event, listener);\n\t\t}\n\t};\n\n\t/**\n\t * Triggers a public event.\n\t * @todo Remove `status`, `relatedTarget` should be used instead.\n\t * @protected\n\t * @param {String} name - The event name.\n\t * @param {*} [data=null] - The event data.\n\t * @param {String} [namespace=carousel] - The event namespace.\n\t * @param {String} [state] - The state which is associated with the event.\n\t * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.\n\t * @returns {Event} - The event arguments.\n\t */\n\tOwl.prototype.trigger = function(name, data, namespace, state, enter) {\n\t\tvar status = {\n\t\t\titem: { count: this._items.length, index: this.current() }\n\t\t}, handler = $.camelCase(\n\t\t\t$.grep([ 'on', name, namespace ], function(v) { return v })\n\t\t\t\t.join('-').toLowerCase()\n\t\t), event = $.Event(\n\t\t\t[ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),\n\t\t\t$.extend({ relatedTarget: this }, status, data)\n\t\t);\n\n\t\tif (!this._supress[name]) {\n\t\t\t$.each(this._plugins, function(name, plugin) {\n\t\t\t\tif (plugin.onTrigger) {\n\t\t\t\t\tplugin.onTrigger(event);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.register({ type: Owl.Type.Event, name: name });\n\t\t\tthis.$element.trigger(event);\n\n\t\t\tif (this.settings && typeof this.settings[handler] === 'function') {\n\t\t\t\tthis.settings[handler].call(this, event);\n\t\t\t}\n\t\t}\n\n\t\treturn event;\n\t};\n\n\t/**\n\t * Enters a state.\n\t * @param name - The state name.\n\t */\n\tOwl.prototype.enter = function(name) {\n\t\t$.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {\n\t\t\tif (this._states.current[name] === undefined) {\n\t\t\t\tthis._states.current[name] = 0;\n\t\t\t}\n\n\t\t\tthis._states.current[name]++;\n\t\t}, this));\n\t};\n\n\t/**\n\t * Leaves a state.\n\t * @param name - The state name.\n\t */\n\tOwl.prototype.leave = function(name) {\n\t\t$.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {\n\t\t\tthis._states.current[name]--;\n\t\t}, this));\n\t};\n\n\t/**\n\t * Registers an event or state.\n\t * @public\n\t * @param {Object} object - The event or state to register.\n\t */\n\tOwl.prototype.register = function(object) {\n\t\tif (object.type === Owl.Type.Event) {\n\t\t\tif (!$.event.special[object.name]) {\n\t\t\t\t$.event.special[object.name] = {};\n\t\t\t}\n\n\t\t\tif (!$.event.special[object.name].owl) {\n\t\t\t\tvar _default = $.event.special[object.name]._default;\n\t\t\t\t$.event.special[object.name]._default = function(e) {\n\t\t\t\t\tif (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {\n\t\t\t\t\t\treturn _default.apply(this, arguments);\n\t\t\t\t\t}\n\t\t\t\t\treturn e.namespace && e.namespace.indexOf('owl') > -1;\n\t\t\t\t};\n\t\t\t\t$.event.special[object.name].owl = true;\n\t\t\t}\n\t\t} else if (object.type === Owl.Type.State) {\n\t\t\tif (!this._states.tags[object.name]) {\n\t\t\t\tthis._states.tags[object.name] = object.tags;\n\t\t\t} else {\n\t\t\t\tthis._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);\n\t\t\t}\n\n\t\t\tthis._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {\n\t\t\t\treturn $.inArray(tag, this._states.tags[object.name]) === i;\n\t\t\t}, this));\n\t\t}\n\t};\n\n\t/**\n\t * Suppresses events.\n\t * @protected\n\t * @param {Array.<String>} events - The events to suppress.\n\t */\n\tOwl.prototype.suppress = function(events) {\n\t\t$.each(events, $.proxy(function(index, event) {\n\t\t\tthis._supress[event] = true;\n\t\t}, this));\n\t};\n\n\t/**\n\t * Releases suppressed events.\n\t * @protected\n\t * @param {Array.<String>} events - The events to release.\n\t */\n\tOwl.prototype.release = function(events) {\n\t\t$.each(events, $.proxy(function(index, event) {\n\t\t\tdelete this._supress[event];\n\t\t}, this));\n\t};\n\n\t/**\n\t * Gets unified pointer coordinates from event.\n\t * @todo #261\n\t * @protected\n\t * @param {Event} - The `mousedown` or `touchstart` event.\n\t * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.\n\t */\n\tOwl.prototype.pointer = function(event) {\n\t\tvar result = { x: null, y: null };\n\n\t\tevent = event.originalEvent || event || window.event;\n\n\t\tevent = event.touches && event.touches.length ?\n\t\t\tevent.touches[0] : event.changedTouches && event.changedTouches.length ?\n\t\t\t\tevent.changedTouches[0] : event;\n\n\t\tif (event.pageX) {\n\t\t\tresult.x = event.pageX;\n\t\t\tresult.y = event.pageY;\n\t\t} else {\n\t\t\tresult.x = event.clientX;\n\t\t\tresult.y = event.clientY;\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t/**\n\t * Determines if the input is a Number or something that can be coerced to a Number\n\t * @protected\n\t * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested\n\t * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number\n\t */\n\tOwl.prototype.isNumeric = function(number) {\n\t\treturn !isNaN(parseFloat(number));\n\t};\n\n\t/**\n\t * Gets the difference of two vectors.\n\t * @todo #261\n\t * @protected\n\t * @param {Object} - The first vector.\n\t * @param {Object} - The second vector.\n\t * @returns {Object} - The difference.\n\t */\n\tOwl.prototype.difference = function(first, second) {\n\t\treturn {\n\t\t\tx: first.x - second.x,\n\t\t\ty: first.y - second.y\n\t\t};\n\t};\n\n\t/**\n\t * The jQuery Plugin for the Owl Carousel\n\t * @todo Navigation plugin `next` and `prev`\n\t * @public\n\t */\n\t$.fn.owlCarousel = function(option) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1);
52\n\n\t\treturn this.each(function() {\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('owl.carousel');\n\n\t\t\tif (!data) {\n\t\t\t\tdata = new Owl(this, typeof option == 'object' && option);\n\t\t\t\t$this.data('owl.carousel', data);\n\n\t\t\t\t$.each([\n\t\t\t\t\t'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'\n\t\t\t\t], function(i, event) {\n\t\t\t\t\tdata.register({ type: Owl.Type.Event, name: event });\n\t\t\t\t\tdata.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {\n\t\t\t\t\t\tif (e.namespace && e.relatedTarget !== this) {\n\t\t\t\t\t\t\tthis.suppress([ event ]);\n\t\t\t\t\t\t\tdata[event].apply(this, [].slice.call(arguments, 1));\n\t\t\t\t\t\t\tthis.release([ event ]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, data));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (typeof option == 'string' && option.charAt(0) !== '_') {\n\t\t\t\tdata[option].apply(data, args);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * The constructor for the jQuery Plugin\n\t * @public\n\t */\n\t$.fn.owlCarousel.Constructor = Owl;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * AutoRefresh Plugin\n * @version 2.3.4\n * @author Artus Kolanowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the auto refresh plugin.\n\t * @class The Auto Refresh Plugin\n\t * @param {Owl} carousel - The Owl Carousel\n\t */\n\tvar AutoRefresh = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;\n\n\t\t/**\n\t\t * Refresh interval.\n\t\t * @protected\n\t\t * @type {number}\n\t\t */\n\t\tthis._interval = null;\n\n\t\t/**\n\t\t * Whether the element is currently visible or not.\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis._visible = null;\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.autoRefresh) {\n\t\t\t\t\tthis.watch();\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);\n\n\t\t// register event handlers\n\t\tthis._core.$element.on(this._handlers);\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tAutoRefresh.Defaults = {\n\t\tautoRefresh: true,\n\t\tautoRefreshInterval: 500\n\t};\n\n\t/**\n\t * Watches the element.\n\t */\n\tAutoRefresh.prototype.watch = function() {\n\t\tif (this._interval) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._visible = this._core.isVisible();\n\t\tthis._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);\n\t};\n\n\t/**\n\t * Refreshes the element.\n\t */\n\tAutoRefresh.prototype.refresh = function() {\n\t\tif (this._core.isVisible() === this._visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._visible = !this._visible;\n\n\t\tthis._core.$element.toggleClass('owl-hidden', !this._visible);\n\n\t\tthis._visible && (this._core.invalidate('width') && this._core.refresh());\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t */\n\tAutoRefresh.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\twindow.clearInterval(this._interval);\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Lazy Plugin\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the lazy plugin.\n\t * @class The Lazy Plugin\n\t * @param {Owl} carousel - The Owl Carousel\n\t */\n\tvar Lazy = function(carousel) {\n\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;
52\n\n\t\t/**\n\t\t * Already loaded items.\n\t\t * @protected\n\t\t * @type {Array.<jQuery>}\n\t\t */\n\t\tthis._loaded = [];\n\n\t\t/**\n\t\t * Event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (!e.namespace) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._core.settings || !this._core.settings.lazyLoad) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ((e.property && e.property.name == 'position') || e.type == 'initialized') {\n\t\t\t\t\tvar settings = this._core.settings,\n\t\t\t\t\t\tn = (settings.center && Math.ceil(settings.items / 2) || settings.items),\n\t\t\t\t\t\ti = ((settings.center && n * -1) || 0),\n\t\t\t\t\t\tposition = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,\n\t\t\t\t\t\tclones = this._core.clones().length,\n\t\t\t\t\t\tload = $.proxy(function(i, v) { this.load(v) }, this);\n\t\t\t\t\t//TODO: Need documentation for this new option\n\t\t\t\t\tif (settings.lazyLoadEager > 0) {\n\t\t\t\t\t\tn += settings.lazyLoadEager;\n\t\t\t\t\t\t// If the carousel is looping also preload images that are to the \"left\"\n\t\t\t\t\t\tif (settings.loop) {\n position -= settings.lazyLoadEager;\n n++;\n }\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (i++ < n) {\n\t\t\t\t\t\tthis.load(clones / 2 + this._core.relative(position));\n\t\t\t\t\t\tclones && $.each(this._core.clones(this._core.relative(position)), load);\n\t\t\t\t\t\tposition++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set the default options\n\t\tthis._core.options = $.extend({}, Lazy.Defaults, this._core.options);\n\n\t\t// register event handler\n\t\tthis._core.$element.on(this._handlers);\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tLazy.Defaults = {\n\t\tlazyLoad: false,\n\t\tlazyLoadEager: 0\n\t};\n\n\t/**\n\t * Loads all resources of an item at the specified position.\n\t * @param {Number} position - The absolute position of the item.\n\t * @protected\n\t */\n\tLazy.prototype.load = function(position) {\n\t\tvar $item = this._core.$stage.children().eq(position),\n\t\t\t$elements = $item && $item.find('.owl-lazy');\n\n\t\tif (!$elements || $.inArray($item.get(0), this._loaded) > -1) {\n\t\t\treturn;\n\t\t}\n\n\t\t$elements.each($.proxy(function(index, element) {\n\t\t\tvar $element = $(element), image,\n url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src') || $element.attr('data-srcset');\n\n\t\t\tthis._core.trigger('load', { element: $element, url: url }, 'lazy');\n\n\t\t\tif ($element.is('img')) {\n\t\t\t\t$element.one('load.owl.lazy', $.proxy(function() {\n\t\t\t\t\t$element.css('opacity', 1);\n\t\t\t\t\tthis._core.trigger('loaded', { element: $element, url: url }, 'lazy');\n\t\t\t\t}, this)).attr('src', url);\n } else if ($element.is('source')) {\n $element.one('load.owl.lazy', $.proxy(function() {\n this._core.trigger('loaded', { element: $element, url: url }, 'lazy');\n }, this)).attr('srcset', url);\n\t\t\t} else {\n\t\t\t\timage = new Image();\n\t\t\t\timage.onload = $.proxy(function() {\n\t\t\t\t\t$element.css({\n\t\t\t\t\t\t'background-image': 'url(\"' + url + '\")',\n\t\t\t\t\t\t'opacity': '1'\n\t\t\t\t\t});\n\t\t\t\t\tthis._core.trigger('loaded', { element: $element, url: url }, 'lazy');\n\t\t\t\t}, this);\n\t\t\t\timage.src = url;\n\t\t\t}\n\t\t}, this));\n\n\t\tthis._loaded.push($item.get(0));\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t * @public\n\t */\n\tLazy.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\tfor (handler in this.handlers) {\n\t\t\tthis._core.$element.off(handler, this.handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * AutoHeight Plugin\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the auto height plugin.\n\t * @class The Auto Height Plugin\n\t * @param {Owl} carousel - The Owl Carousel\n\t */\n\tvar AutoHeight = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;
52\n\n\t\tthis._previousHeight = null;\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight) {\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight && e.property.name === 'position'){\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'loaded.owl.lazy': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight\n\t\t\t\t\t&& e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);\n\n\t\t// register event handlers\n\t\tthis._core.$element.on(this._handlers);\n\t\tthis._intervalId = null;\n\t\tvar refThis = this;\n\n\t\t// These changes have been taken from a PR by gavrochelegnou proposed in #1575\n\t\t// and have been made compatible with the latest jQuery version\n\t\t$(window).on('load', function() {\n\t\t\tif (refThis._core.settings.autoHeight) {\n\t\t\t\trefThis.update();\n\t\t\t}\n\t\t});\n\n\t\t// Autoresize the height of the carousel when window is resized\n\t\t// When carousel has images, the height is dependent on the width\n\t\t// and should also change on resize\n\t\t$(window).resize(function() {\n\t\t\tif (refThis._core.settings.autoHeight) {\n\t\t\t\tif (refThis._intervalId != null) {\n\t\t\t\t\tclearTimeout(refThis._intervalId);\n\t\t\t\t}\n\n\t\t\t\trefThis._intervalId = setTimeout(function() {\n\t\t\t\t\trefThis.update();\n\t\t\t\t}, 250);\n\t\t\t}\n\t\t});\n\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tAutoHeight.Defaults = {\n\t\tautoHeight: false,\n\t\tautoHeightClass: 'owl-height'\n\t};\n\n\t/**\n\t * Updates the view.\n\t */\n\tAutoHeight.prototype.update = function() {\n\t\tvar start = this._core._current,\n\t\t\tend = start + this._core.settings.items,\n\t\t\tlazyLoadEnabled = this._core.settings.lazyLoad,\n\t\t\tvisible = this._core.$stage.children().toArray().slice(start, end),\n\t\t\theights = [],\n\t\t\tmaxheight = 0;\n\n\t\t$.each(visible, function(index, item) {\n\t\t\theights.push($(item).height());\n\t\t});\n\n\t\tmaxheight = Math.max.apply(null, heights);\n\n\t\tif (maxheight <= 1 && lazyLoadEnabled && this._previousHeight) {\n\t\t\tmaxheight = this._previousHeight;\n\t\t}\n\n\t\tthis._previousHeight = maxheight;\n\n\t\tthis._core.$stage.parent()\n\t\t\t.height(maxheight)\n\t\t\t.addClass(this._core.settings.autoHeightClass);\n\t};\n\n\tAutoHeight.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] !== 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Video Plugin\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the video plugin.\n\t * @class The Video Plugin\n\t * @param {Owl} carousel - The Owl Carousel\n\t */\n\tvar Video = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;\n\n\t\t/**\n\t\t * Cache all video URLs.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._videos = {};\n\n\t\t/**\n\t\t * Current playing item.\n\t\t * @protected\n\t\t * @type {jQuery}\n\t\t */\n\t\tthis._playing = null;\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @todo The cloned content removale is too late\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace) {\n\t\t\t\t\tthis._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'resize.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.video && this.isInFullScreen()) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'refreshed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.is('resizing')) {\n\t\t\t\t\tthis._core.$stage.find('.cloned .owl-video-frame').remove();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && e.property.name === 'position' && this._playing) {\n\t\t\t\t\tthis.stop();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (!e.namespace) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar $element = $(e.content).find('.owl-video');\n\n\t\t\t\tif ($element.length) {\n\t\t\t\t\t$element.css('display', 'none');\n\t\t\t\t\tthis.fetch($element, $(e.content));\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, Video.Defaults, this._core.options);\n\n\t\t// register event handlers\n\t\tthis._core.$element.on(this._handlers);\n\n\t\tthis._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {\n\t\t\tthis.play(e);\n\t\t}, this));\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tVideo.Defaults = {\n\t\tvideo: false,\n\t\tvideoHeight: false,\n\t\tvideoWidth: false\n\t};\n\n\t/**\n\t * Gets the video ID and the type (YouTube/Vimeo/vzaar only).\n\t * @protected\n\t * @param {jQuery} target - The target containing the video data.\n\t * @param {jQuery} item - The item containing the video.\n\t */\n\tVideo.prototype.fetch = function(target, item) {\n\t\t\tvar type = (function() {\
52n\t\t\t\t\tif (target.attr('data-vimeo-id')) {\n\t\t\t\t\t\treturn 'vimeo';\n\t\t\t\t\t} else if (target.attr('data-vzaar-id')) {\n\t\t\t\t\t\treturn 'vzaar'\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 'youtube';\n\t\t\t\t\t}\n\t\t\t\t})(),\n\t\t\t\tid = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),\n\t\t\t\twidth = target.attr('data-width') || this._core.settings.videoWidth,\n\t\t\t\theight = target.attr('data-height') || this._core.settings.videoHeight,\n\t\t\t\turl = target.attr('href');\n\n\t\tif (url) {\n\n\t\t\t/*\n\t\t\t\t\tParses the id's out of the following urls (and probably more):\n\t\t\t\t\thttps://www.youtube.com/watch?v=:id\n\t\t\t\t\thttps://youtu.be/:id\n\t\t\t\t\thttps://vimeo.com/:id\n\t\t\t\t\thttps://vimeo.com/channels/:channel/:id\n\t\t\t\t\thttps://vimeo.com/groups/:group/videos/:id\n\t\t\t\t\thttps://app.vzaar.com/videos/:id\n\n\t\t\t\t\tVisual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F\n\t\t\t*/\n\n\t\t\tid = url.match(/(http:|https:|)\\/\\/(player.|www.|app.)?(vimeo\\.com|youtu(be\\.com|\\.be|be\\.googleapis\\.com|be\\-nocookie\\.com)|vzaar\\.com)\\/(video\\/|videos\\/|embed\\/|channels\\/.+\\/|groups\\/.+\\/|watch\\?v=|v\\/)?([A-Za-z0-9._%-]*)(\\&\\S+)?/);\n\n\t\t\tif (id[3].indexOf('youtu') > -1) {\n\t\t\t\ttype = 'youtube';\n\t\t\t} else if (id[3].indexOf('vimeo') > -1) {\n\t\t\t\ttype = 'vimeo';\n\t\t\t} else if (id[3].indexOf('vzaar') > -1) {\n\t\t\t\ttype = 'vzaar';\n\t\t\t} else {\n\t\t\t\tthrow new Error('Video URL not supported.');\n\t\t\t}\n\t\t\tid = id[6];\n\t\t} else {\n\t\t\tthrow new Error('Missing video URL.');\n\t\t}\n\n\t\tthis._videos[url] = {\n\t\t\ttype: type,\n\t\t\tid: id,\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\n\t\titem.attr('data-video', url);\n\n\t\tthis.thumbnail(target, this._videos[url]);\n\t};\n\n\t/**\n\t * Creates video thumbnail.\n\t * @protected\n\t * @param {jQuery} target - The target containing the video data.\n\t * @param {Object} info - The video info object.\n\t * @see `fetch`\n\t */\n\tVideo.prototype.thumbnail = function(target, video) {\n\t\tvar tnLink,\n\t\t\ticon,\n\t\t\tpath,\n\t\t\tdimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '',\n\t\t\tcustomTn = target.find('img'),\n\t\t\tsrcType = 'src',\n\t\t\tlazyClass = '',\n\t\t\tsettings = this._core.settings,\n\t\t\tcreate = function(path) {\n\t\t\t\ticon = '<div class=\"owl-video-play-icon\"></div>';\n\n\t\t\t\tif (settings.lazyLoad) {\n\t\t\t\t\ttnLink = $('<div/>',{\n\t\t\t\t\t\t\"class\": 'owl-video-tn ' + lazyClass,\n\t\t\t\t\t\t\"srcType\": path\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttnLink = $( '<div/>', {\n\t\t\t\t\t\t\"class\": \"owl-video-tn\",\n\t\t\t\t\t\t\"style\": 'opacity:1;background-image:url(' + path + ')'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ttarget.after(tnLink);\n\t\t\t\ttarget.after(icon);\n\t\t\t};\n\n\t\t// wrap video content into owl-video-wrapper div\n\t\ttarget.wrap( $( '<div/>', {\n\t\t\t\"class\": \"owl-video-wrapper\",\n\t\t\t\"style\": dimensions\n\t\t}));\n\n\t\tif (this._core.settings.lazyLoad) {\n\t\t\tsrcType = 'data-src';\n\t\t\tlazyClass = 'owl-lazy';\n\t\t}\n\n\t\t// custom thumbnail\n\t\tif (customTn.length) {\n\t\t\tcreate(customTn.attr(srcType));\n\t\t\tcustomTn.remove();\n\t\t\treturn false;\n\t\t}\n\n\t\tif (video.type === 'youtube') {\n\t\t\tpath = \"//img.youtube.com/vi/\" + video.id + \"/hqdefault.jpg\";\n\t\t\tcreate(path);\n\t\t} else if (video.type === 'vimeo') {\n\t\t\t$.ajax({\n\t\t\t\ttype: 'GET',\n\t\t\t\turl: '//vimeo.com/api/v2/video/' + video.id + '.json',\n\t\t\t\tjsonp: 'callback',\n\t\t\t\tdataType: 'jsonp',\n\t\t\t\tsuccess: function(data) {\n\t\t\t\t\tpath = data[0].thumbnail_large;\n\t\t\t\t\tcreate(path);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (video.type === 'vzaar') {\n\t\t\t$.ajax({\n\t\t\t\ttype: 'GET',\n\t\t\t\turl: '//vzaar.com/api/videos/' + video.id + '.json',\n\t\t\t\tjsonp: 'callback',\n\t\t\t\tdataType: 'jsonp',\n\t\t\t\tsuccess: function(data) {\
52n\t\t\t\t\tpath = data.framegrab_url;\n\t\t\t\t\tcreate(path);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Stops the current video.\n\t * @public\n\t */\n\tVideo.prototype.stop = function() {\n\t\tthis._core.trigger('stop', null, 'video');\n\t\tthis._playing.find('.owl-video-frame').remove();\n\t\tthis._playing.removeClass('owl-video-playing');\n\t\tthis._playing = null;\n\t\tthis._core.leave('playing');\n\t\tthis._core.trigger('stopped', null, 'video');\n\t};\n\n\t/**\n\t * Starts the current video.\n\t * @public\n\t * @param {Event} event - The event arguments.\n\t */\n\tVideo.prototype.play = function(event) {\n\t\tvar target = $(event.target),\n\t\t\titem = target.closest('.' + this._core.settings.itemClass),\n\t\t\tvideo = this._videos[item.attr('data-video')],\n\t\t\twidth = video.width || '100%',\n\t\t\theight = video.height || this._core.$stage.height(),\n\t\t\thtml,\n\t\t\tiframe;\n\n\t\tif (this._playing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._core.enter('playing');\n\t\tthis._core.trigger('play', null, 'video');\n\n\t\titem = this._core.items(this._core.relative(item.index()));\n\n\t\tthis._core.reset(item.index());\n\n\t\thtml = $( '<iframe frameborder=\"0\" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>' );\n\t\thtml.attr( 'height', height );\n\t\thtml.attr( 'width', width );\n\t\tif (video.type === 'youtube') {\n\t\t\thtml.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id );\n\t\t} else if (video.type === 'vimeo') {\n\t\t\thtml.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' );\n\t\t} else if (video.type === 'vzaar') {\n\t\t\thtml.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' );\n\t\t}\n\n\t\tiframe = $(html).wrap( '<div class=\"owl-video-frame\" />' ).insertAfter(item.find('.owl-video'));\n\n\t\tthis._playing = item.addClass('owl-video-playing');\n\t};\n\n\t/**\n\t * Checks whether an video is currently in full screen mode or not.\n\t * @todo Bad style because looks like a readonly method but changes members.\n\t * @protected\n\t * @returns {Boolean}\n\t */\n\tVideo.prototype.isInFullScreen = function() {\n\t\tvar element = document.fullscreenElement || document.mozFullScreenElement ||\n\t\t\t\tdocument.webkitFullscreenElement;\n\n\t\treturn element && $(element).parent().hasClass('owl-video-frame');\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t */\n\tVideo.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\tthis._core.$element.off('click.owl.video');\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.Video = Video;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Animate Plugin\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the animate plugin.\n\t * @class The Navigation Plugin\n\t * @param {Owl} scope - The Owl Carousel\n\t */\n\tvar Animate = function(scope) {\n\t\tthis.core = scope;\n\t\tthis.core.options = $.extend({}, Animate.Defaults, this.core.options);\n\t\tthis.swapping = true;\n\t\tthis.previous = undefined;\n\t\tthis.next = undefined;\n\n\t\tthis.handlers = {\n\t\t\t'change.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && e.property.name == 'position') {\n\t\t\t\t\tthis.previous = this.core.current();\n\t\t\t\t\tthis.next = e.property.value;\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace) {\n\t\t\t\t\tthis.swapping = e.type == 'translated';\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'translate.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {\n\t\t\t\t\tthis.swap();\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\tthis.core.$element.on(this.handlers);\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tAnimate.Defaults = {\n\t\tanimateOut: false,\n\t\tanimateIn: false\n\t};\n\n\t/**\n\t * Toggles the animation classes whenever an translations starts.\n\t * @protected\n\t * @returns {Boolean|undefined}
52\n\t */\n\tAnimate.prototype.swap = function() {\n\n\t\tif (this.core.settings.items !== 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!$.support.animation || !$.support.transition) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.core.speed(0);\n\n\t\tvar left,\n\t\t\tclear = $.proxy(this.clear, this),\n\t\t\tprevious = this.core.$stage.children().eq(this.previous),\n\t\t\tnext = this.core.$stage.children().eq(this.next),\n\t\t\tincoming = this.core.settings.animateIn,\n\t\t\toutgoing = this.core.settings.animateOut;\n\n\t\tif (this.core.current() === this.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (outgoing) {\n\t\t\tleft = this.core.coordinates(this.previous) - this.core.coordinates(this.next);\n\t\t\tprevious.one($.support.animation.end, clear)\n\t\t\t\t.css( { 'left': left + 'px' } )\n\t\t\t\t.addClass('animated owl-animated-out')\n\t\t\t\t.addClass(outgoing);\n\t\t}\n\n\t\tif (incoming) {\n\t\t\tnext.one($.support.animation.end, clear)\n\t\t\t\t.addClass('animated owl-animated-in')\n\t\t\t\t.addClass(incoming);\n\t\t}\n\t};\n\n\tAnimate.prototype.clear = function(e) {\n\t\t$(e.target).css( { 'left': '' } )\n\t\t\t.removeClass('animated owl-animated-out owl-animated-in')\n\t\t\t.removeClass(this.core.settings.animateIn)\n\t\t\t.removeClass(this.core.settings.animateOut);\n\t\tthis.core.onTransitionEnd();\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t * @public\n\t */\n\tAnimate.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\tfor (handler in this.handlers) {\n\t\t\tthis.core.$element.off(handler, this.handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Autoplay Plugin\n * @version 2.3.4\n * @author Bartosz Wojciechowski\n * @author Artus Kolanowski\n * @author David Deutsch\n * @author Tom De Caluwé\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\t/**\n\t * Creates the autoplay plugin.\n\t * @class The Autoplay Plugin\n\t * @param {Owl} scope - The Owl Carousel\n\t */\n\tvar Autoplay = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;\n\n\t\t/**\n\t\t * The autoplay timeout id.\n\t\t * @type {Number}\n\t\t */\n\t\tthis._call = null;\n\n\t\t/**\n\t\t * Depending on the state of the plugin, this variable contains either\n\t\t * the start time of the timer or the current timer value if it's\n\t\t * paused. Since we start in a paused state we initialize the timer\n\t\t * value.\n\t\t * @type {Number}\n\t\t */\n\t\tthis._time = 0;\n\n\t\t/**\n\t\t * Stores the timeout currently used.\n\t\t * @type {Number}\n\t\t */\n\t\tthis._timeout = 0;\n\n\t\t/**\n\t\t * Indicates whenever the autoplay is paused.\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis._paused = true;\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && e.property.name === 'settings') {\n\t\t\t\t\tif (this._core.settings.autoplay) {\n\t\t\t\t\t\tthis.play();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.stop();\n\t\t\t\t\t}\n\t\t\t\t} else if (e.namespace && e.property.name === 'position' && this._paused) {\n\t\t\t\t\t// Reset the timer. This code is triggered when the position\n\t\t\t\t\t// of the carousel was changed through user interaction.\n\t\t\t\t\tthis._time = 0;\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.autoplay) {\n\t\t\t\t\tthis.play();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'play.owl.autoplay': $.proxy(function(e, t, s) {\n\t\t\t\tif (e.namespace) {\n\t\t\t\t\tthis.play(t, s);\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'stop.owl.autoplay': $.proxy(function(e) {\n\t\t\t\tif (e.namespace) {\n\t\t\t\t\tthis.stop();\n\t\t\t\t}\n\t\t\t}
52, this),\n\t\t\t'mouseover.owl.autoplay': $.proxy(function() {\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\n\t\t\t\t\tthis.pause();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'mouseleave.owl.autoplay': $.proxy(function() {\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\n\t\t\t\t\tthis.play();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'touchstart.owl.core': $.proxy(function() {\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\n\t\t\t\t\tthis.pause();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'touchend.owl.core': $.proxy(function() {\n\t\t\t\tif (this._core.settings.autoplayHoverPause) {\n\t\t\t\t\tthis.play();\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// register event handlers\n\t\tthis._core.$element.on(this._handlers);\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, Autoplay.Defaults, this._core.options);\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tAutoplay.Defaults = {\n\t\tautoplay: false,\n\t\tautoplayTimeout: 5000,\n\t\tautoplayHoverPause: false,\n\t\tautoplaySpeed: false\n\t};\n\n\t/**\n\t * Transition to the next slide and set a timeout for the next transition.\n\t * @private\n\t * @param {Number} [speed] - The animation speed for the animations.\n\t */\n\tAutoplay.prototype._next = function(speed) {\n\t\tthis._call = window.setTimeout(\n\t\t\t$.proxy(this._next, this, speed),\n\t\t\tthis._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read()\n\t\t);\n\n\t\tif (this._core.is('interacting') || document.hidden) {\n\t\t\treturn;\n\t\t}\n\t\tthis._core.next(speed || this._core.settings.autoplaySpeed);\n\t}\n\n\t/**\n\t * Reads the current timer value when the timer is playing.\n\t * @public\n\t */\n\tAutoplay.prototype.read = function() {\n\t\treturn new Date().getTime() - this._time;\n\t};\n\n\t/**\n\t * Starts the autoplay.\n\t * @public\n\t * @param {Number} [timeout] - The interval before the next animation starts.\n\t * @param {Number} [speed] - The animation speed for the animations.\n\t */\n\tAutoplay.prototype.play = function(timeout, speed) {\n\t\tvar elapsed;\n\n\t\tif (!this._core.is('rotating')) {\n\t\t\tthis._core.enter('rotating');\n\t\t}\n\n\t\ttimeout = timeout || this._core.settings.autoplayTimeout;\n\n\t\t// Calculate the elapsed time since the last transition. If the carousel\n\t\t// wasn't playing this calculation will yield zero.\n\t\telapsed = Math.min(this._time % (this._timeout || timeout), timeout);\n\n\t\tif (this._paused) {\n\t\t\t// Start the clock.\n\t\t\tthis._time = this.read();\n\t\t\tthis._paused = false;\n\t\t} else {\n\t\t\t// Clear the active timeout to allow replacement.\n\t\t\twindow.clearTimeout(this._call);\n\t\t}\n\n\t\t// Adjust the origin of the timer to match the new timeout value.\n\t\tthis._time += this.read() % timeout - elapsed;\n\n\t\tthis._timeout = timeout;\n\t\tthis._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed);\n\t};\n\n\t/**\n\t * Stops the autoplay.\n\t * @public\n\t */\n\tAutoplay.prototype.stop = function() {\n\t\tif (this._core.is('rotating')) {\n\t\t\t// Reset the clock.\n\t\t\tthis._time = 0;\n\t\t\tthis._paused = true;\n\n\t\t\twindow.clearTimeout(this._call);\n\t\t\tthis._core.leave('rotating');\n\t\t}\n\t};\n\n\t/**\n\t * Pauses the autoplay.\n\t * @public\n\t */\n\tAutoplay.prototype.pause = function() {\n\t\tif (this._core.is('rotating') && !this._paused) {\n\t\t\t// Pause the clock.\n\t\t\tthis._time = this.read();\n\t\t\tthis._paused = true;\n\n\t\t\twindow.clearTimeout(this._call);\n\t\t}\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t */\n\tAutoplay.prototype.destroy = function() {\n\t\tvar handler, property;\n\n\t\tthis.stop();\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Navigation Plugin\n * @version 2.3.4\n * @author Artus Kolanowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\t'use strict';\n\n\t/**\n\t * Creates the navigation plugin.\n\t * @class The Navigation Plugin\n\t * @param {Owl} carousel - The Owl Carousel.\n\t */\n\tvar Navigation = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;
52\n\n\t\t/**\n\t\t * Indicates whether the plugin is initialized or not.\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis._initialized = false;\n\n\t\t/**\n\t\t * The current paging indexes.\n\t\t * @protected\n\t\t * @type {Array}\n\t\t */\n\t\tthis._pages = [];\n\n\t\t/**\n\t\t * All DOM elements of the user interface.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._controls = {};\n\n\t\t/**\n\t\t * Markup for an indicator.\n\t\t * @protected\n\t\t * @type {Array.<String>}\n\t\t */\n\t\tthis._templates = [];\n\n\t\t/**\n\t\t * The carousel element.\n\t\t * @type {jQuery}\n\t\t */\n\t\tthis.$element = this._core.$element;\n\n\t\t/**\n\t\t * Overridden methods of the carousel.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._overrides = {\n\t\t\tnext: this._core.next,\n\t\t\tprev: this._core.prev,\n\t\t\tto: this._core.to\n\t\t};\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\n\t\t\t\t\tthis._templates.push('<div class=\"' + this._core.settings.dotClass + '\">' +\n\t\t\t\t\t\t$(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'added.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\n\t\t\t\t\tthis._templates.splice(e.position, 0, this._templates.pop());\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'remove.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\n\t\t\t\t\tthis._templates.splice(e.position, 1);\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && e.property.name == 'position') {\n\t\t\t\t\tthis.draw();\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && !this._initialized) {\n\t\t\t\t\tthis._core.trigger('initialize', null, 'navigation');\n\t\t\t\t\tthis.initialize();\n\t\t\t\t\tthis.update();\n\t\t\t\t\tthis.draw();\n\t\t\t\t\tthis._initialized = true;\n\t\t\t\t\tthis._core.trigger('initialized', null, 'navigation');\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'refreshed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._initialized) {\n\t\t\t\t\tthis._core.trigger('refresh', null, 'navigation');\n\t\t\t\t\tthis.update();\n\t\t\t\t\tthis.draw();\n\t\t\t\t\tthis._core.trigger('refreshed', null, 'navigation');\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, Navigation.Defaults, this._core.options);\n\n\t\t// register event handlers\n\t\tthis.$element.on(this._handlers);\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t * @todo Rename `slideBy` to `navBy`\n\t */\n\tNavigation.Defaults = {\n\t\tnav: false,\n\t\tnavText: [\n\t\t\t'<span aria-label=\"' + 'Previous' + '\">‹</span>',\n\t\t\t'<span aria-label=\"' + 'Next' + '\">›</span>'\n\t\t],\n\t\tnavSpeed: false,\n\t\tnavElement: 'button type=\"button\" role=\"presentation\"',\n\t\tnavContainer: false,\n\t\tnavContainerClass: 'owl-nav',\n\t\tnavClass: [\n\t\t\t'owl-prev',\n\t\t\t'owl-next'\n\t\t],\n\t\tslideBy: 1,\n\t\tdotClass: 'owl-dot',\n\t\tdotsClass: 'owl-dots',\n\t\tdots: true,\n\t\tdotsEach: false,\n\t\tdotsData: false,\n\t\tdotsSpeed: false,\n\t\tdotsContainer: false\n\t};\n\n\t/**\n\t * Initializes the layout of the plugin and extends the carousel.\n\t * @protected\n\t */\n\tNavigation.prototype.initialize = function() {\n\t\tvar override,\n\t\t\tsettings = this._core.settings;\n\n\t\t// create DOM structure for relative navigation\n\t\tthis._controls.$relative = (settings.navContainer ? $(settings.navContainer)\n\t\t\t: $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');\n\n\t\tthis._controls.$previous = $('<' + settings.navElement + '>')\n\t\t\t.addClass(settings.navClass[0])\n\t\t\t.html(settings.navText[0])\n\t\t\t.prependTo(this._controls.$relative)\n\t\t\t.on('click', $.proxy(function(e) {\n\t\t\t\tthis.prev(sett
52ings.navSpeed);\n\t\t\t}, this));\n\t\tthis._controls.$next = $('<' + settings.navElement + '>')\n\t\t\t.addClass(settings.navClass[1])\n\t\t\t.html(settings.navText[1])\n\t\t\t.appendTo(this._controls.$relative)\n\t\t\t.on('click', $.proxy(function(e) {\n\t\t\t\tthis.next(settings.navSpeed);\n\t\t\t}, this));\n\n\t\t// create DOM structure for absolute navigation\n\t\tif (!settings.dotsData) {\n\t\t\tthis._templates = [ $('<button role=\"button\">')\n\t\t\t\t.addClass(settings.dotClass)\n\t\t\t\t.append($('<span>'))\n\t\t\t\t.prop('outerHTML') ];\n\t\t}\n\n\t\tthis._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)\n\t\t\t: $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');\n\n\t\tthis._controls.$absolute.on('click', 'button', $.proxy(function(e) {\n\t\t\tvar index = $(e.target).parent().is(this._controls.$absolute)\n\t\t\t\t? $(e.target).index() : $(e.target).parent().index();\n\n\t\t\te.preventDefault();\n\n\t\t\tthis.to(index, settings.dotsSpeed);\n\t\t}, this));\n\n\t\t/*$el.on('focusin', function() {\n\t\t\t$(document).off(\".carousel\");\n\n\t\t\t$(document).on('keydown.carousel', function(e) {\n\t\t\t\tif(e.keyCode == 37) {\n\t\t\t\t\t$el.trigger('prev.owl')\n\t\t\t\t}\n\t\t\t\tif(e.keyCode == 39) {\n\t\t\t\t\t$el.trigger('next.owl')\n\t\t\t\t}\n\t\t\t});\n\t\t});*/\n\n\t\t// override public methods of the carousel\n\t\tfor (override in this._overrides) {\n\t\t\tthis._core[override] = $.proxy(this[override], this);\n\t\t}\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t * @protected\n\t */\n\tNavigation.prototype.destroy = function() {\n\t\tvar handler, control, property, override, settings;\n\t\tsettings = this._core.settings;\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (control in this._controls) {\n\t\t\tif (control === '$relative' && settings.navContainer) {\n\t\t\t\tthis._controls[control].html('');\n\t\t\t} else {\n\t\t\t\tthis._controls[control].remove();\n\t\t\t}\n\t\t}\n\t\tfor (override in this.overides) {\n\t\t\tthis._core[override] = this._overrides[override];\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t/**\n\t * Updates the internal state.\n\t * @protected\n\t */\n\tNavigation.prototype.update = function() {\n\t\tvar i, j, k,\n\t\t\tlower = this._core.clones().length / 2,\n\t\t\tupper = lower + this._core.items().length,\n\t\t\tmaximum = this._core.maximum(true),\n\t\t\tsettings = this._core.settings,\n\t\t\tsize = settings.center || settings.autoWidth || settings.dotsData\n\t\t\t\t? 1 : settings.dotsEach || settings.items;\n\n\t\tif (settings.slideBy !== 'page') {\n\t\t\tsettings.slideBy = Math.min(settings.slideBy, settings.items);\n\t\t}\n\n\t\tif (settings.dots || settings.slideBy == 'page') {\n\t\t\tthis._pages = [];\n\n\t\t\tfor (i = lower, j = 0, k = 0; i < upper; i++) {\n\t\t\t\tif (j >= size || j === 0) {\n\t\t\t\t\tthis._pages.push({\n\t\t\t\t\t\tstart: Math.min(maximum, i - lower),\n\t\t\t\t\t\tend: i - lower + size - 1\n\t\t\t\t\t});\n\t\t\t\t\tif (Math.min(maximum, i - lower) === maximum) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tj = 0, ++k;\n\t\t\t\t}\n\t\t\t\tj += this._core.mergers(this._core.relative(i));\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Draws the user interface.\n\t * @todo The option `dotsData` wont work.\n\t * @protected\n\t */\n\tNavigation.prototype.draw = function() {\n\t\tvar difference,\n\t\t\tsettings = this._core.settings,\n\t\t\tdisabled = this._core.items().length <= settings.items,\n\t\t\tindex = this._core.relative(this._core.current()),\n\t\t\tloop = settings.loop || settings.rewind;\n\n\t\tthis._controls.$relative.toggleClass('disabled', !settings.nav || disabled);\n\n\t\tif (settings.nav) {\n\t\t\tthis._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));\n\t\t\tthis._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));\n\t\t}\n\n\t\tthis._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);\n\n\t\tif (settings.dots) {\n\t\t\tdifference = this._pages.length - this._controls.$absolute.children().length;\n\n\t\t\tif (settings.dotsData && difference !== 0) {\n\t\t\t\tthis._controls.$absolute.html(this._templates.join(''));\n\t\t\t} else if (difference > 0) {\n\t\t\t\tthis._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));\n\t\t\t} else if (difference < 0) {\n\t\t\t\tthis._controls.$absolute.children().slice(difference).remove();\n\t\t\t}\n\n\t\t\tthis._controls.$absolute.find('.active').removeClass('active');\n\t\t\tthis._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');\n\t\t}\n\t};\n\n\t/**\n\t * Extends event data.\n\t * @protected\n\t * @param {Event} event - The event object which gets thrown.\n\t */\n\tNavigation.prototype.onTrigger = function(event) {\n\t\tvar settings = this._core.settings;\n\n\t\tevent.page = {\n\t\t\tindex: $.inArray(this.current(), this._pages),\n\t\t\tcount: this._pages.length,\n\t\t\tsize: settings && (sett
52ings.center || settings.autoWidth || settings.dotsData\n\t\t\t\t? 1 : settings.dotsEach || settings.items)\n\t\t};\n\t};\n\n\t/**\n\t * Gets the current page position of the carousel.\n\t * @protected\n\t * @returns {Number}\n\t */\n\tNavigation.prototype.current = function() {\n\t\tvar current = this._core.relative(this._core.current());\n\t\treturn $.grep(this._pages, $.proxy(function(page, index) {\n\t\t\treturn page.start <= current && page.end >= current;\n\t\t}, this)).pop();\n\t};\n\n\t/**\n\t * Gets the current succesor/predecessor position.\n\t * @protected\n\t * @returns {Number}\n\t */\n\tNavigation.prototype.getPosition = function(successor) {\n\t\tvar position, length,\n\t\t\tsettings = this._core.settings;\n\n\t\tif (settings.slideBy == 'page') {\n\t\t\tposition = $.inArray(this.current(), this._pages);\n\t\t\tlength = this._pages.length;\n\t\t\tsuccessor ? ++position : --position;\n\t\t\tposition = this._pages[((position % length) + length) % length].start;\n\t\t} else {\n\t\t\tposition = this._core.relative(this._core.current());\n\t\t\tlength = this._core.items().length;\n\t\t\tsuccessor ? position += settings.slideBy : position -= settings.slideBy;\n\t\t}\n\n\t\treturn position;\n\t};\n\n\t/**\n\t * Slides to the next item or page.\n\t * @public\n\t * @param {Number} [speed=false] - The time in milliseconds for the transition.\n\t */\n\tNavigation.prototype.next = function(speed) {\n\t\t$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);\n\t};\n\n\t/**\n\t * Slides to the previous item or page.\n\t * @public\n\t * @param {Number} [speed=false] - The time in milliseconds for the transition.\n\t */\n\tNavigation.prototype.prev = function(speed) {\n\t\t$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);\n\t};\n\n\t/**\n\t * Slides to the specified item or page.\n\t * @public\n\t * @param {Number} position - The position of the item or page.\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\n\t * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.\n\t */\n\tNavigation.prototype.to = function(position, speed, standard) {\n\t\tvar length;\n\n\t\tif (!standard && this._pages.length) {\n\t\t\tlength = this._pages.length;\n\t\t\t$.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);\n\t\t} else {\n\t\t\t$.proxy(this._overrides.to, this._core)(position, speed);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Hash Plugin\n * @version 2.3.4\n * @author Artus Kolanowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\t'use strict';\n\n\t/**\n\t * Creates the hash plugin.\n\t * @class The Hash Plugin\n\t * @param {Owl} carousel - The Owl Carousel\n\t */\n\tvar Hash = function(carousel) {\n\t\t/**\n\t\t * Reference to the core.\n\t\t * @protected\n\t\t * @type {Owl}\n\t\t */\n\t\tthis._core = carousel;\n\n\t\t/**\n\t\t * Hash index for the items.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._hashes = {};\n\n\t\t/**\n\t\t * The carousel element.\n\t\t * @type {jQuery}\n\t\t */\n\t\tthis.$element = this._core.$element;\n\n\t\t/**\n\t\t * All event handlers.\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._handlers = {\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && this._core.settings.startPosition === 'URLHash') {\n\t\t\t\t\t$(window).trigger('hashchange.owl.navigation');\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace) {\n\t\t\t\t\tvar hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');\n\n\t\t\t\t\tif (!hash) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._hashes[hash] = e.content;\n\t\t\t\t}\n\t\t\t}, this),\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\n\t\t\t\tif (e.namespace && e.property.name === 'position') {\n\t\t\t\t\tvar current = this._core.items(this._core.relative(this._core.current())),\n\t\t\t\t\t\thash = $.map(this._hashes, function(item, hash) {\n\t\t\t\t\t\t\treturn item === current ? hash : null;\n\t\t\t\t\t\t}).join();\n\n\t\t\t\t\tif (!hash || window.location.hash.slice(1) === hash) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\twindow.location.hash = hash;\n\t\t\t\t}\n\t\t\t}, this)\n\t\t};\n\n\t\t// set default options\n\t\tthis._core.options = $.extend({}, Hash.Defaults, this._core.options);\n\n\t\t// register the event handlers\n\t\tthis.$element.on(this._handlers);\n\n\t\t// register event listener for hash navigation\n\t\t$(window).on('hashchange.owl.navigation', $.proxy(function(e) {\n\t\t\tvar hash = window.location.hash.substring(1),\n\t\t\t\titems = this._core.$stage.children(),\n\t\t\t\tposition = this._hashes[hash] && items.index(this._hashes[hash]);\n\n\t\t\tif (position === undefined || position === this._core.current()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._core.to(this._core.relative(position), false, true);\n\t\t}, this));\n\t};\n\n\t/**\n\t * Default options.\n\t * @public\n\t */\n\tHash.Defaults = {\n\t\tURLhashListener: false\n\t};\n\n\t/**\n\t * Destroys the plugin.\n\t * @public\n\t */\n\tHash.prototype.destroy = function() {\
52n\t\tvar handler, property;\n\n\t\t$(window).off('hashchange.owl.navigation');\n\n\t\tfor (handler in this._handlers) {\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\n\t\t}\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\n\t\t}\n\t};\n\n\t$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;\n\n})(window.Zepto || window.jQuery, window, document);\n\n/**\n * Support Plugin\n *\n * @version 2.3.4\n * @author Vivid Planet Software GmbH\n * @author Artus Kolanowski\n * @author David Deutsch\n * @license The MIT License (MIT)\n */\n;(function($, window, document, undefined) {\n\n\tvar style = $('<support>').get(0).style,\n\t\tprefixes = 'Webkit Moz O ms'.split(' '),\n\t\tevents = {\n\t\t\ttransition: {\n\t\t\t\tend: {\n\t\t\t\t\tWebkitTransition: 'webkitTransitionEnd',\n\t\t\t\t\tMozTransition: 'transitionend',\n\t\t\t\t\tOTransition: 'oTransitionEnd',\n\t\t\t\t\ttransition: 'transitionend'\n\t\t\t\t}\n\t\t\t},\n\t\t\tanimation: {\n\t\t\t\tend: {\n\t\t\t\t\tWebkitAnimation: 'webkitAnimationEnd',\n\t\t\t\t\tMozAnimation: 'animationend',\n\t\t\t\t\tOAnimation: 'oAnimationEnd',\n\t\t\t\t\tanimation: 'animationend'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttests = {\n\t\t\tcsstransforms: function() {\n\t\t\t\treturn !!test('transform');\n\t\t\t},\n\t\t\tcsstransforms3d: function() {\n\t\t\t\treturn !!test('perspective');\n\t\t\t},\n\t\t\tcsstransitions: function() {\n\t\t\t\treturn !!test('transition');\n\t\t\t},\n\t\t\tcssanimations: function() {\n\t\t\t\treturn !!test('animation');\n\t\t\t}\n\t\t};\n\n\tfunction test(property, prefixed) {\n\t\tvar result = false,\n\t\t\tupper = property.charAt(0).toUpperCase() + property.slice(1);\n\n\t\t$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {\n\t\t\tif (style[property] !== undefined) {\n\t\t\t\tresult = prefixed ? property : true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tfunction prefixed(property) {\n\t\treturn test(property, true);\n\t}\n\n\tif (tests.csstransitions()) {\n\t\t/* jshint -W053 */\n\t\t$.support.transition = new String(prefixed('transition'))\n\t\t$.support.transition.end = events.transition.end[ $.support.transition ];\n\t}\n\n\tif (tests.cssanimations()) {\n\t\t/* jshint -W053 */\n\t\t$.support.animation = new String(prefixed('animation'))\n\t\t$.support.animation.end = events.animation.end[ $.support.animation ];\n\t}\n\n\tif (tests.csstransforms()) {\n\t\t/* jshint -W053 */\n\t\t$.support.transform = new String(prefixed('transform'));\n\t\t$.support.transform3d = tests.csstransforms3d();\n\t}\n\n})(window.Zepto || window.jQuery, window, document);\n\n\n//# sourceURL=webpack://umbracoframework/./node_modules/owl.carousel/dist/owl.carousel.js?"); 53 54/***/ }), 55 56/***/ 669: 57/***/ ((module) => { 58 59"use strict"; 60module.exports = jQuery; 61 62/***/ }) 63 64/******/ }); 65/************************************************************************/ 66/******/ // The module cache 67/******/ var __webpack_module_cache__ = {}; 68/******/ 69/******/ // The require function 70/******/ function __webpack_require__(moduleId) { 71/******/ // Check if module is in cache 72/******/ var cachedModule = __webpack_module_cache__[moduleId]; 73/******/ if (cachedModule !== undefined) { 74/******/ return cachedModule.exports; 75/******/ } 76/******/ // Create a new module (and put it into the cache) 77/******/ var module = __webpack_module_cache__[moduleId] = { 78/******/ // no module.id needed 79/******/ // no module.loaded needed 80/******/ exports: {} 81/******/ }; 82/******/ 83/******/ // Execute the module function 84/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); 85/******/ 86/******/ // Return the exports of the module 87/******/ return module.exports; 88/******/ } 89/******/ 90/************************************************************************/ 91/******/ /* webpack/runtime/compat get default export */ 92/******/ (() => { 93/******/ // getDefaultExport function for compatibility with non-harmony modules 94/******/ __webpack_require__.n = (module) => {
95/******/ var getter = module && module.__esModule ? 96/******/ () => (module['default']) : 97/******/ () => (module); 98/******/ __webpack_require__.d(getter, { a: getter }); 99/******/ return getter; 100/******/ }; 101/******/ })(); 102/******/ 103/******/ /* webpack/runtime/define property getters */ 104/******/ (() => { 105/******/ // define getter functions for harmony exports 106/******/ __webpack_require__.d = (exports, definition) => { 107/******/ for(var key in definition) { 108/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 109/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 110/******/ } 111/******/ } 112/******/ }; 113/******/ })(); 114/******/ 115/******/ /* webpack/runtime/hasOwnProperty shorthand */ 116/******/ (() => { 117/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 118/******/ })(); 119/******/ 120/************************************************************************/ 121/******/ 122/******/ // startup 123/******/ // Load entry module and return exports 124/******/ // This entry module can't be inlined because the eval devtool is used. 125/******/ __webpack_require__(250); 126/******/ var __webpack_exports__ = __webpack_require__(830); 127/******/ 128/******/ })() 129;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.