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