1/** 2 * @file 3 * bootstrap.js 4 * 5 * Provides general enhancements and fixes to Bootstrap's JS files. 6 */ 7 8var Drupal = Drupal || {}; 9 10(function($, Drupal){ 11 "use strict"; 12 13 Drupal.behaviors.bootstrap = { 14 attach: function(context) { 15 // Provide some Bootstrap tab/Drupal integration. 16 $(context).find('.tabbable').once('bootstrap-tabs', function () { 17 var $wrapper = $(this); 18 var $tabs = $wrapper.find('.nav-tabs'); 19 var $content = $wrapper.find('.tab-content'); 20 var borderRadius = parseInt($content.css('borderBottomRightRadius'), 10); 21 var bootstrapTabResize = function() { 22 if ($wrapper.hasClass('tabs-left') || $wrapper.hasClass('tabs-right')) { 23 $content.css('min-height', $tabs.outerHeight()); 24 } 25 }; 26 // Add min-height on content for left and right tabs. 27 bootstrapTabResize(); 28 // Detect tab switch. 29 if ($wrapper.hasClass('tabs-left') || $wrapper.hasClass('tabs-right')) { 30 $tabs.on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) { 31 bootstrapTabResize(); 32 if ($wrapper.hasClass('tabs-left')) { 33 if ($(e.target).parent().is(':first-child')) { 34 $content.css('borderTopLeftRadius', '0'); 35 } 36 else { 37 $content.css('borderTopLeftRadius', borderRadius + 'px'); 38 } 39 } 40 else { 41 if ($(e.target).parent().is(':first-child')) { 42 $content.css('borderTopRightRadius', '0'); 43 } 44 else { 45 $content.css('borderTopRightRadius', borderRadius + 'px'); 46 } 47 } 48 }); 49 } 50 }); 51 } 52 }; 53 54 /** 55 * Bootstrap Popovers. 56 */ 57 Drupal.behaviors.bootstrapPopovers = { 58 attach: function (context, settings) { 59 if (settings.bootstrap && settings.bootstrap.popoverEnabled) { 60 var elements = $(context).find('[data-toggle="popover"]').toArray(); 61 for (var i = 0; i < elements.length; i++) { 62 var $element = $(elements[i]); 63 var options = $.extend(true, {}, settings.bootstrap.popoverOptions, $element.data()); 64 $element.popover(options); 65 } 66 } 67 } 68 }; 69 70 /** 71 * Bootstrap Tooltips. 72 */ 73 Drupal.behaviors.bootstrapTooltips = { 74 attach: function (context, settings) { 75 if (settings.bootstrap && settings.bootstrap.tooltipEnabled) { 76 var elements = $(context).find('[data-toggle="tooltip"]').toArray(); 77 for (var i = 0; i < elements.length; i++) { 78 var $element = $(elements[i]); 79 var options = $.extend(true, {}, settings.bootstrap.tooltipOptions, $element.data()); 80 $element.tooltip(options); 81 } 82 } 83 } 84 }; 85 86 /** 87 * Anchor fixes. 88 */ 89 var $scrollableElement = $(); 90 Drupal.behaviors.bootstrapAnchors = { 91 attach: function(context, settings) { 92 var i, elements = ['html', 'body']; 93 if (!$scrollableElement.length) { 94 for (i = 0; i < elements.length; i++) { 95 var $element = $(elements[i]); 96 if ($element.scrollTop() > 0) { 97 $scrollableElement = $element; 98 break; 99 } 100 else { 101 $element.scrollTop(1); 102 if ($element.scrollTop() > 0) { 103 $element.scrollTop(0); 104 $scrollableElement = $element; 105 break; 106 } 107 } 108 } 109 } 110 if (!settings.bootstrap || !settings.bootstrap.anchorsFix) { 111 return; 112 } 113 var anchors = $(context).find('a').toArray(); 114 for (i = 0; i < anchors.length; i++) { 115 if (!anchors[i].scrollTo) { 116 this.bootstrapAnchor(anchors[i]); 117 } 118 } 119 $scrollableElement.once('bootstrap-anchors', function () { 120 $scrollableElement.on('click.bootstrap-anchors', 'a[href*="#"]:not([data-toggle],[data-target])', function(e) { 121 this.scrollTo(e); 122 }); 123 }); 124 }, 125 bootstrapAnchor: function (element) { 126 element.validAnchor = element.nodeName === 'A' && (location.hostname === element.hostname || !element.hostname) && element.hash.replace(/#/,'').length; 127 element.scrollTo = function(event) { 128 var attr = 'id'; 129 var $target = $(element.hash); 130 if (!$target.length) { 131 attr = 'name'; 132 $target = $('[name="' + element.hash.replace('#', '') + '"'); 133 } 134 var offset = $target.offset().top - parseInt($scrollableElement.css('paddingTop'), 10) - parseInt($scrollableElement.css('marginTop'), 10); 135 if (this.validAnchor && $target.length && offset > 0) { 136 if (event) { 137 event.preventDefault(); 138 } 139 var $fakeAnchor = $('<div/>') 140 .addClass('element-invisible') 141 .attr(attr, $target.attr(attr)) 142 .css({ 143 position: 'absolute', 144 top: offset + 'px', 145 zIndex: -1000 146 }) 147 .appendTo(document); 148 $target.removeAttr(attr); 149 var complete = function () { 150 location.hash = element.hash; 151 $fakeAnchor.remove(); 152 $target.attr(attr, element.hash.replace('#', '')); 153 }; 154 if (Drupal.settings.bootstrap.anchorsSmoothScrolling) { 155 $scrollableElement.animate({ scrollTop: offset, avoidTransforms: true }, 400, complete); 156 } 157 else { 158 $scrollableElement.scrollTop(offset); 159 complete(); 160 } 161 } 162 }; 163 } 164 }; 165 166})(jQuery, Drupal);
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.