Projet

Général

Profil

Paste
Télécharger (5,44 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / themes / bootstrap / js / bootstrap.js @ 87dbc3bf

1
/**
2
 * @file
3
 * bootstrap.js
4
 *
5
 * Provides general enhancements and fixes to Bootstrap's JS files.
6
 */
7

    
8
var 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);