mtl 1.1.7 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mtl.js +1 -1
  3. data/app/assets/stylesheets/mtl/all.scss +4 -0
  4. data/lib/mtl/version.rb +2 -2
  5. data/package.json +1 -1
  6. data/vendor/assets/javascripts/materialize/cards.js +13 -3
  7. data/vendor/assets/javascripts/materialize/carousel.js +78 -28
  8. data/vendor/assets/javascripts/materialize/chips.js +27 -27
  9. data/vendor/assets/javascripts/materialize/collapsible.js +34 -11
  10. data/vendor/assets/javascripts/materialize/date_picker/picker.date.js +137 -136
  11. data/vendor/assets/javascripts/materialize/date_picker/picker.js +0 -1
  12. data/vendor/assets/javascripts/materialize/date_picker/picker.time.js +686 -0
  13. data/vendor/assets/javascripts/materialize/dropdown.js +19 -12
  14. data/vendor/assets/javascripts/materialize/forms.js +98 -72
  15. data/vendor/assets/javascripts/materialize/global.js +14 -1
  16. data/vendor/assets/javascripts/materialize/jquery.easing.1.4.js +166 -0
  17. data/vendor/assets/javascripts/materialize/materialbox.js +48 -44
  18. data/vendor/assets/javascripts/materialize/modal.js +2 -1
  19. data/vendor/assets/javascripts/materialize/scrollspy.js +10 -5
  20. data/vendor/assets/javascripts/materialize/sideNav.js +44 -14
  21. data/vendor/assets/javascripts/materialize/slider.js +3 -3
  22. data/vendor/assets/javascripts/materialize/tabs.js +17 -7
  23. data/vendor/assets/javascripts/materialize/tapTarget.js +187 -0
  24. data/vendor/assets/javascripts/materialize/transitions.js +2 -2
  25. data/vendor/assets/javascripts/materialize/waves.js +1 -1
  26. data/vendor/assets/javascripts/pdfobject.js +1 -1
  27. data/vendor/assets/stylesheets/materialize/_buttons.scss +11 -12
  28. data/vendor/assets/stylesheets/materialize/_cards.scss +3 -0
  29. data/vendor/assets/stylesheets/materialize/_carousel.scss +7 -1
  30. data/vendor/assets/stylesheets/materialize/_chips.scss +6 -1
  31. data/vendor/assets/stylesheets/materialize/_collapsible.scss +1 -0
  32. data/vendor/assets/stylesheets/materialize/_color.scss +1 -1
  33. data/vendor/assets/stylesheets/materialize/_dropdown.scss +3 -0
  34. data/vendor/assets/stylesheets/materialize/_global.scss +18 -23
  35. data/vendor/assets/stylesheets/materialize/_grid.scss +44 -35
  36. data/vendor/assets/stylesheets/materialize/_modal.scss +2 -2
  37. data/vendor/assets/stylesheets/materialize/_preloader.scss +3 -3
  38. data/vendor/assets/stylesheets/materialize/_pulse.scss +34 -0
  39. data/vendor/assets/stylesheets/materialize/_sideNav.scss +17 -11
  40. data/vendor/assets/stylesheets/materialize/_tapTarget.scss +103 -0
  41. data/vendor/assets/stylesheets/materialize/_variables.scss +15 -6
  42. data/vendor/assets/stylesheets/materialize/date_picker/_default.date.scss +48 -27
  43. data/vendor/assets/stylesheets/materialize/date_picker/_default.scss +10 -0
  44. data/vendor/assets/stylesheets/materialize/date_picker/_default.time.scss +155 -13
  45. data/vendor/assets/stylesheets/materialize/forms/_input-fields.scss +18 -12
  46. data/vendor/assets/stylesheets/materialize/forms/_range.scss +3 -2
  47. data/vendor/assets/stylesheets/materialize/forms/_switches.scss +30 -17
  48. metadata +7 -7
  49. data/vendor/assets/javascripts/materialize/init.js +0 -211
  50. data/vendor/assets/javascripts/materialize/jquery.easing.1.3.js +0 -205
  51. data/vendor/assets/javascripts/materialize/jquery.timeago.min.js +0 -1
  52. data/vendor/assets/javascripts/materialize/prism.js +0 -8
  53. data/vendor/assets/stylesheets/materialize/_prefixer.scss +0 -384
@@ -150,6 +150,14 @@
150
150
  leftPosition = origin.position().left + gutterSpacing;
151
151
  }
152
152
  else if (currAlignment === 'right') {
153
+ // Material icons fix
154
+ activates
155
+ .stop(true, true)
156
+ .css({
157
+ opacity: 0,
158
+ left: 0
159
+ })
160
+
153
161
  var offsetRight = origin.position().left + origin.outerWidth() - activates.outerWidth();
154
162
  gutterSpacing = -curr_options.gutter;
155
163
  leftPosition = offsetRight + gutterSpacing;
@@ -162,9 +170,8 @@
162
170
  left: leftPosition + scrollXOffset
163
171
  });
164
172
 
165
-
166
173
  // Show dropdown
167
- activates.stop(true, true).css('opacity', 0)
174
+ activates
168
175
  .slideDown({
169
176
  queue: false,
170
177
  duration: curr_options.inDuration,
@@ -176,12 +183,12 @@
176
183
  .animate( {opacity: 1}, {queue: false, duration: curr_options.inDuration, easing: 'easeOutSine'});
177
184
 
178
185
  // Add click close handler to document
179
- $(document).bind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'), function (e) {
180
- if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length) ) {
186
+ setTimeout(function() {
187
+ $(document).on('click.'+ activates.attr('id'), function (e) {
181
188
  hideDropdown();
182
- $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));
183
- }
184
- });
189
+ $(document).off('click.'+ activates.attr('id'));
190
+ });
191
+ }, 0);
185
192
  }
186
193
 
187
194
  function hideDropdown() {
@@ -190,14 +197,14 @@
190
197
  activates.fadeOut(curr_options.outDuration);
191
198
  activates.removeClass('active');
192
199
  origin.removeClass('active');
193
- $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));
200
+ $(document).off('click.'+ activates.attr('id'));
194
201
  setTimeout(function() { activates.css('max-height', ''); }, curr_options.outDuration);
195
202
  }
196
203
 
197
204
  // Hover
198
205
  if (curr_options.hover) {
199
206
  var open = false;
200
- origin.unbind('click.' + origin.attr('id'));
207
+ origin.off('click.' + origin.attr('id'));
201
208
  // Hover handler to show dropdown
202
209
  origin.on('mouseenter', function(e){ // Mouse over
203
210
  if (open === false) {
@@ -227,8 +234,8 @@
227
234
  // Click
228
235
  } else {
229
236
  // Click handler to show dropdown
230
- origin.unbind('click.' + origin.attr('id'));
231
- origin.bind('click.'+origin.attr('id'), function(e){
237
+ origin.off('click.' + origin.attr('id'));
238
+ origin.on('click.'+origin.attr('id'), function(e){
232
239
  if (!isFocused) {
233
240
  if ( origin[0] == e.currentTarget &&
234
241
  !origin.hasClass('active') &&
@@ -242,7 +249,7 @@
242
249
  // If origin is clicked and menu is open, close menu
243
250
  else if (origin.hasClass('active')) {
244
251
  hideDropdown();
245
- $(document).unbind('click.'+ activates.attr('id') + ' touchstart.' + activates.attr('id'));
252
+ $(document).off('click.'+ activates.attr('id'));
246
253
  }
247
254
  }
248
255
  });
@@ -6,7 +6,7 @@
6
6
  var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';
7
7
  $(input_selector).each(function(index, element) {
8
8
  var $this = $(this);
9
- if ($(element).val().length > 0 || element.autofocus || $this.attr('placeholder') !== undefined) {
9
+ if ($(element).val().length > 0 || $(element).is(':focus') || element.autofocus || $this.attr('placeholder') !== undefined) {
10
10
  $this.siblings('label').addClass('active');
11
11
  } else if ($(element)[0].validity) {
12
12
  $this.siblings('label').toggleClass('active', $(element)[0].validity.badInput === true);
@@ -129,9 +129,14 @@
129
129
  if (fontFamily) { hiddenDiv.css('font-family', fontFamily); }
130
130
  if (lineHeight) { hiddenDiv.css('line-height', lineHeight); }
131
131
 
132
- if ($textarea.attr('wrap') === "off") {
133
- hiddenDiv.css('overflow-wrap', "normal")
134
- .css('white-space', "pre");
132
+ // Set original-height, if none
133
+ if (!$textarea.data('original-height')) {
134
+ $textarea.data('original-height', $textarea.height());
135
+ }
136
+
137
+ if ($textarea.attr('wrap') === 'off') {
138
+ hiddenDiv.css('overflow-wrap', 'normal')
139
+ .css('white-space', 'pre');
135
140
  }
136
141
 
137
142
  hiddenDiv.text($textarea.val() + '\n');
@@ -149,14 +154,32 @@
149
154
  hiddenDiv.css('width', $(window).width()/2);
150
155
  }
151
156
 
152
- $textarea.css('height', hiddenDiv.height());
157
+
158
+ /**
159
+ * Resize if the new height is greater than the
160
+ * original height of the textarea
161
+ */
162
+ if ($textarea.data('original-height') <= hiddenDiv.height()) {
163
+ $textarea.css('height', hiddenDiv.height());
164
+ } else if ($textarea.val().length < $textarea.data('previous-length')) {
165
+ /**
166
+ * In case the new height is less than original height, it
167
+ * means the textarea has less text than before
168
+ * So we set the height to the original one
169
+ */
170
+ $textarea.css('height', $textarea.data('original-height'));
171
+ }
172
+ $textarea.data('previous-length', $textarea.val().length);
153
173
  }
154
174
 
155
175
  $(text_area_selector).each(function () {
156
176
  var $textarea = $(this);
157
- if ($textarea.val().length) {
158
- textareaAutoResize($textarea);
159
- }
177
+ /**
178
+ * Instead of resizing textarea on document load,
179
+ * store the original height and the original length
180
+ */
181
+ $textarea.data('original-height', $textarea.height());
182
+ $textarea.data('previous-length', $textarea.val().length);
160
183
  });
161
184
 
162
185
  $('body').on('keyup keydown autoresize', text_area_selector, function () {
@@ -189,15 +212,35 @@
189
212
  $(this).after(thumb);
190
213
  });
191
214
 
215
+ var showRangeBubble = function(thumb) {
216
+ var paddingLeft = parseInt(thumb.parent().css('padding-left'));
217
+ var marginLeft = (-7 + paddingLeft) + 'px';
218
+ thumb.velocity({ height: "30px", width: "30px", top: "-30px", marginLeft: marginLeft}, { duration: 300, easing: 'easeOutExpo' });
219
+ };
220
+
221
+ var calcRangeOffset = function(range) {
222
+ var width = range.width() - 15;
223
+ var max = parseFloat(range.attr('max'));
224
+ var min = parseFloat(range.attr('min'));
225
+ var percent = (parseFloat(range.val()) - min) / (max - min);
226
+ return percent * width;
227
+ }
228
+
192
229
  var range_wrapper = '.range-field';
193
230
  $(document).on('change', range_type, function(e) {
194
231
  var thumb = $(this).siblings('.thumb');
195
232
  thumb.find('.value').html($(this).val());
233
+
234
+ if (!thumb.hasClass('active')) {
235
+ showRangeBubble(thumb);
236
+ }
237
+
238
+ var offsetLeft = calcRangeOffset($(this));
239
+ thumb.addClass('active').css('left', offsetLeft);
196
240
  });
197
241
 
198
- $(document).on('input mousedown touchstart', range_type, function(e) {
242
+ $(document).on('mousedown touchstart', range_type, function(e) {
199
243
  var thumb = $(this).siblings('.thumb');
200
- var width = $(this).outerWidth();
201
244
 
202
245
  // If thumb indicator does not exist yet, create it
203
246
  if (thumb.length <= 0) {
@@ -212,26 +255,13 @@
212
255
  $(this).addClass('active');
213
256
 
214
257
  if (!thumb.hasClass('active')) {
215
- thumb.velocity({ height: "30px", width: "30px", top: "-20px", marginLeft: "-15px"}, { duration: 300, easing: 'easeOutExpo' });
258
+ showRangeBubble(thumb);
216
259
  }
217
260
 
218
261
  if (e.type !== 'input') {
219
- if(e.pageX === undefined || e.pageX === null){//mobile
220
- left = e.originalEvent.touches[0].pageX - $(this).offset().left;
221
- }
222
- else{ // desktop
223
- left = e.pageX - $(this).offset().left;
224
- }
225
- if (left < 0) {
226
- left = 0;
227
- }
228
- else if (left > width) {
229
- left = width;
230
- }
231
- thumb.addClass('active').css('left', left);
262
+ var offsetLeft = calcRangeOffset($(this));
263
+ thumb.addClass('active').css('left', offsetLeft);
232
264
  }
233
-
234
- thumb.find('.value').html($(this).val());
235
265
  });
236
266
 
237
267
  $(document).on('mouseup touchend', range_wrapper, function() {
@@ -239,28 +269,18 @@
239
269
  $(this).removeClass('active');
240
270
  });
241
271
 
242
- $(document).on('mousemove touchmove', range_wrapper, function(e) {
272
+ $(document).on('input mousemove touchmove', range_wrapper, function(e) {
243
273
  var thumb = $(this).children('.thumb');
244
274
  var left;
275
+ var input = $(this).find(range_type);
276
+
245
277
  if (range_mousedown) {
246
278
  if (!thumb.hasClass('active')) {
247
- thumb.velocity({ height: '30px', width: '30px', top: '-20px', marginLeft: '-15px'}, { duration: 300, easing: 'easeOutExpo' });
248
- }
249
- if (e.pageX === undefined || e.pageX === null) { //mobile
250
- left = e.originalEvent.touches[0].pageX - $(this).offset().left;
279
+ showRangeBubble(thumb);
251
280
  }
252
- else{ // desktop
253
- left = e.pageX - $(this).offset().left;
254
- }
255
- var width = $(this).outerWidth();
256
281
 
257
- if (left < 0) {
258
- left = 0;
259
- }
260
- else if (left > width) {
261
- left = width;
262
- }
263
- thumb.addClass('active').css('left', left);
282
+ var offsetLeft = calcRangeOffset(input);
283
+ thumb.addClass('active').css('left', offsetLeft);
264
284
  thumb.find('.value').html(thumb.siblings(range_type).val());
265
285
  }
266
286
  });
@@ -269,9 +289,11 @@
269
289
  if (!range_mousedown) {
270
290
 
271
291
  var thumb = $(this).children('.thumb');
292
+ var paddingLeft = parseInt($(this).css('padding-left'));
293
+ var marginLeft = (7 + paddingLeft) + 'px';
272
294
 
273
295
  if (thumb.hasClass('active')) {
274
- thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: '-6px'}, { duration: 100 });
296
+ thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: marginLeft}, { duration: 100 });
275
297
  }
276
298
  thumb.removeClass('active');
277
299
  }
@@ -285,7 +307,8 @@
285
307
  var defaults = {
286
308
  data: {},
287
309
  limit: Infinity,
288
- onAutocomplete: null
310
+ onAutocomplete: null,
311
+ minLength: 1
289
312
  };
290
313
 
291
314
  options = $.extend(defaults, options);
@@ -294,7 +317,7 @@
294
317
  var $input = $(this);
295
318
  var data = options.data,
296
319
  count = 0,
297
- activeIndex = 0,
320
+ activeIndex = -1,
298
321
  oldVal,
299
322
  $inputDiv = $input.closest('.input-field'); // Div to append on
300
323
 
@@ -336,14 +359,26 @@
336
359
 
337
360
  // Reset current element position
338
361
  var resetCurrentElement = function() {
339
- activeIndex = 0;
362
+ activeIndex = -1;
340
363
  $autocomplete.find('.active').removeClass('active');
341
364
  }
342
365
 
366
+ // Remove autocomplete elements
367
+ var removeAutocomplete = function() {
368
+ $autocomplete.empty();
369
+ resetCurrentElement();
370
+ oldVal = undefined;
371
+ };
372
+
373
+ $input.off('blur.autocomplete').on('blur.autocomplete', function() {
374
+ removeAutocomplete();
375
+ });
376
+
343
377
  // Perform search
344
- $input.off('keyup.autocomplete').on('keyup.autocomplete', function (e) {
378
+ $input.off('keyup.autocomplete focus.autocomplete').on('keyup.autocomplete focus.autocomplete', function (e) {
345
379
  // Reset count.
346
380
  count = 0;
381
+ var val = $input.val().toLowerCase();
347
382
 
348
383
  // Don't capture enter or arrow key usage.
349
384
  if (e.which === 13 ||
@@ -352,14 +387,12 @@
352
387
  return;
353
388
  }
354
389
 
355
- var val = $input.val().toLowerCase();
356
390
 
357
391
  // Check if the input isn't empty
358
392
  if (oldVal !== val) {
359
- $autocomplete.empty();
360
- resetCurrentElement();
393
+ removeAutocomplete();
361
394
 
362
- if (val !== '') {
395
+ if (val.length >= options.minLength) {
363
396
  for(var key in data) {
364
397
  if (data.hasOwnProperty(key) &&
365
398
  key.toLowerCase().indexOf(val) !== -1 &&
@@ -396,10 +429,10 @@
396
429
  $active = $autocomplete.children('.active').first();
397
430
 
398
431
  // select element on Enter
399
- if (keyCode === 13) {
432
+ if (keyCode === 13 && activeIndex >= 0) {
400
433
  liElement = $autocomplete.children('li').eq(activeIndex);
401
434
  if (liElement.length) {
402
- liElement.click();
435
+ liElement.trigger('mousedown.autocomplete');
403
436
  e.preventDefault();
404
437
  }
405
438
  return;
@@ -415,23 +448,23 @@
415
448
  }
416
449
 
417
450
  if (keyCode === 40 &&
418
- activeIndex < (numItems - 1) &&
419
- $active.length) {
451
+ activeIndex < (numItems - 1)) {
420
452
  activeIndex++;
421
453
  }
422
454
 
423
455
  $active.removeClass('active');
424
- $autocomplete.children('li').eq(activeIndex).addClass('active');
456
+ if (activeIndex >= 0) {
457
+ $autocomplete.children('li').eq(activeIndex).addClass('active');
458
+ }
425
459
  }
426
460
  });
427
461
 
428
462
  // Set input value
429
- $autocomplete.on('click', 'li', function () {
463
+ $autocomplete.on('mousedown.autocomplete touchstart.autocomplete', 'li', function () {
430
464
  var text = $(this).text().trim();
431
465
  $input.val(text);
432
466
  $input.trigger('change');
433
- $autocomplete.empty();
434
- resetCurrentElement();
467
+ removeAutocomplete();
435
468
 
436
469
  // Handle onAutocomplete callback.
437
470
  if (typeof(options.onAutocomplete) === "function") {
@@ -489,6 +522,7 @@
489
522
  // Add disabled attr if disabled
490
523
  var disabledClass = (option.is(':disabled')) ? 'disabled ' : '';
491
524
  var optgroupClass = (type === 'optgroup-option') ? 'optgroup-option ' : '';
525
+ var multipleCheckbox = multiple ? '<input type="checkbox"' + disabledClass + '/><label></label>' : '';
492
526
 
493
527
  // add icons
494
528
  var icon_url = option.data('icon');
@@ -498,20 +532,12 @@
498
532
  if (!!classes) classString = ' class="' + classes + '"';
499
533
 
500
534
  // Check for multiple type.
501
- if (type === 'multiple') {
502
- options.append($('<li class="' + disabledClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span><input type="checkbox"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));
503
- } else {
504
- options.append($('<li class="' + disabledClass + optgroupClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span>' + option.html() + '</span></li>'));
505
- }
535
+ options.append($('<li class="' + disabledClass + optgroupClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span>' + multipleCheckbox + option.html() + '</span></li>'));
506
536
  return true;
507
537
  }
508
538
 
509
539
  // Check for multiple type.
510
- if (type === 'multiple') {
511
- options.append($('<li class="' + disabledClass + '"><span><input type="checkbox"' + disabledClass + '/><label></label>' + option.html() + '</span></li>'));
512
- } else {
513
- options.append($('<li class="' + disabledClass + optgroupClass + '"><span>' + option.html() + '</span></li>'));
514
- }
540
+ options.append($('<li class="' + disabledClass + optgroupClass + '"><span>' + multipleCheckbox + option.html() + '</span></li>'));
515
541
  };
516
542
 
517
543
  /* Create dropdown structure. */
@@ -545,7 +571,7 @@
545
571
 
546
572
  if (multiple) {
547
573
  $('input[type="checkbox"]', this).prop('checked', function(i, v) { return !v; });
548
- selected = toggleEntryFromArray(valuesSelected, $(this).index(), $select);
574
+ selected = toggleEntryFromArray(valuesSelected, i, $select);
549
575
  $newSelect.trigger('focus');
550
576
  } else {
551
577
  options.find('li').removeClass('active');
@@ -581,7 +607,7 @@
581
607
  $newSelect.after(options);
582
608
  // Check if section element is disabled
583
609
  if (!$select.is(':disabled')) {
584
- $newSelect.dropdown({'hover': false, 'closeOnClick': false});
610
+ $newSelect.dropdown({'hover': false});
585
611
  }
586
612
 
587
613
  // Copy tabindex
@@ -749,7 +775,7 @@
749
775
  entriesArray.splice(index, 1);
750
776
  }
751
777
 
752
- select.siblings('ul.dropdown-content').find('li').eq(entryIndex).toggleClass('active');
778
+ select.siblings('ul.dropdown-content').find('li:not(.optgroup)').eq(entryIndex).toggleClass('active');
753
779
 
754
780
  // use notAdded instead of true (to detect if the option is selected or not)
755
781
  select.find('option').eq(entryIndex).prop('selected', notAdded);
@@ -51,7 +51,20 @@
51
51
  }(window));
52
52
 
53
53
 
54
- // Unique ID
54
+ /**
55
+ * Generate approximated selector string for a jQuery object
56
+ * @param {jQuery} obj jQuery object to be parsed
57
+ * @returns {string}
58
+ */
59
+ Materialize.objectSelectorString = function(obj) {
60
+ var tagStr = obj.prop('tagName') || '';
61
+ var idStr = obj.attr('id') || '';
62
+ var classStr = obj.attr('class') || '';
63
+ return (tagStr + idStr + classStr).replace(/\s/g,'');
64
+ };
65
+
66
+
67
+ // Unique Random ID
55
68
  Materialize.guid = (function() {
56
69
  function s4() {
57
70
  return Math.floor((1 + Math.random()) * 0x10000)
@@ -0,0 +1,166 @@
1
+ /*
2
+ * jQuery Easing v1.4.0 - http://gsgd.co.uk/sandbox/jquery/easing/
3
+ * Open source under the BSD License.
4
+ * Copyright © 2008 George McGinley Smith
5
+ * All rights reserved.
6
+ * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE
7
+ */
8
+
9
+ (function (factory) {
10
+ if (typeof define === "function" && define.amd) {
11
+ define(['jquery'], function ($) {
12
+ return factory($);
13
+ });
14
+ } else if (typeof module === "object" && typeof module.exports === "object") {
15
+ exports = factory(require('jquery'));
16
+ } else {
17
+ factory(jQuery);
18
+ }
19
+ })(function($){
20
+
21
+ // Preserve the original jQuery "swing" easing as "jswing"
22
+ $.easing['jswing'] = $.easing['swing'];
23
+
24
+ var pow = Math.pow,
25
+ sqrt = Math.sqrt,
26
+ sin = Math.sin,
27
+ cos = Math.cos,
28
+ PI = Math.PI,
29
+ c1 = 1.70158,
30
+ c2 = c1 * 1.525,
31
+ c3 = c1 + 1,
32
+ c4 = ( 2 * PI ) / 3,
33
+ c5 = ( 2 * PI ) / 4.5;
34
+
35
+ // x is the fraction of animation progress, in the range 0..1
36
+ function bounceOut(x) {
37
+ var n1 = 7.5625,
38
+ d1 = 2.75;
39
+ if ( x < 1/d1 ) {
40
+ return n1*x*x;
41
+ } else if ( x < 2/d1 ) {
42
+ return n1*(x-=(1.5/d1))*x + .75;
43
+ } else if ( x < 2.5/d1 ) {
44
+ return n1*(x-=(2.25/d1))*x + .9375;
45
+ } else {
46
+ return n1*(x-=(2.625/d1))*x + .984375;
47
+ }
48
+ }
49
+
50
+ $.extend( $.easing,
51
+ {
52
+ def: 'easeOutQuad',
53
+ swing: function (x) {
54
+ return $.easing[$.easing.def](x);
55
+ },
56
+ easeInQuad: function (x) {
57
+ return x * x;
58
+ },
59
+ easeOutQuad: function (x) {
60
+ return 1 - ( 1 - x ) * ( 1 - x );
61
+ },
62
+ easeInOutQuad: function (x) {
63
+ return x < 0.5 ?
64
+ 2 * x * x :
65
+ 1 - pow( -2 * x + 2, 2 ) / 2;
66
+ },
67
+ easeInCubic: function (x) {
68
+ return x * x * x;
69
+ },
70
+ easeOutCubic: function (x) {
71
+ return 1 - pow( 1 - x, 3 );
72
+ },
73
+ easeInOutCubic: function (x) {
74
+ return x < 0.5 ?
75
+ 4 * x * x * x :
76
+ 1 - pow( -2 * x + 2, 3 ) / 2;
77
+ },
78
+ easeInQuart: function (x) {
79
+ return x * x * x * x;
80
+ },
81
+ easeOutQuart: function (x) {
82
+ return 1 - pow( 1 - x, 4 );
83
+ },
84
+ easeInOutQuart: function (x) {
85
+ return x < 0.5 ?
86
+ 8 * x * x * x * x :
87
+ 1 - pow( -2 * x + 2, 4 ) / 2;
88
+ },
89
+ easeInQuint: function (x) {
90
+ return x * x * x * x * x;
91
+ },
92
+ easeOutQuint: function (x) {
93
+ return 1 - pow( 1 - x, 5 );
94
+ },
95
+ easeInOutQuint: function (x) {
96
+ return x < 0.5 ?
97
+ 16 * x * x * x * x * x :
98
+ 1 - pow( -2 * x + 2, 5 ) / 2;
99
+ },
100
+ easeInSine: function (x) {
101
+ return 1 - cos( x * PI/2 );
102
+ },
103
+ easeOutSine: function (x) {
104
+ return sin( x * PI/2 );
105
+ },
106
+ easeInOutSine: function (x) {
107
+ return -( cos( PI * x ) - 1 ) / 2;
108
+ },
109
+ easeInExpo: function (x) {
110
+ return x === 0 ? 0 : pow( 2, 10 * x - 10 );
111
+ },
112
+ easeOutExpo: function (x) {
113
+ return x === 1 ? 1 : 1 - pow( 2, -10 * x );
114
+ },
115
+ easeInOutExpo: function (x) {
116
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
117
+ pow( 2, 20 * x - 10 ) / 2 :
118
+ ( 2 - pow( 2, -20 * x + 10 ) ) / 2;
119
+ },
120
+ easeInCirc: function (x) {
121
+ return 1 - sqrt( 1 - pow( x, 2 ) );
122
+ },
123
+ easeOutCirc: function (x) {
124
+ return sqrt( 1 - pow( x - 1, 2 ) );
125
+ },
126
+ easeInOutCirc: function (x) {
127
+ return x < 0.5 ?
128
+ ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 :
129
+ ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2;
130
+ },
131
+ easeInElastic: function (x) {
132
+ return x === 0 ? 0 : x === 1 ? 1 :
133
+ -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 );
134
+ },
135
+ easeOutElastic: function (x) {
136
+ return x === 0 ? 0 : x === 1 ? 1 :
137
+ pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1;
138
+ },
139
+ easeInOutElastic: function (x) {
140
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
141
+ -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 :
142
+ pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1;
143
+ },
144
+ easeInBack: function (x) {
145
+ return c3 * x * x * x - c1 * x * x;
146
+ },
147
+ easeOutBack: function (x) {
148
+ return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 );
149
+ },
150
+ easeInOutBack: function (x) {
151
+ return x < 0.5 ?
152
+ ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 :
153
+ ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2;
154
+ },
155
+ easeInBounce: function (x) {
156
+ return 1 - bounceOut( 1 - x );
157
+ },
158
+ easeOutBounce: bounceOut,
159
+ easeInOutBounce: function (x) {
160
+ return x < 0.5 ?
161
+ ( 1 - bounceOut( 1 - 2 * x ) ) / 2 :
162
+ ( 1 + bounceOut( 2 * x - 1 ) ) / 2;
163
+ }
164
+ });
165
+
166
+ });