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