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