Lungo.Element.Pull.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * Creates a instance of Pull & Refresh Element
  3. *
  4. * @namespace Lungo.Element
  5. * @class Pull
  6. * @version 1.0
  7. *
  8. * @author Ignacio Olalde <ina@tapquo.com> || @piniphone
  9. * @author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
  10. */
  11. Lungo.Element.Pull = function(element_selector, config_data) {
  12. var REFRESHING_HEIGHT = 60;
  13. var MAX_HEIGHT = 80;
  14. var ANIMATION_TIME = 300;
  15. var CURRENT_DISTANCE = 0;
  16. var REFRESHING = false;
  17. var ELEMENT = $$(element_selector);
  18. var CONTAINER = ELEMENT.siblings('div[data-control="pull"]');
  19. var CONFIG;
  20. var CONFIG_BASE ={
  21. onPull: "Pull down to refresh",
  22. onRelease: "Release to...",
  23. onRefresh: "Loading...",
  24. callback: undefined
  25. };
  26. CONFIG = Lungo.Core.mix(CONFIG_BASE, config_data);
  27. var hide = function() {
  28. _moveElementTo(0, true);
  29. setTimeout(function() {
  30. REFRESHING = false;
  31. document.removeEventListener('touchmove', _blockGestures, false);
  32. }, ANIMATION_TIME);
  33. CURRENT_DISTANCE = 0;
  34. };
  35. var _moveElementTo = function(posY, animate) {
  36. var newPos = posY > MAX_HEIGHT ? MAX_HEIGHT : posY;
  37. if(animate) ELEMENT.addClass('pull');
  38. ELEMENT.style('-webkit-transform', 'translate(0, ' + (newPos) + 'px)');
  39. if(animate) {
  40. setTimeout(function() {
  41. ELEMENT.removeClass('pull');
  42. }, ANIMATION_TIME);
  43. }
  44. };
  45. var _refreshStart = function(event) {
  46. REFRESHING = true;
  47. document.addEventListener('touchmove', _blockGestures, false);
  48. _setContainerTitle(CONFIG.onRefresh);
  49. _setContainerLoading(true);
  50. _moveElementTo(REFRESHING_HEIGHT, true);
  51. if (CONFIG.callback) {
  52. CONFIG.callback.apply(this);
  53. }
  54. };
  55. var _setContainerTitle = function(title) {
  56. CONTAINER.find('strong').html(title);
  57. };
  58. var _setContainerLoading = function(op) {
  59. if (op) {
  60. CONTAINER.addClass("refresh");
  61. } else {
  62. CONTAINER.removeClass("refresh");
  63. }
  64. };
  65. var _setContainerOnPulling = function(op) {
  66. if (op) {
  67. CONTAINER.addClass("rotate");
  68. } else {
  69. CONTAINER.removeClass("rotate");
  70. }
  71. };
  72. var _blockGestures = function(touchEvent) {
  73. touchEvent.preventDefault();
  74. };
  75. var _handlePulling = function(event) {
  76. _moveElementTo(CURRENT_DISTANCE, false);
  77. _setContainerLoading(false);
  78. if (CURRENT_DISTANCE > REFRESHING_HEIGHT) {
  79. _setContainerTitle(CONFIG.onRelease);
  80. _setContainerOnPulling(true);
  81. } else {
  82. _setContainerTitle(CONFIG.onPull);
  83. _setContainerOnPulling(false);
  84. }
  85. };
  86. var _handlePullEnd = function(event) {
  87. if(CURRENT_DISTANCE > REFRESHING_HEIGHT) _refreshStart(); else hide();
  88. };
  89. (function() {
  90. var STARTED = false;
  91. var INI_Y = {};
  92. ELEMENT.bind('touchstart', function(event) {
  93. if(ELEMENT[0].scrollTop <= 1) {
  94. STARTED = true;
  95. INI_Y = $$.isMobile() ? event.touches[0].pageY : event.pageY;
  96. }
  97. }).bind('touchmove', function(event) {
  98. if(!REFRESHING && STARTED) {
  99. current_y = $$.isMobile() ? event.touches[0].pageY : event.pageY;
  100. CURRENT_DISTANCE = current_y - INI_Y;
  101. if(CURRENT_DISTANCE >= 0) {
  102. ELEMENT.style('overflow-y', 'hidden');
  103. _handlePulling();
  104. }
  105. }
  106. }).bind('touchend', function() {
  107. if(STARTED) {
  108. ELEMENT.style('overflow-y', 'scroll');
  109. _handlePullEnd();
  110. }
  111. INI_TOUCH = {};
  112. STARTED = false;
  113. });
  114. })();
  115. return {
  116. hide: hide
  117. };
  118. };