gameplan 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +16 -0
  4. data/README.md +3 -0
  5. data/Rakefile +3 -0
  6. data/bin/gameplan +7 -0
  7. data/gameplan.gemspec +22 -0
  8. data/lib/gameplan/application.rb +55 -0
  9. data/lib/gameplan/common_state.rb +41 -0
  10. data/lib/gameplan/describe.rb +11 -0
  11. data/lib/gameplan/endpoint.rb +9 -0
  12. data/lib/gameplan/flow.rb +39 -0
  13. data/lib/gameplan/frontend/public/css/application.css +6 -0
  14. data/lib/gameplan/frontend/public/css/bootstrap-responsive.css +808 -0
  15. data/lib/gameplan/frontend/public/css/bootstrap-responsive.min.css +9 -0
  16. data/lib/gameplan/frontend/public/css/bootstrap.css +4960 -0
  17. data/lib/gameplan/frontend/public/css/bootstrap.min.css +9 -0
  18. data/lib/gameplan/frontend/public/img/glyphicons-halflings-white.png +0 -0
  19. data/lib/gameplan/frontend/public/img/glyphicons-halflings.png +0 -0
  20. data/lib/gameplan/frontend/public/js/bootstrap.js +1824 -0
  21. data/lib/gameplan/frontend/public/js/bootstrap.min.js +6 -0
  22. data/lib/gameplan/frontend/views/app.erb +6 -0
  23. data/lib/gameplan/frontend/views/home.erb +6 -0
  24. data/lib/gameplan/frontend/views/layout/application.erb +76 -0
  25. data/lib/gameplan/frontend/views/state.erb +8 -0
  26. data/lib/gameplan/fuck_ruby.rb +25 -0
  27. data/lib/gameplan/pending_state.rb +20 -0
  28. data/lib/gameplan/site_generator.rb +44 -0
  29. data/lib/gameplan/state.rb +50 -0
  30. data/lib/gameplan/transitions.rb +20 -0
  31. data/lib/gameplan/user.rb +9 -0
  32. data/lib/gameplan/validation.rb +28 -0
  33. data/lib/gameplan/version.rb +3 -0
  34. data/lib/gameplan.rb +140 -0
  35. metadata +92 -0
@@ -0,0 +1,1824 @@
1
+ /* ===================================================
2
+ * bootstrap-transition.js v2.0.3
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.3
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.3
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.3
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.3
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.3
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.3
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.3
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 (!self.options.delay || !self.options.delay.hide) return self.hide()
972
+
973
+ clearTimeout(this.timeout)
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
+ * bootstrap-popover.js v2.0.3
1161
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
1162
+ * ===========================================================
1163
+ * Copyright 2012 Twitter, Inc.
1164
+ *
1165
+ * Licensed under the Apache License, Version 2.0 (the "License");
1166
+ * you may not use this file except in compliance with the License.
1167
+ * You may obtain a copy of the License at
1168
+ *
1169
+ * http://www.apache.org/licenses/LICENSE-2.0
1170
+ *
1171
+ * Unless required by applicable law or agreed to in writing, software
1172
+ * distributed under the License is distributed on an "AS IS" BASIS,
1173
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1174
+ * See the License for the specific language governing permissions and
1175
+ * limitations under the License.
1176
+ * =========================================================== */
1177
+
1178
+
1179
+ !function ($) {
1180
+
1181
+ "use strict"; // jshint ;_;
1182
+
1183
+
1184
+ /* POPOVER PUBLIC CLASS DEFINITION
1185
+ * =============================== */
1186
+
1187
+ var Popover = function ( element, options ) {
1188
+ this.init('popover', element, options)
1189
+ }
1190
+
1191
+
1192
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1193
+ ========================================== */
1194
+
1195
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1196
+
1197
+ constructor: Popover
1198
+
1199
+ , setContent: function () {
1200
+ var $tip = this.tip()
1201
+ , title = this.getTitle()
1202
+ , content = this.getContent()
1203
+
1204
+ $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
1205
+ $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
1206
+
1207
+ $tip.removeClass('fade top bottom left right in')
1208
+ }
1209
+
1210
+ , hasContent: function () {
1211
+ return this.getTitle() || this.getContent()
1212
+ }
1213
+
1214
+ , getContent: function () {
1215
+ var content
1216
+ , $e = this.$element
1217
+ , o = this.options
1218
+
1219
+ content = $e.attr('data-content')
1220
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1221
+
1222
+ return content
1223
+ }
1224
+
1225
+ , tip: function () {
1226
+ if (!this.$tip) {
1227
+ this.$tip = $(this.options.template)
1228
+ }
1229
+ return this.$tip
1230
+ }
1231
+
1232
+ })
1233
+
1234
+
1235
+ /* POPOVER PLUGIN DEFINITION
1236
+ * ======================= */
1237
+
1238
+ $.fn.popover = function (option) {
1239
+ return this.each(function () {
1240
+ var $this = $(this)
1241
+ , data = $this.data('popover')
1242
+ , options = typeof option == 'object' && option
1243
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
1244
+ if (typeof option == 'string') data[option]()
1245
+ })
1246
+ }
1247
+
1248
+ $.fn.popover.Constructor = Popover
1249
+
1250
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1251
+ placement: 'right'
1252
+ , content: ''
1253
+ , 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>'
1254
+ })
1255
+
1256
+ }(window.jQuery);/* =============================================================
1257
+ * bootstrap-scrollspy.js v2.0.3
1258
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1259
+ * =============================================================
1260
+ * Copyright 2012 Twitter, Inc.
1261
+ *
1262
+ * Licensed under the Apache License, Version 2.0 (the "License");
1263
+ * you may not use this file except in compliance with the License.
1264
+ * You may obtain a copy of the License at
1265
+ *
1266
+ * http://www.apache.org/licenses/LICENSE-2.0
1267
+ *
1268
+ * Unless required by applicable law or agreed to in writing, software
1269
+ * distributed under the License is distributed on an "AS IS" BASIS,
1270
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1271
+ * See the License for the specific language governing permissions and
1272
+ * limitations under the License.
1273
+ * ============================================================== */
1274
+
1275
+
1276
+ !function ($) {
1277
+
1278
+ "use strict"; // jshint ;_;
1279
+
1280
+
1281
+ /* SCROLLSPY CLASS DEFINITION
1282
+ * ========================== */
1283
+
1284
+ function ScrollSpy( element, options) {
1285
+ var process = $.proxy(this.process, this)
1286
+ , $element = $(element).is('body') ? $(window) : $(element)
1287
+ , href
1288
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1289
+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)
1290
+ this.selector = (this.options.target
1291
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1292
+ || '') + ' .nav li > a'
1293
+ this.$body = $('body')
1294
+ this.refresh()
1295
+ this.process()
1296
+ }
1297
+
1298
+ ScrollSpy.prototype = {
1299
+
1300
+ constructor: ScrollSpy
1301
+
1302
+ , refresh: function () {
1303
+ var self = this
1304
+ , $targets
1305
+
1306
+ this.offsets = $([])
1307
+ this.targets = $([])
1308
+
1309
+ $targets = this.$body
1310
+ .find(this.selector)
1311
+ .map(function () {
1312
+ var $el = $(this)
1313
+ , href = $el.data('target') || $el.attr('href')
1314
+ , $href = /^#\w/.test(href) && $(href)
1315
+ return ( $href
1316
+ && href.length
1317
+ && [[ $href.position().top, href ]] ) || null
1318
+ })
1319
+ .sort(function (a, b) { return a[0] - b[0] })
1320
+ .each(function () {
1321
+ self.offsets.push(this[0])
1322
+ self.targets.push(this[1])
1323
+ })
1324
+ }
1325
+
1326
+ , process: function () {
1327
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1328
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1329
+ , maxScroll = scrollHeight - this.$scrollElement.height()
1330
+ , offsets = this.offsets
1331
+ , targets = this.targets
1332
+ , activeTarget = this.activeTarget
1333
+ , i
1334
+
1335
+ if (scrollTop >= maxScroll) {
1336
+ return activeTarget != (i = targets.last()[0])
1337
+ && this.activate ( i )
1338
+ }
1339
+
1340
+ for (i = offsets.length; i--;) {
1341
+ activeTarget != targets[i]
1342
+ && scrollTop >= offsets[i]
1343
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1344
+ && this.activate( targets[i] )
1345
+ }
1346
+ }
1347
+
1348
+ , activate: function (target) {
1349
+ var active
1350
+ , selector
1351
+
1352
+ this.activeTarget = target
1353
+
1354
+ $(this.selector)
1355
+ .parent('.active')
1356
+ .removeClass('active')
1357
+
1358
+ selector = this.selector
1359
+ + '[data-target="' + target + '"],'
1360
+ + this.selector + '[href="' + target + '"]'
1361
+
1362
+ active = $(selector)
1363
+ .parent('li')
1364
+ .addClass('active')
1365
+
1366
+ if (active.parent('.dropdown-menu')) {
1367
+ active = active.closest('li.dropdown').addClass('active')
1368
+ }
1369
+
1370
+ active.trigger('activate')
1371
+ }
1372
+
1373
+ }
1374
+
1375
+
1376
+ /* SCROLLSPY PLUGIN DEFINITION
1377
+ * =========================== */
1378
+
1379
+ $.fn.scrollspy = function ( option ) {
1380
+ return this.each(function () {
1381
+ var $this = $(this)
1382
+ , data = $this.data('scrollspy')
1383
+ , options = typeof option == 'object' && option
1384
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1385
+ if (typeof option == 'string') data[option]()
1386
+ })
1387
+ }
1388
+
1389
+ $.fn.scrollspy.Constructor = ScrollSpy
1390
+
1391
+ $.fn.scrollspy.defaults = {
1392
+ offset: 10
1393
+ }
1394
+
1395
+
1396
+ /* SCROLLSPY DATA-API
1397
+ * ================== */
1398
+
1399
+ $(function () {
1400
+ $('[data-spy="scroll"]').each(function () {
1401
+ var $spy = $(this)
1402
+ $spy.scrollspy($spy.data())
1403
+ })
1404
+ })
1405
+
1406
+ }(window.jQuery);/* ========================================================
1407
+ * bootstrap-tab.js v2.0.3
1408
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
1409
+ * ========================================================
1410
+ * Copyright 2012 Twitter, Inc.
1411
+ *
1412
+ * Licensed under the Apache License, Version 2.0 (the "License");
1413
+ * you may not use this file except in compliance with the License.
1414
+ * You may obtain a copy of the License at
1415
+ *
1416
+ * http://www.apache.org/licenses/LICENSE-2.0
1417
+ *
1418
+ * Unless required by applicable law or agreed to in writing, software
1419
+ * distributed under the License is distributed on an "AS IS" BASIS,
1420
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1421
+ * See the License for the specific language governing permissions and
1422
+ * limitations under the License.
1423
+ * ======================================================== */
1424
+
1425
+
1426
+ !function ($) {
1427
+
1428
+ "use strict"; // jshint ;_;
1429
+
1430
+
1431
+ /* TAB CLASS DEFINITION
1432
+ * ==================== */
1433
+
1434
+ var Tab = function ( element ) {
1435
+ this.element = $(element)
1436
+ }
1437
+
1438
+ Tab.prototype = {
1439
+
1440
+ constructor: Tab
1441
+
1442
+ , show: function () {
1443
+ var $this = this.element
1444
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
1445
+ , selector = $this.attr('data-target')
1446
+ , previous
1447
+ , $target
1448
+ , e
1449
+
1450
+ if (!selector) {
1451
+ selector = $this.attr('href')
1452
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1453
+ }
1454
+
1455
+ if ( $this.parent('li').hasClass('active') ) return
1456
+
1457
+ previous = $ul.find('.active a').last()[0]
1458
+
1459
+ e = $.Event('show', {
1460
+ relatedTarget: previous
1461
+ })
1462
+
1463
+ $this.trigger(e)
1464
+
1465
+ if (e.isDefaultPrevented()) return
1466
+
1467
+ $target = $(selector)
1468
+
1469
+ this.activate($this.parent('li'), $ul)
1470
+ this.activate($target, $target.parent(), function () {
1471
+ $this.trigger({
1472
+ type: 'shown'
1473
+ , relatedTarget: previous
1474
+ })
1475
+ })
1476
+ }
1477
+
1478
+ , activate: function ( element, container, callback) {
1479
+ var $active = container.find('> .active')
1480
+ , transition = callback
1481
+ && $.support.transition
1482
+ && $active.hasClass('fade')
1483
+
1484
+ function next() {
1485
+ $active
1486
+ .removeClass('active')
1487
+ .find('> .dropdown-menu > .active')
1488
+ .removeClass('active')
1489
+
1490
+ element.addClass('active')
1491
+
1492
+ if (transition) {
1493
+ element[0].offsetWidth // reflow for transition
1494
+ element.addClass('in')
1495
+ } else {
1496
+ element.removeClass('fade')
1497
+ }
1498
+
1499
+ if ( element.parent('.dropdown-menu') ) {
1500
+ element.closest('li.dropdown').addClass('active')
1501
+ }
1502
+
1503
+ callback && callback()
1504
+ }
1505
+
1506
+ transition ?
1507
+ $active.one($.support.transition.end, next) :
1508
+ next()
1509
+
1510
+ $active.removeClass('in')
1511
+ }
1512
+ }
1513
+
1514
+
1515
+ /* TAB PLUGIN DEFINITION
1516
+ * ===================== */
1517
+
1518
+ $.fn.tab = function ( option ) {
1519
+ return this.each(function () {
1520
+ var $this = $(this)
1521
+ , data = $this.data('tab')
1522
+ if (!data) $this.data('tab', (data = new Tab(this)))
1523
+ if (typeof option == 'string') data[option]()
1524
+ })
1525
+ }
1526
+
1527
+ $.fn.tab.Constructor = Tab
1528
+
1529
+
1530
+ /* TAB DATA-API
1531
+ * ============ */
1532
+
1533
+ $(function () {
1534
+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1535
+ e.preventDefault()
1536
+ $(this).tab('show')
1537
+ })
1538
+ })
1539
+
1540
+ }(window.jQuery);/* =============================================================
1541
+ * bootstrap-typeahead.js v2.0.3
1542
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
1543
+ * =============================================================
1544
+ * Copyright 2012 Twitter, Inc.
1545
+ *
1546
+ * Licensed under the Apache License, Version 2.0 (the "License");
1547
+ * you may not use this file except in compliance with the License.
1548
+ * You may obtain a copy of the License at
1549
+ *
1550
+ * http://www.apache.org/licenses/LICENSE-2.0
1551
+ *
1552
+ * Unless required by applicable law or agreed to in writing, software
1553
+ * distributed under the License is distributed on an "AS IS" BASIS,
1554
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1555
+ * See the License for the specific language governing permissions and
1556
+ * limitations under the License.
1557
+ * ============================================================ */
1558
+
1559
+
1560
+ !function($){
1561
+
1562
+ "use strict"; // jshint ;_;
1563
+
1564
+
1565
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
1566
+ * ================================= */
1567
+
1568
+ var Typeahead = function (element, options) {
1569
+ this.$element = $(element)
1570
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
1571
+ this.matcher = this.options.matcher || this.matcher
1572
+ this.sorter = this.options.sorter || this.sorter
1573
+ this.highlighter = this.options.highlighter || this.highlighter
1574
+ this.updater = this.options.updater || this.updater
1575
+ this.$menu = $(this.options.menu).appendTo('body')
1576
+ this.source = this.options.source
1577
+ this.shown = false
1578
+ this.listen()
1579
+ }
1580
+
1581
+ Typeahead.prototype = {
1582
+
1583
+ constructor: Typeahead
1584
+
1585
+ , select: function () {
1586
+ var val = this.$menu.find('.active').attr('data-value')
1587
+ this.$element
1588
+ .val(this.updater(val))
1589
+ .change()
1590
+ return this.hide()
1591
+ }
1592
+
1593
+ , updater: function (item) {
1594
+ return item
1595
+ }
1596
+
1597
+ , show: function () {
1598
+ var pos = $.extend({}, this.$element.offset(), {
1599
+ height: this.$element[0].offsetHeight
1600
+ })
1601
+
1602
+ this.$menu.css({
1603
+ top: pos.top + pos.height
1604
+ , left: pos.left
1605
+ })
1606
+
1607
+ this.$menu.show()
1608
+ this.shown = true
1609
+ return this
1610
+ }
1611
+
1612
+ , hide: function () {
1613
+ this.$menu.hide()
1614
+ this.shown = false
1615
+ return this
1616
+ }
1617
+
1618
+ , lookup: function (event) {
1619
+ var that = this
1620
+ , items
1621
+ , q
1622
+
1623
+ this.query = this.$element.val()
1624
+
1625
+ if (!this.query) {
1626
+ return this.shown ? this.hide() : this
1627
+ }
1628
+
1629
+ items = $.grep(this.source, function (item) {
1630
+ return that.matcher(item)
1631
+ })
1632
+
1633
+ items = this.sorter(items)
1634
+
1635
+ if (!items.length) {
1636
+ return this.shown ? this.hide() : this
1637
+ }
1638
+
1639
+ return this.render(items.slice(0, this.options.items)).show()
1640
+ }
1641
+
1642
+ , matcher: function (item) {
1643
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1644
+ }
1645
+
1646
+ , sorter: function (items) {
1647
+ var beginswith = []
1648
+ , caseSensitive = []
1649
+ , caseInsensitive = []
1650
+ , item
1651
+
1652
+ while (item = items.shift()) {
1653
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1654
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
1655
+ else caseInsensitive.push(item)
1656
+ }
1657
+
1658
+ return beginswith.concat(caseSensitive, caseInsensitive)
1659
+ }
1660
+
1661
+ , highlighter: function (item) {
1662
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1663
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1664
+ return '<strong>' + match + '</strong>'
1665
+ })
1666
+ }
1667
+
1668
+ , render: function (items) {
1669
+ var that = this
1670
+
1671
+ items = $(items).map(function (i, item) {
1672
+ i = $(that.options.item).attr('data-value', item)
1673
+ i.find('a').html(that.highlighter(item))
1674
+ return i[0]
1675
+ })
1676
+
1677
+ items.first().addClass('active')
1678
+ this.$menu.html(items)
1679
+ return this
1680
+ }
1681
+
1682
+ , next: function (event) {
1683
+ var active = this.$menu.find('.active').removeClass('active')
1684
+ , next = active.next()
1685
+
1686
+ if (!next.length) {
1687
+ next = $(this.$menu.find('li')[0])
1688
+ }
1689
+
1690
+ next.addClass('active')
1691
+ }
1692
+
1693
+ , prev: function (event) {
1694
+ var active = this.$menu.find('.active').removeClass('active')
1695
+ , prev = active.prev()
1696
+
1697
+ if (!prev.length) {
1698
+ prev = this.$menu.find('li').last()
1699
+ }
1700
+
1701
+ prev.addClass('active')
1702
+ }
1703
+
1704
+ , listen: function () {
1705
+ this.$element
1706
+ .on('blur', $.proxy(this.blur, this))
1707
+ .on('keypress', $.proxy(this.keypress, this))
1708
+ .on('keyup', $.proxy(this.keyup, this))
1709
+
1710
+ if ($.browser.webkit || $.browser.msie) {
1711
+ this.$element.on('keydown', $.proxy(this.keypress, this))
1712
+ }
1713
+
1714
+ this.$menu
1715
+ .on('click', $.proxy(this.click, this))
1716
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1717
+ }
1718
+
1719
+ , keyup: function (e) {
1720
+ switch(e.keyCode) {
1721
+ case 40: // down arrow
1722
+ case 38: // up arrow
1723
+ break
1724
+
1725
+ case 9: // tab
1726
+ case 13: // enter
1727
+ if (!this.shown) return
1728
+ this.select()
1729
+ break
1730
+
1731
+ case 27: // escape
1732
+ if (!this.shown) return
1733
+ this.hide()
1734
+ break
1735
+
1736
+ default:
1737
+ this.lookup()
1738
+ }
1739
+
1740
+ e.stopPropagation()
1741
+ e.preventDefault()
1742
+ }
1743
+
1744
+ , keypress: function (e) {
1745
+ if (!this.shown) return
1746
+
1747
+ switch(e.keyCode) {
1748
+ case 9: // tab
1749
+ case 13: // enter
1750
+ case 27: // escape
1751
+ e.preventDefault()
1752
+ break
1753
+
1754
+ case 38: // up arrow
1755
+ if (e.type != 'keydown') break
1756
+ e.preventDefault()
1757
+ this.prev()
1758
+ break
1759
+
1760
+ case 40: // down arrow
1761
+ if (e.type != 'keydown') break
1762
+ e.preventDefault()
1763
+ this.next()
1764
+ break
1765
+ }
1766
+
1767
+ e.stopPropagation()
1768
+ }
1769
+
1770
+ , blur: function (e) {
1771
+ var that = this
1772
+ setTimeout(function () { that.hide() }, 150)
1773
+ }
1774
+
1775
+ , click: function (e) {
1776
+ e.stopPropagation()
1777
+ e.preventDefault()
1778
+ this.select()
1779
+ }
1780
+
1781
+ , mouseenter: function (e) {
1782
+ this.$menu.find('.active').removeClass('active')
1783
+ $(e.currentTarget).addClass('active')
1784
+ }
1785
+
1786
+ }
1787
+
1788
+
1789
+ /* TYPEAHEAD PLUGIN DEFINITION
1790
+ * =========================== */
1791
+
1792
+ $.fn.typeahead = function (option) {
1793
+ return this.each(function () {
1794
+ var $this = $(this)
1795
+ , data = $this.data('typeahead')
1796
+ , options = typeof option == 'object' && option
1797
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
1798
+ if (typeof option == 'string') data[option]()
1799
+ })
1800
+ }
1801
+
1802
+ $.fn.typeahead.defaults = {
1803
+ source: []
1804
+ , items: 8
1805
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
1806
+ , item: '<li><a href="#"></a></li>'
1807
+ }
1808
+
1809
+ $.fn.typeahead.Constructor = Typeahead
1810
+
1811
+
1812
+ /* TYPEAHEAD DATA-API
1813
+ * ================== */
1814
+
1815
+ $(function () {
1816
+ $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
1817
+ var $this = $(this)
1818
+ if ($this.data('typeahead')) return
1819
+ e.preventDefault()
1820
+ $this.typeahead($this.data())
1821
+ })
1822
+ })
1823
+
1824
+ }(window.jQuery);