PageSourceSearch

https://www.harbourtrust.gov.au/assets/scripts/component.min.js?v=202608201647

js harbourtrust.gov.au collected 2026-10-02 07:53:07 UTC 345,377 bytes, 129 lines download raw bytes

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: ['&#8592;', '&#8594;'],\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: ['&#8592;', '&#8594;'],\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: [\"&#10094;\", \"&#10095;\"],\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\">&lsaquo;</li>' + '<li data-view=\"years current\"></li>' + '<li data-view=\"years next\">
23&rsaquo;</li>' + '</ul>' + '<ul data-view=\"years\"></ul>' + '</div>' + '<div class=\"datepicker-panel\" data-view=\"months picker\">' + '<ul>' + '<li data-view=\"year prev\">&lsaquo;</li>' + '<li data-view=\"year current\"></li>' + '<li data-view=\"year next\">&rsaquo;</li>' + '</ul>' + '<ul data-view=\"months\"></ul>' + '</div>' + '<div class=\"datepicker-panel\" data-view=\"days picker\">' + '<ul>' + '<li data-view=\"month prev\">&lsaquo;</li>' + '<li data-view=\"month current\"></li>' + '<li data-view=\"month next\">&rsaquo;</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' + '\">&#x2039;</span>',\n\t\t\t'<span aria-label=\"' + 'Next' + '\">&#x203a;</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.