Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

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