newton-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/README.md +42 -0
- data/Rakefile +61 -0
- data/app/assets/javascripts/twitter/bootstrap.js +12 -0
- data/app/assets/javascripts/twitter/bootstrap/affix.js +120 -0
- data/app/assets/javascripts/twitter/bootstrap/alert.js +96 -0
- data/app/assets/javascripts/twitter/bootstrap/button.js +105 -0
- data/app/assets/javascripts/twitter/bootstrap/carousel.js +210 -0
- data/app/assets/javascripts/twitter/bootstrap/collapse.js +153 -0
- data/app/assets/javascripts/twitter/bootstrap/dropdown.js +155 -0
- data/app/assets/javascripts/twitter/bootstrap/modal.js +243 -0
- data/app/assets/javascripts/twitter/bootstrap/popover.js +109 -0
- data/app/assets/javascripts/twitter/bootstrap/scrollspy.js +156 -0
- data/app/assets/javascripts/twitter/bootstrap/tab.js +133 -0
- data/app/assets/javascripts/twitter/bootstrap/tooltip.js +356 -0
- data/app/assets/javascripts/twitter/bootstrap/transition.js +47 -0
- data/app/assets/stylesheets/newton/newton.scss +1 -0
- data/lib/newton-rails.rb +8 -0
- data/lib/newton-rails/engine.rb +10 -0
- data/lib/newton-rails/version.rb +5 -0
- data/newton-rails.gemspec +20 -0
- data/test/test_helper.rb +2 -0
- metadata +69 -0
| @@ -0,0 +1,210 @@ | |
| 1 | 
            +
            /* ========================================================================
         | 
| 2 | 
            +
             * Bootstrap: carousel.js v3.0.0
         | 
| 3 | 
            +
             * http://twitter.github.com/bootstrap/javascript.html#carousel
         | 
| 4 | 
            +
             * ========================================================================
         | 
| 5 | 
            +
             * Copyright 2012 Twitter, Inc.
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 8 | 
            +
             * you may not use this file except in compliance with the License.
         | 
| 9 | 
            +
             * You may obtain a copy of the License at
         | 
| 10 | 
            +
             *
         | 
| 11 | 
            +
             * http://www.apache.org/licenses/LICENSE-2.0
         | 
| 12 | 
            +
             *
         | 
| 13 | 
            +
             * Unless required by applicable law or agreed to in writing, software
         | 
| 14 | 
            +
             * distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 15 | 
            +
             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 16 | 
            +
             * See the License for the specific language governing permissions and
         | 
| 17 | 
            +
             * limitations under the License.
         | 
| 18 | 
            +
             * ======================================================================== */
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            +function ($) { "use strict";
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              // CAROUSEL CLASS DEFINITION
         | 
| 24 | 
            +
              // =========================
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              var Carousel = function (element, options) {
         | 
| 27 | 
            +
                this.$element    = $(element)
         | 
| 28 | 
            +
                this.$indicators = this.$element.find('.carousel-indicators')
         | 
| 29 | 
            +
                this.options     = options
         | 
| 30 | 
            +
                this.paused      =
         | 
| 31 | 
            +
                this.sliding     =
         | 
| 32 | 
            +
                this.interval    =
         | 
| 33 | 
            +
                this.$active     =
         | 
| 34 | 
            +
                this.$items      = null
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                this.options.pause == 'hover' && this.$element
         | 
| 37 | 
            +
                  .on('mouseenter', $.proxy(this.pause, this))
         | 
| 38 | 
            +
                  .on('mouseleave', $.proxy(this.cycle, this))
         | 
| 39 | 
            +
              }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              Carousel.DEFAULTS = {
         | 
| 42 | 
            +
                interval: 5000
         | 
| 43 | 
            +
              , pause: 'hover'
         | 
| 44 | 
            +
              }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              Carousel.prototype.cycle =  function (e) {
         | 
| 47 | 
            +
                e || (this.paused = false)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                this.interval && clearInterval(this.interval)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                this.options.interval
         | 
| 52 | 
            +
                  && !this.paused
         | 
| 53 | 
            +
                  && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                return this
         | 
| 56 | 
            +
              }
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              Carousel.prototype.getActiveIndex = function () {
         | 
| 59 | 
            +
                this.$active = this.$element.find('.item.active')
         | 
| 60 | 
            +
                this.$items  = this.$active.parent().children()
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                return this.$items.index(this.$active)
         | 
| 63 | 
            +
              }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              Carousel.prototype.to = function (pos) {
         | 
| 66 | 
            +
                var that        = this
         | 
| 67 | 
            +
                var activeIndex = this.getActiveIndex()
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                if (pos > (this.$items.length - 1) || pos < 0) return
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })
         | 
| 72 | 
            +
                if (activeIndex == pos) return this.pause().cycle()
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
         | 
| 75 | 
            +
              }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              Carousel.prototype.pause = function (e) {
         | 
| 78 | 
            +
                e || (this.paused = true)
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                if (this.$element.find('.next, .prev').length && $.support.transition.end) {
         | 
| 81 | 
            +
                  this.$element.trigger($.support.transition.end)
         | 
| 82 | 
            +
                  this.cycle(true)
         | 
| 83 | 
            +
                }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                this.interval = clearInterval(this.interval)
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                return this
         | 
| 88 | 
            +
              }
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              Carousel.prototype.next = function () {
         | 
| 91 | 
            +
                if (this.sliding) return
         | 
| 92 | 
            +
                return this.slide('next')
         | 
| 93 | 
            +
              }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              Carousel.prototype.prev = function () {
         | 
| 96 | 
            +
                if (this.sliding) return
         | 
| 97 | 
            +
                return this.slide('prev')
         | 
| 98 | 
            +
              }
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              Carousel.prototype.slide = function (type, next) {
         | 
| 101 | 
            +
                var $active   = this.$element.find('.item.active')
         | 
| 102 | 
            +
                var $next     = next || $active[type]()
         | 
| 103 | 
            +
                var isCycling = this.interval
         | 
| 104 | 
            +
                var direction = type == 'next' ? 'left' : 'right'
         | 
| 105 | 
            +
                var fallback  = type == 'next' ? 'first' : 'last'
         | 
| 106 | 
            +
                var that      = this
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                this.sliding = true
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                isCycling && this.pause()
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                $next = $next.length ? $next : this.$element.find('.item')[fallback]()
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                if ($next.hasClass('active')) return
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                if (this.$indicators.length) {
         | 
| 119 | 
            +
                  this.$indicators.find('.active').removeClass('active')
         | 
| 120 | 
            +
                  this.$element.one('slid', function () {
         | 
| 121 | 
            +
                    var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
         | 
| 122 | 
            +
                    $nextIndicator && $nextIndicator.addClass('active')
         | 
| 123 | 
            +
                  })
         | 
| 124 | 
            +
                }
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                if ($.support.transition && this.$element.hasClass('slide')) {
         | 
| 127 | 
            +
                  this.$element.trigger(e)
         | 
| 128 | 
            +
                  if (e.isDefaultPrevented()) return
         | 
| 129 | 
            +
                  $next.addClass(type)
         | 
| 130 | 
            +
                  $next[0].offsetWidth // force reflow
         | 
| 131 | 
            +
                  $active.addClass(direction)
         | 
| 132 | 
            +
                  $next.addClass(direction)
         | 
| 133 | 
            +
                  this.$element.one($.support.transition.end, function () {
         | 
| 134 | 
            +
                    $next.removeClass([type, direction].join(' ')).addClass('active')
         | 
| 135 | 
            +
                    $active.removeClass(['active', direction].join(' '))
         | 
| 136 | 
            +
                    that.sliding = false
         | 
| 137 | 
            +
                    setTimeout(function () { that.$element.trigger('slid') }, 0)
         | 
| 138 | 
            +
                  })
         | 
| 139 | 
            +
                } else {
         | 
| 140 | 
            +
                  this.$element.trigger(e)
         | 
| 141 | 
            +
                  if (e.isDefaultPrevented()) return
         | 
| 142 | 
            +
                  $active.removeClass('active')
         | 
| 143 | 
            +
                  $next.addClass('active')
         | 
| 144 | 
            +
                  this.sliding = false
         | 
| 145 | 
            +
                  this.$element.trigger('slid')
         | 
| 146 | 
            +
                }
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                isCycling && this.cycle()
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                return this
         | 
| 151 | 
            +
              }
         | 
| 152 | 
            +
             | 
| 153 | 
            +
             | 
| 154 | 
            +
              // CAROUSEL PLUGIN DEFINITION
         | 
| 155 | 
            +
              // ==========================
         | 
| 156 | 
            +
             | 
| 157 | 
            +
              var old = $.fn.carousel
         | 
| 158 | 
            +
             | 
| 159 | 
            +
              $.fn.carousel = function (option) {
         | 
| 160 | 
            +
                return this.each(function () {
         | 
| 161 | 
            +
                  var $this   = $(this)
         | 
| 162 | 
            +
                  var data    = $this.data('bs.carousel')
         | 
| 163 | 
            +
                  var options = $.extend({}, Carousel.DEFAULTS, typeof option == 'object' && option)
         | 
| 164 | 
            +
                  var action  = typeof option == 'string' ? option : options.slide
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                  if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
         | 
| 167 | 
            +
                  if (typeof option == 'number') data.to(option)
         | 
| 168 | 
            +
                  else if (action) data[action]()
         | 
| 169 | 
            +
                  else if (options.interval) data.pause().cycle()
         | 
| 170 | 
            +
                })
         | 
| 171 | 
            +
              }
         | 
| 172 | 
            +
             | 
| 173 | 
            +
              $.fn.carousel.Constructor = Carousel
         | 
| 174 | 
            +
             | 
| 175 | 
            +
             | 
| 176 | 
            +
              // CAROUSEL NO CONFLICT
         | 
| 177 | 
            +
              // ====================
         | 
| 178 | 
            +
             | 
| 179 | 
            +
              $.fn.carousel.noConflict = function () {
         | 
| 180 | 
            +
                $.fn.carousel = old
         | 
| 181 | 
            +
                return this
         | 
| 182 | 
            +
              }
         | 
| 183 | 
            +
             | 
| 184 | 
            +
             | 
| 185 | 
            +
              // CAROUSEL DATA-API
         | 
| 186 | 
            +
              // =================
         | 
| 187 | 
            +
             | 
| 188 | 
            +
              $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
         | 
| 189 | 
            +
                var $this   = $(this), href
         | 
| 190 | 
            +
                var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
         | 
| 191 | 
            +
                var options = $.extend({}, $target.data(), $this.data())
         | 
| 192 | 
            +
                var slideIndex
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                $target.carousel(options)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                if (slideIndex = $this.attr('data-slide-to')) {
         | 
| 197 | 
            +
                  $target.data('bs.carousel').pause().to(slideIndex).cycle()
         | 
| 198 | 
            +
                }
         | 
| 199 | 
            +
             | 
| 200 | 
            +
                e.preventDefault()
         | 
| 201 | 
            +
              })
         | 
| 202 | 
            +
             | 
| 203 | 
            +
              $(window).on('load', function () {
         | 
| 204 | 
            +
                $('[data-ride="carousel"]').each(function () {
         | 
| 205 | 
            +
                  var $carousel = $(this)
         | 
| 206 | 
            +
                  $carousel.carousel($carousel.data())
         | 
| 207 | 
            +
                })
         | 
| 208 | 
            +
              })
         | 
| 209 | 
            +
             | 
| 210 | 
            +
            }(window.jQuery);
         | 
| @@ -0,0 +1,153 @@ | |
| 1 | 
            +
            /* ========================================================================
         | 
| 2 | 
            +
             * Bootstrap: collapse.js v3.0.0
         | 
| 3 | 
            +
             * http://twitter.github.com/bootstrap/javascript.html#collapse
         | 
| 4 | 
            +
             * ========================================================================
         | 
| 5 | 
            +
             * Copyright 2012 Twitter, Inc.
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 8 | 
            +
             * you may not use this file except in compliance with the License.
         | 
| 9 | 
            +
             * You may obtain a copy of the License at
         | 
| 10 | 
            +
             *
         | 
| 11 | 
            +
             * http://www.apache.org/licenses/LICENSE-2.0
         | 
| 12 | 
            +
             *
         | 
| 13 | 
            +
             * Unless required by applicable law or agreed to in writing, software
         | 
| 14 | 
            +
             * distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 15 | 
            +
             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 16 | 
            +
             * See the License for the specific language governing permissions and
         | 
| 17 | 
            +
             * limitations under the License.
         | 
| 18 | 
            +
             * ======================================================================== */
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            +function ($) { "use strict";
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              // COLLAPSE PUBLIC CLASS DEFINITION
         | 
| 24 | 
            +
              // ================================
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              var Collapse = function (element, options) {
         | 
| 27 | 
            +
                this.$element      = $(element)
         | 
| 28 | 
            +
                this.options       = $.extend({}, Collapse.DEFAULTS, options)
         | 
| 29 | 
            +
                this.transitioning = null
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                if (this.options.parent) this.$parent = $(this.options.parent)
         | 
| 32 | 
            +
                if (this.options.toggle) this.toggle()
         | 
| 33 | 
            +
              }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              Collapse.DEFAULTS = {
         | 
| 36 | 
            +
                toggle: true
         | 
| 37 | 
            +
              }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              Collapse.prototype.dimension = function () {
         | 
| 40 | 
            +
                var hasWidth = this.$element.hasClass('width')
         | 
| 41 | 
            +
                return hasWidth ? 'width' : 'height'
         | 
| 42 | 
            +
              }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              Collapse.prototype.show = function () {
         | 
| 45 | 
            +
                if (this.transitioning || this.$element.hasClass('in')) return
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                var dimension = this.dimension()
         | 
| 48 | 
            +
                var scroll    = $.camelCase(['scroll', dimension].join('-'))
         | 
| 49 | 
            +
                var actives   = this.$parent && this.$parent.find('> .accordion-group > .in')
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                if (actives && actives.length) {
         | 
| 52 | 
            +
                  var hasData = actives.data('collapse')
         | 
| 53 | 
            +
                  if (hasData && hasData.transitioning) return
         | 
| 54 | 
            +
                  actives.collapse('hide')
         | 
| 55 | 
            +
                  hasData || actives.data('collapse', null)
         | 
| 56 | 
            +
                }
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                this.$element[dimension](0)
         | 
| 59 | 
            +
                this.transition('addClass', $.Event('show.bs.collapse'), 'shown.bs.collapse')
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                if ($.support.transition) this.$element[dimension](this.$element[0][scroll])
         | 
| 62 | 
            +
              }
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              Collapse.prototype.hide = function () {
         | 
| 65 | 
            +
                if (this.transitioning || !this.$element.hasClass('in')) return
         | 
| 66 | 
            +
                var dimension = this.dimension()
         | 
| 67 | 
            +
                this.reset(this.$element[dimension]())
         | 
| 68 | 
            +
                this.transition('removeClass', $.Event('hide.bs.collapse'), 'hidden')
         | 
| 69 | 
            +
                this.$element[dimension](0)
         | 
| 70 | 
            +
              }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              Collapse.prototype.reset = function (size) {
         | 
| 73 | 
            +
                var dimension = this.dimension()
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                this.$element
         | 
| 76 | 
            +
                  .removeClass('collapse')
         | 
| 77 | 
            +
                  [dimension](size || 'auto')
         | 
| 78 | 
            +
                  [0].offsetWidth
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                return this
         | 
| 83 | 
            +
              }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              Collapse.prototype.transition = function (method, startEvent, completeEvent) {
         | 
| 86 | 
            +
                var that     = this
         | 
| 87 | 
            +
                var complete = function () {
         | 
| 88 | 
            +
                  if (startEvent.type == 'show') that.reset()
         | 
| 89 | 
            +
                  that.transitioning = 0
         | 
| 90 | 
            +
                  that.$element.trigger(completeEvent)
         | 
| 91 | 
            +
                }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                this.$element.trigger(startEvent)
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                if (startEvent.isDefaultPrevented()) return
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                this.transitioning = 1
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                this.$element[method]('in')
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                $.support.transition && this.$element.hasClass('collapse') ?
         | 
| 102 | 
            +
                  this.$element.one($.support.transition.end, complete) :
         | 
| 103 | 
            +
                  complete()
         | 
| 104 | 
            +
              }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
              Collapse.prototype.toggle = function () {
         | 
| 107 | 
            +
                this[this.$element.hasClass('in') ? 'hide' : 'show']()
         | 
| 108 | 
            +
              }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
             | 
| 111 | 
            +
              // COLLAPSE PLUGIN DEFINITION
         | 
| 112 | 
            +
              // ==========================
         | 
| 113 | 
            +
             | 
| 114 | 
            +
              var old = $.fn.collapse
         | 
| 115 | 
            +
             | 
| 116 | 
            +
              $.fn.collapse = function (option) {
         | 
| 117 | 
            +
                return this.each(function () {
         | 
| 118 | 
            +
                  var $this   = $(this)
         | 
| 119 | 
            +
                  var data    = $this.data('collapse')
         | 
| 120 | 
            +
                  var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  if (!data) $this.data('collapse', (data = new Collapse(this, options)))
         | 
| 123 | 
            +
                  if (typeof option == 'string') data[option]()
         | 
| 124 | 
            +
                })
         | 
| 125 | 
            +
              }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
              $.fn.collapse.Constructor = Collapse
         | 
| 128 | 
            +
             | 
| 129 | 
            +
             | 
| 130 | 
            +
              // COLLAPSE NO CONFLICT
         | 
| 131 | 
            +
              // ====================
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              $.fn.collapse.noConflict = function () {
         | 
| 134 | 
            +
                $.fn.collapse = old
         | 
| 135 | 
            +
                return this
         | 
| 136 | 
            +
              }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
             | 
| 139 | 
            +
              // COLLAPSE DATA-API
         | 
| 140 | 
            +
              // =================
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
         | 
| 143 | 
            +
                var $this  = $(this), href
         | 
| 144 | 
            +
                var target = $this.attr('data-target')
         | 
| 145 | 
            +
                    || e.preventDefault()
         | 
| 146 | 
            +
                    || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
         | 
| 147 | 
            +
                var option = $(target).data('collapse') ? 'toggle' : $this.data()
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
         | 
| 150 | 
            +
                $(target).collapse(option)
         | 
| 151 | 
            +
              })
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            }(window.jQuery);
         | 
| @@ -0,0 +1,155 @@ | |
| 1 | 
            +
            /* ========================================================================
         | 
| 2 | 
            +
             * Bootstrap: dropdown.js v3.0.0
         | 
| 3 | 
            +
             * http://twitter.github.com/bootstrap/javascript.html#dropdowns
         | 
| 4 | 
            +
             * ========================================================================
         | 
| 5 | 
            +
             * Copyright 2012 Twitter, Inc.
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 8 | 
            +
             * you may not use this file except in compliance with the License.
         | 
| 9 | 
            +
             * You may obtain a copy of the License at
         | 
| 10 | 
            +
             *
         | 
| 11 | 
            +
             * http://www.apache.org/licenses/LICENSE-2.0
         | 
| 12 | 
            +
             *
         | 
| 13 | 
            +
             * Unless required by applicable law or agreed to in writing, software
         | 
| 14 | 
            +
             * distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 15 | 
            +
             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 16 | 
            +
             * See the License for the specific language governing permissions and
         | 
| 17 | 
            +
             * limitations under the License.
         | 
| 18 | 
            +
             * ======================================================================== */
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            +function ($) { "use strict";
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              // DROPDOWN CLASS DEFINITION
         | 
| 24 | 
            +
              // =========================
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              var backdrop = '.dropdown-backdrop'
         | 
| 27 | 
            +
              var toggle   = '[data-toggle=dropdown]'
         | 
| 28 | 
            +
              var Dropdown = function (element) {
         | 
| 29 | 
            +
                var $el = $(element).on('click.bs.dropdown', this.toggle)
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              Dropdown.prototype.toggle = function (e) {
         | 
| 33 | 
            +
                var $this = $(this)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                if ($this.is('.disabled, :disabled')) return
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                var $parent  = getParent($this)
         | 
| 38 | 
            +
                var isActive = $parent.hasClass('open')
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                clearMenus()
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                if (!isActive) {
         | 
| 43 | 
            +
                  if ('ontouchstart' in document.documentElement) {
         | 
| 44 | 
            +
                    // if mobile we we use a backdrop because click events don't delegate
         | 
| 45 | 
            +
                    $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
         | 
| 46 | 
            +
                  }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  $parent.trigger(e = $.Event('show.bs.dropdown'))
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  if (e.isDefaultPrevented()) return
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  $parent
         | 
| 53 | 
            +
                    .toggleClass('open')
         | 
| 54 | 
            +
                    .trigger('shown.bs.dropdown')
         | 
| 55 | 
            +
                }
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                $this.focus()
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                return false
         | 
| 60 | 
            +
              }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              Dropdown.prototype.keydown = function (e) {
         | 
| 63 | 
            +
                if (!/(38|40|27)/.test(e.keyCode)) return
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                var $this = $(this)
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                e.preventDefault()
         | 
| 68 | 
            +
                e.stopPropagation()
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                if ($this.is('.disabled, :disabled')) return
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                var $parent  = getParent($this)
         | 
| 73 | 
            +
                var isActive = $parent.hasClass('open')
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                if (!isActive || (isActive && e.keyCode == 27)) {
         | 
| 76 | 
            +
                  if (e.which == 27) $parent.find(toggle).focus()
         | 
| 77 | 
            +
                  return $this.click()
         | 
| 78 | 
            +
                }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                var $items = $('[role=menu] li:not(.divider):visible a', $parent)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                if (!$items.length) return
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                var index = $items.index($items.filter(':focus'))
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                if (e.keyCode == 38 && index > 0)                 index--                        // up
         | 
| 87 | 
            +
                if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
         | 
| 88 | 
            +
                if (!~index)                                      index=0
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                $items.eq(index).focus()
         | 
| 91 | 
            +
              }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              function clearMenus() {
         | 
| 94 | 
            +
                $(backdrop).remove()
         | 
| 95 | 
            +
                $(toggle).each(function (e) { 
         | 
| 96 | 
            +
                  var $parent = getParent($(this))
         | 
| 97 | 
            +
                  if (!$parent.hasClass('open')) return
         | 
| 98 | 
            +
                  $parent.trigger(e = $.Event('hide.bs.dropdown'))
         | 
| 99 | 
            +
                  if (e.isDefaultPrevented()) return
         | 
| 100 | 
            +
                  $parent.removeClass('open').trigger('hidden.bs.dropdown')
         | 
| 101 | 
            +
                })
         | 
| 102 | 
            +
              }
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              function getParent($this) {
         | 
| 105 | 
            +
                var selector = $this.attr('data-target')
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                if (!selector) {
         | 
| 108 | 
            +
                  selector = $this.attr('href')
         | 
| 109 | 
            +
                  selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
         | 
| 110 | 
            +
                }
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                var $parent = selector && $(selector)
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                return $parent && $parent.length ? $parent : $this.parent()
         | 
| 115 | 
            +
              }
         | 
| 116 | 
            +
             | 
| 117 | 
            +
             | 
| 118 | 
            +
              // DROPDOWN PLUGIN DEFINITION
         | 
| 119 | 
            +
              // ==========================
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              var old = $.fn.dropdown
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              $.fn.dropdown = function (option) {
         | 
| 124 | 
            +
                return this.each(function () {
         | 
| 125 | 
            +
                  var $this = $(this)
         | 
| 126 | 
            +
                  var data  = $this.data('dropdown')
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  if (!data) $this.data('dropdown', (data = new Dropdown(this)))
         | 
| 129 | 
            +
                  if (typeof option == 'string') data[option].call($this)
         | 
| 130 | 
            +
                })
         | 
| 131 | 
            +
              }
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              $.fn.dropdown.Constructor = Dropdown
         | 
| 134 | 
            +
             | 
| 135 | 
            +
             | 
| 136 | 
            +
              // DROPDOWN NO CONFLICT
         | 
| 137 | 
            +
              // ====================
         | 
| 138 | 
            +
             | 
| 139 | 
            +
              $.fn.dropdown.noConflict = function () {
         | 
| 140 | 
            +
                $.fn.dropdown = old
         | 
| 141 | 
            +
                return this
         | 
| 142 | 
            +
              }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
             | 
| 145 | 
            +
              // APPLY TO STANDARD DROPDOWN ELEMENTS
         | 
| 146 | 
            +
              // ===================================
         | 
| 147 | 
            +
             | 
| 148 | 
            +
             | 
| 149 | 
            +
              $(document)
         | 
| 150 | 
            +
                .on('click.bs.dropdown.data-api', clearMenus)
         | 
| 151 | 
            +
                .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
         | 
| 152 | 
            +
                .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
         | 
| 153 | 
            +
                .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
         | 
| 154 | 
            +
             | 
| 155 | 
            +
            }(window.jQuery);
         |