/*! * Native JavaScript for Bootstrap v3.0.10 (https://thednp.github.io/bootstrap.native/) * Copyright 2015-2020 © dnp_theme * Licensed under MIT (https://github.com/thednp/bootstrap.native/blob/master/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.BSN = factory()); }(this, (function () { 'use strict'; var transitionEndEvent = 'webkitTransition' in document.head.style ? 'webkitTransitionEnd' : 'transitionend'; var supportTransition = 'webkitTransition' in document.head.style || 'transition' in document.head.style; var transitionDuration = 'webkitTransition' in document.head.style ? 'webkitTransitionDuration' : 'transitionDuration'; function getElementTransitionDuration(element) { var duration = supportTransition ? parseFloat(getComputedStyle(element)[transitionDuration]) : 0; duration = typeof duration === 'number' && !isNaN(duration) ? duration * 1000 : 0; return duration; } function emulateTransitionEnd(element,handler){ var called = 0, duration = getElementTransitionDuration(element); duration ? element.addEventListener( transitionEndEvent, function transitionEndWrapper(e){ !called && handler(e), called = 1; element.removeEventListener( transitionEndEvent, transitionEndWrapper); }) : setTimeout(function() { !called && handler(), called = 1; }, 17); } function queryElement(selector, parent) { var lookUp = parent && parent instanceof Element ? parent : document; return selector instanceof Element ? selector : lookUp.querySelector(selector); } function bootstrapCustomEvent(eventName, componentName, related) { var OriginalCustomEvent = new CustomEvent( eventName + '.bs.' + componentName, {cancelable: true}); OriginalCustomEvent.relatedTarget = related; return OriginalCustomEvent; } function dispatchCustomEvent(customEvent){ this && this.dispatchEvent(customEvent); } function Alert(element) { var self = this, alert, closeCustomEvent = bootstrapCustomEvent('close','alert'), closedCustomEvent = bootstrapCustomEvent('closed','alert'); function triggerHandler() { alert.classList.contains('fade') ? emulateTransitionEnd(alert,transitionEndHandler) : transitionEndHandler(); } function toggleEvents(action){ action = action ? 'addEventListener' : 'removeEventListener'; element[action]('click',clickHandler,false); } function clickHandler(e) { alert = e && e.target.closest(".alert"); element = queryElement('[data-dismiss="alert"]',alert); element && alert && (element === e.target || element.contains(e.target)) && self.close(); } function transitionEndHandler() { toggleEvents(); alert.parentNode.removeChild(alert); dispatchCustomEvent.call(alert,closedCustomEvent); } self.close = function () { if ( alert && element && alert.classList.contains('show') ) { dispatchCustomEvent.call(alert,closeCustomEvent); if ( closeCustomEvent.defaultPrevented ) { return; } self.dispose(); alert.classList.remove('show'); triggerHandler(); } }; self.dispose = function () { toggleEvents(); delete element.Alert; }; element = queryElement(element); alert = element.closest('.alert'); element.Alert && element.Alert.dispose(); if ( !element.Alert ) { toggleEvents(1); } self.element = element; element.Alert = self; } function Button(element) { var self = this, labels, changeCustomEvent = bootstrapCustomEvent('change', 'button'); function toggle(e) { var input, label = e.target.tagName === 'LABEL' ? e.target : e.target.closest('LABEL') ? e.target.closest('LABEL') : null; input = label && label.getElementsByTagName('INPUT')[0]; if ( !input ) { return; } dispatchCustomEvent.call(input, changeCustomEvent); dispatchCustomEvent.call(element, changeCustomEvent); if ( input.type === 'checkbox' ) { if ( changeCustomEvent.defaultPrevented ) { return; } if ( !input.checked ) { label.classList.add('active'); input.getAttribute('checked'); input.setAttribute('checked','checked'); input.checked = true; } else { label.classList.remove('active'); input.getAttribute('checked'); input.removeAttribute('checked'); input.checked = false; } if (!element.toggled) { element.toggled = true; } } if ( input.type === 'radio' && !element.toggled ) { if ( changeCustomEvent.defaultPrevented ) { return; } if ( !input.checked || (e.screenX === 0 && e.screenY == 0) ) { label.classList.add('active'); label.classList.add('focus'); input.setAttribute('checked','checked'); input.checked = true; element.toggled = true; Array.from(labels).map(function (otherLabel){ var otherInput = otherLabel.getElementsByTagName('INPUT')[0]; if ( otherLabel !== label && otherLabel.classList.contains('active') ) { dispatchCustomEvent.call(otherInput, changeCustomEvent); otherLabel.classList.remove('active'); otherInput.removeAttribute('checked'); otherInput.checked = false; } }); } } setTimeout( function () { element.toggled = false; }, 50 ); } function keyHandler(e) { var key = e.which || e.keyCode; key === 32 && e.target === document.activeElement && toggle(e); } function preventScroll(e) { var key = e.which || e.keyCode; key === 32 && e.preventDefault(); } function focusToggle(e) { if (e.target.tagName === 'INPUT' ) { var action = e.type === 'focusin' ? 'add' : 'remove'; e.target.closest('.btn').classList[action]('focus'); } } function toggleEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; element[action]('click',toggle,false ); element[action]('keyup',keyHandler,false), element[action]('keydown',preventScroll,false); element[action]('focusin',focusToggle,false), element[action]('focusout',focusToggle,false); } self.dispose = function () { toggleEvents(); delete element.Button; }; element = queryElement(element); element.Button && element.Button.dispose(); labels = element.getElementsByClassName('btn'); if (!labels.length) { return; } if ( !element.Button ) { toggleEvents(1); } element.toggled = false; element.Button = self; Array.from(labels).map(function (btn){ !btn.classList.contains('active') && queryElement('input:checked',btn) && btn.classList.add('active'); btn.classList.contains('active') && !queryElement('input:checked',btn) && btn.classList.remove('active'); }); } var mouseHoverEvents = ('onmouseleave' in document) ? [ 'mouseenter', 'mouseleave'] : [ 'mouseover', 'mouseout' ]; var supportPassive = (function () { var result = false; try { var opts = Object.defineProperty({}, 'passive', { get: function() { result = true; } }); document.addEventListener('DOMContentLoaded', function wrap(){ document.removeEventListener('DOMContentLoaded', wrap, opts); }, opts); } catch (e) {} return result; })(); var passiveHandler = supportPassive ? { passive: true } : false; function isElementInScrollRange(element) { var bcr = element.getBoundingClientRect(), viewportHeight = window.innerHeight || document.documentElement.clientHeight; return bcr.top <= viewportHeight && bcr.bottom >= 0; } function Carousel (element,options) { options = options || {}; var self = this, vars, ops, slideCustomEvent, slidCustomEvent, slides, leftArrow, rightArrow, indicator, indicators; function pauseHandler() { if ( ops.interval !==false && !element.classList.contains('paused') ) { element.classList.add('paused'); !vars.isSliding && ( clearInterval(vars.timer), vars.timer = null ); } } function resumeHandler() { if ( ops.interval !== false && element.classList.contains('paused') ) { element.classList.remove('paused'); !vars.isSliding && ( clearInterval(vars.timer), vars.timer = null ); !vars.isSliding && self.cycle(); } } function indicatorHandler(e) { e.preventDefault(); if (vars.isSliding) { return; } var eventTarget = e.target; if ( eventTarget && !eventTarget.classList.contains('active') && eventTarget.getAttribute('data-slide-to') ) { vars.index = parseInt( eventTarget.getAttribute('data-slide-to')); } else { return false; } self.slideTo( vars.index ); } function controlsHandler(e) { e.preventDefault(); if (vars.isSliding) { return; } var eventTarget = e.currentTarget || e.srcElement; if ( eventTarget === rightArrow ) { vars.index++; } else if ( eventTarget === leftArrow ) { vars.index--; } self.slideTo( vars.index ); } function keyHandler(ref) { var which = ref.which; if (vars.isSliding) { return; } switch (which) { case 39: vars.index++; break; case 37: vars.index--; break; default: return; } self.slideTo( vars.index ); } function toggleEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; if ( ops.pause && ops.interval ) { element[action]( mouseHoverEvents[0], pauseHandler, false ); element[action]( mouseHoverEvents[1], resumeHandler, false ); element[action]( 'touchstart', pauseHandler, passiveHandler ); element[action]( 'touchend', resumeHandler, passiveHandler ); } ops.touch && slides.length > 1 && element[action]( 'touchstart', touchDownHandler, passiveHandler ); rightArrow && rightArrow[action]( 'click', controlsHandler,false ); leftArrow && leftArrow[action]( 'click', controlsHandler,false ); indicator && indicator[action]( 'click', indicatorHandler,false ); ops.keyboard && window[action]( 'keydown', keyHandler,false ); } function toggleTouchEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; element[action]( 'touchmove', touchMoveHandler, passiveHandler ); element[action]( 'touchend', touchEndHandler, passiveHandler ); } function touchDownHandler(e) { if ( vars.isTouch ) { return; } vars.touchPosition.startX = e.changedTouches[0].pageX; if ( element.contains(e.target) ) { vars.isTouch = true; toggleTouchEvents(1); } } function touchMoveHandler(e) { if ( !vars.isTouch ) { e.preventDefault(); return; } vars.touchPosition.currentX = e.changedTouches[0].pageX; if ( e.type === 'touchmove' && e.changedTouches.length > 1 ) { e.preventDefault(); return false; } } function touchEndHandler (e) { if ( !vars.isTouch || vars.isSliding ) { return } vars.touchPosition.endX = vars.touchPosition.currentX || e.changedTouches[0].pageX; if ( vars.isTouch ) { if ( (!element.contains(e.target) || !element.contains(e.relatedTarget) ) && Math.abs(vars.touchPosition.startX - vars.touchPosition.endX) < 75 ) { return false; } else { if ( vars.touchPosition.currentX < vars.touchPosition.startX ) { vars.index++; } else if ( vars.touchPosition.currentX > vars.touchPosition.startX ) { vars.index--; } vars.isTouch = false; self.slideTo(vars.index); } toggleTouchEvents(); } } function setActivePage(pageIndex) { Array.from(indicators).map(function (x){x.classList.remove('active');}); indicators[pageIndex] && indicators[pageIndex].classList.add('active'); } function transitionEndHandler(e){ if (vars.touchPosition){ var next = vars.index, timeout = e && e.target !== slides[next] ? e.elapsedTime*1000+100 : 20, activeItem = self.getActiveIndex(), orientation = vars.direction === 'left' ? 'next' : 'prev'; vars.isSliding && setTimeout(function () { if (vars.touchPosition){ vars.isSliding = false; slides[next].classList.add('active'); slides[activeItem].classList.remove('active'); slides[next].classList.remove(("carousel-item-" + orientation)); slides[next].classList.remove(("carousel-item-" + (vars.direction))); slides[activeItem].classList.remove(("carousel-item-" + (vars.direction))); dispatchCustomEvent.call(element, slidCustomEvent); if ( !document.hidden && ops.interval && !element.classList.contains('paused') ) { self.cycle(); } } }, timeout); } } self.cycle = function () { if (vars.timer) { clearInterval(vars.timer); vars.timer = null; } vars.timer = setInterval(function () { var idx = vars.index || self.getActiveIndex(); isElementInScrollRange(element) && (idx++, self.slideTo( idx ) ); }, ops.interval); }; self.slideTo = function (next) { if (vars.isSliding) { return; } var activeItem = self.getActiveIndex(), orientation; if ( activeItem === next ) { return; } else if ( (activeItem < next ) || (activeItem === 0 && next === slides.length -1 ) ) { vars.direction = 'left'; } else if ( (activeItem > next) || (activeItem === slides.length - 1 && next === 0 ) ) { vars.direction = 'right'; } if ( next < 0 ) { next = slides.length - 1; } else if ( next >= slides.length ){ next = 0; } orientation = vars.direction === 'left' ? 'next' : 'prev'; slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', slides[next]); slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', slides[next]); dispatchCustomEvent.call(element, slideCustomEvent); if (slideCustomEvent.defaultPrevented) { return; } vars.index = next; vars.isSliding = true; clearInterval(vars.timer); vars.timer = null; setActivePage( next ); if ( getElementTransitionDuration(slides[next]) && element.classList.contains('slide') ) { slides[next].classList.add(("carousel-item-" + orientation)); slides[next].offsetWidth; slides[next].classList.add(("carousel-item-" + (vars.direction))); slides[activeItem].classList.add(("carousel-item-" + (vars.direction))); emulateTransitionEnd(slides[next], transitionEndHandler); } else { slides[next].classList.add('active'); slides[next].offsetWidth; slides[activeItem].classList.remove('active'); setTimeout(function () { vars.isSliding = false; if ( ops.interval && element && !element.classList.contains('paused') ) { self.cycle(); } dispatchCustomEvent.call(element, slidCustomEvent); }, 100 ); } }; self.getActiveIndex = function () { return Array.from(slides).indexOf(element.getElementsByClassName('carousel-item active')[0]) || 0; }; self.dispose = function () { var itemClasses = ['left','right','prev','next']; Array.from(slides).map(function (slide,idx) { slide.classList.contains('active') && setActivePage( idx ); itemClasses.map(function (cls) { return slide.classList.remove(("carousel-item-" + cls)); }); }); clearInterval(vars.timer); toggleEvents(); vars = {}; ops = {}; delete element.Carousel; }; element = queryElement( element ); element.Carousel && element.Carousel.dispose(); slides = element.getElementsByClassName('carousel-item'); leftArrow = element.getElementsByClassName('carousel-control-prev')[0]; rightArrow = element.getElementsByClassName('carousel-control-next')[0]; indicator = element.getElementsByClassName('carousel-indicators')[0]; indicators = indicator && indicator.getElementsByTagName( "LI" ) || []; if (slides.length < 2) { return } var intervalAttribute = element.getAttribute('data-interval'), intervalData = intervalAttribute === 'false' ? 0 : parseInt(intervalAttribute), touchData = element.getAttribute('data-touch') === 'false' ? 0 : 1, pauseData = element.getAttribute('data-pause') === 'hover' || false, keyboardData = element.getAttribute('data-keyboard') === 'true' || false, intervalOption = options.interval, touchOption = options.touch; ops = {}; ops.keyboard = options.keyboard === true || keyboardData; ops.pause = (options.pause === 'hover' || pauseData) ? 'hover' : false; ops.touch = touchOption || touchData; ops.interval = typeof intervalOption === 'number' ? intervalOption : intervalOption === false || intervalData === 0 || intervalData === false ? 0 : isNaN(intervalData) ? 5000 : intervalData; if (self.getActiveIndex()<0) { slides.length && slides[0].classList.add('active'); indicators.length && setActivePage(0); } vars = {}; vars.direction = 'left'; vars.index = 0; vars.timer = null; vars.isSliding = false; vars.isTouch = false; vars.touchPosition = { startX : 0, currentX : 0, endX : 0 }; toggleEvents(1); if ( ops.interval ){ self.cycle(); } element.Carousel = self; } function Collapse(element,options) { options = options || {}; var self = this; var accordion = null, collapse = null, activeCollapse, activeElement, showCustomEvent, shownCustomEvent, hideCustomEvent, hiddenCustomEvent; function openAction(collapseElement, toggle) { dispatchCustomEvent.call(collapseElement, showCustomEvent); if ( showCustomEvent.defaultPrevented ) { return; } collapseElement.isAnimating = true; collapseElement.classList.add('collapsing'); collapseElement.classList.remove('collapse'); collapseElement.style.height = (collapseElement.scrollHeight) + "px"; emulateTransitionEnd(collapseElement, function () { collapseElement.isAnimating = false; collapseElement.setAttribute('aria-expanded','true'); toggle.setAttribute('aria-expanded','true'); collapseElement.classList.remove('collapsing'); collapseElement.classList.add('collapse'); collapseElement.classList.add('show'); collapseElement.style.height = ''; dispatchCustomEvent.call(collapseElement, shownCustomEvent); }); } function closeAction(collapseElement, toggle) { dispatchCustomEvent.call(collapseElement, hideCustomEvent); if ( hideCustomEvent.defaultPrevented ) { return; } collapseElement.isAnimating = true; collapseElement.style.height = (collapseElement.scrollHeight) + "px"; collapseElement.classList.remove('collapse'); collapseElement.classList.remove('show'); collapseElement.classList.add('collapsing'); collapseElement.offsetWidth; collapseElement.style.height = '0px'; emulateTransitionEnd(collapseElement, function () { collapseElement.isAnimating = false; collapseElement.setAttribute('aria-expanded','false'); toggle.setAttribute('aria-expanded','false'); collapseElement.classList.remove('collapsing'); collapseElement.classList.add('collapse'); collapseElement.style.height = ''; dispatchCustomEvent.call(collapseElement, hiddenCustomEvent); }); } self.toggle = function (e) { if (e && e.target.tagName === 'A' || element.tagName === 'A') {e.preventDefault();} if (element.contains(e.target) || e.target === element) { if (!collapse.classList.contains('show')) { self.show(); } else { self.hide(); } } }; self.hide = function () { if ( collapse.isAnimating ) { return; } closeAction(collapse,element); element.classList.add('collapsed'); }; self.show = function () { if ( accordion ) { activeCollapse = accordion.getElementsByClassName("collapse show")[0]; activeElement = activeCollapse && (queryElement(("[data-target=\"#" + (activeCollapse.id) + "\"]"),accordion) || queryElement(("[href=\"#" + (activeCollapse.id) + "\"]"),accordion) ); } if ( !collapse.isAnimating ) { if ( activeElement && activeCollapse !== collapse ) { closeAction(activeCollapse,activeElement); activeElement.classList.add('collapsed'); } openAction(collapse,element); element.classList.remove('collapsed'); } }; self.dispose = function () { element.removeEventListener('click',self.toggle,false); delete element.Collapse; }; element = queryElement(element); element.Collapse && element.Collapse.dispose(); var accordionData = element.getAttribute('data-parent'); showCustomEvent = bootstrapCustomEvent('show', 'collapse'); shownCustomEvent = bootstrapCustomEvent('shown', 'collapse'); hideCustomEvent = bootstrapCustomEvent('hide', 'collapse'); hiddenCustomEvent = bootstrapCustomEvent('hidden', 'collapse'); collapse = queryElement(options.target || element.getAttribute('data-target') || element.getAttribute('href')); collapse.isAnimating = false; accordion = element.closest(options.parent || accordionData); if ( !element.Collapse ) { element.addEventListener('click',self.toggle,false); } element.Collapse = self; } function setFocus (element){ element.focus ? element.focus() : element.setActive(); } function Dropdown(element,option) { var self = this, showCustomEvent, shownCustomEvent, hideCustomEvent, hiddenCustomEvent, relatedTarget = null, parent, menu, menuItems = [], persist; function preventEmptyAnchor(anchor) { (anchor.href && anchor.href.slice(-1) === '#' || anchor.parentNode && anchor.parentNode.href && anchor.parentNode.href.slice(-1) === '#') && this.preventDefault(); } function toggleDismiss() { var action = element.open ? 'addEventListener' : 'removeEventListener'; document[action]('click',dismissHandler,false); document[action]('keydown',preventScroll,false); document[action]('keyup',keyHandler,false); document[action]('focus',dismissHandler,false); } function dismissHandler(e) { var eventTarget = e.target, hasData = eventTarget && (eventTarget.getAttribute('data-toggle') || eventTarget.parentNode && eventTarget.parentNode.getAttribute && eventTarget.parentNode.getAttribute('data-toggle')); if ( e.type === 'focus' && (eventTarget === element || eventTarget === menu || menu.contains(eventTarget) ) ) { return; } if ( (eventTarget === menu || menu.contains(eventTarget)) && (persist || hasData) ) { return; } else { relatedTarget = eventTarget === element || element.contains(eventTarget) ? element : null; self.hide(); } preventEmptyAnchor.call(e,eventTarget); } function clickHandler(e) { relatedTarget = element; self.show(); preventEmptyAnchor.call(e,e.target); } function preventScroll(e) { var key = e.which || e.keyCode; if( key === 38 || key === 40 ) { e.preventDefault(); } } function keyHandler(e) { var key = e.which || e.keyCode, activeItem = document.activeElement, isSameElement = activeItem === element, isInsideMenu = menu.contains(activeItem), isMenuItem = activeItem.parentNode === menu || activeItem.parentNode.parentNode === menu, idx = menuItems.indexOf(activeItem); if ( isMenuItem ) { idx = isSameElement ? 0 : key === 38 ? (idx>1?idx-1:0) : key === 40 ? (idx= windowWidth, halfBottomExceed = rect.top + elementDimensions.h/2 + linkDimensions.h/2 >= windowHeight, topExceed = rect.top - elementDimensions.h < 0, leftExceed = rect.left - elementDimensions.w < 0, bottomExceed = rect.top + elementDimensions.h + linkDimensions.h >= windowHeight, rightExceed = rect.left + elementDimensions.w + linkDimensions.w >= windowWidth; position = (position === 'left' || position === 'right') && leftExceed && rightExceed ? 'top' : position; position = position === 'top' && topExceed ? 'bottom' : position; position = position === 'bottom' && bottomExceed ? 'top' : position; position = position === 'left' && leftExceed ? 'right' : position; position = position === 'right' && rightExceed ? 'left' : position; var topPosition, leftPosition, arrowTop, arrowLeft, arrowWidth, arrowHeight; element.className.indexOf(position) === -1 && (element.className = element.className.replace(tipPositions,position)); arrowWidth = arrow.offsetWidth; arrowHeight = arrow.offsetHeight; if ( position === 'left' || position === 'right' ) { if ( position === 'left' ) { leftPosition = rect.left + scroll.x - elementDimensions.w - ( isPopover ? arrowWidth : 0 ); } else { leftPosition = rect.left + scroll.x + linkDimensions.w; } if (halfTopExceed) { topPosition = rect.top + scroll.y; arrowTop = linkDimensions.h/2 - arrowWidth; } else if (halfBottomExceed) { topPosition = rect.top + scroll.y - elementDimensions.h + linkDimensions.h; arrowTop = elementDimensions.h - linkDimensions.h/2 - arrowWidth; } else { topPosition = rect.top + scroll.y - elementDimensions.h/2 + linkDimensions.h/2; arrowTop = elementDimensions.h/2 - (isPopover ? arrowHeight*0.9 : arrowHeight/2); } } else if ( position === 'top' || position === 'bottom' ) { if ( position === 'top') { topPosition = rect.top + scroll.y - elementDimensions.h - ( isPopover ? arrowHeight : 0 ); } else { topPosition = rect.top + scroll.y + linkDimensions.h; } if (halfLeftExceed) { leftPosition = 0; arrowLeft = rect.left + linkDimensions.w/2 - arrowWidth; } else if (halfRightExceed) { leftPosition = windowWidth - elementDimensions.w*1.01; arrowLeft = elementDimensions.w - ( windowWidth - rect.left ) + linkDimensions.w/2 - arrowWidth/2; } else { leftPosition = rect.left + scroll.x - elementDimensions.w/2 + linkDimensions.w/2; arrowLeft = elementDimensions.w/2 - ( isPopover ? arrowWidth : arrowWidth/2 ); } } element.style.top = topPosition + 'px'; element.style.left = leftPosition + 'px'; arrowTop && (arrow.style.top = arrowTop + 'px'); arrowLeft && (arrow.style.left = arrowLeft + 'px'); } function Popover(element,options) { options = options || {}; var self = this; var popover = null, timer = 0, isIphone = /(iPhone|iPod|iPad)/.test(navigator.userAgent), titleString, contentString, ops = {}; var triggerData, animationData, placementData, dismissibleData, delayData, containerData, closeBtn, showCustomEvent, shownCustomEvent, hideCustomEvent, hiddenCustomEvent, containerElement, containerDataElement, modal, navbarFixedTop, navbarFixedBottom, placementClass; function dismissibleHandler(e) { if (popover !== null && e.target === queryElement('.close',popover)) { self.hide(); } } function getContents() { return { 0 : options.title || element.getAttribute('data-title') || null, 1 : options.content || element.getAttribute('data-content') || null } } function removePopover() { ops.container.removeChild(popover); timer = null; popover = null; } function createPopover() { titleString = getContents()[0] || null; contentString = getContents()[1]; contentString = !!contentString ? contentString.trim() : null; popover = document.createElement('div'); var popoverArrow = document.createElement('div'); popoverArrow.classList.add('arrow'); popover.appendChild(popoverArrow); if ( contentString !== null && ops.template === null ) { popover.setAttribute('role','tooltip'); if (titleString !== null) { var popoverTitle = document.createElement('h3'); popoverTitle.classList.add('popover-header'); popoverTitle.innerHTML = ops.dismissible ? titleString + closeBtn : titleString; popover.appendChild(popoverTitle); } var popoverBodyMarkup = document.createElement('div'); popoverBodyMarkup.classList.add('popover-body'); popoverBodyMarkup.innerHTML = ops.dismissible && titleString === null ? contentString + closeBtn : contentString; popover.appendChild(popoverBodyMarkup); } else { var popoverTemplate = document.createElement('div'); popoverTemplate.innerHTML = ops.template.trim(); popover.className = popoverTemplate.firstChild.className; popover.innerHTML = popoverTemplate.firstChild.innerHTML; var popoverHeader = queryElement('.popover-header',popover), popoverBody = queryElement('.popover-body',popover); titleString && popoverHeader && (popoverHeader.innerHTML = titleString.trim()); contentString && popoverBody && (popoverBody.innerHTML = contentString.trim()); } ops.container.appendChild(popover); popover.style.display = 'block'; !popover.classList.contains( 'popover') && popover.classList.add('popover'); !popover.classList.contains( ops.animation) && popover.classList.add(ops.animation); !popover.classList.contains( placementClass) && popover.classList.add(placementClass); } function showPopover() { !popover.classList.contains('show') && ( popover.classList.add('show') ); } function updatePopover() { styleTip(element, popover, ops.placement, ops.container); } function forceFocus () { if (popover === null) { element.focus(); } } function toggleEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; if (ops.trigger === 'hover') { element[action]( mouseClickEvents.down, self.show ); element[action]( mouseHoverEvents[0], self.show ); if (!ops.dismissible) { element[action]( mouseHoverEvents[1], self.hide ); } } else if ('click' == ops.trigger) { element[action]( ops.trigger, self.toggle ); } else if ('focus' == ops.trigger) { isIphone && element[action]( 'click', forceFocus, false ); element[action]( ops.trigger, self.toggle ); } } function touchHandler(e){ if ( popover && popover.contains(e.target) || e.target === element || element.contains(e.target)) ; else { self.hide(); } } function dismissHandlerToggle(action) { action = action ? 'addEventListener' : 'removeEventListener'; if (ops.dismissible) { document[action]('click', dismissibleHandler, false ); } else { 'focus' == ops.trigger && element[action]( 'blur', self.hide ); 'hover' == ops.trigger && document[action]( 'touchstart', touchHandler, passiveHandler ); } window[action]('resize', self.hide, passiveHandler ); } function showTrigger() { dismissHandlerToggle(1); dispatchCustomEvent.call(element, shownCustomEvent); } function hideTrigger() { dismissHandlerToggle(); removePopover(); dispatchCustomEvent.call(element, hiddenCustomEvent); } self.toggle = function () { if (popover === null) { self.show(); } else { self.hide(); } }; self.show = function () { clearTimeout(timer); timer = setTimeout( function () { if (popover === null) { dispatchCustomEvent.call(element, showCustomEvent); if ( showCustomEvent.defaultPrevented ) { return; } createPopover(); updatePopover(); showPopover(); !!ops.animation ? emulateTransitionEnd(popover, showTrigger) : showTrigger(); } }, 20 ); }; self.hide = function () { clearTimeout(timer); timer = setTimeout( function () { if (popover && popover !== null && popover.classList.contains('show')) { dispatchCustomEvent.call(element, hideCustomEvent); if ( hideCustomEvent.defaultPrevented ) { return; } popover.classList.remove('show'); !!ops.animation ? emulateTransitionEnd(popover, hideTrigger) : hideTrigger(); } }, ops.delay ); }; self.dispose = function () { self.hide(); toggleEvents(); delete element.Popover; }; element = queryElement(element); element.Popover && element.Popover.dispose(); triggerData = element.getAttribute('data-trigger'); animationData = element.getAttribute('data-animation'); placementData = element.getAttribute('data-placement'); dismissibleData = element.getAttribute('data-dismissible'); delayData = element.getAttribute('data-delay'); containerData = element.getAttribute('data-container'); closeBtn = ''; showCustomEvent = bootstrapCustomEvent('show', 'popover'); shownCustomEvent = bootstrapCustomEvent('shown', 'popover'); hideCustomEvent = bootstrapCustomEvent('hide', 'popover'); hiddenCustomEvent = bootstrapCustomEvent('hidden', 'popover'); containerElement = queryElement(options.container); containerDataElement = queryElement(containerData); modal = element.closest('.modal'); navbarFixedTop = element.closest('.fixed-top'); navbarFixedBottom = element.closest('.fixed-bottom'); ops.template = options.template ? options.template : null; ops.trigger = options.trigger ? options.trigger : triggerData || 'hover'; ops.animation = options.animation && options.animation !== 'fade' ? options.animation : animationData || 'fade'; ops.placement = options.placement ? options.placement : placementData || 'top'; ops.delay = parseInt(options.delay || delayData) || 200; ops.dismissible = options.dismissible || dismissibleData === 'true' ? true : false; ops.container = containerElement ? containerElement : containerDataElement ? containerDataElement : navbarFixedTop ? navbarFixedTop : navbarFixedBottom ? navbarFixedBottom : modal ? modal : document.body; placementClass = "bs-popover-" + (ops.placement); var popoverContents = getContents(); titleString = popoverContents[0]; contentString = popoverContents[1]; if ( !contentString && !ops.template ) { return; } if ( !element.Popover ) { toggleEvents(1); } element.Popover = self; } function ScrollSpy(element,options) { options = options || {}; var self = this, vars, targetData, offsetData, spyTarget, scrollTarget, ops = {}; function updateTargets(){ var links = spyTarget.getElementsByTagName('A'); if (vars.length !== links.length) { vars.items = []; vars.targets = []; Array.from(links).map(function (link){ var href = link.getAttribute('href'), targetItem = href && href.charAt(0) === '#' && href.slice(-1) !== '#' && queryElement(href); if ( targetItem ) { vars.items.push(link); vars.targets.push(targetItem); } }); vars.length = links.length; } } function updateItem(index) { var item = vars.items[index], targetItem = vars.targets[index], dropmenu = item.classList.contains('dropdown-item') && item.closest('.dropdown-menu'), dropLink = dropmenu && dropmenu.previousElementSibling, nextSibling = item.nextElementSibling, activeSibling = nextSibling && nextSibling.getElementsByClassName('active').length, targetRect = vars.isWindow && targetItem.getBoundingClientRect(), isActive = item.classList.contains('active') || false, topEdge = (vars.isWindow ? targetRect.top + vars.scrollOffset : targetItem.offsetTop) - ops.offset, bottomEdge = vars.isWindow ? targetRect.bottom + vars.scrollOffset - ops.offset : vars.targets[index+1] ? vars.targets[index+1].offsetTop - ops.offset : element.scrollHeight, inside = activeSibling || vars.scrollOffset >= topEdge && bottomEdge > vars.scrollOffset; if ( !isActive && inside ) { item.classList.add('active'); if (dropLink && !dropLink.classList.contains('active') ) { dropLink.classList.add('active'); } dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', vars.items[index])); } else if ( isActive && !inside ) { item.classList.remove('active'); if (dropLink && dropLink.classList.contains('active') && !item.parentNode.getElementsByClassName('active').length ) { dropLink.classList.remove('active'); } } else if ( isActive && inside || !inside && !isActive ) { return; } } function updateItems() { updateTargets(); vars.scrollOffset = vars.isWindow ? getScroll().y : element.scrollTop; vars.items.map(function (l,idx){ return updateItem(idx); }); } function toggleEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; scrollTarget[action]('scroll', self.refresh, passiveHandler ); window[action]( 'resize', self.refresh, passiveHandler ); } self.refresh = function () { updateItems(); }; self.dispose = function () { toggleEvents(); delete element.ScrollSpy; }; element = queryElement(element); element.ScrollSpy && element.ScrollSpy.dispose(); targetData = element.getAttribute('data-target'); offsetData = element.getAttribute('data-offset'); spyTarget = queryElement(options.target || targetData); scrollTarget = element.offsetHeight < element.scrollHeight ? element : window; if (!spyTarget) { return } ops.target = spyTarget; ops.offset = parseInt(options.offset || offsetData) || 10; vars = {}; vars.length = 0; vars.items = []; vars.targets = []; vars.isWindow = scrollTarget === window; if ( !element.ScrollSpy ) { toggleEvents(1); } self.refresh(); element.ScrollSpy = self; } function Tab(element,options) { options = options || {}; var self = this, heightData, tabs, dropdown, showCustomEvent, shownCustomEvent, hideCustomEvent, hiddenCustomEvent, next, tabsContentContainer = false, activeTab, activeContent, nextContent, containerHeight, equalContents, nextHeight, animateHeight; function triggerEnd() { tabsContentContainer.style.height = ''; tabsContentContainer.classList.remove('collapsing'); tabs.isAnimating = false; } function triggerShow() { if (tabsContentContainer) { if ( equalContents ) { triggerEnd(); } else { setTimeout(function () { tabsContentContainer.style.height = nextHeight + "px"; tabsContentContainer.offsetWidth; emulateTransitionEnd(tabsContentContainer, triggerEnd); },50); } } else { tabs.isAnimating = false; } shownCustomEvent = bootstrapCustomEvent('shown', 'tab', activeTab); dispatchCustomEvent.call(next, shownCustomEvent); } function triggerHide() { if (tabsContentContainer) { activeContent.style.float = 'left'; nextContent.style.float = 'left'; containerHeight = activeContent.scrollHeight; } showCustomEvent = bootstrapCustomEvent('show', 'tab', activeTab); hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', next); dispatchCustomEvent.call(next, showCustomEvent); if ( showCustomEvent.defaultPrevented ) { return; } nextContent.classList.add('active'); activeContent.classList.remove('active'); if (tabsContentContainer) { nextHeight = nextContent.scrollHeight; equalContents = nextHeight === containerHeight; tabsContentContainer.classList.add('collapsing'); tabsContentContainer.style.height = containerHeight + "px"; tabsContentContainer.offsetHeight; activeContent.style.float = ''; nextContent.style.float = ''; } if ( nextContent.classList.contains('fade') ) { setTimeout(function () { nextContent.classList.add('show'); emulateTransitionEnd(nextContent,triggerShow); },20); } else { triggerShow(); } dispatchCustomEvent.call(activeTab, hiddenCustomEvent); } function getActiveTab() { var activeTabs = tabs.getElementsByClassName('active'), activeTab; if ( activeTabs.length === 1 && !activeTabs[0].parentNode.classList.contains('dropdown') ) { activeTab = activeTabs[0]; } else if ( activeTabs.length > 1 ) { activeTab = activeTabs[activeTabs.length-1]; } return activeTab; } function getActiveContent() { return queryElement(getActiveTab().getAttribute('href')) } function clickHandler(e) { e.preventDefault(); next = e.currentTarget; !tabs.isAnimating && self.show(); } self.show = function () { next = next || element; if (!next.classList.contains('active')) { nextContent = queryElement(next.getAttribute('href')); activeTab = getActiveTab(); activeContent = getActiveContent(); hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', next); dispatchCustomEvent.call(activeTab, hideCustomEvent); if (hideCustomEvent.defaultPrevented) { return; } tabs.isAnimating = true; activeTab.classList.remove('active'); activeTab.setAttribute('aria-selected','false'); next.classList.add('active'); next.setAttribute('aria-selected','true'); if ( dropdown ) { if ( !element.parentNode.classList.contains('dropdown-menu') ) { if (dropdown.classList.contains('active')) { dropdown.classList.remove('active'); } } else { if (!dropdown.classList.contains('active')) { dropdown.classList.add('active'); } } } if (activeContent.classList.contains('fade')) { activeContent.classList.remove('show'); emulateTransitionEnd(activeContent, triggerHide); } else { triggerHide(); } } }; self.dispose = function () { element.removeEventListener('click',clickHandler,false); delete element.Tab; }; element = queryElement(element); element.Tab && element.Tab.dispose(); heightData = element.getAttribute('data-height'); tabs = element.closest('.nav'); dropdown = tabs && queryElement('.dropdown-toggle',tabs); animateHeight = !supportTransition || (options.height === false || heightData === 'false') ? false : true; tabs.isAnimating = false; if ( !element.Tab ) { element.addEventListener('click',clickHandler,false); } if (animateHeight) { tabsContentContainer = getActiveContent().parentNode; } element.Tab = self; } function Toast(element,options) { options = options || {}; var self = this, toast, timer = 0, animationData, autohideData, delayData, showCustomEvent, hideCustomEvent, shownCustomEvent, hiddenCustomEvent, ops = {}; function showComplete() { toast.classList.remove( 'showing' ); toast.classList.add( 'show' ); dispatchCustomEvent.call(toast,shownCustomEvent); if (ops.autohide) { self.hide(); } } function hideComplete() { toast.classList.add( 'hide' ); dispatchCustomEvent.call(toast,hiddenCustomEvent); } function close () { toast.classList.remove('show' ); ops.animation ? emulateTransitionEnd(toast, hideComplete) : hideComplete(); } function disposeComplete() { clearTimeout(timer); element.removeEventListener('click',self.hide,false); delete element.Toast; } self.show = function () { if (toast && !toast.classList.contains('show')) { dispatchCustomEvent.call(toast,showCustomEvent); if (showCustomEvent.defaultPrevented) { return; } ops.animation && toast.classList.add( 'fade' ); toast.classList.remove('hide' ); toast.offsetWidth; toast.classList.add('showing' ); ops.animation ? emulateTransitionEnd(toast, showComplete) : showComplete(); } }; self.hide = function (noTimer) { if (toast && toast.classList.contains('show')) { dispatchCustomEvent.call(toast,hideCustomEvent); if(hideCustomEvent.defaultPrevented) { return; } noTimer ? close() : (timer = setTimeout( close, ops.delay)); } }; self.dispose = function () { ops.animation ? emulateTransitionEnd(toast, disposeComplete) : disposeComplete(); }; element = queryElement(element); element.Toast && element.Toast.dispose(); toast = element.closest('.toast'); animationData = element.getAttribute('data-animation'); autohideData = element.getAttribute('data-autohide'); delayData = element.getAttribute('data-delay'); showCustomEvent = bootstrapCustomEvent('show', 'toast'); hideCustomEvent = bootstrapCustomEvent('hide', 'toast'); shownCustomEvent = bootstrapCustomEvent('shown', 'toast'); hiddenCustomEvent = bootstrapCustomEvent('hidden', 'toast'); ops.animation = options.animation === false || animationData === 'false' ? 0 : 1; ops.autohide = options.autohide === false || autohideData === 'false' ? 0 : 1; ops.delay = parseInt(options.delay || delayData) || 500; if ( !element.Toast ) { element.addEventListener('click',self.hide,false); } element.Toast = self; } function Tooltip(element,options) { options = options || {}; var self = this, tooltip = null, timer = 0, titleString, animationData, placementData, delayData, containerData, showCustomEvent, shownCustomEvent, hideCustomEvent, hiddenCustomEvent, containerElement, containerDataElement, modal, navbarFixedTop, navbarFixedBottom, placementClass, ops = {}; function getTitle() { return element.getAttribute('title') || element.getAttribute('data-title') || element.getAttribute('data-original-title') } function removeToolTip() { ops.container.removeChild(tooltip); tooltip = null; timer = null; } function createToolTip() { titleString = getTitle(); if ( titleString ) { tooltip = document.createElement('div'); if (ops.template) { var tooltipMarkup = document.createElement('div'); tooltipMarkup.innerHTML = ops.template.trim(); tooltip.className = tooltipMarkup.firstChild.className; tooltip.innerHTML = tooltipMarkup.firstChild.innerHTML; queryElement('.tooltip-inner',tooltip).innerHTML = titleString.trim(); } else { var tooltipArrow = document.createElement('div'); tooltipArrow.classList.add('arrow'); tooltip.appendChild(tooltipArrow); var tooltipInner = document.createElement('div'); tooltipInner.classList.add('tooltip-inner'); tooltip.appendChild(tooltipInner); tooltipInner.innerHTML = titleString; } tooltip.style.left = '0'; tooltip.style.top = '0'; tooltip.setAttribute('role','tooltip'); !tooltip.classList.contains('tooltip') && tooltip.classList.add('tooltip'); !tooltip.classList.contains(ops.animation) && tooltip.classList.add(ops.animation); !tooltip.classList.contains(placementClass) && tooltip.classList.add(placementClass); ops.container.appendChild(tooltip); } } function updateTooltip() { styleTip(element, tooltip, ops.placement, ops.container); } function showTooltip() { !tooltip.classList.contains('show') && ( tooltip.classList.add('show') ); } function touchHandler(e){ if ( tooltip && tooltip.contains(e.target) || e.target === element || element.contains(e.target)) ; else { self.hide(); } } function toggleAction(action){ action = action ? 'addEventListener' : 'removeEventListener'; document[action]( 'touchstart', touchHandler, passiveHandler ); window[action]( 'resize', self.hide, passiveHandler ); } function showAction() { toggleAction(1); dispatchCustomEvent.call(element, shownCustomEvent); } function hideAction() { toggleAction(); removeToolTip(); dispatchCustomEvent.call(element, hiddenCustomEvent); } function toggleEvents(action) { action = action ? 'addEventListener' : 'removeEventListener'; element[action](mouseClickEvents.down, self.show,false); element[action](mouseHoverEvents[0], self.show,false); element[action](mouseHoverEvents[1], self.hide,false); } self.show = function () { clearTimeout(timer); timer = setTimeout( function () { if (tooltip === null) { dispatchCustomEvent.call(element, showCustomEvent); if (showCustomEvent.defaultPrevented) { return; } if(createToolTip() !== false) { updateTooltip(); showTooltip(); !!ops.animation ? emulateTransitionEnd(tooltip, showAction) : showAction(); } } }, 20 ); }; self.hide = function () { clearTimeout(timer); timer = setTimeout( function () { if (tooltip && tooltip.classList.contains('show')) { dispatchCustomEvent.call(element, hideCustomEvent); if (hideCustomEvent.defaultPrevented) { return; } tooltip.classList.remove('show'); !!ops.animation ? emulateTransitionEnd(tooltip, hideAction) : hideAction(); } }, ops.delay); }; self.toggle = function () { if (!tooltip) { self.show(); } else { self.hide(); } }; self.dispose = function () { toggleEvents(); self.hide(); element.setAttribute('title', element.getAttribute('data-original-title')); element.removeAttribute('data-original-title'); delete element.Tooltip; }; element = queryElement(element); element.Tooltip && element.Tooltip.dispose(); animationData = element.getAttribute('data-animation'); placementData = element.getAttribute('data-placement'); delayData = element.getAttribute('data-delay'); containerData = element.getAttribute('data-container'); showCustomEvent = bootstrapCustomEvent('show', 'tooltip'); shownCustomEvent = bootstrapCustomEvent('shown', 'tooltip'); hideCustomEvent = bootstrapCustomEvent('hide', 'tooltip'); hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tooltip'); containerElement = queryElement(options.container); containerDataElement = queryElement(containerData); modal = element.closest('.modal'); navbarFixedTop = element.closest('.fixed-top'); navbarFixedBottom = element.closest('.fixed-bottom'); ops.animation = options.animation && options.animation !== 'fade' ? options.animation : animationData || 'fade'; ops.placement = options.placement ? options.placement : placementData || 'top'; ops.template = options.template ? options.template : null; ops.delay = parseInt(options.delay || delayData) || 200; ops.container = containerElement ? containerElement : containerDataElement ? containerDataElement : navbarFixedTop ? navbarFixedTop : navbarFixedBottom ? navbarFixedBottom : modal ? modal : document.body; placementClass = "bs-tooltip-" + (ops.placement); titleString = getTitle(); if ( !titleString ) { return; } if (!element.Tooltip) { element.setAttribute('data-original-title',titleString); element.removeAttribute('title'); toggleEvents(1); } element.Tooltip = self; } var componentsInit = {}; function initializeDataAPI( Constructor, collection ){ Array.from(collection).map(function (x){ return new Constructor(x); }); } function initCallback(lookUp){ lookUp = lookUp || document; for (var component in componentsInit) { initializeDataAPI( componentsInit[component][0], lookUp.querySelectorAll (componentsInit[component][1]) ); } } componentsInit.Alert = [ Alert, '[data-dismiss="alert"]']; componentsInit.Button = [ Button, '[data-toggle="buttons"]' ]; componentsInit.Carousel = [ Carousel, '[data-ride="carousel"]' ]; componentsInit.Collapse = [ Collapse, '[data-toggle="collapse"]' ]; componentsInit.Dropdown = [ Dropdown, '[data-toggle="dropdown"]']; componentsInit.Modal = [ Modal, '[data-toggle="modal"]' ]; componentsInit.Popover = [ Popover, '[data-toggle="popover"],[data-tip="popover"]' ]; componentsInit.ScrollSpy = [ ScrollSpy, '[data-spy="scroll"]' ]; componentsInit.Tab = [ Tab, '[data-toggle="tab"]' ]; componentsInit.Toast = [ Toast, '[data-dismiss="toast"]' ]; componentsInit.Tooltip = [ Tooltip, '[data-toggle="tooltip"],[data-tip="tooltip"]' ]; document.body ? initCallback() : document.addEventListener( 'DOMContentLoaded', function initWrapper(){ initCallback(); document.removeEventListener('DOMContentLoaded',initWrapper,false); }, false ); function removeElementDataAPI( ConstructorName, collection ){ Array.from(collection).map(function (x){ return x[ConstructorName].dispose(); }); } function removeDataAPI(lookUp) { lookUp = lookUp || document; for (var component in componentsInit) { removeElementDataAPI( component, lookUp.querySelectorAll (componentsInit[component][1]) ); } } var version = "3.0.10"; var index = { Alert: Alert, Button: Button, Carousel: Carousel, Collapse: Collapse, Dropdown: Dropdown, Modal: Modal, Popover: Popover, ScrollSpy: ScrollSpy, Tab: Tab, Toast: Toast, Tooltip: Tooltip, initCallback: initCallback, removeDataAPI: removeDataAPI, componentsInit: componentsInit, Version: version }; return index; })));