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