PageSourceSearch

https://anapa-official.ru/simai/asset/simai.framework/sf4.master/core/js/sf-full.js

js anapa-official.ru collected 2026-10-02 04:55:30 UTC 245,044 bytes, 7,507 lines download raw bytes

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">&#9660;</span>');
4365      if ($select.is(':disabled')) {
4366        dropdownIcon.addClass('disabled');
4367      }
4368
4369      // escape double quotes
4370      var sanitizedLabelHtml = label.replace(/"/g, '&quot;');
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.