]>
Dogcows Code - chaz/website/blob - static/lib/bootstrap/js/bootstrap.js
1 /* ===================================================
2 * bootstrap-transition.js v2.3.0
3 * http://twitter.github.com/bootstrap/javascript.html#transitions
4 * ===================================================
5 * Copyright 2012 Twitter, Inc.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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 * ========================================================== */
23 "use strict"; // jshint ;_;
26 /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27 * ======================================================= */
31 $.support
.transition
= (function () {
33 var transitionEnd
= (function () {
35 var el
= document
.createElement('bootstrap')
36 , transEndEventNames
= {
37 'WebkitTransition' : 'webkitTransitionEnd'
38 , 'MozTransition' : 'transitionend'
39 , 'OTransition' : 'oTransitionEnd otransitionend'
40 , 'transition' : 'transitionend'
44 for (name
in transEndEventNames
){
45 if (el
.style
[name
] !== undefined) {
46 return transEndEventNames
[name
]
52 return transitionEnd
&& {
60 }(window
.jQuery
);/* ==========================================================
61 * bootstrap-alert.js v2.3.0
62 * http://twitter.github.com/bootstrap/javascript.html#alerts
63 * ==========================================================
64 * Copyright 2012 Twitter, Inc.
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
70 * http://www.apache.org/licenses/LICENSE-2.0
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 * ========================================================== */
82 "use strict"; // jshint ;_;
85 /* ALERT CLASS DEFINITION
86 * ====================== */
88 var dismiss
= '[data-dismiss="alert"]'
89 , Alert = function (el
) {
90 $(el
).on('click', dismiss
, this.close
)
93 Alert
.prototype.close = function (e
) {
95 , selector
= $this.attr('data-target')
99 selector
= $this.attr('href')
100 selector
= selector
&& selector
.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
103 $parent
= $(selector
)
105 e
&& e
.preventDefault()
107 $parent
.length
|| ($parent
= $this.hasClass('alert') ? $this : $this.parent())
109 $parent
.trigger(e
= $.Event('close'))
111 if (e
.isDefaultPrevented()) return
113 $parent
.removeClass('in')
115 function removeElement() {
121 $.support
.transition
&& $parent
.hasClass('fade') ?
122 $parent
.on($.support
.transition
.end
, removeElement
) :
127 /* ALERT PLUGIN DEFINITION
128 * ======================= */
132 $.fn
.alert = function (option
) {
133 return this.each(function () {
135 , data
= $this.data('alert')
136 if (!data
) $this.data('alert', (data
= new Alert(this)))
137 if (typeof option
== 'string') data
[option
].call($this)
141 $.fn
.alert
.Constructor
= Alert
145 * ================= */
147 $.fn
.alert
.noConflict = function () {
156 $(document
).on('click.alert.data-api', dismiss
, Alert
.prototype.close
)
158 }(window
.jQuery
);/* ============================================================
159 * bootstrap-button.js v2.3.0
160 * http://twitter.github.com/bootstrap/javascript.html#buttons
161 * ============================================================
162 * Copyright 2012 Twitter, Inc.
164 * Licensed under the Apache License, Version 2.0 (the "License");
165 * you may not use this file except in compliance with the License.
166 * You may obtain a copy of the License at
168 * http://www.apache.org/licenses/LICENSE-2.0
170 * Unless required by applicable law or agreed to in writing, software
171 * distributed under the License is distributed on an "AS IS" BASIS,
172 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
173 * See the License for the specific language governing permissions and
174 * limitations under the License.
175 * ============================================================ */
180 "use strict"; // jshint ;_;
183 /* BUTTON PUBLIC CLASS DEFINITION
184 * ============================== */
186 var Button = function (element
, options
) {
187 this.$element
= $(element
)
188 this.options
= $.extend({}, $.fn
.button
.defaults
, options
)
191 Button
.prototype.setState = function (state
) {
193 , $el
= this.$element
195 , val
= $el
.is('input') ? 'val' : 'html'
197 state
= state
+ 'Text'
198 data
.resetText
|| $el
.data('resetText', $el
[val
]())
200 $el
[val
](data
[state
] || this.options
[state
])
202 // push to event loop to allow forms to submit
203 setTimeout(function () {
204 state
== 'loadingText' ?
205 $el
.addClass(d
).attr(d
, d
) :
206 $el
.removeClass(d
).removeAttr(d
)
210 Button
.prototype.toggle = function () {
211 var $parent
= this.$element
.closest('[data-toggle="buttons-radio"]')
215 .removeClass('active')
217 this.$element
.toggleClass('active')
221 /* BUTTON PLUGIN DEFINITION
222 * ======================== */
224 var old
= $.fn
.button
226 $.fn
.button = function (option
) {
227 return this.each(function () {
229 , data
= $this.data('button')
230 , options
= typeof option
== 'object' && option
231 if (!data
) $this.data('button', (data
= new Button(this, options
)))
232 if (option
== 'toggle') data
.toggle()
233 else if (option
) data
.setState(option
)
237 $.fn
.button
.defaults
= {
238 loadingText: 'loading...'
241 $.fn
.button
.Constructor
= Button
244 /* BUTTON NO CONFLICT
245 * ================== */
247 $.fn
.button
.noConflict = function () {
256 $(document
).on('click.button.data-api', '[data-toggle^=button]', function (e
) {
257 var $btn
= $(e
.target
)
258 if (!$btn
.hasClass('btn')) $btn
= $btn
.closest('.btn')
259 $btn
.button('toggle')
262 }(window
.jQuery
);/* ==========================================================
263 * bootstrap-carousel.js v2.3.0
264 * http://twitter.github.com/bootstrap/javascript.html#carousel
265 * ==========================================================
266 * Copyright 2012 Twitter, Inc.
268 * Licensed under the Apache License, Version 2.0 (the "License");
269 * you may not use this file except in compliance with the License.
270 * You may obtain a copy of the License at
272 * http://www.apache.org/licenses/LICENSE-2.0
274 * Unless required by applicable law or agreed to in writing, software
275 * distributed under the License is distributed on an "AS IS" BASIS,
276 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
277 * See the License for the specific language governing permissions and
278 * limitations under the License.
279 * ========================================================== */
284 "use strict"; // jshint ;_;
287 /* CAROUSEL CLASS DEFINITION
288 * ========================= */
290 var Carousel = function (element
, options
) {
291 this.$element
= $(element
)
292 this.$indicators
= this.$element
.find('.carousel-indicators')
293 this.options
= options
294 this.options
.pause
== 'hover' && this.$element
295 .on('mouseenter', $.proxy(this.pause
, this))
296 .on('mouseleave', $.proxy(this.cycle
, this))
299 Carousel
.prototype = {
301 cycle: function (e
) {
302 if (!e
) this.paused
= false
303 if (this.interval
) clearInterval(this.interval
);
304 this.options
.interval
306 && (this.interval
= setInterval($.proxy(this.next
, this), this.options
.interval
))
310 , getActiveIndex: function () {
311 this.$active
= this.$element
.find('.item.active')
312 this.$items
= this.$active
.parent().children()
313 return this.$items
.index(this.$active
)
316 , to: function (pos
) {
317 var activeIndex
= this.getActiveIndex()
320 if (pos
> (this.$items
.length
- 1) || pos
< 0) return
323 return this.$element
.one('slid', function () {
328 if (activeIndex
== pos
) {
329 return this.pause().cycle()
332 return this.slide(pos
> activeIndex
? 'next' : 'prev', $(this.$items
[pos
]))
335 , pause: function (e
) {
336 if (!e
) this.paused
= true
337 if (this.$element
.find('.next, .prev').length
&& $.support
.transition
.end
) {
338 this.$element
.trigger($.support
.transition
.end
)
341 clearInterval(this.interval
)
346 , next: function () {
347 if (this.sliding
) return
348 return this.slide('next')
351 , prev: function () {
352 if (this.sliding
) return
353 return this.slide('prev')
356 , slide: function (type
, next
) {
357 var $active
= this.$element
.find('.item.active')
358 , $next
= next
|| $active
[type
]()
359 , isCycling
= this.interval
360 , direction
= type
== 'next' ? 'left' : 'right'
361 , fallback
= type
== 'next' ? 'first' : 'last'
367 isCycling
&& this.pause()
369 $next
= $next
.length
? $next : this.$element
.find('.item')[fallback
]()
371 e
= $.Event('slide', {
372 relatedTarget: $next
[0]
373 , direction: direction
376 if ($next
.hasClass('active')) return
378 if (this.$indicators
.length
) {
379 this.$indicators
.find('.active').removeClass('active')
380 this.$element
.one('slid', function () {
381 var $nextIndicator
= $(that
.$indicators
.children()[that
.getActiveIndex()])
382 $nextIndicator
&& $nextIndicator
.addClass('active')
386 if ($.support
.transition
&& this.$element
.hasClass('slide')) {
387 this.$element
.trigger(e
)
388 if (e
.isDefaultPrevented()) return
390 $next
[0].offsetWidth
// force reflow
391 $active
.addClass(direction
)
392 $next
.addClass(direction
)
393 this.$element
.one($.support
.transition
.end
, function () {
394 $next
.removeClass([type
, direction
].join(' ')).addClass('active')
395 $active
.removeClass(['active', direction
].join(' '))
397 setTimeout(function () { that
.$element
.trigger('slid') }, 0)
400 this.$element
.trigger(e
)
401 if (e
.isDefaultPrevented()) return
402 $active
.removeClass('active')
403 $next
.addClass('active')
405 this.$element
.trigger('slid')
408 isCycling
&& this.cycle()
416 /* CAROUSEL PLUGIN DEFINITION
417 * ========================== */
419 var old
= $.fn
.carousel
421 $.fn
.carousel = function (option
) {
422 return this.each(function () {
424 , data
= $this.data('carousel')
425 , options
= $.extend({}, $.fn
.carousel
.defaults
, typeof option
== 'object' && option
)
426 , action
= typeof option
== 'string' ? option : options
.slide
427 if (!data
) $this.data('carousel', (data
= new Carousel(this, options
)))
428 if (typeof option
== 'number') data
.to(option
)
429 else if (action
) data
[action
]()
430 else if (options
.interval
) data
.pause().cycle()
434 $.fn
.carousel
.defaults
= {
439 $.fn
.carousel
.Constructor
= Carousel
442 /* CAROUSEL NO CONFLICT
443 * ==================== */
445 $.fn
.carousel
.noConflict = function () {
451 * ================= */
453 $(document
).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e
) {
454 var $this = $(this), href
455 , $target
= $($this.attr('data-target') || (href
= $this.attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
456 , options
= $.extend({}, $target
.data(), $this.data())
459 $target
.carousel(options
)
461 if (slideIndex
= $this.attr('data-slide-to')) {
462 $target
.data('carousel').pause().to(slideIndex
).cycle()
468 }(window
.jQuery
);/* =============================================================
469 * bootstrap-collapse.js v2.3.0
470 * http://twitter.github.com/bootstrap/javascript.html#collapse
471 * =============================================================
472 * Copyright 2012 Twitter, Inc.
474 * Licensed under the Apache License, Version 2.0 (the "License");
475 * you may not use this file except in compliance with the License.
476 * You may obtain a copy of the License at
478 * http://www.apache.org/licenses/LICENSE-2.0
480 * Unless required by applicable law or agreed to in writing, software
481 * distributed under the License is distributed on an "AS IS" BASIS,
482 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
483 * See the License for the specific language governing permissions and
484 * limitations under the License.
485 * ============================================================ */
490 "use strict"; // jshint ;_;
493 /* COLLAPSE PUBLIC CLASS DEFINITION
494 * ================================ */
496 var Collapse = function (element
, options
) {
497 this.$element
= $(element
)
498 this.options
= $.extend({}, $.fn
.collapse
.defaults
, options
)
500 if (this.options
.parent
) {
501 this.$parent
= $(this.options
.parent
)
504 this.options
.toggle
&& this.toggle()
507 Collapse
.prototype = {
509 constructor: Collapse
511 , dimension: function () {
512 var hasWidth
= this.$element
.hasClass('width')
513 return hasWidth
? 'width' : 'height'
516 , show: function () {
522 if (this.transitioning
|| this.$element
.hasClass('in')) return
524 dimension
= this.dimension()
525 scroll
= $.camelCase(['scroll', dimension
].join('-'))
526 actives
= this.$parent
&& this.$parent
.find('> .accordion-group > .in')
528 if (actives
&& actives
.length
) {
529 hasData
= actives
.data('collapse')
530 if (hasData
&& hasData
.transitioning
) return
531 actives
.collapse('hide')
532 hasData
|| actives
.data('collapse', null)
535 this.$element
[dimension
](0)
536 this.transition('addClass', $.Event('show'), 'shown')
537 $.support
.transition
&& this.$element
[dimension
](this.$element
[0][scroll
])
540 , hide: function () {
542 if (this.transitioning
|| !this.$element
.hasClass('in')) return
543 dimension
= this.dimension()
544 this.reset(this.$element
[dimension
]())
545 this.transition('removeClass', $.Event('hide'), 'hidden')
546 this.$element
[dimension
](0)
549 , reset: function (size
) {
550 var dimension
= this.dimension()
553 .removeClass('collapse')
554 [dimension
](size
|| 'auto')
557 this.$element
[size
!== null ? 'addClass' : 'removeClass']('collapse')
562 , transition: function (method
, startEvent
, completeEvent
) {
564 , complete = function () {
565 if (startEvent
.type
== 'show') that
.reset()
566 that
.transitioning
= 0
567 that
.$element
.trigger(completeEvent
)
570 this.$element
.trigger(startEvent
)
572 if (startEvent
.isDefaultPrevented()) return
574 this.transitioning
= 1
576 this.$element
[method
]('in')
578 $.support
.transition
&& this.$element
.hasClass('collapse') ?
579 this.$element
.one($.support
.transition
.end
, complete
) :
583 , toggle: function () {
584 this[this.$element
.hasClass('in') ? 'hide' : 'show']()
590 /* COLLAPSE PLUGIN DEFINITION
591 * ========================== */
593 var old
= $.fn
.collapse
595 $.fn
.collapse = function (option
) {
596 return this.each(function () {
598 , data
= $this.data('collapse')
599 , options
= $.extend({}, $.fn
.collapse
.defaults
, $this.data(), typeof option
== 'object' && option
)
600 if (!data
) $this.data('collapse', (data
= new Collapse(this, options
)))
601 if (typeof option
== 'string') data
[option
]()
605 $.fn
.collapse
.defaults
= {
609 $.fn
.collapse
.Constructor
= Collapse
612 /* COLLAPSE NO CONFLICT
613 * ==================== */
615 $.fn
.collapse
.noConflict = function () {
622 * ================= */
624 $(document
).on('click.collapse.data-api', '[data-toggle=collapse]', function (e
) {
625 var $this = $(this), href
626 , target
= $this.attr('data-target')
627 || e
.preventDefault()
628 || (href
= $this.attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
629 , option
= $(target
).data('collapse') ? 'toggle' : $this.data()
630 $this[$(target
).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
631 $(target
).collapse(option
)
634 }(window
.jQuery
);/* ============================================================
635 * bootstrap-dropdown.js v2.3.0
636 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
637 * ============================================================
638 * Copyright 2012 Twitter, Inc.
640 * Licensed under the Apache License, Version 2.0 (the "License");
641 * you may not use this file except in compliance with the License.
642 * You may obtain a copy of the License at
644 * http://www.apache.org/licenses/LICENSE-2.0
646 * Unless required by applicable law or agreed to in writing, software
647 * distributed under the License is distributed on an "AS IS" BASIS,
648 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
649 * See the License for the specific language governing permissions and
650 * limitations under the License.
651 * ============================================================ */
656 "use strict"; // jshint ;_;
659 /* DROPDOWN CLASS DEFINITION
660 * ========================= */
662 var toggle
= '[data-toggle=dropdown]'
663 , Dropdown = function (element
) {
664 var $el
= $(element
).on('click.dropdown.data-api', this.toggle
)
665 $('html').on('click.dropdown.data-api', function () {
666 $el
.parent().removeClass('open')
670 Dropdown
.prototype = {
672 constructor: Dropdown
674 , toggle: function (e
) {
679 if ($this.is('.disabled, :disabled')) return
681 $parent
= getParent($this)
683 isActive
= $parent
.hasClass('open')
688 $parent
.toggleClass('open')
696 , keydown: function (e
) {
704 if (!/(38|40|27)/.test(e
.keyCode
)) return
711 if ($this.is('.disabled, :disabled')) return
713 $parent
= getParent($this)
715 isActive
= $parent
.hasClass('open')
717 if (!isActive
|| (isActive
&& e
.keyCode
== 27)) {
718 if (e
.which
== 27) $parent
.find(toggle
).focus()
722 $items
= $('[role=menu] li:not(.divider):visible a', $parent
)
724 if (!$items
.length
) return
726 index
= $items
.index($items
.filter(':focus'))
728 if (e
.keyCode
== 38 && index
> 0) index
-- // up
729 if (e
.keyCode
== 40 && index
< $items
.length
- 1) index
++ // down
730 if (!~index
) index
= 0
739 function clearMenus() {
740 $(toggle
).each(function () {
741 getParent($(this)).removeClass('open')
745 function getParent($this) {
746 var selector
= $this.attr('data-target')
750 selector
= $this.attr('href')
751 selector
= selector
&& /#/.test(selector
) && selector
.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
754 $parent
= selector
&& $(selector
)
756 if (!$parent
|| !$parent
.length
) $parent
= $this.parent()
762 /* DROPDOWN PLUGIN DEFINITION
763 * ========================== */
765 var old
= $.fn
.dropdown
767 $.fn
.dropdown = function (option
) {
768 return this.each(function () {
770 , data
= $this.data('dropdown')
771 if (!data
) $this.data('dropdown', (data
= new Dropdown(this)))
772 if (typeof option
== 'string') data
[option
].call($this)
776 $.fn
.dropdown
.Constructor
= Dropdown
779 /* DROPDOWN NO CONFLICT
780 * ==================== */
782 $.fn
.dropdown
.noConflict = function () {
788 /* APPLY TO STANDARD DROPDOWN ELEMENTS
789 * =================================== */
792 .on('click.dropdown.data-api', clearMenus
)
793 .on('click.dropdown.data-api', '.dropdown form', function (e
) { e
.stopPropagation() })
794 .on('.dropdown-menu', function (e
) { e
.stopPropagation() })
795 .on('click.dropdown.data-api' , toggle
, Dropdown
.prototype.toggle
)
796 .on('keydown.dropdown.data-api', toggle
+ ', [role=menu]' , Dropdown
.prototype.keydown
)
799 /* =========================================================
800 * bootstrap-modal.js v2.3.0
801 * http://twitter.github.com/bootstrap/javascript.html#modals
802 * =========================================================
803 * Copyright 2012 Twitter, Inc.
805 * Licensed under the Apache License, Version 2.0 (the "License");
806 * you may not use this file except in compliance with the License.
807 * You may obtain a copy of the License at
809 * http://www.apache.org/licenses/LICENSE-2.0
811 * Unless required by applicable law or agreed to in writing, software
812 * distributed under the License is distributed on an "AS IS" BASIS,
813 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
814 * See the License for the specific language governing permissions and
815 * limitations under the License.
816 * ========================================================= */
821 "use strict"; // jshint ;_;
824 /* MODAL CLASS DEFINITION
825 * ====================== */
827 var Modal = function (element
, options
) {
828 this.options
= options
829 this.$element
= $(element
)
830 .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide
, this))
831 this.options
.remote
&& this.$element
.find('.modal-body').load(this.options
.remote
)
838 , toggle: function () {
839 return this[!this.isShown
? 'show' : 'hide']()
842 , show: function () {
844 , e
= $.Event('show')
846 this.$element
.trigger(e
)
848 if (this.isShown
|| e
.isDefaultPrevented()) return
854 this.backdrop(function () {
855 var transition
= $.support
.transition
&& that
.$element
.hasClass('fade')
857 if (!that
.$element
.parent().length
) {
858 that
.$element
.appendTo(document
.body
) //don't move modals dom position
864 that
.$element
[0].offsetWidth
// force reflow
869 .attr('aria-hidden', false)
874 that
.$element
.one($.support
.transition
.end
, function () { that
.$element
.focus().trigger('shown') }) :
875 that
.$element
.focus().trigger('shown')
880 , hide: function (e
) {
881 e
&& e
.preventDefault()
887 this.$element
.trigger(e
)
889 if (!this.isShown
|| e
.isDefaultPrevented()) return
895 $(document
).off('focusin.modal')
899 .attr('aria-hidden', true)
901 $.support
.transition
&& this.$element
.hasClass('fade') ?
902 this.hideWithTransition() :
906 , enforceFocus: function () {
908 $(document
).on('focusin.modal', function (e
) {
909 if (that
.$element
[0] !== e
.target
&& !that
.$element
.has(e
.target
).length
) {
910 that
.$element
.focus()
915 , escape: function () {
917 if (this.isShown
&& this.options
.keyboard
) {
918 this.$element
.on('keyup.dismiss.modal', function ( e
) {
919 e
.which
== 27 && that
.hide()
921 } else if (!this.isShown
) {
922 this.$element
.off('keyup.dismiss.modal')
926 , hideWithTransition: function () {
928 , timeout
= setTimeout(function () {
929 that
.$element
.off($.support
.transition
.end
)
933 this.$element
.one($.support
.transition
.end
, function () {
934 clearTimeout(timeout
)
939 , hideModal: function () {
942 this.backdrop(function () {
943 that
.removeBackdrop()
944 that
.$element
.trigger('hidden')
948 , removeBackdrop: function () {
949 this.$backdrop
.remove()
950 this.$backdrop
= null
953 , backdrop: function (callback
) {
955 , animate
= this.$element
.hasClass('fade') ? 'fade' : ''
957 if (this.isShown
&& this.options
.backdrop
) {
958 var doAnimate
= $.support
.transition
&& animate
960 this.$backdrop
= $('<div class="modal-backdrop ' + animate
+ '" />')
961 .appendTo(document
.body
)
963 this.$backdrop
.click(
964 this.options
.backdrop
== 'static' ?
965 $.proxy(this.$element
[0].focus
, this.$element
[0])
966 : $.proxy(this.hide
, this)
969 if (doAnimate
) this.$backdrop
[0].offsetWidth
// force reflow
971 this.$backdrop
.addClass('in')
973 if (!callback
) return
976 this.$backdrop
.one($.support
.transition
.end
, callback
) :
979 } else if (!this.isShown
&& this.$backdrop
) {
980 this.$backdrop
.removeClass('in')
982 $.support
.transition
&& this.$element
.hasClass('fade')?
983 this.$backdrop
.one($.support
.transition
.end
, callback
) :
986 } else if (callback
) {
993 /* MODAL PLUGIN DEFINITION
994 * ======================= */
998 $.fn
.modal = function (option
) {
999 return this.each(function () {
1001 , data
= $this.data('modal')
1002 , options
= $.extend({}, $.fn
.modal
.defaults
, $this.data(), typeof option
== 'object' && option
)
1003 if (!data
) $this.data('modal', (data
= new Modal(this, options
)))
1004 if (typeof option
== 'string') data
[option
]()
1005 else if (options
.show
) data
.show()
1009 $.fn
.modal
.defaults
= {
1015 $.fn
.modal
.Constructor
= Modal
1018 /* MODAL NO CONFLICT
1019 * ================= */
1021 $.fn
.modal
.noConflict = function () {
1030 $(document
).on('click.modal.data-api', '[data-toggle="modal"]', function (e
) {
1032 , href
= $this.attr('href')
1033 , $target
= $($this.attr('data-target') || (href
&& href
.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1034 , option
= $target
.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href
) && href
}, $target
.data(), $this.data())
1040 .one('hide', function () {
1046 /* ===========================================================
1047 * bootstrap-tooltip.js v2.3.0
1048 * http://twitter.github.com/bootstrap/javascript.html#tooltips
1049 * Inspired by the original jQuery.tipsy by Jason Frame
1050 * ===========================================================
1051 * Copyright 2012 Twitter, Inc.
1053 * Licensed under the Apache License, Version 2.0 (the "License");
1054 * you may not use this file except in compliance with the License.
1055 * You may obtain a copy of the License at
1057 * http://www.apache.org/licenses/LICENSE-2.0
1059 * Unless required by applicable law or agreed to in writing, software
1060 * distributed under the License is distributed on an "AS IS" BASIS,
1061 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1062 * See the License for the specific language governing permissions and
1063 * limitations under the License.
1064 * ========================================================== */
1069 "use strict"; // jshint ;_;
1072 /* TOOLTIP PUBLIC CLASS DEFINITION
1073 * =============================== */
1075 var Tooltip = function (element
, options
) {
1076 this.init('tooltip', element
, options
)
1079 Tooltip
.prototype = {
1081 constructor: Tooltip
1083 , init: function (type
, element
, options
) {
1091 this.$element
= $(element
)
1092 this.options
= this.getOptions(options
)
1095 triggers
= this.options
.trigger
.split(' ')
1097 for (i
= triggers
.length
; i
--;) {
1098 trigger
= triggers
[i
]
1099 if (trigger
== 'click') {
1100 this.$element
.on('click.' + this.type
, this.options
.selector
, $.proxy(this.toggle
, this))
1101 } else if (trigger
!= 'manual') {
1102 eventIn
= trigger
== 'hover' ? 'mouseenter' : 'focus'
1103 eventOut
= trigger
== 'hover' ? 'mouseleave' : 'blur'
1104 this.$element
.on(eventIn
+ '.' + this.type
, this.options
.selector
, $.proxy(this.enter
, this))
1105 this.$element
.on(eventOut
+ '.' + this.type
, this.options
.selector
, $.proxy(this.leave
, this))
1109 this.options
.selector
?
1110 (this._options
= $.extend({}, this.options
, { trigger: 'manual', selector: '' })) :
1114 , getOptions: function (options
) {
1115 options
= $.extend({}, $.fn
[this.type
].defaults
, this.$element
.data(), options
)
1117 if (options
.delay
&& typeof options
.delay
== 'number') {
1120 , hide: options
.delay
1127 , enter: function (e
) {
1128 var self
= $(e
.currentTarget
)[this.type
](this._options
).data(this.type
)
1130 if (!self
.options
.delay
|| !self
.options
.delay
.show
) return self
.show()
1132 clearTimeout(this.timeout
)
1133 self
.hoverState
= 'in'
1134 this.timeout
= setTimeout(function() {
1135 if (self
.hoverState
== 'in') self
.show()
1136 }, self
.options
.delay
.show
)
1139 , leave: function (e
) {
1140 var self
= $(e
.currentTarget
)[this.type
](this._options
).data(this.type
)
1142 if (this.timeout
) clearTimeout(this.timeout
)
1143 if (!self
.options
.delay
|| !self
.options
.delay
.hide
) return self
.hide()
1145 self
.hoverState
= 'out'
1146 this.timeout
= setTimeout(function() {
1147 if (self
.hoverState
== 'out') self
.hide()
1148 }, self
.options
.delay
.hide
)
1151 , show: function () {
1158 , e
= $.Event('show')
1160 if (this.hasContent() && this.enabled
) {
1161 this.$element
.trigger(e
)
1162 if (e
.isDefaultPrevented()) return
1166 if (this.options
.animation
) {
1167 $tip
.addClass('fade')
1170 placement
= typeof this.options
.placement
== 'function' ?
1171 this.options
.placement
.call(this, $tip
[0], this.$element
[0]) :
1172 this.options
.placement
1176 .css({ top: 0, left: 0, display: 'block' })
1178 this.options
.container
? $tip
.appendTo(this.options
.container
) : $tip
.insertAfter(this.$element
)
1180 pos
= this.getPosition()
1182 actualWidth
= $tip
[0].offsetWidth
1183 actualHeight
= $tip
[0].offsetHeight
1185 switch (placement
) {
1187 tp
= {top: pos
.top
+ pos
.height
, left: pos
.left
+ pos
.width
/ 2 - actualWidth
/ 2}
1190 tp
= {top: pos
.top
- actualHeight
, left: pos
.left
+ pos
.width
/ 2 - actualWidth
/ 2}
1193 tp
= {top: pos
.top
+ pos
.height
/ 2 - actualHeight
/ 2, left: pos
.left
- actualWidth
}
1196 tp
= {top: pos
.top
+ pos
.height
/ 2 - actualHeight
/ 2, left: pos
.left
+ pos
.width
}
1200 this.applyPlacement(tp
, placement
)
1201 this.$element
.trigger('shown')
1205 , applyPlacement: function(offset
, placement
){
1206 var $tip
= this.tip()
1207 , width
= $tip
[0].offsetWidth
1208 , height
= $tip
[0].offsetHeight
1216 .addClass(placement
)
1219 actualWidth
= $tip
[0].offsetWidth
1220 actualHeight
= $tip
[0].offsetHeight
1222 if (placement
== 'top' && actualHeight
!= height
) {
1223 offset
.top
= offset
.top
+ height
- actualHeight
1227 if (placement
== 'bottom' || placement
== 'top') {
1230 if (offset
.left
< 0){
1231 delta
= offset
.left
* -2
1234 actualWidth
= $tip
[0].offsetWidth
1235 actualHeight
= $tip
[0].offsetHeight
1238 this.replaceArrow(delta
- width
+ actualWidth
, actualWidth
, 'left')
1240 this.replaceArrow(actualHeight
- height
, actualHeight
, 'top')
1243 if (replace
) $tip
.offset(offset
)
1246 , replaceArrow: function(delta
, dimension
, position
){
1249 .css(position
, delta
? (50 * (1 - delta
/ dimension
) + "%") : '')
1252 , setContent: function () {
1253 var $tip
= this.tip()
1254 , title
= this.getTitle()
1256 $tip
.find('.tooltip-inner')[this.options
.html
? 'html' : 'text'](title
)
1257 $tip
.removeClass('fade in top bottom left right')
1260 , hide: function () {
1263 , e
= $.Event('hide')
1265 this.$element
.trigger(e
)
1266 if (e
.isDefaultPrevented()) return
1268 $tip
.removeClass('in')
1270 function removeWithAnimation() {
1271 var timeout
= setTimeout(function () {
1272 $tip
.off($.support
.transition
.end
).detach()
1275 $tip
.one($.support
.transition
.end
, function () {
1276 clearTimeout(timeout
)
1281 $.support
.transition
&& this.$tip
.hasClass('fade') ?
1282 removeWithAnimation() :
1285 this.$element
.trigger('hidden')
1290 , fixTitle: function () {
1291 var $e
= this.$element
1292 if ($e
.attr('title') || typeof($e
.attr('data-original-title')) != 'string') {
1293 $e
.attr('data-original-title', $e
.attr('title') || '').attr('title', '')
1297 , hasContent: function () {
1298 return this.getTitle()
1301 , getPosition: function () {
1302 var el
= this.$element
[0]
1303 return $.extend({}, (typeof el
.getBoundingClientRect
== 'function') ? el
.getBoundingClientRect() : {
1304 width: el
.offsetWidth
1305 , height: el
.offsetHeight
1306 }, this.$element
.offset())
1309 , getTitle: function () {
1311 , $e
= this.$element
1314 title
= $e
.attr('data-original-title')
1315 || (typeof o
.title
== 'function' ? o
.title
.call($e
[0]) : o
.title
)
1320 , tip: function () {
1321 return this.$tip
= this.$tip
|| $(this.options
.template
)
1324 , arrow: function(){
1325 return this.$arrow
= this.$arrow
|| this.tip().find(".tooltip-arrow")
1328 , validate: function () {
1329 if (!this.$element
[0].parentNode
) {
1331 this.$element
= null
1336 , enable: function () {
1340 , disable: function () {
1341 this.enabled
= false
1344 , toggleEnabled: function () {
1345 this.enabled
= !this.enabled
1348 , toggle: function (e
) {
1349 var self
= e
? $(e
.currentTarget
)[this.type
](this._options
).data(this.type
) : this
1350 self
.tip().hasClass('in') ? self
.hide() : self
.show()
1353 , destroy: function () {
1354 this.hide().$element
.off('.' + this.type
).removeData(this.type
)
1360 /* TOOLTIP PLUGIN DEFINITION
1361 * ========================= */
1363 var old
= $.fn
.tooltip
1365 $.fn
.tooltip = function ( option
) {
1366 return this.each(function () {
1368 , data
= $this.data('tooltip')
1369 , options
= typeof option
== 'object' && option
1370 if (!data
) $this.data('tooltip', (data
= new Tooltip(this, options
)))
1371 if (typeof option
== 'string') data
[option
]()
1375 $.fn
.tooltip
.Constructor
= Tooltip
1377 $.fn
.tooltip
.defaults
= {
1381 , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1382 , trigger: 'hover focus'
1390 /* TOOLTIP NO CONFLICT
1391 * =================== */
1393 $.fn
.tooltip
.noConflict = function () {
1399 /* ===========================================================
1400 * bootstrap-popover.js v2.3.0
1401 * http://twitter.github.com/bootstrap/javascript.html#popovers
1402 * ===========================================================
1403 * Copyright 2012 Twitter, Inc.
1405 * Licensed under the Apache License, Version 2.0 (the "License");
1406 * you may not use this file except in compliance with the License.
1407 * You may obtain a copy of the License at
1409 * http://www.apache.org/licenses/LICENSE-2.0
1411 * Unless required by applicable law or agreed to in writing, software
1412 * distributed under the License is distributed on an "AS IS" BASIS,
1413 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1414 * See the License for the specific language governing permissions and
1415 * limitations under the License.
1416 * =========================================================== */
1421 "use strict"; // jshint ;_;
1424 /* POPOVER PUBLIC CLASS DEFINITION
1425 * =============================== */
1427 var Popover = function (element
, options
) {
1428 this.init('popover', element
, options
)
1432 /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1433 ========================================== */
1435 Popover
.prototype = $.extend({}, $.fn
.tooltip
.Constructor
.prototype, {
1437 constructor: Popover
1439 , setContent: function () {
1440 var $tip
= this.tip()
1441 , title
= this.getTitle()
1442 , content
= this.getContent()
1444 $tip
.find('.popover-title')[this.options
.html
? 'html' : 'text'](title
)
1445 $tip
.find('.popover-content')[this.options
.html
? 'html' : 'text'](content
)
1447 $tip
.removeClass('fade top bottom left right in')
1450 , hasContent: function () {
1451 return this.getTitle() || this.getContent()
1454 , getContent: function () {
1456 , $e
= this.$element
1459 content
= (typeof o
.content
== 'function' ? o
.content
.call($e
[0]) : o
.content
)
1460 || $e
.attr('data-content')
1465 , tip: function () {
1467 this.$tip
= $(this.options
.template
)
1472 , destroy: function () {
1473 this.hide().$element
.off('.' + this.type
).removeData(this.type
)
1479 /* POPOVER PLUGIN DEFINITION
1480 * ======================= */
1482 var old
= $.fn
.popover
1484 $.fn
.popover = function (option
) {
1485 return this.each(function () {
1487 , data
= $this.data('popover')
1488 , options
= typeof option
== 'object' && option
1489 if (!data
) $this.data('popover', (data
= new Popover(this, options
)))
1490 if (typeof option
== 'string') data
[option
]()
1494 $.fn
.popover
.Constructor
= Popover
1496 $.fn
.popover
.defaults
= $.extend({} , $.fn
.tooltip
.defaults
, {
1500 , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1504 /* POPOVER NO CONFLICT
1505 * =================== */
1507 $.fn
.popover
.noConflict = function () {
1513 /* =============================================================
1514 * bootstrap-scrollspy.js v2.3.0
1515 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1516 * =============================================================
1517 * Copyright 2012 Twitter, Inc.
1519 * Licensed under the Apache License, Version 2.0 (the "License");
1520 * you may not use this file except in compliance with the License.
1521 * You may obtain a copy of the License at
1523 * http://www.apache.org/licenses/LICENSE-2.0
1525 * Unless required by applicable law or agreed to in writing, software
1526 * distributed under the License is distributed on an "AS IS" BASIS,
1527 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1528 * See the License for the specific language governing permissions and
1529 * limitations under the License.
1530 * ============================================================== */
1535 "use strict"; // jshint ;_;
1538 /* SCROLLSPY CLASS DEFINITION
1539 * ========================== */
1541 function ScrollSpy(element
, options
) {
1542 var process
= $.proxy(this.process
, this)
1543 , $element
= $(element
).is('body') ? $(window
) : $(element
)
1545 this.options
= $.extend({}, $.fn
.scrollspy
.defaults
, options
)
1546 this.$scrollElement
= $element
.on('scroll.scroll-spy.data-api', process
)
1547 this.selector
= (this.options
.target
1548 || ((href
= $(element
).attr('href')) && href
.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1549 || '') + ' .nav li > a'
1550 this.$body
= $('body')
1555 ScrollSpy
.prototype = {
1557 constructor: ScrollSpy
1559 , refresh: function () {
1563 this.offsets
= $([])
1564 this.targets
= $([])
1566 $targets
= this.$body
1567 .find(this.selector
)
1570 , href
= $el
.data('target') || $el
.attr('href')
1571 , $href
= /^#\w/.test(href
) && $(href
)
1574 && [[ $href
.position().top
+ (!$.isWindow(self
.$scrollElement
.get(0)) && self
.$scrollElement
.scrollTop()), href
]] ) || null
1576 .sort(function (a
, b
) { return a
[0] - b
[0] })
1578 self
.offsets
.push(this[0])
1579 self
.targets
.push(this[1])
1583 , process: function () {
1584 var scrollTop
= this.$scrollElement
.scrollTop() + this.options
.offset
1585 , scrollHeight
= this.$scrollElement
[0].scrollHeight
|| this.$body
[0].scrollHeight
1586 , maxScroll
= scrollHeight
- this.$scrollElement
.height()
1587 , offsets
= this.offsets
1588 , targets
= this.targets
1589 , activeTarget
= this.activeTarget
1592 if (scrollTop
>= maxScroll
) {
1593 return activeTarget
!= (i
= targets
.last()[0])
1594 && this.activate ( i
)
1597 for (i
= offsets
.length
; i
--;) {
1598 activeTarget
!= targets
[i
]
1599 && scrollTop
>= offsets
[i
]
1600 && (!offsets
[i
+ 1] || scrollTop
<= offsets
[i
+ 1])
1601 && this.activate( targets
[i
] )
1605 , activate: function (target
) {
1609 this.activeTarget
= target
1613 .removeClass('active')
1615 selector
= this.selector
1616 + '[data-target="' + target
+ '"],'
1617 + this.selector
+ '[href="' + target
+ '"]'
1619 active
= $(selector
)
1623 if (active
.parent('.dropdown-menu').length
) {
1624 active
= active
.closest('li.dropdown').addClass('active')
1627 active
.trigger('activate')
1633 /* SCROLLSPY PLUGIN DEFINITION
1634 * =========================== */
1636 var old
= $.fn
.scrollspy
1638 $.fn
.scrollspy = function (option
) {
1639 return this.each(function () {
1641 , data
= $this.data('scrollspy')
1642 , options
= typeof option
== 'object' && option
1643 if (!data
) $this.data('scrollspy', (data
= new ScrollSpy(this, options
)))
1644 if (typeof option
== 'string') data
[option
]()
1648 $.fn
.scrollspy
.Constructor
= ScrollSpy
1650 $.fn
.scrollspy
.defaults
= {
1655 /* SCROLLSPY NO CONFLICT
1656 * ===================== */
1658 $.fn
.scrollspy
.noConflict = function () {
1659 $.fn
.scrollspy
= old
1664 /* SCROLLSPY DATA-API
1665 * ================== */
1667 $(window
).on('load', function () {
1668 $('[data-spy="scroll"]').each(function () {
1670 $spy
.scrollspy($spy
.data())
1674 }(window
.jQuery
);/* ========================================================
1675 * bootstrap-tab.js v2.3.0
1676 * http://twitter.github.com/bootstrap/javascript.html#tabs
1677 * ========================================================
1678 * Copyright 2012 Twitter, Inc.
1680 * Licensed under the Apache License, Version 2.0 (the "License");
1681 * you may not use this file except in compliance with the License.
1682 * You may obtain a copy of the License at
1684 * http://www.apache.org/licenses/LICENSE-2.0
1686 * Unless required by applicable law or agreed to in writing, software
1687 * distributed under the License is distributed on an "AS IS" BASIS,
1688 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1689 * See the License for the specific language governing permissions and
1690 * limitations under the License.
1691 * ======================================================== */
1696 "use strict"; // jshint ;_;
1699 /* TAB CLASS DEFINITION
1700 * ==================== */
1702 var Tab = function (element
) {
1703 this.element
= $(element
)
1710 , show: function () {
1711 var $this = this.element
1712 , $ul
= $this.closest('ul:not(.dropdown-menu)')
1713 , selector
= $this.attr('data-target')
1719 selector
= $this.attr('href')
1720 selector
= selector
&& selector
.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1723 if ( $this.parent('li').hasClass('active') ) return
1725 previous
= $ul
.find('.active:last a')[0]
1727 e
= $.Event('show', {
1728 relatedTarget: previous
1733 if (e
.isDefaultPrevented()) return
1735 $target
= $(selector
)
1737 this.activate($this.parent('li'), $ul
)
1738 this.activate($target
, $target
.parent(), function () {
1741 , relatedTarget: previous
1746 , activate: function ( element
, container
, callback
) {
1747 var $active
= container
.find('> .active')
1748 , transition
= callback
1749 && $.support
.transition
1750 && $active
.hasClass('fade')
1754 .removeClass('active')
1755 .find('> .dropdown-menu > .active')
1756 .removeClass('active')
1758 element
.addClass('active')
1761 element
[0].offsetWidth
// reflow for transition
1762 element
.addClass('in')
1764 element
.removeClass('fade')
1767 if ( element
.parent('.dropdown-menu') ) {
1768 element
.closest('li.dropdown').addClass('active')
1771 callback
&& callback()
1775 $active
.one($.support
.transition
.end
, next
) :
1778 $active
.removeClass('in')
1783 /* TAB PLUGIN DEFINITION
1784 * ===================== */
1788 $.fn
.tab = function ( option
) {
1789 return this.each(function () {
1791 , data
= $this.data('tab')
1792 if (!data
) $this.data('tab', (data
= new Tab(this)))
1793 if (typeof option
== 'string') data
[option
]()
1797 $.fn
.tab
.Constructor
= Tab
1801 * =============== */
1803 $.fn
.tab
.noConflict = function () {
1812 $(document
).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e
) {
1817 }(window
.jQuery
);/* =============================================================
1818 * bootstrap-typeahead.js v2.3.0
1819 * http://twitter.github.com/bootstrap/javascript.html#typeahead
1820 * =============================================================
1821 * Copyright 2012 Twitter, Inc.
1823 * Licensed under the Apache License, Version 2.0 (the "License");
1824 * you may not use this file except in compliance with the License.
1825 * You may obtain a copy of the License at
1827 * http://www.apache.org/licenses/LICENSE-2.0
1829 * Unless required by applicable law or agreed to in writing, software
1830 * distributed under the License is distributed on an "AS IS" BASIS,
1831 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1832 * See the License for the specific language governing permissions and
1833 * limitations under the License.
1834 * ============================================================ */
1839 "use strict"; // jshint ;_;
1842 /* TYPEAHEAD PUBLIC CLASS DEFINITION
1843 * ================================= */
1845 var Typeahead = function (element
, options
) {
1846 this.$element
= $(element
)
1847 this.options
= $.extend({}, $.fn
.typeahead
.defaults
, options
)
1848 this.matcher
= this.options
.matcher
|| this.matcher
1849 this.sorter
= this.options
.sorter
|| this.sorter
1850 this.highlighter
= this.options
.highlighter
|| this.highlighter
1851 this.updater
= this.options
.updater
|| this.updater
1852 this.source
= this.options
.source
1853 this.$menu
= $(this.options
.menu
)
1858 Typeahead
.prototype = {
1860 constructor: Typeahead
1862 , select: function () {
1863 var val
= this.$menu
.find('.active').attr('data-value')
1865 .val(this.updater(val
))
1870 , updater: function (item
) {
1874 , show: function () {
1875 var pos
= $.extend({}, this.$element
.position(), {
1876 height: this.$element
[0].offsetHeight
1880 .insertAfter(this.$element
)
1882 top: pos
.top
+ pos
.height
1891 , hide: function () {
1897 , lookup: function (event
) {
1900 this.query
= this.$element
.val()
1902 if (!this.query
|| this.query
.length
< this.options
.minLength
) {
1903 return this.shown
? this.hide() : this
1906 items
= $.isFunction(this.source
) ? this.source(this.query
, $.proxy(this.process
, this)) : this.source
1908 return items
? this.process(items
) : this
1911 , process: function (items
) {
1914 items
= $.grep(items
, function (item
) {
1915 return that
.matcher(item
)
1918 items
= this.sorter(items
)
1920 if (!items
.length
) {
1921 return this.shown
? this.hide() : this
1924 return this.render(items
.slice(0, this.options
.items
)).show()
1927 , matcher: function (item
) {
1928 return ~item
.toLowerCase().indexOf(this.query
.toLowerCase())
1931 , sorter: function (items
) {
1933 , caseSensitive
= []
1934 , caseInsensitive
= []
1937 while (item
= items
.shift()) {
1938 if (!item
.toLowerCase().indexOf(this.query
.toLowerCase())) beginswith
.push(item
)
1939 else if (~item
.indexOf(this.query
)) caseSensitive
.push(item
)
1940 else caseInsensitive
.push(item
)
1943 return beginswith
.concat(caseSensitive
, caseInsensitive
)
1946 , highlighter: function (item
) {
1947 var query
= this.query
.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1948 return item
.replace(new RegExp('(' + query
+ ')', 'ig'), function ($1, match
) {
1949 return '<strong>' + match
+ '</strong>'
1953 , render: function (items
) {
1956 items
= $(items
).map(function (i
, item
) {
1957 i
= $(that
.options
.item
).attr('data-value', item
)
1958 i
.find('a').html(that
.highlighter(item
))
1962 items
.first().addClass('active')
1963 this.$menu
.html(items
)
1967 , next: function (event
) {
1968 var active
= this.$menu
.find('.active').removeClass('active')
1969 , next
= active
.next()
1972 next
= $(this.$menu
.find('li')[0])
1975 next
.addClass('active')
1978 , prev: function (event
) {
1979 var active
= this.$menu
.find('.active').removeClass('active')
1980 , prev
= active
.prev()
1983 prev
= this.$menu
.find('li').last()
1986 prev
.addClass('active')
1989 , listen: function () {
1991 .on('focus', $.proxy(this.focus
, this))
1992 .on('blur', $.proxy(this.blur
, this))
1993 .on('keypress', $.proxy(this.keypress
, this))
1994 .on('keyup', $.proxy(this.keyup
, this))
1996 if (this.eventSupported('keydown')) {
1997 this.$element
.on('keydown', $.proxy(this.keydown
, this))
2001 .on('click', $.proxy(this.click
, this))
2002 .on('mouseenter', 'li', $.proxy(this.mouseenter
, this))
2003 .on('mouseleave', 'li', $.proxy(this.mouseleave
, this))
2006 , eventSupported: function(eventName
) {
2007 var isSupported
= eventName
in this.$element
2009 this.$element
.setAttribute(eventName
, 'return;')
2010 isSupported
= typeof this.$element
[eventName
] === 'function'
2015 , move: function (e
) {
2016 if (!this.shown
) return
2025 case 38: // up arrow
2030 case 40: // down arrow
2039 , keydown: function (e
) {
2040 this.suppressKeyPressRepeat
= ~$.inArray(e
.keyCode
, [40,38,9,13,27])
2044 , keypress: function (e
) {
2045 if (this.suppressKeyPressRepeat
) return
2049 , keyup: function (e
) {
2051 case 40: // down arrow
2052 case 38: // up arrow
2060 if (!this.shown
) return
2065 if (!this.shown
) return
2077 , focus: function (e
) {
2081 , blur: function (e
) {
2082 this.focused
= false
2083 if (!this.mousedover
&& this.shown
) this.hide()
2086 , click: function (e
) {
2090 this.$element
.focus()
2093 , mouseenter: function (e
) {
2094 this.mousedover
= true
2095 this.$menu
.find('.active').removeClass('active')
2096 $(e
.currentTarget
).addClass('active')
2099 , mouseleave: function (e
) {
2100 this.mousedover
= false
2101 if (!this.focused
&& this.shown
) this.hide()
2107 /* TYPEAHEAD PLUGIN DEFINITION
2108 * =========================== */
2110 var old
= $.fn
.typeahead
2112 $.fn
.typeahead = function (option
) {
2113 return this.each(function () {
2115 , data
= $this.data('typeahead')
2116 , options
= typeof option
== 'object' && option
2117 if (!data
) $this.data('typeahead', (data
= new Typeahead(this, options
)))
2118 if (typeof option
== 'string') data
[option
]()
2122 $.fn
.typeahead
.defaults
= {
2125 , menu: '<ul class="typeahead dropdown-menu"></ul>'
2126 , item: '<li><a href="#"></a></li>'
2130 $.fn
.typeahead
.Constructor
= Typeahead
2133 /* TYPEAHEAD NO CONFLICT
2134 * =================== */
2136 $.fn
.typeahead
.noConflict = function () {
2137 $.fn
.typeahead
= old
2142 /* TYPEAHEAD DATA-API
2143 * ================== */
2145 $(document
).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e
) {
2147 if ($this.data('typeahead')) return
2148 $this.typeahead($this.data())
2152 /* ==========================================================
2153 * bootstrap-affix.js v2.3.0
2154 * http://twitter.github.com/bootstrap/javascript.html#affix
2155 * ==========================================================
2156 * Copyright 2012 Twitter, Inc.
2158 * Licensed under the Apache License, Version 2.0 (the "License");
2159 * you may not use this file except in compliance with the License.
2160 * You may obtain a copy of the License at
2162 * http://www.apache.org/licenses/LICENSE-2.0
2164 * Unless required by applicable law or agreed to in writing, software
2165 * distributed under the License is distributed on an "AS IS" BASIS,
2166 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2167 * See the License for the specific language governing permissions and
2168 * limitations under the License.
2169 * ========================================================== */
2174 "use strict"; // jshint ;_;
2177 /* AFFIX CLASS DEFINITION
2178 * ====================== */
2180 var Affix = function (element
, options
) {
2181 this.options
= $.extend({}, $.fn
.affix
.defaults
, options
)
2182 this.$window
= $(window
)
2183 .on('scroll.affix.data-api', $.proxy(this.checkPosition
, this))
2184 .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition
, this), 1) }, this))
2185 this.$element
= $(element
)
2186 this.checkPosition()
2189 Affix
.prototype.checkPosition = function () {
2190 if (!this.$element
.is(':visible')) return
2192 var scrollHeight
= $(document
).height()
2193 , scrollTop
= this.$window
.scrollTop()
2194 , position
= this.$element
.offset()
2195 , offset
= this.options
.offset
2196 , offsetBottom
= offset
.bottom
2197 , offsetTop
= offset
.top
2198 , reset
= 'affix affix-top affix-bottom'
2201 if (typeof offset
!= 'object') offsetBottom
= offsetTop
= offset
2202 if (typeof offsetTop
== 'function') offsetTop
= offset
.top()
2203 if (typeof offsetBottom
== 'function') offsetBottom
= offset
.bottom()
2205 affix
= this.unpin
!= null && (scrollTop
+ this.unpin
<= position
.top
) ?
2206 false : offsetBottom
!= null && (position
.top
+ this.$element
.height() >= scrollHeight
- offsetBottom
) ?
2207 'bottom' : offsetTop
!= null && scrollTop
<= offsetTop
?
2210 if (this.affixed
=== affix
) return
2212 this.affixed
= affix
2213 this.unpin
= affix
== 'bottom' ? position
.top
- scrollTop : null
2215 this.$element
.removeClass(reset
).addClass('affix' + (affix
? '-' + affix : ''))
2219 /* AFFIX PLUGIN DEFINITION
2220 * ======================= */
2222 var old
= $.fn
.affix
2224 $.fn
.affix = function (option
) {
2225 return this.each(function () {
2227 , data
= $this.data('affix')
2228 , options
= typeof option
== 'object' && option
2229 if (!data
) $this.data('affix', (data
= new Affix(this, options
)))
2230 if (typeof option
== 'string') data
[option
]()
2234 $.fn
.affix
.Constructor
= Affix
2236 $.fn
.affix
.defaults
= {
2241 /* AFFIX NO CONFLICT
2242 * ================= */
2244 $.fn
.affix
.noConflict = function () {
2253 $(window
).on('load', function () {
2254 $('[data-spy="affix"]').each(function () {
2256 , data
= $spy
.data()
2258 data
.offset
= data
.offset
|| {}
2260 data
.offsetBottom
&& (data
.offset
.bottom
= data
.offsetBottom
)
2261 data
.offsetTop
&& (data
.offset
.top
= data
.offsetTop
)
This page took 0.158278 seconds and 4 git commands to generate.