{"version":3,"sources":["app/js/common/main.js","app/js/common/utils.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"main.js","sourcesContent":["//main menu trigger\r\n$(document).ready(function () {\r\n //main menu\r\n const modalTimeout = 300;\r\n const mainMenuTrigger = $('.main-menu-trigger');\r\n const mainMenuMobileDropdownTrigger = $('.js-mobile-dropdown-trigger');\r\n const secMenuMobileDropdownTrigger = $('.js-mobile-sec-dropdown-trigger');\r\n const mainMenu = $('.main-menu');\r\n const bodyContainer = $('body'); //$('#body-content');\r\n\r\n const copyKeyButton = $('.copy-key');\r\n // main menu trigger\r\n mainMenuTrigger.click(function () {\r\n $(mainMenuTrigger).toggleClass('active');\r\n $(mainMenu).toggleClass('is-mobile');\r\n });\r\n\r\n // mobile menu only -toggle for secondary menus\r\n $(mainMenuMobileDropdownTrigger).each(function () {\r\n $(this).on('click', function () {\r\n if (mainMenu.hasClass('is-mobile')) {\r\n if ($(this).hasClass('is-active')) {\r\n $(this)\r\n .removeClass('is-active')\r\n .next('div')\r\n .slideUp();\r\n } else {\r\n mainMenuMobileDropdownTrigger\r\n .removeClass('is-active')\r\n .next('div')\r\n .slideUp();\r\n $(this).addClass('is-active');\r\n $(this)\r\n .next('div')\r\n .slideToggle();\r\n }\r\n }\r\n });\r\n });\r\n\r\n copyKeyButton.click(\r\n function () {\r\n var subscriptionId = $(this).data(\"subscription-id\");\r\n var productKeyIdSelector = \"#product-key\";\r\n if (subscriptionId)\r\n productKeyIdSelector += \"-\" + subscriptionId;\r\n $(productKeyIdSelector).copyToClipboard();\r\n });\r\n\r\n $(secMenuMobileDropdownTrigger).each(function () {\r\n $(this).on('click', function () {\r\n $(this).toggleClass('is-active');\r\n $(this)\r\n .next('ul')\r\n .slideToggle();\r\n });\r\n });\r\n\r\n //download switch content\r\n const downloadTimelineBtn = document.querySelectorAll('.js-timeline-maker-download');\r\n const downloadTimelinePreContent = document.querySelectorAll('.js-timeline-pre-download');\r\n const downloadTimelinePostContent = document.querySelectorAll('.js-timeline-post-download');\r\n\r\n $(downloadTimelineBtn).click(function () {\r\n\r\n $(downloadTimelinePostContent).show();\r\n $(downloadTimelinePreContent).hide();\r\n downloadScroll();\r\n function downloadScroll() {\r\n $(document).scrollTop($(\".header--download\")[0].getBoundingClientRect().bottom + $(window).scrollTop());\r\n }\r\n });\r\n\r\n const tableCompareToggle = document.querySelectorAll('.js-compare-toggle');\r\n $(tableCompareToggle).each(function () {\r\n $(this).on('click', function () {\r\n $(this)\r\n .next('.comparison')\r\n .slideToggle('slow');\r\n $(this).toggleClass('is-active');\r\n });\r\n }); \r\n\r\n // accordion component\r\n let accordion = document.querySelectorAll('.accordion__item');\r\n $(accordion).each(function () {\r\n let accordionTitle = this.querySelector('.accordion__title');\r\n let accordionContent = this.querySelector('accordion__content');\r\n\r\n $(accordionTitle).click(function () {\r\n $(this).toggleClass('active');\r\n $(this)\r\n .next(accordionContent)\r\n .slideToggle('300');\r\n });\r\n });\r\n\r\n // tabs\r\n $('ul.tabs-nav li a').click(function (e) {\r\n e.preventDefault();\r\n var tab_id = $(this).attr('href');\r\n\r\n $('ul.tabs-nav li').removeClass('active');\r\n $('.tab-pane').removeClass('active');\r\n\r\n $(this)\r\n .parent()\r\n .addClass('active');\r\n $(tab_id).addClass('active');\r\n });\r\n\r\n // footer menu accordion\r\n $('.footer__menu ul li:first-child').each(function () {\r\n $(this).on('click', function () {\r\n if (isMobileOrTabletDevice()) {\r\n var jqSelf = $(this);\r\n var isVisible = jqSelf.siblings('li').is(':visible');\r\n if (isVisible) {\r\n jqSelf.siblings('li').slideUp();\r\n } else {\r\n $('.footer__menu ul li:not(:first-child)').slideUp();\r\n jqSelf.siblings('li').slideDown();\r\n }\r\n }\r\n });\r\n });\r\n\r\n $('.js-copy-clipboard').click(function (e) {\r\n e.preventDefault();\r\n var jqSelf = $(this);\r\n var removeDone = function () {\r\n jqSelf.removeClass('done');\r\n };\r\n\r\n if (jqSelf.hasClass('done')) {\r\n removeDone()\r\n } else {\r\n jqSelf.addClass('done');\r\n jqSelf.find('.btn-copy__step-1').addClass('fade-in-animation');\r\n setTimeout(removeDone, 3000);\r\n }\r\n });\r\n\r\n //document pagination\r\n $(document).on('submit', '.pagination form', function (e) {\r\n var jqSelf = $(this);\r\n var jqPagination = jqSelf.closest('.pagination');\r\n var totalPages = Number(jqPagination.find('.total-pages').html());\r\n var currentPage = Number(jqPagination.find('#CurrentPage').attr('value'));\r\n var newCurrentPage = Number(jqPagination.find('#CurrentPage').val());\r\n\r\n if (1 > newCurrentPage || newCurrentPage > totalPages ||\r\n currentPage === newCurrentPage || isNaN(newCurrentPage)) {\r\n e.preventDefault();\r\n jqPagination.find('#CurrentPage').val(currentPage);\r\n }\r\n });\r\n\r\n $('.js-open-gallery').click(function (e) {\r\n e.preventDefault();\r\n $('.js-gallery').addClass('is-open');\r\n $('html, body').addClass('modal-open');\r\n });\r\n $('.js-close-gallery').click(function (e) {\r\n e.preventDefault();\r\n $('.js-gallery').removeClass('is-open');\r\n $('html, body').removeClass('modal-open');\r\n });\r\n\r\n // generic modal\r\n const openModals = '.js-open-modal';\r\n\r\n $(document).on('click', openModals, function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const scroolbarWidth = _getScrollbarWidth();\r\n\r\n if (scroolbarWidth > 0) {\r\n bodyContainer.css(\"padding-right\", `${scroolbarWidth}px`);\r\n }\r\n\r\n var jqSelf = $(e.currentTarget);\r\n var modalElem = jqSelf.data('modal');\r\n\r\n if (modalElem) {\r\n var jqModalElem = $(\"#\" + modalElem);\r\n toggleBodyScroll();\r\n\r\n jqModalElem.fadeIn(modalTimeout);\r\n \r\n const modalHeight = _getModalSrollbar()\r\n if (modalHeight < 0 && $('.modal__main').not('.opacity-0')) {\r\n $('.modal__main').not('.opacity-0').css(\"padding-right\", '');\r\n } else {\r\n $('.modal__main').not('.opacity-0').css(\"padding-right\", `${scroolbarWidth}px`);\r\n }\r\n\r\n // remove modal when clicking outside it\r\n $(document).bind('mousedown', hideAnyModal);\r\n }\r\n\r\n });\r\n\r\n // closing modal manually\r\n const modalClose = '.js-modal-close';\r\n $(document).on('click', modalClose, function (e) {\r\n hideCurrentModal($(this));\r\n if (!$(\".modal:visible\").exists()) {\r\n $(document).unbind('mousedown', hideAnyModal);\r\n }\r\n });\r\n\r\n // closing modal on Escape\r\n $(document).on('keydown', function (event) {\r\n if (event.key === \"Escape\") {\r\n hideCurrentModal($(\".modal:visible\").first());\r\n if (!$(\".modal:visible\").exists()) {\r\n $(document).unbind('mousedown', hideAnyModal);\r\n }\r\n }\r\n });\r\n\r\n $(window).resize(function (e) {\r\n resizeFooterNavigation();\r\n });\r\n});\r\n\r\nfunction hideCurrentModal(jqHide) {\r\n jqHide.closest('.modal').fadeOut('1000');\r\n closeSubscriptionSlider(jqHide);\r\n hideModalUnderSeeExamples();\r\n updatePaddingOnModalClose();\r\n $(document).unbind('mousedown', hideAnyModal);\r\n}\r\n\r\nfunction hideAnyModal(event) {\r\n var jqSelf = $(event.target);\r\n var isOutsideModal = !jqSelf.closest(\".modal__box\").exists();\r\n var isModalScrollBar = jqSelf.hasClass(\"modal__main\");\r\n var isOutsideConsentBanner = !jqSelf.closest('.cc-window').exists();\r\n if (isOutsideModal && isOutsideConsentBanner && !isModalScrollBar) {\r\n var jqModal = $('.modal__box:visible').first();\r\n if (jqModal.exists()) {\r\n var modal = jqModal.closest('.modal').not('[data-check-login-modal]');\r\n\r\n // Hide only the modals that are most top of the elements\r\n var modalZIndex = parseFloat(modal.css('z-index')) || 0;\r\n var targetZIndex = jqSelf.getZIndexOfNearestParent() || 0;\r\n\r\n if (modalZIndex >= targetZIndex) {\r\n modal.fadeOut('1000');\r\n closeSubscriptionSlider(modal);\r\n hideModalUnderSeeExamples();\r\n updatePaddingOnModalClose();\r\n }\r\n }\r\n\r\n if (!$(\".modal:visible\").exists()) {\r\n $(document).unbind('mousedown', hideAnyModal);\r\n }\r\n }\r\n}\r\n\r\nfunction _getScrollbarWidth() {\r\n const bodyWidth = document.body.getBoundingClientRect().width\r\n const scrollbarWidth = window.innerWidth - bodyWidth\r\n return scrollbarWidth\r\n}\r\n\r\n//check if the modal is high enough to add a scrollbar\r\nfunction _getModalSrollbar() {\r\n const windowHeight = $(window).height()\r\n const modalHeight = $('.modal__main:visible > .modal__container').outerHeight()\r\n const modalScrollbarHeight = windowHeight - modalHeight\r\n return modalScrollbarHeight\r\n}\r\n\r\n//close modal and apply the required padding to it\r\nfunction updatePaddingOnModalClose() {\r\n const isOverflowVisible = $(\"html\").hasClass(\"overflow-hidden\");\r\n if (!isOverflowVisible) {\r\n $('body').css(\"padding-right\", '');\r\n \r\n const scroolbarWidth = _getScrollbarWidth();\r\n const modalHeight = _getModalSrollbar()\r\n\r\n if (modalHeight <= 0) {\r\n $('.modal__main').not('.opacity-0').css(\"padding-right\", '');\r\n } else {\r\n $('.modal__main').not('.opacity-0').css(\"padding-right\", `${scroolbarWidth}px`);\r\n }\r\n }\r\n}\r\n\r\nfunction isMobileOrTabletDevice() {\r\n return window.matchMedia(\"(max-width: 991.98px)\").matches;\r\n}\r\n\r\nfunction resizeFooterNavigation() {\r\n $('.footer__menu ul > li:first-child').each(function (ind, el) {\r\n var jqSelf = $(el);\r\n var isVisible = jqSelf.siblings('li').is(':visible');\r\n if (isMobileOrTabletDevice()) {\r\n jqSelf.siblings('li').slideUp();\r\n } else {\r\n jqSelf.siblings('li').slideDown();\r\n }\r\n });\r\n}\r\n\r\nfunction toggleBodyScroll() {\r\n if ($(\"html\").hasClass(\"overflow-hidden\") && $(\".modal\").is(\":visible\")) {\r\n if (!$(\"#basic-pro-plus-slider\").is(\":visible\")) {\r\n return;\r\n } else {\r\n $(\"html\").removeClass(\"overflow-hidden\");\r\n }\r\n\r\n } else {\r\n $(\"html\").addClass(\"overflow-hidden\");\r\n }\r\n};\r\n\r\nfunction closeSubscriptionSlider(target) {\r\n if ($(target).attr(\"data-modal\") == \"basic-pro-plus-slider\") {\r\n $(\"html\").addClass(\"overflow-hidden\");\r\n } else {\r\n\r\n if ($(target).closest(\"#basic-pro-plus-slider\").exists()) {\r\n return;\r\n } else {\r\n $(\"html\").removeClass(\"overflow-hidden\");\r\n }\r\n }\r\n\r\n};\r\n\r\n//check if the See Examples modal is opened (on subscriptions)\r\nfunction hideModalUnderSeeExamples() {\r\n if ($(\"#basic-pro-plus-slider\").is(\":visible\") || $(\"#basic-pro-plus-slider\").siblings(\".modal\").hasClass(\"opacity-0\")) {\r\n $(\"#basic-pro-plus-slider\").siblings(\".modal\").removeClass(\"opacity-0\");\r\n }\r\n}","jQuery.fn.putCursorAtEnd = function () {\r\n\r\n return this.each(function () {\r\n\r\n // Cache references\r\n var $el = $(this),\r\n el = this;\r\n\r\n // Only focus if input isn't already\r\n if (!$el.is(\":focus\")) {\r\n $el.focus();\r\n }\r\n\r\n // If this function exists... (IE 9+)\r\n if (el.setSelectionRange) {\r\n\r\n // Double the length because Opera is inconsistent about whether a carriage return is one character or two.\r\n var len = $el.val().length * 2;\r\n\r\n // Timeout seems to be required for Blink\r\n setTimeout(function () {\r\n el.setSelectionRange(len, len);\r\n }, 1);\r\n\r\n } else {\r\n\r\n // As a fallback, replace the contents with itself\r\n // Doesn't work in Chrome, but Chrome supports setSelectionRange\r\n $el.val($el.val());\r\n\r\n }\r\n\r\n // Scroll to the bottom, in case we're in a tall textarea\r\n // (Necessary for Firefox and Chrome)\r\n this.scrollTop = 999999;\r\n\r\n });\r\n\r\n};\r\n\r\njQuery.fn.copyToClipboard = function () {\r\n\r\n return this.each(function () {\r\n // is element selectable?\r\n if (this.select) {\r\n copySelect(this);\r\n } else {\r\n copyContent(this);\r\n }\r\n });\r\n};\r\n\r\njQuery.fn.slideFlexDown = function (force) {\r\n\r\n return this.each(function () {\r\n\r\n // Cache references\r\n var $el = $(this);\r\n\r\n $el.slideDown({\r\n start: function () {\r\n if (force === true) {\r\n // needed for Safari browser\r\n $el.css('display', 'block');\r\n setTimeout(function () { $el.css('display', 'flex'); }, 50)\r\n } else {\r\n $el.css('display', 'flex');\r\n }\r\n }\r\n });\r\n });\r\n};\r\n\r\njQuery.fn.showModal = function () {\r\n\r\n return this.each(function () {\r\n\r\n // Cache references\r\n var $el = $(this);\r\n var modalTimeout = 300;\r\n\r\n var jqModalElem = $el;\r\n var jqModalBox = jqModalElem.find(\".modal__box\");\r\n\r\n jqModalElem.fadeIn(modalTimeout);\r\n jqModalBox.fadeIn(300);\r\n\r\n // remove modal when clicking outside it\r\n $(document).bind('click', hideAnyModal);\r\n });\r\n};\r\n\r\njQuery.fn.isInViewport = function () {\r\n var $el = this;\r\n\r\n let elementTop = $el.offset().top;\r\n let elementHeight = $el.outerHeight();\r\n let elementBottom = elementTop + elementHeight;\r\n\r\n let viewportTop = $(window).scrollTop();\r\n let winHeight = $(window).height();\r\n let viewportBottom = viewportTop + winHeight;\r\n\r\n return elementBottom > viewportTop && elementTop < viewportBottom;\r\n};\r\n\r\njQuery.fn.isFullInViewport = function () {\r\n var $el = this;\r\n\r\n let elementTop = $el.offset().top;\r\n let elementHeight = $el.outerHeight();\r\n let elementBottom = elementTop + elementHeight;\r\n\r\n let viewportTop = $(window).scrollTop();\r\n let winHeight = $(window).height();\r\n let viewportBottom = viewportTop + winHeight;\r\n\r\n return viewportBottom <= elementBottom && elementTop <= (viewportTop + 50);\r\n};\r\n\r\njQuery.fn.scrollOnto = function (speed) {\r\n\r\n return this.each(function () {\r\n\r\n // Cache references\r\n var jqSelf = $(this);\r\n\r\n speed = isNaN(speed) ? 500 : speed, offset = -10;\r\n\r\n $('body,html').stop(false, false).animate({\r\n scrollTop: jqSelf.offset().top + offset\r\n }, speed, 'linear');\r\n });\r\n};\r\n\r\njQuery.fn.borderFocus = function () {\r\n return this.each(function () {\r\n $(this).addClass('border-animation').focus();\r\n });\r\n};\r\n\r\n$.fn.exists = function () {\r\n return this.length > 0;\r\n}\r\n\r\njQuery.fn.getZIndexOfNearestParent = function () {\r\n\r\n // Cache references\r\n var jqSelf = $(this);\r\n\r\n var recursiveZIndexSearch = function (element) {\r\n \r\n // Break on body.\r\n if (element[0] === $('body')[0]) {\r\n return 2;\r\n }\r\n\r\n // Get parent element\r\n var jqParent = element.parent();\r\n if (jqParent.length == 0) {\r\n return 0;\r\n }\r\n\r\n // Check if parent has z-index\r\n var zIndex = jqParent.css('z-index');\r\n if (zIndex.length > 0 && !(/\\D/).test(zIndex)) {\r\n\r\n // Return found z-index.\r\n return zIndex;\r\n }\r\n\r\n // Z-index not found, try again on next parent.\r\n return recursiveZIndexSearch(jqParent);\r\n };\r\n\r\n return parseFloat(recursiveZIndexSearch(jqSelf));\r\n};\r\n\r\njQuery.fn.visible = function () {\r\n return this.css('visibility', 'visible');\r\n};\r\n\r\njQuery.fn.invisible = function () {\r\n return this.css('visibility', 'hidden');\r\n};\r\n\r\n\r\nif (window.ko) {\r\n\r\n // Here's a custom Knockout binding that makes elements shown/hidden via jQuery's fadeIn() /fadeOut() methods\r\n ko.bindingHandlers.fadeVisible = {\r\n init: function (element, valueAccessor) {\r\n // Initially set the element to be instantly visible/hidden depending on the value\r\n var value = valueAccessor();\r\n $(element).toggle(ko.unwrap(value)); // Use \"unwrapObservable\" so we can handle values that may or may not be observable\r\n },\r\n update: function (element, valueAccessor) {\r\n // Whenever the value subsequently changes, slowly fade the element in or out\r\n var value = valueAccessor();\r\n ko.unwrap(value) ? $(element).fadeIn() : $(element).fadeOut();\r\n }\r\n };\r\n\r\n var alreadySlided = false;\r\n ko.bindingHandlers.oneTimeSlideVisible = {\r\n init: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n $(element).toggle(ko.unwrap(value));\r\n },\r\n update: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n if (ko.unwrap(value)) {\r\n var isHidden = $(element).is(':hidden');\r\n if (isHidden && !alreadySlided) {\r\n $(element).slideDown();\r\n alreadySlided = true;\r\n } else {\r\n $(element).show();\r\n }\r\n } else {\r\n $(element).hide();\r\n }\r\n }\r\n };\r\n}\r\n\r\n// Event that fires when an Element is changing its height\r\nfunction onElementHeightChange(elm, callback) {\r\n var lastHeight = elm.clientHeight, newHeight;\r\n (function run() {\r\n newHeight = elm.clientHeight;\r\n if (lastHeight != newHeight)\r\n callback(newHeight)\r\n lastHeight = newHeight\r\n\r\n if (elm.onElementHeightChangeTimer)\r\n clearTimeout(elm.onElementHeightChangeTimer)\r\n\r\n elm.onElementHeightChangeTimer = setTimeout(run, 200)\r\n })();\r\n}\r\n\r\n// Attach an event handler function for one or more events to the selected elements if the event was not triggered for a given interval. \r\n// Refer to https://github.com/yckart/jquery.unevent.js\r\n; (function ($) {\r\n var on = $.fn.on, timer;\r\n $.fn.on = function () {\r\n var args = Array.apply(null, arguments);\r\n var last = args[args.length - 1];\r\n\r\n if (isNaN(last) || (last === 1 && args.pop())) return on.apply(this, args);\r\n\r\n var delay = args.pop();\r\n var fn = args.pop();\r\n\r\n args.push(function () {\r\n var self = this, params = arguments;\r\n clearTimeout(timer);\r\n timer = setTimeout(function () {\r\n fn.apply(self, params);\r\n }, delay);\r\n });\r\n\r\n return on.apply(this, args);\r\n };\r\n}(this.jQuery || this.Zepto));\r\n\r\n// Detecting browsers by ducktyping\r\n; (function ($) {\r\n $.getBrowser = function () {\r\n // Opera 8.0+\r\n var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;\r\n\r\n // Firefox 1.0+\r\n var isFirefox = typeof InstallTrigger !== 'undefined';\r\n\r\n // Safari 3.0+ \"[object HTMLElementConstructor]\" \r\n var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === \"[object SafariRemoteNotification]\"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));\r\n\r\n // Internet Explorer 6-11\r\n var isIE = /*@cc_on!@*/false || !!document.documentMode;\r\n\r\n // Edge 20+\r\n var isEdge = !isIE && !!window.StyleMedia;\r\n\r\n // Chrome 1 - 79\r\n var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);\r\n\r\n // Edge (based on chromium) detection\r\n var isEdgeChromium = isChrome && (navigator.userAgent.indexOf(\"Edg\") != -1);\r\n\r\n // Blink engine detection\r\n var isBlink = (isChrome || isOpera) && !!window.CSS;\r\n\r\n if (isFirefox) return 'Firefox';\r\n if (isChrome) return 'Chrome';\r\n if (isSafari) return 'Safari';\r\n if (isOpera) return 'Opera';\r\n if (isIE) return 'IE';\r\n if (isEdgeChromium) return 'EdgeChromium';\r\n if (isBlink) return 'Blink';\r\n };\r\n}(jQuery));\r\n\r\nfunction copySelect(input) {\r\n input.select();\r\n input.setSelectionRange(0, 99999); /*For mobile devices*/\r\n\r\n try {\r\n document.execCommand('copy');\r\n input.blur();\r\n }\r\n catch (err) {\r\n console.log(err.message);\r\n }\r\n}\r\n\r\nfunction copyContent(element) {\r\n var range = document.createRange();\r\n range.selectNodeContents(element);\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n try {\r\n document.execCommand('copy');\r\n } catch (err) {\r\n console.log(err.message);\r\n }\r\n\r\n selection.removeAllRanges();\r\n}"]}