docs: function (forceUpdatePaddings) {
              var state = this.state,
                  pages = state.pages,
                  rows = state.rows,
                  scrollTop = this.$viewport.scrollTop(),
                  scrollLeft = this.$viewport.scrollLeft(),
                  rowIndex = 0,
                  lastY1 = 0,
                  rightmostPageIndex = 0,
                  bottommostPageIndex = 0,
                  i,
                  len,
                  page,
                  pageEl,
                  $pageEl;
  
              rows.length = state.sumWidths = state.sumHeights = state.totalWidth = state.totalHeight = 0;
              state.widestPage.totalActualWidth = state.tallestPage.totalActualHeight = 0;
  
              // update the x/y positions and sizes of each page
              // this is basically used as a cache, since accessing the DOM is slow
              for (i = 0, len = this.$pages.length; i < len; ++i) {
                  $pageEl = this.$pages.eq(i);
                  pageEl = $pageEl[0];
                  page = pages[i];
                  if (!page || forceUpdatePaddings) {
                      $pageEl.css('padding', '');
                      page = {
                          index: i,
                          // only get paddings on the first updatePageStates
                          // @TODO: look into using numeric versions of these styles in IE for better perf
                          paddingLeft: parseFloat($pageEl.css(STYLE_PADDING_LEFT)),
                          paddingRight: parseFloat($pageEl.css(STYLE_PADDING_RIGHT)),
                          paddingTop: parseFloat($pageEl.css(STYLE_PADDING_TOP)),
                          paddingBottom: parseFloat($pageEl.css(STYLE_PADDING_BOTTOM))
                      };
                  }
  
                  if (!page.actualWidth) {
                      page.actualWidth = parseFloat(pageEl.getAttribute('data-width'));
                  }
                  if (!page.actualHeight) {
                      page.actualHeight = parseFloat(pageEl.getAttribute('data-height'));
                  }
  
                  page.totalActualWidth = page.actualWidth + page.paddingLeft + page.paddingRight;
                  page.totalActualHeight = page.actualHeight + page.paddingTop + page.paddingBottom;
  
                  page.width = pageEl.offsetWidth;
                  page.height = pageEl.offsetHeight;
                  page.x0 = pageEl.offsetLeft;
                  page.y0 = pageEl.offsetTop;
  
                  page.x1 = page.width + page.x0;
                  page.y1 = page.height + page.y0;
  
                  // it is in the same rowIndex as the prev if y0 >= prev rowIndex max y1
                  // @NOTE: we add two pixels to y0, because sometimes there
                  // seems to be a little overlap #youcantexplainthat
                  // @TODO: #explainthat
                  if (lastY1 && getMaxY1InRow(pages, rows[rowIndex]) <= page.y0 + 2) {
                      rowIndex++;
                  }
                  lastY1 = page.y1;
                  if (!rows[rowIndex]) {
                      rows[rowIndex] = [];
                  }
                  // all pages are not created equal
                  if (page.totalActualWidth > state.widestPage.totalActualWidth) {
                      state.widestPage = page;
                  }
                  if (page.totalActualHeight > state.tallestPage.totalActualHeight) {
                      state.tallestPage = page;
                  }
                  state.sumWidths += page.width;
                  state.sumHeights += page.height;
                  page.rowIndex = rowIndex;
                  pages[i] = page;
                  rows[rowIndex].push(i);
  
                  if (pages[rightmostPageIndex].x0 + pages[rightmostPageIndex].width < page.x0 + page.width) {
                      rightmostPageIndex = i;
                  }
                  if (pages[bottommostPageIndex].y0 + pages[bottommostPageIndex].height < page.y0 + page.height) {
                      bottommostPageIndex = i;
                  }
              }
  
              state.totalWidth = pages[rightmostPageIndex].x0 + pages[rightmostPageIndex].width;
              state.totalHeight = pages[bottommostPageIndex].y0 + pages[bottommostPageIndex].height;
              state.scrollTop = scrollTop;
              state.scrollLeft = scrollLeft;
              this.setCurrentPage(this.calculateCurrentPage());
          }