flexi_generators 0.3.1 → 0.3.2

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