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