Lungo.Element.Pull.coffee 2.9 KB

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