vendor: 12,656 bytes, lines 1-408
1/*! 2 * Waves v0.7.5 3 * http://fian.my.id/Waves 4 * 5 * Copyright 2014-2016 Alfiana E. Sibuea and other contributors 6 * Released under the MIT license 7 * https://github.com/fians/Waves/blob/master/LICENSE 8 */ 9 10; 11(function (window, factory) { 12 'use strict'; 13 14 // AMD. Register as an anonymous module. Wrap in function so we have access 15 // to root via `this`. 16 if (typeof define === 'function' && define.amd) { 17 define([], function () { 18 return factory.apply(window); 19 }); 20 } 21 22 // Node. Does not work with strict CommonJS, but only CommonJS-like 23 // environments that support module.exports, like Node. 24 else if (typeof exports === 'object') { 25 module.exports = factory.call(window); 26 } 27 28 // Browser globals. 29 else { 30 window.Waves = factory.call(window); 31 } 32})(typeof global === 'object' ? global : this, function () { 33 'use strict'; 34 35 var Waves = Waves || {}; 36 var $$ = document.querySelectorAll.bind(document); 37 var toString = Object.prototype.toString; 38 var isTouchAvailable = 'ontouchstart' in window; 39 40 41 // Find exact position of element 42 function isWindow(obj) { 43 return obj !== null && obj === obj.window; 44 } 45 46 function getWindow(elem) { 47 return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView; 48 } 49 50 function isObject(value) { 51 var type = typeof value; 52 return type === 'function' || type === 'object' && !!value; 53 } 54 55 function isDOMNode(obj) { 56 return isObject(obj) && obj.nodeType > 0; 57 } 58 59 function getWavesElements(nodes) { 60 var stringRepr = toString.call(nodes); 61 62 if (stringRepr === '[object String]') { 63 return $$(nodes); 64 } else if (isObject(nodes) && /^\[object (Array|HTMLCollection|NodeList|Object)\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) { 65 return nodes; 66 } else if (isDOMNode(nodes)) { 67 return [nodes]; 68 } 69 70 return []; 71 } 72 73 function offset(elem) { 74 var docElem, win, 75 box = { 76 top: 0, 77 left: 0 78 }, 79 doc = elem && elem.ownerDocument; 80 81 docElem = doc.documentElement; 82 83 if (typeof elem.getBoundingClientRect !== typeof undefined) { 84 box = elem.getBoundingClientRect(); 85 } 86 win = getWindow(doc); 87 return { 88 top: box.top + win.pageYOffset - docElem.clientTop, 89 left: box.left + win.pageXOffset - docElem.clientLeft 90 }; 91 } 92 93 function convertStyle(styleObj) { 94 var style = ''; 95 96 for (var prop in styleObj) { 97 if (styleObj.hasOwnProperty(prop)) { 98 style += (prop + ':' + styleObj[prop] + ';'); 99 } 100 } 101 102 return style; 103 } 104 105 var Effect = { 106 107 // Effect duration 108 duration: 750, 109 110 // Effect delay (check for scroll before showing effect) 111 delay: 200, 112 113 show: function (e, element, velocity) { 114 115 // Disable right click 116 if (e.button === 2) { 117 return false; 118 } 119 120 element = element || this; 121 122 // Create ripple 123 var ripple = document.createElement('div'); 124 ripple.className = 'waves-ripple waves-rippling'; 125 element.appendChild(ripple); 126 127 // Get click coordinate and element width 128 var pos = offset(element); 129 var relativeY = 0; 130 var relativeX = 0; 131 // Support for touch devices 132 if ('touches' in e && e.touches.length) { 133 relativeY = (e.touches[0].pageY - pos.top); 134 relativeX = (e.touches[0].pageX - pos.left); 135 } 136 //Normal case 137 else { 138 relativeY = (e.pageY - pos.top); 139 relativeX = (e.pageX - pos.left); 140 } 141 // Support for synthetic events 142 relativeX = relativeX >= 0 ? relativeX : 0; 143 relativeY = relativeY >= 0 ? relativeY : 0; 144 145 var scale = 'scale(' + ((element.clientWidth / 100) * 3) + ')'; 146 var translate = 'translate(0,0)'; 147 148 if (velocity) { 149 translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)'; 150 } 151 152 // Attach data to element 153 ripple.setAttribute('data-hold', Date.now()); 154 ripple.setAttribute('data-x', relativeX); 155 ripple.setAttribute('data-y', relativeY); 156 ripple.setAttribute('data-scale', scale); 157 ripple.setAttribute('data-translate', translate); 158 159 // Set ripple position 160 var rippleStyle = { 161 top: relativeY + 'px', 162 left: relativeX + 'px' 163 }; 164 165 ripple.classList.add('waves-notransition'); 166 ripple.setAttribute('style', convertStyle(rippleStyle)); 167 ripple.classList.remove('waves-notransition'); 168 169 // Scale the ripple 170 rippleStyle['-webkit-transform'] = scale + ' ' + translate; 171 rippleStyle['-moz-transform'] = scale + ' ' + translate; 172 rippleStyle['-ms-transform'] = scale + ' ' + translate; 173 rippleStyle['-o-transform'] = scale + ' ' + translate; 174 rippleStyle.transform = scale + ' ' + translate; 175 rippleStyle.opacity = '1'; 176 177 var duration = e.type === 'mousemove' ? 2500 : Effect.duration; 178 rippleStyle['-webkit-transition-duration'] = duration + 'ms'; 179 rippleStyle['-moz-transition-duration'] = duration + 'ms'; 180 rippleStyle['-o-transition-duration'] = duration + 'ms'; 181 rippleStyle['transition-duration'] = duration + 'ms'; 182 183 ripple.setAttribute('style', convertStyle(rippleStyle)); 184 }, 185 186 hide: function (e, element) { 187 element = element || this; 188 189 var ripples = element.getElementsByClassName('waves-rippling'); 190 191 for (var i = 0, len = ripples.length; i < len; i++) { 192 removeRipple(e, element, ripples[i]); 193 } 194 } 195 }; 196 197 /** 198 * Collection of wrapper for HTML element that only have single tag 199 * like <input> and <img> 200 */ 201 var TagWrapper = { 202 203 // Wrap <input> tag so it can perform the effect 204 input: function (element) { 205 206 /*var parent = element.parentNode; 207 208 // If input already have parent just pass through 209 if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) { 210 return; 211 } 212 213 // Put element class and style to the specified parent 214 var wrapper = document.createElement('i'); 215 wrapper.className = element.className + ' waves-input-wrapper'; 216 element.className = 'waves-button-input'; 217 218 // Put element as child 219 parent.replaceChild(wrapper, element); 220 wrapper.appendChild(element); 221 222 // Apply element color and background color to wrapper 223 var elementStyle = window.getComputedStyle(element, null); 224 var color = elementStyle.color; 225 var backgroundColor = elementStyle.backgroundColor; 226 227 wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor); 228 element.setAttribute('style', 'background-color:rgba(0,0,0,0);');*/ 229 230 }, 231 232 // Wrap <img> tag so it can perform the effect 233 img: function (element) { 234 235 var parent = element.parentNode; 236 237 // If input already have parent just pass through 238 if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) { 239 return; 240 } 241 242 // Put element as child 243 var wrapper = document.createElement('i'); 244 parent.replaceChild(wrapper, element); 245 wrapper.appendChild(element); 246 247 } 248 }; 249 250 /** 251 * Hide the effect and remove the ripple. Must be 252 * a separate function to pass the JSLint... 253 */ 254 function removeRipple(e, el, ripple) { 255 256 // Check if the ripple still exist 257 if (!ripple) { 258 return; 259 } 260 261 ripple.classList.remove('waves-rippling'); 262 263 var relativeX = ripple.getAttribute('data-x'); 264 var relativeY = ripple.getAttribute('data-y'); 265 var scale = ripple.getAttribute('data-scale'); 266 var translate = ripple.getAttribute('data-translate'); 267 268 // Get delay beetween mousedown and mouse leave 269 var diff = Date.now() - Number(ripple.getAttribute('data-hold')); 270 var delay = 350 - diff; 271 272 if (delay < 0) { 273 delay = 0; 274 } 275 276 if (e.type === 'mousemove') { 277 delay = 150; 278 } 279 280 // Fade out ripple after delay 281 var duration = e.type === 'mousemove' ? 2500 : Effect.duration; 282 283 setTimeout(function () { 284 285 var style = { 286 top: relativeY + 'px', 287 left: relativeX + 'px', 288 opacity: '0', 289 290 // Duration 291 '-webkit-transition-duration': duration + 'ms', 292 '-moz-transition-duration': duration + 'ms', 293 '-o-transition-duration': duration + 'ms', 294 'transition-duration': duration + 'ms', 295 '-webkit-transform': scale + ' ' + translate, 296 '-moz-transform': scale + ' ' + translate, 297 '-ms-transform': scale + ' ' + translate, 298 '-o-transform': scale + ' ' + translate, 299 'transform': scale + ' ' + translate 300 }; 301 302 ripple.setAttribute('style', convertStyle(style)); 303 304 setTimeout(function () { 305 try { 306 el.removeChild(ripple); 307 } catch (e) { 308 return false; 309 } 310 }, duration); 311 312 }, delay); 313 } 314 315 316 /** 317 * Disable mousedown event for 500ms during and after touch 318 */ 319 var TouchHandler = { 320 321 /* uses an integer rather than bool so there's no issues with 322 * needing to clear timeouts if another touch event occurred 323 * within the 500ms. Cannot mouseup between touchstart and 324 * touchend, nor in the 500ms after touchend. */ 325 touches: 0, 326 327 allowEvent: function (e) { 328 329 var allow = true; 330 331 if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) { 332 allow = false; 333 } 334 335 return allow; 336 }, 337 registerEvent: function (e) { 338 var eType = e.type; 339 340 if (eType === 'touchstart') { 341 342 TouchHandler.touches += 1; // push 343 344 } else if (/^(touchend|touchcancel)$/.test(eType)) { 345 346 setTimeout(function () { 347 if (TouchHandler.touches) { 348 TouchHandler.touches -= 1; // pop after 500ms 349 } 350 }, 500); 351 352 } 353 } 354 }; 355 356 357 /** 358 * Delegated click handler for .waves-effect element. 359 * returns null when .waves-effect element not in "click tree" 360 */ 361 function getWavesEffectElement(e) { 362 363 if (TouchHandler.allowEvent(e) === false) { 364 return null; 365 } 366 367 var element = null; 368 var target = e.target || e.srcElement; 369 370 while (target.parentElement !== null) { 371 if (target.classList.contains('waves-effect') && (!(target instanceof SVGElement))) { 372 element = target; 373 break; 374 } 375 target = target.parentElement; 376 } 377 378 return element; 379 } 380 381 /** 382 * Bubble the click and show effect if .waves-effect elem was found 383 */ 384 function showEffect(e) { 385 386 // Disable effect if element has "disabled" property on it 387 // In some cases, the event is not triggered by the current element 388 // if (e.target.getAttribute('disabled') !== null) { 389 // return; 390 // } 391 392 var element = getWavesEffectElement(e); 393 394 if (element !== null) { 395 396 // Make it sure the element has either disabled property, disabled attribute or 'disabled' class 397 if (element.disabled || element.getAttribute('disabled') || element.classList.contains('disabled')) { 398 return; 399 } 400 401 TouchHandler.registerEvent(e); 402 403 if (e.type === 'touchstart' && Effect.delay) { 404 405 var hidden = false; 406 407 var timer = setTimeout(function () { 408 timer = null;
409 Effect.show(e, element); 410 }, Effect.delay); 411 412 var hideEffect = function (hideEvent) { 413 414 // if touch hasn't moved, and effect not yet started: start effect now 415 if (timer) { 416 clearTimeout(timer); 417 timer = null; 418 Effect.show(e, element); 419 } 420 if (!hidden) { 421 hidden = true; 422 Effect.hide(hideEvent, element); 423 } 424 }; 425 426 var touchMove = function (moveEvent) { 427 if (timer) { 428 clearTimeout(timer); 429 timer = null; 430 } 431 hideEffect(moveEvent); 432 }; 433 434 element.addEventListener('touchmove', touchMove, false); 435 element.addEventListener('touchend', hideEffect, false); 436 element.addEventListener('touchcancel', hideEffect, false); 437 438 } else { 439
vendor: 3,992 bytes, lines 440-573
440 Effect.show(e, element); 441 442 if (isTouchAvailable) { 443 element.addEventListener('touchend', Effect.hide, false); 444 element.addEventListener('touchcancel', Effect.hide, false); 445 } 446 447 element.addEventListener('mouseup', Effect.hide, false); 448 element.addEventListener('mouseleave', Effect.hide, false); 449 } 450 } 451 } 452 453 Waves.init = function (options) { 454 var body = document.body; 455 456 options = options || {}; 457 458 if ('duration' in options) { 459 Effect.duration = options.duration; 460 } 461 462 if ('delay' in options) { 463 Effect.delay = options.delay; 464 } 465 466 if (isTouchAvailable) { 467 body.addEventListener('touchstart', showEffect, false); 468 body.addEventListener('touchcancel', TouchHandler.registerEvent, false); 469 body.addEventListener('touchend', TouchHandler.registerEvent, false); 470 } 471 472 body.addEventListener('mousedown', showEffect, false); 473 }; 474 475 476 /** 477 * Attach Waves to dynamically loaded inputs, or add .waves-effect and other 478 * waves classes to a set of elements. Set drag to true if the ripple mouseover 479 * or skimming effect should be applied to the elements. 480 */ 481 Waves.attach = function (elements, classes) { 482 483 elements = getWavesElements(elements); 484 485 if (toString.call(classes) === '[object Array]') { 486 classes = classes.join(' '); 487 } 488 489 classes = classes ? ' ' + classes : ''; 490 491 var element, tagName; 492 493 for (var i = 0, len = elements.length; i < len; i++) { 494 495 element = elements[i]; 496 tagName = element.tagName.toLowerCase(); 497 498 if (['input', 'img'].indexOf(tagName) !== -1) { 499 TagWrapper[tagName](element); 500 element = element.parentElement; 501 } 502 503 if (element.className.indexOf('waves-effect') === -1) { 504 element.className += ' waves-effect' + classes; 505 } 506 } 507 }; 508 509 510 /** 511 * Cause a ripple to appear in an element via code. 512 */ 513 Waves.ripple = function (elements, options) { 514 elements = getWavesElements(elements); 515 var elementsLen = elements.length; 516 517 options = options || {}; 518 options.wait = options.wait || 0; 519 options.position = options.position || null; // default = centre of element 520 521 522 if (elementsLen) { 523 var element, pos, off, centre = {}, 524 i = 0; 525 var mousedown = { 526 type: 'mousedown', 527 button: 1 528 }; 529 var hideRipple = function (mouseup, element) { 530 return function () { 531 Effect.hide(mouseup, element); 532 }; 533 }; 534 535 for (; i < elementsLen; i++) { 536 element = elements[i]; 537 pos = options.position || { 538 x: element.clientWidth / 2, 539 y: element.clientHeight / 2 540 }; 541 542 off = offset(element); 543 centre.x = off.left + pos.x; 544 centre.y = off.top + pos.y; 545 546 mousedown.pageX = centre.x; 547 mousedown.pageY = centre.y; 548 549 Effect.show(mousedown, element); 550 551 if (options.wait >= 0 && options.wait !== null) { 552 var mouseup = { 553 type: 'mouseup', 554 button: 1 555 }; 556 557 setTimeout(hideRipple(mouseup, element), options.wait); 558 } 559 } 560 } 561 }; 562 563 /** 564 * Remove all ripples from an element. 565 */ 566 Waves.calm = function (elements) { 567 elements = getWavesElements(elements); 568 var mouseup = { 569 type: 'mouseup', 570 button: 1 571 }; 572 573 for (var i = 0, len = elements.length; i < len; i++) {
574 Effect.hide(mouseup, elements[i]); 575 } 576 }; 577 578 /** 579 * Deprecated API fallback 580 */ 581 Waves.displayEffect = function (options) { 582 console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect'); 583 Waves.init(options); 584 }; 585 586 return Waves; 587}); 588window.onload = function() { 589 //Initialization 590 Waves.attach('.wave', ['waves-effect']); 591 Waves.attach('.btn-flat', ['waves-effect']); 592 Waves.attach('.pagination .page-item .page-link', ['waves-effect']); 593 Waves.attach('.btn', ['waves-light']); 594 Waves.attach('.view .mask', ['waves-light']); 595 Waves.attach('.wave-light', ['waves-light']); 596 Waves.attach('.navbar-nav a, .nav-icons li a, .navbar form, .nav-tabs .nav-item', ['waves-light']); 597 Waves.attach('.navbar-brand', ['waves-light']); 598 Waves.attach('.pager li a', ['waves-light']); 599 Waves.init(); 600} 601 602document.addEventListener('DOMContentLoaded', function() { 603 //Initialization 604 Waves.attach('.wave', ['waves-effect']); 605 Waves.attach('.btn-flat', ['waves-effect']); 606 Waves.attach('.pagination .page-item .page-link', ['waves-effect']); 607 Waves.attach('.btn', ['waves-light']); 608 Waves.attach('.view .mask', ['waves-light']); 609 Waves.attach('.wave-light', ['waves-light']); 610 Waves.attach('.navbar-nav a, .nav-icons li a, .navbar form, .nav-tabs .nav-item', ['waves-light']); 611 Waves.attach('.navbar-brand', ['waves-light']); 612 Waves.attach('.pager li a', ['waves-light']); 613 Waves.init(); 614}); 615var WOW = function (properties) { 616 617 var config = properties || {}; 618 619 this._boxClass = config.boxClass || 'wow'; 620 this._animateClass = config.animateClass || 'animated', 621 this._offset = config.offset || 0, 622 this._mobile = (config.mobile === undefined) ? true : false; 623 this._live = (config.live === undefined) ? true : false; 624 625 this._seoFixEnabled = (config.seoFixEnabled === undefined) ? true : false; 626 this._animationDuration = config.animationDuration || "1s"; 627 this._animationDelay = config.animationDelay || "0s"; 628 629 this._initStorageVariables(); 630 631}; 632 633WOW.prototype._initStorageVariables = function () { 634 635 this._animation = []; 636 this._boxes = []; 637 this._cleanupBoxListener = []; 638 this._cleanupBoxVisibleListener = []; 639 640}; 641 642WOW.prototype.init = function () { 643 644 if (!this._mobile && this._isMobile()) { 645 return; 646 } 647 648 this._eachBoxInit(this._prepareBox.bind(this)); 649 650 this._startWow(); 651 652}; 653 654WOW.prototype._isMobile = function () { 655 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 656}; 657 658 659WOW.prototype._eachBoxInit = function (each) { 660 661 var boxes = document.getElementsByClassName(this._boxClass); 662 663 for (var i = 0; i < boxes.length; i++) { 664 665 (function (i) { 666 each(boxes[i], i); 667 })(i); 668 669 } 670 671}; 672 673WOW.prototype._prepareBox = function (box) { 674 675 var index = this._boxes.push(box) - 1; 676 this._animation[index] = { 677 animationName: box.style.animationName || window.getComputedStyle(box, null).animationName 678 }; 679 box.style.animationName = 'none'; 680 box.style.visibility = 'hidden'; 681 682}; 683 684WOW.prototype._startWow = function () { 685 686 if (this._live) { 687 this._checkForChanges(); 688 } 689 if (this._scrollY() === 0 && this._seoFixEnabled) { 690 this._seoFix(); 691 } 692 693 this._appearInView(); 694 695 this._scrollHandler(); 696 697}; 698 699WOW.prototype._scrollY = function () { 700 701 if (this._isInt(window.pageYOffset)) { 702 return window.pageYOffset; 703 } 704 if (this._isInt(document.documentElement.scrollTop)) { 705 return document.documentElement.scrollTop; 706 } 707 if (this._isInt(document.body.scrollTop)) { 708 return document.body.scrollTop; 709 } 710 711}; 712 713WOW.prototype._isInt = function(value) { 714 return typeof value === 'number' && 715 isFinite(value) && 716 Math.floor(value) === value; 717}; 718 719WOW.prototype._seoFix = function () { 720 721 this._showNotInView(); 722 723}; 724 725 726WOW.prototype._appear = function (box, i) { 727 728 var animationState = box.style.animationPlayState || box.style.WebkitAnimationPlayState; 729 730 if (box.className.indexOf(this._animateClass) === -1) { 731 732 delete this._boxes[i]; 733 734 this._onStartAnimation(box, i); 735 this._onStopAnimation(box, i); 736 737 this._animate(box, i, this._getAnimationConfig(box)); 738 739 } 740 741}; 742 743WOW.prototype._onStartAnimation = function (box, i) { 744 745 this._cleanupBoxVisibleListener[i] = this._boxVisible.bind(this, box, i); 746 747 box.addEventListener('animationstart', this._cleanupBoxVisibleListener[i]); 748 box.addEventListener('webkitAnimationStart', this._cleanupBoxVisibleListener[i]); 749 750}; 751 752WOW.prototype._onStopAnimation = function (box, i) { 753 754 this._cleanupBoxListener[i] = this._cleanupBox.bind(this, box, i); 755 756 box.addEventListener('animationend', this._cleanupBoxListener[i]); 757 box.addEventListener('webkitAnimationEnd', this._cleanupBoxListener[i]); 758 759}; 760 761WOW.prototype._getAnimationConfig = function (box) { 762 763 return { 764 765 delay: this._getDelay(box), 766 duration: this._getDuration(box), 767 iterations: this._getIterations(box) 768 769 } 770 771}; 772 773WOW.prototype._getDelay = function (box) { 774 775 return box.getAttribute('data-wow-delay') || this._animationDelay; 776 777}; 778 779WOW.prototype._getDuration = function (box) { 780 781 return box.getAttribute('data-wow-duration') || this._animationDuration; 782 783}; 784 785WOW.prototype._getIterations = function (box) { 786 787 return box.getAttribute('data-wow-iteration') || 788 box.style.animationIterationCount || 789 window.getComputedStyle(box, null).animationIterationCount || 790 1; 791 792}; 793 794WOW.prototype._animate = function (box, i, config) { 795 796 box.style.animationDelay = config.delay; 797 box.style.animationDuration = config.duration; 798 box.style.animationIterationCount = config.iterations; 799 box.style.animationName = this._animation[i].animationName; 800 box.className += (' ' + this._animateClass); 801 802}; 803 804WOW.prototype._boxVisible = function (box, i) { 805 806 box.style.visibility = 'visible'; 807 808 box.removeEventListener('animationstart', this._cleanupBoxVisibleListener[i]); 809 box.removeEventListener('webkitAnimationStart', this._cleanupBoxVisibleListener[i]); 810 811 delete this._cleanupBoxVisibleListener[i]; 812 813}; 814 815WOW.prototype._cleanupBox = function (box, i) { 816 817 box.style.animationDelay = ''; 818 box.style.animationDuration = ''; 819 box.style.animationIterationCount = ''; 820 box.style.animationName = 'none'; 821 822 this._cleanupClass(box); 823 824 box.removeEventListener('animationend', this._cleanupBoxListener[i]); 825 box.removeEventListener('webkitAnimationEnd', this._cleanupBoxListener[i]); 826 827 delete this._cleanupBoxListener[i]; 828 829}; 830 831WOW.prototype._cleanupClass = function (box) { 832 833 var classArray = box.className.split(' '); 834 var animateIndex = classArray.indexOf(this._animateClass); 835 836 if (animateIndex !== -1) { 837 838 classArray.splice(animateIndex, 1); 839 box.className = classArray.join(' '); 840 841 } 842 843}; 844
845WOW.prototype._eachBox = function (each) { 846 847 for (var i = 0; i < this._boxes.length; i++) { 848 849 var box = this._boxes[i]; 850 851 if (box) { 852 853 (function (i) { 854 each(this._boxes[i], i); 855 }.bind(this))(i); 856 857 } 858 859 } 860 861}; 862 863WOW.prototype._scrollHandler = function () { 864 865 this._hideSeoFixListener = this._hideSeoFix.bind(this); 866 867 window.addEventListener('scroll', this._hideSeoFixListener); 868 window.addEventListener('scroll', this._appearInView.bind(this)); 869 window.addEventListener('resize', this._appearInView.bind(this)); 870 871}; 872 873WOW.prototype._hideSeoFix = function () { 874 875 window.removeEventListener('scroll', this._hideSeoFixListener); 876 delete this._hideSeoFixListener; 877 878 this._eachBox(function (box, i) { 879 880 if (!this._isInView(box)) { 881 box.style.visibility = "hidden"; 882 } 883 884 }.bind(this)); 885 886}; 887 888WOW.prototype._appearInView = function () { 889 890 this._eachBox(function (box, i) { 891 this._animateBox(box, i); 892 }.bind(this)); 893 894}; 895 896WOW.prototype._animateBox = function (box, i) { 897 898 if (this._isInView(box)) { 899 delete this._boxes[i]; 900 this._appear(box, i); 901 } 902 903}; 904 905WOW.prototype._showNotInView = function () { 906 907 this._eachBox(function (box, i) { 908 this._makeVisible(box, i); 909 }.bind(this)); 910 911}; 912 913WOW.prototype._makeVisible = function (box, i) { 914 915 if (!this._isInView(box)) { 916 this._boxes[i].style.visibility = 'visible'; 917 } 918 919}; 920 921WOW.prototype._isInView = function (box) { 922 923 var offset = box.getAttribute('data-wow-offset') || this._offset; 924 var boxTopOffset = this._getElementOffset(box); 925 926 var triggerOffset = boxTopOffset + ~~offset; 927 928 var bottomPosition = window.innerHeight + this._scrollY(); 929 930 return triggerOffset <= bottomPosition && (triggerOffset === 0 ? 10 : triggerOffset) >= this._scrollY(); 931 932}; 933 934WOW.prototype._getElementOffset = function (box) { 935 936 var clientRect = box.getBoundingClientRect(); 937 938 var body = document.body; 939 940 var scrollTop = this._scrollY(); 941 var clientTop = document.documentElement.clientTop || body.clientTop || 0; 942 943 var top = clientRect.top + scrollTop - clientTop; 944 945 return Math.round(top); 946 947}; 948 949WOW.prototype._checkForChanges = function () { 950 951 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; 952 953 var observer = new MutationObserver(this._mutations.bind(this)); 954 955 var config = { 956 childList: true, 957 subtree: true 958 }; 959 window.onload = function() { 960 observer.observe(document.body, config); 961 } 962}; 963 964WOW.prototype._mutations = function (mutations) { 965 966 mutations.forEach(function (mutation) { 967 968 for (var i = 0; i < mutation.addedNodes.length; i++) { 969 this.doSync(mutation.addedNodes[i]); 970 } 971 972 }.bind(this)); 973 974}; 975 976WOW.prototype.doSync = function (node) { 977 if (typeof node.className == "string") { 978 var classes = node.className.split(' '); 979 if (classes.indexOf(this._boxClass) !== -1) { 980 this._prepareBox(node); 981 } 982 } 983}; 984 985window.addEventListener("DOMContentLoaded", function(e) { 986 new WOW().init(); 987}); 988$(document).on('lazybeforeunveil', function(e){ 989 var ajax = $(e.target).data('ajax'); 990 if(ajax){ 991 $(e.target).load(ajax); 992 } 993}); 994try { 995 window.SF = SF || {}; 996} catch (error) { 997 window.SF = {}; 998} 999/*============================= */ 1000 1001SF.Methods = function() { 1002 1003 /** 1004 * extend() - 1005 * @param {*} defaults 1006 * @param {*} options 1007 */ 1008 this.extend = function(defaults, options) { 1009 for(var key in options) 1010 if(options.hasOwnProperty(key)) 1011 if(Object.prototype.toString.call(options[key]) == '[object Object]') 1012 this.extend(defaults[key], options[key]); 1013 else defaults[key] = options[key]; 1014 return defaults; 1015 } 1016 1017 /** 1018 * ÐоиÑк наивÑÑÑего z-index в докÑменÑе 1019 */ 1020 this.topZIndex = function() { 1021 var e = document.querySelectorAll('*'), 1022 z = 1, 1023 style = ''; 1024 for(var k = 0; k < e.length; k++) { 1025 style = getComputedStyle(e[k]); 1026 if(parseInt(style.zIndex) > z) 1027 z = parseInt(style.zIndex); 1028 } 1029 return z; 1030 } 1031 1032 this.topZIndexElement = function(el) { 1033 var z = 1, 1034 e = false, 1035 style = ''; 1036 for(var k = 0; k < el.length; k++) { 1037 style = getComputedStyle(el[k]); 1038 if(parseInt(style.zIndex) > z) { 1039 z = parseInt(style.zIndex); 1040 e = el[k]; 1041 } 1042 } 1043 return e; 1044 } 1045 1046 /** 1047 * 1048 */ 1049 this.includeScript = function(path) { 1050 var s = document.createElement('script'); 1051 s.src = path; 1052 document.querySelector('head').appendChild(s); 1053 } 1054 1055 this.addcss = function(path) { 1056 var l = document.createElement('link'); 1057 l.rel = 'stylesheet'; 1058 l.href = path; 1059 document.querySelector('head').appendChild(l); 1060 return l; 1061 } 1062 1063 /** 1064 * 1065 */ 1066 this.cookies = { 1067 /** 1068 * get() - полÑÑиÑÑ ÐºÑки 1069 */ 1070 get: function(name) { 1071 if(document.cookie.length > 0) { 1072 var start = document.cookie.indexOf(name + '='); 1073 if(start != -1) { 1074 start = start + name.length + 1; 1075 var end = document.cookie.indexOf(';', start); 1076 if(end == -1) end = document.cookie.length; 1077 return encodeURI(document.cookie.substring(start, end)); 1078 } 1079 } 1080 return ''; 1081 }, 1082 /** 1083 * set() - ÑÑÑановиÑÑ ÐºÑки 1084 */ 1085 set: function(name, value, expiredays) { 1086 var exdate = new Date(); 1087 exdate.setDate(exdate.getDate() + expiredays); 1088 document.cookie = name + '=' + decodeURI(value) + 1089 ((expiredays == null) ? '' : '; expires=' + exdate.toUTCString()) + '; path=/'; 1090 }, 1091 /** 1092 * check() - ÐÑовеÑка ÑÑÑановлен ли паÑамеÑÑ ÐºÑки 1093 */ 1094 check: function(name) { 1095 name = this.cookie.get(name); 1096 if(name != null && name != '') return true; 1097 else return false;
1098 } 1099 } 1100 1101 1102 this.bytelength = function(str) { 1103 var count = 0, 1104 ch = 0; 1105 for(var k = 0; k < str.length; k++) { 1106 ch = str.charCodeAt(k); 1107 if(ch <= 127) count++; 1108 else if(ch <= 2047) count += 2; 1109 else if(ch <= 65535) count += 3; 1110 else if(ch <= 2097151) count += 4; 1111 else if(ch <= 67108863) count += 5; 1112 else count += 6; 1113 } 1114 return count; 1115 } 1116 1117 this.bytelengthlimit = function(str, limit) { 1118 var count = 0, 1119 ch = 0, 1120 strlimit = '', 1121 flaglimit = false, 1122 result = []; 1123 for(var k = 0; k < str.length; k++) { 1124 ch = str.charCodeAt(k); 1125 if(count <= limit) { 1126 flaglimit = true; 1127 } 1128 strlimit += str[k]; 1129 if(ch <= 127) count++; 1130 else if(ch <= 2047) count += 2; 1131 else if(ch <= 65535) count += 3; 1132 else if(ch <= 2097151) count += 4; 1133 else if(ch <= 67108863) count += 5; 1134 else count += 6; 1135 1136 if((count > limit && flaglimit) || (flaglimit && k == str.length - 1)) { 1137 //console.log(strlimit) 1138 result.push(strlimit); 1139 strlimit = ''; 1140 count = 0; 1141 flaglimit = false; 1142 } 1143 } 1144 //console.log(result.length) 1145 if(result.length > 0) { 1146 //result.push(strlimit); 1147 return result; 1148 } else { 1149 result.push(strlimit); 1150 return result; 1151 } 1152 } 1153} 1154SF.send = function(event, element) { 1155 if(document.createEvent){ 1156 var e = document.createEvent('Events'); 1157 e.initEvent(event, true, false); 1158 } 1159 else if(document.createEventObject()) { 1160 var e = document.createEventObject(); 1161 } 1162 else return; 1163 1164 if(element.dispatchEvent) 1165 element.dispatchEvent(e); 1166 else if(element.fireEvent) element.fireEvent(event, e); 1167} 1168 1169SF.receive = function(event, el, handler) { 1170 if(window.addEventListener) 1171 el.addEventListener(event, handler, false); 1172 else if(window.attachEvent) 1173 el.attachEvent(event, handler); 1174} 1175 1176/*============================= */ 1177SF.Events = function() { 1178 1179 /** 1180 * ÐеÑод send() - ÐÑпÑавлÑÐµÑ ÑобÑÑие 1181 * @param {*} event 1182 */ 1183 this.send = function(event, element) { 1184 if(document.createEvent){ 1185 var e = document.createEvent('Events'); 1186 e.initEvent(event, true, false); 1187 } 1188 else if(document.createEventObject()) { 1189 var e = document.createEventObject(); 1190 } 1191 else return; 1192 1193 if(element.dispatchEvent) 1194 element.dispatchEvent(e); 1195 else if(element.fireEvent) element.fireEvent(event, e); 1196 } 1197 1198 /** 1199 * ÐеÑод receive() - ÑегиÑÑÑиÑÑÐµÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ 1200 * @param {*} event 1201 * @param {*} handler 1202 */ 1203 this.receive = function(event, el, handler) { 1204 if(window.addEventListener) 1205 el.addEventListener(event, handler, false); 1206 else if(window.attachEvent) 1207 el.attachEvent(event, handler); 1208 } 1209 1210 /** 1211 * hotkey() - ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑки нажаÑÐ¸Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ Ð¸ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑкÑий обÑабоÑÑика 1212 * @param {*} handler - ÑÑнкÑÑÐ¸Ñ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ 1213 * @param {*} далее Ð¼Ð¾Ð¶ÐµÑ ÑледоваÑÑ Ð»Ñбое колиÑеÑÑво кодов ÑоÑеÑÐ°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñ Ð² 1214 * кавÑÑÐºÐ°Ñ ("17") 1215 */ 1216 this.hotkey = function(handler) { 1217 var codes = [].slice.call(arguments, 1), 1218 pressed = {}; 1219 document.addEventListener('keydown', function(e) { 1220 e = e || window.event; 1221 pressed[e.keyCode] = true; 1222 for (var i = 0; i < codes.length; i++) 1223 if (!pressed[codes[i]]) return; 1224 pressed = {}; 1225 handler(); 1226 }); 1227 document.addEventListener('keyup',function(e) { 1228 e = e || window.event; 1229 delete pressed[e.keyCode]; 1230 }); 1231 } 1232 1233 /** 1234 * quickkey() - ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑки нажаÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñи и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии обÑабоÑÑика 1235 * @param {*} handler - ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÐ¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñи 1236 * @param {*} key - клавиÑа поÑле нажаÑÐ¸Ñ ÐºÐ¾ÑоÑой ÑÑабаÑÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑбоÑÑик 1237 */ 1238 this.quickkey = function(handler, key) { 1239 addEventListener('keydown', function(e) { 1240 if(e.keyCode == key) 1241 handler(e); 1242 }); 1243 } 1244 1245 SF.Methods.call(this); 1246} 1247 1248SF.Parameters = function() { 1249 /** 1250 * newparams - генеÑаÑÐ¸Ñ Ð½Ð¾Ð²ÑÑ Ð¿Ð°ÑамеÑÑов 1251 */ 1252 this.newparams = function() { 1253 return this.params; 1254 } 1255 1256 /** 1257 * Ðбновление ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов 1258 * @param {*} el 1259 */ 1260 this.updateparams = function(el) { 1261 var par = el.params, 1262 mod = par.modifier, 1263 data = par.data; 1264 for(var key in mod) { 1265 mod[key] = el.hasAttribute(data[key]) ? mod[key] + ' ' + el.getAttribute(data[key]) : mod[key]; 1266 } 1267 } 1268 1269// ================ CONSTRUCTOR ================ // 1270 this.params = { 1271 ajax: { 1272 events: { 1273 init: 'ajaxinit', 1274 load: 'endcontentload', 1275 }, 1276 method: 'GET', 1277 type: 'html', 1278 timeout: 0, 1279 async: true, 1280 emulateOnload: true, 1281 cache: true 1282 }, 1283 controller: { 1284 1285 }, 1286 search: { 1287 1288 }, 1289 provider: { 1290 1291 }, 1292 blocks: { 1293 special: { 1294 cookies: { 1295 specialfont: 'default', 1296 specialstate: 'off', 1297 specialcolor: 'specialwhite', 1298 specialkegl: '16', 1299 specialinterval: '1.0', 1300 specialkerning: 'normal', 1301 specialimage: 'off', 1302 specialup: 'down', 1303 specialsound: 'off', 1304 }, 1305 events: { 1306 init: 'specialinit', 1307 create: 'specialcreate', 1308 open: 'specialopen', 1309 close: 'specialoff', 1310 up: 'specialup', 1311 soundon: 'specialsoundon', 1312 soundoff: 'specialsoundoff', 1313 defaultsetting: 'specialdefaultsetting', 1314 // СобÑÑÐ¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸ Special 1315 fontsans: 'specialfontsans', 1316 fontserif: 'specialfontserif', 1317 fontmono: 'specialfontmono', 1318 keglmore: 'specialkeglmore', 1319 keglless: 'specialkeglless', 1320 intervalone: 'specialintervalone', 1321 intervalhalf: 'specialintervalhalf', 1322 intervaltwo: 'specialintervaltwo', 1323 imageoff: 'specialimageoff', 1324 imageblack: 'specialimageblack', 1325 imagecolor: 'specialimagecolor', 1326 imagecolor: 'specialimagecolor', 1327 colorwhite: 'specialcolorwhite', 1328 colorblack: 'specialcolorblack', 1329 coloryellow: 'specialcoloryellow', 1330 colorblue: 'specialcolorblue', 1331 colorgreen: 'specialcolorgreen', 1332 kerningnormal: 'specialkerningnormal', 1333 kerningmiddle: 'specialkerningmiddle', 1334 kerningbig: 'specialkerningbig', 1335 }, 1336 data: { 1337 init: 'sf-special', 1338 panel: 'sf-special-panel', 1339 kegl: 'sf-special-kegl', 1340 interval: 'sf-special-interval', 1341 color: 'sf-special-color', 1342 img: 'sf-special-img', 1343 on: 'sf-special-on', 1344 }, 1345 attributes: { 1346 1347 }, 1348 modifier: { 1349 panel: 'special-panel d-flex align-items-start justify-content-center flex-wrap flex-row w-100 bb-1', 1350 font: 'd-flex align-items-center justify-content-center flex-column p-3', 1351 kegl: 'd-flex align-items-center justify-content-center flex-column p-3', 1352 interval: "d-flex align-items-center justify-content-center flex-column p-3", 1353 kerning: 'd-flex align-items-center justify-content-center flex-column p-3', 1354 color: "d-flex align-items-center justify-content-center flex-column p-3", 1355 img: "d-flex align-items-center justify-content-center flex-column p-3", 1356 onoff: "d-flex align-items-center justify-content-center flex-column p-3", 1357 sound: "d-flex align-items-center justify-content-center flex-column p-3", 1358 black: 'sf-special-black', 1359 white: 'sf-special-white', 1360 yellow: 'sf-special-yellow', 1361 blue: 'sf-special-blue', 1362 green: 'sf-special-green', 1363 // ÐÑÑÑ Ð´Ð¾ ÑÑилей 1364 specialwhite: '/simai/asset/simai.framework/sf4.master/plugin/special/css/white.min.css', 1365 specialblack: '/simai/asset/simai.framework/sf4.master/plugin/special/css/black.min.css', 1366 specialyellow: '/simai/asset/simai.framework/sf4.master/plugin/special/css/yellow.min.css', 1367 specialblue: '/simai/asset/simai.framework/sf4.master/plugin/special/css/blue.min.css', 1368 specialgreen: '/simai/asset/simai.framework/sf4.master/plugin/special/css/green.min.css', 1369 specialsoundscript: 'https://webasr.yandex.net/jsapi/v1/webspeechkit.js', 1370 }, 1371 }, 1372 modal: { 1373 load: '<div class="sf-progress"><div class="sf-progress-animation"></div></div>', 1374 events: { 1375 init: 'modalinit', 1376 create: "modalcreate", 1377 open: 'modalopen', 1378 close: 'modalclose', 1379 }, 1380 data: { 1381 init: 'sf-modal', 1382 src: 'sf-src', 1383 modal: 'sf-modal-modifier', 1384 content: 'sf-content-modifier', 1385 close: "sf-close-modifier", 1386 overlay: 'sf-overlay-modifier', 1387 blur: 'sf-blur', 1388 iframe: 'sf-iframe', 1389 }, 1390 attributes: { 1391 overlay: 'sf-modal-overlay', 1392 load: 'sf-modal-loadanimation', 1393 modal: 'sf-modal-area', 1394 content: 'sf-modal-content', 1395 close: 'sf-modal-close', 1396 number: 'sf-modal-number' 1397 }, 1398 modifier: { 1399 src: '', 1400 service: 'sf-service-bottom-area', 1401 container: 'sf-modal-container', 1402 overlay: 'sf-modal-overlay', 1403 load: 'sf-modal-load', 1404 modal: 'sf-modal-area', 1405 content: 'sf-modal-content sf-scroll', 1406 close: 'sf-close', 1407 blur: 'blur', 1408 page: 'sf-pagewrap-area', 1409 }, 1410 }, 1411 ajaxload: { 1412 load: '<div class="sf-progress"><div class="sf-progress-animation"></div></div>', 1413 events: { 1414 init: 'ajaxloadinit', 1415 cancel: 'ajaxloadcanceltrack', 1416 create: 'ajaxloadcreate', 1417 }, 1418 data: { 1419 init: 'sf-ajaxload', 1420 src: 'sf-src', 1421 cancel: 'sf-canceltrack', 1422 loaded: 'sf-ajaxloaded', 1423 }, 1424 attributes: { 1425 1426 }, 1427 modifier: { 1428 src: '', 1429 }, 1430 } 1431 }, 1432 } 1433// ================ END CONSTRUCTOR ================ // 1434} 1435SF.Controller = function() { 1436 // Constructor 1437 1438 this.stack = stack; 1439 var _this = this; 1440 1441 // ÐодклÑÑение модÑлей 1442 SF.Events.call(this); 1443 SF.Search.call(this); 1444 SF.Blocks.call(this); 1445 SF.Provider.call(this); 1446 //SF.Property.call(this); 1447 1448 if(this.el) { 1449 this.send('blocksstart', this.el); 1450 } else { 1451 1452 if(this.stack.ev('specialinit')) { 1453 1454 this.receive('specialinit', window, function(e) { 1455 new SF.Special(e.target, e.target.params); 1456 }); 1457 this.stack.events.push('specialinit'); 1458 } 1459 1460 if(this.stack.ev('searchend')) { 1461 this.receive('searchend', window, function(e) { 1462 _this.send('blocksstart', e.target); 1463 }); 1464 this.send('searchstart', window); 1465 this.stack.events.push('searchend'); 1466 1467 } 1468 } 1469 1470 // end Constructor 1471} 1472/** 1473 * Search модÑÐ»Ñ Ð¿Ð¾Ð¸Ñка иниÑиализаÑий Ñ.е. поиÑка ÑлеменÑов вÑзÑваÑÑÐ¸Ñ Ð¾Ð¿ÑеделеннÑе блоки/компоненÑÑ 1474 */ 1475SF.Search = function() { 1476 /** 1477 * Search uninitialized Modal Window 1478 * ÐоиÑк неиниÑиализиÑованнÑÑ Ð¼Ð¾Ð´Ð°Ð»ÑнÑÑ Ð¾ÐºÐ¾Ð½ 1479 */ 1480 this.search = function() { 1481 var el = document.body.querySelectorAll('*'); // ÐоиÑк вÑÐµÑ ÑлеменÑов в DOM-деÑеве 1482 for(var j = 0; j < el.length; j++) { // ÐÐ±Ñ Ð¾Ð´ найденÑÑ ÑлеменÑов 1483 var par = new SF.Parameters(); 1484 var params = par.newparams(); // ÐовÑе паÑамеÑÑÑ 1485 for(var key in params.blocks) { // ÐÑовеÑка 1486 var init = el[j], 1487 block = params.blocks[key]; 1488 if(init.hasAttribute(block.data.init)) { // ÐÑовеÑÑем еÑÑÑ Ð»Ð¸ Ñ ÑлеменÑа иниÑиализаÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° 1489 var i = 0; 1490 for(var k = 0; k < this.stack.el.length; k++) // ÐÑовеÑÑем бÑл ли иниÑиализиÑованн ÑекÑÑий Ñлемен Ñанее 1491 if(this.stack.el[k] == init) i++; 1492 if(i == 0) { 1493 init.blocks = key; // ÐапиÑÑваем наименование блока 1494 init.params = block; // ÐÑиÑваиваем иниÑиализаÑоÑÑ ÑпиÑок ÑÑандÑаÑнÑÑ Ð¿Ð°ÑамеÑÑов 1495 par.updateparams(init); 1496 this.send('searchend', init); // ÐÑпÑавка Ñигнала (ÑобÑÑиÑ) на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ 1497 } 1498 } 1499 } 1500 } 1501 } 1502 1503 this.searchModal = function(element) { 1504 var el = element.querySelectorAll('[sf-modal]'); // ÐоиÑк вÑÐµÑ ÑлеменÑов в DOM-деÑеве 1505 for(var j = 0; j < el.length; j++) { // ÐÐ±Ñ Ð¾Ð´ найденÑÑ ÑлеменÑов 1506 var par = new SF.Parameters(); 1507 var params = par.newparams(); // ÐовÑе паÑамеÑÑÑ 1508 for(var key in params.blocks) { // ÐÑовеÑка 1509 var init = el[j], 1510 block = params.blocks[key]; 1511 if(init.hasAttribute(block.data.init)) { // ÐÑовеÑÑем еÑÑÑ Ð»Ð¸ Ñ ÑлеменÑа иниÑиализаÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° 1512 var i = 0; 1513 for(var k = 0; k < this.stack.el.length; k++) // ÐÑовеÑÑем бÑл ли иниÑиализиÑованн ÑекÑÑий Ñлемен Ñанее 1514 if(this.stack.el[k] == init) i++; 1515
1515 if(i == 0) { 1516 init.blocks = key; // ÐапиÑÑваем наименование блока 1517 init.params = block; // ÐÑиÑваиваем иниÑиализаÑоÑÑ ÑпиÑок ÑÑандÑаÑнÑÑ Ð¿Ð°ÑамеÑÑов 1518 par.updateparams(init); 1519 this.send('searchend', init); // ÐÑпÑавка Ñигнала (ÑобÑÑиÑ) на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ 1520 } 1521 } 1522 } 1523 } 1524 } 1525 1526 1527 this.searchdata = function(content) { 1528 var el = content.querySelectorAll('*'); // ÐоиÑк вÑÐµÑ ÑлеменÑов в DOM-деÑеве 1529 for(var j = 0; j < el.length; j++) { // ÐÐ±Ñ Ð¾Ð´ найденÑÑ ÑлеменÑов 1530 var par = new SF.Parameters(); 1531 var params = par.newparams(); // ÐовÑе паÑамеÑÑÑ 1532 for(var key in params.blocks) { // ÐÑовеÑка 1533 var init = el[j], 1534 block = params.blocks[key]; 1535 if(init.hasAttribute(block.data.init)) { // ÐÑовеÑÑем еÑÑÑ Ð»Ð¸ Ñ ÑлеменÑа иниÑиализаÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° 1536 var i = 0; 1537 for(var k = 0; k < this.stack.el.length; k++) // ÐÑовеÑÑем бÑл ли иниÑиализиÑованн ÑекÑÑий Ñлемен Ñанее 1538 if(this.stack.el[k] == init) i++; 1539 if(i == 0) { 1540 init.blocks = key; // ÐапиÑÑваем наименование блока 1541 init.params = block; // ÐÑиÑваиваем иниÑиализаÑоÑÑ ÑпиÑок ÑÑандÑаÑнÑÑ Ð¿Ð°ÑамеÑÑов 1542 par.updateparams(init); 1543 this.send('searchend', init); // ÐÑпÑавка Ñигнала (ÑобÑÑиÑ) на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ 1544 } 1545 } 1546 } 1547 } 1548 } 1549 1550 // ================ CONSTRUCTOR ================ // 1551 var _this = this; 1552 if(this.stack.ev('searchstart')) { 1553 this.receive('searchstart', window, function(e) { 1554 _this.search(); 1555 }); 1556 this.receive('searchstartmodal', window, function(e) { 1557 _this.searchModal(document); 1558 }); 1559 this.stack.events.push('searchstart'); 1560 } 1561 // ================ END CONSTRUCTOR ================ // 1562} 1563/** 1564 * Blocks - модÑÐ»Ñ ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑзанноÑÑей 1565 */ 1566SF.Blocks = function() { 1567 var _this = this; 1568 1569 if(this.stack.ev('providerend')) { 1570 this.receive('providerend', window, function(e) { 1571 _this.send(e.target.event, e.target); 1572 }); 1573 this.stack.events.push('providerend'); 1574 } 1575 1576 if(this.stack.ev('blocksstart')) { 1577 this.receive('blocksstart', window, function(e) { 1578 _this.send('providerstart', e.target); 1579 }); 1580 this.stack.events.push('blocksstart') 1581 } 1582 1583 1584} 1585/** 1586 * ProviderDom - модÑÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð², дÑÑгими Ñловами поÑÑавÑик блоков/компоненÑов 1587 */ 1588SF.Provider = function() { 1589 1590 this.special = function(e) { 1591 1592 function selectcolor() { 1593 switch(_this.cookies.get('specialcolor')) { 1594 case 'specialwhite': 1595 return BX.message("SF_SPECIAL__SPECIAL_WHITE"); 1596 case 'specialblack': 1597 return BX.message("SF_SPECIAL__SPECIAL_BLACK"); 1598 case 'specialyellow': 1599 return BX.message("SF_SPECIAL__SPECIAL_YELLOW"); 1600 case 'specialblue': 1601 return BX.message("SF_SPECIAL__SPECIAL_BLUE"); 1602 case 'specialgreen': 1603 return BX.message("SF_SPECIAL__SPECIAL_GREEN"); 1604 } 1605 return BX.message("SF_SPECIAL__SPECIAL_WHITE"); 1606 } 1607 1608 function selectkegl() { 1609 var v = _this.cookies.get('specialkegl'); 1610 if(v != '') return v + BX.message("SF_SPECIAL__SPECIAL_KEGL"); 1611 else return BX.message("SF_SPECIAL__KEGL_16"); 1612 } 1613 1614 function selectkerning() { 1615 switch(_this.cookies.get('specialkerning')) { 1616 case 'normal': 1617 return BX.message("SF_SPECIAL__KERNING_NORMAL"); 1618 case 'middle': 1619 return BX.message("SF_SPECIAL__KERNING_MIDDLE"); 1620 case 'big': 1621 return BX.message("SF_SPECIAL__KERNING_BIG"); 1622 } 1623 return BX.message("SF_SPECIAL__KERNING_NORMAL"); 1624 } 1625 1626 function selectimg() { 1627 switch(_this.cookies.get('specialimage')) { 1628 case 'off': 1629 return BX.message("SF_SPECIAL__IMG_OFF"); 1630 case 'onblack': 1631 return BX.message("SF_SPECIAL__IMG_ON_BLACK"); 1632 case 'oncolor': 1633 return BX.message("SF_SPECIAL__IMG_ON_COLOR"); 1634 } 1635 return BX.message("SF_SPECIAL__IMG_ON_COLOR"); 1636 } 1637 1638 function changeStateAlt(state) 1639 { 1640 1641 if(state == 'off') 1642 { 1643 document.querySelectorAll('.sf-special-hidden').forEach((elem) => { 1644 elem.classList.remove('sf-special-hidden'); 1645 elem.classList.add('sf-special-show') 1646 }); 1647 } else if(state == 'onblack' || state == 'oncolor') { 1648 document.querySelectorAll('.sf-special-show').forEach((elem) => { 1649 elem.classList.add('sf-special-hidden'); 1650 elem.classList.remove('sf-special-show'); 1651 }); 1652 } 1653 } 1654 1655 function selectinterval() { 1656 switch(_this.cookies.get('specialinterval')) { 1657 case '1.0': 1658 return BX.message("SF_SPECIAL__INTERVAL_1_0"); 1659 case '1.5': 1660 return BX.message("SF_SPECIAL__INTERVAL_1_5"); 1661 case '2.0': 1662 return BX.message("SF_SPECIAL__INTERVAL_2_0"); 1663 } 1664 return BX.message("SF_SPECIAL__INTERVAL_1_0"); 1665 } 1666 1667 function addbtn(btn, param) { 1668 btn.className = param.class; 1669 btn.style.backgroundColor = param.background; 1670 btn.style.borderColor = 'black'; 1671 btn.style.color = param.border; 1672 btn.style.fontSize = param.font; 1673 btn.innerHTML = param.text; 1674 btn.title = param.title; 1675 } 1676 1677 function selectfont() { 1678 //console.log(_this.cookies.get('specialfont')); 1679 switch(_this.cookies.get('specialfont')) { 1680 case 'default': 1681 return BX.message("SF_SPECIAL__FONT_DEFAULT"); 1682 case 'sans': 1683 return BX.message("SF_SPECIAL__FONT_SANS"); 1684 case 'serif': 1685 return BX.message("SF_SPECIAL__FONT_SERIF"); 1686 case 'mono': 1687 return BX.message("SF_SPECIAL__FONT_MONO"); 1688 } 1689 return BX.message("SF_SPECIAL__FONT_DEFAULT"); 1690 } 1691 1692 function selectsound() { 1693 switch(_this.cookies.get('specialsound')) { 1694 case 'on': 1695 return BX.message("SF_SPECIAL__SOUND_ON"); 1696 case 'off': 1697 return BX.message("SF_SPECIAL__SOUND_OFF"); 1698 default: 1699 return BX.message("SF_SPECIAL__SOUND_OFF"); 1700 } 1701 } 1702 1703 var _this = this, 1704 par = e.target.params, 1705 el = e.target; 1706 1707 var panel = { 1708 font: { 1709 name: {}, 1710 content: { 1711 btnsans: {}, // Arial 1712 btnserif: {}, // Times New Roman 1713 btnmono: {}, // Courier New 1714 }, 1715 status: {}, 1716 }, 1717 kegl: { 1718 name: {}, 1719 content: { 1720 btnmore: {}, 1721 btnless: {}, 1722 }, 1723 status: {}, 1724 }, 1725 interval: { 1726 name: {}, 1727 content: { 1728 btnone: {}, 1729 btnhalf: {}, 1730 btntwo: {}, 1731 }, 1732 status: {}, 1733 }, 1734 kerning: { 1735 name: {}, 1736 content: { 1737 btnnormal: {}, 1738 btnmiddle: {}, 1739 btnbig: {}, 1740 }, 1741 status: {}, 1742 }, 1743 color: { 1744 name: {}, 1745 content: { 1746 btnwhite: {}, 1747 btnblack: {}, 1748 btnyellow: {}, 1749 btnblue: {}, 1750 btngreen: {}, 1751 }, 1752 status: {}, 1753 }, 1754 img: { 1755 name: {}, 1756 content: { 1757 btnoff: {}, 1758 btnbw: {}, 1759 btncolor: {}, 1760 }, 1761 status: {}, 1762 }, 1763 sound: { 1764 name: {}, 1765 content: { 1766 btnon:{}, 1767 btnoff: {}, 1768 }, 1769 status: {}, 1770 play: {}, 1771 }, 1772 onoff: { 1773 name: {}, 1774 content: { 1775 btnup: {}, 1776 btndefault: {}, 1777 btnonoff: {}, 1778 }, 1779 status: {}, 1780 }, 1781 }; 1782 1783 panel = document.createElement('nav'); 1784 1785 panel.className = par.modifier.panel; 1786 panel.setAttribute('sf-special-panel', ''); 1787 panel.style.backgroundColor = "#FFFFFF"; 1788 panel.style.position = 'relative'; 1789 panel.style.transition = 'margin-top 1s ease'; 1790 1791 panel.font = document.createElement('div'); 1792 panel.font.className = par.modifier.font; 1793 1794 panel.font.name = document.createElement('div'); 1795 panel.font.content = document.createElement('div'); 1796 panel.font.status = document.createElement('div'); 1797 1798 panel.font.name.classList.add('font-text', 'mb-2'); 1799 panel.font.name.style.color = 'rgba(0,0,0, 0.87)'; 1800 panel.font.name.innerHTML = BX.message("SF_SPECIAL__FONT"); 1801 1802 panel.font.appendChild(panel.font.name); 1803 1804 panel.font.content.classList.add('font-content', 'btn-group'); 1805 panel.font.content.btnsans = document.createElement('button'); 1806 panel.font.content.btnserif = document.createElement('button'); 1807 panel.font.content.btnmono = document.createElement('button'); 1808 1809 addbtn( 1810 panel.font.content.btnsans, 1811 { 1812 class: 'btn btn-outline px-3', 1813 background: 'white', 1814 border: 'black', 1815 font: '14px', 1816 text: 'Arial', 1817 title: BX.message("SF_SPECIAL__BTN_SANS_ARIAL"), 1818 } 1819 ); 1820 1821 panel.font.content.btnsans.addEventListener('click', function(e) { 1822 _this.send(par.events.fontsans, panel.font.content.btnsans); 1823 panel.font.status.innerHTML = BX.message("SF_SPECIAL__BTN_SANS"); 1824 }); 1825 1826 addbtn( 1827 panel.font.content.btnserif, 1828 { 1829 class: 'btn btn-outline px-3', 1830 background: 'white', 1831 border: 'black', 1832 font: '14px', 1833 text: 'Times', 1834 title: BX.message("SF_SPECIAL__BTN_SERIF_TIMES"), 1835 } 1836 ); 1837 1838 panel.font.content.btnserif.addEventListener('click', function(e) { 1839 _this.send(par.events.fontserif, panel.font.content.btnserif); 1840 panel.font.status.innerHTML = BX.message("SF_SPECIAL__BTN_SERIF"); 1841 }); 1842 1843 addbtn( 1844 panel.font.content.btnmono, 1845 { 1846 class: 'btn btn-outline px-3', 1847 background: 'white', 1848 border: 'black', 1849 font: '14px', 1850 text: 'Courier', 1851 title: BX.message("SF_SPECIAL__BTN_MONO_COURIER"), 1852 } 1853 ); 1854 1855 panel.font.content.btnmono.addEventListener('click', function(e) { 1856 _this.send(par.events.fontmono, panel.font.content.btnmono); 1857 panel.font.status.innerHTML = BX.message("SF_SPECIAL__BTN_MONO"); 1858 }); 1859 1860 1861 panel.font.status.classList.add('status-text', 'mt-2'); 1862 panel.font.status.style.color = 'rgba(0,0,0, 0.87)'; 1863 panel.font.status.innerHTML = selectfont(); 1864 1865 panel.font.content.appendChild(panel.font.content.btnsans); 1866 panel.font.content.appendChild(panel.font.content.btnserif); 1867 panel.font.content.appendChild(panel.font.content.btnmono); 1868 1869 panel.font.appendChild(panel.font.content); 1870 panel.font.appendChild(panel.font.status); 1871 panel.appendChild(panel.font); 1872 1873 // #endregion Font 1874 1875 panel.kegl = document.createElement('div'); 1876 panel.kegl.className = par.modifier.kegl; 1877 1878 panel.kegl.name = document.createElement('div'); 1879 panel.kegl.content = document.createElement('div'); 1880 panel.kegl.status = document.createElement('div'); 1881 1882 panel.kegl.name.classList.add('kegl-text', 'mb-2'); 1883 panel.kegl.name.style.color = 'rgba(0,0,0,0.87)'; 1884 panel.kegl.name.innerHTML = BX.message("SF_SPECIAL__KEGL"); 1885 1886 panel.kegl.appendChild(panel.kegl.name); 1887 1888 panel.kegl.content.classList.add('kegl-content', 'btn-group'); 1889 1890 panel.kegl.content.btnmore = document.createElement('button'); 1891 panel.kegl.content.btnless = document.createElement('button'); 1892 1893 addbtn( 1894 panel.kegl.content.btnmore, 1895 { 1896 class: 'btn btn-outline px-3', 1897 background: 'white', 1898 border: 'black', 1899 font: '14px', 1900 text: 'A-', 1901 title: BX.message("SF_SPECIAL__BTN_MORE"), 1902 } 1903 ); 1904 panel.kegl.content.btnmore.addEventListener('click', function(e) { 1905 _this.send(par.events.keglmore, panel.kegl.content.btnmore); 1906 panel.kegl.status.innerHTML = selectkegl(); 1907 }); 1908 addbtn( 1909 panel.kegl.content.btnless, 1910 { 1911 class: 'btn btn-outline px-3', 1912 background: 'white', 1913 border: 'black', 1914 font: '14px', 1915 text: 'A+', 1916 title: BX.message("SF_SPECIAL__BTN_LESS"), 1917 } 1918 ); 1919 panel.kegl.content.btnless.addEventListener('click', function(e) { 1920 _this.send(par.events.keglless, panel.kegl.content.btnless); 1921 panel.kegl.status.innerHTML = selectkegl(); 1922 }); 1923 1924 panel.kegl.status.classList.add('status-text', 'mt-2'); 1925 panel.kegl.status.style.color = 'rgba(0,0,0, 0.87)'; 1926 panel.kegl.status.innerHTML = selectkegl(); 1927 1928 1929 panel.kegl.content.appendChild(panel.kegl.content.btnmore); 1930 panel.kegl.content.appendChild(panel.kegl.content.btnless) 1931 panel.kegl.appendChild(panel.kegl.content); 1932 panel.kegl.appendChild(panel.kegl.status); 1933 panel.appendChild(panel.kegl); 1934 1935 // #region Kerning =========================== 1936 panel.kerning = document.createElement('div'); 1937 panel.kerning.className = par.modifier.kerning; 1938 panel.kerning.name = document.createElement('div'); 1939 panel.kerning.content = document.createElement('div'); 1940 panel.kerning.status = document.createElement('div'); 1941 1942 panel.kerning.name.classList.add('name-text', 'mb-2'); 1943 panel.kerning.name.style.color = 'rgba(0,0,0,0.87)'; 1944 panel.kerning.name.innerHTML = BX.message("SF_SPECIAL__KERNING"); 1945 1946 panel.kerning.appendChild(panel.kerning.name); 1947 1948 panel.kerning.content.classList.add('kerning-content', 'btn-group'); 1949 1950 panel.kerning.status.classList.add('status-text', 'mt-2'); 1951 panel.kerning.status.style.color = 'rgba(0,0,0,0.87)'; 1952 panel.kerning.status.
1952innerHTML = selectkerning(); 1953 1954 panel.kerning.content.btnnormal = document.createElement('button'); 1955 panel.kerning.content.btnmiddle = document.createElement('button'); 1956 panel.kerning.content.btnbig = document.createElement('button'); 1957 1958 addbtn( 1959 panel.kerning.content.btnnormal, 1960 { 1961 class: 'btn btn-outline px-3', 1962 background: 'white', 1963 border: 'black', 1964 font: '14px', 1965 text: '1.0', 1966 title: BX.message("SF_SPECIAL__BTN_NORMAL") 1967 } 1968 ); 1969 1970 panel.kerning.content.btnnormal.addEventListener('click', function(e) { 1971 _this.send(par.events.kerningnormal, panel.kerning.content.btnnormal); 1972 panel.kerning.status.innerHTML = selectkerning(); 1973 }); 1974 1975 addbtn( 1976 panel.kerning.content.btnmiddle, 1977 { 1978 class: 'btn btn-outline px-3', 1979 background: 'white', 1980 border: 'black', 1981 font: '14px', 1982 text: '1.5', 1983 title: BX.message("SF_SPECIAL__BTN_MIDDLE"), 1984 } 1985 ); 1986 1987 panel.kerning.content.btnmiddle.addEventListener('click', function(e) { 1988 _this.send(par.events.kerningmiddle, panel.kerning.content.btnmiddle); 1989 panel.kerning.status.innerHTML = selectkerning(); 1990 }); 1991 1992 addbtn( 1993 panel.kerning.content.btnbig, 1994 { 1995 class: 'btn btn-outline px-3', 1996 background: 'white', 1997 border: 'black', 1998 font: '14px', 1999 text: '2.0', 2000 title: BX.message("SF_SPECIAL__BTN_BIG") 2001 } 2002 ); 2003 2004 panel.kerning.content.btnbig.addEventListener('click', function(e) { 2005 _this.send(par.events.kerningbig, panel.kerning.content.btnbig); 2006 panel.kerning.status.innerHTML = selectkerning(); 2007 }); 2008 2009 panel.kerning.content.appendChild(panel.kerning.content.btnnormal); 2010 panel.kerning.content.appendChild(panel.kerning.content.btnmiddle); 2011 panel.kerning.content.appendChild(panel.kerning.content.btnbig); 2012 panel.kerning.appendChild(panel.kerning.content); 2013 panel.kerning.appendChild(panel.kerning.status); 2014 panel.appendChild(panel.kerning); 2015 // #endregion =========================== 2016 2017 panel.interval = document.createElement('div'); 2018 panel.interval.className = par.modifier.interval; 2019 panel.interval.name = document.createElement('div'); 2020 panel.interval.name.classList.add('kegl-text', 'mb-2'); 2021 panel.interval.name.style.color = 'rgba(0,0,0,0.87)'; 2022 panel.interval.name.innerHTML = BX.message("SF_SPECIAL__INTERVAL");; 2023 2024 panel.interval.appendChild(panel.interval.name); 2025 2026 panel.interval.content = document.createElement('div'); 2027 panel.interval.status = document.createElement('div'); 2028 panel.interval.content.classList.add('interval-content', 'btn-group'); 2029 2030 panel.interval.content.btnone = document.createElement('button'); 2031 panel.interval.content.btnhalf = document.createElement('button'); 2032 panel.interval.content.btntwo = document.createElement('button'); 2033 2034 addbtn( 2035 panel.interval.content.btnone, 2036 { 2037 class: 'btn btn-outline px-3', 2038 background: 'white', 2039 border: 'black', 2040 font: '14px', 2041 text: '1.0', 2042 title: BX.message("SF_SPECIAL__BTN_ONE"), 2043 } 2044 ); 2045 2046 panel.interval.content.btnone.addEventListener('click', function(e) { 2047 _this.send(par.events.intervalone, panel.interval.content.btnone); 2048 panel.interval.status.innerHTML = selectinterval(); 2049 }); 2050 2051 addbtn( 2052 panel.interval.content.btnhalf, 2053 { 2054 class: 'btn btn-outline px-3', 2055 background: 'white', 2056 border: 'black', 2057 font: '14px', 2058 text: '1.5', 2059 title: BX.message("SF_SPECIAL__BTN_HALF"), 2060 } 2061 ); 2062 2063 panel.interval.content.btnhalf.addEventListener('click', function(e) { 2064 _this.send(par.events.intervalhalf, panel.interval.content.btnhalf); 2065 panel.interval.status.innerHTML = selectinterval(); 2066 }); 2067 2068 addbtn( 2069 panel.interval.content.btntwo, 2070 { 2071 class: 'btn btn-outline px-3', 2072 background: 'white', 2073 border: 'black', 2074 font: '14px', 2075 text: '2.0', 2076 title: BX.message("SF_SPECIAL__BTN_TWO"), 2077 } 2078 ); 2079 2080 panel.interval.content.btntwo.addEventListener('click', function(e) { 2081 _this.send(par.events.intervaltwo, panel.interval.content.btntwo); 2082 panel.interval.status.innerHTML = selectinterval(); 2083 }); 2084 2085 panel.interval.status.classList.add('status-text', 'mt-2'); 2086 panel.interval.status.style.color = 'rgba(0,0,0, 0.87)'; 2087 panel.interval.status.innerHTML = selectinterval(); 2088 2089 panel.interval.content.appendChild(panel.interval.content.btnone); 2090 panel.interval.content.appendChild(panel.interval.content.btnhalf); 2091 panel.interval.content.appendChild(panel.interval.content.btntwo); 2092 panel.interval.appendChild(panel.interval.content); 2093 panel.interval.appendChild(panel.interval.status); 2094 panel.appendChild(panel.interval); 2095 2096 // ================================= 2097 2098 panel.color = document.createElement('div'); 2099 2100 panel.color.className = par.modifier.color; 2101 2102 panel.color.name = document.createElement('div'); 2103 panel.color.name.classList.add('color-text', 'mb-2'); 2104 panel.color.name.style.color = 'rgba(0,0,0,0.87)'; 2105 panel.color.name.innerHTML = BX.message("SF_SPECIAL__COLOR"); 2106 2107 panel.color.appendChild(panel.color.name); 2108 2109 panel.color.content = document.createElement('div'); 2110 panel.color.status = document.createElement('div'); 2111 2112 panel.color.content.classList.add('color-content', 'btn-group'); 2113 2114 2115 panel.color.status.classList.add('status-text', 'mt-2'); 2116 panel.color.status.style.color = 'rgba(0,0,0, 0.87)'; 2117 2118 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2119 2120 // #region Ðнопки ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑвеÑовой ÑÑ ÐµÐ¼Ð¾Ð¹ 2121 2122 panel.color.content.btnwhite = document.createElement('button'); 2123 panel.color.content.btnblack = document.createElement('button'); 2124 panel.color.content.btnyellow = document.createElement('button'); 2125 panel.color.content.btnblue = document.createElement('button'); 2126 panel.color.content.btngreen = document.createElement('button'); 2127 2128 addbtn( 2129 panel.color.content.btnwhite, 2130 { 2131 class: 'btn btn-outline px-2', 2132 background: 'white', 2133 border: 'black', 2134 font: '14px', 2135 text: 'C', 2136 title: BX.message("SF_SPECIAL__BTN_WHITE"), 2137 } 2138 ); 2139 2140 panel.color.content.btnwhite.addEventListener('click', function(e) { 2141 if(_this.cookies.get('specialcolor') != par.events.colorwhite) { 2142 _this.send(par.events.colorwhite, e.target); 2143 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2144 } 2145 }); 2146 2147 addbtn( 2148 panel.color.content.btnblack, 2149 { 2150 class: 'btn btn-outline px-2', 2151 background: 'black', 2152 border: 'white', 2153 font: '14px', 2154 text: 'C', 2155 title: BX.message("SF_SPECIAL__BTN_BLACK"), 2156 } 2157 ); 2158 2159 panel.color.content.btnblack.addEventListener('click', function(e) { 2160 if(_this.cookies.get('specialcolor') != par.events.colorblack) { 2161 _this.send(par.events.colorblack, e.target); 2162 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2163 } 2164 }); 2165 2166 addbtn( 2167 panel.color.content.btnyellow, 2168 { 2169 class: 'btn btn-outline px-2', 2170 background: '#FF0', 2171 border: 'black', 2172 font: '14px', 2173 text: 'C', 2174 title: BX.message("SF_SPECIAL__BTN_YELLOW"), 2175 } 2176 ); 2177 2178 panel.color.content.btnyellow.addEventListener('click', function(e) { 2179 if(_this.cookies.get('specialcolor') != par.events.coloryellow) { 2180 _this.send(par.events.coloryellow, e.target); 2181 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2182 } 2183 }); 2184 2185 addbtn( 2186 panel.color.content.btnblue, 2187 { 2188 class: 'btn btn-outline px-2', 2189 background: '#9fd7ff', 2190 border: 'black', 2191 font: '14px', 2192 text: 'C', 2193 title: BX.message("SF_SPECIAL__BTN_BLUE"), 2194 } 2195 ); 2196 panel.color.content.btnblue.addEventListener('click', function(e) { 2197 if(_this.cookies.get('specialcolor') != par.events.colorblue) { 2198 _this.send(par.events.colorblue, e.target); 2199 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2200 } 2201 }); 2202 addbtn( 2203 panel.color.content.btngreen, 2204 { 2205 class: 'btn btn-outline px-2', 2206 background: 'black', 2207 border: '#a9dd38', 2208 font: '14px', 2209 text: 'C', 2210 title: BX.message("SF_SPECIAL__BTN_GREEN"), 2211 } 2212 ); 2213 2214 panel.color.content.btngreen.addEventListener('click', function(e) { 2215 if(_this.cookies.get('specialcolor') != par.events.colorgreen) { 2216 _this.send(par.events.colorgreen, e.target); 2217 panel.color.status.innerHTML = selectcolor() + BX.message("SF_SPECIAL__SCHEMA"); 2218 } 2219 }); 2220 2221 panel.color.content.appendChild(panel.color.content.btnwhite); 2222 panel.color.content.appendChild(panel.color.content.btnblack); 2223 panel.color.content.appendChild(panel.color.content.btnyellow); 2224 panel.color.content.appendChild(panel.color.content.btnblue); 2225 panel.color.content.appendChild(panel.color.content.btngreen); 2226 2227 // #endregion 2228 2229 2230 panel.color.appendChild(panel.color.content); 2231 panel.color.appendChild(panel.color.status); 2232 panel.appendChild(panel.color); 2233 2234 // #region Image ================================= 2235 panel.img = document.createElement('div'); 2236 2237 panel.img.className = par.modifier.img; 2238 2239 panel.img.name = document.createElement('div'); 2240 panel.img.name.classList.add('color-text', 'mb-2'); 2241 panel.img.name.style.color = 'rgba(0,0,0,0.87)'; 2242 panel.img.name.innerHTML = BX.message("SF_SPECIAL__IMG"); 2243 2244 panel.img.appendChild(panel.img.name); 2245 2246 panel.img.content = document.createElement('div'); 2247 2248 panel.img.status = document.createElement('div'); 2249 panel.img.status.classList.add('status-text', 'mt-2'); 2250 panel.img.status.style.color = 'rgba(0,0,0,0.87)'; 2251 2252 panel.img.status.innerHTML = selectimg(); 2253 2254 2255 panel.img.content.classList.add('img-content', 'btn-group'); 2256 2257 panel.img.content.btnoff = document.createElement('button'); 2258 panel.img.content.btnbw = document.createElement('button'); 2259 panel.img.content.btncolor = document.createElement('button'); 2260 2261 addbtn( 2262 panel.img.content.btnoff, 2263 { 2264 class: 'btn btn-outline px-3', 2265 background: 'white', 2266 border: 'black', 2267 font: '14px', 2268 text: BX.message("SF_SPECIAL__BTN_OFF_TEXT"), 2269 title: BX.message("SF_SPECIAL__BTN_OFF"), 2270 } 2271 ); 2272 panel.img.content.btnoff.addEventListener('click', function(e) { 2273 _this.send(par.events.imageoff, panel.img.content.btnoff); 2274 panel.img.status.innerHTML = selectimg(); 2275 changeStateAlt('off'); 2276 }); 2277 addbtn( 2278 panel.img.content.btnbw, 2279 { 2280 class: 'btn btn-outline px-3', 2281 background: 'white', 2282 border: 'black', 2283 font: '14px', 2284 text: BX.message("SF_SPECIAL__BTN_BW_TEXT"), 2285 title: BX.message("SF_SPECIAL__IMG_BTN_BW"), 2286 } 2287 ); 2288 panel.img.content.btnbw.addEventListener('click', function(e) { 2289 _this.send(par.events.imageblack, panel.img.content.btnbw); 2290 panel.img.status.innerHTML = selectimg(); 2291 changeStateAlt('onblack'); 2292 }); 2293 addbtn( 2294 panel.img.content.btncolor, 2295 { 2296 class: 'btn btn-outline px-3', 2297 background: 'white', 2298 border: 'black', 2299 font: '14px', 2300 text: BX.message("SF_SPECIAL__IMG_BTN_COLOR_TEXT"), 2301 title: BX.message("SF_SPECIAL__IMG_BTN_COLOR"), 2302 } 2303 ); 2304 panel.img.content.btncolor.addEventListener('click', function(e) { 2305 _this.send(par.events.imagecolor, panel.img.content.btncolor); 2306 panel.img.status.innerHTML = selectimg(); 2307 changeStateAlt('oncolor'); 2308 }); 2309 panel.img.content.appendChild(panel.img.content.btnoff); 2310 panel.img.content.appendChild(panel.img.content.btnbw); 2311 panel.img.content.appendChild(panel.img.content.btncolor); 2312 2313 2314 panel.img.appendChild(panel.img.content); 2315 panel.img.appendChild(panel.img.status); 2316 panel.appendChild(panel.img); 2317 2318 // ================================= 2319 2320 /* 2321 sound: { 2322 name: {}, 2323 content: { 2324 btnon:{}, 2325 btnoff: {}, 2326 }, 2327 status: {}, 2328 }, 2329 */ 2330 /*if(_this.getproperty('special_speech') == 'Y') { 2331 2332 panel.sound = document.createElement('div'); 2333 panel.sound.className = par.modifier.sound; 2334 2335 // ========== name 2336 panel.sound.name = document.createElement('div'); 2337 panel.sound.name.classList.add('sound-text', 'mb-2') 2338 panel.sound.name.style.color = 'rgba(0,0,0,0.87)'; 2339 panel.sound.name.innerHTML = 'ÐвÑк'; 2340 2341 panel.sound.appendChild(panel.sound.name); 2342 // =========== 2343 panel.sound.content = document.createElement('div'); 2344 panel.sound.content.classList.add('sound-content', 'btn-group'); 2345 panel.sound.content.btnon = document.createElement('button'); 2346 panel.sound.content.btnoff = document.createElement('button'); 2347 2348 addbtn( 2349 panel.sound.content.btnon, 2350 { 2351 class: 'btn btn-outline px-3', 2352 background: 'white', 2353 border: 'black', 2354 font: '14px', 2355 text: 'Ðкл', 2356 title: "ÐклÑÑиÑÑ Ð¾Ð·Ð²ÑÑивание ÑекÑÑа", 2357 } 2358 ); 2359 2360 panel.sound.content.btnon.addEventListener('click', function(e) { 2361 _this.send(par.events.soundon, panel); 2362 panel.sound.status.innerHTML = selectsound(); 2363 }); 2364 2365 addbtn( 2366 panel.sound.content.btnoff, 2367 { 2368 class: 'btn btn-outline px-3', 2369 background: 'white', 2370 border: 'black', 2371 font: '14px', 2372 text: 'ÐÑкл', 2373 title: "Ð
2373ÑклÑÑиÑÑ Ð¾Ð·Ð²ÑÑивание ÑекÑÑа", 2374 } 2375 ); 2376 2377 panel.sound.content.btnoff.addEventListener('click', function(e) { 2378 _this.send(par.events.soundoff, panel); 2379 panel.sound.status.innerHTML = selectsound(); 2380 }); 2381 2382 // =========== 2383 panel.sound.status = document.createElement('div'); 2384 panel.sound.status.classList.add('status-text', 'mt-2'); 2385 panel.sound.status.style.color = 'rgba(0,0,0,0.87)'; 2386 panel.sound.status.innerHTML = selectsound(); 2387 // =========== 2388 2389 panel.sound.content.appendChild(panel.sound.content.btnon); 2390 panel.sound.content.appendChild(panel.sound.content.btnoff); 2391 2392 panel.sound.appendChild(panel.sound.content); 2393 panel.sound.appendChild(panel.sound.status); 2394 panel.appendChild(panel.sound); 2395 2396 this.includeScript(par.modifier.specialsoundscript); 2397 }*/ 2398 2399 2400 2401 // ================================= 2402 2403 panel.onoff = document.createElement('div'); 2404 2405 panel.onoff.className = par.modifier.onoff; 2406 2407 panel.onoff.name = document.createElement('div'); 2408 panel.onoff.name.classList.add('onoff-text', 'mb-2'); 2409 panel.onoff.name.style.color = 'rgba(0,0,0,0.87)'; 2410 panel.onoff.name.innerHTML = BX.message("SF_SPECIAL__PANEL"); 2411 2412 panel.onoff.appendChild(panel.onoff.name); 2413 2414 panel.onoff.content = document.createElement('div'); 2415 panel.onoff.content.classList.add('onoff-content', 'btn-group'); 2416 2417 panel.onoff.content.btnup = document.createElement('button'); 2418 panel.onoff.content.btndefault = document.createElement('button'); 2419 panel.onoff.content.btnonoff = document.createElement('button'); 2420 2421 2422 addbtn( 2423 panel.onoff.content.btndefault, 2424 { 2425 class: 'btn btn-outline px-3', 2426 background: 'white', 2427 border: 'black', 2428 font: '14px', 2429 text: '<i class="fas fa-sync-alt" style="color:black!important"></i>', 2430 title: BX.message("SF_SPECIAL__BTN_DEFAULT"), 2431 } 2432 ); 2433 2434 panel.onoff.content.btndefault.addEventListener('click', function(e) { 2435 _this.send(par.events.defaultsetting, panel); 2436 }); 2437 2438 addbtn( 2439 panel.onoff.content.btnonoff, 2440 { 2441 class: 'btn btn-outline px-3', 2442 background: 'white', 2443 border: 'black', 2444 font: '14px', 2445 text: BX.message("SF_SPECIAL__BTN_OFF_TEXT"), 2446 title: BX.message("SF_SPECIAL__BTN_OFF"), 2447 } 2448 ); 2449 2450 panel.onoff.content.btnonoff.addEventListener('click', function(e) { 2451 _this.send(par.events.close, panel); 2452 changeStateAlt('onblack'); 2453 }); 2454 2455 addbtn( 2456 panel.onoff.content.btnup, 2457 { 2458 class: 'btn btn-outline px-3', 2459 background: 'white', 2460 border: 'black', 2461 font: '14px', 2462 text: '<i class="far fa-angle-up" style="color:black!important"></i>', 2463 title: BX.message("SF_SPECIAL__BTN_UP"), 2464 } 2465 ) 2466 2467 panel.onoff.content.btnup.style.position = 'absolute'; 2468 panel.onoff.content.btnup.style.bottom = '0'; 2469 panel.onoff.content.btnup.style.right = '0'; 2470 panel.onoff.content.btnup.style.borderBottom = '0 solid black'; 2471 panel.onoff.content.btnup.style.borderRadius = '0'; 2472 panel.onoff.content.btnup.style.zIndex = '10'; 2473 2474 if(_this.cookies.get('specialup') == 'down') { 2475 panel.style.marginTop = '-' + panel.clientHeight + 'px'; 2476 panel.onoff.content.btnup.style.bottom = '-' + panel.onoff.content.btnup.clientHeight + 'px'; 2477 panel.onoff.content.btnup.style.transform = 'rotate(180deg)'; 2478 _this.cookies.set('specialup', 'up', 7); 2479 } else { 2480 panel.style.marginTop = '0'; 2481 panel.onoff.content.btnup.style.bottom = '0'; 2482 panel.onoff.content.btnup.style.transform = 'rotate(0deg)'; 2483 _this.cookies.set('specialup', 'down', 7); 2484 } 2485 2486 panel.onoff.content.btnup.addEventListener('click', function(e) { 2487 _this.send(par.events.up, panel); 2488 }); 2489 2490 panel.onoff.content.appendChild(panel.onoff.content.btndefault); 2491 panel.onoff.content.appendChild(panel.onoff.content.btnonoff); 2492 2493 panel.onoff.appendChild(panel.onoff.content); 2494 panel.appendChild(panel.onoff); 2495 panel.appendChild(panel.onoff.content.btnup); 2496 2497 // #endregion ================================= 2498 2499 return panel; 2500 } 2501 2502 // #endregion Panel Special 2503 2504 /** 2505 * 2506 * @param {*} e 2507 */ 2508 this.modal = function(e) {
2509 var overlay = { 2510 load: {}, 2511 area: { 2512 content: {}, 2513 close: {}, 2514 }, 2515 }, 2516 _this = this, 2517 par = e.target.params, 2518 page = document.body.querySelector('.sf-pagewrap-area'), 2519 el = e.target; 2520 2521 overlay = document.createElement('div'); 2522 overlay.load = document.createElement('div'); 2523 overlay.load.innerHTML = par.load; 2524 overlay.area = document.createElement('div'); 2525 overlay.area.content = document.createElement('div'); 2526 overlay.area.close = document.createElement('button'); 2527 2528 overlay.load.setAttribute(par.attributes.load, ''); 2529 overlay.className = par.modifier.overlay; 2530 overlay.style.display = 'flex'; 2531 overlay.load.style.position = 'fixed'; 2532 overlay.load.style.top = '0'; 2533 overlay.load.style.left = '0'; 2534 overlay.load.style.width = '100%'; 2535 overlay.setAttribute(par.attributes.overlay, ''); 2536 2537 overlay.addEventListener('click', function(e) { 2538 if(e.target.hasAttribute(par.attributes.overlay)) 2539 _this.send(par.events.close, overlay); 2540 }); 2541 2542 overlay.classList = par.modifier.overlay; 2543 overlay.setAttribute(par.data.src, par.modifier.src); 2544 overlay.style.zIndex = this.topZIndex() + 1; 2545 2546 overlay.area.setAttribute(par.attributes.modal, ''); 2547 overlay.area.className = par.modifier.modal; 2548 overlay.area.content.setAttribute(par.attributes.content, ''); 2549 overlay.area.content.className = par.modifier.content; 2550 overlay.area.style.opacity = '0'; 2551 overlay.area.appendChild(overlay.area.content); 2552 2553 overlay.area.close.addEventListener('click', function(e) { 2554 _this.send(par.events.close, overlay); 2555 }); 2556 2557 overlay.area.close.setAttribute(par.attributes.close, ''); 2558 overlay.area.close.className = par.modifier.close; 2559 overlay.area.appendChild(overlay.area.close); 2560 overlay.appendChild(overlay.load); 2561 overlay.appendChild(overlay.area); 2562 2563 // СобÑÑие пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿ÐµÑед оÑкÑÑÑием окна 2564 this.receive(par.events.open, overlay, function(e) { 2565 overlay.style.display = 'flex'; 2566 document.body.style.overflow = 'hidden'; 2567 2568 try { 2569 if(el.hasAttribute(par.data.blur) || (par.attributes.blur != null && par.attributes.blur != undefined)) { 2570 //console.log(page) 2571 if(page !== null && page !== undefined) { 2572 //console.log(par.modifier.blur) 2573 page.classList.add(par.modifier.blur.replace(" ", '')); 2574 } 2575 } 2576 } catch(exp) { 2577 2578 } 2579 2580 2581 }); 2582 2583 // СобÑÑие пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿ÐµÑед закÑÑÑием окна 2584 this.receive(par.events.close, overlay, function(e) { 2585 if(overlay.parentNode != null) { 2586 overlay.area.style.opacity = '0'; 2587 overlay.area.content.innerHTML = ''; 2588 overlay.load.style.display = 'flex'; 2589 overlay.parentNode.removeChild(overlay); 2590 } 2591 document.body.style.overflow = 'auto'; 2592 try { 2593 if(el.hasAttribute(par.data.blur) || (par.attributes.blur != null && par.attributes.blur != undefined)) 2594 if(page !== null && page !== undefined) 2595 page.classList.remove(par.modifier.blur.replace(" ", "")); 2596 } catch(exp) { 2597 2598 } 2599 2600 }); 2601 2602 return overlay; 2603 } 2604 2605 this.iframe = function(e) { 2606 /*var overlay = { 2607 load: {}, 2608 area: { 2609 content: {}, 2610 close: {}, 2611 }, 2612 }, 2613 _this = this, 2614 page= document.body.querySelector('.sf-pagewrap-area'), 2615 el = e.target;*/ 2616 var overlay = { 2617 load: {}, 2618 area: { 2619 content: {}, 2620 close: {}, 2621 }, 2622 }, 2623 _this = this, 2624 par = e.target.params, 2625 page = document.body.querySelector('.sf-pagewrap-area'), 2626 el = e.target; 2627 2628 2629
2630 overlay = document.createElement('div'); 2631 overlay.load = document.createElement('div'); 2632 overlay.load.innerHTML = par.load; 2633 overlay.area = document.createElement('div'); 2634 overlay.area.content = document.createElement('iframe'); 2635 overlay.area.content.src = par.modifier.src; 2636 overlay.area.close = document.createElement('button'); 2637 2638 overlay.load.setAttribute(par.attributes.load, ''); 2639 overlay.load.className = par.modifier.load; 2640 overlay.load.style.position = 'fixed'; 2641 overlay.load.style.top = '0'; 2642 overlay.load.style.left = '0'; 2643 overlay.load.style.width = '100%'; 2644 overlay.setAttribute(par.attributes.overlay, ''); 2645 2646 overlay.addEventListener('click', function(e) { 2647 if(e.target.hasAttribute(par.attributes.overlay)) 2648 _this.send(par.events.close, overlay); 2649 /*console.log(par.attributes.overlay) 2650 if(el.hasAttribute(par.attributes.overlay)) { 2651 console.log(overlay) 2652 overlay.parenNode.removeChild(overlay); 2653 document.body.style.overflow = 'auto'; 2654 if(el.hasAttribute(par.data.blur) || par.attributes.blur) 2655 if(page !== null && page !== undefined) 2656 page.classList.remove(par.modifier.opt); 2657 }*/ 2658 }); 2659 2660 overlay.classList = par.modifier.overlay; 2661 overlay.setAttribute(par.data.src, par.modifier.src); 2662 overlay.style.zIndex = this.topZIndex() + 1; 2663 2664 overlay.area.setAttribute(par.attributes.content, ""); 2665 overlay.area.className = par.modifier.modal; 2666 overlay.area.content.setAttribute(par.attributes.content, ""); 2667 overlay.area.content.className = par.modifier.content; 2668 overlay.area.style.opacity = "0"; 2669 overlay.area.appendChild(overlay.area.content); 2670 2671 /*overlay.area.close.addEventListener('click', function(e) { 2672 overlay.parenNode.removeChild(overlay); 2673 document.body.style.overflowY = 'auto'; 2674 if(el.hasAttribute(par.data.blur) || par.attributes.blur) 2675 if(page !== null && page !== undefined) 2676 page.classList.remove(par.modifier.blur); 2677 });*/ 2678 2679 overlay.area.close.addEventListener('click', function(e) { 2680 _this.send(par.events.close, overlay); 2681 }); 2682 2683 2684 overlay.area.close.setAttribute(par.attributes.close, ''); 2685 overlay.area.close.className = par.modifier.close; 2686 overlay.area.appendChild(overlay.area.close); 2687 overlay.appendChild(overlay.load); 2688 overlay.appendChild(overlay.area); 2689 2690 this.receive(par.events.open, el || window, function(e) { 2691 overlay.style.opacity = 1; 2692 document.body.style.overflow = 'hidden'; 2693 overlay.style.display = 'flex'; 2694 if(el.hasAttribute(par.data.blur) || par.attributes.blur) 2695 if(page !== null && page !== undefined) 2696 page.classList.add(par.modifier.blur); 2697 }); 2698 2699 this.receive(par.events.close, overlay, function(e) { 2700 if(overlay.parentNode != null) { 2701 overlay.area.style.opacity = '0'; 2702 overlay.area.content.innerHTML = ''; 2703 overlay.load.style.display = 'flex'; 2704 overlay.parentNode.removeChild(overlay); 2705 } 2706 document.body.style.overflow = 'auto'; 2707 if(el.hasAttribute(par.data.blur) || par.attributes.blur) 2708 if(page !== null && page !== undefined) 2709 page.classList.add(par.modifier.blur); 2710 }); 2711 2712 /*if(el.hasAttribute(par.data.blur) || par.attributes.blur) 2713 if(page !== null && page !== undefined) 2714 page.classList.add(par.modifier.blur);*/ 2715 2716 this.send(par.events.open, el); 2717 return overlay; 2718 } 2719 2720 this.providercreate = function(e) { 2721 var b = e.target.blocks, 2722 el = e.target, 2723 par = el.params; 2724 switch(b) { 2725 case 'modal': 2726 el.modal = this.modal(e); 2727 el.event = par.events.init; 2728 this.send("providerend", el); 2729 break; 2730 case "special": 2731 el.special = this.special(e); 2732 el.event = par.events.init; 2733 this.send('providerend', el); 2734 break; 2735 case 'ajaxload': 2736 el.event = par.events.init; 2737 this.send('providerend', el); 2738 break; 2739 } 2740 } 2741 2742 var _this = this; 2743 2744 if(this.stack.ev('providerstart')) { 2745 this.receive('providerstart', window, function(e) { 2746 _this.providercreate(e); 2747 }); 2748 this.stack.events.push('providerstart'); 2749 } 2750 2751} 2752SF.Modal = function(el, opt) { 2753 2754 this.createNew = function(e) { 2755 var par = new SF.Parameters(), 2756 modPar = par.newparams(); 2757 window.blocks = 'modal'; 2758 window.params = this.extend(modPar.blocks.modal, window.params); 2759 e.target.blocks = 'modal'; 2760 e.target.params = this.extend(modPar.blocks.modal, window.params); 2761 e.target.modal = _this.modal(e); 2762 window.modal = _this.modal(e); 2763 _this.create(e); 2764 } 2765 2766 this.create = function(e) { 2767 //console.log(e.target) 2768 var modal = e.target.modal, 2769 el = e.target, 2770 container = null, 2771 opt = el.params; 2772 2773 try { 2774 if(el.hasAttribute(opt.data.iframe)) 2775 modal = this.iframe(e); 2776 } catch(ex) { 2777 2778 } 2779 2780 2781 //console.log(modal) 2782 2783 var service = document.body.querySelector('.sf-service-bottom-area'); 2784 2785 if(service == null || service == undefined) { 2786 service = document.createElement('div'); 2787 service.classList.add(el.params.modifier.service); 2788 document.body.appendChild(service); 2789 } else container = service.querySelector('.sf-modal-container'); 2790 2791 if(container == null || container == undefined) { 2792 container = document.createElement('section'); 2793 container.setAttribute('modal-container', ''); 2794 container.className = opt.modifier.container; 2795 } 2796 //console.log(container) 2797 try { 2798 container.appendChild(modal); 2799 } catch(ex) { 2800 container.innerHTML = modal; 2801 } 2802 2803 service.appendChild(container); 2804 2805 setTimeout(function() { 2806 if(modal.hasAttribute(el.params.data.src)) { 2807 var link = modal.getAttribute(el.params.data.src).replace(" ", ''); 2808 2809 function simbol(ch) { 2810 var str = 'abcdefghijklmnopqrstuvwxyz', 2811 i = 0; 2812 for(var k = 0; k < str.length; k++) 2813 if(str[k] == ch) i++; 2814 if(i > 0) return true; 2815 else return false;
2816 } 2817 if(link != null && link != '') { 2818 if(link[0] == '.' && simbol(link[1])) { 2819 2820 modal.area.content.appendChild(document.body.querySelector(link).cloneNode(true)); 2821 _this.searchdata(modal.area.content); 2822 modal.load.style.display = 'none'; 2823 modal.area.style.opacity = '1'; 2824 _this.send(el.params.events.open, modal); 2825 2826 } else if(link[0] == '#') { 2827 modal.area.content.appendChild(document.body.querySelector(link).cloneNode(true)); 2828 _this.searchdata(modal.area.content); 2829 modal.load.style.display = 'none'; 2830 modal.area.style.opacity = '1'; 2831 _this.send(el.params.events.open, modal); 2832 } else if(link[0] == '[') { 2833 modal.area.content.appendChild(document.body.querySelector(link).cloneNode(true)); 2834 _this.searchdata(modal.area.content); 2835 modal.load.style.display = 'none'; 2836 modal.area.style.opacity = '1'; 2837 _this.send(el.params.events.open, modal); 2838 } else { 2839 2840 BX.ajax.post( 2841 modal.getAttribute(el.params.data.src), 2842 '', 2843 function (data) { 2844 try { 2845 if(el.hasAttribute(opt.data.iframe)) { 2846 //modal.area.content.contentWindow.document.body.innerHTML = data; 2847 } else modal.area.content.innerHTML = data; 2848 } catch(ex) { 2849 modal.area.content.innerHTML = data; 2850 } 2851 2852 _this.searchdata(modal.area.content); 2853 modal.load.style.display = 'none'; 2854 modal.area.style.opacity = '1'; 2855 _this.send(el.params.events.open, modal); 2856 } 2857 ); 2858 } 2859 } else { 2860 modal.area.content.innerHTML = '<div class="w-100 h-100"><h6 class="c-red">Error</h6></div>'; 2861 _this.searchdata(modal.area.content); 2862 modal.load.style.display = 'none'; 2863 modal.area.style.opacity = '1'; 2864 _this.send(el.params.events.open, modal); 2865 } 2866 } 2867 2868 }, 1000); 2869 } 2870 2871 // ====== CONSTRUCTOR ====== // 2872 2873 SF.Events.call(this) 2874 2875 this.el = el; 2876 this.stack = stack; 2877 var _this = this, 2878 par = new SF.Parameters(), 2879 param = par.newparams(), 2880 plugin = this.extend(param.blocks.modal, opt); 2881 2882 if(this.el) { 2883 this.el.blocks = 'modal'; 2884 this.el.params = plugin; 2885 } 2886 2887 this.receive(plugin.events.init, window, function(e) { 2888 var ev = e; 2889 ev.target.addEventListener('click', function(e) { 2890 e.preventDefault(); 2891 _this.create(ev); 2892 }); 2893 }); 2894 2895 this.receive(plugin.events.create, window, function(e) { 2896 _this.createNew(e); 2897 }); 2898 2899 // ÐакÑÑваем окно клавиÑей Escpe 2900 this.quickkey(function(e) { 2901 var overlay = _this.topZIndexElement(document.body.querySelectorAll('.sf-modal-overlay')); 2902 _this.send('modalclose', overlay); 2903 }, 27); 2904 2905 /*window.addEventListener('click', function(e) { 2906 if(e.target.hasAttribute('sf-modal')) { 2907 if(e.target.params == undefined || e.target.params == null) 2908 _this.send(plugin.events.create, e.target); 2909 } 2910 })*/ 2911 2912 SF.Controller.call(this); 2913 2914 // ====== END CONSTRUCTOR ====== // 2915 2916} 2917SF.Special = function(el, opt) { 2918 // #region Method 2919 this.updateparam = function(param) { 2920 for(var key in param) 2921 if(_this.cookies.get(key)) 2922 param[key] = _this.cookies.get(key); 2923 return param; 2924 } 2925 // #endregion 2926 // ====== CONSTRUCTOR ====== // 2927 SF.Events.call(this); 2928 //SF.Property.call(this); 2929 2930 this.el = el; 2931 var _this = this, 2932 par = new SF.Parameters(), 2933 param = par.newparams(), 2934 plugin = this.extend(param.blocks.special, opt); 2935 2936 this.stack = stack; 2937 var html = document.querySelector('html'), 2938 body = document.body, 2939 service = body.querySelector('.sf-service-top-area'); 2940 2941 if(this.el) { 2942 this.el.blocks = 'special'; 2943 this.el.params = plugin; 2944 } 2945 2946 plugin.cookies = this.updateparam(plugin.cookies); 2947 2948 if(this.stack.ev(plugin.events.close)) { 2949 this.receive(plugin.events.close, window, function(e) { 2950 var panel = e.target; 2951 panel.parentNode.removeChild(panel); 2952 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 2953 _this.send(plugin.events.soundoff, window); 2954 _this.cookies.set('specialstate', 'off', 7); 2955 }); 2956 this.stack.events.push(plugin.events.close); 2957 } 2958 2959 if(this.stack.ev(plugin.events.open)) { 2960 this.receive(plugin.events.open, window, function(e) { 2961 2962 _this.cookies.set('specialstate', 'on', 7); 2963 _this.updateparam(plugin.cookies); 2964 service.insertBefore(_this.el.special, service.firstChild); 2965 html.classList.add('special'); 2966 2967 2968 switch(plugin.cookies.specialfont) { 2969 case 'sans': 2970 _this.send(plugin.events.fontsans, e.target); 2971 break; 2972 case 'serif': 2973 _this.send(plugin.events.fontserif, e.target); 2974 break; 2975 case 'mono': 2976 _this.send(plugin.events.fontmono, e.target); 2977 break; 2978 } 2979 2980 switch(plugin.cookies.specialkerning) { 2981 case 'normal': 2982 _this.send(plugin.events.kerningnormal, e.target); 2983 break; 2984 case 'middle': 2985 _this.send(plugin.events.kerningmiddle, e.target); 2986 break; 2987 case 'big': 2988 _this.send(plugin.events.kerningbig, e.target); 2989 break; 2990 } 2991 2992 switch(plugin.cookies.specialinterval) { 2993 case '1.0': 2994 _this.send(plugin.events.intervalone, e.target); 2995 break; 2996 case '1.5': 2997 _this.send(plugin.events.intervalhalf, e.target); 2998 break; 2999 case '2.0': 3000 _this.send(plugin.events.intervaltwo, e.target); 3001 break; 3002 } 3003 html.style.fontSize = plugin.cookies.specialkegl + 'px'; 3004 body.style.fontSize = plugin.cookies.specialkegl + 'px'; 3005 switch(plugin.cookies.specialimage) { 3006 case 'off': 3007 html.classList.add('special-img-none'); 3008 html.classList.remove('special-img-black'); 3009 _this.cookies.set('specialimage', 'off', 7); 3010 break; 3011 case 'oncolor': 3012 html.classList.remove('special-img-none'); 3013 html.classList.remove('special-img-black'); 3014 _this.cookies.set('specialimage', 'oncolor', 7); 3015 break; 3016 case 'onblack': 3017 html.classList.add('special-img-black'); 3018 html.classList.remove('special-img-none'); 3019 _this.cookies.set('specialimage', 'onblack', 7); 3020 break; 3021 } 3022 _this.el.linkcss = _this.addcss(plugin.modifier[plugin.cookies.specialcolor]); 3023 3024 var stateImage = _this.cookies.get('specialimage'); 3025 if(stateImage == 'off') 3026 { 3027 document.querySelectorAll('.sf-special-hidden').forEach((elem) => { 3028 elem.classList.remove('sf-special-hidden'); 3029 elem.classList.add('sf-special-show') 3030 }); 3031 } else if(stateImage == 'onblack' || stateImage == 'oncolor') { 3032 document.querySelectorAll('.sf-special-show').forEach((elem) => { 3033 elem.classList.add('sf-special-hidden'); 3034 elem.classList.remove('sf-special-show'); 3035 }); 3036 } 3037 3038 var panel = document.body.querySelector('[sf-special-panel]'); 3039 if(plugin.cookies.specialsound == 'on') 3040 _this.send(plugin.events.soundon, panel); 3041 //_this.send(plugin.events.up, panel); 3042 }); 3043 this.stack.events.push(plugin.events.open); 3044 } 3045 3046 // #region Font 3047 3048 if(this.stack.ev(plugin.events.fontsans)) { 3049 this.receive(plugin.events.fontsans, window, function(e) { 3050 html.classList.add('special-font-sans'); 3051 html.classList.remove('special-font-serif'); 3052 html.classList.remove('special-font-mono'); 3053 _this.cookies.set('specialfont', 'sans', 7); 3054 }); 3055 this.stack.events.push(plugin.events.fontsans); 3056 } 3057 3058 if(this.stack.ev(plugin.events.fontserif)) { 3059 this.receive(plugin.events.fontserif, window, function(e) { 3060 html.classList.remove('special-font-sans'); 3061 html.classList.add('special-font-serif'); 3062 html.classList.remove('special-font-mono'); 3063 _this.cookies.set('specialfont', 'serif', 7); 3064 }); 3065 this.stack.events.push(plugin.events.fontserif); 3066 } 3067 3068 if(this.stack.ev(plugin.events.fontmono)) { 3069 this.receive(plugin.events.fontmono, window, function(e) { 3070 html.classList.remove('special-font-sans'); 3071 html.classList.remove('special-font-serif'); 3072 html.classList.add('special-font-mono'); 3073 _this.cookies.set('specialfont', 'mono', 7); 3074 }); 3075 this.stack.events.push(plugin.events.fontmono); 3076 } 3077 3078 // #endregion Font 3079 3080 if(this.stack.ev(plugin.events.keglless)) { 3081 this.receive(plugin.events.keglless, window, function(e) { 3082 _this.updateparam(plugin.cookies); 3083 if(plugin.cookies.specialkegl < 32) { 3084 var kegl = Number(plugin.cookies.specialkegl); 3085 kegl++; 3086 html.style.fontSize = kegl + 'px'; 3087 body.style.fontSize = kegl + 'px'; 3088 _this.cookies.set('specialkegl', kegl, 7); 3089 } 3090 }); 3091 this.stack.events.push(plugin.events.keglless); 3092 } 3093 3094 if(this.stack.ev(plugin.events.keglmore)) { 3095 this.receive(plugin.events.keglmore, window, function(e) { 3096 _this.updateparam(plugin.cookies); 3097 if(plugin.cookies.specialkegl > 14) { 3098 var kegl = Number(plugin.cookies.specialkegl); 3099 kegl--; 3100 html.style.fontSize = kegl + 'px'; 3101 body.style.fontSize = kegl + 'px'; 3102 _this.cookies.set('specialkegl', kegl, 7); 3103 } 3104 }); 3105 this.stack.events.push(plugin.events.keglmore); 3106 } 3107 3108 // Kerning 3109 if(this.stack.ev(plugin.events.kerningnormal)) { 3110 this.receive(plugin.events.kerningnormal, window, function(e) { 3111 _this.updateparam(plugin.cookies); 3112 html.classList.remove('special-kerning-middle'); 3113 html.classList.remove('special-kerning-big'); 3114 _this.cookies.set('specialkerning', 'normal', 7); 3115 }); 3116 this.stack.events.push(plugin.events.kerningnormal); 3117 } 3118 // 3119 if(this.stack.ev(plugin.events.kerningmiddle)) { 3120 this.receive(plugin.events.kerningmiddle, window, function(e) { 3121 _this.updateparam(plugin.cookies); 3122 html.classList.add('special-kerning-middle'); 3123 html.classList.remove('special-kerning-big'); 3124 _this.cookies.set('specialkerning', 'middle', 7); 3125 }); 3126 this.stack.events.push(plugin.events.kerningmiddle); 3127 } 3128 if(this.stack.ev(plugin.events.kerningbig)) { 3129 this.receive(plugin.events.kerningbig, window, function(e) { 3130 _this.updateparam(plugin.cookies); 3131 html.classList.remove('special-kerning-middle'); 3132 html.classList.add('special-kerning-big'); 3133 _this.cookies.set('specialkerning', 'big', 7); 3134 }); 3135 this.stack.events.push(plugin.events.kerningbig); 3136 } 3137 //=========== 3138 3139 // Interval УвелиÑение инÑеÑвала ÑекÑÑа 3140 if(this.stack.ev(plugin.events.intervalone)) { 3141 this.receive(plugin.events.intervalone, window, function(e) { 3142 _this.updateparam(plugin.cookies); 3143 html.classList.remove('special-interval-15'); 3144 html.classList.remove('special-inerval-20'); 3145 _this.cookies.set('specialinterval', '1', 7); 3146 }); 3147 this.stack.events.push(plugin.events.intervalone); 3148 } 3149 3150 if(this.stack.ev(plugin.events.intervalhalf)) { 3151 this.receive(plugin.events.intervalhalf, window, function(e) { 3152 _this.updateparam(plugin.cookies); 3153 html.classList.add('special-interval-15'); 3154 html.classList.remove('special-inerval-20'); 3155 _this.cookies.set('specialinterval', '1.5', 7); 3156 }); 3157 this.stack.events.push(plugin.events.intervalhalf); 3158 } 3159 3160 if(this.stack.ev(plugin.events.intervaltwo)) { 3161 this.receive(plugin.events.intervaltwo, window, function(e) { 3162 _this.updateparam(plugin.cookies); 3163 html.classList.remove('special-interval-15'); 3164 html.classList.add('special-inerval-20'); 3165 _this.cookies.set('specialinterval', '2.0', 7); 3166 }); 3167 this.stack.events.push(plugin.events.intervaltwo); 3168 } 3169 // ======================================================= 3170 if(this.stack.ev(plugin.events.imagecolor)) { 3171 this.receive(plugin.events.imagecolor, window, function(e) { 3172 _this.updateparam(plugin.cookies); 3173 html.classList.remove('special-img-none'); 3174 html.classList.remove('special-img-black'); 3175 _this.cookies.set('specialimage', 'oncolor', 7); 3176 }); 3177 this.stack.events.push(plugin.events.imagecolor); 3178 } 3179 3180 if(this.stack.ev(plugin.events.imageblack)) { 3181 this.receive(plugin.events.imageblack, window, function(e) { 3182 _this.updateparam(plugin.cookies); 3183 html.classList.remove('special-img-none'); 3184 html.classList.add('special-img-black'); 3185 _this.cookies.set('specialimage', 'onblack', 7); 3186 }); 3187 this.stack.events.push(plugin.events.imageblack); 3188 } 3189 3190 if(this.stack.ev(plugin.events.imageoff)) { 3191 this.receive(plugin.events.imageoff, window, function(e) { 3192 _this.updateparam(plugin.cookies); 3193 html.classList.add('special-img-none'); 3194 html.classList.remove('special-img-black'); 3195 _this.cookies.set('specialimage', 'off', 7); 3196 }); 3197 this.stack.events.push(plugin.events.ima
3197geoff); 3198 } 3199 3200 3201 // ============================================ 3202 3203 if(this.stack.ev(plugin.events.colorwhite)) { 3204 this.receive(plugin.events.colorwhite, window, function(e) { 3205 _this.updateparam(plugin.cookies); 3206 service.insertBefore(_this.el.special, service.firstChild); 3207 html.classList.add('special'); 3208 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3209 _this.el.linkcss = _this.addcss(plugin.modifier.specialwhite); 3210 _this.cookies.set('specialcolor', 'specialwhite', 7); 3211 }); 3212 this.stack.events.push(plugin.events.colorwhite); 3213 } 3214 3215 if(this.stack.ev(plugin.events.colorblack)) { 3216 this.receive(plugin.events.colorblack, window, function(e) { 3217 //var service = document.body.querySelector('.sf-service-top-area'); 3218 service.insertBefore(_this.el.special, service.firstChild); 3219 html.classList.add('special'); 3220 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3221 _this.el.linkcss = _this.addcss(plugin.modifier.specialblack); 3222 _this.cookies.set('specialcolor', 'specialblack', 7); 3223 }); 3224 this.stack.events.push(plugin.events.colorblack); 3225 } 3226 3227 if(this.stack.ev(plugin.events.coloryellow)) { 3228 this.receive(plugin.events.coloryellow, window, function(e) { 3229 //var service = document.body.querySelector('.sf-service-top-area'); 3230 service.insertBefore(_this.el.special, service.firstChild); 3231 html.classList.add('special'); 3232 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3233 _this.el.linkcss = _this.addcss(plugin.modifier.specialyellow); 3234 _this.cookies.set('specialcolor', 'specialyellow', 7); 3235 }); 3236 this.stack.events.push(plugin.events.coloryellow); 3237 } 3238 3239 if(this.stack.ev(plugin.events.colorblue)) { 3240 this.receive(plugin.events.colorblue, window, function(e) { 3241 //var service = document.body.querySelector('.sf-service-top-area'); 3242 service.insertBefore(_this.el.special, service.firstChild); 3243 html.classList.add('special'); 3244 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3245 _this.el.linkcss = _this.addcss(plugin.modifier.specialblue); 3246 _this.cookies.set('specialcolor', 'specialblue', 7); 3247 }); 3248 this.stack.events.push(plugin.events.colorblue); 3249 } 3250 3251 if(this.stack.ev(plugin.events.colorgreen)) { 3252 this.receive(plugin.events.colorgreen, window, function(e) { 3253 service.insertBefore(_this.el.special, service.firstChild); 3254 html.classList.add('special'); 3255 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3256 _this.el.linkcss = _this.addcss(plugin.modifier.specialgreen); 3257 _this.cookies.set('specialcolor', 'specialgreen', 7); 3258 }); 3259 this.stack.events.push(plugin.events.colorgreen); 3260 } 3261 3262 3263 if(this.stack.ev(plugin.events.soundoff)) { 3264 this.receive(plugin.events.soundoff, window, function(e) { 3265 var btnplay = document.body.querySelectorAll('[sf-play]'); 3266 for(var k = 0; k < btnplay.length; k++) 3267 btnplay[k].parentNode.removeChild(btnplay[k]); 3268 _this.cookies.set('specialsound', 'off', 7); 3269 }); 3270 this.stack.events.push(plugin.events.soundoff); 3271 } 3272 // end Sound 3273 3274 if(this.stack.ev(plugin.events.defaultsetting)) { 3275 this.receive(plugin.events.defaultsetting, window, function(e) { 3276 var o = new SF.Parameters().newparams(), 3277 p = o.blocks.special, 3278 panel = e.target; 3279 3280 html.classList.remove('special-font-sans'); 3281 html.classList.remove('special-font-serif'); 3282 html.classList.remove('special-font-mono'); 3283 panel.font.status.innerHTML = BX.message("SF_SPECIAL__FONT_DEFAULT"); 3284 3285 _this.cookies.set('specialfont', p.cookies.specialfont, 7); 3286 3287 html.style.fontSize = p.cookies.specialkegl + 'px'; 3288 panel.kegl.status.innerHTML = p.cookies.specialkegl + BX.message("SF_SPECIAL__SPECIAL_KEGL"); 3289 _this.cookies.set('specialkegl', p.cookies.specialkegl, 7); 3290 3291 html.classList.remove('special-kerning-middle'); 3292 html.classList.remove('special-kerning-big'); 3293 _this.cookies.set('specialkerning', p.cookies.specialkerning, 7); 3294 panel.kerning.status.innerHTML = BX.message("SF_SPECIAL__KERNING_NORMAL"); 3295 3296 html.classList.remove('special-interval-15'); 3297 html.classList.remove('special-inerval-20'); 3298 _this.cookies.set('specialinterval', '1.0', 7); 3299 panel.interval.status.innerHTML = BX.message("SF_SPECIAL__INTERVAL_1_0"); 3300 3301 if( _this.el.linkcss.parentNode) { 3302 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3303 } 3304 3305 _this.el.linkcss = _this.addcss(p.modifier.specialwhite); 3306 _this.cookies.set('specialcolor', p.cookies.specialcolor); 3307 3308 panel.color.status.innerHTML = BX.message("SF_SPECIAL__BTN_WHITE"); 3309 3310 panel.img.status.innerHTML = BX.message("SF_SPECIAL__IMG_ON_COLOR"); 3311 html.classList.remove('special-img-none'); 3312 html.classList.remove('special-img-black'); 3313 _this.cookies.set('specialimage', 'on', 7); 3314 }); 3315 this.stack.events.push(plugin.events.defaultsetting); 3316 } 3317 3318 if(this.stack.ev(plugin.events.up)) { 3319 this.receive(plugin.events.up, window, function(e) { 3320 var panel = e.target; 3321 if(_this.cookies.get('specialup') == 'down') { 3322 panel.style.marginTop = '-' + panel.clientHeight + 'px'; 3323 panel.onoff.content.btnup.style.bottom = '-' + panel.onoff.content.btnup.clientHeight + 'px'; 3324 panel.onoff.content.btnup.style.transform = 'rotate(180deg)'; 3325 _this.cookies.set('specialup', 'up', 7); 3326 } else { 3327 panel.style.marginTop = '0'; 3328 panel.onoff.content.btnup.style.bottom = '0'; 3329 panel.onoff.content.btnup.style.transform = 'rotate(0deg)'; 3330 _this.cookies.set('specialup', 'down', 7); 3331 } 3332 }); 3333 this.stack.events.push(plugin.events.up); 3334 } 3335 3336 // ============================================ 3337 3338 if(plugin.cookies.specialstate == 'off') { 3339 _this.el.addEventListener('click', function(e) { 3340 e.preventDefault(); 3341 switch(_this.cookies.get('specialstate')) { 3342 case 'off': 3343 _this.send(_this.el.params.events.open, _this.el); 3344 break; 3345 case 'on': 3346 var panel = document.body.querySelector('[sf-special-panel]'); 3347 panel.parentNode.removeChild(panel); 3348 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3349 _this.cookies.set('specialstate', 'off', 7); 3350 break; 3351 default: 3352 _this.send(_this.el.params.events.open, _this.el); 3353 break; 3354 } 3355 }); 3356 } else { 3357 _this.updateparam(plugin.cookies); 3358 _this.send(plugin.events.open, window); 3359 _this.el.addEventListener('click', function(e) { 3360 switch(_this.cookies.get('specialstate')) { 3361 case 'off': 3362 _this.send(_this.el.params.events.open, _this.el); 3363 break; 3364 case 'on': 3365 var panel = document.body.querySelector('[sf-special-panel]'); 3366 panel.parentNode.removeChild(panel); 3367 _this.el.linkcss.parentNode.removeChild(_this.el.linkcss); 3368 _this.cookies.set('specialstate', 'off', 7); 3369 break; 3370 default: 3371 _this.send(_this.el.params.events.open, _this.el); 3372 break; 3373 } 3374 }); 3375 } 3376 3377 3378 // ====== END CONSTRUCTOR ====== // 3379} 3380SF.AjaxLoad = function(el, opt) { 3381 3382 SF.Events.call(this); 3383 3384 this.el = el; 3385 var _this = this, 3386 par = new SF.Parameters(), 3387 param = par.newparams(), 3388 plugin = this.extend(param.blocks.ajaxload, opt); 3389 3390 this.stack = stack; 3391 3392 if(this.el) { 3393 this.el.blocks = 'ajaxload'; 3394 this.el.params = plugin; 3395 } 3396 3397 this.receive(plugin.events.init, window, function(e) { 3398 var el = e.target, 3399 interval = setInterval(_this.checklayer, 1000, el); 3400 _this.receive(plugin.events.cancel, el, function(e) { 3401 clearInterval(interval); 3402 }) 3403 }) 3404 3405 this.receive(plugin.events.create, window, function(e) { 3406 _this.send('ajaxloadinit', e.target); 3407 }) 3408 3409 this.checklayer = function(el) { 3410 var comp = getComputedStyle(el); 3411 3412 if(el.getAttribute(plugin.data.loaded) !== 'loaded' && comp.display !== 'none') { 3413 el.setAttribute(plugin.data.loaded, 'loaded'); 3414 el.innerHTML = plugin.load; 3415 setTimeout(function(){ 3416 BX.ajax.post( 3417 el.getAttribute(plugin.data.src), 3418 '', 3419 function (data) { 3420 el.innerHTML = data; 3421 el.load.style.display = 'none'; 3422 } 3423 ); 3424 }, 1000); 3425 3426 } else el.setAttribute(plugin.data.loaded, ''); 3427 3428 if(el.hasAttribute(plugin.data.cancel) && el.getAttribute(plugin.data.loaded) == 'loaded') 3429 _this.send(plugin.events.cancel, el); 3430 } 3431} 3432SF.Controller.Stack = { 3433 el: [], 3434 events: [], 3435 log: [], 3436} 3437 3438var stack = SF.Controller.Stack; 3439 3440SF.Controller.Stack.extend = function(def, options) { 3441 var i = 0; 3442 for(var key in options) { 3443 if(def.length > 0) 3444 for(var k = 0; k < def.length; k++) 3445 if(def[k] == options[key]) i++; 3446 if(i == 0) def.push(options[key]); 3447 i = 0; 3448 } 3449 return def; 3450} 3451 3452 3453SF.Controller.Stack.addevents = function(events) { 3454 var e = this.stack.events, 3455 i = 0; 3456 for(var k = 0; k < e.length; k++) 3457 if(e[k] == events) i++; 3458 if(i == 0) e.push(events); 3459} 3460 3461SF.Controller.Stack.ev = function(ev) { 3462 var e = this.events, 3463 i = 0; 3464 for(var k = 0; k < e.length; k++) 3465 if(e[k] == ev) i++; 3466 if(i === 0) return true; 3467 else return false;
3468} 3469window.addEventListener('DOMContentLoaded', function(e) { 3470 new SF.AjaxLoad(); 3471 new SF.Modal(); 3472 3473 3474 3475 /*var callback = function(allmutations) { 3476 allmutations.map( function(mr) { 3477 var mt = 'Тип изменениÑ: ' + mr.type; // запиÑÑваем Ñип Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ 3478 mt += 'ÐзмененнÑй ÑлеменÑ: ' + mr.target; // запиÑÑваем измененнÑй ÑлеменÑ. 3479 var event = setInterval(function(e) { 3480 SF.send('searchstartmodal', window); 3481 clearInterval(event); 3482 }, 1000); 3483 //_this.send('searchstartmodal', window) 3484 //console.log( mr.target ); 3485 //SF.send('searchstartmodal', mr.target); 3486 }); 3487 3488 }, mo = new MutationObserver(callback), 3489 options = { 3490 // обÑзаÑелÑнÑй паÑамеÑÑ: наблÑдаем за добавлением и Ñдалением доÑеÑÐ½Ð¸Ñ ÑлеменÑов. 3491 'childList': true, 3492 // наблÑдаем за добавлением и Ñдалением доÑеÑÐ½Ð¸Ñ ÑлеменÑов лÑбого ÑÑÐ¾Ð²Ð½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. 3493 'subtree': true 3494 } 3495 mo.observe(document.body, options);*/ 3496}); 3497;( function( window ) { 3498 3499 'use strict'; 3500 3501 function extend( a, b ) { 3502 for( var key in b ) { 3503 if( b.hasOwnProperty( key ) ) { 3504 a[key] = b[key]; 3505 } 3506 } 3507 return a; 3508 } 3509 3510 function sfTab( el, options ) { 3511 this.el = el; 3512 this.options = extend( {}, this.options ); 3513 extend( this.options, options ); 3514 this._init(); 3515 } 3516 3517 sfTab.prototype.options = { 3518 start : 0 3519 }; 3520 3521 sfTab.prototype._init = function() { 3522 // tabs elems 3523 this.tabs = [].slice.call( this.el.querySelectorAll( 'nav > ul > li' ) ); 3524 // content items 3525 this.items = [].slice.call( this.el.querySelectorAll( '.sf-tab-content > section' ) ); 3526 // current index 3527 this.current = -1; 3528 // init events 3529 this._initEvents(); 3530 }; 3531 3532 sfTab.prototype._initEvents = function() { 3533 var self = this;
3534 this.tabs.forEach( function( tab, idx ) { 3535 tab.addEventListener( 'click', function( ev ) { 3536 ev.preventDefault(); 3537 for(var i = 0; i < self.tabs.length; i++) { 3538 self.tabs[i].classList.remove('active'); 3539 self.items[i].classList.remove('active'); 3540 } 3541 self._show( idx ); 3542 }); 3543 }); 3544 }; 3545 3546 sfTab.prototype._show = function( idx ) { 3547 if( this.current >= 0 ) { 3548 this.tabs[ this.current ].classList.remove('active'); 3549 this.items[ this.current ].classList.remove('active'); 3550 } 3551 // change current 3552 if(idx != null) { 3553 this.current = idx; 3554 this.tabs[idx].classList.add('active'); 3555 this.items[idx].classList.add('active'); 3556 } 3557 3558 }; 3559 3560 // add to global namespace 3561 window.sfTab = sfTab; 3562 3563})( window ); 3564 3565 3566 3567 ;(function() { 3568 window.addEventListener('DOMContentLoaded', function() { 3569 [].slice.call( document.querySelectorAll( '.sf-tab' ) ).forEach( function( el ) { 3570 new sfTab( el ); 3571 }); 3572 }); 3573 })(); 3574 3575'use strict'; 3576/* 3577 * 32 avalable animation effects (from jQuery UI). 3578 * More info: https://api.jqueryui.com/easings/ 3579 * 3580 * linear 3581 * swing 3582 * easeInQuad 3583 * easeOutQuad 3584 * easeInOutQuad 3585 * easeInCubic 3586 * easeOutCubic 3587 * easeInOutCubic 3588 * easeInQuart 3589 * easeOutQuart 3590 * easeInOutQuart 3591 * easeInQuint 3592 * easeOutQuint 3593 * easeInOutQuint 3594 * easeInExpo 3595 * easeOutExpo 3596 * easeInOutExpo 3597 * easeInSine 3598 * easeOutSine 3599 * easeInOutSine 3600 * easeInCirc 3601 * easeOutCirc 3602 * easeInOutCirc 3603 * easeInElastic 3604 * easeOutElastic 3605 * easeInOutElastic 3606 * easeInBack 3607 * easeOutBack 3608 * easeInOutBack 3609 * easeInBounce 3610 * easeOutBounce 3611 * easeInOutBounce 3612 */ 3613 3614(function ($) { 3615 3616 function goTop() { 3617 var top = Math.max(document.body.scrollTop,document.documentElement.scrollTop), 3618 t; 3619 if(top > 0) { 3620 window.scrollBy(0, -10); 3621 t = setTimeout('goTop()', 10); 3622 } else clearTimeout(t); 3623 return false; 3624 } 3625 3626 $(document).ready(function () { 3627 3628 var btn = document.querySelector('.sf-up'); 3629 if(btn != null) { 3630 var animationEasing = btn.getAttribute('data-animation'), 3631 scrollSpeed = btn.getAttribute('data-speed'); 3632 scrollOffset = btn.getAttribute('data-offset'); 3633 3634 $(window).scroll(function () { 3635 var currentScrollTop = $(window).scrollTop(); 3636 if (currentScrollTop > scrollOffset) { 3637 $('.sf-up').addClass('active'); 3638 } else { 3639 $('.sf-up').removeClass('active'); 3640 } 3641 }); 3642 3643 3644 3645 $('.sf-up').on("click", function (e) { 3646 e.preventDefault(); 3647 var currentScrollTop = $(window).scrollTop(); 3648 var animationTime = Math.round((currentScrollTop * 1000) / scrollSpeed); 3649 3650 document.documentElement.style.transitionProperty = 'all'; 3651 document.documentElement.style.transitionDuration = '0.8s'; 3652 document.documentElement.style.transitionTimingFunction = 'ease'; 3653 3654 (function goTop() { 3655 3656 if (window.pageYOffset !== 0) { 3657 window.scrollBy(0, -10); 3658 setTimeout(goTop, 1); 3659 } 3660 3661 })(); 3662 $("html, body").animate({ 3663 scrollTop: 0 3664 }, scrollSpeed); 3665 }); 3666 3667 3668 3669 } 3670 }); 3671}(jQuery)); 3672 3673setInterval(function () { 3674 var className = $('.sf-up').attr('class'); 3675 if(className != null) { 3676 $('.usage .current-class').text(className.replace('active', '')); 3677 $('.usage .current-animation').text($('.animationEasing.active').data('value')); 3678 $('.usage .current-css').text($('#sf-up-style').attr('href')); 3679 } 3680}, 200); 3681$(document).ready(function() { 3682 function isParent(el) { 3683 if(el) { 3684 if(el.classList.contains('hide-show')) { 3685 return el 3686 } else { 3687 if(el.parentNode) return isParent(el.parentNode) 3688 } 3689 } 3690 } 3691 $('.hide-show-btn').on('click', function (e) { 3692 e.preventDefault(); 3693 var el = isParent(e.currentTarget), 3694 target = e.currentTarget; 3695 if(el) { 3696 if(target.classList.contains('hide')) { 3697 el.classList.add('hidden') 3698 } else if(target.classList.contains('show')){ 3699 el.classList.remove('hidden') 3700 } 3701 } 3702 }); 3703}); 3704/** Form 5 */ 3705'use strict'; 3706 3707/* FORMS */ 3708(function ($) { 3709 $(document).ready(function () { 3710 3711 // Text based inputs 3712 var input_selector = ['text', 'password', 'email', 'url', 'tel', 'time', 'month', 'week', 'number', 'datetime', 'search', 'search-md', 'file'].map(function (selector) { 3713 return 'input[type=' + selector + ']'; 3714 }).join(', ') + ', textarea'; 3715 3716 var text_area_selector = 'textarea'; 3717 3718 var update_text_fields = function update_text_fields($input) { 3719 var $form = $input.parent('.sf-form'); 3720 var $labelAndIcon = $input.siblings('label, i'); 3721 var hasValue = $input.val().length; 3722 var hasPlaceholder = $input.attr('placeholder'); 3723 var label = $input.parent().hasClass('sf-form-label'); 3724 // let isValid = $input.validity.badInput === true; 3725 var addOrRemove = (hasValue || (hasPlaceholder && label) ? 'add' : 'remove') + 'Class'; 3726 3727 $labelAndIcon[addOrRemove]('active'); 3728 $input[addOrRemove]('active'); 3729 $form[addOrRemove]('active'); 3730 }; 3731
3732 var validate_field = function validate_field($input) { 3733 3734 if ($input.hasClass('validate')) { 3735 var value = $input.val(); 3736 var noValue = !value.length; 3737 var isValid = !$input[0].validity.badInput; 3738 3739 if (noValue && isValid) { 3740 $input.removeClass('valid').removeClass('invalid'); 3741 } else { 3742 var valid = $input.is(':valid'); 3743 var length = Number($input.attr('length')) || 0; 3744 3745 if (valid && (!length || length > value.length)) { 3746 $input.removeClass('invalid').addClass('valid'); 3747 } else { 3748 $input.removeClass('valid').addClass('invalid'); 3749 } 3750 } 3751 } 3752 }; 3753 3754 var textarea_auto_resize = function textarea_auto_resize() { 3755 3756 var $textarea = $(undefined); 3757 if ($textarea.val().length) { 3758 var _$hiddenDiv = $('.hiddendiv'); 3759 var fontFamily = $textarea.css('font-family'); 3760 var fontSize = $textarea.css('font-size'); 3761 3762 if (fontSize) { 3763 _$hiddenDiv.css('font-size', fontSize); 3764 } 3765 if (fontFamily) { 3766 _$hiddenDiv.css('font-family', fontFamily); 3767 } 3768 if ($textarea.attr('wrap') === 'off') { 3769 _$hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre'); 3770 } 3771 3772 _$hiddenDiv.text($textarea.val() + '\n'); 3773 var content = _$hiddenDiv.html().replace(/\n/g, '<br>'); 3774 _$hiddenDiv.html(content); 3775 3776 // When textarea is hidden, width goes crazy. 3777 // Approximate with half of window size 3778 _$hiddenDiv.css('width', $textarea.is(':visible') ? $textarea.width() : $(window).width() / 2); 3779 $textarea.css('height', _$hiddenDiv.height()); 3780 } 3781 }; 3782 3783 // Set active on labels and icons (DOM ready scope); 3784 $(input_selector).each(function (index, input) { 3785 var $this = $(input); 3786 var $labelAndIcon = $this.siblings('label, i'); 3787 //var par = $this.parent().hasClass('sf-form-label'); 3788 //console.log($par) 3789 update_text_fields($this); 3790 var isValid = input.validity.badInput; // pure js 3791 //console.log($this) 3792 if (isValid && par == true) { 3793 //console.log(par) 3794 $labelAndIcon.addClass('active'); 3795 } 3796 }); 3797 3798 // Add active when element has focus 3799 $(document).on('focus', input_selector, function (e) { 3800 $(e.target).siblings('label, i').addClass('active'); 3801 $(e.target).addClass('sf-form-focus'); 3802 }); 3803 3804 // Remove active on blur when not needed or invalid 3805 $(document).on('blur', input_selector, function (e) { 3806 var $this = $(e.target); 3807 var noValue = !$this.val(); 3808 var invalid = !e.target.validity.badInput; 3809 var noPlaceholder = $this.attr('placeholder') === undefined; 3810 3811 if (noValue && invalid) { 3812 $this.siblings('label, i').removeClass('active'); 3813 } 3814 $this.removeClass('sf-form-focus'); 3815 3816 validate_field($this); 3817 }); 3818 3819 // Add active if form auto complete 3820 $(document).on('change', input_selector, function (e) { 3821 var $this = $(e.target); 3822 update_text_fields($this); 3823 validate_field($this); 3824 }); 3825 3826 // Handle HTML5 autofocus 3827 $('input[autofocus]').siblings('label, i').addClass('active'); 3828 3829 // HTML form reset 3830 $(document).on('reset', function (e) { 3831 var $formReset = $(e.target); 3832 if ($formReset.is('form')) { 3833 3834 var $formInputs = $formReset.find(input_selector); 3835 // Reset inputs 3836 $formInputs.removeClass('valid').removeClass('invalid').each(function (index, input) { 3837 var $this = $(input); 3838 var noDefaultValue = !$this.val(); 3839 var noPlaceholder = !$this.attr('placeholder'); 3840 if (noDefaultValue) { 3841 $this.siblings('label, i').removeClass('active'); 3842 } 3843 }); 3844 } 3845 }); 3846 3847 // Textarea auto extend 3848 if ($('textarea').length) { 3849 var init = function init() { 3850 var text = $('textarea'); 3851 text.each(function () { 3852 var _this = this; 3853 function resize() { 3854 _this.style.height = 'auto'; 3855 _this.style.height = _this.scrollHeight + 'px'; 3856 } 3857 /* 0-timeout to get the already changed text */ 3858 function delayedResize() { 3859 window.setTimeout(resize, 0); 3860 } 3861 observe(_this, 'change', resize); 3862 observe(_this, 'cut', delayedResize); 3863 observe(_this, 'paste', delayedResize); 3864 observe(_this, 'drop', delayedResize); 3865 observe(_this, 'keydown', delayedResize); 3866 resize(); 3867 }); 3868 }; 3869 3870 var observe; 3871 if (window.attachEvent) { 3872 observe = function observe(element, event, handler) { 3873 element.attachEvent('on' + event, handler); 3874 }; 3875 } else { 3876 observe = function observe(element, event, handler) { 3877 element.addEventListener(event, handler, false); 3878 }; 3879 } 3880 3881 init(); 3882 } 3883 3884 // Textarea Auto Resize 3885 if (!$('.hiddendiv').first().length) {
3886 $hiddenDiv = $('<div class="hiddendiv common"></div>'); 3887 $('body').append($hiddenDiv); 3888 } 3889 3890 if($("body").is("text_area_selector")){ 3891 $(text_area_selector).each(textarea_auto_resize); 3892 $('body').on('keyup keydown', text_area_selector, textarea_auto_resize); 3893 } 3894 }); 3895})(jQuery); 3896'use strict'; 3897 3898(function($) { 3899 3900 $.fn.rkmd_rangeSlider = function() { 3901 var self, slider_width, slider_offset, curnt, sliderContinuous, sliderDiscrete, range, slider; 3902 self = $(this); 3903 slider_width = self.outerWidth(); 3904 slider_offset = self.offset().left; 3905 3906 sliderContinuous = $('.sf-form-range'); 3907 sliderDiscrete = $('.range-led'); 3908 3909 //if(!this.classList.contain('range-led')) { 3910 3911 sliderContinuous.each(function(i, v) { 3912 if(!this.classList.contains('range-led')) { 3913 curnt = $(this); 3914 curnt.append(sliderContinuous_tmplt()); 3915 range = curnt.find('input[type="range"]'); 3916 slider = curnt.find('.axis'); 3917 slider_fill = slider.find('.axis-segment'); 3918 slider_handle = slider.find('.axis-pin'); 3919 3920 var range_val = range.val(); 3921 slider_fill.css('width', range_val +'%'); 3922 slider_handle.css('left', range_val +'%'); 3923 } else { 3924 //sliderDiscrete.each(function(i, v) { 3925 curnt = $(this); 3926 curnt.append(sliderDiscrete_tmplt()); 3927 range = curnt.find('input[type="range"]'); 3928 slider = curnt.find('.axis'); 3929 slider_fill = slider.find('.axis-segment'); 3930 slider_handle = slider.find('.axis-pin'); 3931 slider_label = slider.find('.axis-count'); 3932 3933 var range_val = parseInt(range.val()); 3934 slider_fill.css('width', range_val +'%'); 3935 slider_handle.css('left', range_val +'%'); 3936 slider_label.find('span').text(range_val); 3937 //}); 3938 } 3939 }); 3940 //} 3941 3942 /*if(self.hasClass('range-led') === true) { 3943 3944 3945 }*/ 3946 3947 self.on('mousedown', '.axis-pin', function(e) { 3948 if(e.button === 2) { 3949 return false; 3950 } 3951 3952 var parents = $(this).parents('.sf-form-range'); 3953 var slider_width = parents.outerWidth(); 3954 var slider_offset = parents.offset().left; 3955 var check_range = parents.find('input[type="range"]').is(':disabled'); 3956 3957 if(check_range === true) { 3958 return false; 3959 } 3960 3961 if(parents.hasClass('range-led') === true) { 3962 $(this).addClass('is-active'); 3963 } 3964 var handlers = { 3965 mousemove: function(e) { 3966 var slider_new_width = e.pageX - slider_offset; 3967 3968 if(slider_new_width <= slider_width && !(slider_new_width < '0')) { 3969 slider_move(parents, slider_new_width, slider_width); 3970 } 3971 }, 3972 mouseup: function(e) { 3973 $(this).off(handlers); 3974 3975 if(parents.hasClass('range-led') === true) { 3976 parents.find('.is-active').removeClass('is-active'); 3977 } 3978 } 3979 }; 3980 $(document).on(handlers); 3981 }); 3982 3983 self.on('mousedown', '.axis', function(e) { 3984 if(e.button === 2) { 3985 return false; 3986 } 3987 3988 var parents = $(this).parents('.sf-form-range'); 3989 var slider_width = parents.outerWidth(); 3990 var slider_offset = parents.offset().left; 3991 var check_range = parents.find('input[type="range"]').is(':disabled'); 3992 3993 if(check_range === true) { 3994 return false; 3995 } 3996 3997 var slider_new_width = e.pageX - slider_offset; 3998 if(slider_new_width <= slider_width && !(slider_new_width < '0')) { 3999 slider_move(parents, slider_new_width, slider_width); 4000 } 4001 4002 var handlers = { 4003 mouseup: function(e) { 4004 $(this).off(handlers); 4005 } 4006 }; 4007 $(document).on(handlers); 4008 4009 }); 4010 }; 4011 4012 function sliderContinuous_tmplt() { 4013 var tmplt = '<div class="axis">' + 4014 '<div class="axis-segment"></div>' + 4015 '<div class="axis-pin"></div>' + 4016 '</div>'; 4017 4018 return tmplt; 4019 } 4020 function sliderDiscrete_tmplt() { 4021 var tmplt = '<div class="axis">' + 4022 '<div class="axis-segment"></div>' + 4023 '<div class="axis-pin"><div class="axis-count"><span>0</span></div></div>' + 4024 '</div>'; 4025 4026 return tmplt; 4027 } 4028 function slider_move(parents, newW, sliderW) { 4029 var slider_new_val = parseInt(Math.round(newW / sliderW * 100)); 4030 4031 var slider_fill = parents.find('.axis-segment'); 4032 var slider_handle = parents.find('.axis-pin'); 4033 var range = parents.find('input[type="range"]'); 4034 4035 slider_fill.css('width', slider_new_val +'%'); 4036 slider_handle.css({ 4037 'left': slider_new_val +'%', 4038 'transition': 'none', 4039 '-webkit-transition': 'none', 4040 '-moz-transition': 'none' 4041 }); 4042 4043 range.val(slider_new_val); 4044 4045 if(parents.hasClass('range-led') === true) { 4046 parents.find('.axis-pin span').text(slider_new_val); 4047 } 4048 } 4049 4050}(jQuery)); 4051 4052 4053$(document).ready(function() { 4054 var el = document.body.querySelectorAll('.sf-form-range'); 4055 if(el.length > 0) 4056 $('.sf-form-range').rkmd_rangeSlider(); 4057}); 4058'use strict'; 4059 4060/** ***************** 4061* File input * 4062******************/ 4063/*(function ($) { 4064 4065 4066 $(document).on('change', '.sf-form-file-input', function (e) { 4067 var $this = $(e.target); 4068 var $file_field = $this.closest('.file-field'); 4069 var $path_input = $file_field.find('input.file-path'); 4070 var files = $this[0].files; 4071 var file_names = []; 4072 4073 for (var i = 0; i < files.length; i++) { 4074 var file_name = files[i].name; 4075 file_names.push(file_name); 4076 } 4077 4078 $path_input.val(file_names.join(', ')); 4079 $path_input.trigger('change'); 4080 }); 4081})(jQuery);*/ 4082 4083window.addEventListener("DOMContentLoaded", function(e) { 4084 var sf_file = document.querySelectorAll('.sf-form-file-input'); 4085 if(sf_file) { 4086 for(var k = 0; k < sf_file.length; k++) { 4087 var el = sf_file[k]; 4088 if(el) { 4089 el.addEventListener('change', function(e) { 4090 var el = e.currentTarget, 4091 files = el.files, 4092 label = el.nextElementSibling, 4093 strFile = []; 4094 4095 for(var k = 0; k < files.length; k++) strFile.push(files[k].name); 4096 4097 if(label) { 4098 if(strFile.length > 0) { 4099 if(label.tagName == "INPUT") 4100 label.setAttribute('value', strFile.join(', ')); 4101 else { 4102 label.value = strFile.join(', '); 4103 label.style.height = label.scrollHeight + 'px'; 4104 } 4105 label.classList.add('active') 4106 } 4107 } 4108 }) 4109 } 4110 } 4111 } 4112}) 4113'use strict'; 4114 4115/* CHARACTER COUNTER */ 4116 4117(function ($) { 4118 4119 $.fn.characterCounter = function () { 4120 return this.each(function () { 4121 4122 var itHasLengthAttribute = $(this).attr('length') !== undefined; 4123 4124 if (itHasLengthAttribute) { 4125 $(this).on('input', updateCounter); 4126 $(this).on('focus', updateCounter); 4127 $(this).on('blur', removeCounterElement); 4128 4129 addCounterElement($(this)); 4130 } 4131 }); 4132 }; 4133 4134 function updateCounter() { 4135 var maxLength = Number($(this).attr('length')); 4136 var actualLength = Number($(this).val().length); 4137 var isValidLength = actualLength <= maxLength; 4138 4139 $(this).parent().find('span[class="character-counter"]').html(actualLength + '/' + maxLength); 4140 4141 addInputStyle(isValidLength, $(this)); 4142 } 4143 4144 function addCounterElement($input) { 4145 var $counterElement = $('<span/>').addClass('character-counter').css('float', 'right').css('font-size', '12px').css('height', 1); 4146 4147 $input.parent().append($counterElement); 4148 } 4149 4150 function removeCounterElement() { 4151 $(this).parent().find('span[class="character-counter"]').html(''); 4152 } 4153 4154 function addInputStyle(isValidLength, $input) { 4155 var inputHasInvalidClass = $input.hasClass('invalid'); 4156 if (isValidLength && inputHasInvalidClass) { 4157 $input.removeClass('invalid'); 4158 } else if (!isValidLength && !inputHasInvalidClass) { 4159 $input.removeClass('valid'); 4160 $input.addClass('invalid'); 4161 } 4162 } 4163 4164 $(document).ready(function () { 4165 $('input, textarea').characterCounter(); 4166 }); 4167})(jQuery); 4168'use strict'; 4169 4170/*(function ($) { 4171 4172 $.fn.material_select = function (callback) { 4173 $(this).each(function () { 4174 var $select = $(this); 4175 4176 if ($select.hasClass('browser-default')) { 4177 return; // Continue to next (return false breaks out of entire loop) 4178 } 4179 4180 var multiple = Boolean($select.attr('multiple')), 4181 lastID = $select.data('select-id'); // Tear down structure if Select needs to be rebuilt 4182 4183 if (lastID) { 4184 $select.parent().find('span.caret').remove(); 4185 $select.parent().find('input').remove(); 4186 4187 $select.unwrap(); 4188 $('ul#select-options-' + lastID).remove(); 4189 } 4190 4191 // If destroying the select, remove the selelct-id and reset it to it's uninitialized state. 4192 if (callback === 'destroy') { 4193 $select.data('select-id', null).removeClass('initialized'); 4194 return; 4195 } 4196 4197 var uniqueID = guid(); // Materialize.guid(); 4198 $select.data('select-id', uniqueID);
4199 var wrapper = $('<div class="select-wrapper"></div>'); 4200 wrapper.addClass($select.attr('class')); 4201 var options = $('<ul id="select-options-' + uniqueID + '" class="dropdown-content select-dropdown ' + (multiple ? 'multiple-select-dropdown' : '') + '"></ul>'), 4202 selectChildren = $select.children('option, optgroup'), 4203 valuesSelected = [], 4204 optionsHover = false; 4205 4206 var label = $select.find('option:selected').html() || $select.find('option:first').html() || ''; 4207 4208 // Added to search 4209 var applySeachInList = function applySeachInList() { 4210 4211 var ul = $(this).closest('ul'); 4212 var searchValue = $(this).val(); 4213 var options = ul.find('li').find('span.filtrable'); 4214 4215 options.each(function () { 4216 if (typeof this.outerHTML === 'string') { 4217 var liValue = this.textContent.toLowerCase(); 4218 4219 if (liValue.indexOf(searchValue.toLowerCase()) === -1) { 4220 $(this).hide(); 4221 $(this).parent().hide(); 4222 } else { 4223 $(this).show(); 4224 $(this).parent().show(); 4225 } 4226 } 4227 }); 4228 }; 4229 4230 // Added to search 4231 var setSearchableOption = function setSearchableOption() { 4232 var placeholder = $select.attr('searchable'); 4233 var element = $('<span class="search-wrap"><div class="md-form"><input type="text" class="search form-control" placeholder="' + placeholder + '"></div></span>'); 4234 options.append(element); 4235 element.find('.search').keyup(applySeachInList); 4236 }; 4237 4238 // Added to search 4239 var searchable = Boolean($select.attr('searchable')); 4240 4241 // Added to search 4242 if (searchable) { 4243 setSearchableOption(); 4244 } 4245 4246 // Function that renders and appends the option taking into 4247 // account type and possible image icon. 4248 var appendOptionWithIcon = function appendOptionWithIcon(select, option, type) { 4249 // Add disabled attr if disabled 4250 var disabledClass = option.is(':disabled') ? 'disabled ' : ''; 4251 var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : ''; 4252 4253 // add icons 4254 var icon_url = option.data('icon'); 4255 var classes = option.attr('class'); 4256 if (icon_url) { 4257 var classString = ''; 4258 if (classes) { 4259 classString = ' class="' + classes + '"'; 4260 } 4261 4262 // Check for multiple type. 4263 if (type === 'multiple') { 4264 options.append($('<li class="' + disabledClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span class="filtrable"><input class="form-check-input" type="checkbox"' + disabledClass + '/><label></label>' + option.html() + '</span></li>')); 4265 } else { 4266 options.append($('<li class="' + disabledClass + optgroupClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span class="filtrable">' + option.html() + '</span></li>')); 4267 } 4268 return true; 4269 } 4270 4271 // Check for multiple type. 4272 if (type === 'multiple') { 4273 options.append($('<li class="' + disabledClass + '"><span class="filtrable"><input class="form-check-input" type="checkbox"' + disabledClass + '/><label></label>' + option.html() + '</span></li>')); 4274 } else { 4275 options.append($('<li class="' + disabledClass + optgroupClass + '"><span class="filtrable">' + option.html() + '</span></li>')); 4276 } 4277 }; 4278 4279 if (selectChildren.length) { 4280 selectChildren.each(function () { 4281 if ($(this).is('option')) { 4282 // Direct descendant option. 4283 if (multiple) { 4284 appendOptionWithIcon($select, $(this), 'multiple'); 4285 } else { 4286 appendOptionWithIcon($select, $(this)); 4287 } 4288 } else if ($(this).is('optgroup')) { 4289 // Optgroup. 4290 var selectOptions = $(this).children('option'); 4291 options.append($('<li class="optgroup"><span>' + $(this).attr('label') + '</span></li>')); 4292 4293 selectOptions.each(function () { 4294 appendOptionWithIcon($select, $(this), 'optgroup-option'); 4295 }); 4296 } 4297 }); 4298 } 4299 4300 // Check for optgroups 4301 var optgroup = false;
4302 if ($select.find('optgroup').length) { 4303 optgroup = true; 4304 } 4305 4306 // Added to save 4307 var saveSelect = $select.parent().find('button.btn-save'); 4308 var setSaveOption = function setSaveOption() { 4309 options.append(saveSelect); 4310 }; 4311 4312 // Save click trigger 4313 if (saveSelect.length) { 4314 setSaveOption(); 4315 saveSelect.on('click', function () { 4316 $('input.select-dropdown').trigger('close'); 4317 }); 4318 } 4319 4320 options.find('li:not(.optgroup)').each(function (i) { 4321 $(this).click(function (e) { 4322 // Check if option element is disabled 4323 if (!$(this).hasClass('disabled') && !$(this).hasClass('optgroup')) { 4324 var selected = true; 4325 4326 if (multiple) { 4327 $('input[type="checkbox"]', this).prop('checked', function (i, v) { 4328 return !v; 4329 }); 4330 if (searchable) { 4331 if (optgroup) { 4332 selected = toggleEntryFromArray(valuesSelected, $(this).index() - $(this).prevAll('.optgroup').length - 1, $select); 4333 } else { 4334 selected = toggleEntryFromArray(valuesSelected, $(this).index() - 1, $select); 4335 } 4336 } else if (optgroup) { 4337 selected = toggleEntryFromArray(valuesSelected, $(this).index() - $(this).prevAll('.optgroup').length, $select); 4338 } else { 4339 selected = toggleEntryFromArray(valuesSelected, $(this).index(), $select); 4340 } 4341 $newSelect.trigger('focus'); 4342 } else { 4343 options.find('li').removeClass('active'); 4344 $(this).toggleClass('active'); 4345 $newSelect.val($(this).text()); 4346 } 4347 4348 activateOption(options, $(this)); 4349 $select.find('option').eq(i).prop('selected', selected); 4350 // Trigger onchange() event 4351 $select.trigger('change'); 4352 if (typeof callback !== 'undefined') { 4353 callback(); 4354 } 4355 } 4356 4357 e.stopPropagation(); 4358 }); 4359 }); 4360 4361 // Wrap Elements 4362 $select.wrap(wrapper); 4363 // Add Select Display Element 4364 var dropdownIcon = $('<span class="caret">▼</span>'); 4365 if ($select.is(':disabled')) { 4366 dropdownIcon.addClass('disabled'); 4367 } 4368 4369 // escape double quotes 4370 var sanitizedLabelHtml = label.replace(/"/g, '"'); 4371 4372 var $newSelect = $('<input type="text" class="select-dropdown" readonly="true" ' + ($select.is(':disabled') ? 'disabled' : '') + ' data-activates="select-options-' + uniqueID + '" value="' + sanitizedLabelHtml + '"/>'); 4373 $select.before($newSelect); 4374 $newSelect.before(dropdownIcon); 4375 4376 $newSelect.after(options); 4377 // Check if section element is disabled 4378 if (!$select.is(':disabled')) { 4379 $newSelect.dropdown({ 4380 hover: false, 4381 closeOnClick: false 4382 }); 4383 } 4384 4385 // Copy tabindex 4386 if ($select.attr('tabindex')) { 4387 $($newSelect[0]).attr('tabindex', $select.attr('tabindex')); 4388 } 4389 4390 $select.addClass('initialized'); 4391 4392 $newSelect.on({ 4393 focus: function focus() { 4394 if ($('ul.select-dropdown').not(options[0]).is(':visible')) { 4395 $('input.select-dropdown').trigger('close'); 4396 } 4397 if (!options.is(':visible')) { 4398 $(this).trigger('open', ['focus']); 4399 var _label = $(this).val(); 4400 var selectedOption = options.find('li').filter(function () { 4401 return $(this).text().toLowerCase() === _label.toLowerCase(); 4402 })[0]; 4403 activateOption(options, selectedOption); 4404 } 4405 }, 4406 click: function click(e) { 4407 e.stopPropagation(); 4408 } 4409 }); 4410 4411 // Changed to search to treat search 4412 $newSelect.on('blur', function () { 4413 4414 if (!multiple && !searchable) { 4415 $(this).trigger('close'); 4416 } 4417 options.find('li.selected').removeClass('selected'); 4418 }); 4419 4420 // Added to search 4421 if (!multiple && searchable) { 4422 options.find('li').on('click', function () { 4423 $newSelect.trigger('close'); 4424 }); 4425 } 4426 4427 options.hover(function () { 4428 optionsHover = true; 4429 }, function () { 4430 optionsHover = false;
4431 }); 4432 4433 // if select is wrapped in modal prevent hiding 4434 options.on('mousedown', function (e) { 4435 if ($('.modal-content').find(options).length) { 4436 if (this.scrollHeight > this.offsetHeight) { 4437 e.preventDefault(); 4438 } 4439 } 4440 }); 4441 4442 // Changed to search to treat search 4443 $(window).on({ 4444 click: function click() { 4445 (multiple || searchable) && (optionsHover || $newSelect.trigger('close')); 4446 } 4447 }); 4448 4449 // Add initial multiple selections. 4450 if (multiple) { 4451 $select.find('option:selected:not(:disabled)').each(function () { 4452 var index = $(this).index(); 4453 4454 toggleEntryFromArray(valuesSelected, index, $select); 4455 options.find('li').eq(index).find(':checkbox').prop('checked', true); 4456 }); 4457 } 4458 4459 // Make option as selected and scroll to selected position 4460 var activateOption = function activateOption(collection, newOption) { 4461 if (newOption) { 4462 collection.find('li.selected').removeClass('selected'); 4463 var option = $(newOption); 4464 option.addClass('selected'); 4465 // commented because it causes problems in multiselect with many options 4466 // options.scrollTo(option) 4467 } 4468 }; 4469 4470 // Allow user to search by typing 4471 // this array is cleared after 1 second 4472 var filterQuery = [], 4473 onKeyDown = function onKeyDown(e) { 4474 // TAB - switch to another input 4475 if (e.which == 9) { 4476 $newSelect.trigger('close'); 4477 return; 4478 } 4479 4480 // ARROW DOWN WHEN SELECT IS CLOSED - open select options 4481 if (e.which == 40 && !options.is(':visible')) { 4482 $newSelect.trigger('open'); 4483 return; 4484 } 4485 4486 // ENTER WHEN SELECT IS CLOSED - submit form 4487 if (e.which == 13 && !options.is(':visible')) { 4488 return; 4489 } 4490 4491 e.preventDefault(); 4492 4493 // CASE WHEN USER TYPE LETTERS 4494 var letter = String.fromCharCode(e.which).toLowerCase(), 4495 nonLetters = [9, 13, 27, 38, 40]; 4496 if (letter && nonLetters.indexOf(e.which) === -1) { 4497 filterQuery.push(letter); 4498 4499 var string = filterQuery.join(''), 4500 newOption = options.find('li').filter(function () { 4501 return $(this).text().toLowerCase().indexOf(string) === 0; 4502 })[0]; 4503 4504 if (newOption) { 4505 activateOption(options, newOption); 4506 } 4507 } 4508 4509 // ENTER - select option and close when select options are opened 4510 if (e.which == 13) { 4511 var activeOption = options.find('li.selected:not(.disabled)')[0]; 4512 if (activeOption) { 4513 $(activeOption).trigger('click'); 4514 if (!multiple) { 4515 $newSelect.trigger('close'); 4516 } 4517 } 4518 } 4519 4520 // ARROW DOWN - move to next not disabled option 4521 if (e.which == 40) { 4522 if (options.find('li.selected').length) { 4523 newOption = options.find('li.selected').next('li:not(.disabled)')[0]; 4524 } else { 4525 newOption = options.find('li:not(.disabled)')[0]; 4526 } 4527 activateOption(options, newOption); 4528 } 4529 4530 // ESC - close options 4531 if (e.which == 27) { 4532 $newSelect.trigger('close'); 4533 } 4534 4535 // ARROW UP - move to previous not disabled option 4536 if (e.which == 38) { 4537 newOption = options.find('li.selected').prev('li:not(.disabled)')[0]; 4538 if (newOption) { 4539 activateOption(options, newOption); 4540 } 4541 } 4542 4543 // Automaticaly clean filter query so user can search again by starting letters 4544 setTimeout(function () { 4545 filterQuery = []; 4546 }, 1000); 4547 }; 4548 4549 $newSelect.on('keydown', onKeyDown); 4550 }); 4551 4552 function toggleEntryFromArray(entriesArray, entryIndex, select) { 4553 var index = entriesArray.indexOf(entryIndex), 4554 notAdded = index === -1; 4555 4556 if (notAdded) { 4557 entriesArray.push(entryIndex); 4558 } else { 4559 entriesArray.splice(index, 1); 4560 } 4561 4562 select.siblings('ul.dropdown-content').find('li:not(.optgroup)').eq(entryIndex).toggleClass('active'); 4563 4564 // use notAdded instead of true (to detect if the option is selected or not) 4565 select.find('option').eq(entryIndex).prop('selected', notAdded); 4566 setValueToInput(entriesArray, select); 4567 4568 return notAdded; 4569 } 4570 4571 function setValueToInput(entriesArray, select) { 4572 var value = ''; 4573 4574 for (var i = 0, count = entriesArray.length; i < count; i++) { 4575 var text = select.find('option').eq(entriesArray[i]).text(); 4576 4577 i === 0 ? value += text : value += ', ' + text; 4578 } 4579 4580 if (value === '') { 4581 value = select.find('option:disabled').eq(0).text(); 4582 } 4583 4584 select.siblings('input.select-dropdown').val(value); 4585 } 4586 // }; 4587 4588 function guid() { 4589 var d = new Date().getTime(); 4590 var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 4591 var r = (d + Math.random() * 16) % 16 | 0; 4592 d = Math.floor(d / 16); 4593 return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); 4594 }); 4595 return uuid; 4596 } 4597 }; 4598 4599 4600 4601})(jQuery); 4602 4603jQuery('select').siblings('input.select-dropdown').on('mousedown', function (e) { 4604 if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { 4605 if (e.clientX >= e.target.clientWidth || e.clientY >= e.target.clientHeight) { 4606 e.preventDefault(); 4607 } 4608 } 4609}); 4610 4611$(document).ready(function() { 4612 $('.mdb-select').material_select(); 4613});*/ 4614 4615window.addEventListener('DOMContentLoaded', function(e) { 4616 var x, i, j, selElmnt, a, b, c; 4617/*look for any elements with the class "custom-select":*/ 4618x = document.getElementsByClassName("sf-form-select"); 4619 4620for (i = 0; i < x.length; i++) { 4621 selElmnt = x[i].getElementsByTagName("select")[0]; 4622 /*for each element, create a new DIV that will act as the selected item:*/ 4623 a = x[i].querySelector('label'); 4624 //a.setAttribute("class", "select-selected"); 4625 a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML; 4626 //x[i].appendChild(a); 4627 /*for each element, create a new DIV that will contain the option list:*/ 4628 b = document.createElement("DIV"); 4629 b.setAttribute("class", "select-items inactive"); 4630 for (j = 0; j < selElmnt.length; j++) { 4631 /*for each option in the original select element, 4632 create a new DIV that will act as an option item:*/ 4633 c = document.createElement("DIV"); 4634 c.innerHTML = selElmnt.options[j].innerHTML; 4635 4636 c.addEventListener("click", function(e) { 4637 /*when an item is clicked, update the original select box, 4638 and the selected item:*/ 4639 var y, i, k, s, h; 4640 s = this.parentNode.parentNode.getElementsByTagName("select")[0]; 4641 h = this.parentNode.parentNode.querySelector('label'); 4642 for (i = 0; i < s.length; i++) { 4643 if (s.options[i].innerHTML == this.innerHTML) { 4644 s.selectedIndex = i; 4645 h.innerHTML = this.innerHTML; 4646 y = this.parentNode.getElementsByClassName("same-as-selected"); 4647 for (k = 0; k < y.length; k++) { 4648 y[k].removeAttribute("class"); 4649 } 4650 this.setAttribute("class", "same-as-selected"); 4651 break; 4652 } 4653 } 4654 h.click(); 4655 }); 4656 b.appendChild(c); 4657 } 4658 x[i].appendChild(b); 4659 4660 a.addEventListener("click", function(e) { 4661 e.stopPropagation(); 4662 var slc = this.parentNode.querySelector('.select-items'); 4663 if(slc.classList.contains('inactive')) 4664 slc.classList.remove("inactive"); 4665 else slc.classList.add('inactive') 4666 this.classList.toggle("active"); 4667 this.parentNode.toggle('active'); 4668 }); 4669} 4670function closeAllSelect(e) { 4671 var allslc = document.body.querySelectorAll('.sf-form-select'); 4672 4673 if(e.target.parentNode !== null) 4674 var _this = e.target.parentNode.querySelector('label'); 4675 4676 for(var k = 0; k < allslc.length; k++) { 4677 var slc = allslc[k], 4678 label = slc.querySelector('label'), 4679 opt = slc.querySelector('.select-items'); 4680 if(label != _this) { 4681 label.classList.remove('active'); 4682 opt.classList.add('inactive'); 4683 } 4684 } 4685} 4686document.addEventListener("click", closeAllSelect); 4687}); 4688Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; 4689 4690 function _defineProperties(target, props) { 4691 for (var i = 0; i < props.length; i++) { 4692 var descriptor = props[i]; 4693 descriptor.enumerable = descriptor.enumerable || false; 4694 descriptor.configurable = true; 4695 if ("value" in descriptor) descriptor.writable = true; 4696 Object.defineProperty(target, descriptor.key, descriptor); 4697 } 4698 } 4699 4700 function _createClass(Constructor, protoProps, staticProps) { 4701 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 4702 if (staticProps) _defineProperties(Constructor, staticProps); 4703 return Constructor; 4704 } 4705 4706 function _defineProperty(obj, key, value) { 4707 if (key in obj) { 4708 Object.defineProperty(obj, key, { 4709 value: value, 4710 enumerable: true, 4711 configurable: true, 4712 writable: true 4713 }); 4714 } else { 4715 obj[key] = value; 4716 } 4717 4718 return obj; 4719 } 4720 4721 function _objectSpread(target) { 4722 for (var i = 1; i < arguments.length; i++) { 4723 var source = arguments[i] != null ? arguments[i] : {}; 4724 var ownKeys = Object.keys(source); 4725 4726 if (typeof Object.getOwnPropertySymbols === 'function') { 4727 ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { 4728 return Object.getOwnPropertyDescriptor(source, sym).enumerable; 4729 })); 4730 } 4731 4732 ownKeys.forEach(function (key) { 4733 _defineProperty(target, key, source[key]); 4734 }); 4735 } 4736 4737 return target; 4738 } 4739 4740 function _inheritsLoose(subClass, superClass) { 4741 subClass.prototype = Object.create(superClass.prototype); 4742 subClass.prototype.constructor = subClass; 4743 subClass.__proto__ = superClass; 4744 } 4745/** 4746 * -------------------------------------------------------------------------- 4747 * Bootstrap (v4.3.1): util/index.js 4748 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 4749 * -------------------------------------------------------------------------- 4750 */ 4751 var MAX_UID = 1000000; 4752 var MILLISECONDS_MULTIPLIER = 1000; 4753 var TRANSITION_END = 'transitionend'; 4754 var _window = window, 4755 jQuery = _window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp) 4756 4757 var toType = function toType(obj) { 4758 return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); 4759 }; 4760 /** 4761 * -------------------------------------------------------------------------- 4762 * Public Util Api 4763 * -------------------------------------------------------------------------- 4764 */ 4765 4766 4767 var getUID = function getUID(prefix) { 4768 do { 4769 // eslint-disable-next-line no-bitwise 4770 prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here 4771 } while (document.getElementById(prefix)); 4772 4773 return prefix; 4774 }; 4775 4776 var getSelectorFromElement = function getSelectorFromElement(element) { 4777 var selector = element.getAttribute('data-target'); 4778 4779 if (!selector || selector === '#') { 4780 var hrefAttr = element.getAttribute('href'); 4781 selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; 4782 } 4783 4784 try { 4785 return document.querySelector(selector) ? selector : null; 4786 } catch (error) { 4787 return null; 4788 } 4789 }; 4790 4791 var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) { 4792 if (!element) { 4793 return 0; 4794 } // Get transition-duration of the element 4795 4796 4797 var _window$getComputedSt = window.getComputedStyle(element), 4798 transitionDuration = _window$getComputedSt.transitionDuration, 4799 transitionDelay = _window$getComputedSt.transitionDelay; 4800 4801 var floatTransitionDuration = parseFloat(transitionDuration); 4802 var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found 4803 4804 if (!floatTransitionDuration && !floatTransitionDelay) { 4805 return 0; 4806 } // If multiple durations are defined, take the first 4807 4808 4809 transitionDuration = transitionDuration.split(',')[0]; 4810 transitionDelay = transitionDelay.split(',')[0]; 4811 return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 4812 }; 4813 4814 var triggerTransitionEnd = function triggerTransitionEnd(element) { 4815 element.dispatchEvent(new Event(TRANSITION_END)); 4816 }; 4817 4818 var isElement = function isElement(obj) { 4819 return (obj[0] || obj).nodeType; 4820 }; 4821 4822 var emulateTransitionEnd = function emulateTransitionEnd(element, duration) { 4823 var called = false;
4824 var durationPadding = 5; 4825 var emulatedDuration = duration + durationPadding; 4826 4827 function listener() { 4828 called = true; 4829 element.removeEventListener(TRANSITION_END, listener); 4830 } 4831 4832 element.addEventListener(TRANSITION_END, listener); 4833 setTimeout(function () { 4834 if (!called) { 4835 triggerTransitionEnd(element); 4836 } 4837 }, emulatedDuration); 4838 }; 4839 4840 var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { 4841 Object.keys(configTypes).forEach(function (property) { 4842 var expectedTypes = configTypes[property]; 4843 var value = config[property]; 4844 var valueType = value && isElement(value) ? 'element' : toType(value); 4845 4846 if (!new RegExp(expectedTypes).test(valueType)) { 4847 throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); 4848 } 4849 }); 4850 }; 4851 4852 var makeArray = function makeArray(nodeList) { 4853 if (!nodeList) { 4854 return []; 4855 } 4856 4857 return [].slice.call(nodeList); 4858 }; 4859 4860 var isVisible = function isVisible(element) { 4861 if (!element) { 4862 return false; 4863 } 4864 4865 if (element.style && element.parentNode && element.parentNode.style) { 4866 return element.style.display !== 'none' && element.parentNode.style.display !== 'none' && element.style.visibility !== 'hidden'; 4867 } 4868 4869 return false; 4870 }; 4871 4872 var findShadowRoot = function findShadowRoot(element) { 4873 if (!document.documentElement.attachShadow) { 4874 return null; 4875 } // Can find the shadow root otherwise it'll return the document 4876 4877 4878 if (typeof element.getRootNode === 'function') { 4879 var root = element.getRootNode(); 4880 return root instanceof ShadowRoot ? root : null; 4881 } 4882 4883 if (element instanceof ShadowRoot) { 4884 return element; 4885 } // when we don't find a shadow root 4886 4887 4888 if (!element.parentNode) { 4889 return null; 4890 } 4891 4892 return findShadowRoot(element.parentNode); 4893 }; // eslint-disable-next-line no-empty-function 4894 4895 4896 var noop = function noop() { 4897 return function () {}; 4898 }; 4899 4900 var reflow = function reflow(element) { 4901 return element.offsetHeight; 4902 }; 4903/** 4904 * -------------------------------------------------------------------------- 4905 * Bootstrap (v4.3.1): dom/data.js 4906 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 4907 * -------------------------------------------------------------------------- 4908 */ 4909 4910 /** 4911 * ------------------------------------------------------------------------ 4912 * Constants 4913 * ------------------------------------------------------------------------ 4914 */ 4915 var mapData = function () { 4916 var storeData = {}; 4917 var id = 1; 4918 return { 4919 set: function set(element, key, data) { 4920 if (typeof element.key === 'undefined') { 4921 element.key = { 4922 key: key, 4923 id: id 4924 }; 4925 id++; 4926 } 4927 4928 storeData[element.key.id] = data; 4929 }, 4930 get: function get(element, key) { 4931 if (!element || typeof element.key === 'undefined') { 4932 return null; 4933 } 4934 4935 var keyProperties = element.key; 4936 4937 if (keyProperties.key === key) { 4938 return storeData[keyProperties.id]; 4939 } 4940 4941 return null; 4942 }, 4943 delete: function _delete(element, key) { 4944 if (typeof element.key === 'undefined') { 4945 return; 4946 } 4947 4948 var keyProperties = element.key; 4949 4950 if (keyProperties.key === key) { 4951 delete storeData[keyProperties.id]; 4952 delete element.key; 4953 } 4954 } 4955 }; 4956 }(); 4957 4958 var Data = { 4959 setData: function setData(instance, key, data) { 4960 mapData.set(instance, key, data); 4961 }, 4962 getData: function getData(instance, key) { 4963 return mapData.get(instance, key); 4964 }, 4965 removeData: function removeData(instance, key) { 4966 mapData.delete(instance, key); 4967 } 4968 }; 4969/** 4970 * -------------------------------------------------------------------------- 4971 * Bootstrap (v4.3.1): dom/polyfill.js 4972 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 4973 * -------------------------------------------------------------------------- 4974 */ 4975 /* istanbul ignore next */ 4976 4977 var Polyfill = function () { 4978 // MSEdge resets defaultPrevented flag upon dispatchEvent call if at least one listener is attached
4979 var defaultPreventedPreservedOnDispatch = function () { 4980 var e = new CustomEvent('Bootstrap', { 4981 cancelable: true 4982 }); 4983 var element = document.createElement('div'); 4984 element.addEventListener('Bootstrap', function () { 4985 return null; 4986 }); 4987 e.preventDefault(); 4988 element.dispatchEvent(e); 4989 return e.defaultPrevented; 4990 }(); 4991 4992 var find = Element.prototype.querySelectorAll; 4993 var findOne = Element.prototype.querySelector; 4994 var scopeSelectorRegex = /:scope\b/; 4995 4996 var supportScopeQuery = function () { 4997 var element = document.createElement('div'); 4998 4999 try { 5000 element.querySelectorAll(':scope *'); 5001 } catch (error) { 5002 return false; 5003 } 5004 5005 return true; 5006 }(); 5007 5008 if (!supportScopeQuery) { 5009 find = function find(selector) { 5010 if (!scopeSelectorRegex.test(selector)) { 5011 return this.querySelectorAll(selector); 5012 } 5013 5014 var hasId = Boolean(this.id); 5015 5016 if (!hasId) { 5017 this.id = getUID('scope'); 5018 } 5019 5020 var nodeList = null; 5021 5022 try { 5023 selector = selector.replace(scopeSelectorRegex, "#" + this.id); 5024 nodeList = this.querySelectorAll(selector); 5025 } finally { 5026 if (!hasId) { 5027 this.removeAttribute('id'); 5028 } 5029 } 5030 5031 return nodeList; 5032 }; 5033 5034 findOne = function findOne(selector) { 5035 if (!scopeSelectorRegex.test(selector)) { 5036 return this.querySelector(selector); 5037 } 5038 5039 var matches = find.call(this, selector); 5040 5041 if (typeof matches[0] !== 'undefined') { 5042 return matches[0]; 5043 } 5044 5045 return null; 5046 }; 5047 } 5048 5049 return { 5050 defaultPreventedPreservedOnDispatch: defaultPreventedPreservedOnDispatch, 5051 find: find, 5052 findOne: findOne 5053 }; 5054 }(); 5055/** 5056 * -------------------------------------------------------------------------- 5057 * Bootstrap (v4.3.1): dom/eventHandler.js 5058 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5059 * -------------------------------------------------------------------------- 5060 */ 5061 /** 5062 * ------------------------------------------------------------------------ 5063 * Constants 5064 * ------------------------------------------------------------------------ 5065 */ 5066 5067 var namespaceRegex = /[^.]*(?=\..*)\.|.*/; 5068 var stripNameRegex = /\..*/; 5069 var keyEventRegex = /^key/; 5070 var stripUidRegex = /::\d+$/; 5071 var eventRegistry = {}; // Events storage 5072 5073 var uidEvent = 1; 5074 var customEvents = { 5075 mouseenter: 'mouseover', 5076 mouseleave: 'mouseout' 5077 }; 5078 var nativeEvents = ['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']; 5079 /** 5080 * ------------------------------------------------------------------------ 5081 * Private methods 5082 * ------------------------------------------------------------------------ 5083 */ 5084 5085 function getUidEvent(element, uid) { 5086 return uid && uid + "::" + uidEvent++ || element.uidEvent || uidEvent++; 5087 } 5088 5089 function getEvent(element) { 5090 var uid = getUidEvent(element); 5091 element.uidEvent = uid; 5092 eventRegistry[uid] = eventRegistry[uid] || {}; 5093 return eventRegistry[uid]; 5094 } 5095 5096 function fixEvent(event, element) { 5097 // Add which for key events 5098 if (event.which === null && keyEventRegex.test(event.type)) { 5099 event.which = event.charCode === null ? event.keyCode : event.charCode; 5100 } 5101 5102 event.delegateTarget = element; 5103 } 5104 5105 function bootstrapHandler(element, fn) { 5106 return function handler(event) { 5107 fixEvent(event, element); 5108 5109 if (handler.oneOff) { 5110 EventHandler.off(element, event.type, fn); 5111 } 5112 5113 return fn.apply(element, [event]); 5114 }; 5115 } 5116 5117 function bootstrapDelegationHandler(element, selector, fn) { 5118 return function handler(event) { 5119 var domElements = element.querySelectorAll(selector); 5120 5121 for (var target = event.target; target && target !== this; target = target.parentNode) { 5122 for (var i = domElements.length; i--;) { 5123 if (domElements[i] === target) { 5124 fixEvent(event, target); 5125 5126 if (handler.oneOff) { 5127 EventHandler.off(element, event.type, fn); 5128 } 5129 5130 return fn.apply(target, [event]); 5131 } 5132 } 5133 } // To please ESLint 5134 5135 5136 return null; 5137 }; 5138 } 5139 5140 function findHandler(events, handler, delegationSelector) { 5141 if (delegationSelector === void 0) { 5142 delegationSelector = null; 5143 } 5144 5145 var uidList = Object.keys(events); 5146 5147 for (var i = 0; i < uidList.length; i++) { 5148 var uid = uidList[i]; 5149 var event = events[uid]; 5150 5151 if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { 5152 return events[uid]; 5153 } 5154 } 5155 5156 return null; 5157 } 5158 5159 function normalizeParams(originalTypeEvent, handler, delegationFn) { 5160 var delegation = typeof handler === 'string'; 5161 var originalHandler = delegation ? delegationFn : handler; // allow to get the native events from namespaced events ('click.bs.button' --> 'click') 5162 5163 var typeEvent = originalTypeEvent.replace(stripNameRegex, ''); 5164 var custom = customEvents[typeEvent]; 5165 5166 if (custom) { 5167 typeEvent = custom; 5168 } 5169 5170 var isNative = nativeEvents.indexOf(typeEvent) > -1; 5171 5172 if (!isNative) { 5173 typeEvent = originalTypeEvent; 5174 } 5175 5176 return [delegation, originalHandler, typeEvent]; 5177 } 5178 5179 function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) { 5180 if (typeof originalTypeEvent !== 'string' || !element) { 5181 return; 5182 } 5183 5184 if (!handler) { 5185 handler = delegationFn; 5186 delegationFn = null; 5187 } 5188 5189 var _normalizeParams = normalizeParams(originalTypeEvent, handler, delegationFn), 5190 delegation = _normalizeParams[0], 5191 originalHandler = _normalizeParams[1], 5192 typeEvent = _normalizeParams[2]; 5193 5194 var events = getEvent(element); 5195 var handlers = events[typeEvent] || (events[typeEvent] = {}); 5196 var previousFn = findHandler(handlers, originalHandler, delegation ? handler : null); 5197 5198 if (previousFn) { 5199 previousFn.oneOff = previousFn.oneOff && oneOff; 5200 return; 5201 } 5202 5203 var uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')); 5204 var fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler); 5205 fn.delegationSelector = delegation ? handler : null; 5206 fn.originalHandler = originalHandler; 5207 fn.oneOff = oneOff; 5208 fn.uidEvent = uid; 5209 handlers[uid] = fn; 5210 element.addEventListener(typeEvent, fn, delegation); 5211 } 5212 5213 function removeHandler(element, events, typeEvent, handler, delegationSelector) { 5214 var fn = findHandler(events[typeEvent], handler, delegationSelector); 5215 5216 if (fn === null) { 5217 return; 5218 } 5219 5220 element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); 5221 delete events[typeEvent][fn.uidEvent]; 5222 } 5223 5224 function removeNamespacedHandlers(element, events, typeEvent, namespace) { 5225 var storeElementEvent = events[typeEvent] || {};
5226 Object.keys(storeElementEvent).forEach(function (handlerKey) { 5227 if (handlerKey.indexOf(namespace) > -1) { 5228 var event = storeElementEvent[handlerKey]; 5229 removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); 5230 } 5231 }); 5232 } 5233 5234 var EventHandler = { 5235 on: function on(element, event, handler, delegationFn) { 5236 addHandler(element, event, handler, delegationFn, false); 5237 }, 5238 one: function one(element, event, handler, delegationFn) { 5239 addHandler(element, event, handler, delegationFn, true); 5240 }, 5241 off: function off(element, originalTypeEvent, handler, delegationFn) { 5242 if (typeof originalTypeEvent !== 'string' || !element) { 5243 return; 5244 } 5245 5246 var _normalizeParams2 = normalizeParams(originalTypeEvent, handler, delegationFn), 5247 delegation = _normalizeParams2[0], 5248 originalHandler = _normalizeParams2[1], 5249 typeEvent = _normalizeParams2[2]; 5250 5251 var inNamespace = typeEvent !== originalTypeEvent; 5252 var events = getEvent(element); 5253 var isNamespace = originalTypeEvent.charAt(0) === '.'; 5254 5255 if (typeof originalHandler !== 'undefined') { 5256 // Simplest case: handler is passed, remove that listener ONLY. 5257 if (!events || !events[typeEvent]) { 5258 return; 5259 } 5260 5261 removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null); 5262 return; 5263 } 5264 5265 if (isNamespace) { 5266 Object.keys(events).forEach(function (elementEvent) { 5267 removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.substr(1)); 5268 }); 5269 } 5270 5271 var storeElementEvent = events[typeEvent] || {}; 5272 Object.keys(storeElementEvent).forEach(function (keyHandlers) { 5273 var handlerKey = keyHandlers.replace(stripUidRegex, ''); 5274 5275 if (!inNamespace || originalTypeEvent.indexOf(handlerKey) > -1) { 5276 var event = storeElementEvent[keyHandlers]; 5277 removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); 5278 } 5279 }); 5280 }, 5281 trigger: function trigger(element, event, args) { 5282 if (typeof event !== 'string' || !element) { 5283 return null; 5284 } 5285 5286 var typeEvent = event.replace(stripNameRegex, ''); 5287 var inNamespace = event !== typeEvent; 5288 var isNative = nativeEvents.indexOf(typeEvent) > -1; 5289 var jQueryEvent; 5290 var bubbles = true; 5291 var nativeDispatch = true; 5292 var defaultPrevented = false; 5293 var evt = null; 5294 5295 if (inNamespace && typeof jQuery !== 'undefined') { 5296 jQueryEvent = jQuery.Event(event, args); 5297 jQuery(element).trigger(jQueryEvent); 5298 bubbles = !jQueryEvent.isPropagationStopped(); 5299 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); 5300 defaultPrevented = jQueryEvent.isDefaultPrevented(); 5301 } 5302 5303 if (isNative) { 5304 evt = document.createEvent('HTMLEvents'); 5305 evt.initEvent(typeEvent, bubbles, true); 5306 } else { 5307 evt = new CustomEvent(event, { 5308 bubbles: bubbles, 5309 cancelable: true 5310 }); 5311 } // merge custom informations in our event 5312 5313 5314 if (typeof args !== 'undefined') { 5315 Object.keys(args).forEach(function (key) { 5316 Object.defineProperty(evt, key, { 5317 get: function get() { 5318 return args[key]; 5319 } 5320 }); 5321 }); 5322 } 5323 5324 if (defaultPrevented) { 5325 evt.preventDefault(); 5326 5327 if (!Polyfill.defaultPreventedPreservedOnDispatch) { 5328 Object.defineProperty(evt, 'defaultPrevented', { 5329 get: function get() { 5330 return true; 5331 } 5332 }); 5333 } 5334 } 5335 5336 if (nativeDispatch) { 5337 element.dispatchEvent(evt); 5338 } 5339 5340 if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') { 5341 jQueryEvent.preventDefault(); 5342 } 5343 5344 return evt; 5345 } 5346 }; 5347 /** 5348 * -------------------------------------------------------------------------- 5349 * Bootstrap (v4.3.1): dom/selectorEngine.js 5350 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5351 * -------------------------------------------------------------------------- 5352 */ 5353 /** 5354 * ------------------------------------------------------------------------ 5355 * Constants 5356 * ------------------------------------------------------------------------ 5357 */ 5358 5359 var findFn = Polyfill.find, 5360 _findOne = Polyfill.findOne; 5361 var NODE_TEXT = 3; 5362 var SelectorEngine = { 5363 matches: function matches(element, selector) { 5364 return element.matches(selector); 5365 }, 5366 find: function find(selector, element) { 5367 if (element === void 0) { 5368 element = document.documentElement; 5369 } 5370 5371 if (typeof selector !== 'string') { 5372 return null; 5373 } 5374 5375 return findFn.call(element, selector); 5376 }, 5377 findOne: function findOne(selector, element) { 5378 if (element === void 0) { 5379 element = document.documentElement; 5380 } 5381 5382 if (typeof selector !== 'string') { 5383 return null; 5384 } 5385 5386 return _findOne.call(element, selector); 5387 }, 5388 children: function children(element, selector) { 5389 var _this = this; 5390 5391 if (typeof selector !== 'string') { 5392 return null; 5393 } 5394 5395 var children = makeArray(element.children); 5396 return children.filter(function (child) { 5397 return _this.matches(child, selector); 5398 }); 5399 }, 5400 parents: function parents(element, selector) { 5401 if (typeof selector !== 'string') { 5402 return null; 5403 } 5404 5405 var parents = []; 5406 var ancestor = element.parentNode; 5407 5408 while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { 5409 if (this.matches(ancestor, selector)) { 5410 parents.push(ancestor); 5411 } 5412 5413 ancestor = ancestor.parentNode; 5414 } 5415 5416 return parents; 5417 }, 5418 closest: function closest(element, selector) { 5419 if (typeof selector !== 'string') { 5420 return null; 5421 } 5422 5423 return element.closest(selector); 5424 }, 5425 prev: function prev(element, selector) { 5426 if (typeof selector !== 'string') { 5427 return null; 5428 } 5429 5430 var siblings = []; 5431 var previous = element.previousSibling; 5432 5433 while (previous && previous.nodeType === Node.ELEMENT_NODE && previous.nodeType !== NODE_TEXT) { 5434 if (this.matches(previous, selector)) { 5435 siblings.push(previous); 5436 } 5437 5438 previous = previous.previousSibling; 5439 } 5440 5441 return siblings; 5442 } 5443 }; 5444 5445 /** 5446 * ------------------------------------------------------------------------ 5447 * Constants 5448 * ------------------------------------------------------------------------ 5449 */ 5450 5451 var NAME = 'alert'; 5452 var VERSION = '4.3.1'; 5453 var DATA_KEY = 'bs.alert'; 5454 var EVENT_KEY = "." + DATA_KEY; 5455 var DATA_API_KEY = '.data-api'; 5456 var Selector = { 5457 DISMISS: '[data-dismiss="alert"]' 5458 }; 5459 var Event$1 = { 5460 CLOSE: "close" + EVENT_KEY, 5461 CLOSED: "closed" + EVENT_KEY, 5462 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY 5463 }; 5464var ClassName = { 5465 ALERT: 'alert', 5466 FADE: 'fade', 5467 SHOW: 'show' 5468 /** 5469 * ------------------------------------------------------------------------ 5470 * Class Definition 5471 * ------------------------------------------------------------------------ 5472 */ 5473 5474}; 5475 5476var Alert = 5477/*#__PURE__*/ 5478function () { 5479 function Alert(element) { 5480 this._element = element; 5481 5482 if (this._element) { 5483 Data.setData(element, DATA_KEY, this); 5484 } 5485 } // Getters 5486 5487 5488 var _proto = Alert.prototype; 5489 5490 // Public 5491 _proto.close = function close(element) { 5492 var rootElement = this._element; 5493 5494 if (element) { 5495 rootElement = this._getRootElement(element); 5496 } 5497 5498 var customEvent = this._triggerCloseEvent(rootElement); 5499 5500 if (customEvent === null || customEvent.defaultPrevented) { 5501 return; 5502 } 5503 5504 this._removeElement(rootElement); 5505 }; 5506 5507 _proto.dispose = function dispose() { 5508 Data.removeData(this._element, DATA_KEY); 5509 this._element = null; 5510 } // Private 5511 ; 5512 5513 _proto._getRootElement = function _getRootElement(element) { 5514 var selector = getSelectorFromElement(element); 5515 var parent = false;
5516 5517 if (selector) { 5518 parent = SelectorEngine.findOne(selector); 5519 } 5520 5521 if (!parent) { 5522 parent = SelectorEngine.closest(element, "." + ClassName.ALERT); 5523 } 5524 5525 return parent; 5526 }; 5527 5528 _proto._triggerCloseEvent = function _triggerCloseEvent(element) { 5529 return EventHandler.trigger(element, Event$1.CLOSE); 5530 }; 5531 5532 _proto._removeElement = function _removeElement(element) { 5533 var _this = this; 5534 5535 element.classList.remove(ClassName.SHOW); 5536 5537 if (!element.classList.contains(ClassName.FADE)) { 5538 this._destroyElement(element); 5539 5540 return; 5541 } 5542 5543 var transitionDuration = getTransitionDurationFromElement(element); 5544 EventHandler.one(element, TRANSITION_END, function (event) { 5545 return _this._destroyElement(element, event); 5546 }); 5547 emulateTransitionEnd(element, transitionDuration); 5548 }; 5549 5550 _proto._destroyElement = function _destroyElement(element) { 5551 if (element.parentNode) { 5552 element.parentNode.removeChild(element); 5553 } 5554 5555 EventHandler.trigger(element, Event$1.CLOSED); 5556 } // Static 5557 ; 5558 5559 Alert._jQueryInterface = function _jQueryInterface(config) { 5560 return this.each(function () { 5561 var data = Data.getData(this, DATA_KEY); 5562 5563 if (!data) { 5564 data = new Alert(this); 5565 } 5566 5567 if (config === 'close') { 5568 data[config](this); 5569 } 5570 }); 5571 }; 5572 5573 Alert._handleDismiss = function _handleDismiss(alertInstance) { 5574 return function (event) { 5575 if (event) { 5576 event.preventDefault(); 5577 } 5578 5579 alertInstance.close(this); 5580 }; 5581 }; 5582 5583 Alert._getInstance = function _getInstance(element) { 5584 return Data.getData(element, DATA_KEY); 5585 }; 5586 5587 _createClass(Alert, null, [{ 5588 key: "VERSION", 5589 get: function get() { 5590 return VERSION; 5591 } 5592 }]); 5593 5594 return Alert; 5595}(); 5596/** 5597 * ------------------------------------------------------------------------ 5598 * Data Api implementation 5599 * ------------------------------------------------------------------------ 5600 */ 5601 5602 5603EventHandler.on(document, Event$1.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); 5604/** 5605 * ------------------------------------------------------------------------ 5606 * jQuery 5607 * ------------------------------------------------------------------------ 5608 * add .alert to jQuery only if jQuery is present 5609 */ 5610 5611if (typeof jQuery !== 'undefined') { 5612 var JQUERY_NO_CONFLICT = jQuery.fn[NAME]; 5613 jQuery.fn[NAME] = Alert._jQueryInterface; 5614 jQuery.fn[NAME].Constructor = Alert; 5615 5616 jQuery.fn[NAME].noConflict = function () { 5617 jQuery.fn[NAME] = JQUERY_NO_CONFLICT; 5618 return Alert._jQueryInterface; 5619 }; 5620} 5621/** 5622 * ------------------------------------------------------------------------ 5623 * Constants 5624 * ------------------------------------------------------------------------ 5625 */ 5626 5627 var NAME$1 = 'button'; 5628 var VERSION$1 = '4.3.1'; 5629 var DATA_KEY$1 = 'bs.button'; 5630 var EVENT_KEY$1 = "." + DATA_KEY$1; 5631 var DATA_API_KEY$1 = '.data-api'; 5632 var ClassName$1 = { 5633 ACTIVE: 'active', 5634 BUTTON: 'btn', 5635 FOCUS: 'focus' 5636 }; 5637 var Selector$1 = { 5638 DATA_TOGGLE_CARROT: '[data-toggle^="button"]', 5639 DATA_TOGGLE: '[data-toggle="buttons"]', 5640 INPUT: 'input:not([type="hidden"])', 5641 ACTIVE: '.active', 5642 BUTTON: '.btn' 5643 }; 5644 var Event$2 = { 5645 CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1, 5646 FOCUS_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1, 5647 BLUR_DATA_API: "blur" + EVENT_KEY$1 + DATA_API_KEY$1 5648 /** 5649 * ------------------------------------------------------------------------ 5650 * Class Definition 5651 * ------------------------------------------------------------------------ 5652 */ 5653 5654 }; 5655 5656 var Button = 5657 /*#__PURE__*/ 5658 function () { 5659 function Button(element) { 5660 this._element = element; 5661 Data.setData(element, DATA_KEY$1, this); 5662 } // Getters 5663 5664 5665 var _proto = Button.prototype; 5666 5667 // Public 5668 _proto.toggle = function toggle() { 5669 var triggerChangeEvent = true; 5670 var addAriaPressed = true; 5671 var rootElement = SelectorEngine.closest(this._element, Selector$1.DATA_TOGGLE); 5672 5673 if (rootElement) { 5674 var input = SelectorEngine.findOne(Selector$1.INPUT, this._element); 5675 5676 if (input) { 5677 if (input.type === 'radio') { 5678 if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) { 5679 triggerChangeEvent = false;
5680 } else { 5681 var activeElement = SelectorEngine.findOne(Selector$1.ACTIVE, rootElement); 5682 5683 if (activeElement) { 5684 activeElement.classList.remove(ClassName$1.ACTIVE); 5685 } 5686 } 5687 } 5688 5689 if (triggerChangeEvent) { 5690 if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) { 5691 return; 5692 } 5693 5694 input.checked = !this._element.classList.contains(ClassName$1.ACTIVE); 5695 EventHandler.trigger(input, 'change'); 5696 } 5697 5698 input.focus(); 5699 addAriaPressed = false; 5700 } 5701 } 5702 5703 if (addAriaPressed) { 5704 this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE)); 5705 } 5706 5707 if (triggerChangeEvent) { 5708 this._element.classList.toggle(ClassName$1.ACTIVE); 5709 } 5710 }; 5711 5712 _proto.dispose = function dispose() { 5713 Data.removeData(this._element, DATA_KEY$1); 5714 this._element = null; 5715 } // Static 5716 ; 5717 5718 Button._jQueryInterface = function _jQueryInterface(config) { 5719 return this.each(function () { 5720 var data = Data.getData(this, DATA_KEY$1); 5721 5722 if (!data) { 5723 data = new Button(this); 5724 } 5725 5726 if (config === 'toggle') { 5727 data[config](); 5728 } 5729 }); 5730 }; 5731 5732 Button._getInstance = function _getInstance(element) { 5733 return Data.getData(element, DATA_KEY$1); 5734 }; 5735 5736 _createClass(Button, null, [{ 5737 key: "VERSION", 5738 get: function get() { 5739 return VERSION$1; 5740 } 5741 }]); 5742 5743 return Button; 5744 }(); 5745 /** 5746 * ------------------------------------------------------------------------ 5747 * Data Api implementation 5748 * ------------------------------------------------------------------------ 5749 */ 5750 5751 5752 EventHandler.on(document, Event$2.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { 5753 event.preventDefault(); 5754 var button = event.target; 5755 5756 if (!button.classList.contains(ClassName$1.BUTTON)) { 5757 button = SelectorEngine.closest(button, Selector$1.BUTTON); 5758 } 5759 5760 var data = Data.getData(button, DATA_KEY$1); 5761 5762 if (!data) { 5763 data = new Button(button); 5764 Data.setData(button, DATA_KEY$1, data); 5765 } 5766 5767 data.toggle(); 5768 }); 5769 EventHandler.on(document, Event$2.FOCUS_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { 5770 var button = SelectorEngine.closest(event.target, Selector$1.BUTTON); 5771 button.classList.add(ClassName$1.FOCUS); 5772 }); 5773 EventHandler.on(document, Event$2.BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) { 5774 var button = SelectorEngine.closest(event.target, Selector$1.BUTTON); 5775 button.classList.remove(ClassName$1.FOCUS); 5776 }); 5777 /** 5778 * ------------------------------------------------------------------------ 5779 * jQuery 5780 * ------------------------------------------------------------------------ 5781 * add .button to jQuery only if jQuery is present 5782 */ 5783 5784 if (typeof jQuery !== 'undefined') { 5785 var JQUERY_NO_CONFLICT$1 = jQuery.fn[NAME$1]; 5786 jQuery.fn[NAME$1] = Button._jQueryInterface; 5787 jQuery.fn[NAME$1].Constructor = Button; 5788 5789 jQuery.fn[NAME$1].noConflict = function () { 5790 jQuery.fn[NAME$1] = JQUERY_NO_CONFLICT$1; 5791 return Button._jQueryInterface; 5792 }; 5793 } 5794/** 5795 * -------------------------------------------------------------------------- 5796 * Bootstrap (v4.3.1): dom/manipulator.js 5797 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5798 * -------------------------------------------------------------------------- 5799 */ 5800 function normalizeData(val) { 5801 if (val === 'true') { 5802 return true; 5803 } 5804 5805 if (val === 'false') { 5806 return false; 5807 } 5808 5809 if (val === Number(val).toString()) { 5810 return Number(val); 5811 } 5812 5813 if (val === '' || val === 'null') { 5814 return null; 5815 } 5816 5817 return val; 5818 } 5819 5820 function normalizeDataKey(key) { 5821 return key.replace(/[A-Z]/g, function (chr) { 5822 return chr.toLowerCase(); 5823 }); 5824 } 5825 5826 var Manipulator = { 5827 setDataAttribute: function setDataAttribute(element, key, value) { 5828 element.setAttribute("data-" + normalizeDataKey(key), value); 5829 }, 5830 removeDataAttribute: function removeDataAttribute(element, key) { 5831 element.removeAttribute("data-" + normalizeDataKey(key)); 5832 }, 5833 getDataAttributes: function getDataAttributes(element) { 5834 if (!element) { 5835 return {}; 5836 } 5837 5838 var attributes = _objectSpread({}, element.dataset); 5839
5840 Object.keys(attributes).forEach(function (key) { 5841 attributes[key] = normalizeData(attributes[key]); 5842 }); 5843 return attributes; 5844 }, 5845 getDataAttribute: function getDataAttribute(element, key) { 5846 return normalizeData(element.getAttribute("data-" + normalizeDataKey(key))); 5847 }, 5848 offset: function offset(element) { 5849 var rect = element.getBoundingClientRect(); 5850 return { 5851 top: rect.top + document.body.scrollTop, 5852 left: rect.left + document.body.scrollLeft 5853 }; 5854 }, 5855 position: function position(element) { 5856 return { 5857 top: element.offsetTop, 5858 left: element.offsetLeft 5859 }; 5860 }, 5861 toggleClass: function toggleClass(element, className) { 5862 if (!element) { 5863 return; 5864 } 5865 5866 if (element.classList.contains(className)) { 5867 element.classList.remove(className); 5868 } else { 5869 element.classList.add(className); 5870 } 5871 } 5872 }; 5873/** 5874 * ------------------------------------------------------------------------ 5875 * Constants 5876 * ------------------------------------------------------------------------ 5877 */ 5878 5879 var NAME$4 = 'dropdown'; 5880 var VERSION$4 = '4.3.1'; 5881 var DATA_KEY$4 = 'bs.dropdown'; 5882 var EVENT_KEY$4 = "." + DATA_KEY$4; 5883 var DATA_API_KEY$4 = '.data-api'; 5884 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key 5885 5886 var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key 5887 5888 var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key 5889 5890 var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key 5891 5892 var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key 5893 5894 var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) 5895 5896 var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); 5897 var Event$5 = { 5898 HIDE: "hide" + EVENT_KEY$4, 5899 HIDDEN: "hidden" + EVENT_KEY$4, 5900 SHOW: "show" + EVENT_KEY$4, 5901 SHOWN: "shown" + EVENT_KEY$4, 5902 CLICK: "click" + EVENT_KEY$4, 5903 CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4, 5904 KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4, 5905 KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4 5906 }; 5907 var ClassName$4 = { 5908 DISABLED: 'disabled', 5909 SHOW: 'show', 5910 DROPUP: 'dropup', 5911 DROPRIGHT: 'dropright', 5912 DROPLEFT: 'dropleft', 5913 MENURIGHT: 'dropdown-menu-right', 5914 POSITION_STATIC: 'position-static' 5915 }; 5916 var Selector$4 = { 5917 DATA_TOGGLE: '[data-toggle="dropdown"]', 5918 FORM_CHILD: '.dropdown form', 5919 MENU: '.dropdown-menu', 5920 NAVBAR_NAV: '.navbar-nav', 5921 VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' 5922 }; 5923 var AttachmentMap = { 5924 TOP: 'top-start', 5925 TOPEND: 'top-end', 5926 BOTTOM: 'bottom-start', 5927 BOTTOMEND: 'bottom-end', 5928 RIGHT: 'right-start', 5929 RIGHTEND: 'right-end', 5930 LEFT: 'left-start', 5931 LEFTEND: 'left-end' 5932 }; 5933 var Default$2 = { 5934 offset: 0, 5935 flip: true, 5936 boundary: 'scrollParent', 5937 reference: 'toggle', 5938 display: 'dynamic' 5939 }; 5940 var DefaultType$2 = { 5941 offset: '(number|string|function)', 5942 flip: 'boolean', 5943 boundary: '(string|element)', 5944 reference: '(string|element)', 5945 display: 'string' 5946 /** 5947 * ------------------------------------------------------------------------ 5948 * Class Definition 5949 * ------------------------------------------------------------------------ 5950 */ 5951 5952 }; 5953 5954 var Dropdown = 5955 /*#__PURE__*/ 5956 function () { 5957 function Dropdown(element, config) { 5958 this._element = element; 5959 this._popper = null; 5960 this._config = this._getConfig(config); 5961 this._menu = this._getMenuElement(); 5962 this._inNavbar = this._detectNavbar(); 5963 5964 this._addEventListeners(); 5965 5966 Data.setData(element, DATA_KEY$4, this); 5967 } // Getters 5968 5969 5970 var _proto = Dropdown.prototype; 5971 5972 // Public 5973 _proto.toggle = function toggle() { 5974 if (this._element.disabled || this._element.classList.contains(ClassName$4.DISABLED)) { 5975 return; 5976 } 5977 5978 var parent = Dropdown._getParentFromElement(this._element); 5979 5980 var isActive = this._menu.classList.contains(ClassName$4.SHOW); 5981 5982 Dropdown._clearMenus(); 5983 5984 if (isActive) { 5985 return; 5986 } 5987 5988 var relatedTarget = { 5989 relatedTarget: this._element 5990 }; 5991 var showEvent = EventHandler.trigger(parent, Event$5.SHOW, relatedTarget); 5992 5993 if (showEvent.defaultPrevented) { 5994 return; 5995 } // Disable totally Popper.js for Dropdown in Navbar 5996 5997 5998 if (!this._inNavbar) { 5999 /** 6000 * Check for Popper dependency 6001 * Popper - https://popper.js.org 6002 */ 6003 if (typeof Popper === 'undefined') { 6004 throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)'); 6005 } 6006 6007 var referenceElement = this._element; 6008 6009 if (this._config.reference === 'parent') { 6010 referenceElement = parent; 6011 } else if (isElement(this._config.reference)) { 6012 referenceElement = this._config.reference; // Check if it's jQuery element 6013 6014 if (typeof this._config.reference.jquery !== 'undefined') { 6015 referenceElement = this._config.reference[0]; 6016 } 6017 } // If boundary is not `scrollParent`, then set position to `static` 6018 // to allow the menu to "escape" the scroll parent's boundaries 6019 // https://github.com/twbs/bootstrap/issues/24251 6020 6021
6022 if (this._config.boundary !== 'scrollParent') { 6023 parent.classList.add(ClassName$4.POSITION_STATIC); 6024 } 6025 6026 this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); 6027 } // If this is a touch-enabled device we add extra 6028 // empty mouseover listeners to the body's immediate children; 6029 // only needed because of broken event delegation on iOS 6030 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 6031 6032 6033 if ('ontouchstart' in document.documentElement && !makeArray(SelectorEngine.closest(parent, Selector$4.NAVBAR_NAV)).length) { 6034 makeArray(document.body.children).forEach(function (elem) { 6035 return EventHandler.on(elem, 'mouseover', null, noop()); 6036 }); 6037 } 6038 6039 this._element.focus(); 6040 6041 this._element.setAttribute('aria-expanded', true); 6042 6043 Manipulator.toggleClass(this._menu, ClassName$4.SHOW); 6044 Manipulator.toggleClass(parent, ClassName$4.SHOW); 6045 EventHandler.trigger(parent, Event$5.SHOWN, relatedTarget); 6046 }; 6047 6048 _proto.show = function show() { 6049 if (this._element.disabled || this._element.classList.contains(ClassName$4.DISABLED) || this._menu.classList.contains(ClassName$4.SHOW)) { 6050 return; 6051 } 6052 6053 var parent = Dropdown._getParentFromElement(this._element); 6054 6055 var relatedTarget = { 6056 relatedTarget: this._element 6057 }; 6058 var showEvent = EventHandler.trigger(parent, Event$5.SHOW, relatedTarget); 6059 6060 if (showEvent.defaultPrevented) { 6061 return; 6062 } 6063 6064 Manipulator.toggleClass(this._menu, ClassName$4.SHOW); 6065 Manipulator.toggleClass(parent, ClassName$4.SHOW); 6066 EventHandler.trigger(parent, Event$5.SHOWN, relatedTarget); 6067 }; 6068 6069 _proto.hide = function hide() { 6070 if (this._element.disabled || this._element.classList.contains(ClassName$4.DISABLED) || !this._menu.classList.contains(ClassName$4.SHOW)) { 6071 return; 6072 } 6073 6074 var parent = Dropdown._getParentFromElement(this._element); 6075 6076 var relatedTarget = { 6077 relatedTarget: this._element 6078 }; 6079 var hideEvent = EventHandler.trigger(parent, Event$5.HIDE, relatedTarget); 6080 6081 if (hideEvent.defaultPrevented) { 6082 return; 6083 } 6084 6085 Manipulator.toggleClass(this._menu, ClassName$4.SHOW); 6086 Manipulator.toggleClass(parent, ClassName$4.SHOW); 6087 EventHandler.trigger(parent, Event$5.HIDDEN, relatedTarget); 6088 }; 6089 6090 _proto.dispose = function dispose() { 6091 Data.removeData(this._element, DATA_KEY$4); 6092 EventHandler.off(this._element, EVENT_KEY$4); 6093 this._element = null; 6094 this._menu = null; 6095 6096 if (this._popper !== null) { 6097 this._popper.destroy(); 6098 6099 this._popper = null; 6100 } 6101 }; 6102 6103 _proto.update = function update() { 6104 this._inNavbar = this._detectNavbar(); 6105 6106 if (this._popper !== null) { 6107 this._popper.scheduleUpdate(); 6108 } 6109 } // Private 6110 ; 6111 6112 _proto._addEventListeners = function _addEventListeners() { 6113 var _this = this; 6114 6115 EventHandler.on(this._element, Event$5.CLICK, function (event) { 6116 event.preventDefault(); 6117 event.stopPropagation(); 6118 6119 _this.toggle(); 6120 }); 6121 }; 6122 6123 _proto._getConfig = function _getConfig(config) { 6124 config = _objectSpread({}, this.constructor.Default, Manipulator.getDataAttributes(this._element), config); 6125 typeCheckConfig(NAME$4, config, this.constructor.DefaultType); 6126 return config; 6127 }; 6128 6129 _proto._getMenuElement = function _getMenuElement() { 6130 if (!this._menu) { 6131 var parent = Dropdown._getParentFromElement(this._element); 6132 6133 if (parent) { 6134 this._menu = SelectorEngine.findOne(Selector$4.MENU, parent); 6135 } 6136 } 6137 6138 return this._menu; 6139 }; 6140 6141 _proto._getPlacement = function _getPlacement() { 6142 var parentDropdown = this._element.parentNode; 6143 var placement = AttachmentMap.BOTTOM; // Handle dropup 6144 6145 if (parentDropdown.classList.contains(ClassName$4.DROPUP)) { 6146 placement = AttachmentMap.TOP; 6147 6148 if (this._menu.classList.contains(ClassName$4.MENURIGHT)) { 6149 placement = AttachmentMap.TOPEND; 6150 } 6151 } else if (parentDropdown.classList.contains(ClassName$4.DROPRIGHT)) { 6152 placement = AttachmentMap.RIGHT; 6153 } else if (parentDropdown.classList.contains(ClassName$4.DROPLEFT)) { 6154 placement = AttachmentMap.LEFT; 6155 } else if (this._menu.classList.contains(ClassName$4.MENURIGHT)) { 6156 placement = AttachmentMap.BOTTOMEND; 6157 } 6158 6159 return placement; 6160 }; 6161 6162 _proto._detectNavbar = function _detectNavbar() { 6163 return Boolean(SelectorEngine.closest(this._element, '.navbar')); 6164 }; 6165 6166 _proto._getOffset = function _getOffset() { 6167 var _this2 = this; 6168 6169 var offset = {}; 6170 6171 if (typeof this._config.offset === 'function') { 6172 offset.fn = function (data) { 6173 data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {}); 6174 return data; 6175 }; 6176 } else { 6177 offset.offset = this._config.offset; 6178 } 6179 6180 return offset; 6181 }; 6182 6183 _proto._getPopperConfig = function _getPopperConfig() { 6184 var popperConfig = { 6185 placement: this._getPlacement(), 6186 modifiers: { 6187 offset: this._getOffset(), 6188 flip: { 6189 enabled: this._config.flip 6190 }, 6191 preventOverflow: {
6192 boundariesElement: this._config.boundary 6193 } 6194 } // Disable Popper.js if we have a static display 6195 6196 }; 6197 6198 if (this._config.display === 'static') { 6199 popperConfig.modifiers.applyStyle = { 6200 enabled: false 6201 }; 6202 } 6203 6204 return popperConfig; 6205 } // Static 6206 ; 6207 6208 Dropdown._dropdownInterface = function _dropdownInterface(element, config) { 6209 var data = Data.getData(element, DATA_KEY$4); 6210 6211 var _config = typeof config === 'object' ? config : null; 6212 6213 if (!data) { 6214 data = new Dropdown(element, _config); 6215 } 6216 6217 if (typeof config === 'string') { 6218 if (typeof data[config] === 'undefined') { 6219 throw new TypeError("No method named \"" + config + "\""); 6220 } 6221 6222 data[config](); 6223 } 6224 }; 6225 6226 Dropdown._jQueryInterface = function _jQueryInterface(config) { 6227 return this.each(function () { 6228 Dropdown._dropdownInterface(this, config); 6229 }); 6230 }; 6231 6232 Dropdown._clearMenus = function _clearMenus(event) { 6233 if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { 6234 return; 6235 } 6236 6237 var toggles = makeArray(SelectorEngine.find(Selector$4.DATA_TOGGLE)); 6238 6239 for (var i = 0, len = toggles.length; i < len; i++) { 6240 var parent = Dropdown._getParentFromElement(toggles[i]); 6241 6242 var context = Data.getData(toggles[i], DATA_KEY$4); 6243 var relatedTarget = { 6244 relatedTarget: toggles[i] 6245 }; 6246 6247 if (event && event.type === 'click') { 6248 relatedTarget.clickEvent = event; 6249 } 6250 6251 if (!context) { 6252 continue; 6253 } 6254 6255 var dropdownMenu = context._menu; 6256 6257 if (!parent.classList.contains(ClassName$4.SHOW)) { 6258 continue; 6259 } 6260 6261 if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && parent.contains(event.target)) { 6262 continue; 6263 } 6264 6265 var hideEvent = EventHandler.trigger(parent, Event$5.HIDE, relatedTarget); 6266 6267 if (hideEvent.defaultPrevented) { 6268 continue; 6269 } // If this is a touch-enabled device we remove the extra 6270 // empty mouseover listeners we added for iOS support 6271 6272 6273 if ('ontouchstart' in document.documentElement) { 6274 makeArray(document.body.children).forEach(function (elem) { 6275 return EventHandler.off(elem, 'mouseover', null, noop()); 6276 }); 6277 } 6278 6279 toggles[i].setAttribute('aria-expanded', 'false'); 6280 dropdownMenu.classList.remove(ClassName$4.SHOW); 6281 parent.classList.remove(ClassName$4.SHOW); 6282 EventHandler.trigger(parent, Event$5.HIDDEN, relatedTarget); 6283 } 6284 }; 6285 6286 Dropdown._getParentFromElement = function _getParentFromElement(element) { 6287 var parent; 6288 var selector = getSelectorFromElement(element); 6289 6290 if (selector) { 6291 parent = SelectorEngine.findOne(selector); 6292 } 6293 6294 return parent || element.parentNode; 6295 }; 6296 6297 Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { 6298 // If not input/textarea: 6299 // - And not a key in REGEXP_KEYDOWN => not a dropdown command 6300 // If input/textarea: 6301 // - If space key => not a dropdown command 6302 // - If key is other than escape 6303 // - If key is not up or down => not a dropdown command 6304 // - If trigger inside the menu => not a dropdown command 6305 if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || SelectorEngine.closest(event.target, Selector$4.MENU)) : !REGEXP_KEYDOWN.test(event.which)) { 6306 return; 6307 } 6308 6309 event.preventDefault(); 6310 event.stopPropagation(); 6311 6312 if (this.disabled || this.classList.contains(ClassName$4.DISABLED)) { 6313 return; 6314 } 6315 6316 var parent = Dropdown._getParentFromElement(this); 6317 6318 var isActive = parent.classList.contains(ClassName$4.SHOW); 6319 6320 if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { 6321 if (event.which === ESCAPE_KEYCODE) { 6322 EventHandler.trigger(SelectorEngine.findOne(Selector$4.DATA_TOGGLE, parent), 'focus'); 6323 } 6324 6325 Dropdown._clearMenus(); 6326 6327 return; 6328 } 6329 6330 var items = makeArray(SelectorEngine.find(Selector$4.VISIBLE_ITEMS, parent)); 6331 6332 if (!items.length) { 6333 return; 6334 } 6335 6336 var index = items.indexOf(event.target); 6337 6338 if (event.which === ARROW_UP_KEYCODE && index > 0) { 6339 // Up 6340 index--; 6341 } 6342 6343 if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { 6344 // Down 6345 index++; 6346 } 6347 6348 if (index < 0) { 6349 index = 0; 6350 } 6351 6352 items[index].focus(); 6353 }; 6354 6355 Dropdown._getInstance = function _getInstance(element) { 6356 return Data.getData(element, DATA_KEY$4); 6357 }; 6358 6359 _createClass(Dropdown, null, [{ 6360 key: "VERSION", 6361 get: function get() { 6362 return VERSION$4; 6363 } 6364 }, {
6365 key: "Default", 6366 get: function get() { 6367 return Default$2; 6368 } 6369 }, { 6370 key: "DefaultType", 6371 get: function get() { 6372 return DefaultType$2; 6373 } 6374 }]); 6375 6376 return Dropdown; 6377 }(); 6378 /** 6379 * ------------------------------------------------------------------------ 6380 * Data Api implementation 6381 * ------------------------------------------------------------------------ 6382 */ 6383 6384 6385 EventHandler.on(document, Event$5.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler); 6386 EventHandler.on(document, Event$5.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler); 6387 EventHandler.on(document, Event$5.CLICK_DATA_API, Dropdown._clearMenus); 6388 EventHandler.on(document, Event$5.KEYUP_DATA_API, Dropdown._clearMenus); 6389 EventHandler.on(document, Event$5.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) { 6390 event.preventDefault(); 6391 event.stopPropagation(); 6392 6393 Dropdown._dropdownInterface(this, 'toggle'); 6394 }); 6395 EventHandler.on(document, Event$5.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) { 6396 return e.stopPropagation(); 6397 }); 6398 /** 6399 * ------------------------------------------------------------------------ 6400 * jQuery 6401 * ------------------------------------------------------------------------ 6402 * add .dropdown to jQuery only if jQuery is present 6403 */ 6404 6405 if (typeof jQuery !== 'undefined') { 6406 var JQUERY_NO_CONFLICT$4 = jQuery.fn[NAME$4]; 6407 jQuery.fn[NAME$4] = Dropdown._jQueryInterface; 6408 jQuery.fn[NAME$4].Constructor = Dropdown; 6409 6410 jQuery.fn[NAME$4].noConflict = function () { 6411 jQuery.fn[NAME$4] = JQUERY_NO_CONFLICT$4; 6412 return Dropdown._jQueryInterface; 6413 }; 6414 } 6415/** 6416 * -------------------------------------------------------------------------- 6417 * Bootstrap (v4.3.1): util/sanitizer.js 6418 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6419 * -------------------------------------------------------------------------- 6420 */ 6421 var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; 6422 var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; 6423 /** 6424 * A pattern that recognizes a commonly useful subset of URLs that are safe. 6425 * 6426 * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts 6427 */ 6428 6429 var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi; 6430 /** 6431 * A pattern that matches safe data URLs. Only matches image, video and audio types. 6432 * 6433 * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts 6434 */ 6435 6436 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; 6437 6438 var allowedAttribute = function allowedAttribute(attr, allowedAttributeList) { 6439 var attrName = attr.nodeName.toLowerCase(); 6440 6441 if (allowedAttributeList.indexOf(attrName) !== -1) { 6442 if (uriAttrs.indexOf(attrName) !== -1) { 6443 return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); 6444 } 6445 6446 return true; 6447 } 6448 6449 var regExp = allowedAttributeList.filter(function (attrRegex) { 6450 return attrRegex instanceof RegExp; 6451 }); // Check if a regular expression validates the attribute. 6452 6453 for (var i = 0, l = regExp.length; i < l; i++) { 6454 if (attrName.match(regExp[i])) { 6455 return true; 6456 } 6457 } 6458 6459 return false; 6460 }; 6461 6462 var DefaultWhitelist = { 6463 // Global attributes allowed on any supplied element below. 6464 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], 6465 a: ['target', 'href', 'title', 'rel'], 6466 area: [], 6467 b: [], 6468 br: [], 6469 col: [], 6470 code: [], 6471 div: [], 6472 em: [], 6473 hr: [], 6474 h1: [], 6475 h2: [], 6476 h3: [], 6477 h4: [], 6478 h5: [], 6479 h6: [], 6480 i: [], 6481 img: ['src', 'alt', 'title', 'width', 'height'], 6482 li: [], 6483 ol: [], 6484 p: [], 6485 pre: [], 6486 s: [], 6487 small: [], 6488 span: [], 6489 sub: [], 6490 sup: [], 6491 strong: [], 6492 u: [], 6493 ul: [] 6494 }; 6495 function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { 6496 if (!unsafeHtml.length) { 6497 return unsafeHtml; 6498 } 6499 6500 if (sanitizeFn && typeof sanitizeFn === 'function') { 6501 return sanitizeFn(unsafeHtml); 6502 } 6503 6504 var domParser = new window.DOMParser(); 6505 var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); 6506 var whitelistKeys = Object.keys(whiteList); 6507 var elements = makeArray(createdDocument.body.querySelectorAll('*')); 6508 6509 var _loop = function _loop(i, len) { 6510 var el = elements[i]; 6511 var elName = el.nodeName.toLowerCase(); 6512 6513 if (whitelistKeys.indexOf(elName) === -1) { 6514 el.parentNode.removeChild(el); 6515 return "continue";
6516 } 6517 6518 var attributeList = makeArray(el.attributes); 6519 var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); 6520 attributeList.forEach(function (attr) { 6521 if (!allowedAttribute(attr, whitelistedAttributes)) { 6522 el.removeAttribute(attr.nodeName); 6523 } 6524 }); 6525 }; 6526 6527 for (var i = 0, len = elements.length; i < len; i++) { 6528 var _ret = _loop(i, len); 6529 6530 if (_ret === "continue") continue; 6531 } 6532 6533 return createdDocument.body.innerHTML; 6534 } 6535/** 6536 * ------------------------------------------------------------------------ 6537 * Constants 6538 * ------------------------------------------------------------------------ 6539 */ 6540 6541 var NAME$6 = 'tooltip'; 6542 var VERSION$6 = '4.3.1'; 6543 var DATA_KEY$6 = 'bs.tooltip'; 6544 var EVENT_KEY$6 = "." + DATA_KEY$6; 6545 var CLASS_PREFIX = 'bs-tooltip'; 6546 var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); 6547 var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; 6548 var DefaultType$4 = { 6549 animation: 'boolean', 6550 template: 'string', 6551 title: '(string|element|function)', 6552 trigger: 'string', 6553 delay: '(number|object)', 6554 html: 'boolean', 6555 selector: '(string|boolean)', 6556 placement: '(string|function)', 6557 offset: '(number|string|function)', 6558 container: '(string|element|boolean)', 6559 fallbackPlacement: '(string|array)', 6560 boundary: '(string|element)', 6561 sanitize: 'boolean', 6562 sanitizeFn: '(null|function)', 6563 whiteList: 'object' 6564 }; 6565 var AttachmentMap$1 = { 6566 AUTO: 'auto', 6567 TOP: 'top', 6568 RIGHT: 'right', 6569 BOTTOM: 'bottom', 6570 LEFT: 'left' 6571 }; 6572 var Default$4 = { 6573 animation: true, 6574 template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>', 6575 trigger: 'hover focus', 6576 title: '', 6577 delay: 0, 6578 html: false, 6579 selector: false, 6580 placement: 'top', 6581 offset: 0, 6582 container: false, 6583 fallbackPlacement: 'flip', 6584 boundary: 'scrollParent', 6585 sanitize: true, 6586 sanitizeFn: null, 6587 whiteList: DefaultWhitelist 6588 }; 6589 var HoverState = { 6590 SHOW: 'show', 6591 OUT: 'out' 6592 }; 6593 var Event$7 = { 6594 HIDE: "hide" + EVENT_KEY$6, 6595 HIDDEN: "hidden" + EVENT_KEY$6, 6596 SHOW: "show" + EVENT_KEY$6, 6597 SHOWN: "shown" + EVENT_KEY$6, 6598 INSERTED: "inserted" + EVENT_KEY$6, 6599 CLICK: "click" + EVENT_KEY$6, 6600 FOCUSIN: "focusin" + EVENT_KEY$6, 6601 FOCUSOUT: "focusout" + EVENT_KEY$6, 6602 MOUSEENTER: "mouseenter" + EVENT_KEY$6, 6603 MOUSELEAVE: "mouseleave" + EVENT_KEY$6 6604 }; 6605 var ClassName$6 = { 6606 FADE: 'fade', 6607 SHOW: 'show' 6608 }; 6609 var Selector$6 = { 6610 TOOLTIP_INNER: '.tooltip-inner', 6611 TOOLTIP_ARROW: '.tooltip-arrow' 6612 }; 6613 var Trigger = { 6614 HOVER: 'hover', 6615 FOCUS: 'focus', 6616 CLICK: 'click', 6617 MANUAL: 'manual' 6618 /** 6619 * ------------------------------------------------------------------------ 6620 * Class Definition 6621 * ------------------------------------------------------------------------ 6622 */ 6623 6624 }; 6625 6626 var Tooltip = 6627 /*#__PURE__*/ 6628 function () { 6629 function Tooltip(element, config) { 6630 /** 6631 * Check for Popper dependency 6632 * Popper - https://popper.js.org 6633 */ 6634 if (typeof Popper === 'undefined') { 6635 throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org)'); 6636 } // private 6637 6638 6639 this._isEnabled = true; 6640 this._timeout = 0; 6641 this._hoverState = ''; 6642 this._activeTrigger = {}; 6643 this._popper = null; // Protected 6644 6645 this.element = element; 6646 this.config = this._getConfig(config); 6647 this.tip = null; 6648 6649 this._setListeners(); 6650 6651 Data.setData(element, this.constructor.DATA_KEY, this); 6652 } // Getters 6653 6654 6655 var _proto = Tooltip.prototype; 6656 6657 // Public 6658 _proto.enable = function enable() { 6659 this._isEnabled = true; 6660 }; 6661 6662 _proto.disable = function disable() { 6663 this._isEnabled = false; 6664 }; 6665 6666 _proto.toggleEnabled = function toggleEnabled() { 6667 this._isEnabled = !this._isEnabled; 6668 }; 6669 6670 _proto.toggle = function toggle(event) { 6671 if (!this._isEnabled) { 6672 return; 6673 } 6674 6675 if (event) { 6676 var dataKey = this.constructor.DATA_KEY; 6677 var context = Data.getData(event.delegateTarget, dataKey); 6678 6679 if (!context) { 6680 context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); 6681 Data.setData(event.delegateTarget, dataKey, context); 6682 } 6683 6684 context._activeTrigger.click = !context._activeTrigger.click; 6685 6686 if (context._isWithActiveTrigger()) { 6687 context._enter(null, context); 6688 } else { 6689 context._leave(null, context); 6690 } 6691 } else { 6692 if (this.getTipElement().classList.contains(ClassName$6.SHOW)) { 6693 this._leave(null, this); 6694 6695 return; 6696 } 6697 6698 this._enter(null, this); 6699 } 6700 }; 6701 6702 _proto.dispose = function dispose() { 6703 clearTimeout(this._timeout); 6704 Data.removeData(this.element, this.constructor.DATA_KEY); 6705 EventHandler.off(this.element, this.constructor.EVENT_KEY); 6706 EventHandler.off(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal'); 6707 6708 if (this.tip) { 6709 this.tip.parentNode.removeChild(this.tip); 6710 } 6711 6712 this._isEnabled = null; 6713 this._timeout = null; 6714 this._hoverState = null; 6715 this._activeTrigger = null; 6716 6717 if (this._popper !== null) { 6718 this._popper.destroy(); 6719 } 6720 6721 this._popper = null; 6722 this.element = null; 6723 this.config = null; 6724 this.tip = null; 6725 }; 6726 6727 _proto.show = function show() { 6728 var _this = this; 6729 6730 if (this.element.style.display === 'none') { 6731 throw new Error('Please use show on visible elements'); 6732 } 6733 6734 if (this.isWithContent() && this._isEnabled) { 6735 var showEvent = EventHandler.trigger(this.element, this.constructor.Event.SHOW); 6736 var shadowRoot = findShadowRoot(this.element); 6737 var isInTheDom = shadowRoot === null ? this.element.ownerDocument.documentElement.contains(this.element) : shadowRoot.contains(this.element); 6738 6739 if (showEvent.defaultPrevented || !isInTheDom) { 6740 return; 6741 } 6742 6743 var tip = this.getTipElement(); 6744 var tipId = getUID(this.constructor.NAME);
6745 tip.setAttribute('id', tipId); 6746 this.element.setAttribute('aria-describedby', tipId); 6747 this.setContent(); 6748 6749 if (this.config.animation) { 6750 tip.classList.add(ClassName$6.FADE); 6751 } 6752 6753 var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; 6754 6755 var attachment = this._getAttachment(placement); 6756 6757 this.addAttachmentClass(attachment); 6758 6759 var container = this._getContainer(); 6760 6761 Data.setData(tip, this.constructor.DATA_KEY, this); 6762 6763 if (!this.element.ownerDocument.documentElement.contains(this.tip)) { 6764 container.appendChild(tip); 6765 } 6766 6767 EventHandler.trigger(this.element, this.constructor.Event.INSERTED); 6768 this._popper = new Popper(this.element, tip, { 6769 placement: attachment, 6770 modifiers: { 6771 offset: this._getOffset(), 6772 flip: { 6773 behavior: this.config.fallbackPlacement 6774 }, 6775 arrow: { 6776 element: Selector$6.TOOLTIP_ARROW 6777 }, 6778 preventOverflow: { 6779 boundariesElement: this.config.boundary 6780 } 6781 }, 6782 onCreate: function onCreate(data) { 6783 if (data.originalPlacement !== data.placement) { 6784 _this._handlePopperPlacementChange(data); 6785 } 6786 }, 6787 onUpdate: function onUpdate(data) { 6788 return _this._handlePopperPlacementChange(data); 6789 } 6790 }); 6791 tip.classList.add(ClassName$6.SHOW); // If this is a touch-enabled device we add extra 6792 // empty mouseover listeners to the body's immediate children; 6793 // only needed because of broken event delegation on iOS 6794 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 6795 6796 if ('ontouchstart' in document.documentElement) { 6797 makeArray(document.body.children).forEach(function (element) { 6798 EventHandler.on(element, 'mouseover', noop()); 6799 }); 6800 } 6801 6802 var complete = function complete() { 6803 if (_this.config.animation) { 6804 _this._fixTransition(); 6805 } 6806 6807 var prevHoverState = _this._hoverState; 6808 _this._hoverState = null; 6809 EventHandler.trigger(_this.element, _this.constructor.Event.SHOWN); 6810 6811 if (prevHoverState === HoverState.OUT) { 6812 _this._leave(null, _this); 6813 } 6814 }; 6815 6816 if (this.tip.classList.contains(ClassName$6.FADE)) { 6817 var transitionDuration = getTransitionDurationFromElement(this.tip); 6818 EventHandler.one(this.tip, TRANSITION_END, complete); 6819 emulateTransitionEnd(this.tip, transitionDuration); 6820 } else { 6821 complete(); 6822 } 6823 } 6824 }; 6825 6826 _proto.hide = function hide(callback) { 6827 var _this2 = this; 6828 6829 var tip = this.getTipElement(); 6830 6831 var complete = function complete() { 6832 if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { 6833 tip.parentNode.removeChild(tip); 6834 } 6835 6836 _this2._cleanTipClass(); 6837 6838 _this2.element.removeAttribute('aria-describedby'); 6839 6840 EventHandler.trigger(_this2.element, _this2.constructor.Event.HIDDEN); 6841 6842 if (_this2._popper !== null) { 6843 _this2._popper.destroy(); 6844 } 6845 6846 if (callback) { 6847 callback(); 6848 } 6849 }; 6850 6851 var hideEvent = EventHandler.trigger(this.element, this.constructor.Event.HIDE); 6852 6853 if (hideEvent.defaultPrevented) { 6854 return; 6855 } 6856 6857 tip.classList.remove(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra 6858 // empty mouseover listeners we added for iOS support 6859 6860 if ('ontouchstart' in document.documentElement) { 6861 makeArray(document.body.children).forEach(function (element) { 6862 return EventHandler.off(element, 'mouseover', noop); 6863 }); 6864 } 6865 6866 this._activeTrigger[Trigger.CLICK] = false; 6867 this._activeTrigger[Trigger.FOCUS] = false; 6868 this._activeTrigger[Trigger.HOVER] = false;
6869 6870 if (this.tip.classList.contains(ClassName$6.FADE)) { 6871 var transitionDuration = getTransitionDurationFromElement(tip); 6872 EventHandler.one(tip, TRANSITION_END, complete); 6873 emulateTransitionEnd(tip, transitionDuration); 6874 } else { 6875 complete(); 6876 } 6877 6878 this._hoverState = ''; 6879 }; 6880 6881 _proto.update = function update() { 6882 if (this._popper !== null) { 6883 this._popper.scheduleUpdate(); 6884 } 6885 } // Protected 6886 ; 6887 6888 _proto.isWithContent = function isWithContent() { 6889 return Boolean(this.getTitle()); 6890 }; 6891 6892 _proto.addAttachmentClass = function addAttachmentClass(attachment) { 6893 this.getTipElement().classList.add(CLASS_PREFIX + "-" + attachment); 6894 }; 6895 6896 _proto.getTipElement = function getTipElement() { 6897 if (this.tip) { 6898 return this.tip; 6899 } 6900 6901 var element = document.createElement('div'); 6902 element.innerHTML = this.config.template; 6903 this.tip = element.children[0]; 6904 return this.tip; 6905 }; 6906 6907 _proto.setContent = function setContent() { 6908 var tip = this.getTipElement(); 6909 this.setElementContent(SelectorEngine.findOne(Selector$6.TOOLTIP_INNER, tip), this.getTitle()); 6910 tip.classList.remove(ClassName$6.FADE); 6911 tip.classList.remove(ClassName$6.SHOW); 6912 }; 6913 6914 _proto.setElementContent = function setElementContent(element, content) { 6915 if (element === null) { 6916 return; 6917 } 6918 6919 if (typeof content === 'object' && (content.nodeType || content.jquery)) { 6920 if (content.jquery) { 6921 content = content[0]; 6922 } // content is a DOM node or a jQuery 6923 6924 6925 if (this.config.html) { 6926 if (content.parentNode !== element) { 6927 element.innerHTML = ''; 6928 element.appendChild(content); 6929 } 6930 } else { 6931 element.innerText = content.textContent; 6932 } 6933 6934 return; 6935 } 6936 6937 if (this.config.html) { 6938 if (this.config.sanitize) { 6939 content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); 6940 } 6941 6942 element.innerHTML = content; 6943 } else { 6944 element.innerText = content; 6945 } 6946 }; 6947 6948 _proto.getTitle = function getTitle() { 6949 var title = this.element.getAttribute('data-original-title'); 6950 6951 if (!title) { 6952 title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; 6953 } 6954 6955 return title; 6956 } // Private 6957 ; 6958 6959 _proto._getOffset = function _getOffset() { 6960 var _this3 = this; 6961 6962 var offset = {}; 6963 6964 if (typeof this.config.offset === 'function') { 6965 offset.fn = function (data) { 6966 data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {}); 6967 return data; 6968 }; 6969 } else { 6970 offset.offset = this.config.offset; 6971 } 6972 6973 return offset; 6974 }; 6975 6976 _proto._getContainer = function _getContainer() { 6977 if (this.config.container === false) { 6978 return document.body; 6979 } 6980 6981 if (isElement(this.config.container)) { 6982 return this.config.container; 6983 } 6984 6985 return SelectorEngine.findOne(this.config.container); 6986 }; 6987 6988 _proto._getAttachment = function _getAttachment(placement) { 6989 return AttachmentMap$1[placement.toUpperCase()]; 6990 }; 6991 6992 _proto._setListeners = function _setListeners() { 6993 var _this4 = this; 6994 6995 var triggers = this.config.trigger.split(' '); 6996 triggers.forEach(function (trigger) { 6997 if (trigger === 'click') { 6998 EventHandler.on(_this4.element, _this4.constructor.Event.CLICK, _this4.config.selector, function (event) { 6999 return _this4.toggle(event); 7000 }); 7001 } else if (trigger !== Trigger.MANUAL) { 7002 var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN; 7003 var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT; 7004 EventHandler.on(_this4.element, eventIn, _this4.config.selector, function (event) { 7005 return _this4._enter(event); 7006 }); 7007 EventHandler.on(_this4.element, eventOut, _this4.config.selector, function (event) { 7008 return _this4._leave(event); 7009 }); 7010 } 7011 }); 7012 EventHandler.on(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal', function () { 7013 if (_this4.element) { 7014 _this4.hide(); 7015 } 7016 }); 7017 7018 if (this.config.selector) { 7019 this.config = _objectSpread({}, this.config, { 7020 trigger: 'manual', 7021 selector: '' 7022 }); 7023 } else { 7024 this._fixTitle(); 7025 } 7026 }; 7027 7028 _proto._fixTitle = function _fixTitle() { 7029 var titleType = typeof this.element.getAttribute('data-original-title'); 7030 7031 if (this.element.getAttribute('title') || titleType !== 'string') { 7032 this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); 7033 this.element.setAttribute('title', ''); 7034 } 7035 }; 7036 7037 _proto._enter = function _enter(event, context) { 7038 var dataKey = this.constructor.DATA_KEY; 7039 context = context || Data.getData(event.delegateTarget, dataKey); 7040 7041 if (!context) { 7042 context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); 7043 Data.setData(event.delegateTarget, dataKey, context); 7044 } 7045 7046 if (event) { 7047 context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; 7048 } 7049 7050 if (context.getTipElement().classList.contains(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) { 7051 context._hoverState = HoverState.SHOW; 7052 return; 7053 } 7054 7055 clearTimeout(context._timeout); 7056 context._hoverState = HoverState.SHOW; 7057 7058 if (!context.config.delay || !context.config.delay.show) { 7059 context.show(); 7060 return; 7061 } 7062 7063 context._timeout = setTimeout(function () { 7064 if (context._hoverState === HoverState.SHOW) { 7065 context.show(); 7066 } 7067 }, context.config.delay.show); 7068 }; 7069 7070 _proto._leave = function _leave(event, context) { 7071 var dataKey = this.constructor.DATA_KEY; 7072 context = context || Data.getData(event.delegateTarget, dataKey); 7073 7074 if (!context) { 7075 context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); 7076 Data.setData(event.delegateTarget, dataKey, context); 7077 } 7078 7079 if (event) { 7080 context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
7081 } 7082 7083 if (context._isWithActiveTrigger()) { 7084 return; 7085 } 7086 7087 clearTimeout(context._timeout); 7088 context._hoverState = HoverState.OUT; 7089 7090 if (!context.config.delay || !context.config.delay.hide) { 7091 context.hide(); 7092 return; 7093 } 7094 7095 context._timeout = setTimeout(function () { 7096 if (context._hoverState === HoverState.OUT) { 7097 context.hide(); 7098 } 7099 }, context.config.delay.hide); 7100 }; 7101 7102 _proto._isWithActiveTrigger = function _isWithActiveTrigger() { 7103 for (var trigger in this._activeTrigger) { 7104 if (this._activeTrigger[trigger]) { 7105 return true; 7106 } 7107 } 7108 7109 return false; 7110 }; 7111 7112 _proto._getConfig = function _getConfig(config) { 7113 var dataAttributes = Manipulator.getDataAttributes(this.element); 7114 Object.keys(dataAttributes).forEach(function (dataAttr) { 7115 if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { 7116 delete dataAttributes[dataAttr]; 7117 } 7118 }); 7119 7120 if (config && typeof config.container === 'object' && config.container.jquery) { 7121 config.container = config.container[0]; 7122 } 7123 7124 config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); 7125 7126 if (typeof config.delay === 'number') { 7127 config.delay = { 7128 show: config.delay, 7129 hide: config.delay 7130 }; 7131 } 7132 7133 if (typeof config.title === 'number') { 7134 config.title = config.title.toString(); 7135 } 7136 7137 if (typeof config.content === 'number') { 7138 config.content = config.content.toString(); 7139 } 7140 7141 typeCheckConfig(NAME$6, config, this.constructor.DefaultType); 7142 7143 if (config.sanitize) { 7144 config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); 7145 } 7146 7147 return config; 7148 }; 7149 7150 _proto._getDelegateConfig = function _getDelegateConfig() { 7151 var config = {}; 7152 7153 if (this.config) { 7154 for (var key in this.config) { 7155 if (this.constructor.Default[key] !== this.config[key]) { 7156 config[key] = this.config[key]; 7157 } 7158 } 7159 } 7160 7161 return config; 7162 }; 7163 7164 _proto._cleanTipClass = function _cleanTipClass() { 7165 var tip = this.getTipElement(); 7166 var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX); 7167 7168 if (tabClass !== null && tabClass.length) { 7169 tabClass.map(function (token) { 7170 return token.trim(); 7171 }
7171).forEach(function (tClass) { 7172 return tip.classList.remove(tClass); 7173 }); 7174 } 7175 }; 7176 7177 _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { 7178 var popperInstance = popperData.instance; 7179 this.tip = popperInstance.popper; 7180 7181 this._cleanTipClass(); 7182 7183 this.addAttachmentClass(this._getAttachment(popperData.placement)); 7184 }; 7185 7186 _proto._fixTransition = function _fixTransition() { 7187 var tip = this.getTipElement(); 7188 var initConfigAnimation = this.config.animation; 7189 7190 if (tip.getAttribute('x-placement') !== null) { 7191 return; 7192 } 7193 7194 tip.classList.remove(ClassName$6.FADE); 7195 this.config.animation = false; 7196 this.hide(); 7197 this.show(); 7198 this.config.animation = initConfigAnimation; 7199 } // Static 7200 ; 7201 7202 Tooltip._jQueryInterface = function _jQueryInterface(config) { 7203 return this.each(function () { 7204 var data = Data.getData(this, DATA_KEY$6); 7205 7206 var _config = typeof config === 'object' && config; 7207 7208 if (!data && /dispose|hide/.test(config)) { 7209 return; 7210 } 7211 7212 if (!data) { 7213 data = new Tooltip(this, _config); 7214 } 7215 7216 if (typeof config === 'string') { 7217 if (typeof data[config] === 'undefined') { 7218 throw new TypeError("No method named \"" + config + "\""); 7219 } 7220 7221 data[config](); 7222 } 7223 }); 7224 }; 7225 7226 Tooltip._getInstance = function _getInstance(element) { 7227 return Data.getData(element, DATA_KEY$6); 7228 }; 7229 7230 _createClass(Tooltip, null, [{ 7231 key: "VERSION", 7232 get: function get() { 7233 return VERSION$6; 7234 } 7235 }, { 7236 key: "Default", 7237 get: function get() { 7238 return Default$4; 7239 } 7240 }, { 7241 key: "NAME", 7242 get: function get() { 7243 return NAME$6; 7244 } 7245 }, { 7246 key: "DATA_KEY", 7247 get: function get() { 7248 return DATA_KEY$6; 7249 } 7250 }, { 7251 key: "Event", 7252 get: function get() { 7253 return Event$7; 7254 } 7255 }, { 7256 key: "EVENT_KEY", 7257 get: function get() { 7258 return EVENT_KEY$6; 7259 } 7260 }, { 7261 key: "DefaultType", 7262 get: function get() { 7263 return DefaultType$4; 7264 } 7265 }]); 7266 7267 return Tooltip; 7268 }(); 7269 /** 7270 * ------------------------------------------------------------------------ 7271 * jQuery 7272 * ------------------------------------------------------------------------ 7273 * add .tooltip to jQuery only if jQuery is present 7274 */ 7275 7276 7277 if (typeof jQuery !== 'undefined') { 7278 var JQUERY_NO_CONFLICT$6 = jQuery.fn[NAME$6]; 7279 jQuery.fn[NAME$6] = Tooltip._jQueryInterface; 7280 jQuery.fn[NAME$6].Constructor = Tooltip; 7281 7282 jQuery.fn[NAME$6].noConflict = function () { 7283 jQuery.fn[NAME$6] = JQUERY_NO_CONFLICT$6; 7284 return Tooltip._jQueryInterface; 7285 }; 7286 } 7287/** 7288 * ------------------------------------------------------------------------ 7289 * Constants 7290 * ------------------------------------------------------------------------ 7291 */ 7292 7293 var NAME$7 = 'popover'; 7294 var VERSION$7 = '4.3.1'; 7295 var DATA_KEY$7 = 'bs.popover'; 7296 var EVENT_KEY$7 = "." + DATA_KEY$7; 7297 var CLASS_PREFIX$1 = 'bs-popover'; 7298 var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); 7299 7300 var Default$5 = _objectSpread({}, Tooltip.Default, { 7301 placement: 'right', 7302 trigger: 'click', 7303 content: '', 7304 template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>' 7305 }); 7306 7307 var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, { 7308 content: '(string|element|function)' 7309 }); 7310 7311 var ClassName$7 = { 7312 FADE: 'fade', 7313 SHOW: 'show' 7314 }; 7315 var Selector$7 = { 7316 TITLE: '.popover-header', 7317 CONTENT: '.popover-body' 7318 }; 7319 var Event$8 = { 7320 HIDE: "hide" + EVENT_KEY$7, 7321 HIDDEN: "hidden" + EVENT_KEY$7, 7322 SHOW: "show" + EVENT_KEY$7, 7323 SHOWN: "shown" + EVENT_KEY$7, 7324 INSERTED: "inserted" + EVENT_KEY$7, 7325 CLICK: "click" + EVENT_KEY$7, 7326 FOCUSIN: "focusin" + EVENT_KEY$7, 7327 FOCUSOUT: "focusout" + EVENT_KEY$7, 7328 MOUSEENTER: "mouseenter" + EVENT_KEY$7, 7329 MOUSELEAVE: "mouseleave" + EVENT_KEY$7 7330 /** 7331 * ------------------------------------------------------------------------ 7332 * Class Definition 7333 * ------------------------------------------------------------------------ 7334 */ 7335 7336 }; 7337 7338 var Popover = 7339 /*#__PURE__*/ 7340 function (_Tooltip) { 7341 _inheritsLoose(Popover, _Tooltip); 7342 7343 function Popover() { 7344 return _Tooltip.apply(this, arguments) || this; 7345 } 7346 7347 var _proto = Popover.prototype; 7348 7349 // Overrides 7350 _proto.isWithContent = function isWithContent() { 7351 return this.getTitle() || this._getContent(); 7352 }; 7353 7354 _proto.addAttachmentClass = function addAttachmentClass(attachment) { 7355 this.getTipElement().classList.add(CLASS_PREFIX$1 + "-" + attachment); 7356 }; 7357 7358 _proto.setContent = function setContent() { 7359 var tip = this.getTipElement(); // we use append for html objects to maintain js events 7360 7361 this.setElementContent(SelectorEngine.findOne(Selector$7.TITLE, tip), this.getTitle()); 7362 7363 var content = this._getContent(); 7364 7365 if (typeof content === 'function') { 7366 content = content.call(this.element); 7367 } 7368 7369 this.setElementContent(SelectorEngine.findOne(Selector$7.CONTENT, tip), content); 7370 tip.classList.remove(ClassName$7.FADE); 7371 tip.classList.remove(ClassName$7.SHOW); 7372 } // Private 7373 ; 7374 7375 _proto._getContent = function _getContent() { 7376 return this.element.getAttribute('data-content') || this.config.content; 7377 }; 7378 7379 _proto._cleanTipClass = function _cleanTipClass() { 7380 var tip = this.getTipElement(); 7381 var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX$1); 7382 7383 if (tabClass !== null && tabClass.length > 0) { 7384 tabClass.map(function (token) { 7385 return token.trim(); 7386 }
7386).forEach(function (tClass) { 7387 return tip.classList.remove(tClass); 7388 }); 7389 } 7390 } // Static 7391 ; 7392 7393 Popover._jQueryInterface = function _jQueryInterface(config) { 7394 return this.each(function () { 7395 var data = Data.getData(this, DATA_KEY$7); 7396 7397 var _config = typeof config === 'object' ? config : null; 7398 7399 if (!data && /dispose|hide/.test(config)) { 7400 return; 7401 } 7402 7403 if (!data) { 7404 data = new Popover(this, _config); 7405 Data.setData(this, DATA_KEY$7, data); 7406 } 7407 7408 if (typeof config === 'string') { 7409 if (typeof data[config] === 'undefined') { 7410 throw new TypeError("No method named \"" + config + "\""); 7411 } 7412 7413 data[config](); 7414 } 7415 }); 7416 }; 7417 7418 Popover._getInstance = function _getInstance(element) { 7419 return Data.getData(element, DATA_KEY$7); 7420 }; 7421 7422 _createClass(Popover, null, [{ 7423 key: "VERSION", 7424 // Getters 7425 get: function get() { 7426 return VERSION$7; 7427 } 7428 }, { 7429 key: "Default", 7430 get: function get() { 7431 return Default$5; 7432 } 7433 }, { 7434 key: "NAME", 7435 get: function get() { 7436 return NAME$7; 7437 } 7438 }, { 7439 key: "DATA_KEY", 7440 get: function get() { 7441 return DATA_KEY$7; 7442 } 7443 }, { 7444 key: "Event", 7445 get: function get() { 7446 return Event$8; 7447 } 7448 }, { 7449 key: "EVENT_KEY", 7450 get: function get() { 7451 return EVENT_KEY$7; 7452 } 7453 }, { 7454 key: "DefaultType", 7455 get: function get() { 7456 return DefaultType$5; 7457 } 7458 }]); 7459 7460 return Popover; 7461 }(Tooltip); 7462 /** 7463 * ------------------------------------------------------------------------ 7464 * jQuery 7465 * ------------------------------------------------------------------------ 7466 */ 7467 7468 7469 if (typeof jQuery !== 'undefined') { 7470 var JQUERY_NO_CONFLICT$7 = jQuery.fn[NAME$7]; 7471 jQuery.fn[NAME$7] = Popover._jQueryInterface; 7472 jQuery.fn[NAME$7].Constructor = Popover; 7473 7474 jQuery.fn[NAME$7].noConflict = function () { 7475 jQuery.fn[NAME$7] = JQUERY_NO_CONFLICT$7; 7476 return Popover._jQueryInterface; 7477 }; 7478 } 7479 /** 7480 * -------------------------------------------------------------------------- 7481 * Bootstrap (v4.3.1): index.umd.js 7482 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7483 * -------------------------------------------------------------------------- 7484 */ 7485 7486 /** 7487 var index_umd = { 7488 Alert: Alert, 7489 Button: Button, 7490 Carousel: Carousel, 7491 Collapse: Collapse, 7492 Dropdown: Dropdown, 7493 Modal: Modal, 7494 Popover: Popover, 7495 ScrollSpy: ScrollSpy, 7496 Tab: Tab, 7497 //Toast: Toast, 7498 Tooltip: Tooltip 7499 }; 7500 */ 7501 var index_umd = { 7502 Alert: Alert, 7503 Button: Button, 7504 Dropdown: Dropdown, 7505 Popover: Popover, 7506 Tooltip: Tooltip 7507 };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.