{"version":3,"file":"globalscripts.bundle.js","sources":["../../../Static/src/global-scripts/bootstrap.js","../../../Static/src/global-scripts/functions.js","../../../Static/src/global-scripts/mvcfoolproof.unobtrusive.js","../../../Static/src/global-scripts/tollCalculator.js"],"sourcesContent":["/*!\r\n * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/)\r\n */\r\n\r\n/*!\r\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\r\n * Copyright 2011-2023 Twitter, Inc.\r\n * Licensed under the MIT license\r\n */\r\n\r\nif (typeof jQuery === 'undefined') {\r\n throw new Error('Bootstrap\\'s JavaScript requires jQuery')\r\n}\r\n\r\n(function ($) {\r\n 'use strict';\r\n var version = $.fn.jquery.split(' ')[0].split('.')\r\n if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {\r\n throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')\r\n }\r\n})(jQuery);\r\n\r\n/* ========================================================================\r\n * Bootstrap: tooltip.js v3.4.1\r\n * https://getbootstrap.com/docs/3.4/javascript/#tooltip\r\n * Inspired by the original jQuery.tipsy by Jason Frame\r\n * ========================================================================\r\n * Copyright 2011-2019 Twitter, Inc.\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\n * ======================================================================== */\r\n\r\n(function ($) {\r\n 'use strict';\r\n\r\n var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\r\n\r\n var uriAttrs = [\r\n 'background',\r\n 'cite',\r\n 'href',\r\n 'itemtype',\r\n 'longdesc',\r\n 'poster',\r\n 'src',\r\n 'xlink:href'\r\n ]\r\n\r\n var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\r\n\r\n var DefaultWhitelist = {\r\n // Global attributes allowed on any supplied element below.\r\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\r\n a: ['target', 'href', 'title', 'rel'],\r\n area: [],\r\n b: [],\r\n br: [],\r\n col: [],\r\n code: [],\r\n div: [],\r\n em: [],\r\n hr: [],\r\n h1: [],\r\n h2: [],\r\n h3: [],\r\n h4: [],\r\n h5: [],\r\n h6: [],\r\n i: [],\r\n img: ['src', 'alt', 'title', 'width', 'height'],\r\n li: [],\r\n ol: [],\r\n p: [],\r\n pre: [],\r\n s: [],\r\n small: [],\r\n span: [],\r\n sub: [],\r\n sup: [],\r\n strong: [],\r\n u: [],\r\n ul: [],\r\n button: ['type', 'class', 'data-dismiss', 'aria-hidden'],\r\n }\r\n\r\n /**\r\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\r\n *\r\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\r\n */\r\n var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\r\n\r\n /**\r\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\r\n *\r\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\r\n */\r\n var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\r\n\r\n function allowedAttribute(attr, allowedAttributeList) {\r\n var attrName = attr.nodeName.toLowerCase()\r\n\r\n if ($.inArray(attrName, allowedAttributeList) !== -1) {\r\n if ($.inArray(attrName, uriAttrs) !== -1) {\r\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\r\n }\r\n\r\n return true\r\n }\r\n\r\n var regExp = $(allowedAttributeList).filter(function (index, value) {\r\n return value instanceof RegExp\r\n })\r\n\r\n // Check if a regular expression validates the attribute.\r\n for (var i = 0, l = regExp.length; i < l; i++) {\r\n if (attrName.match(regExp[i])) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n }\r\n\r\n function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\r\n if (unsafeHtml.length === 0) {\r\n return unsafeHtml\r\n }\r\n\r\n if (sanitizeFn && typeof sanitizeFn === 'function') {\r\n return sanitizeFn(unsafeHtml)\r\n }\r\n\r\n // IE 8 and below don't support createHTMLDocument\r\n if (!document.implementation || !document.implementation.createHTMLDocument) {\r\n return unsafeHtml\r\n }\r\n\r\n var createdDocument = document.implementation.createHTMLDocument('sanitization')\r\n createdDocument.body.innerHTML = unsafeHtml\r\n\r\n var whitelistKeys = $.map(whiteList, function (el, i) { return i })\r\n var elements = $(createdDocument.body).find('*')\r\n\r\n for (var i = 0, len = elements.length; i < len; i++) {\r\n var el = elements[i]\r\n var elName = el.nodeName.toLowerCase()\r\n\r\n if ($.inArray(elName, whitelistKeys) === -1) {\r\n el.parentNode.removeChild(el)\r\n\r\n continue\r\n }\r\n\r\n var attributeList = $.map(el.attributes, function (el) { return el })\r\n var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\r\n\r\n for (var j = 0, len2 = attributeList.length; j < len2; j++) {\r\n if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {\r\n el.removeAttribute(attributeList[j].nodeName)\r\n }\r\n }\r\n }\r\n\r\n return createdDocument.body.innerHTML\r\n }\r\n\r\n // TOOLTIP PUBLIC CLASS DEFINITION\r\n // ===============================\r\n\r\n var Tooltip = function (element, options) {\r\n this.type = null\r\n this.options = null\r\n this.enabled = null\r\n this.timeout = null\r\n this.hoverState = null\r\n this.$element = null\r\n this.inState = null\r\n\r\n this.init('tooltip', element, options)\r\n }\r\n\r\n Tooltip.VERSION = '3.4.1'\r\n\r\n Tooltip.TRANSITION_DURATION = 150\r\n\r\n Tooltip.DEFAULTS = {\r\n animation: true,\r\n placement: 'top',\r\n selector: false,\r\n template: '
',\r\n trigger: 'hover focus',\r\n title: '',\r\n delay: 0,\r\n html: false,\r\n container: false,\r\n viewport: {\r\n selector: 'body',\r\n padding: 0\r\n },\r\n sanitize: true,\r\n sanitizeFn: null,\r\n whiteList: DefaultWhitelist\r\n }\r\n\r\n Tooltip.prototype.init = function (type, element, options) {\r\n this.enabled = true\r\n this.type = type\r\n this.$element = $(element)\r\n this.options = this.getOptions(options)\r\n this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\r\n this.inState = { click: false, hover: false, focus: false }\r\n\r\n if (this.$element[0] instanceof document.constructor && !this.options.selector) {\r\n throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\r\n }\r\n\r\n var triggers = this.options.trigger.split(' ')\r\n\r\n for (var i = triggers.length; i--;) {\r\n var trigger = triggers[i]\r\n\r\n if (trigger == 'click') {\r\n this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\r\n } else if (trigger != 'manual') {\r\n var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'\r\n var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\r\n\r\n this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\r\n this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\r\n }\r\n }\r\n\r\n this.options.selector ?\r\n (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\r\n this.fixTitle()\r\n }\r\n\r\n Tooltip.prototype.getDefaults = function () {\r\n return Tooltip.DEFAULTS\r\n }\r\n\r\n Tooltip.prototype.getOptions = function (options) {\r\n var dataAttributes = this.$element.data()\r\n\r\n for (var dataAttr in dataAttributes) {\r\n if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {\r\n delete dataAttributes[dataAttr]\r\n }\r\n }\r\n\r\n options = $.extend({}, this.getDefaults(), dataAttributes, options)\r\n\r\n if (options.delay && typeof options.delay == 'number') {\r\n options.delay = {\r\n show: options.delay,\r\n hide: options.delay\r\n }\r\n }\r\n\r\n if (options.sanitize) {\r\n options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)\r\n }\r\n\r\n return options\r\n }\r\n\r\n Tooltip.prototype.getDelegateOptions = function () {\r\n var options = {}\r\n var defaults = this.getDefaults()\r\n\r\n this._options && $.each(this._options, function (key, value) {\r\n if (defaults[key] != value) options[key] = value\r\n })\r\n\r\n return options\r\n }\r\n\r\n Tooltip.prototype.enter = function (obj) {\r\n var self = obj instanceof this.constructor ?\r\n obj : $(obj.currentTarget).data('bs.' + this.type)\r\n\r\n if (!self) {\r\n self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\r\n $(obj.currentTarget).data('bs.' + this.type, self)\r\n }\r\n\r\n if (obj instanceof $.Event) {\r\n self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\r\n }\r\n\r\n if (self.tip().hasClass('in') || self.hoverState == 'in') {\r\n self.hoverState = 'in'\r\n return\r\n }\r\n\r\n clearTimeout(self.timeout)\r\n\r\n self.hoverState = 'in'\r\n\r\n if (!self.options.delay || !self.options.delay.show) return self.show()\r\n\r\n self.timeout = setTimeout(function () {\r\n if (self.hoverState == 'in') self.show()\r\n }, self.options.delay.show)\r\n }\r\n\r\n Tooltip.prototype.isInStateTrue = function () {\r\n for (var key in this.inState) {\r\n if (this.inState[key]) return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n Tooltip.prototype.leave = function (obj) {\r\n var self = obj instanceof this.constructor ?\r\n obj : $(obj.currentTarget).data('bs.' + this.type)\r\n\r\n if (!self) {\r\n self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\r\n $(obj.currentTarget).data('bs.' + this.type, self)\r\n }\r\n\r\n if (obj instanceof $.Event) {\r\n self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\r\n }\r\n\r\n if (self.isInStateTrue()) return\r\n\r\n clearTimeout(self.timeout)\r\n\r\n self.hoverState = 'out'\r\n\r\n if (!self.options.delay || !self.options.delay.hide) return self.hide()\r\n\r\n self.timeout = setTimeout(function () {\r\n if (self.hoverState == 'out') self.hide()\r\n }, self.options.delay.hide)\r\n }\r\n\r\n Tooltip.prototype.show = function () {\r\n var e = $.Event('show.bs.' + this.type)\r\n\r\n if (this.hasContent() && this.enabled) {\r\n this.$element.trigger(e)\r\n\r\n var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\r\n if (e.isDefaultPrevented() || !inDom) return\r\n var that = this\r\n\r\n var $tip = this.tip()\r\n\r\n var tipId = this.getUID(this.type)\r\n\r\n this.setContent()\r\n $tip.attr('id', tipId)\r\n this.$element.attr('aria-describedby', tipId)\r\n\r\n if (this.options.animation) $tip.addClass('fade')\r\n\r\n var placement = typeof this.options.placement == 'function' ?\r\n this.options.placement.call(this, $tip[0], this.$element[0]) :\r\n this.options.placement\r\n\r\n var autoToken = /\\s?auto?\\s?/i\r\n var autoPlace = autoToken.test(placement)\r\n if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\r\n\r\n $tip\r\n .detach()\r\n .css({ top: 0, left: 0, display: 'block' })\r\n .addClass(placement)\r\n .data('bs.' + this.type, this)\r\n\r\n this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)\r\n this.$element.trigger('inserted.bs.' + this.type)\r\n\r\n var pos = this.getPosition()\r\n var actualWidth = $tip[0].offsetWidth\r\n var actualHeight = $tip[0].offsetHeight\r\n\r\n if (autoPlace) {\r\n var orgPlacement = placement\r\n var viewportDim = this.getPosition(this.$viewport)\r\n\r\n placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :\r\n placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :\r\n placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :\r\n placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :\r\n placement\r\n\r\n $tip\r\n .removeClass(orgPlacement)\r\n .addClass(placement)\r\n }\r\n\r\n var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\r\n\r\n this.applyPlacement(calculatedOffset, placement)\r\n\r\n var complete = function () {\r\n var prevHoverState = that.hoverState\r\n that.$element.trigger('shown.bs.' + that.type)\r\n that.hoverState = null\r\n\r\n if (prevHoverState == 'out') that.leave(that)\r\n }\r\n\r\n $.support.transition && this.$tip.hasClass('fade') ?\r\n $tip\r\n .one('bsTransitionEnd', complete)\r\n .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\r\n complete()\r\n }\r\n }\r\n\r\n Tooltip.prototype.applyPlacement = function (offset, placement) {\r\n var $tip = this.tip()\r\n var width = $tip[0].offsetWidth\r\n var height = $tip[0].offsetHeight\r\n\r\n // manually read margins because getBoundingClientRect includes difference\r\n var marginTop = parseInt($tip.css('margin-top'), 10)\r\n var marginLeft = parseInt($tip.css('margin-left'), 10)\r\n\r\n // we must check for NaN for ie 8/9\r\n if (isNaN(marginTop)) marginTop = 0\r\n if (isNaN(marginLeft)) marginLeft = 0\r\n\r\n offset.top += marginTop\r\n offset.left += marginLeft\r\n\r\n // $.fn.offset doesn't round pixel values\r\n // so we use setOffset directly with our own function B-0\r\n $.offset.setOffset($tip[0], $.extend({\r\n using: function (props) {\r\n $tip.css({\r\n top: Math.round(props.top),\r\n left: Math.round(props.left)\r\n })\r\n }\r\n }, offset), 0)\r\n\r\n $tip.addClass('in')\r\n\r\n // check to see if placing tip in new offset caused the tip to resize itself\r\n var actualWidth = $tip[0].offsetWidth\r\n var actualHeight = $tip[0].offsetHeight\r\n\r\n if (placement == 'top' && actualHeight != height) {\r\n offset.top = offset.top + height - actualHeight\r\n }\r\n\r\n var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\r\n\r\n if (delta.left) offset.left += delta.left\r\n else offset.top += delta.top\r\n\r\n var isVertical = /top|bottom/.test(placement)\r\n var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\r\n var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\r\n\r\n $tip.offset(offset)\r\n this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\r\n }\r\n\r\n Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\r\n this.arrow()\r\n .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\r\n .css(isVertical ? 'top' : 'left', '')\r\n }\r\n\r\n Tooltip.prototype.setContent = function () {\r\n var $tip = this.tip()\r\n var title = this.getTitle()\r\n\r\n if (this.options.html) {\r\n if (this.options.sanitize) {\r\n title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)\r\n }\r\n\r\n $tip.find('.tooltip-inner').html(title)\r\n } else {\r\n $tip.find('.tooltip-inner').text(title)\r\n }\r\n\r\n $tip.removeClass('fade in top bottom left right')\r\n }\r\n\r\n Tooltip.prototype.hide = function (callback) {\r\n var that = this\r\n var $tip = $(this.$tip)\r\n var e = $.Event('hide.bs.' + this.type)\r\n\r\n function complete() {\r\n if (that.hoverState != 'in') $tip.detach()\r\n if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\r\n that.$element\r\n .removeAttr('aria-describedby')\r\n .trigger('hidden.bs.' + that.type)\r\n }\r\n callback && callback()\r\n }\r\n\r\n this.$element.trigger(e)\r\n\r\n if (e.isDefaultPrevented()) return\r\n\r\n $tip.removeClass('in')\r\n\r\n $.support.transition && $tip.hasClass('fade') ?\r\n $tip\r\n .one('bsTransitionEnd', complete)\r\n .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\r\n complete()\r\n\r\n this.hoverState = null\r\n\r\n return this\r\n }\r\n\r\n Tooltip.prototype.fixTitle = function () {\r\n var $e = this.$element\r\n if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\r\n $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\r\n }\r\n }\r\n\r\n Tooltip.prototype.hasContent = function () {\r\n return this.getTitle()\r\n }\r\n\r\n Tooltip.prototype.getPosition = function ($element) {\r\n $element = $element || this.$element\r\n\r\n var el = $element[0]\r\n var isBody = el.tagName == 'BODY'\r\n\r\n var elRect = el.getBoundingClientRect()\r\n if (elRect.width == null) {\r\n // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\r\n elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\r\n }\r\n var isSvg = window.SVGElement && el instanceof window.SVGElement\r\n // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\r\n // See https://github.com/twbs/bootstrap/issues/20280\r\n var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\r\n var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\r\n var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\r\n\r\n return $.extend({}, elRect, scroll, outerDims, elOffset)\r\n }\r\n\r\n Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\r\n return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :\r\n placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\r\n placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\r\n /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\r\n\r\n }\r\n\r\n Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\r\n var delta = { top: 0, left: 0 }\r\n if (!this.$viewport) return delta\r\n\r\n var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\r\n var viewportDimensions = this.getPosition(this.$viewport)\r\n\r\n if (/right|left/.test(placement)) {\r\n var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll\r\n var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\r\n if (topEdgeOffset < viewportDimensions.top) { // top overflow\r\n delta.top = viewportDimensions.top - topEdgeOffset\r\n } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\r\n delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\r\n }\r\n } else {\r\n var leftEdgeOffset = pos.left - viewportPadding\r\n var rightEdgeOffset = pos.left + viewportPadding + actualWidth\r\n if (leftEdgeOffset < viewportDimensions.left) { // left overflow\r\n delta.left = viewportDimensions.left - leftEdgeOffset\r\n } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\r\n delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\r\n }\r\n }\r\n\r\n return delta\r\n }\r\n\r\n Tooltip.prototype.getTitle = function () {\r\n var title\r\n var $e = this.$element\r\n var o = this.options\r\n\r\n title = $e.attr('data-original-title')\r\n || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)\r\n\r\n return title\r\n }\r\n\r\n Tooltip.prototype.getUID = function (prefix) {\r\n do prefix += ~~(Math.random() * 1000000)\r\n while (document.getElementById(prefix))\r\n return prefix\r\n }\r\n\r\n Tooltip.prototype.tip = function () {\r\n if (!this.$tip) {\r\n this.$tip = $(this.options.template)\r\n if (this.$tip.length != 1) {\r\n throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\r\n }\r\n }\r\n return this.$tip\r\n }\r\n\r\n Tooltip.prototype.arrow = function () {\r\n return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\r\n }\r\n\r\n Tooltip.prototype.enable = function () {\r\n this.enabled = true\r\n }\r\n\r\n Tooltip.prototype.disable = function () {\r\n this.enabled = false\r\n }\r\n\r\n Tooltip.prototype.toggleEnabled = function () {\r\n this.enabled = !this.enabled\r\n }\r\n\r\n Tooltip.prototype.toggle = function (e) {\r\n var self = this\r\n if (e) {\r\n self = $(e.currentTarget).data('bs.' + this.type)\r\n if (!self) {\r\n self = new this.constructor(e.currentTarget, this.getDelegateOptions())\r\n $(e.currentTarget).data('bs.' + this.type, self)\r\n }\r\n }\r\n\r\n if (e) {\r\n self.inState.click = !self.inState.click\r\n if (self.isInStateTrue()) self.enter(self)\r\n else self.leave(self)\r\n } else {\r\n self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\r\n }\r\n }\r\n\r\n Tooltip.prototype.destroy = function () {\r\n var that = this\r\n clearTimeout(this.timeout)\r\n this.hide(function () {\r\n that.$element.off('.' + that.type).removeData('bs.' + that.type)\r\n if (that.$tip) {\r\n that.$tip.detach()\r\n }\r\n that.$tip = null\r\n that.$arrow = null\r\n that.$viewport = null\r\n that.$element = null\r\n })\r\n }\r\n\r\n Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {\r\n return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)\r\n }\r\n\r\n // TOOLTIP PLUGIN DEFINITION\r\n // =========================\r\n\r\n function Plugin(option) {\r\n return this.each(function () {\r\n var $this = $(this)\r\n var data = $this.data('bs.tooltip')\r\n var options = typeof option == 'object' && option\r\n\r\n if (!data && /destroy|hide/.test(option)) return\r\n if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\r\n if (typeof option == 'string') data[option]()\r\n })\r\n }\r\n\r\n var old = $.fn.tooltip\r\n\r\n $.fn.tooltip = Plugin\r\n $.fn.tooltip.Constructor = Tooltip\r\n\r\n\r\n // TOOLTIP NO CONFLICT\r\n // ===================\r\n\r\n $.fn.tooltip.noConflict = function () {\r\n $.fn.tooltip = old\r\n return this\r\n }\r\n\r\n})(jQuery);\r\n\r\n/* ========================================================================\r\n * Bootstrap: popover.js v3.4.1\r\n * https://getbootstrap.com/docs/3.4/javascript/#popovers\r\n * ========================================================================\r\n * Copyright 2011-2019 Twitter, Inc.\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\r\n * ======================================================================== */\r\n\r\n\r\n(function ($) {\r\n 'use strict';\r\n\r\n // POPOVER PUBLIC CLASS DEFINITION\r\n // ===============================\r\n\r\n var Popover = function (element, options) {\r\n this.init('popover', element, options)\r\n }\r\n\r\n if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\r\n\r\n Popover.VERSION = '3.4.1'\r\n\r\n Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\r\n placement: 'right',\r\n trigger: 'click',\r\n content: '',\r\n template: '

'\r\n })\r\n\r\n\r\n // NOTE: POPOVER EXTENDS tooltip.js\r\n // ================================\r\n\r\n Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\r\n\r\n Popover.prototype.constructor = Popover\r\n\r\n Popover.prototype.getDefaults = function () {\r\n return Popover.DEFAULTS\r\n }\r\n\r\n Popover.prototype.setContent = function () {\r\n var $tip = this.tip()\r\n var title = this.getTitle()\r\n var content = this.getContent()\r\n\r\n if (this.options.html) {\r\n var typeContent = typeof content\r\n\r\n if (this.options.sanitize) {\r\n title = this.sanitizeHtml(title)\r\n\r\n if (typeContent === 'string') {\r\n content = this.sanitizeHtml(content)\r\n }\r\n }\r\n\r\n $tip.find('.popover-title').html(title)\r\n $tip.find('.popover-content').children().detach().end()[\r\n typeContent === 'string' ? 'html' : 'append'\r\n ](content)\r\n } else {\r\n $tip.find('.popover-title').text(title)\r\n $tip.find('.popover-content').children().detach().end().text(content)\r\n }\r\n\r\n $tip.removeClass('fade top bottom left right in')\r\n\r\n // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\r\n // this manually by checking the contents.\r\n if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\r\n }\r\n\r\n Popover.prototype.hasContent = function () {\r\n return this.getTitle() || this.getContent()\r\n }\r\n\r\n Popover.prototype.getContent = function () {\r\n var $e = this.$element\r\n var o = this.options\r\n\r\n return $e.attr('data-content')\r\n || (typeof o.content == 'function' ?\r\n o.content.call($e[0]) :\r\n o.content)\r\n }\r\n\r\n Popover.prototype.arrow = function () {\r\n return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\r\n }\r\n\r\n\r\n // POPOVER PLUGIN DEFINITION\r\n // =========================\r\n\r\n function Plugin(option) {\r\n return this.each(function () {\r\n var $this = $(this)\r\n var data = $this.data('bs.popover')\r\n var options = typeof option == 'object' && option\r\n\r\n if (!data && /destroy|hide/.test(option)) return\r\n if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\r\n if (typeof option == 'string') data[option]()\r\n })\r\n }\r\n\r\n var old = $.fn.popover\r\n\r\n $.fn.popover = Plugin\r\n $.fn.popover.Constructor = Popover\r\n\r\n\r\n // POPOVER NO CONFLICT\r\n // ===================\r\n\r\n $.fn.popover.noConflict = function () {\r\n $.fn.popover = old\r\n return this\r\n }\r\n\r\n})(jQuery);\r\n","$(document).ready(function () {\r\n\r\n $('.more-courses-btn').click(function (e) {\r\n e.preventDefault();\r\n var btn = $(this);\r\n var next = $(this).next();\r\n next.toggleClass('active');\r\n next.hasClass('active') ? btn.addClass('open').text('Show less') : btn.removeClass('open').text('Show more');\r\n });\r\n\r\n\r\n // remove episerver form stylesheet\r\n\r\n $('link[rel=stylesheet][data-epiforms-resource=\"EPiServerForms.css\"]').remove();\r\n\r\n // product / solution page navigation\r\n\r\n var current = $(\".techInfo h2\");\r\n current.attr(\"id\", \"heading1\");\r\n $(\".tocHeading1\").append(\"\" + current.html() + \"\");\r\n\r\n var current = $(\".navHeading\");\r\n current.attr(\"id\", \"heading2\");\r\n $(\".tocHeading2\").append(\"\" + current.html() + \"\");\r\n\r\n $(\".techInfo h3\").each(function (i) {\r\n var current = $(this);\r\n current.attr(\"id\", \"title\" + i);\r\n $(\".toc\").append(\"
  • \" +\r\n current.html() + \"
  • \");\r\n });\r\n \r\n\r\n // product nav target\r\n var wwtoc = document.querySelector(\".ww__toc\");\r\n if (wwtoc) {\r\n document.querySelectorAll(\"main .ww__nav-target\").forEach(function (item) {\r\n if (item.nextElementSibling && item.nextElementSibling.nodeName === \"A\") {\r\n var li = document.createElement(\"li\");\r\n var a = document.createElement(\"a\");\r\n a.setAttribute(\"href\", item.nextElementSibling.getAttribute(\"href\"));\r\n a.textContent = item.textContent;\r\n li.appendChild(a);\r\n wwtoc.appendChild(li);\r\n }\r\n });\r\n }\r\n\r\n // course schedule page navigation\r\n\r\n $(\".courseCategories h2 a\").each(function (i) {\r\n var current = $(this);\r\n current.attr(\"id\", \"title\" + i);\r\n $(\".coursetoc\").append(\"
  • \" +\r\n current.html() + \"
  • \");\r\n });\r\n\r\n\r\n\r\n // touch device detection\r\n\r\n $(document).on('touchstart', function () {\r\n $('body').addClass('touchDevice');\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // scroll to #anchor\r\n\r\n $('.inPage a, .anchorLinks a').on('click', function () {\r\n var target = $(this.hash);\r\n $('html,body').animate({\r\n scrollTop: target.offset().top\r\n }, 500, function() {\r\n target.addClass('target');\r\n });\r\n return false;\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // sticky nav\r\n\r\n $(window).on('scroll', function () {\r\n if ($(window).scrollTop() > 300) {\r\n $('.anchorLinks').addClass('above');\r\n }\r\n else {\r\n $('.anchorLinks').removeClass('above');\r\n }\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // gotoTop button\r\n\r\n $(window).on('load', function () {\r\n\r\n $('body').prepend('');\r\n\r\n var previousScroll = 0;\r\n\r\n $(window).scroll(function () {\r\n var currentScroll = $(this).scrollTop();\r\n if (currentScroll < previousScroll && currentScroll > 100) {\r\n $('.gotoTop').addClass('active');\r\n } else {\r\n $('.gotoTop').removeClass('active');\r\n }\r\n previousScroll = currentScroll;\r\n });\r\n\r\n $('.gotoTop').on('click', function () {\r\n $('html, body').animate({ scrollTop: 0 }, 500);\r\n $(this).addClass('clicked');\r\n setTimeout(function () {\r\n $('.gotoTop').removeClass('clicked')\r\n }, 1000);\r\n });\r\n\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // frontpage and inverse classes to observe fixed bgs\r\n\r\n if ($('body').hasClass('frontpage')) {\r\n $('html').addClass('frontpage');\r\n }\r\n\r\n if ($('.inverse').length) {\r\n $('html').addClass('hasInverse');\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // searchFilter open / close (screen < desktop)\r\n\r\n $('.searchFilter h2 span').on('click', function () {\r\n $(this).closest('section').toggleClass('open');\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // factMap number reduce font-size if line breaks\r\n\r\n $(window).on('load', function () {\r\n $('.factMap h3 strong').each(function () {\r\n\r\n var singleHeight = parseInt($(this).css('line-height'));\r\n var fontSize = parseInt($(this).css('font-size'));\r\n\r\n while ($(this).height() > singleHeight && fontSize > 20) {\r\n singleHeight = parseInt($(this).css('line-height'));\r\n $(this).closest('.factMap').find('h3 strong').css('font-size', fontSize -= 10);\r\n }\r\n });\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // number counter\r\n\r\n $(window).on('load', function () {\r\n $('.hero .number').each(function () {\r\n $(this).prop('Counter', 0).animate({\r\n Counter: Number($(this).text())\r\n }, {\r\n duration: 1500,\r\n step: function (now) {\r\n $(this).text(Math.ceil(now));\r\n }\r\n });\r\n });\r\n });\r\n\r\n\r\n\r\n\r\n // sticky contact button\r\n\r\n if ($('aside .contact').length) {\r\n $(window).on('scroll', function () {\r\n\r\n var contactBottom = $('aside .contact:first').offset().top + $('aside .contact:first').height()\r\n var scrollPosition = $(window).scrollTop()\r\n\r\n if (contactBottom < scrollPosition) {\r\n $('aside .contact:first').addClass('above');\r\n }\r\n else {\r\n $('aside .contact:first').removeClass('above');\r\n }\r\n\r\n });\r\n }\r\n\r\n $('aside .contact:first h2').on('click', function () {\r\n if ($(this).parent().hasClass('above')) {\r\n $('html, body').animate({\r\n scrollTop: $(this).parent().offset().top\r\n }, 500);\r\n }\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // flowList oneLine scroll\r\n\r\n $('.oneLine').each(function () {\r\n\r\n var visibleWidth = $(this).width();\r\n var longDistance = $(this).children('li:nth-of-type(3)').position().left;\r\n var shortDistance = $(this).children('li:nth-of-type(2)').position().left;\r\n\r\n // scroll right\r\n $(this).siblings('.scroll.right').on('click', function () {\r\n $(this).siblings('button').addClass('active');\r\n if (longDistance < visibleWidth) {\r\n $(this).siblings('ul').animate({\r\n scrollLeft: '+=' + longDistance\r\n });\r\n }\r\n else {\r\n $(this).siblings('ul').animate({\r\n scrollLeft: '+=' + shortDistance\r\n });\r\n }\r\n });\r\n\r\n // scroll left\r\n $(this).siblings('.scroll.left').on('click', function () {\r\n if (longDistance < visibleWidth) {\r\n $(this).siblings('ul').animate({\r\n scrollLeft: '-=' + longDistance\r\n });\r\n }\r\n else {\r\n $(this).siblings('ul').animate({\r\n scrollLeft: '-=' + shortDistance\r\n });\r\n }\r\n });\r\n\r\n // hide scroll buttons on touch\r\n $(this).on('touchmove', function () {\r\n if ($(this).children('li:first').position().left < 0) {\r\n $(this).siblings('button').hide();\r\n }\r\n });\r\n\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // sub nav expansion\r\n\r\n $('nav.sub ul').on('click', function () {\r\n $(this).closest('nav').toggleClass('open');\r\n });\r\n\r\n $('nav.sub .selected a').on('click', function (evt) {\r\n evt.preventDefault();\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // table overflow detect */\r\n\r\n $(window).on('load', function () {\r\n\r\n $('table').each(function () {\r\n if ($(this).width() > $('body').width()) {\r\n $(this).addClass('fat');\r\n $(this).before('
    ');\r\n }\r\n });\r\n\r\n $('.bodyText table:not(.innerWide)').each(function () {\r\n if ($(this).width() > $('.bodyText').width()) {\r\n $(this).addClass('fat');\r\n $(this).before('
    ');\r\n }\r\n });\r\n\r\n $('.tableZoom').on('click', function () {\r\n $(this).next('table').toggleClass('makeWide');\r\n $(this).toggleClass('active');\r\n });\r\n\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // zoomable\r\n\r\n $('.zoomable').on('click', function () {\r\n $(this).toggleClass('innerWide');\r\n });\r\n\r\n\r\n\r\n\r\n\r\n // gallery thumb clicks\r\n\r\n $('.gallery .thumbs a').on('click', function (evt) {\r\n evt.preventDefault();\r\n $('#galleryMain').empty();\r\n $('#mainCaption').empty().append(\r\n\t\t\t$(this).children().attr('title')\r\n\t\t);\r\n });\r\n $('.gallery .thumbs a:not(.video)').on('click', function (evt) {\r\n $('#galleryMain').append(\r\n\t \t$('', { src: this.href, alt: $(this).children().attr('alt') })\r\n\t\t);\r\n });\r\n $('.gallery .thumbs a.video.stream').on('click', function (evt) {\r\n $('#galleryMain').append(\r\n\t \t$('