/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk

« back to all changes in this revision

Viewing changes to codeigniter/js/bootstrap.js

  • Committer: Gustav Hatvigsson
  • Date: 2013-05-31 06:15:46 UTC
  • mfrom: (90.1.20 lenasys2)
  • Revision ID: gustav.hartvigsson@gmail.com-20130531061546-vj8z28sq375kvghq
Merged Jonsson:s changes:
Fixed the layout on cms index so the arrows and dots marks expanded objects.
Fixed so the course content is sorted by course occasion and not by name

Show diffs side-by-side

added added

removed removed

Lines of Context:
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);
 
 
b'\\ No newline at end of file'