nasldoc 0.1.0 → 0.1.1

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