mtl 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +104 -0
  6. data/Rakefile +6 -0
  7. data/app/assets/javascripts/mtl/clickables.coffee +25 -0
  8. data/app/assets/javascripts/mtl/collapsible.coffee +43 -0
  9. data/app/assets/javascripts/mtl/configuration.coffee.erb +1 -0
  10. data/app/assets/javascripts/mtl/document_modal.coffee +130 -0
  11. data/app/assets/javascripts/mtl/dropdown.coffee +24 -0
  12. data/app/assets/javascripts/mtl/hooks.coffee +14 -0
  13. data/app/assets/javascripts/mtl/icon.coffee.erb +17 -0
  14. data/app/assets/javascripts/mtl/modal.coffee +32 -0
  15. data/app/assets/javascripts/mtl/select.coffee +44 -0
  16. data/app/assets/javascripts/mtl/templates.coffee +4 -0
  17. data/app/assets/javascripts/mtl/toc.coffee +31 -0
  18. data/app/assets/javascripts/mtl.js +42 -0
  19. data/app/assets/stylesheets/mtl/all.scss +69 -0
  20. data/app/assets/stylesheets/mtl/extend/_avatars.scss +37 -0
  21. data/app/assets/stylesheets/mtl/extend/_buttons.scss +31 -0
  22. data/app/assets/stylesheets/mtl/extend/_cards.scss +21 -0
  23. data/app/assets/stylesheets/mtl/extend/_chips.scss +3 -0
  24. data/app/assets/stylesheets/mtl/extend/_collection-files.scss +108 -0
  25. data/app/assets/stylesheets/mtl/extend/_document-modals.scss +95 -0
  26. data/app/assets/stylesheets/mtl/extend/_dropdown.scss +12 -0
  27. data/app/assets/stylesheets/mtl/extend/_forms.scss +66 -0
  28. data/app/assets/stylesheets/mtl/extend/_global.scss +77 -0
  29. data/app/assets/stylesheets/mtl/extend/_grid.scss +25 -0
  30. data/app/assets/stylesheets/mtl/extend/_material-icons.scss +37 -0
  31. data/app/assets/stylesheets/mtl/extend/_mixins.scss +10 -0
  32. data/app/assets/stylesheets/mtl/extend/_roboto-rails.scss +49 -0
  33. data/app/assets/stylesheets/mtl/extend/_side-nav.scss +22 -0
  34. data/app/assets/stylesheets/mtl/extend/_toc.scss +12 -0
  35. data/app/assets/stylesheets/mtl/extend/_typography.scss +32 -0
  36. data/app/assets/stylesheets/mtl/extend/forms/_input-fields.scss +50 -0
  37. data/app/assets/stylesheets/mtl/layouts/_default.scss +220 -0
  38. data/app/assets/stylesheets/mtl/layouts/_single.scss +25 -0
  39. data/app/views/mtl/header.html.erb +25 -0
  40. data/bin/coffeelint.rb +16 -0
  41. data/lib/generators/mtl/install_generator.rb +20 -0
  42. data/lib/generators/mtl/templates/_color.scss +410 -0
  43. data/lib/generators/mtl/templates/_variables.scss +330 -0
  44. data/lib/generators/mtl/templates/mtl.scss +8 -0
  45. data/lib/generators/mtl/templates/simple_form.rb +211 -0
  46. data/lib/mtl/rails/card_file_presenter.rb +70 -0
  47. data/lib/mtl/rails/view_helpers.rb +412 -0
  48. data/lib/mtl/simple_form/suffix.rb +52 -0
  49. data/lib/mtl/version.rb +6 -0
  50. data/lib/mtl.rb +38 -0
  51. data/mtl.gemspec +35 -0
  52. data/package.json +11 -0
  53. data/spec/mtl/rails/card_file_presenter_spec.rb +126 -0
  54. data/spec/mtl/rails/view_helpers_spec.rb +193 -0
  55. data/spec/mtl/simple_form/suffix_spec.rb +39 -0
  56. data/spec/mtl_spec.rb +34 -0
  57. data/spec/spec_helper.rb +18 -0
  58. data/spec/support/dom.rb +15 -0
  59. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.eot +0 -0
  60. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ijmap +1 -0
  61. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.svg +2373 -0
  62. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ttf +0 -0
  63. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff +0 -0
  64. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff2 +0 -0
  65. data/vendor/assets/fonts/roboto/Roboto-Bold.eot +0 -0
  66. data/vendor/assets/fonts/roboto/Roboto-Bold.ttf +0 -0
  67. data/vendor/assets/fonts/roboto/Roboto-Bold.woff +0 -0
  68. data/vendor/assets/fonts/roboto/Roboto-Bold.woff2 +0 -0
  69. data/vendor/assets/fonts/roboto/Roboto-Light.eot +0 -0
  70. data/vendor/assets/fonts/roboto/Roboto-Light.ttf +0 -0
  71. data/vendor/assets/fonts/roboto/Roboto-Light.woff +0 -0
  72. data/vendor/assets/fonts/roboto/Roboto-Light.woff2 +0 -0
  73. data/vendor/assets/fonts/roboto/Roboto-Medium.eot +0 -0
  74. data/vendor/assets/fonts/roboto/Roboto-Medium.ttf +0 -0
  75. data/vendor/assets/fonts/roboto/Roboto-Medium.woff +0 -0
  76. data/vendor/assets/fonts/roboto/Roboto-Medium.woff2 +0 -0
  77. data/vendor/assets/fonts/roboto/Roboto-Regular.eot +0 -0
  78. data/vendor/assets/fonts/roboto/Roboto-Regular.ttf +0 -0
  79. data/vendor/assets/fonts/roboto/Roboto-Regular.woff +0 -0
  80. data/vendor/assets/fonts/roboto/Roboto-Regular.woff2 +0 -0
  81. data/vendor/assets/fonts/roboto/Roboto-Thin.eot +0 -0
  82. data/vendor/assets/fonts/roboto/Roboto-Thin.ttf +0 -0
  83. data/vendor/assets/fonts/roboto/Roboto-Thin.woff +0 -0
  84. data/vendor/assets/fonts/roboto/Roboto-Thin.woff2 +0 -0
  85. data/vendor/assets/javascripts/lodash.js +16607 -0
  86. data/vendor/assets/javascripts/materialize/animation.js +9 -0
  87. data/vendor/assets/javascripts/materialize/buttons.js +91 -0
  88. data/vendor/assets/javascripts/materialize/cards.js +26 -0
  89. data/vendor/assets/javascripts/materialize/carousel.js +454 -0
  90. data/vendor/assets/javascripts/materialize/character_counter.js +72 -0
  91. data/vendor/assets/javascripts/materialize/chips.js +267 -0
  92. data/vendor/assets/javascripts/materialize/collapsible.js +160 -0
  93. data/vendor/assets/javascripts/materialize/date_picker/picker.date.js +1430 -0
  94. data/vendor/assets/javascripts/materialize/date_picker/picker.js +1123 -0
  95. data/vendor/assets/javascripts/materialize/dropdown.js +265 -0
  96. data/vendor/assets/javascripts/materialize/forms.js +681 -0
  97. data/vendor/assets/javascripts/materialize/global.js +45 -0
  98. data/vendor/assets/javascripts/materialize/hammer.min.js +1 -0
  99. data/vendor/assets/javascripts/materialize/init.js +173 -0
  100. data/vendor/assets/javascripts/materialize/initial.js +11 -0
  101. data/vendor/assets/javascripts/materialize/jquery.easing.1.3.js +205 -0
  102. data/vendor/assets/javascripts/materialize/jquery.hammer.js +33 -0
  103. data/vendor/assets/javascripts/materialize/jquery.timeago.min.js +1 -0
  104. data/vendor/assets/javascripts/materialize/leanModal.js +192 -0
  105. data/vendor/assets/javascripts/materialize/materialbox.js +269 -0
  106. data/vendor/assets/javascripts/materialize/parallax.js +58 -0
  107. data/vendor/assets/javascripts/materialize/prism.js +8 -0
  108. data/vendor/assets/javascripts/materialize/pushpin.js +71 -0
  109. data/vendor/assets/javascripts/materialize/scrollFire.js +48 -0
  110. data/vendor/assets/javascripts/materialize/scrollspy.js +283 -0
  111. data/vendor/assets/javascripts/materialize/sideNav.js +352 -0
  112. data/vendor/assets/javascripts/materialize/slider.js +321 -0
  113. data/vendor/assets/javascripts/materialize/tabs.js +148 -0
  114. data/vendor/assets/javascripts/materialize/toasts.js +136 -0
  115. data/vendor/assets/javascripts/materialize/tooltip.js +230 -0
  116. data/vendor/assets/javascripts/materialize/transitions.js +169 -0
  117. data/vendor/assets/javascripts/materialize/velocity.min.js +5 -0
  118. data/vendor/assets/javascripts/materialize/waves.js +338 -0
  119. data/vendor/assets/javascripts/pdfobject.js +254 -0
  120. data/vendor/assets/stylesheets/materialize/_buttons.scss +211 -0
  121. data/vendor/assets/stylesheets/materialize/_cards.scss +185 -0
  122. data/vendor/assets/stylesheets/materialize/_carousel.scss +85 -0
  123. data/vendor/assets/stylesheets/materialize/_chips.scss +74 -0
  124. data/vendor/assets/stylesheets/materialize/_collapsible.scss +90 -0
  125. data/vendor/assets/stylesheets/materialize/_color.scss +412 -0
  126. data/vendor/assets/stylesheets/materialize/_dropdown.scss +57 -0
  127. data/vendor/assets/stylesheets/materialize/_global.scss +781 -0
  128. data/vendor/assets/stylesheets/materialize/_grid.scss +147 -0
  129. data/vendor/assets/stylesheets/materialize/_icons-material-design.scss +5 -0
  130. data/vendor/assets/stylesheets/materialize/_materialbox.scss +42 -0
  131. data/vendor/assets/stylesheets/materialize/_mixins.scss +5 -0
  132. data/vendor/assets/stylesheets/materialize/_modal.scss +90 -0
  133. data/vendor/assets/stylesheets/materialize/_navbar.scss +182 -0
  134. data/vendor/assets/stylesheets/materialize/_normalize.scss +424 -0
  135. data/vendor/assets/stylesheets/materialize/_prefixer.scss +384 -0
  136. data/vendor/assets/stylesheets/materialize/_preloader.scss +334 -0
  137. data/vendor/assets/stylesheets/materialize/_roboto.scss +49 -0
  138. data/vendor/assets/stylesheets/materialize/_sideNav.scss +219 -0
  139. data/vendor/assets/stylesheets/materialize/_slider.scss +92 -0
  140. data/vendor/assets/stylesheets/materialize/_table_of_contents.scss +33 -0
  141. data/vendor/assets/stylesheets/materialize/_tabs.scss +56 -0
  142. data/vendor/assets/stylesheets/materialize/_toast.scss +65 -0
  143. data/vendor/assets/stylesheets/materialize/_tooltip.scss +32 -0
  144. data/vendor/assets/stylesheets/materialize/_typography.scss +61 -0
  145. data/vendor/assets/stylesheets/materialize/_variables.scss +313 -0
  146. data/vendor/assets/stylesheets/materialize/_waves.scss +177 -0
  147. data/vendor/assets/stylesheets/materialize/date_picker/_default.date.scss +435 -0
  148. data/vendor/assets/stylesheets/materialize/date_picker/_default.scss +201 -0
  149. data/vendor/assets/stylesheets/materialize/date_picker/_default.time.scss +125 -0
  150. data/vendor/assets/stylesheets/materialize/forms/_checkboxes.scss +220 -0
  151. data/vendor/assets/stylesheets/materialize/forms/_file-input.scss +38 -0
  152. data/vendor/assets/stylesheets/materialize/forms/_forms.scss +22 -0
  153. data/vendor/assets/stylesheets/materialize/forms/_input-fields.scss +273 -0
  154. data/vendor/assets/stylesheets/materialize/forms/_radio-buttons.scss +119 -0
  155. data/vendor/assets/stylesheets/materialize/forms/_range.scss +159 -0
  156. data/vendor/assets/stylesheets/materialize/forms/_select.scss +116 -0
  157. data/vendor/assets/stylesheets/materialize/forms/_switches.scss +78 -0
  158. metadata +309 -0
@@ -0,0 +1,267 @@
1
+ (function ($) {
2
+ var chipsHandleEvents = false;
3
+ var materialChipsDefaults = {
4
+ data: [],
5
+ placeholder: '',
6
+ secondaryPlaceholder: '',
7
+ };
8
+
9
+ $(document).ready(function(){
10
+ // Handle removal of static chips.
11
+ $(document).on('click', '.chip .close', function(e){
12
+ var $chips = $(this).closest('.chips');
13
+ if ($chips.data('initialized')) {
14
+ return;
15
+ }
16
+ $(this).closest('.chip').remove();
17
+ });
18
+ });
19
+
20
+ $.fn.material_chip = function (options) {
21
+ var self = this;
22
+ this.$el = $(this);
23
+ this.$document = $(document);
24
+ this.SELS = {
25
+ CHIPS: '.chips',
26
+ CHIP: '.chip',
27
+ INPUT: 'input',
28
+ DELETE: '.material-icons',
29
+ SELECTED_CHIP: '.selected',
30
+ };
31
+
32
+ if ('data' === options) {
33
+ return this.$el.data('chips');
34
+ }
35
+
36
+ if ('options' === options) {
37
+ return this.$el.data('options');
38
+ }
39
+
40
+ this.$el.data('options', $.extend({}, materialChipsDefaults, options));
41
+
42
+ // Initialize
43
+ this.init = function() {
44
+ var i = 0;
45
+ var chips;
46
+ self.$el.each(function(){
47
+ var $chips = $(this);
48
+ if ($chips.data('initialized')) {
49
+ // Prevent double initialization.
50
+ return;
51
+ }
52
+ var options = $chips.data('options');
53
+ if (!options.data || !options.data instanceof Array) {
54
+ options.data = [];
55
+ }
56
+ $chips.data('chips', options.data);
57
+ $chips.data('index', i);
58
+ $chips.data('initialized', true);
59
+
60
+ if (!$chips.hasClass(self.SELS.CHIPS)) {
61
+ $chips.addClass('chips');
62
+ }
63
+
64
+ self.chips($chips);
65
+ i++;
66
+ });
67
+ };
68
+
69
+ this.handleEvents = function(){
70
+ var SELS = self.SELS;
71
+
72
+ self.$document.on('click', SELS.CHIPS, function(e){
73
+ $(e.target).find(SELS.INPUT).focus();
74
+ });
75
+
76
+ self.$document.on('click', SELS.CHIP, function(e){
77
+ $(SELS.CHIP).removeClass('selected');
78
+ $(this).toggleClass('selected');
79
+ });
80
+
81
+ self.$document.on('keydown', function(e){
82
+ if ($(e.target).is('input, textarea')) {
83
+ return;
84
+ }
85
+
86
+ // delete
87
+ var $chip = self.$document.find(SELS.CHIP + SELS.SELECTED_CHIP);
88
+ var $chips = $chip.closest(SELS.CHIPS);
89
+ var length = $chip.siblings(SELS.CHIP).length;
90
+ var index;
91
+
92
+ if (!$chip.length) {
93
+ return;
94
+ }
95
+
96
+ if (e.which === 8 || e.which === 46) {
97
+ e.preventDefault();
98
+ var chipsIndex = $chips.data('index');
99
+
100
+ index = $chip.index();
101
+ self.deleteChip(chipsIndex, index, $chips);
102
+
103
+ var selectIndex = null;
104
+ if ((index + 1) < length) {
105
+ selectIndex = index;
106
+ } else if (index === length || (index + 1) === length) {
107
+ selectIndex = length - 1;
108
+ }
109
+
110
+ if (selectIndex < 0) selectIndex = null;
111
+
112
+ if (null !== selectIndex) {
113
+ self.selectChip(chipsIndex, selectIndex, $chips);
114
+ }
115
+ if (!length) $chips.find('input').focus();
116
+
117
+ // left
118
+ } else if (e.which === 37) {
119
+ index = $chip.index() - 1;
120
+ if (index < 0) {
121
+ return;
122
+ }
123
+ $(SELS.CHIP).removeClass('selected');
124
+ self.selectChip($chips.data('index'), index, $chips);
125
+
126
+ // right
127
+ } else if (e.which === 39) {
128
+ index = $chip.index() + 1;
129
+ $(SELS.CHIP).removeClass('selected');
130
+ if (index > length) {
131
+ $chips.find('input').focus();
132
+ return;
133
+ }
134
+ self.selectChip($chips.data('index'), index, $chips);
135
+ }
136
+ });
137
+
138
+ self.$document.on('focusin', SELS.CHIPS + ' ' + SELS.INPUT, function(e){
139
+ $(e.target).closest(SELS.CHIPS).addClass('focus');
140
+ $(SELS.CHIP).removeClass('selected');
141
+ });
142
+
143
+ self.$document.on('focusout', SELS.CHIPS + ' ' + SELS.INPUT, function(e){
144
+ $(e.target).closest(SELS.CHIPS).removeClass('focus');
145
+ });
146
+
147
+ self.$document.on('keydown', SELS.CHIPS + ' ' + SELS.INPUT, function(e){
148
+ var $target = $(e.target);
149
+ var $chips = $target.closest(SELS.CHIPS);
150
+ var chipsIndex = $chips.data('index');
151
+ var chipsLength = $chips.children(SELS.CHIP).length;
152
+
153
+ // enter
154
+ if (13 === e.which) {
155
+ e.preventDefault();
156
+ self.addChip(chipsIndex, {tag: $target.val()}, $chips);
157
+ $target.val('');
158
+ return;
159
+ }
160
+
161
+ // delete or left
162
+ if ((8 === e.keyCode || 37 === e.keyCode) && '' === $target.val() && chipsLength) {
163
+ self.selectChip(chipsIndex, chipsLength - 1, $chips);
164
+ $target.blur();
165
+ return;
166
+ }
167
+ });
168
+
169
+ self.$document.on('click', SELS.CHIPS + ' ' + SELS.DELETE, function(e) {
170
+ var $target = $(e.target);
171
+ var $chips = $target.closest(SELS.CHIPS);
172
+ var $chip = $target.closest(SELS.CHIP);
173
+ e.stopPropagation();
174
+ self.deleteChip(
175
+ $chips.data('index'),
176
+ $chip.index(),
177
+ $chips
178
+ );
179
+ $chips.find('input').focus();
180
+ });
181
+ };
182
+
183
+ this.chips = function($chips) {
184
+ var html = '';
185
+ var options = $chips.data('options');
186
+ $chips.data('chips').forEach(function(elem){
187
+ html += self.renderChip(elem);
188
+ });
189
+ html += '<input class="input" placeholder="">';
190
+ $chips.html(html);
191
+ self.setPlaceholder($chips);
192
+ };
193
+
194
+ this.renderChip = function(elem) {
195
+ if (!elem.tag) return;
196
+
197
+ var html = '<div class="chip">' + elem.tag;
198
+ if (elem.image) {
199
+ html += ' <img src="' + elem.image + '"> ';
200
+ }
201
+ html += '<i class="material-icons close">close</i>';
202
+ html += '</div>';
203
+ return html;
204
+ };
205
+
206
+ this.setPlaceholder = function($chips) {
207
+ var options = $chips.data('options');
208
+ if ($chips.data('chips').length && options.placeholder) {
209
+ $chips.find('input').prop('placeholder', options.placeholder);
210
+ } else if (!$chips.data('chips').length && options.secondaryPlaceholder) {
211
+ $chips.find('input').prop('placeholder', options.secondaryPlaceholder);
212
+ }
213
+ };
214
+
215
+ this.isValid = function($chips, elem) {
216
+ var chips = $chips.data('chips');
217
+ var exists = false;
218
+ for (var i=0; i < chips.length; i++) {
219
+ if (chips[i].tag === elem.tag) {
220
+ exists = true;
221
+ return;
222
+ }
223
+ }
224
+ return '' !== elem.tag && !exists;
225
+ };
226
+
227
+ this.addChip = function(chipsIndex, elem, $chips) {
228
+ if (!self.isValid($chips, elem)) {
229
+ return;
230
+ }
231
+ var options = $chips.data('options');
232
+ var chipHtml = self.renderChip(elem);
233
+ $chips.data('chips').push(elem);
234
+ $(chipHtml).insertBefore($chips.find('input'));
235
+ $chips.trigger('chip.add', elem);
236
+ self.setPlaceholder($chips);
237
+ };
238
+
239
+ this.deleteChip = function(chipsIndex, chipIndex, $chips) {
240
+ var chip = $chips.data('chips')[chipIndex];
241
+ $chips.find('.chip').eq(chipIndex).remove();
242
+ $chips.data('chips').splice(chipIndex, 1);
243
+ $chips.trigger('chip.delete', chip);
244
+ self.setPlaceholder($chips);
245
+ };
246
+
247
+ this.selectChip = function(chipsIndex, chipIndex, $chips) {
248
+ var $chip = $chips.find('.chip').eq(chipIndex);
249
+ if ($chip && false === $chip.hasClass('selected')) {
250
+ $chip.addClass('selected');
251
+ $chips.trigger('chip.select', $chips.data('chips')[chipIndex]);
252
+ }
253
+ };
254
+
255
+ this.getChipsElement = function(index, $chips) {
256
+ return $chips.eq(index);
257
+ };
258
+
259
+ // init
260
+ this.init();
261
+
262
+ if (!chipsHandleEvents) {
263
+ this.handleEvents();
264
+ chipsHandleEvents = true;
265
+ }
266
+ };
267
+ }( jQuery ));
@@ -0,0 +1,160 @@
1
+ (function ($) {
2
+ $.fn.collapsible = function(options) {
3
+ var defaults = {
4
+ accordion: undefined,
5
+ onOpen: undefined,
6
+ onClose: undefined
7
+ };
8
+
9
+ options = $.extend(defaults, options);
10
+
11
+
12
+ return this.each(function() {
13
+
14
+ var $this = $(this);
15
+
16
+ var $panel_headers = $(this).find('> li > .collapsible-header');
17
+
18
+ var collapsible_type = $this.data("collapsible");
19
+
20
+ // Turn off any existing event handlers
21
+ $this.off('click.collapse', '> li > .collapsible-header');
22
+ $panel_headers.off('click.collapse');
23
+
24
+
25
+ /****************
26
+ Helper Functions
27
+ ****************/
28
+
29
+ // Accordion Open
30
+ function accordionOpen(object) {
31
+ $panel_headers = $this.find('> li > .collapsible-header');
32
+ if (object.hasClass('active')) {
33
+ object.parent().addClass('active');
34
+ }
35
+ else {
36
+ object.parent().removeClass('active');
37
+ }
38
+ if (object.parent().hasClass('active')){
39
+ object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: "easeOutQuart", queue: false, complete: function() {$(this).css('height', '');}});
40
+ }
41
+ else{
42
+ object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: "easeOutQuart", queue: false, complete: function() {$(this).css('height', '');}});
43
+ }
44
+
45
+ $panel_headers.not(object).removeClass('active').parent().removeClass('active');
46
+
47
+ // Close previously open accordion elements.
48
+ $panel_headers.not(object).parent().children('.collapsible-body').stop(true,false).each(function() {
49
+ if ($(this).is(':visible')) {
50
+ $(this).slideUp({
51
+ duration: 350,
52
+ easing: "easeOutQuart",
53
+ queue: false,
54
+ complete:
55
+ function() {
56
+ $(this).css('height', '');
57
+ execCallbacks($(this).siblings('.collapsible-header'));
58
+ }
59
+ });
60
+ }
61
+ });
62
+ }
63
+
64
+ // Expandable Open
65
+ function expandableOpen(object) {
66
+ if (object.hasClass('active')) {
67
+ object.parent().addClass('active');
68
+ }
69
+ else {
70
+ object.parent().removeClass('active');
71
+ }
72
+ if (object.parent().hasClass('active')){
73
+ object.siblings('.collapsible-body').stop(true,false).slideDown({ duration: 350, easing: "easeOutQuart", queue: false, complete: function() {$(this).css('height', '');}});
74
+ }
75
+ else {
76
+ object.siblings('.collapsible-body').stop(true,false).slideUp({ duration: 350, easing: "easeOutQuart", queue: false, complete: function() {$(this).css('height', '');}});
77
+ }
78
+ }
79
+
80
+ // Open collapsible. object: .collapsible-header
81
+ function collapsibleOpen(object) {
82
+ if (options.accordion || collapsible_type === "accordion" || collapsible_type === undefined) { // Handle Accordion
83
+ accordionOpen(object);
84
+ } else { // Handle Expandables
85
+ expandableOpen(object);
86
+ }
87
+
88
+ execCallbacks(object);
89
+ }
90
+
91
+ // Handle callbacks
92
+ function execCallbacks(object) {
93
+ if (object.hasClass('active')) {
94
+ if (typeof(options.onOpen) === "function") {
95
+ options.onOpen.call(this, object.parent());
96
+ }
97
+ } else {
98
+ if (typeof(options.onClose) === "function") {
99
+ options.onClose.call(this, object.parent());
100
+ }
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Check if object is children of panel header
106
+ * @param {Object} object Jquery object
107
+ * @return {Boolean} true if it is children
108
+ */
109
+ function isChildrenOfPanelHeader(object) {
110
+
111
+ var panelHeader = getPanelHeader(object);
112
+
113
+ return panelHeader.length > 0;
114
+ }
115
+
116
+ /**
117
+ * Get panel header from a children element
118
+ * @param {Object} object Jquery object
119
+ * @return {Object} panel header object
120
+ */
121
+ function getPanelHeader(object) {
122
+
123
+ return object.closest('li > .collapsible-header');
124
+ }
125
+
126
+ /***** End Helper Functions *****/
127
+
128
+
129
+
130
+ // Add click handler to only direct collapsible header children
131
+ $this.on('click.collapse', '> li > .collapsible-header', function(e) {
132
+ var element = $(e.target);
133
+
134
+ if (isChildrenOfPanelHeader(element)) {
135
+ element = getPanelHeader(element);
136
+ }
137
+
138
+ element.toggleClass('active');
139
+
140
+ collapsibleOpen(element);
141
+ });
142
+
143
+
144
+ // Open first active
145
+ if (options.accordion || collapsible_type === "accordion" || collapsible_type === undefined) { // Handle Accordion
146
+ collapsibleOpen($panel_headers.filter('.active').first());
147
+
148
+ } else { // Handle Expandables
149
+ $panel_headers.filter('.active').each(function() {
150
+ collapsibleOpen($(this));
151
+ });
152
+ }
153
+
154
+ });
155
+ };
156
+
157
+ $(document).ready(function(){
158
+ $('.collapsible').collapsible();
159
+ });
160
+ }( jQuery ));