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