fuelux-rails 2.3.2 → 2.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -3
  3. data/lib/fuelux-rails/version.rb +1 -1
  4. data/lib/generators/fuelux/install_generator.rb +2 -2
  5. data/lib/tasks/fuelux-rails_tasks.rake +99 -3
  6. data/vendor/assets/javascripts/fuelux.js +4 -4
  7. data/vendor/assets/javascripts/fuelux/checkbox.js +22 -3
  8. data/vendor/assets/javascripts/fuelux/combobox.js +5 -2
  9. data/vendor/assets/javascripts/fuelux/datagrid.js +61 -12
  10. data/vendor/assets/javascripts/fuelux/intelligent-dropdown.js +132 -0
  11. data/vendor/assets/javascripts/fuelux/pillbox.js +64 -12
  12. data/vendor/assets/javascripts/fuelux/radio.js +11 -1
  13. data/vendor/assets/javascripts/fuelux/search.js +4 -1
  14. data/vendor/assets/javascripts/fuelux/select.js +13 -16
  15. data/vendor/assets/javascripts/fuelux/spinner.js +20 -6
  16. data/vendor/assets/javascripts/fuelux/tree.js +98 -27
  17. data/vendor/assets/javascripts/fuelux/util.js +3 -1
  18. data/vendor/assets/javascripts/fuelux/wizard.js +69 -13
  19. data/vendor/toolkit/fuelux.less +6 -4
  20. data/vendor/toolkit/fuelux/checkbox.less +14 -2
  21. data/vendor/toolkit/fuelux/combobox.less +1 -1
  22. data/vendor/toolkit/fuelux/datagrid.less +5 -0
  23. data/vendor/toolkit/fuelux/intelligent-dropdown.less +5 -0
  24. data/vendor/toolkit/fuelux/pillbox.less +1 -1
  25. data/vendor/toolkit/fuelux/radio.less +4 -2
  26. data/vendor/toolkit/fuelux/search.less +1 -1
  27. data/vendor/toolkit/fuelux/select.less +7 -7
  28. data/vendor/toolkit/fuelux/spinner.less +1 -1
  29. data/vendor/toolkit/fuelux/tree.less +5 -3
  30. data/vendor/toolkit/fuelux/wizard.less +21 -34
  31. metadata +29 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8bcb339d8ad14260944a114b90ac7921c5a41a4
4
- data.tar.gz: 51f37b8629f599000b51dbb4e4f3e4eb7c422e4d
3
+ metadata.gz: 704eff1baaf48f735aca4db6b9f0c0e58d017a94
4
+ data.tar.gz: 7a4116a51a646f2c89884360ec67a0a492f36907
5
5
  SHA512:
6
- metadata.gz: 54f3f97b780d0a675ec888bbde50917ed8814bfa0dae03a87027f9919dcc3a5e8d0a4d350caf718e5d51d1b447f86d3da8264712c49b85f80e3cdeee9be4e52a
7
- data.tar.gz: a932520f888340d8c99872962663ee8b15c85c76d0d4226b31aba8d397c1bf78e31ff99c33f26e8334423f8ef1a770a07eb35afcf09641f197713fa296861c1d
6
+ metadata.gz: 61b4ee030e388045c2e4001728e1e2830e919fc9e88f34605194b2d263474a0085d4e5ea51459ba8349111d0b8f83daa8e10de2876bf3466b9426da1c11848e8
7
+ data.tar.gz: ab771d6f5646c904c570ea119701bf6f73dac1b583c3f017d2b7c62dc984c51c50cdf135316acf159033b40c294d2d85022b7d009303a14488fb20db3e5798e7
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env rake
2
+
2
3
  begin
3
- require 'bundler/setup'
4
+ #require 'bundler/setup'
4
5
  rescue LoadError
5
6
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
7
  end
@@ -23,7 +24,10 @@ end
23
24
 
24
25
 
25
26
 
26
- Bundler::GemHelper.install_tasks
27
+ Bundler::GemHelper.install_tasks if defined? Bundler::GemHelper
28
+
29
+ load 'lib/tasks/fuelux-rails_tasks.rake'
30
+
27
31
 
28
32
  require 'rake/testtask'
29
33
 
@@ -34,5 +38,4 @@ Rake::TestTask.new(:test) do |t|
34
38
  t.verbose = false
35
39
  end
36
40
 
37
-
38
41
  task :default => :test
@@ -1,3 +1,3 @@
1
1
  module FueluxRails
2
- VERSION = "2.3.2"
2
+ VERSION = "2.4.0.rc1"
3
3
  end
@@ -13,7 +13,7 @@ module Fuelux
13
13
  else
14
14
  puts <<-EOM
15
15
  Warning:
16
- app/assets/stylesheets/bootstrap_override.css.less does not exist
16
+ app/assets/stylesheets/bootstrap_overrides.css.less does not exist
17
17
  Run "rails generate bootstrap:install" and then rerun "rails generate fuelux:install"
18
18
  EOM
19
19
  end
@@ -21,7 +21,7 @@ module Fuelux
21
21
  if File.exist?('app/assets/javascripts/application.js')
22
22
  # Add our own require:
23
23
  content = File.read("app/assets/javascripts/application.js")
24
- if content.match(/require_tree\s+\.\s*$/)
24
+ if content.match(/require\s+fuelux\.js\s*$/)
25
25
  # Good enough - that'll include our Fuel UX js
26
26
  else
27
27
  insert_into_file "app/assets/javascripts/application.js", "//= require fuelux.js\n", :after => "jquery_ujs\n"
@@ -1,4 +1,100 @@
1
1
  # desc "Explaining what the task does"
2
- # task :fuelux-rails do
3
- # # Task goes here
4
- # end
2
+ namespace :fuelux_rails do
3
+
4
+ desc "Update files"
5
+ task :update do
6
+ require 'open-uri'
7
+ tag = (ENV['TAG'] || 'master')
8
+ bump_version = (ENV['BUMP_VERSION'] || false)
9
+ bump_version = false if tag.eql? 'master'
10
+ update_all tag
11
+ update_version tag if bump_version
12
+ puts "Updated assets to #{tag}"
13
+ end
14
+
15
+ SCRIPTS_REPO = "https://raw.github.com/ExactTarget/fuelux/%s/src/%s.js"
16
+ SCRIPTS_PATH = "./vendor/assets/javascripts/fuelux/%s.js"
17
+
18
+ SCRIPTS = %w( util checkbox combobox datagrid intelligent-dropdown pillbox
19
+ radio search select spinner tree wizard).freeze
20
+
21
+ STYLESHEETS_REPO = "https://raw.github.com/ExactTarget/fuelux/%s/src/less/%s.less"
22
+ STYLESHEETS_PATH = "./vendor/toolkit/fuelux/%s.less"
23
+ EXTRA_VARIABLES = "// Tree\n// --------------------------------------------------\n@treeBackgroundHover: #DFEEF5;\n@treeBackgroundSelect: #B9DFF1;\n"
24
+
25
+ def update_javascript(file, tag = 'master')
26
+ repo = SCRIPTS_REPO % [tag, file]
27
+ path = SCRIPTS_PATH % file
28
+ begin
29
+ original_file = open(repo)
30
+ rescue OpenURI::HTTPError
31
+ return ''
32
+ end
33
+ open(path, 'wb') do |file|
34
+ file << original_file.read
35
+ end
36
+
37
+ lines = IO.readlines(path).map do |line|
38
+ case
39
+ when line =~ /define\(/
40
+ '!function ($) {'
41
+ when line =~ /require\(/
42
+ ''
43
+ when line =~ /^\}\);/
44
+ '}(window.jQuery);'
45
+ else
46
+ line
47
+ end
48
+ end
49
+
50
+ File.open(path, 'w') {|file| file.puts lines }
51
+ "//= require fuelux/#{file}\n"
52
+ end
53
+
54
+ def update_all_javascripts(tag = 'master')
55
+ requires = SCRIPTS.map do |script|
56
+ update_javascript script, tag
57
+ end
58
+ open('./vendor/assets/javascripts/fuelux.js', 'wb') do |file|
59
+ requires.each {|r| file << r }
60
+ end
61
+ end
62
+
63
+ def update_stylesheet(file, tag = 'master')
64
+ repo = STYLESHEETS_REPO % [tag, file]
65
+ path = STYLESHEETS_PATH % file
66
+ begin
67
+ original_file = open(repo)
68
+ rescue OpenURI::HTTPError
69
+ return ''
70
+ end
71
+ open(path, 'wb') do |file|
72
+ file << original_file.read
73
+ end
74
+ lines = IO.readlines(path)
75
+ File.open(path, 'w') {|file| file.puts lines }
76
+ %(@import "fuelux/#{file}.less";\n)
77
+ end
78
+
79
+ def update_all_stylesheets(tag = 'master')
80
+
81
+ requires = SCRIPTS.map do |script|
82
+ update_stylesheet script, tag
83
+ end.unshift EXTRA_VARIABLES
84
+
85
+ open('./vendor/toolkit/fuelux.less', 'wb') do |file|
86
+ requires.each {|r| file << r }
87
+ end
88
+ end
89
+
90
+ def update_all(tag = 'master')
91
+ update_all_stylesheets
92
+ update_all_javascripts
93
+ end
94
+
95
+ def update_version(tag)
96
+ open('./lib/fuelux-rails/version.rb', 'wb') do |file|
97
+ file << "module FueluxRails\n VERSION = \"#{tag}\"\nend"
98
+ end
99
+ end
100
+ end
@@ -1,12 +1,12 @@
1
1
  //= require fuelux/util
2
+ //= require fuelux/checkbox
2
3
  //= require fuelux/combobox
3
4
  //= require fuelux/datagrid
5
+ //= require fuelux/intelligent-dropdown
4
6
  //= require fuelux/pillbox
5
- //= require fuelux/search
6
- //= require fuelux/spinner
7
- //= require fuelux/checkbox
8
7
  //= require fuelux/radio
8
+ //= require fuelux/search
9
9
  //= require fuelux/select
10
+ //= require fuelux/spinner
10
11
  //= require fuelux/tree
11
- //= require fuelux/search
12
12
  //= require fuelux/wizard
@@ -7,7 +7,10 @@
7
7
  */
8
8
 
9
9
  !function ($) {
10
-
10
+
11
+
12
+
13
+
11
14
  // CHECKBOX CONSTRUCTOR AND PROTOTYPE
12
15
 
13
16
  var Checkbox = function (element, options) {
@@ -32,11 +35,13 @@
32
35
  constructor: Checkbox,
33
36
 
34
37
  setState: function ($chk) {
38
+ $chk = $chk || this.$chk;
39
+
35
40
  var checked = $chk.is(':checked');
36
- var disabled = $chk.is(':disabled');
41
+ var disabled = !!$chk.prop('disabled');
37
42
 
38
43
  // reset classes
39
- this.$icon.removeClass('checked').removeClass('disabled');
44
+ this.$icon.removeClass('checked disabled');
40
45
 
41
46
  // set state of checkbox
42
47
  if (checked === true) {
@@ -64,6 +69,20 @@
64
69
  itemchecked: function (e) {
65
70
  var chk = $(e.target);
66
71
  this.setState(chk);
72
+ },
73
+
74
+ check: function () {
75
+ this.$chk.prop('checked', true);
76
+ this.setState(this.$chk);
77
+ },
78
+
79
+ uncheck: function () {
80
+ this.$chk.prop('checked', false);
81
+ this.setState(this.$chk);
82
+ },
83
+
84
+ isChecked: function () {
85
+ return this.$chk.is(':checked');
67
86
  }
68
87
  };
69
88
 
@@ -8,6 +8,9 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
13
+
11
14
  // COMBOBOX CONSTRUCTOR AND PROTOTYPE
12
15
 
13
16
  var Combobox = function (element, options) {
@@ -47,7 +50,7 @@
47
50
  },
48
51
 
49
52
  selectByValue: function (value) {
50
- var selector = 'li[data-value=' + value + ']';
53
+ var selector = 'li[data-value="' + value + '"]';
51
54
  this.selectBySelector(selector);
52
55
  },
53
56
 
@@ -165,7 +168,7 @@
165
168
  });
166
169
  });
167
170
 
168
- $('body').on('mousedown.combobox.data-api', '.combobox', function (e) {
171
+ $('body').on('mousedown.combobox.data-api', '.combobox', function () {
169
172
  var $this = $(this);
170
173
  if ($this.data('combobox')) return;
171
174
  $this.combobox($this.data());
@@ -8,6 +8,12 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
13
+ // Relates to thead .sorted styles in datagrid.less
14
+ var SORTED_HEADER_OFFSET = 22;
15
+
16
+
11
17
  // DATAGRID CONSTRUCTOR AND PROTOTYPE
12
18
 
13
19
  var Datagrid = function (element, options) {
@@ -17,7 +23,7 @@
17
23
  this.$footer = this.$element.find('tfoot th');
18
24
  this.$footerchildren = this.$footer.children().show().css('visibility', 'hidden');
19
25
  this.$topheader = this.$element.find('thead th');
20
- this.$searchcontrol = this.$element.find('.search');
26
+ this.$searchcontrol = this.$element.find('.datagrid-search');
21
27
  this.$filtercontrol = this.$element.find('.filter');
22
28
  this.$pagesize = this.$element.find('.grid-pagesize');
23
29
  this.$pageinput = this.$element.find('.grid-pager input');
@@ -34,12 +40,23 @@
34
40
 
35
41
  this.options = $.extend(true, {}, $.fn.datagrid.defaults, options);
36
42
 
37
- if(this.$pagesize.hasClass('select')) {
43
+ // Shim until v3 -- account for FuelUX select or native select for page size:
44
+ if (this.$pagesize.hasClass('select')) {
45
+ this.$pagesize.select('selectByValue', this.options.dataOptions.pageSize);
38
46
  this.options.dataOptions.pageSize = parseInt(this.$pagesize.select('selectedItem').value, 10);
39
47
  } else {
48
+ var pageSize = this.options.dataOptions.pageSize;
49
+ this.$pagesize.find('option').filter(function() {
50
+ return $(this).text() === pageSize.toString();
51
+ }).attr('selected', true);
40
52
  this.options.dataOptions.pageSize = parseInt(this.$pagesize.val(), 10);
41
53
  }
42
54
 
55
+ // Shim until v3 -- account for older search class:
56
+ if (this.$searchcontrol.length <= 0) {
57
+ this.$searchcontrol = this.$element.find('.search');
58
+ }
59
+
43
60
  this.columns = this.options.dataSource.columns();
44
61
 
45
62
  this.$nextpagebtn.on('click', $.proxy(this.next, this));
@@ -48,7 +65,7 @@
48
65
  this.$filtercontrol.on('changed', $.proxy(this.filterChanged, this));
49
66
  this.$colheader.on('click', 'th', $.proxy(this.headerClicked, this));
50
67
 
51
- if(this.$pagesize.hasClass('select')) {
68
+ if (this.$pagesize.hasClass('select')) {
52
69
  this.$pagesize.on('changed', $.proxy(this.pagesizeChanged, this));
53
70
  } else {
54
71
  this.$pagesize.on('change', $.proxy(this.pagesizeChanged, this));
@@ -85,10 +102,18 @@
85
102
  },
86
103
 
87
104
  updateColumns: function ($target, direction) {
105
+ this._updateColumns(this.$colheader, $target, direction);
106
+
107
+ if (this.$sizingHeader) {
108
+ this._updateColumns(this.$sizingHeader, this.$sizingHeader.find('th').eq($target.index()), direction);
109
+ }
110
+ },
111
+
112
+ _updateColumns: function ($header, $target, direction) {
88
113
  var className = (direction === 'asc') ? 'icon-chevron-up' : 'icon-chevron-down';
89
- this.$colheader.find('i').remove();
90
- this.$colheader.find('th').removeClass('sorted');
91
- $('<i>').addClass(className).appendTo($target);
114
+ $header.find('i.datagrid-sort').remove();
115
+ $header.find('th').removeClass('sorted');
116
+ $('<i>').addClass(className + ' datagrid-sort').appendTo($target);
92
117
  $target.addClass('sorted');
93
118
  },
94
119
 
@@ -141,12 +166,16 @@
141
166
  $.each(data.data, function (index, row) {
142
167
  rowHTML += '<tr>';
143
168
  $.each(self.columns, function (index, column) {
144
- rowHTML += '<td>' + row[column.property] + '</td>';
169
+ rowHTML += '<td';
170
+ if (column.cssClass) {
171
+ rowHTML += ' class="' + column.cssClass + '"';
172
+ }
173
+ rowHTML += '>' + row[column.property] + '</td>';
145
174
  });
146
175
  rowHTML += '</tr>';
147
176
  });
148
177
 
149
- if (!rowHTML) rowHTML = self.placeholderRowHTML('0 ' + self.options.itemsText);
178
+ if (!rowHTML) rowHTML = self.placeholderRowHTML(self.options.noDataFoundHTML);
150
179
 
151
180
  self.$tbody.html(rowHTML);
152
181
  self.stretchHeight();
@@ -182,7 +211,7 @@
182
211
  },
183
212
 
184
213
  pagesizeChanged: function (e, pageSize) {
185
- if(pageSize) {
214
+ if (pageSize) {
186
215
  this.options.dataOptions.pageSize = parseInt(pageSize.value, 10);
187
216
  } else {
188
217
  this.options.dataOptions.pageSize = parseInt($(e.target).val(), 10);
@@ -193,7 +222,13 @@
193
222
  },
194
223
 
195
224
  pageChanged: function (e) {
196
- this.options.dataOptions.pageIndex = parseInt($(e.target).val(), 10) - 1;
225
+ var pageRequested = parseInt($(e.target).val(), 10);
226
+ pageRequested = (isNaN(pageRequested)) ? 1 : pageRequested;
227
+ var maxPages = this.$pageslabel.text();
228
+
229
+ this.options.dataOptions.pageIndex =
230
+ (pageRequested > maxPages) ? maxPages - 1 : pageRequested - 1;
231
+
197
232
  this.renderData();
198
233
  },
199
234
 
@@ -205,15 +240,20 @@
205
240
 
206
241
  filterChanged: function (e, filter) {
207
242
  this.options.dataOptions.filter = filter;
243
+ this.options.dataOptions.pageIndex = 0;
208
244
  this.renderData();
209
245
  },
210
246
 
211
247
  previous: function () {
248
+ this.$nextpagebtn.attr('disabled', 'disabled');
249
+ this.$prevpagebtn.attr('disabled', 'disabled');
212
250
  this.options.dataOptions.pageIndex--;
213
251
  this.renderData();
214
252
  },
215
253
 
216
254
  next: function () {
255
+ this.$nextpagebtn.attr('disabled', 'disabled');
256
+ this.$prevpagebtn.attr('disabled', 'disabled');
217
257
  this.options.dataOptions.pageIndex++;
218
258
  this.renderData();
219
259
  },
@@ -265,7 +305,15 @@
265
305
 
266
306
  function matchSizingCellWidth(i, el) {
267
307
  if (i === columnCount - 1) return;
268
- $(el).width($sizingCells.eq(i).width());
308
+
309
+ var $el = $(el);
310
+ var $sourceCell = $sizingCells.eq(i);
311
+ var width = $sourceCell.width();
312
+
313
+ // TD needs extra width to match sorted column header
314
+ if ($sourceCell.hasClass('sorted') && $el.prop('tagName') === 'TD') width = width + SORTED_HEADER_OFFSET;
315
+
316
+ $el.width(width);
269
317
  }
270
318
 
271
319
  this.$colheader.find('th').each(matchSizingCellWidth);
@@ -293,7 +341,8 @@
293
341
  dataOptions: { pageIndex: 0, pageSize: 10 },
294
342
  loadingHTML: '<div class="progress progress-striped active" style="width:50%;margin:auto;"><div class="bar" style="width:100%;"></div></div>',
295
343
  itemsText: 'items',
296
- itemText: 'item'
344
+ itemText: 'item',
345
+ noDataFoundHTML: '0 items'
297
346
  };
298
347
 
299
348
  $.fn.datagrid.Constructor = Datagrid;
@@ -0,0 +1,132 @@
1
+ /*
2
+ * Fuel UX Intelligent Bootstrap Dropdowns
3
+ * https://github.com/ExactTarget/fuelux
4
+ *
5
+ * Copyright (c) 2013 ExactTarget
6
+ * Licensed under the MIT license.
7
+ */
8
+
9
+ !function ($) {
10
+
11
+ $(function() {
12
+ $(document.body).on("click", "[data-toggle=dropdown][data-direction]", function( event ) {
13
+
14
+ var dataDirection = $(this).data().direction;
15
+
16
+ // if data-direction is not auto or up, default to bootstraps dropdown
17
+ if( dataDirection === "auto" || dataDirection === "up" ) {
18
+ // only changing css positioning if position is set to static
19
+ // if this doesn"t happen, dropUp will not be correct
20
+ // works correctly for absolute, relative, and fixed positioning
21
+ if( $(this).parent().css("position") === "static" ) {
22
+ $(this).parent().css({ position: "relative"});
23
+ }
24
+
25
+ // only continue into this function if the click came from a user
26
+ if( event.hasOwnProperty("originalEvent") ) {
27
+ // stopping bootstrap event propagation
28
+ event.stopPropagation();
29
+
30
+ // deciding what to do based on data-direction attribute
31
+ if( dataDirection === "auto" ) {
32
+ // have the drop down intelligently decide where to place itself
33
+ forceAutoDropDown( $(this) );
34
+ } else if ( dataDirection === "up" ) {
35
+ forceDropUp( $(this) );
36
+ }
37
+ }
38
+ }
39
+
40
+ });
41
+
42
+ function forceDropUp( element ) {
43
+ var dropDown = element.next();
44
+ var dropUpPadding = 5;
45
+ var topPosition;
46
+
47
+ $(dropDown).addClass("dropUp");
48
+ topPosition = ( ( dropDown.outerHeight() + dropUpPadding ) * -1 ) + "px";
49
+
50
+ dropDown.css({
51
+ visibility: "visible",
52
+ top: topPosition
53
+ });
54
+ element.click();
55
+ }
56
+
57
+ function forceAutoDropDown( element ) {
58
+ var dropDown = element.next();
59
+ var dropUpPadding = 5;
60
+ var topPosition;
61
+
62
+ // setting this so I can get height of dropDown without it being shown
63
+ dropDown.css({ visibility: "hidden" });
64
+
65
+ // deciding where to put menu
66
+ if( dropUpCheck( dropDown ) ) {
67
+ $(dropDown).addClass("dropUp");
68
+ topPosition = ( ( dropDown.outerHeight() + dropUpPadding ) * -1 ) + "px";
69
+ } else {
70
+ $(dropDown).removeClass("dropUp");
71
+ topPosition = "auto";
72
+ }
73
+
74
+ dropDown.css({
75
+ visibility: "visible",
76
+ top: topPosition
77
+ });
78
+ element.click();
79
+ }
80
+
81
+ function dropUpCheck( element ) {
82
+ // caching container
83
+ var $container = getContainer( element );
84
+
85
+ // building object with measurementsances for later use
86
+ var measurements = {};
87
+ measurements.parentHeight = element.parent().outerHeight();
88
+ measurements.parentOffsetTop = element.parent().offset().top;
89
+ measurements.dropdownHeight = element.outerHeight();
90
+ measurements.containerHeight = $container.overflowElement.outerHeight();
91
+
92
+ // this needs to be different if the window is the container or another element is
93
+ measurements.containerOffsetTop = ( !! $container.isWindow ) ? $container.overflowElement.scrollTop() : $container.overflowElement.offset().top;
94
+
95
+ // doing the calculations
96
+ measurements.fromTop = measurements.parentOffsetTop - measurements.containerOffsetTop;
97
+ measurements.fromBottom = measurements.containerHeight - measurements.parentHeight - ( measurements.parentOffsetTop - measurements.containerOffsetTop );
98
+
99
+ // actual determination of where to put menu
100
+ // false = drop down
101
+ // true = drop up
102
+ if( measurements.dropdownHeight < measurements.fromBottom ) {
103
+ return false;
104
+ } else if ( measurements.dropdownHeight < measurements.fromTop ) {
105
+ return true;
106
+ } else if ( measurements.dropdownHeight >= measurements.fromTop && measurements.dropdownHeight >= measurements.fromBottom ) {
107
+ // decide which one is bigger and put it there
108
+ if( measurements.fromTop >= measurements.fromBottom ) {
109
+ return true;
110
+ } else {
111
+ return false;
112
+ }
113
+ }
114
+ }
115
+
116
+ function getContainer( element ) {
117
+ var containerElement = window;
118
+ var isWindow = true;
119
+ $.each( element.parents(), function(index, value) {
120
+ if( $(value).css('overflow') !== 'visible' ) {
121
+ containerElement = value;
122
+ isWindow = false;
123
+ return false;
124
+ }
125
+ });
126
+ return {
127
+ overflowElement: $( containerElement ),
128
+ isWindow: isWindow
129
+ };
130
+ }
131
+ });
132
+ }(window.jQuery);