js/bootstrap.js
author indvd00m (gotoindvdum[at]gmail[dot]com)
Fri, 04 Jul 2014 16:42:41 +0400
changeset 0 ba8ab09f730e
permissions -rw-r--r--
First home page
     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