PageSourceSearch

https://ecobalade.fr/sites/all/themes/ecobaladeTwitter/bootstrap/js/bootstrap.js?tlkzt8

js ecobalade.fr collected 2026-09-24 18:07:18 UTC 56,478 bytes, 2,025 lines download raw bytes

1/* ===================================================
2 * bootstrap-transition.js v2.2.1
3 * http://twitter.github.com/bootstrap/javascript.html#transitions
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 ($) {
22
23  "use strict"; // jshint ;_;
24
25
26  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27   * ======================================================= */
28
29  $(function () {
30
31    $.support.transition = (function () {
32
33      var transitionEnd = (function () {
34
35        var el = document.createElement('bootstrap')
36          , transEndEventNames = {
37               'WebkitTransition' : 'webkitTransitionEnd'
38            ,  'MozTransition'    : 'transitionend'
39            ,  'OTransition'      : 'oTransitionEnd otransitionend'
40            ,  'transition'       : 'transitionend'
41            }
42          , name
43
44        for (name in transEndEventNames){
45          if (el.style[name] !== undefined) {
46            return transEndEventNames[name]
47          }
48        }
49
50      }())
51
52      return transitionEnd && {
53        end: transitionEnd
54      }
55
56    })()
57
58  })
59
60}(window.jQuery);/* ==========================================================
61 * bootstrap-alert.js v2.2.1
62 * http://twitter.github.com/bootstrap/javascript.html#alerts
63 * ==========================================================
64 * Copyright 2012 Twitter, Inc.
65 *
66 * Licensed under the Apache License, Version 2.0 (the "License");
67 * you may not use this file except in compliance with the License.
68 * You may obtain a copy of the License at
69 *
70 * http://www.apache.org/licenses/LICENSE-2.0
71 *
72 * Unless required by applicable law or agreed to in writing, software
73 * distributed under the License is distributed on an "AS IS" BASIS,
74 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75 * See the License for the specific language governing permissions and
76 * limitations under the License.
77 * ========================================================== */
78
79
80!function ($) {
81
82  "use strict"; // jshint ;_;
83
84
85 /* ALERT CLASS DEFINITION
86  * ====================== */
87
88  var dismiss = '[data-dismiss="alert"]'
89    , Alert = function (el) {
90        $(el).on('click', dismiss, this.close)
91      }
92
93  Alert.prototype.close = function (e) {
94    var $this = $(this)
95      , selector = $this.attr('data-target')
96      , $parent
97
98    if (!selector) {
99      selector = $this.attr('href')
100      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
101    }
102
103    $parent = $(selector)
104
105    e && e.preventDefault()
106
107    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
108
109    $parent.trigger(e = $.Event('close'))
110
111    if (e.isDefaultPrevented()) return
112
113    $parent.removeClass('in')
114
115    function removeElement() {
116      $parent
117        .trigger('closed')
118        .remove()
119    }
120
121    $.support.transition && $parent.hasClass('fade') ?
122      $parent.on($.support.transition.end, removeElement) :
123      removeElement()
124  }
125
126
127 /* ALERT PLUGIN DEFINITION
128  * ======================= */
129
130  $.fn.alert = function (option) {
131    return this.each(function () {
132      var $this = $(this)
133        , data = $this.data('alert')
134      if (!data) $this.data('alert', (data = new Alert(this)))
135      if (typeof option == 'string') data[option].call($this)
136    })
137  }
138
139  $.fn.alert.Constructor = Alert
140
141
142 /* ALERT DATA-API
143  * ============== */
144
145  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
146
147}(window.jQuery);/* ============================================================
148 * bootstrap-button.js v2.2.1
149 * http://twitter.github.com/bootstrap/javascript.html#buttons
150 * ============================================================
151 * Copyright 2012 Twitter, Inc.
152 *
153 * Licensed under the Apache License, Version 2.0 (the "License");
154 * you may not use this file except in compliance with the License.
155 * You may obtain a copy of the License at
156 *
157 * http://www.apache.org/licenses/LICENSE-2.0
158 *
159 * Unless required by applicable law or agreed to in writing, software
160 * distributed under the License is distributed on an "AS IS" BASIS,
161 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
162 * See the License for the specific language governing permissions and
163 * limitations under the License.
164 * ============================================================ */
165
166
167!function ($) {
168
169  "use strict"; // jshint ;_;
170
171
172 /* BUTTON PUBLIC CLASS DEFINITION
173  * ============================== */
174
175  var Button = function (element, options) {
176    this.$element = $(element)
177    this.options = $.extend({}, $.fn.button.defaults, options)
178  }
179
180  Button.prototype.setState = function (state) {
181    var d = 'disabled'
182      , $el = this.$element
183      , data = $el.data()
184      , val = $el.is('input') ? 'val' : 'html'
185
186    state = state + 'Text'
187    data.resetText || $el.data('resetText', $el[val]())
188
189    $el[val](data[state] || this.options[state])
190
191    // push to event loop to allow forms to submit
192    setTimeout(function () {
193      state == 'loadingText' ?
194        $el.addClass(d).attr(d, d) :
195        $el.removeClass(d).removeAttr(d)
196    }, 0)
197  }
198
199  Button.prototype.toggle = function () {
200    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
201
202    $parent && $parent
203      .find('.active')
204      .removeClass('active')
205
206    this.$element.toggleClass('active')
207  }
208
209
210 /* BUTTON PLUGIN DEFINITION
211  * ======================== */
212
213  $.fn.button = function (option) {
214    return this.each(function () {
215      var $this = $(this)
216        , data = $this.data('button')
217        , options = typeof option == 'object' && option
218      if (!data) $this.data('button', (data = new Button(this, options)))
219      if (option == 'toggle') data.toggle()
220      else if (option) data.setState(option)
221    })
222  }
223
224  $.fn.button.defaults = {
225    loadingText: 'loading...'
226  }
227
228  $.fn.button.Constructor = Button
229
230
231 /* BUTTON DATA-API
232  * =============== */
233
234  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
235    var $btn = $(e.target)
236    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
237    $btn.button('toggle')
238  })
239
240}(window.jQuery);/* ==========================================================
241 * bootstrap-carousel.js v2.2.1
242 * http://twitter.github.com/bootstrap/javascript.html#carousel
243 * ==========================================================
244 * Copyright 2012 Twitter, Inc.
245 *
246 * Licensed under the Apache License, Version 2.0 (the "License");
247 * you may not use this file except in compliance with the License.
248 * You may obtain a copy of the License at
249 *
250 * http://www.apache.org/licenses/LICENSE-2.0
251 *
252 * Unless required by applicable law or agreed to in writing, software
253 * distributed under the License is distributed on an "AS IS" BASIS,
254 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
255 * See the License for the specific language governing permissions and
256 * limitations under the License.
257 * ========================================================== */
258
259
260!function ($) {
261
262  "use strict"; // jshint ;_;
263
264
265 /* CAROUSEL CLASS DEFINITION
266  * ========================= */
267
268  var Carousel = function (element, options) {
269    this.$element = $(element)
270    this.options = options
271    this.options.slide && this.slide(this.options.slide)
272    this.options.pause == 'hover' && this.$element
273      .on('mouseenter', $.proxy(this.pause, this))
274      .on('mouseleave', $.proxy(this.cycle, this))
275  }
276
277  Carousel.prototype = {
278
279    cycle: function (e) {
280      if (!e) this.paused = false
281      this.options.interval
282        && !this.paused
283        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
284      return this
285    }
286
287  , to: function (pos) {
288      var $active = this.$element.find('.item.active')
289        , children = $active.parent().children()
290        , activePos = children.index($active)
291        , that = this
292
293      if (pos > (children.length - 1) || pos < 0) return
294
295      if (this.sliding) {
296        return this.$element.one('slid', function () {
297          that.to(pos)
298        })
299      }
300
301      if (activePos == pos) {
302        return this.pause().cycle()
303      }
304
305      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
306    }
307
308  , pause: function (e) {
309      if (!e) this.paused = true
310      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
311        this.$element.trigger($.support.transition.end)
312        this.cycle()
313      }
314      clearInterval(this.interval)
315      this.interval = null
316      return this
317    }
318
319  , next: function () {
320      if (this.sliding) return
321      return this.slide('next')
322    }
323
324  , prev: function () {
325      if (this.sliding) return
326      return this.slide('prev')
327    }
328
329  , slide: function (type, next) {
330      var $active = this.$element.find('.item.active')
331        , $next = next || $active[type]()
332        , isCycling = this.interval
333        , direction = type == 'next' ? 'left' : 'right'
334        , fallback  = type == 'next' ? 'first' : 'last'
335        , that = this
336        , e
337
338      this.sliding = true
339
340      isCycling && this.pause()
341
342      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
343
344      e = $.Event('slide', {
345        relatedTarget: $next[0]
346      })
347
348      if ($next.hasClass('active')) return
349
350      if ($.support.transition && this.$element.hasClass('slide')) {
351        this.$element.trigger(e)
352        if (e.isDefaultPrevented()) return
353        $next.addClass(type)
354        $next[0].offsetWidth // force reflow
355        $active.addClass(direction)
356        $next.addClass(direction)
357        this.$element.one($.support.transition.end, function () {
358          $next.removeClass([type, direction].join(' ')).addClass('active')
359          $active.removeClass(['active', direction].join(' '))
360          that.sliding = false
361          setTimeout(function () { that.$element.trigger('slid') }, 0)
362        })
363      } else {
364        this.$element.trigger(e)
365        if (e.isDefaultPrevented()) return
366        $active.removeClass('active')
367        $next.addClass('active')
368        this.sliding = false
369        this.$element.trigger('slid')
370      }
371
372      isCycling && this.cycle()
373
374      return this
375    }
376
377  }
378
379
380 /* CAROUSEL PLUGIN DEFINITION
381  * ========================== */
382
383  $.fn.carousel = function (option) {
384    return this.each(function () {
385      var $this = $(this)
386        , data = $this.data('carousel')
387        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
388        , action = typeof option == 'string' ? option : options.slide
389      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
390      if (typeof option == 'number') data.to(option)
391      else if (action) data[action]()
392      else if (options.interval) data.cycle()
393    })
394  }
395
396  $.fn.carousel.defaults = {
397    interval: 5000
398  , pause: 'hover'
399  }
400
401  $.fn.carousel.Constructor = Carousel
402
403
404 /* CAROUSEL DATA-API
405  * ================= */
406
407  $(document).on('click.carousel.data-api', '[data-slide]', function (e) {
408    var $this = $(this), href
409      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
410      , options = $.extend({}, $target.data(), $this.data())
411    $target.carousel(options)
412    e.preventDefault()
413  })
414
415}(window.jQuery);/* =============================================================
416 * bootstrap-collapse.js v2.2.1
417 * http://twitter.github.com/bootstrap/javascript.html#collapse
418 * =============================================================
419 * Copyright 2012 Twitter, Inc.
420 *
421 * Licensed under the Apache License, Version 2.0 (the "License");
422 * you may not use this file except in compliance with the License.
423 * You may obtain a copy of the License at
424 *
425 * http://www.apache.org/licenses/LICENSE-2.0
426 *
427 * Unless required by applicable law or agreed to in writing, software
428 * distributed under the License is distributed on an "AS IS" BASIS,
429 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
430 * See the License for the specific language governing permissions and
431 * limitations under the License.
432 * ============================================================ */
433
434
435!function ($) {
436
437  "use strict"; // jshint ;_;
438
439
440 /* COLLAPSE PUBLIC CLASS DEFINITION
441  * ================================ */
442
443  var Collapse = function (element, options) {
444    this.$element = $(element)
445    this.options = $.extend({}, $.fn.collapse.defaults, options)
446
447    if (this.options.parent) {
448      this.$parent = $(this.options.parent)
449    }
450
451    this.options.toggle && this.toggle()
452  }
453
454  Collapse.prototype = {
455
456    constructor: Collapse
457
458  , dimension: function () {
459      var hasWidth = this.$element.hasClass('width')
460      return hasWidth ? 'width' : 'height'
461    }
462
463  , show: function () {
464      var dimension
465        , scroll
466        , actives
467        , hasData
468
469      if (this.transitioning) return
470
471      dimension = this.dimension()
472      scroll = $.camelCase(['scroll', dimension].join('-'))
473      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
474
475      if (actives && actives.length) {
476        hasData = actives.data('collapse')
477        if (hasData && hasData.transitioning) return
478        actives.collapse('hide')
479        hasData || actives.data('collapse', null)
480      }
481
482      this.$element[dimension](0)
483      this.transition('addClass', $.Event('show'), 'shown')
484      $.support.transition && this.$element[dimension](this.$element[0][scroll])
485    }
486
487  , hide: function () {
488      var dimension
489      if (this.transitioning) return
490      dimension = this.dimension()
491      this.reset(this.$element[dimension]())
492      this.transition('removeClass', $.Event('hide'), 'hidden')
493      this.$element[dimension](0)
494    }
495
496  , reset: function (size) {
497      var dimension = this.dimension()
498
499      this.$element
500        .removeClass('collapse')
501        [dimension](size || 'auto')
502        [0].offsetWidth
503
504      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
505
506      return this
507    }
508
509  , transition: function (method, startEvent, completeEvent) {
510      var that = this
511        , complete = function () {
512            if (startEvent.type == 'show') that.reset()
513            that.transitioning = 0
514            that.$element.trigger(completeEvent)
515          }
516
517      this.$element.trigger(startEvent)
518
519      if (startEvent.isDefaultPrevented()) return
520
521      this.transitioning = 1
522
523      this.$element[method]('in')
524
525      $.support.transition && this.$element.hasClass('collapse') ?
526        this.$element.one($.support.transition.end, complete) :
527        complete()
528    }
529
530  , toggle: function () {
531      this[this.$element.hasClass('in') ? 'hide' : 'show']()
532    }
533
534  }
535
536
537 /* COLLAPSIBLE PLUGIN DEFINITION
538  * ============================== */
539
540  $.fn.collapse = function (option) {
541    return this.each(function () {
542      var $this = $(this)
543        , data = $this.data('collapse')
544        , options = typeof option == 'object' && option
545      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
546      if (typeof option == 'string') data[option]()
547    })
548  }
549
550  $.fn.collapse.defaults = {
551    toggle: true
552  }
553
554  $.fn.collapse.Constructor = Collapse
555
556
557 /* COLLAPSIBLE DATA-API
558  * ==================== */
559
560  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
561    var $this = $(this), href
562      , target = $this.attr('data-target')
563        || e.preventDefault()
564        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
565      , option = $(target).data('collapse') ? 'toggle' : $this.data()
566    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
567    $(target).collapse(option)
568  })
569
570}(window.jQuery);/* ============================================================
571 * bootstrap-dropdown.js v2.2.1
572 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
573 * ============================================================
574 * Copyright 2012 Twitter, Inc.
575 *
576 * Licensed under the Apache License, Version 2.0 (the "License");
577 * you may not use this file except in compliance with the License.
578 * You may obtain a copy of the License at
579 *
580 * http://www.apache.org/licenses/LICENSE-2.0
581 *
582 * Unless required by applicable law or agreed to in writing, software
583 * distributed under the License is distributed on an "AS IS" BASIS,
584 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
585 * See the License for the specific language governing permissions and
586 * limitations under the License.
587 * ============================================================ */
588
589
590!function ($) {
591
592  "use strict"; // jshint ;_;
593
594
595 /* DROPDOWN CLASS DEFINITION
596  * ========================= */
597
598  var toggle = '[data-toggle=dropdown]'
599    , Dropdown = function (element) {
600        var $el = $(element).on('click.dropdown.data-api', this.toggle)
601        $('html').on('click.dropdown.data-api', function () {
602          $el.parent().removeClass('open')
603        })
604      }
605
606  Dropdown.prototype = {
607
608    constructor: Dropdown
609
610  , toggle: function (e) {
611      var $this = $(this)
612        , $parent
613        , isActive
614
615      if ($this.is('.disabled, :disabled')) return
616
617      $parent = getParent($this)
618
619      isActive = $parent.hasClass('open')
620
621      clearMenus()
622
623      if (!isActive) {
624        $parent.toggleClass('open')
625        $this.focus()
626      }
627
628      return false
629    }
630
631  , keydown: function (e) {
632      var $this
633        , $items
634        , $active
635        , $parent
636        , isActive
637        , index
638
639      if (!/(38|40|27)/.test(e.keyCode)) return
640
641      $this = $(this)
642
643      e.preventDefault()
644      e.stopPropagation()
645
646      if ($this.is('.disabled, :disabled')) return
647
648      $parent = getParent($this)
649
650      isActive = $parent.hasClass('open')
651
652      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
653
654      $items = $('[role=menu] li:not(.divider) a', $parent)
655
656      if (!$items.length) return
657
658      index = $items.index($items.filter(':focus'))
659
660      if (e.keyCode == 38 && index > 0) index--                                        // up
661      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
662      if (!~index) index = 0
663
664      $items
665        .eq(index)
666        .focus()
667    }
668
669  }
670
671  function clearMenus() {
672    $(toggle).each(function () {
673      getParent($(this)).removeClass('open')
674    })
675  }
676
677  function getParent($this) {
678    var selector = $this.attr('data-target')
679      , $parent
680
681    if (!selector) {
682      selector = $this.attr('href')
683      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
684    }
685
686    $parent = $(selector)
687    $parent.length || ($parent = $this.parent())
688
689    return $parent
690  }
691
692
693  /* DROPDOWN PLUGIN DEFINITION
694   * ========================== */
695
696  $.fn.dropdown = function (option) {
697    return this.each(function () {
698      var $this = $(this)
699        , data = $this.data('dropdown')
700      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
701      if (typeof option == 'string') data[option].call($this)
702    })
703  }
704
705  $.fn.dropdown.Constructor = Dropdown
706
707
708  /* APPLY TO STANDARD DROPDOWN ELEMENTS
709   * =================================== */
710
711  $(document)
712    .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
713    .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
714    .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
715    .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
716
717}(window.jQuery);/* =========================================================
718 * bootstrap-modal.js v2.2.1
719 * http://twitter.github.com/bootstrap/javascript.html#modals
720 * =========================================================
721 * Copyright 2012 Twitter, Inc.
722 *
723 * Licensed under the Apache License, Version 2.0 (the "License");
724 * you may not use this file except in compliance with the License.
725 * You may obtain a copy of the License at
726 *
727 * http://www.apache.org/licenses/LICENSE-2.0
728 *
729 * Unless required by applicable law or agreed to in writing, softw
729are
730 * distributed under the License is distributed on an "AS IS" BASIS,
731 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
732 * See the License for the specific language governing permissions and
733 * limitations under the License.
734 * ========================================================= */
735
736
737!function ($) {
738
739  "use strict"; // jshint ;_;
740
741
742 /* MODAL CLASS DEFINITION
743  * ====================== */
744
745  var Modal = function (element, options) {
746    this.options = options
747    this.$element = $(element)
748      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
749    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
750  }
751
752  Modal.prototype = {
753
754      constructor: Modal
755
756    , toggle: function () {
757        return this[!this.isShown ? 'show' : 'hide']()
758      }
759
760    , show: function () {
761        var that = this
762          , e = $.Event('show')
763
764        this.$element.trigger(e)
765
766        if (this.isShown || e.isDefaultPrevented()) return
767
768        this.isShown = true
769
770        this.escape()
771
772        this.backdrop(function () {
773          var transition = $.support.transition && that.$element.hasClass('fade')
774
775          if (!that.$element.parent().length) {
776            that.$element.appendTo(document.body) //don't move modals dom position
777          }
778
779          that.$element
780            .show()
781
782          if (transition) {
783            that.$element[0].offsetWidth // force reflow
784          }
785
786          that.$element
787            .addClass('in')
788            .attr('aria-hidden', false)
789
790          that.enforceFocus()
791
792          transition ?
793            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
794            that.$element.focus().trigger('shown')
795
796        })
797      }
798
799    , hide: function (e) {
800        e && e.preventDefault()
801
802        var that = this
803
804        e = $.Event('hide')
805
806        this.$element.trigger(e)
807
808        if (!this.isShown || e.isDefaultPrevented()) return
809
810        this.isShown = false
811
812        this.escape()
813
814        $(document).off('focusin.modal')
815
816        this.$element
817          .removeClass('in')
818          .attr('aria-hidden', true)
819
820        $.support.transition && this.$element.hasClass('fade') ?
821          this.hideWithTransition() :
822          this.hideModal()
823      }
824
825    , enforceFocus: function () {
826        var that = this
827        $(document).on('focusin.modal', function (e) {
828          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
829            that.$element.focus()
830          }
831        })
832      }
833
834    , escape: function () {
835        var that = this
836        if (this.isShown && this.options.keyboard) {
837          this.$element.on('keyup.dismiss.modal', function ( e ) {
838            e.which == 27 && that.hide()
839          })
840        } else if (!this.isShown) {
841          this.$element.off('keyup.dismiss.modal')
842        }
843      }
844
845    , hideWithTransition: function () {
846        var that = this
847          , timeout = setTimeout(function () {
848              that.$element.off($.support.transition.end)
849              that.hideModal()
850            }, 500)
851
852        this.$element.one($.support.transition.end, function () {
853          clearTimeout(timeout)
854          that.hideModal()
855        })
856      }
857
858    , hideModal: function (that) {
859        this.$element
860          .hide()
861          .trigger('hidden')
862
863        this.backdrop()
864      }
865
866    , removeBackdrop: function () {
867        this.$backdrop.remove()
868        this.$backdrop = null
869      }
870
871    , backdrop: function (callback) {
872        var that = this
873          , animate = this.$element.hasClass('fade') ? 'fade' : ''
874
875        if (this.isShown && this.options.backdrop) {
876          var doAnimate = $.support.transition && animate
877
878          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
879            .appendTo(document.body)
880
881          this.$backdrop.click(
882            this.options.backdrop == 'static' ?
883              $.proxy(this.$element[0].focus, this.$element[0])
884            : $.proxy(this.hide, this)
885          )
886
887          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
888
889          this.$backdrop.addClass('in')
890
891          doAnimate ?
892            this.$backdrop.one($.support.transition.end, callback) :
893            callback()
894
895        } else if (!this.isShown && this.$backdrop) {
896          this.$backdrop.removeClass('in')
897
898          $.support.transition && this.$element.hasClass('fade')?
899            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
900            this.removeBackdrop()
901
902        } else if (callback) {
903          callback()
904        }
905      }
906  }
907
908
909 /* MODAL PLUGIN DEFINITION
910  * ======================= */
911
912  $.fn.modal = function (option) {
913    return this.each(function () {
914      var $this = $(this)
915        , data = $this.data('modal')
916        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
917      if (!data) $this.data('modal', (data = new Modal(this, options)))
918      if (typeof option == 'string') data[option]()
919      else if (options.show) data.show()
920    })
921  }
922
923  $.fn.modal.defaults = {
924      backdrop: true
925    , keyboard: true
926    , show: true
927  }
928
929  $.fn.modal.Constructor = Modal
930
931
932 /* MODAL DATA-API
933  * ============== */
934
935  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
936    var $this = $(this)
937      , href = $this.attr('href')
938      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
939      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
940
941    e.preventDefault()
942
943    $target
944      .modal(option)
945      .one('hide', function () {
946        $this.focus()
947      })
948  })
949
950}(window.jQuery);
951/* ===========================================================
952 * bootstrap-tooltip.js v2.2.1
953 * http://twitter.github.com/bootstrap/javascript.html#tooltips
954 * Inspired by the original jQuery.tipsy by Jason Frame
955 * ===========================================================
956 * Copyright 2012 Twitter, Inc.
957 *
958 * Licensed under the Apache License, Version 2.0 (the "License");
959 * you may not use this file except in compliance with the License.
960 * You may obtain a copy of the License at
961 *
962 * http://www.apache.org/licenses/LICENSE-2.0
963 *
964 * Unless required by applicable law or agreed to in writing, software
965 * distributed under the License is distributed on an "AS IS" BASIS,
966 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
967 * See the License for the specific language governing permissions and
968 * limitations under the License.
969 * ========================================================== */
970
971
972!function ($) {
973
974  "use strict"; // jshint ;_;
975
976
977 /* TOOLTIP PUBLIC CLASS DEFINITION
978  * =============================== */
979
980  var Tooltip = function (element, options) {
981    this.init('tooltip', element, options)
982  }
983
984  Tooltip.prototype = {
985
986    constructor: Tooltip
987
988  , init: function (type, element, options) {
989      var eventIn
990        , eventOut
991
992      this.type = type
993      this.$element = $(element)
994      this.options = this.getOptions(options)
995      this.enabled = true
996
997      if (this.options.trigger == 'click') {
998        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
999      } else if (this.options.trigger != 'manual') {
1000        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
1001        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
1002        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1003        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1004      }
1005
1006      this.options.selector ?
1007        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1008        this.fixTitle()
1009    }
1010
1011  , getOptions: function (options) {
1012      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
1013
1014      if (options.delay && typeof options.delay == 'number') {
1015        options.delay = {
1016          show: options.delay
1017        , hide: options.delay
1018        }
1019      }
1020
1021      return options
1022    }
1023
1024  , enter: function (e) {
1025      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1026
1027      if (!self.options.delay || !self.options.delay.show) return self.show()
1028
1029      clearTimeout(this.timeout)
1030      self.hoverState = 'in'
1031      this.timeout = setTimeout(function() {
1032        if (self.hoverState == 'in') self.show()
1033      }, self.options.delay.show)
1034    }
1035
1036  , leave: function (e) {
1037      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1038
1039      if (this.timeout) clearTimeout(this.timeout)
1040      if (!self.options.delay || !self.options.delay.hide) return self.hide()
1041
1042      self.hoverState = 'out'
1043      this.timeout = setTimeout(function() {
1044        if (self.hoverState == 'out') self.hide()
1045      }, self.options.delay.hide)
1046    }
1047
1048  , show: function () {
1049      var $tip
1050        , inside
1051        , pos
1052        , actualWidth
1053        , actualHeight
1054        , placement
1055        , tp
1056
1057      if (this.hasContent() && this.enabled) {
1058        $tip = this.tip()
1059        this.setContent()
1060
1061        if (this.options.animation) {
1062          $tip.addClass('fade')
1063        }
1064
1065        placement = typeof this.options.placement == 'function' ?
1066          this.options.placement.call(this, $tip[0], this.$element[0]) :
1067          this.options.placement
1068
1069        inside = /in/.test(placement)
1070
1071        $tip
1072          .detach()
1073          .css({ top: 0, left: 0, display: 'block' })
1074          .insertAfter(this.$element)
1075
1076        pos = this.getPosition(inside)
1077
1078        actualWidth = $tip[0].offsetWidth
1079        actualHeight = $tip[0].offsetHeight
1080
1081        switch (inside ? placement.split(' ')[1] : placement) {
1082          case 'bottom':
1083            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
1084            break
1085          case 'top':
1086            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
1087            break
1088          case 'left':
1089            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
1090            break
1091          case 'right':
1092            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
1093            break
1094        }
1095
1096        $tip
1097          .offset(tp)
1098          .addClass(placement)
1099          .addClass('in')
1100      }
1101    }
1102
1103  , setContent: function () {
1104      var $tip = this.tip()
1105        , title = this.getTitle()
1106
1107      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1108      $tip.removeClass('fade in top bottom left right')
1109    }
1110
1111  , hide: function () {
1112      var that = this
1113        , $tip = this.tip()
1114
1115      $tip.removeClass('in')
1116
1117      function removeWithAnimation() {
1118        var timeout = setTimeout(function () {
1119          $tip.off($.support.transition.end).detach()
1120        }, 500)
1121
1122        $tip.one($.support.transition.end, function () {
1123          clearTimeout(timeout)
1124          $tip.detach()
1125        })
1126      }
1127
1128      $.support.transition && this.$tip.hasClass('fade') ?
1129        removeWithAnimation() :
1130        $tip.detach()
1131
1132      return this
1133    }
1134
1135  , fixTitle: function () {
1136      var $e = this.$element
1137      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1138        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
1139      }
1140    }
1141
1142  , hasContent: function () {
1143      return this.getTitle()
1144    }
1145
1146  , getPosition: function (inside) {
1147      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
1148        width: this.$element[0].offsetWidth
1149      , height: this.$element[0].offsetHeight
1150      })
1151    }
1152
1153  , getTitle: function () {
1154      var title
1155        , $e = this.$element
1156        , o = this.options
1157
1158      title = $e.attr('data-original-title')
1159        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1160
1161      return title
1162    }
1163
1164  , tip: function () {
1165      return this.$tip = this.$tip || $(this.options.template)
1166    }
1167
1168  , validate: function () {
1169      if (!this.$element[0].parentNode) {
1170        this.hide()
1171        this.$element = null
1172        this.options = null
1173      }
1174    }
1175
1176  , enable: function () {
1177      this.enabled = true
1178    }
1179
1180  , disable: function () {
1181      this.enabled = false
1182    }
1183
1184  , toggleEnabled: function () {
1185      this.enabled = !this.enabled
1186    }
1187
1188  , toggle: function (e) {
1189      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1190      self[self.tip().hasClass('in') ? 'hide' : 'show']()
1191    }
1192
1193  , destroy: function () {
1194      this.hide().$element.off('.' + this.type).removeData(this.type)
1195    }
1196
1197  }
1198
1199
1200 /* TOOLTIP PLUGIN DEFINITION
1201  * ========================= */
1202
1203  $.fn.tooltip = function ( option ) {
1204    return this.each(function () {
1205      var $this = $(this)
1206        , data = $this.data('tooltip')
1207        , options = typeof option == 'object' && option
1208      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
1209      if (typeof option == 'string') data[option]()
1210    })
1211  }
1212
1213  $.fn.tooltip.Constructor = Tooltip
1214
1215  $.fn.tooltip.defaults = {
1216    animation: true
1217  , placement: 'top'
1218  , selector: false
1219  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1220  , trigger: 'hover'
1221  , title: ''
1222  , delay: 0
1223  , html: false
1224  }
1225
1226}(window.jQuery);/* ===========================================================
1227 * bootstrap-popover.js v2.2.1
1228 * http://twitter.github.com/bootstrap/javascript.html#popovers
1229 * ===========================================================
1230 * Copyright 2012 Twitter, Inc.
1231 *
1232 * Licensed under the Apache License, Version 2.0 (the "License");
1233 * you may not use this file except in compliance with the License.
1234 * You may obtain a copy of the License at
1235 *
1236 * http://www.apache.org/licenses/LICENSE-2.0
1237 *
1238 * Unless required by applicable law or agreed to in writing, software
1239 * distributed under the License is distributed on an "AS IS" BASIS,
1240 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1241 * See the License for the specific language governing permissions and
1242 * limitations under the License.
1243 * =========================================================== */
1244
1245
1246!function ($) {
1247
1248  "use strict"; // jshint ;_;
1249
1250
1251 /* POPOVER PUBLIC CLASS DEFINITION
1252  * =============================== */
1253
1254  var Popover = function (element, options) {
1255    this.init('popover', element, options)
1256  }
1257
1258
1259  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1260     ========================================== */
1261
1262  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1263
1264    constructor: Popover
1265
1266  , setContent: function () {
1267      var $tip = this.tip()
1268        , title = this.getTitle()
1269        , content = this.getContent()
1270
1271      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1272      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
1273
1274      $tip.removeClass('fade top bottom left right in')
1275    }
1276
1277  , hasContent: function () {
1278      return this.getTitle() || this.getContent()
1279    }
1280
1281  , getContent: function () {
1282      var content
1283        , $e = this.$element
1284        , o = this.options
1285
1286      content = $e.attr('data-content')
1287        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
1288
1289      return content
1290    }
1291
1292  , tip: function () {
1293      if (!this.$tip) {
1294        this.$tip = $(this.options.template)
1295      }
1296      return this.$tip
1297    }
1298
1299  , destroy: function () {
1300      this.hide().$element.off('.' + this.type).removeData(this.type)
1301    }
1302
1303  })
1304
1305
1306 /* POPOVER PLUGIN DEFINITION
1307  * ======================= */
1308
1309  $.fn.popover = function (option) {
1310    return this.each(function () {
1311      var $this = $(this)
1312        , data = $this.data('popover')
1313        , options = typeof option == 'object' && option
1314      if (!data) $this.data('popover', (data = new Popover(this, options)))
1315      if (typeof option == 'string') data[option]()
1316    })
1317  }
1318
1319  $.fn.popover.Constructor = Popover
1320
1321  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1322    placement: 'right'
1323  , trigger: 'click'
1324  , content: ''
1325  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
1326  })
1327
1328}(window.jQuery);/* =============================================================
1329 * bootstrap-scrollspy.js v2.2.1
1330 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1331 * =============================================================
1332 * Copyright 2012 Twitter, Inc.
1333 *
1334 * Licensed under the Apache License, Version 2.0 (the "License");
1335 * you may not use this file except in compliance with the License.
1336 * You may obtain a copy of the License at
1337 *
1338 * http://www.apache.org/licenses/LICENSE-2.0
1339 *
1340 * Unless required by applicable law or agreed to in writing, software
1341 * distributed under the License is distributed on an "AS IS" BASIS,
1342 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343 * See the License for the specific language governing permissions and
1344 * limitations under the License.
1345 * ============================================================== */
1346
1347
1348!function ($) {
1349
1350  "use strict"; // jshint ;_;
1351
1352
1353 /* SCROLLSPY CLASS DEFINITION
1354  * ========================== */
1355
1356  function ScrollSpy(element, options) {
1357    var process = $.proxy(this.process, this)
1358      , $element = $(element).is('body') ? $(window) : $(element)
1359      , href
1360    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1361    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
1362    this.selector = (this.options.target
1363      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1364      || '') + ' .nav li > a'
1365    this.$body = $('body')
1366    this.refresh()
1367    this.process()
1368  }
1369
1370  ScrollSpy.prototype = {
1371
1372      constructor: ScrollSpy
1373
1374    , refresh: function () {
1375        var self = this
1376          , $targets
1377
1378        this.offsets = $([])
1379        this.targets = $([])
1380
1381        $targets = this.$body
1382          .find(this.selector)
1383          .map(function () {
1384            var $el = $(this)
1385              , href = $el.data('target') || $el.attr('href')
1386              , $href = /^#\w/.test(href) && $(href)
1387            return ( $href
1388              && $href.length
1389              && [[ $href.position().top, href ]] ) || null
1390          })
1391          .sort(function (a, b) { return a[0] - b[0] })
1392          .each(function () {
1393            self.offsets.push(this[0])
1394            self.targets.push(this[1])
1395          })
1396      }
1397
1398    , process: function () {
1399        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1400          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1401          , maxScroll = scrollHeight - this.$scrollElement.height()
1402          , offsets = this.offsets
1403          , targets = this.targets
1404          , activeTarget = this.activeTarget
1405          , i
1406
1407        if (scrollTop >= maxScroll) {
1408          return activeTarget != (i = targets.last()[0])
1409            && this.activate ( i )
1410        }
1411
1412        for (i = offsets.length; i--;) {
1413          activeTarget != targets[i]
1414            && scrollTop >= offsets[i]
1415            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1416            && this.activate( targets[i] )
1417        }
1418      }
1419
1420    , activate: function (target) {
1421        var active
1422          , selector
1423
1424        this.activeTarget = target
1425
1426        $(this.selector)
1427          .parent('.active')
1428          .removeClass('active')
1429
1430        selector = this.selector
1431          + '[data-target="' + target + '"],'
1432          + this.selector + '[href="' + target + '"]'
1433
1434        active = $(selector)
1435          .parent('li')
1436          .addClass('active')
1437
1438        if (active.parent('.dropdown-menu').length)  {
1439          active = active.closest('li.dropdown').addClass('active')
1440        }
1441
1442        active.trigger('activate')
1443      }
1444
1445  }
1446
1447
1448 /* SCROLLSPY PLUGIN DEFINITION
1449  * =========================== */
1450
1451  $.fn.scrollspy = function (option) {
1452    return this.each(function () {
1453      var $this = $(this)
1454        , data = $this.data('scrollspy')
1455        , options = typeof option == 'object' && option
1456      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1457      if (typeof option == 'string') data[option]()
1458    })
1459  }
1460
1461  $.fn.scrollspy.Constructor = ScrollSpy
1462
1463  $.fn.scrollspy.defaults = {
1464    offset: 10
1465  }
1466
1467
1468 /* SCROLLSPY DATA-API
1469  * ================== */
1470
1471  $(window).on('load', function () {
1472    $('[data-spy="scroll"]').each(function () {
1473      var $spy = $(this)
1474      $spy.scrollspy($spy.data())
1475    })
1476  })
1477
1478}(window.jQuery);/* ========================================================
1479 * bootstrap-tab.js v2.2.1
1480 * http://twitter.github.com/bootstrap/javascript.html#tabs
1481 * ========================================================
1482 * Copyright 2012 Twitter, Inc.
1483 *
1484 * Licensed under the Apache License, Version 2.0 (the "License");
1485 * you may not use this file except in compliance with the License.
1486 * You may obtain a copy of the License at
1487 *
1488 * http://www.apache.org/licenses/LICENSE-2.0
1489 *
1490 * Unless required by applicable law or agreed to in writing, software
1491 * distributed under the License is distributed on an "AS IS" BASIS,
1492 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1493 * See the License for the specific language governing permissions and
1494 * limitations under the License.
1495 * ======================================================== */
1496
1497
1498!function ($) {
1499
1500  "use strict"; // jshint ;_;
1501
1502
1503 /* TAB CLASS DEFINITION
1504  * ==================== */
1505
1506  var Tab = function (element) {
1507    this.element = $(element)
1508  }
1509
1510  Tab.prototype = {
1511
1512    constructor: Tab
1513
1514  , show: function () {
1515      var $this = this.element
1516        , $ul = $this.closest('ul:not(.dropdown-menu)')
1517        , selector = $this.attr('data-target')
1518        , previous
1519        , $target
1520        , e
1521
1522      if (!selector) {
1523        selector = $this.attr('href')
1524        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1525      }
1526
1527      if ( $this.parent('li').hasClass('active') ) return
1528
1529      previous = $ul.find('.active:last a')[0]
1530
1531      e = $.Event('show', {
1532        relatedTarget: previous
1533      })
1534
1535      $this.trigger(e)
1536
1537      if (e.isDefaultPrevented()) return
1538
1539      $target = $(selector)
1540
1541      this.activate($this.parent('li'), $ul)
1542      this.activate($target, $target.parent(), function () {
1543        $this.trigger({
1544          type: 'shown'
1545        , relatedTarget: previous
1546        })
1547      })
1548    }
1549
1550  , activate: function ( element, container, callback) {
1551      var $active = container.find('> .active')
1552        , transition = callback
1553            && $.support.transition
1554            && $active.hasClass('fade')
1555
1556      function next() {
1557        $active
1558          .removeClass('active')
1559          .find('> .dropdown-menu > .active')
1560          .removeClass('active')
1561
1562        element.addClass('active')
1563
1564        if (transition) {
1565          element[0].offsetWidth // reflow for transition
1566          element.addClass('in')
1567        } else {
1568          element.removeClass('fade')
1569        }
1570
1571        if ( element.parent('.dropdown-menu') ) {
1572          element.closest('li.dropdown').addClass('active')
1573        }
1574
1575        callback && callback()
1576      }
1577
1578      transition ?
1579        $active.one($.support.transition.end, next) :
1580        next()
1581
1582      $active.removeClass('in')
1583    }
1584  }
1585
1586
1587 /* TAB PLUGIN DEFINITION
1588  * ===================== */
1589
1590  $.fn.tab = function ( option ) {
1591    return this.each(function () {
1592      var $this = $(this)
1593        , data = $this.data('tab')
1594      if (!data) $this.data('tab', (data = new Tab(this)))
1595      if (typeof option == 'string') data[option]()
1596    })
1597  }
1598
1599  $.fn.tab.Constructor = Tab
1600
1601
1602 /* TAB DATA-API
1603  * ============ */
1604
1605  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1606    e.preventDefault()
1607    $(this).tab('show')
1608  })
1609
1610}(window.jQuery);/* =============================================================
1611 * bootstrap-typeahead.js v2.2.1
1612 * http://twitter.github.com/bootstrap/javascript.html#typeahead
1613 * =============================================================
1614 * Copyright 2012 Twitter, Inc.
1615 *
1616 * Licensed under the Apache License, Version 2.0 (the "License");
1617 * you may not use this file except in compliance with the License.
1618 * You may obtain a copy of the License at
1619 *
1620 * http://www.apache.org/licenses/LICENSE-2.0
1621 *
1622 * Unless required by applicable law or agreed to in writing, software
1623 * distributed under the License is distributed on an "AS IS" BASIS,
1624 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1625 * See the License for the specific language governing permissions and
1626 * limitations under the License.
1627 * ============================================================ */
1628
1629
1630!function($){
1631
1632  "use strict"; // jshint ;_;
1633
1634
1635 /* TYPEAHEAD PUBLIC CLASS DEFINITION
1636  * ================================= */
1637
1638  var Typeahead = function (element, options) {
1639    this.$element = $(element)
1640    this.options = $.extend({}, $.fn.typeahead.defaults, options)
1641    this.matcher = this.options.matcher || this.matcher
1642    this.sorter = this.options.sorter || this.sorter
1643    this.highlighter = this.options.highlighter || this.highlighter
1644    this.updater = this.options.updater || this.updater
1645    this.$menu = $(this.options.menu).appendTo('body')
1646    this.source = this.options.source
1647    this.shown = false
1648    this.listen()
1649  }
1650
1651  Typeahead.prototype = {
1652
1653    constructor: Typeahead
1654
1655  , select: function () {
1656      var val = this.$menu.find('.active').attr('data-value')
1657      this.$element
1658        .val(this.updater(val))
1659        .change()
1660      return this.hide()
1661    }
1662
1663  , updater: function (item) {
1664      return item
1665    }
1666
1667  , show: function () {
1668      var pos = $.extend({}, this.$element.offset(), {
1669        height: this.$element[0].offsetHeight
1670      })
1671
1672      this.$menu.css({
1673        top: pos.top + pos.height
1674      , left: pos.left
1675      })
1676
1677      this.$menu.show()
1678      this.shown = true
1679      return this
1680    }
1681
1682  , hide: function () {
1683      this.$menu.hide()
1684      this.shown = false
1685      return this
1686    }
1687
1688  , lookup: function (event) {
1689      var items
1690
1691      this.query = this.$element.val()
1692
1693      if (!this.query || this.query.length < this.options.minLength) {
1694        return this.shown ? this.hide() : this
1695      }
1696
1697      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
1698
1699      return items ? this.process(items) : this
1700    }
1701
1702  , process: function (items) {
1703      var that = this
1704
1705      items = $.grep(items, function (item) {
1706        return that.matcher(item)
1707      })
1708
1709      items = this.sorter(items)
1710
1711      if (!items.length) {
1712        return this.shown ? this.hide() : this
1713      }
1714
1715      return this.render(items.slice(0, this.options.items)).show()
1716    }
1717
1718  , matcher: function (item) {
1719      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1720    }
1721
1722  , sorter: function (items) {
1723      var beginswith = []
1724        , caseSensitive = []
1725        , caseInsensitive = []
1726        , item
1727
1728      while (item = items.shift()) {
1729        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1730        else if (~item.indexOf(this.query)) caseSensitive.push(item)
1731        else caseInsensitive.push(item)
1732      }
1733
1734      return beginswith.concat(caseSensitive, caseInsensitive)
1735    }
1736
1737  , highlighter: function (item) {
1738      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1739      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1740        return '<strong>' + match + '</strong>'
1741      })
1742    }
1743
1744  , render: function (items) {
1745      var that = this
1746
1747      items = $(items).map(function (i, item) {
1748        i = $(that.options.item).attr('data-value', item)
1749        i.find('a').html(that.highlighter(item))
1750        return i[0]
1751      })
1752
1753      items.first().addClass('active')
1754      this.$menu.html(items)
1755      return this
1756    }
1757
1758  , next: function (event) {
1759      var active = this.$menu.find('.active').removeClass('active')
1760        , next = active.next()
1761
1762      if (!next.length) {
1763        next = $(this.$menu.find('li')[0])
1764      }
1765
1766      next.addClass('active')
1767    }
1768
1769  , prev: function (event) {
1770      var active = this.$menu.find('.active').removeClass('active')
1771        , prev = active.prev()
1772
1773      if (!prev.length) {
1774        prev = this.$menu.find('li').last()
1775      }
1776
1777      prev.addClass('active')
1778    }
1779
1780  , listen: function () {
1781      this.$element
1782        .on('blur',     $.proxy(this.blur, this))
1783        .on('keypress', $.proxy(this.keypress, this))
1784        .on('keyup',    $.proxy(this.keyup, this))
1785
1786      if (this.eventSupported('keydown')) {
1787        this.$element.on('keydown', $.proxy(this.keydown, this))
1788      }
1789
1790      this.$menu
1791        .on('click', $.proxy(this.click, this))
1792        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1793    }
1794
1795  , eventSupported: function(eventName) {
1796      var isSupported = eventName in this.$element
1797      if (!isSupported) {
1798        this.$element.setAttribute(eventName, 'return;')
1799        isSupported = typeof this.$element[eventName] === 'function'
1800      }
1801      return isSupported
1802    }
1803
1804  , move: function (e) {
1805      if (!this.shown) return
1806
1807      switch(e.keyCode) {
1808        case 9: // tab
1809        case 13: // enter
1810        case 27: // escape
1811          e.preventDefault()
1812          break
1813
1814        case 38: // up arrow
1815          e.preventDefault()
1816          this.prev()
1817          break
1818
1819        case 40: // down arrow
1820          e.preventDefault()
1821          this.next()
1822          break
1823      }
1824
1825      e.stopPropagation()
1826    }
1827
1828  , keydown: function (e) {
1829      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
1830      this.move(e)
1831    }
1832
1833  , keypress: function (e) {
1834      if (this.suppressKeyPressRepeat) return
1835      this.move(e)
1836    }
1837
1838  , keyup: function (e) {
1839      switch(e.keyCode) {
1840        case 40: // down arrow
1841        case 38: // up arrow
1842        case 16: // shift
1843        case 17: // ctrl
1844        case 18: // alt
1845          break
1846
1847        case 9: // tab
1848        case 13: // enter
1849          if (!this.shown) return
1850          this.select()
1851          break
1852
1853        case 27: // escape
1854          if (!this.shown) return
1855          this.hide()
1856          break
1857
1858        default:
1859          this.lookup()
1860      }
1861
1862      e.stopPropagation()
1863      e.preventDefault()
1864  }
1865
1866  , blur: function (e) {
1867      var that = this
1868      setTimeout(function () { that.hide() }, 150)
1869    }
1870
1871  , click: function (e) {
1872      e.stopPropagation()
1873      e.preventDefault()
1874      this.select()
1875    }
1876
1877  , mouseenter: function (e) {
1878      this.$menu.find('.active').removeClass('active')
1879      $(e.currentTarget).addClass('active')
1880    }
1881
1882  }
1883
1884
1885  /* TYPEAHEAD PLUGIN DEFINITION
1886   * =========================== */
1887
1888  $.fn.typeahead = function (option) {
1889    return this.each(function () {
1890      var $this = $(this)
1891        , data = $this.data('typeahead')
1892        , options = typeof option == 'object' && option
1893      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
1894      if (typeof option == 'string') data[option]()
1895    })
1896  }
1897
1898  $.fn.typeahead.defaults = {
1899    source: []
1900  , items: 8
1901  , menu: '<ul class="typeahead dropdown-menu"></ul>'
1902  , item: '<li><a href="#"></a></li>'
1903  , minLength: 1
1904  }
1905
1906  $.fn.typeahead.Constructor = Typeahead
1907
1908
1909 /*   TYPEAHEAD DATA-API
1910  * ================== */
1911
1912  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
1913    var $this = $(this)
1914    if ($this.data('typeahead')) return
1915    e.preventDefault()
1916    $this.typeahead($this.data())
1917  })
1918
1919}(window.jQuery);
1920/* ==========================================================
1921 * bootstrap-affix.js v2.2.1
1922 * http://twitter.github.com/bootstrap/javascript.html#affix
1923 * ==========================================================
1924 * Copyright 2012 Twitter, Inc.
1925 *
1926 * Licensed under the Apache License, Version 2.0 (the "License");
1927 * you may not use this file except in compliance with the License.
1928 * You may obtain a copy of the License at
1929 *
1930 * http://www.apache.org/licenses/LICENSE-2.0
1931 *
1932 * Unless required by applicable law or agreed to in writing, software
1933 * distributed under the License is distributed on an "AS IS" BASIS,
1934 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1935 * See the License for the specific language governing permissions and
1936 * limitations under the License.
1937 * ========================================================== */
1938
1939
1940!function ($) {
1941
1942  "use strict"; // jshint ;_;
1943
1944
1945 /* AFFIX CLASS DEFINITION
1946  * ====================== */
1947
1948  var Affix = function (element, options) {
1949    this.options = $.extend({}, $.fn.affix.defaults, options)
1950    this.$window = $(window)
1951      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
1952      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
1953    this.$element = $(element)
1954    this.checkPosition()
1955  }
1956
1957  Affix.prototype.checkPosition = function () {
1958    if (!this.$element.is(':visible')) return
1959
1960    var scrollHeight = $(document).height()
1961      , scrollTop = this.$window.scrollTop()
1962      , position = this.$element.offset()
1963      , offset = this.options.offset
1964      , offsetBottom = offset.bottom
1965      , offsetTop = offset.top
1966      , reset = 'affix affix-top affix-bottom'
1967      , affix
1968
1969    if (typeof offset != 'object') offsetBottom = offsetTop = offset
1970    if (typeof offsetTop == 'function') offsetTop = offset.top()
1971    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
1972
1973    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
1974      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
1975      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
1976      'top'    : false
1977
1978    if (this.affixed === affix) return
1979
1980    this.affixed = affix
1981    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
1982
1983    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
1984  }
1985
1986
1987 /* AFFIX PLUGIN DEFINITION
1988  * ======================= */
1989
1990  $.fn.affix = function (option) {
1991    return this.each(function () {
1992      var $this = $(this)
1993        , data = $this.data('affix')
1994        , options = typeof option == 'object' && option
1995      if (!data) $this.data('affix', (data = new Affix(this, options)))
1996      if (typeof option == 'string') data[option]()
1997    })
1998  }
1999
2000  $.fn.affix.Constructor = Affix
2001
2002  $.fn.affix.defaults = {
2003    offset: 0
2004  }
2005
2006
2007 /* AFFIX DATA-API
2008  * ============== */
2009
2010  $(window).on('load', function () {
2011    $('[data-spy="affix"]').each(function () {
2012      var $spy = $(this)
2013        , data = $spy.data()
2014
2015      data.offset = data.offset || {}
2016
2017      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
2018      data.offsetTop && (data.offset.top = data.offsetTop)
2019
2020      $spy.affix(data)
2021    })
2022  })
2023
2024
2025}(window.jQuery);

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.