2 * Bootstrap v3.0.3 (http://getbootstrap.com)
3 * Copyright 2013 Twitter, Inc.
4 * Licensed under http://www.apache.org/licenses/LICENSE-2.0
7 if (typeof jQuery
=== "undefined") { throw new Error("Bootstrap requires jQuery") }
9 /* ========================================================================
10 * Bootstrap: transition.js v3.0.3
11 * http://getbootstrap.com/javascript/#transitions
12 * ========================================================================
13 * Copyright 2013 Twitter, Inc.
15 * Licensed under the Apache License, Version 2.0 (the "License");
16 * you may not use this file except in compliance with the License.
17 * You may obtain a copy of the License at
19 * http://www.apache.org/licenses/LICENSE-2.0
21 * Unless required by applicable law or agreed to in writing, software
22 * distributed under the License is distributed on an "AS IS" BASIS,
23 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24 * See the License for the specific language governing permissions and
25 * limitations under the License.
26 * ======================================================================== */
29 +function ($) { "use strict";
31 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
32 // ============================================================
34 function transitionEnd() {
35 var el
= document
.createElement('bootstrap')
37 var transEndEventNames
= {
38 'WebkitTransition' : 'webkitTransitionEnd'
39 , 'MozTransition' : 'transitionend'
40 , 'OTransition' : 'oTransitionEnd otransitionend'
41 , 'transition' : 'transitionend'
44 for (var name
in transEndEventNames
) {
45 if (el
.style
[name
] !== undefined) {
46 return { end
: transEndEventNames
[name
] }
51 // http://blog.alexmaccaw.com/css-transitions
52 $.fn
.emulateTransitionEnd = function (duration
) {
53 var called
= false, $el
= this
54 $(this).one($.support
.transition
.end
, function () { called
= true })
55 var callback = function () { if (!called
) $($el
).trigger($.support
.transition
.end
) }
56 setTimeout(callback
, duration
)
61 $.support
.transition
= transitionEnd()
66 /* ========================================================================
67 * Bootstrap: alert.js v3.0.3
68 * http://getbootstrap.com/javascript/#alerts
69 * ========================================================================
70 * Copyright 2013 Twitter, Inc.
72 * Licensed under the Apache License, Version 2.0 (the "License");
73 * you may not use this file except in compliance with the License.
74 * You may obtain a copy of the License at
76 * http://www.apache.org/licenses/LICENSE-2.0
78 * Unless required by applicable law or agreed to in writing, software
79 * distributed under the License is distributed on an "AS IS" BASIS,
80 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
81 * See the License for the specific language governing permissions and
82 * limitations under the License.
83 * ======================================================================== */
86 +function ($) { "use strict";
88 // ALERT CLASS DEFINITION
89 // ======================
91 var dismiss
= '[data-dismiss="alert"]'
92 var Alert = function (el
) {
93 $(el
).on('click', dismiss
, this.close
)
96 Alert
.prototype.close = function (e
) {
98 var selector
= $this.attr('data-target')
101 selector
= $this.attr('href')
102 selector
= selector
&& selector
.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
105 var $parent
= $(selector
)
107 if (e
) e
.preventDefault()
109 if (!$parent
.length
) {
110 $parent
= $this.hasClass('alert') ? $this : $this.parent()
113 $parent
.trigger(e
= $.Event('close.bs.alert'))
115 if (e
.isDefaultPrevented()) return
117 $parent
.removeClass('in')
119 function removeElement() {
120 $parent
.trigger('closed.bs.alert').remove()
123 $.support
.transition
&& $parent
.hasClass('fade') ?
125 .one($.support
.transition
.end
, removeElement
)
126 .emulateTransitionEnd(150) :
131 // ALERT PLUGIN DEFINITION
132 // =======================
136 $.fn
.alert = function (option
) {
137 return this.each(function () {
139 var data
= $this.data('bs.alert')
141 if (!data
) $this.data('bs.alert', (data
= new Alert(this)))
142 if (typeof option
== 'string') data
[option
].call($this)
146 $.fn
.alert
.Constructor
= Alert
152 $.fn
.alert
.noConflict = function () {
161 $(document
).on('click.bs.alert.data-api', dismiss
, Alert
.prototype.close
)
165 /* ========================================================================
166 * Bootstrap: button.js v3.0.3
167 * http://getbootstrap.com/javascript/#buttons
168 * ========================================================================
169 * Copyright 2013 Twitter, Inc.
171 * Licensed under the Apache License, Version 2.0 (the "License");
172 * you may not use this file except in compliance with the License.
173 * You may obtain a copy of the License at
175 * http://www.apache.org/licenses/LICENSE-2.0
177 * Unless required by applicable law or agreed to in writing, software
178 * distributed under the License is distributed on an "AS IS" BASIS,
179 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
180 * See the License for the specific language governing permissions and
181 * limitations under the License.
182 * ======================================================================== */
185 +function ($) { "use strict";
187 // BUTTON PUBLIC CLASS DEFINITION
188 // ==============================
190 var Button = function (element
, options
) {
191 this.$element
= $(element
)
192 this.options
= $.extend({}, Button
.DEFAULTS
, options
)
196 loadingText
: 'loading...'
199 Button
.prototype.setState = function (state
) {
201 var $el
= this.$element
202 var val
= $el
.is('input') ? 'val' : 'html'
203 var data
= $el
.data()
205 state
= state
+ 'Text'
207 if (!data
.resetText
) $el
.data('resetText', $el
[val
]())
209 $el
[val
](data
[state
] || this.options
[state
])
211 // push to event loop to allow forms to submit
212 setTimeout(function () {
213 state
== 'loadingText' ?
214 $el
.addClass(d
).attr(d
, d
) :
215 $el
.removeClass(d
).removeAttr(d
);
219 Button
.prototype.toggle = function () {
220 var $parent
= this.$element
.closest('[data-toggle="buttons"]')
223 if ($parent
.length
) {
224 var $input
= this.$element
.find('input')
225 if ($input
.prop('type') === 'radio') {
226 // see if clicking on current one
227 if ($input
.prop('checked') && this.$element
.hasClass('active'))
230 $parent
.find('.active').removeClass('active')
232 if (changed
) $input
.prop('checked', !this.$element
.hasClass('active')).trigger('change')
235 if (changed
) this.$element
.toggleClass('active')
239 // BUTTON PLUGIN DEFINITION
240 // ========================
242 var old
= $.fn
.button
244 $.fn
.button = function (option
) {
245 return this.each(function () {
247 var data
= $this.data('bs.button')
248 var options
= typeof option
== 'object' && option
250 if (!data
) $this.data('bs.button', (data
= new Button(this, options
)))
252 if (option
== 'toggle') data
.toggle()
253 else if (option
) data
.setState(option
)
257 $.fn
.button
.Constructor
= Button
260 // BUTTON NO CONFLICT
261 // ==================
263 $.fn
.button
.noConflict = function () {
272 $(document
).on('click.bs.button.data-api', '[data-toggle^=button]', function (e
) {
273 var $btn
= $(e
.target
)
274 if (!$btn
.hasClass('btn')) $btn
= $btn
.closest('.btn')
275 $btn
.button('toggle')
281 /* ========================================================================
282 * Bootstrap: carousel.js v3.0.3
283 * http://getbootstrap.com/javascript/#carousel
284 * ========================================================================
285 * Copyright 2013 Twitter, Inc.
287 * Licensed under the Apache License, Version 2.0 (the "License");
288 * you may not use this file except in compliance with the License.
289 * You may obtain a copy of the License at
291 * http://www.apache.org/licenses/LICENSE-2.0
293 * Unless required by applicable law or agreed to in writing, software
294 * distributed under the License is distributed on an "AS IS" BASIS,
295 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
296 * See the License for the specific language governing permissions and
297 * limitations under the License.
298 * ======================================================================== */
301 +function ($) { "use strict";
303 // CAROUSEL CLASS DEFINITION
304 // =========================
306 var Carousel = function (element
, options
) {
307 this.$element
= $(element
)
308 this.$indicators
= this.$element
.find('.carousel-indicators')
309 this.options
= options
316 this.options
.pause
== 'hover' && this.$element
317 .on('mouseenter', $.proxy(this.pause
, this))
318 .on('mouseleave', $.proxy(this.cycle
, this))
321 Carousel
.DEFAULTS
= {
327 Carousel
.prototype.cycle = function (e
) {
328 e
|| (this.paused
= false)
330 this.interval
&& clearInterval(this.interval
)
332 this.options
.interval
334 && (this.interval
= setInterval($.proxy(this.next
, this), this.options
.interval
))
339 Carousel
.prototype.getActiveIndex = function () {
340 this.$active
= this.$element
.find('.item.active')
341 this.$items
= this.$active
.parent().children()
343 return this.$items
.index(this.$active
)
346 Carousel
.prototype.to = function (pos
) {
348 var activeIndex
= this.getActiveIndex()
350 if (pos
> (this.$items
.length
- 1) || pos
< 0) return
352 if (this.sliding
) return this.$element
.one('slid.bs.carousel', function () { that
.to(pos
) })
353 if (activeIndex
== pos
) return this.pause().cycle()
355 return this.slide(pos
> activeIndex
? 'next' : 'prev', $(this.$items
[pos
]))
358 Carousel
.prototype.pause = function (e
) {
359 e
|| (this.paused
= true)
361 if (this.$element
.find('.next, .prev').length
&& $.support
.transition
.end
) {
362 this.$element
.trigger($.support
.transition
.end
)
366 this.interval
= clearInterval(this.interval
)
371 Carousel
.prototype.next = function () {
372 if (this.sliding
) return
373 return this.slide('next')
376 Carousel
.prototype.prev = function () {
377 if (this.sliding
) return
378 return this.slide('prev')
381 Carousel
.prototype.slide = function (type
, next
) {
382 var $active
= this.$element
.find('.item.active')
383 var $next
= next
|| $active
[type
]()
384 var isCycling
= this.interval
385 var direction
= type
== 'next' ? 'left' : 'right'
386 var fallback
= type
== 'next' ? 'first' : 'last'
390 if (!this.options
.wrap
) return
391 $next
= this.$element
.find('.item')[fallback
]()
396 isCycling
&& this.pause()
398 var e
= $.Event('slide.bs.carousel', { relatedTarget
: $next
[0], direction
: direction
})
400 if ($next
.hasClass('active')) return
402 if (this.$indicators
.length
) {
403 this.$indicators
.find('.active').removeClass('active')
404 this.$element
.one('slid.bs.carousel', function () {
405 var $nextIndicator
= $(that
.$indicators
.children()[that
.getActiveIndex()])
406 $nextIndicator
&& $nextIndicator
.addClass('active')
410 if ($.support
.transition
&& this.$element
.hasClass('slide')) {
411 this.$element
.trigger(e
)
412 if (e
.isDefaultPrevented()) return
414 $next
[0].offsetWidth
// force reflow
415 $active
.addClass(direction
)
416 $next
.addClass(direction
)
418 .one($.support
.transition
.end
, function () {
419 $next
.removeClass([type
, direction
].join(' ')).addClass('active')
420 $active
.removeClass(['active', direction
].join(' '))
422 setTimeout(function () { that
.$element
.trigger('slid.bs.carousel') }, 0)
424 .emulateTransitionEnd(600)
426 this.$element
.trigger(e
)
427 if (e
.isDefaultPrevented()) return
428 $active
.removeClass('active')
429 $next
.addClass('active')
431 this.$element
.trigger('slid.bs.carousel')
434 isCycling
&& this.cycle()
440 // CAROUSEL PLUGIN DEFINITION
441 // ==========================
443 var old
= $.fn
.carousel
445 $.fn
.carousel = function (option
) {
446 return this.each(function () {
448 var data
= $this.data('bs.carousel')
449 var options
= $.extend({}, Carousel
.DEFAULTS
, $this.data(), typeof option
== 'object' && option
)
450 var action
= typeof option
== 'string' ? option
: options
.slide
452 if (!data
) $this.data('bs.carousel', (data
= new Carousel(this, options
)))
453 if (typeof option
== 'number') data
.to(option
)
454 else if (action
) data
[action
]()
455 else if (options
.interval
) data
.pause().cycle()
459 $.fn
.carousel
.Constructor
= Carousel
462 // CAROUSEL NO CONFLICT
463 // ====================
465 $.fn
.carousel
.noConflict = function () {
474 $(document
).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e
) {
475 var $this = $(this), href
476 var $target
= $($this.attr('data-target') || (href
= $this.attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
477 var options
= $.extend({}, $target
.data(), $this.data())
478 var slideIndex
= $this.attr('data-slide-to')
479 if (slideIndex
) options
.interval
= false
481 $target
.carousel(options
)
483 if (slideIndex
= $this.attr('data-slide-to')) {
484 $target
.data('bs.carousel').to(slideIndex
)
490 $(window
).on('load', function () {
491 $('[data-ride="carousel"]').each(function () {
492 var $carousel
= $(this)
493 $carousel
.carousel($carousel
.data())
499 /* ========================================================================
500 * Bootstrap: collapse.js v3.0.3
501 * http://getbootstrap.com/javascript/#collapse
502 * ========================================================================
503 * Copyright 2013 Twitter, Inc.
505 * Licensed under the Apache License, Version 2.0 (the "License");
506 * you may not use this file except in compliance with the License.
507 * You may obtain a copy of the License at
509 * http://www.apache.org/licenses/LICENSE-2.0
511 * Unless required by applicable law or agreed to in writing, software
512 * distributed under the License is distributed on an "AS IS" BASIS,
513 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
514 * See the License for the specific language governing permissions and
515 * limitations under the License.
516 * ======================================================================== */
519 +function ($) { "use strict";
521 // COLLAPSE PUBLIC CLASS DEFINITION
522 // ================================
524 var Collapse = function (element
, options
) {
525 this.$element
= $(element
)
526 this.options
= $.extend({}, Collapse
.DEFAULTS
, options
)
527 this.transitioning
= null
529 if (this.options
.parent
) this.$parent
= $(this.options
.parent
)
530 if (this.options
.toggle
) this.toggle()
533 Collapse
.DEFAULTS
= {
537 Collapse
.prototype.dimension = function () {
538 var hasWidth
= this.$element
.hasClass('width')
539 return hasWidth
? 'width' : 'height'
542 Collapse
.prototype.show = function () {
543 if (this.transitioning
|| this.$element
.hasClass('in')) return
545 var startEvent
= $.Event('show.bs.collapse')
546 this.$element
.trigger(startEvent
)
547 if (startEvent
.isDefaultPrevented()) return
549 var actives
= this.$parent
&& this.$parent
.find('> .panel > .in')
551 if (actives
&& actives
.length
) {
552 var hasData
= actives
.data('bs.collapse')
553 if (hasData
&& hasData
.transitioning
) return
554 actives
.collapse('hide')
555 hasData
|| actives
.data('bs.collapse', null)
558 var dimension
= this.dimension()
561 .removeClass('collapse')
562 .addClass('collapsing')
565 this.transitioning
= 1
567 var complete = function () {
569 .removeClass('collapsing')
572 this.transitioning
= 0
573 this.$element
.trigger('shown.bs.collapse')
576 if (!$.support
.transition
) return complete
.call(this)
578 var scrollSize
= $.camelCase(['scroll', dimension
].join('-'))
581 .one($.support
.transition
.end
, $.proxy(complete
, this))
582 .emulateTransitionEnd(350)
583 [dimension
](this.$element
[0][scrollSize
])
586 Collapse
.prototype.hide = function () {
587 if (this.transitioning
|| !this.$element
.hasClass('in')) return
589 var startEvent
= $.Event('hide.bs.collapse')
590 this.$element
.trigger(startEvent
)
591 if (startEvent
.isDefaultPrevented()) return
593 var dimension
= this.dimension()
596 [dimension
](this.$element
[dimension
]())
600 .addClass('collapsing')
601 .removeClass('collapse')
604 this.transitioning
= 1
606 var complete = function () {
607 this.transitioning
= 0
609 .trigger('hidden.bs.collapse')
610 .removeClass('collapsing')
611 .addClass('collapse')
614 if (!$.support
.transition
) return complete
.call(this)
618 .one($.support
.transition
.end
, $.proxy(complete
, this))
619 .emulateTransitionEnd(350)
622 Collapse
.prototype.toggle = function () {
623 this[this.$element
.hasClass('in') ? 'hide' : 'show']()
627 // COLLAPSE PLUGIN DEFINITION
628 // ==========================
630 var old
= $.fn
.collapse
632 $.fn
.collapse = function (option
) {
633 return this.each(function () {
635 var data
= $this.data('bs.collapse')
636 var options
= $.extend({}, Collapse
.DEFAULTS
, $this.data(), typeof option
== 'object' && option
)
638 if (!data
) $this.data('bs.collapse', (data
= new Collapse(this, options
)))
639 if (typeof option
== 'string') data
[option
]()
643 $.fn
.collapse
.Constructor
= Collapse
646 // COLLAPSE NO CONFLICT
647 // ====================
649 $.fn
.collapse
.noConflict = function () {
658 $(document
).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e
) {
659 var $this = $(this), href
660 var target
= $this.attr('data-target')
661 || e
.preventDefault()
662 || (href
= $this.attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
663 var $target
= $(target
)
664 var data
= $target
.data('bs.collapse')
665 var option
= data
? 'toggle' : $this.data()
666 var parent
= $this.attr('data-parent')
667 var $parent
= parent
&& $(parent
)
669 if (!data
|| !data
.transitioning
) {
670 if ($parent
) $parent
.find('[data-toggle=collapse][data-parent="' + parent
+ '"]').not($this).addClass('collapsed')
671 $this[$target
.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
674 $target
.collapse(option
)
679 /* ========================================================================
680 * Bootstrap: dropdown.js v3.0.3
681 * http://getbootstrap.com/javascript/#dropdowns
682 * ========================================================================
683 * Copyright 2013 Twitter, Inc.
685 * Licensed under the Apache License, Version 2.0 (the "License");
686 * you may not use this file except in compliance with the License.
687 * You may obtain a copy of the License at
689 * http://www.apache.org/licenses/LICENSE-2.0
691 * Unless required by applicable law or agreed to in writing, software
692 * distributed under the License is distributed on an "AS IS" BASIS,
693 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
694 * See the License for the specific language governing permissions and
695 * limitations under the License.
696 * ======================================================================== */
699 +function ($) { "use strict";
701 // DROPDOWN CLASS DEFINITION
702 // =========================
704 var backdrop
= '.dropdown-backdrop'
705 var toggle
= '[data-toggle=dropdown]'
706 var Dropdown = function (element
) {
707 $(element
).on('click.bs.dropdown', this.toggle
)
710 Dropdown
.prototype.toggle = function (e
) {
713 if ($this.is('.disabled, :disabled')) return
715 var $parent
= getParent($this)
716 var isActive
= $parent
.hasClass('open')
721 if ('ontouchstart' in document
.documentElement
&& !$parent
.closest('.navbar-nav').length
) {
722 // if mobile we use a backdrop because click events don't delegate
723 $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus
)
726 $parent
.trigger(e
= $.Event('show.bs.dropdown'))
728 if (e
.isDefaultPrevented()) return
732 .trigger('shown.bs.dropdown')
740 Dropdown
.prototype.keydown = function (e
) {
741 if (!/(38|40|27)/.test(e
.keyCode
)) return
748 if ($this.is('.disabled, :disabled')) return
750 var $parent
= getParent($this)
751 var isActive
= $parent
.hasClass('open')
753 if (!isActive
|| (isActive
&& e
.keyCode
== 27)) {
754 if (e
.which
== 27) $parent
.find(toggle
).focus()
758 var $items
= $('[role=menu] li:not(.divider):visible a', $parent
)
760 if (!$items
.length
) return
762 var index
= $items
.index($items
.filter(':focus'))
764 if (e
.keyCode
== 38 && index
> 0) index
-- // up
765 if (e
.keyCode
== 40 && index
< $items
.length
- 1) index
++ // down
768 $items
.eq(index
).focus()
771 function clearMenus() {
773 $(toggle
).each(function (e
) {
774 var $parent
= getParent($(this))
775 if (!$parent
.hasClass('open')) return
776 $parent
.trigger(e
= $.Event('hide.bs.dropdown'))
777 if (e
.isDefaultPrevented()) return
778 $parent
.removeClass('open').trigger('hidden.bs.dropdown')
782 function getParent($this) {
783 var selector
= $this.attr('data-target')
786 selector
= $this.attr('href')
787 selector
= selector
&& /#/.test(selector) && selector.replace(/.*(?=#[^\s
]*$)/, '') //strip
for ie7
790 var $parent
= selector
&& $(selector
)
792 return $parent
&& $parent
.length
? $parent
: $this.parent()
796 // DROPDOWN PLUGIN DEFINITION
797 // ==========================
799 var old
= $.fn
.dropdown
801 $.fn
.dropdown = function (option
) {
802 return this.each(function () {
804 var data
= $this.data('bs.dropdown')
806 if (!data
) $this.data('bs.dropdown', (data
= new Dropdown(this)))
807 if (typeof option
== 'string') data
[option
].call($this)
811 $.fn
.dropdown
.Constructor
= Dropdown
814 // DROPDOWN NO CONFLICT
815 // ====================
817 $.fn
.dropdown
.noConflict = function () {
823 // APPLY TO STANDARD DROPDOWN ELEMENTS
824 // ===================================
827 .on('click.bs.dropdown.data-api', clearMenus
)
828 .on('click.bs.dropdown.data-api', '.dropdown form', function (e
) { e
.stopPropagation() })
829 .on('click.bs.dropdown.data-api' , toggle
, Dropdown
.prototype.toggle
)
830 .on('keydown.bs.dropdown.data-api', toggle
+ ', [role=menu]' , Dropdown
.prototype.keydown
)
834 /* ========================================================================
835 * Bootstrap: modal.js v3.0.3
836 * http://getbootstrap.com/javascript/#modals
837 * ========================================================================
838 * Copyright 2013 Twitter, Inc.
840 * Licensed under the Apache License, Version 2.0 (the "License");
841 * you may not use this file except in compliance with the License.
842 * You may obtain a copy of the License at
844 * http://www.apache.org/licenses/LICENSE-2.0
846 * Unless required by applicable law or agreed to in writing, software
847 * distributed under the License is distributed on an "AS IS" BASIS,
848 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
849 * See the License for the specific language governing permissions and
850 * limitations under the License.
851 * ======================================================================== */
854 +function ($) { "use strict";
856 // MODAL CLASS DEFINITION
857 // ======================
859 var Modal = function (element
, options
) {
860 this.options
= options
861 this.$element
= $(element
)
865 if (this.options
.remote
) this.$element
.load(this.options
.remote
)
874 Modal
.prototype.toggle = function (_relatedTarget
) {
875 return this[!this.isShown
? 'show' : 'hide'](_relatedTarget
)
878 Modal
.prototype.show = function (_relatedTarget
) {
880 var e
= $.Event('show.bs.modal', { relatedTarget
: _relatedTarget
})
882 this.$element
.trigger(e
)
884 if (this.isShown
|| e
.isDefaultPrevented()) return
890 this.$element
.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide
, this))
892 this.backdrop(function () {
893 var transition
= $.support
.transition
&& that
.$element
.hasClass('fade')
895 if (!that
.$element
.parent().length
) {
896 that
.$element
.appendTo(document
.body
) // don't move modals dom position
902 that
.$element
[0].offsetWidth
// force reflow
907 .attr('aria-hidden', false)
911 var e
= $.Event('shown.bs.modal', { relatedTarget
: _relatedTarget
})
914 that
.$element
.find('.modal-dialog') // wait for modal to slide in
915 .one($.support
.transition
.end
, function () {
916 that
.$element
.focus().trigger(e
)
918 .emulateTransitionEnd(300) :
919 that
.$element
.focus().trigger(e
)
923 Modal
.prototype.hide = function (e
) {
924 if (e
) e
.preventDefault()
926 e
= $.Event('hide.bs.modal')
928 this.$element
.trigger(e
)
930 if (!this.isShown
|| e
.isDefaultPrevented()) return
936 $(document
).off('focusin.bs.modal')
940 .attr('aria-hidden', true)
941 .off('click.dismiss.modal')
943 $.support
.transition
&& this.$element
.hasClass('fade') ?
945 .one($.support
.transition
.end
, $.proxy(this.hideModal
, this))
946 .emulateTransitionEnd(300) :
950 Modal
.prototype.enforceFocus = function () {
952 .off('focusin.bs.modal') // guard against infinite focus loop
953 .on('focusin.bs.modal', $.proxy(function (e
) {
954 if (this.$element
[0] !== e
.target
&& !this.$element
.has(e
.target
).length
) {
955 this.$element
.focus()
960 Modal
.prototype.escape = function () {
961 if (this.isShown
&& this.options
.keyboard
) {
962 this.$element
.on('keyup.dismiss.bs.modal', $.proxy(function (e
) {
963 e
.which
== 27 && this.hide()
965 } else if (!this.isShown
) {
966 this.$element
.off('keyup.dismiss.bs.modal')
970 Modal
.prototype.hideModal = function () {
973 this.backdrop(function () {
974 that
.removeBackdrop()
975 that
.$element
.trigger('hidden.bs.modal')
979 Modal
.prototype.removeBackdrop = function () {
980 this.$backdrop
&& this.$backdrop
.remove()
981 this.$backdrop
= null
984 Modal
.prototype.backdrop = function (callback
) {
986 var animate
= this.$element
.hasClass('fade') ? 'fade' : ''
988 if (this.isShown
&& this.options
.backdrop
) {
989 var doAnimate
= $.support
.transition
&& animate
991 this.$backdrop
= $('<div class="modal-backdrop ' + animate
+ '" />')
992 .appendTo(document
.body
)
994 this.$element
.on('click.dismiss.modal', $.proxy(function (e
) {
995 if (e
.target
!== e
.currentTarget
) return
996 this.options
.backdrop
== 'static'
997 ? this.$element
[0].focus
.call(this.$element
[0])
998 : this.hide
.call(this)
1001 if (doAnimate
) this.$backdrop
[0].offsetWidth
// force reflow
1003 this.$backdrop
.addClass('in')
1005 if (!callback
) return
1009 .one($.support
.transition
.end
, callback
)
1010 .emulateTransitionEnd(150) :
1013 } else if (!this.isShown
&& this.$backdrop
) {
1014 this.$backdrop
.removeClass('in')
1016 $.support
.transition
&& this.$element
.hasClass('fade')?
1018 .one($.support
.transition
.end
, callback
)
1019 .emulateTransitionEnd(150) :
1022 } else if (callback
) {
1028 // MODAL PLUGIN DEFINITION
1029 // =======================
1031 var old
= $.fn
.modal
1033 $.fn
.modal = function (option
, _relatedTarget
) {
1034 return this.each(function () {
1036 var data
= $this.data('bs.modal')
1037 var options
= $.extend({}, Modal
.DEFAULTS
, $this.data(), typeof option
== 'object' && option
)
1039 if (!data
) $this.data('bs.modal', (data
= new Modal(this, options
)))
1040 if (typeof option
== 'string') data
[option
](_relatedTarget
)
1041 else if (options
.show
) data
.show(_relatedTarget
)
1045 $.fn
.modal
.Constructor
= Modal
1048 // MODAL NO CONFLICT
1049 // =================
1051 $.fn
.modal
.noConflict = function () {
1060 $(document
).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e
) {
1062 var href
= $this.attr('href')
1063 var $target
= $($this.attr('data-target') || (href
&& href
.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1064 var option
= $target
.data('modal') ? 'toggle' : $.extend({ remote
: !/#/.test(href
) && href
}, $target
.data(), $this.data())
1069 .modal(option
, this)
1070 .one('hide', function () {
1071 $this.is(':visible') && $this.focus()
1076 .on('show.bs.modal', '.modal', function () { $(document
.body
).addClass('modal-open') })
1077 .on('hidden.bs.modal', '.modal', function () { $(document
.body
).removeClass('modal-open') })
1081 /* ========================================================================
1082 * Bootstrap: tooltip.js v3.0.3
1083 * http://getbootstrap.com/javascript/#tooltip
1084 * Inspired by the original jQuery.tipsy by Jason Frame
1085 * ========================================================================
1086 * Copyright 2013 Twitter, Inc.
1088 * Licensed under the Apache License, Version 2.0 (the "License");
1089 * you may not use this file except in compliance with the License.
1090 * You may obtain a copy of the License at
1092 * http://www.apache.org/licenses/LICENSE-2.0
1094 * Unless required by applicable law or agreed to in writing, software
1095 * distributed under the License is distributed on an "AS IS" BASIS,
1096 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1097 * See the License for the specific language governing permissions and
1098 * limitations under the License.
1099 * ======================================================================== */
1102 +function ($) { "use strict";
1104 // TOOLTIP PUBLIC CLASS DEFINITION
1105 // ===============================
1107 var Tooltip = function (element
, options
) {
1113 this.$element
= null
1115 this.init('tooltip', element
, options
)
1118 Tooltip
.DEFAULTS
= {
1122 , template
: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1123 , trigger
: 'hover focus'
1130 Tooltip
.prototype.init = function (type
, element
, options
) {
1133 this.$element
= $(element
)
1134 this.options
= this.getOptions(options
)
1136 var triggers
= this.options
.trigger
.split(' ')
1138 for (var i
= triggers
.length
; i
--;) {
1139 var trigger
= triggers
[i
]
1141 if (trigger
== 'click') {
1142 this.$element
.on('click.' + this.type
, this.options
.selector
, $.proxy(this.toggle
, this))
1143 } else if (trigger
!= 'manual') {
1144 var eventIn
= trigger
== 'hover' ? 'mouseenter' : 'focus'
1145 var eventOut
= trigger
== 'hover' ? 'mouseleave' : 'blur'
1147 this.$element
.on(eventIn
+ '.' + this.type
, this.options
.selector
, $.proxy(this.enter
, this))
1148 this.$element
.on(eventOut
+ '.' + this.type
, this.options
.selector
, $.proxy(this.leave
, this))
1152 this.options
.selector
?
1153 (this._options
= $.extend({}, this.options
, { trigger
: 'manual', selector
: '' })) :
1157 Tooltip
.prototype.getDefaults = function () {
1158 return Tooltip
.DEFAULTS
1161 Tooltip
.prototype.getOptions = function (options
) {
1162 options
= $.extend({}, this.getDefaults(), this.$element
.data(), options
)
1164 if (options
.delay
&& typeof options
.delay
== 'number') {
1167 , hide
: options
.delay
1174 Tooltip
.prototype.getDelegateOptions = function () {
1176 var defaults
= this.getDefaults()
1178 this._options
&& $.each(this._options
, function (key
, value
) {
1179 if (defaults
[key
] != value
) options
[key
] = value
1185 Tooltip
.prototype.enter = function (obj
) {
1186 var self
= obj
instanceof this.constructor ?
1187 obj
: $(obj
.currentTarget
)[this.type
](this.getDelegateOptions()).data('bs.' + this.type
)
1189 clearTimeout(self
.timeout
)
1191 self
.hoverState
= 'in'
1193 if (!self
.options
.delay
|| !self
.options
.delay
.show
) return self
.show()
1195 self
.timeout
= setTimeout(function () {
1196 if (self
.hoverState
== 'in') self
.show()
1197 }, self
.options
.delay
.show
)
1200 Tooltip
.prototype.leave = function (obj
) {
1201 var self
= obj
instanceof this.constructor ?
1202 obj
: $(obj
.currentTarget
)[this.type
](this.getDelegateOptions()).data('bs.' + this.type
)
1204 clearTimeout(self
.timeout
)
1206 self
.hoverState
= 'out'
1208 if (!self
.options
.delay
|| !self
.options
.delay
.hide
) return self
.hide()
1210 self
.timeout
= setTimeout(function () {
1211 if (self
.hoverState
== 'out') self
.hide()
1212 }, self
.options
.delay
.hide
)
1215 Tooltip
.prototype.show = function () {
1216 var e
= $.Event('show.bs.'+ this.type
)
1218 if (this.hasContent() && this.enabled
) {
1219 this.$element
.trigger(e
)
1221 if (e
.isDefaultPrevented()) return
1223 var $tip
= this.tip()
1227 if (this.options
.animation
) $tip
.addClass('fade')
1229 var placement
= typeof this.options
.placement
== 'function' ?
1230 this.options
.placement
.call(this, $tip
[0], this.$element
[0]) :
1231 this.options
.placement
1233 var autoToken
= /\s?auto?\s?/i
1234 var autoPlace
= autoToken
.test(placement
)
1235 if (autoPlace
) placement
= placement
.replace(autoToken
, '') || 'top'
1239 .css({ top
: 0, left
: 0, display
: 'block' })
1240 .addClass(placement
)
1242 this.options
.container
? $tip
.appendTo(this.options
.container
) : $tip
.insertAfter(this.$element
)
1244 var pos
= this.getPosition()
1245 var actualWidth
= $tip
[0].offsetWidth
1246 var actualHeight
= $tip
[0].offsetHeight
1249 var $parent
= this.$element
.parent()
1251 var orgPlacement
= placement
1252 var docScroll
= document
.documentElement
.scrollTop
|| document
.body
.scrollTop
1253 var parentWidth
= this.options
.container
== 'body' ? window
.innerWidth
: $parent
.outerWidth()
1254 var parentHeight
= this.options
.container
== 'body' ? window
.innerHeight
: $parent
.outerHeight()
1255 var parentLeft
= this.options
.container
== 'body' ? 0 : $parent
.offset().left
1257 placement
= placement
== 'bottom' && pos
.top
+ pos
.height
+ actualHeight
- docScroll
> parentHeight
? 'top' :
1258 placement
== 'top' && pos
.top
- docScroll
- actualHeight
< 0 ? 'bottom' :
1259 placement
== 'right' && pos
.right
+ actualWidth
> parentWidth
? 'left' :
1260 placement
== 'left' && pos
.left
- actualWidth
< parentLeft
? 'right' :
1264 .removeClass(orgPlacement
)
1265 .addClass(placement
)
1268 var calculatedOffset
= this.getCalculatedOffset(placement
, pos
, actualWidth
, actualHeight
)
1270 this.applyPlacement(calculatedOffset
, placement
)
1271 this.$element
.trigger('shown.bs.' + this.type
)
1275 Tooltip
.prototype.applyPlacement = function(offset
, placement
) {
1277 var $tip
= this.tip()
1278 var width
= $tip
[0].offsetWidth
1279 var height
= $tip
[0].offsetHeight
1281 // manually read margins because getBoundingClientRect includes difference
1282 var marginTop
= parseInt($tip
.css('margin-top'), 10)
1283 var marginLeft
= parseInt($tip
.css('margin-left'), 10)
1285 // we must check for NaN for ie 8/9
1286 if (isNaN(marginTop
)) marginTop
= 0
1287 if (isNaN(marginLeft
)) marginLeft
= 0
1289 offset
.top
= offset
.top
+ marginTop
1290 offset
.left
= offset
.left
+ marginLeft
1296 // check to see if placing tip in new offset caused the tip to resize itself
1297 var actualWidth
= $tip
[0].offsetWidth
1298 var actualHeight
= $tip
[0].offsetHeight
1300 if (placement
== 'top' && actualHeight
!= height
) {
1302 offset
.top
= offset
.top
+ height
- actualHeight
1305 if (/bottom|top/.test(placement
)) {
1308 if (offset
.left
< 0) {
1309 delta
= offset
.left
* -2
1314 actualWidth
= $tip
[0].offsetWidth
1315 actualHeight
= $tip
[0].offsetHeight
1318 this.replaceArrow(delta
- width
+ actualWidth
, actualWidth
, 'left')
1320 this.replaceArrow(actualHeight
- height
, actualHeight
, 'top')
1323 if (replace
) $tip
.offset(offset
)
1326 Tooltip
.prototype.replaceArrow = function(delta
, dimension
, position
) {
1327 this.arrow().css(position
, delta
? (50 * (1 - delta
/ dimension
) + "%") : '')
1330 Tooltip
.prototype.setContent = function () {
1331 var $tip
= this.tip()
1332 var title
= this.getTitle()
1334 $tip
.find('.tooltip-inner')[this.options
.html
? 'html' : 'text'](title
)
1335 $tip
.removeClass('fade in top bottom left right')
1338 Tooltip
.prototype.hide = function () {
1340 var $tip
= this.tip()
1341 var e
= $.Event('hide.bs.' + this.type
)
1343 function complete() {
1344 if (that
.hoverState
!= 'in') $tip
.detach()
1347 this.$element
.trigger(e
)
1349 if (e
.isDefaultPrevented()) return
1351 $tip
.removeClass('in')
1353 $.support
.transition
&& this.$tip
.hasClass('fade') ?
1355 .one($.support
.transition
.end
, complete
)
1356 .emulateTransitionEnd(150) :
1359 this.$element
.trigger('hidden.bs.' + this.type
)
1364 Tooltip
.prototype.fixTitle = function () {
1365 var $e
= this.$element
1366 if ($e
.attr('title') || typeof($e
.attr('data-original-title')) != 'string') {
1367 $e
.attr('data-original-title', $e
.attr('title') || '').attr('title', '')
1371 Tooltip
.prototype.hasContent = function () {
1372 return this.getTitle()
1375 Tooltip
.prototype.getPosition = function () {
1376 var el
= this.$element
[0]
1377 return $.extend({}, (typeof el
.getBoundingClientRect
== 'function') ? el
.getBoundingClientRect() : {
1378 width
: el
.offsetWidth
1379 , height
: el
.offsetHeight
1380 }, this.$element
.offset())
1383 Tooltip
.prototype.getCalculatedOffset = function (placement
, pos
, actualWidth
, actualHeight
) {
1384 return placement
== 'bottom' ? { top
: pos
.top
+ pos
.height
, left
: pos
.left
+ pos
.width
/ 2 - actualWidth
/ 2 } :
1385 placement
== 'top' ? { top
: pos
.top
- actualHeight
, left
: pos
.left
+ pos
.width
/ 2 - actualWidth
/ 2 } :
1386 placement
== 'left' ? { top
: pos
.top
+ pos
.height
/ 2 - actualHeight
/ 2, left
: pos
.left
- actualWidth
} :
1387 /* placement == 'right' */ { top
: pos
.top
+ pos
.height
/ 2 - actualHeight
/ 2, left
: pos
.left
+ pos
.width
}
1390 Tooltip
.prototype.getTitle = function () {
1392 var $e
= this.$element
1393 var o
= this.options
1395 title
= $e
.attr('data-original-title')
1396 || (typeof o
.title
== 'function' ? o
.title
.call($e
[0]) : o
.title
)
1401 Tooltip
.prototype.tip = function () {
1402 return this.$tip
= this.$tip
|| $(this.options
.template
)
1405 Tooltip
.prototype.arrow = function () {
1406 return this.$arrow
= this.$arrow
|| this.tip().find('.tooltip-arrow')
1409 Tooltip
.prototype.validate = function () {
1410 if (!this.$element
[0].parentNode
) {
1412 this.$element
= null
1417 Tooltip
.prototype.enable = function () {
1421 Tooltip
.prototype.disable = function () {
1422 this.enabled
= false
1425 Tooltip
.prototype.toggleEnabled = function () {
1426 this.enabled
= !this.enabled
1429 Tooltip
.prototype.toggle = function (e
) {
1430 var self
= e
? $(e
.currentTarget
)[this.type
](this.getDelegateOptions()).data('bs.' + this.type
) : this
1431 self
.tip().hasClass('in') ? self
.leave(self
) : self
.enter(self
)
1434 Tooltip
.prototype.destroy = function () {
1435 this.hide().$element
.off('.' + this.type
).removeData('bs.' + this.type
)
1439 // TOOLTIP PLUGIN DEFINITION
1440 // =========================
1442 var old
= $.fn
.tooltip
1444 $.fn
.tooltip = function (option
) {
1445 return this.each(function () {
1447 var data
= $this.data('bs.tooltip')
1448 var options
= typeof option
== 'object' && option
1450 if (!data
) $this.data('bs.tooltip', (data
= new Tooltip(this, options
)))
1451 if (typeof option
== 'string') data
[option
]()
1455 $.fn
.tooltip
.Constructor
= Tooltip
1458 // TOOLTIP NO CONFLICT
1459 // ===================
1461 $.fn
.tooltip
.noConflict = function () {
1468 /* ========================================================================
1469 * Bootstrap: popover.js v3.0.3
1470 * http://getbootstrap.com/javascript/#popovers
1471 * ========================================================================
1472 * Copyright 2013 Twitter, Inc.
1474 * Licensed under the Apache License, Version 2.0 (the "License");
1475 * you may not use this file except in compliance with the License.
1476 * You may obtain a copy of the License at
1478 * http://www.apache.org/licenses/LICENSE-2.0
1480 * Unless required by applicable law or agreed to in writing, software
1481 * distributed under the License is distributed on an "AS IS" BASIS,
1482 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1483 * See the License for the specific language governing permissions and
1484 * limitations under the License.
1485 * ======================================================================== */
1488 +function ($) { "use strict";
1490 // POPOVER PUBLIC CLASS DEFINITION
1491 // ===============================
1493 var Popover = function (element
, options
) {
1494 this.init('popover', element
, options
)
1497 if (!$.fn
.tooltip
) throw new Error('Popover requires tooltip.js')
1499 Popover
.DEFAULTS
= $.extend({} , $.fn
.tooltip
.Constructor
.DEFAULTS
, {
1503 , template
: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1507 // NOTE: POPOVER EXTENDS tooltip.js
1508 // ================================
1510 Popover
.prototype = $.extend({}, $.fn
.tooltip
.Constructor
.prototype)
1512 Popover
.prototype.constructor = Popover
1514 Popover
.prototype.getDefaults = function () {
1515 return Popover
.DEFAULTS
1518 Popover
.prototype.setContent = function () {
1519 var $tip
= this.tip()
1520 var title
= this.getTitle()
1521 var content
= this.getContent()
1523 $tip
.find('.popover-title')[this.options
.html
? 'html' : 'text'](title
)
1524 $tip
.find('.popover-content')[this.options
.html
? 'html' : 'text'](content
)
1526 $tip
.removeClass('fade top bottom left right in')
1528 // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1529 // this manually by checking the contents.
1530 if (!$tip
.find('.popover-title').html()) $tip
.find('.popover-title').hide()
1533 Popover
.prototype.hasContent = function () {
1534 return this.getTitle() || this.getContent()
1537 Popover
.prototype.getContent = function () {
1538 var $e
= this.$element
1539 var o
= this.options
1541 return $e
.attr('data-content')
1542 || (typeof o
.content
== 'function' ?
1543 o
.content
.call($e
[0]) :
1547 Popover
.prototype.arrow = function () {
1548 return this.$arrow
= this.$arrow
|| this.tip().find('.arrow')
1551 Popover
.prototype.tip = function () {
1552 if (!this.$tip
) this.$tip
= $(this.options
.template
)
1557 // POPOVER PLUGIN DEFINITION
1558 // =========================
1560 var old
= $.fn
.popover
1562 $.fn
.popover = function (option
) {
1563 return this.each(function () {
1565 var data
= $this.data('bs.popover')
1566 var options
= typeof option
== 'object' && option
1568 if (!data
) $this.data('bs.popover', (data
= new Popover(this, options
)))
1569 if (typeof option
== 'string') data
[option
]()
1573 $.fn
.popover
.Constructor
= Popover
1576 // POPOVER NO CONFLICT
1577 // ===================
1579 $.fn
.popover
.noConflict = function () {
1586 /* ========================================================================
1587 * Bootstrap: scrollspy.js v3.0.3
1588 * http://getbootstrap.com/javascript/#scrollspy
1589 * ========================================================================
1590 * Copyright 2013 Twitter, Inc.
1592 * Licensed under the Apache License, Version 2.0 (the "License");
1593 * you may not use this file except in compliance with the License.
1594 * You may obtain a copy of the License at
1596 * http://www.apache.org/licenses/LICENSE-2.0
1598 * Unless required by applicable law or agreed to in writing, software
1599 * distributed under the License is distributed on an "AS IS" BASIS,
1600 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1601 * See the License for the specific language governing permissions and
1602 * limitations under the License.
1603 * ======================================================================== */
1606 +function ($) { "use strict";
1608 // SCROLLSPY CLASS DEFINITION
1609 // ==========================
1611 function ScrollSpy(element
, options
) {
1613 var process
= $.proxy(this.process
, this)
1615 this.$element
= $(element
).is('body') ? $(window
) : $(element
)
1616 this.$body
= $('body')
1617 this.$scrollElement
= this.$element
.on('scroll.bs.scroll-spy.data-api', process
)
1618 this.options
= $.extend({}, ScrollSpy
.DEFAULTS
, options
)
1619 this.selector
= (this.options
.target
1620 || ((href
= $(element
).attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1621 || '') + ' .nav li > a'
1622 this.offsets
= $([])
1623 this.targets
= $([])
1624 this.activeTarget
= null
1630 ScrollSpy
.DEFAULTS
= {
1634 ScrollSpy
.prototype.refresh = function () {
1635 var offsetMethod
= this.$element
[0] == window
? 'offset' : 'position'
1637 this.offsets
= $([])
1638 this.targets
= $([])
1641 var $targets
= this.$body
1642 .find(this.selector
)
1645 var href
= $el
.data('target') || $el
.attr('href')
1646 var $href
= /^#\w/.test(href
) && $(href
)
1650 && [[ $href
[offsetMethod
]().top
+ (!$.isWindow(self
.$scrollElement
.get(0)) && self
.$scrollElement
.scrollTop()), href
]]) || null
1652 .sort(function (a
, b
) { return a
[0] - b
[0] })
1654 self
.offsets
.push(this[0])
1655 self
.targets
.push(this[1])
1659 ScrollSpy
.prototype.process = function () {
1660 var scrollTop
= this.$scrollElement
.scrollTop() + this.options
.offset
1661 var scrollHeight
= this.$scrollElement
[0].scrollHeight
|| this.$body
[0].scrollHeight
1662 var maxScroll
= scrollHeight
- this.$scrollElement
.height()
1663 var offsets
= this.offsets
1664 var targets
= this.targets
1665 var activeTarget
= this.activeTarget
1668 if (scrollTop
>= maxScroll
) {
1669 return activeTarget
!= (i
= targets
.last()[0]) && this.activate(i
)
1672 for (i
= offsets
.length
; i
--;) {
1673 activeTarget
!= targets
[i
]
1674 && scrollTop
>= offsets
[i
]
1675 && (!offsets
[i
+ 1] || scrollTop
<= offsets
[i
+ 1])
1676 && this.activate( targets
[i
] )
1680 ScrollSpy
.prototype.activate = function (target
) {
1681 this.activeTarget
= target
1685 .removeClass('active')
1687 var selector
= this.selector
1688 + '[data-target="' + target
+ '"],'
1689 + this.selector
+ '[href="' + target
+ '"]'
1691 var active
= $(selector
)
1695 if (active
.parent('.dropdown-menu').length
) {
1697 .closest('li.dropdown')
1701 active
.trigger('activate.bs.scrollspy')
1705 // SCROLLSPY PLUGIN DEFINITION
1706 // ===========================
1708 var old
= $.fn
.scrollspy
1710 $.fn
.scrollspy = function (option
) {
1711 return this.each(function () {
1713 var data
= $this.data('bs.scrollspy')
1714 var options
= typeof option
== 'object' && option
1716 if (!data
) $this.data('bs.scrollspy', (data
= new ScrollSpy(this, options
)))
1717 if (typeof option
== 'string') data
[option
]()
1721 $.fn
.scrollspy
.Constructor
= ScrollSpy
1724 // SCROLLSPY NO CONFLICT
1725 // =====================
1727 $.fn
.scrollspy
.noConflict = function () {
1728 $.fn
.scrollspy
= old
1733 // SCROLLSPY DATA-API
1734 // ==================
1736 $(window
).on('load', function () {
1737 $('[data-spy="scroll"]').each(function () {
1739 $spy
.scrollspy($spy
.data())
1745 /* ========================================================================
1746 * Bootstrap: tab.js v3.0.3
1747 * http://getbootstrap.com/javascript/#tabs
1748 * ========================================================================
1749 * Copyright 2013 Twitter, Inc.
1751 * Licensed under the Apache License, Version 2.0 (the "License");
1752 * you may not use this file except in compliance with the License.
1753 * You may obtain a copy of the License at
1755 * http://www.apache.org/licenses/LICENSE-2.0
1757 * Unless required by applicable law or agreed to in writing, software
1758 * distributed under the License is distributed on an "AS IS" BASIS,
1759 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1760 * See the License for the specific language governing permissions and
1761 * limitations under the License.
1762 * ======================================================================== */
1765 +function ($) { "use strict";
1767 // TAB CLASS DEFINITION
1768 // ====================
1770 var Tab = function (element
) {
1771 this.element
= $(element
)
1774 Tab
.prototype.show = function () {
1775 var $this = this.element
1776 var $ul
= $this.closest('ul:not(.dropdown-menu)')
1777 var selector
= $this.data('target')
1780 selector
= $this.attr('href')
1781 selector
= selector
&& selector
.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1784 if ($this.parent('li').hasClass('active')) return
1786 var previous
= $ul
.find('.active:last a')[0]
1787 var e
= $.Event('show.bs.tab', {
1788 relatedTarget
: previous
1793 if (e
.isDefaultPrevented()) return
1795 var $target
= $(selector
)
1797 this.activate($this.parent('li'), $ul
)
1798 this.activate($target
, $target
.parent(), function () {
1800 type
: 'shown.bs.tab'
1801 , relatedTarget
: previous
1806 Tab
.prototype.activate = function (element
, container
, callback
) {
1807 var $active
= container
.find('> .active')
1808 var transition
= callback
1809 && $.support
.transition
1810 && $active
.hasClass('fade')
1814 .removeClass('active')
1815 .find('> .dropdown-menu > .active')
1816 .removeClass('active')
1818 element
.addClass('active')
1821 element
[0].offsetWidth
// reflow for transition
1822 element
.addClass('in')
1824 element
.removeClass('fade')
1827 if (element
.parent('.dropdown-menu')) {
1828 element
.closest('li.dropdown').addClass('active')
1831 callback
&& callback()
1836 .one($.support
.transition
.end
, next
)
1837 .emulateTransitionEnd(150) :
1840 $active
.removeClass('in')
1844 // TAB PLUGIN DEFINITION
1845 // =====================
1849 $.fn
.tab = function ( option
) {
1850 return this.each(function () {
1852 var data
= $this.data('bs.tab')
1854 if (!data
) $this.data('bs.tab', (data
= new Tab(this)))
1855 if (typeof option
== 'string') data
[option
]()
1859 $.fn
.tab
.Constructor
= Tab
1865 $.fn
.tab
.noConflict = function () {
1874 $(document
).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e
) {
1881 /* ========================================================================
1882 * Bootstrap: affix.js v3.0.3
1883 * http://getbootstrap.com/javascript/#affix
1884 * ========================================================================
1885 * Copyright 2013 Twitter, Inc.
1887 * Licensed under the Apache License, Version 2.0 (the "License");
1888 * you may not use this file except in compliance with the License.
1889 * You may obtain a copy of the License at
1891 * http://www.apache.org/licenses/LICENSE-2.0
1893 * Unless required by applicable law or agreed to in writing, software
1894 * distributed under the License is distributed on an "AS IS" BASIS,
1895 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1896 * See the License for the specific language governing permissions and
1897 * limitations under the License.
1898 * ======================================================================== */
1901 +function ($) { "use strict";
1903 // AFFIX CLASS DEFINITION
1904 // ======================
1906 var Affix = function (element
, options
) {
1907 this.options
= $.extend({}, Affix
.DEFAULTS
, options
)
1908 this.$window
= $(window
)
1909 .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition
, this))
1910 .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop
, this))
1912 this.$element
= $(element
)
1916 this.checkPosition()
1919 Affix
.RESET
= 'affix affix-top affix-bottom'
1925 Affix
.prototype.checkPositionWithEventLoop = function () {
1926 setTimeout($.proxy(this.checkPosition
, this), 1)
1929 Affix
.prototype.checkPosition = function () {
1930 if (!this.$element
.is(':visible')) return
1932 var scrollHeight
= $(document
).height()
1933 var scrollTop
= this.$window
.scrollTop()
1934 var position
= this.$element
.offset()
1935 var offset
= this.options
.offset
1936 var offsetTop
= offset
.top
1937 var offsetBottom
= offset
.bottom
1939 if (typeof offset
!= 'object') offsetBottom
= offsetTop
= offset
1940 if (typeof offsetTop
== 'function') offsetTop
= offset
.top()
1941 if (typeof offsetBottom
== 'function') offsetBottom
= offset
.bottom()
1943 var affix
= this.unpin
!= null && (scrollTop
+ this.unpin
<= position
.top
) ? false :
1944 offsetBottom
!= null && (position
.top
+ this.$element
.height() >= scrollHeight
- offsetBottom
) ? 'bottom' :
1945 offsetTop
!= null && (scrollTop
<= offsetTop
) ? 'top' : false
1947 if (this.affixed
=== affix
) return
1948 if (this.unpin
) this.$element
.css('top', '')
1950 this.affixed
= affix
1951 this.unpin
= affix
== 'bottom' ? position
.top
- scrollTop
: null
1953 this.$element
.removeClass(Affix
.RESET
).addClass('affix' + (affix
? '-' + affix
: ''))
1955 if (affix
== 'bottom') {
1956 this.$element
.offset({ top
: document
.body
.offsetHeight
- offsetBottom
- this.$element
.height() })
1961 // AFFIX PLUGIN DEFINITION
1962 // =======================
1964 var old
= $.fn
.affix
1966 $.fn
.affix = function (option
) {
1967 return this.each(function () {
1969 var data
= $this.data('bs.affix')
1970 var options
= typeof option
== 'object' && option
1972 if (!data
) $this.data('bs.affix', (data
= new Affix(this, options
)))
1973 if (typeof option
== 'string') data
[option
]()
1977 $.fn
.affix
.Constructor
= Affix
1980 // AFFIX NO CONFLICT
1981 // =================
1983 $.fn
.affix
.noConflict = function () {
1992 $(window
).on('load', function () {
1993 $('[data-spy="affix"]').each(function () {
1995 var data
= $spy
.data()
1997 data
.offset
= data
.offset
|| {}
1999 if (data
.offsetBottom
) data
.offset
.bottom
= data
.offsetBottom
2000 if (data
.offsetTop
) data
.offset
.top
= data
.offsetTop