Lungo.View.Aside.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. * Initialize the <articles> layout of a certain <section>
  3. *
  4. * @namespace Lungo.View
  5. * @class Aside
  6. *
  7. * @author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
  8. */
  9. Lungo.View.Aside = (function(lng, undefined) {
  10. var ELEMENT = lng.Constants.ELEMENT;
  11. var CLASS = lng.Constants.CLASS;
  12. var ATTRIBUTE = lng.Constants.ATTRIBUTE;
  13. var DEVICE = lng.Constants.DEVICE;
  14. var QUERY = lng.Constants.QUERY;
  15. var TRANSITION = lng.Constants.TRANSITION.DURATION;
  16. /**
  17. * Active aside for a determinate section
  18. *
  19. * @method active
  20. *
  21. * @param {object} Section element
  22. */
  23. var active = function(section) {
  24. var aside_id = section.data('aside');
  25. var current_aside = lng.Element.Cache.aside;
  26. // Deactive
  27. if ((current_aside && aside_id != current_aside.attr('id')) || aside_id === undefined) {
  28. current_aside.removeClass(CLASS.SHOW).removeClass(CLASS.ACTIVE);
  29. lng.Element.Cache.aside = undefined;
  30. }
  31. // Active
  32. if (aside_id) {
  33. lng.Element.Cache.aside = lng.dom(ELEMENT.ASIDE + '#' + aside_id);
  34. lng.Element.Cache.aside.addClass(CLASS.ACTIVE);
  35. if (lng.DEVICE != DEVICE.PHONE) lng.View.Aside.show(aside_id);
  36. }
  37. return lng.Element.Cache.aside;
  38. };
  39. /**
  40. * Toggle an aside element
  41. *
  42. * @method toggle
  43. *
  44. * @param {string} Aside id
  45. */
  46. var toggle = function() {
  47. if (lng.Element.Cache.aside) {
  48. var is_visible = lng.Element.Cache.aside.hasClass(CLASS.SHOW);
  49. if (is_visible) {
  50. lng.View.Aside.hide();
  51. } else {
  52. lng.View.Aside.show();
  53. }
  54. }
  55. };
  56. /**
  57. * Display an aside element with a particular <section>
  58. *
  59. * @method show
  60. */
  61. var show = function(aside) {
  62. if (lng.Element.Cache.aside) {
  63. setTimeout(function() {
  64. lng.Element.Cache.aside.addClass(CLASS.SHOW);
  65. }, TRANSITION);
  66. if (lng.DEVICE == DEVICE.PHONE) {
  67. lng.Element.Cache.aside.addClass(CLASS.SHOW);
  68. var aside_stylesheet = _asideStylesheet();
  69. lng.Element.Cache.section.addClass(aside_stylesheet).addClass(CLASS.ASIDE);
  70. }
  71. }
  72. };
  73. /**
  74. * Hide an aside element with a particular section
  75. *
  76. * @method hide
  77. */
  78. var hide = function() {
  79. if (lng.Element.Cache.aside) {
  80. if (lng.DEVICE == DEVICE.PHONE) {
  81. var aside_stylesheet = _asideStylesheet();
  82. lng.Element.Cache.section.removeClass(CLASS.ASIDE);
  83. setTimeout(function() {
  84. lng.Element.Cache.aside.removeClass(CLASS.SHOW);
  85. }, TRANSITION);
  86. }
  87. }
  88. };
  89. /**
  90. * @todo
  91. *
  92. * @method suscribeEvents
  93. */
  94. var draggable = function() {
  95. var MIN_XDIFF = parseInt(document.body.getBoundingClientRect().width / 3, 10);
  96. MIN_XDIFF = 128;
  97. lng.dom(QUERY.HREF_ASIDE).each(function() {
  98. var STARTED = false;
  99. var el = lng.dom(this);
  100. var section = el.closest("section");
  101. var aside = lng.dom("aside#" + el.data("aside"));
  102. section.swiping(function(gesture) {
  103. if(!section.hasClass("aside")) {
  104. var xdiff = gesture.currentTouch.x - gesture.iniTouch.x;
  105. var ydiff = Math.abs(gesture.currentTouch.y - gesture.iniTouch.y);
  106. STARTED = STARTED ? true : xdiff > 3*ydiff && xdiff < 50;
  107. if(STARTED) {
  108. xdiff = xdiff > 256 ? 256 : xdiff < 0 ? 0 : xdiff;
  109. aside.addClass(CLASS.SHOW);
  110. section.vendor('transform', 'translateX(' + xdiff + 'px)');
  111. section.vendor('transition-duration', '0s');
  112. } else {
  113. section.attr('style', '');
  114. }
  115. }
  116. });
  117. section.swipe(function(gesture) {
  118. var diff = gesture.currentTouch.x - gesture.iniTouch.x;
  119. var ydiff = Math.abs(gesture.currentTouch.y - gesture.iniTouch.y);
  120. section.attr('style', '');
  121. if(diff > MIN_XDIFF && STARTED) show(aside);
  122. else hide(aside);
  123. STARTED = false;
  124. });
  125. });
  126. };
  127. var _asideStylesheet = function() {
  128. var aside_stylesheet = lng.Element.Cache.aside.attr(ATTRIBUTE.CLASS);
  129. var classes = '';
  130. //@todo: Refactor
  131. if (aside_stylesheet) {
  132. classes += (aside_stylesheet.indexOf(CLASS.RIGHT) > -1) ? CLASS.RIGHT + ' ': '';
  133. classes += (aside_stylesheet.indexOf(CLASS.SMALL) > -1) ? CLASS.SMALL + ' ': '';
  134. }
  135. return classes;
  136. };
  137. return {
  138. active: active,
  139. toggle: toggle,
  140. show: show,
  141. hide: hide,
  142. draggable: draggable
  143. };
  144. })(Lungo);