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