docs: function(){
        var headerElement = this.header.element;
        var footerElement = this.footer ? this.footer.element : null;
  
        //
        // Sync header html
        //
        var headerOuterHTML = domUtils.outerHTML(headerElement);
        if (this.shadowHeaderHTML_ != headerOuterHTML)
        {
          this.shadowHeaderHTML_ = headerOuterHTML;
          replaceTemplateNode(this, 'shadowHeader', headerElement.cloneNode(true));
        }
  
        //
        // Sync footer html
        //
        if (footerElement)
        {
          var footerOuterHTML = domUtils.outerHTML(footerElement);
          if (this.shadowFooterHtml_ != footerOuterHTML)
          {
            this.shadowFooterHtml_ = footerOuterHTML;
            replaceTemplateNode(this, 'shadowFooter', footerElement.cloneNode(true));
          }
        }
  
        //
        // Sync column width
        //
        for (var i = 0, column, columnWidth; column = this.columnWidthSync_[i]; i++)
        {
          columnWidth = column.measure.offsetWidth + 'px';
          cssom.setStyleProperty(column.header.firstChild, 'width', columnWidth);
          if (footerElement)
            cssom.setStyleProperty(column.footer.firstChild, 'width', columnWidth);
        }
  
        //
        // Calc metrics boxes
        //
        var tableWidth = this.tmpl.boundElement.offsetWidth || 0;
        var headerHeight = headerElement.offsetHeight || 0;
        var footerHeight = (footerElement && footerElement.offsetHeight) || 0;
  
        //
        // Update style properties
        //
        this.tmpl.headerExpandCell.style.left = tableWidth + 'px';
        this.tmpl.footerExpandCell.style.left = tableWidth + 'px';
        this.tmpl.tableElement.style.margin = '-' + headerHeight + 'px 0 -' + footerHeight + 'px';
  
        if (this.fitToContainer)
          this.element.style.paddingBottom = (headerHeight + footerHeight) + 'px';
  
        // reset timer
        // it should be at the end of relayout to prevent relayout call while relayout
        this.timer_ = basis.clearImmediate(this.timer_);
      }