PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/tart/components/Carousel/View.js

http://github.com/tart/tartJS
JavaScript | 230 lines | 116 code | 55 blank | 59 comment | 16 complexity | a82489e9e4deaf3811fc38512bd0f38b MD5 | raw file
  1. // Copyright 2012 Tart. All Rights Reserved.
  2. //
  3. // @author Firat Yalavuz firat.yalavuz@tart.com.tr
  4. /**
  5. * @fileoverview tart.components.Carousel.View is a base class for all carousel View's.
  6. */
  7. goog.require('tart.components.View');
  8. goog.provide('tart.components.Carousel.View');
  9. /**
  10. * @extends {tart.components.View}
  11. * @constructor
  12. */
  13. tart.components.Carousel.View = function() {
  14. goog.base(this);
  15. this.template = new this.templateClass();
  16. this.domMappings = this.template.domMappings;
  17. this.pagerItemsCache = {};
  18. this.activeItems = null;
  19. };
  20. goog.inherits(tart.components.Carousel.View, tart.components.View);
  21. /**
  22. *
  23. */
  24. tart.components.Carousel.View.prototype.templateClass = tart.components.Carousel.Template;
  25. /**
  26. * Build carousel items from item array
  27. *
  28. * @param {Array.<Object>} itemArray carousel data array.
  29. */
  30. tart.components.Carousel.View.prototype.buildCarouselItems = function(itemArray) {
  31. goog.dom.classlist.remove(this.getDOM(), 'loading');
  32. var carouselItems = this.template.carouselItems(itemArray);
  33. this.get(this.domMappings.ITEMS)[0].innerHTML = '';
  34. goog.dom.appendChild(this.get(this.domMappings.ITEMS)[0], carouselItems);
  35. this.itemsAppended(carouselItems);
  36. this.activeItems = carouselItems;
  37. };
  38. /**
  39. * Render method which has to be overriden
  40. *
  41. * @return {string} markup.
  42. */
  43. tart.components.Carousel.View.prototype.render = function() {
  44. return this.template.base();
  45. };
  46. /**
  47. * get all carousel items' DOM reference
  48. *
  49. * @return {Object} DOM refernce.
  50. * @protected
  51. */
  52. tart.components.Carousel.View.prototype.getAllCarouselItemsDomReference = function() {
  53. var carouselItems = this.get(this.domMappings.ITEMS)[0];
  54. return goog.dom.getChildren(carouselItems);
  55. };
  56. /**
  57. * Animate carousel with given rule
  58. *
  59. * @param {string} direction 'next' or 'previous' TODO: this should be enumarated.
  60. * @param {Array.<Object>} diff items to be inserted.
  61. * @param {number} moveCount count of move.
  62. */
  63. tart.components.Carousel.View.prototype.move = function(direction, diff, moveCount) {
  64. var that = this;
  65. if (diff.length > 0) {
  66. var carouselItems = $(that.get(that.domMappings.ITEMS));
  67. //prevent glitch on rapid movements
  68. carouselItems.stop(true, true);
  69. var marginLeft;
  70. var moveWidth = this.template.properties.CAROUSEL_WIDTH;
  71. var allCarouselItems = $(that.getAllCarouselItemsDomReference());
  72. var markup = $(this.template.carouselItems(diff));
  73. this.activeItems = markup;
  74. for (var i = 0; i < markup.length; i++) {
  75. for (var j = 0; j < allCarouselItems.length; j++) {
  76. if (markup[i] === allCarouselItems[j])
  77. allCarouselItems = allCarouselItems.not(markup[i]);
  78. }
  79. }
  80. if (direction == 'next') {
  81. carouselItems.append(markup);
  82. this.itemsAppended(markup);
  83. marginLeft = '-=' + moveWidth + 'px';
  84. } else {
  85. carouselItems.prepend(markup);
  86. this.itemsAppended(markup);
  87. carouselItems.css('margin-left', (-1 * moveWidth) + 'px');
  88. marginLeft = '+=' + moveWidth + 'px';
  89. }
  90. carouselItems.animate({ 'margin-left': marginLeft }, 500, '', function(){
  91. allCarouselItems.detach();
  92. carouselItems.css('margin-left', '0px');
  93. });
  94. }
  95. };
  96. tart.components.Carousel.View.prototype.itemsAppended = function(items) {
  97. };
  98. /**
  99. * Method to hide previous button.
  100. */
  101. tart.components.Carousel.View.prototype.hidePrev = function() {
  102. goog.style.showElement(this.get(this.domMappings.PREV)[0], false);
  103. };
  104. /**
  105. *
  106. * @param {tart.base.plugin.Pager} pager to build pager.
  107. */
  108. tart.components.Carousel.View.prototype.buildPager = function(pager) {
  109. var that = this;
  110. var pagerElement = that.get(that.domMappings.PAGER)[0];
  111. var totalPage = pager.getTotalPage();
  112. var navigation = that.get(that.domMappings.NAVIGATION)[0];
  113. if (totalPage > 1) { //show pager if only totalPage > 1
  114. if (pagerElement.length > 0) {
  115. var pagerItems = pagerElement.querySelectorAll(that.domMappings.PAGER_ITEMS)[0];
  116. //for each pager create pager button and attach event
  117. for (var i = 1; i <= totalPage; i++) {
  118. (function(i) {
  119. var selected = (i == 1);
  120. var pagerItem = tart.dom.createElement(that.template.pagerItem(i, selected))[0];
  121. goog.events.listen(pagerItem, goog.events.EventType.CLICK, function(){
  122. pager.setCurrentPage(i);
  123. });
  124. goog.dom.appendChild(pagerItems, pagerItem);
  125. that.pagerItemsCache[i] = pagerItem;
  126. })(i);
  127. }
  128. goog.style.showElement(pagerElement, true);
  129. }
  130. goog.style.showElement(navigation, true);
  131. if (!pager.hasPrev()) that.hidePrev();
  132. }
  133. else {
  134. //hide pager if totalPage < 2
  135. pagerElement.hide();
  136. navigation.hide();
  137. }
  138. };
  139. /**
  140. *
  141. * @param {number} pageNum number of selected page.
  142. */
  143. tart.components.Carousel.View.prototype.setPageSelected = function(pageNum) {
  144. var that = this;
  145. var pager = that.get(that.domMappings.PAGER)[0];
  146. var pagerItems = pager.querySelector(that.domMappings.PAGER_ITEMS).querySelectorAll(that.domMappings.PAGER_ITEM);
  147. goog.array.forEach(pagerItems, function(pagerItem) {
  148. goog.dom.classlist.remove(pagerItem, 'selected');
  149. });
  150. that.pagerItemsCache[pageNum] && goog.dom.classlist.add(that.pagerItemsCache[pageNum], 'selected');
  151. };
  152. /**
  153. *
  154. * @param {boolean} hasNext Whether there is a previous page.
  155. * @param {boolean} hasPrev Whether there is a next page.
  156. */
  157. tart.components.Carousel.View.prototype.handleNavigationButtons = function(hasNext, hasPrev) {
  158. var pagerNext = this.get(this.domMappings.NEXT)[0];
  159. var pagerPrev = this.get(this.domMappings.PREV)[0];
  160. goog.style.showElement(pagerNext, true);
  161. goog.style.showElement(pagerPrev, true);
  162. if (!hasNext) goog.style.showElement(pagerNext, false);
  163. if (!hasPrev) goog.style.showElement(pagerPrev, false);
  164. };
  165. /**
  166. * No results handler
  167. *
  168. */
  169. tart.components.Carousel.View.prototype.noResults = function() {
  170. goog.dom.classlist.remove(this.getDOM(), 'loading');
  171. var carouselText = this.template.noResults();
  172. this.get(this.domMappings.ITEMS)[0].innerHTML = carouselText;
  173. this.itemsAppended(carouselText);
  174. this.activeItems = carouselText;
  175. };