mtl 1.1.7 → 1.1.8

Sign up to get free protection for your applications and to get access to all the features.
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
+ });