/**
  * Create a new callback server.
  * @param string server URI.
  */
 public function __construct($uri = null)
 {
     parent::__construct($uri);
     $this->posts = new TCollection();
     $this->posts->add(TPage::INPUT_VIEWSTATE);
     $this->response = new TCallbackResponse();
 }
 /**
  * Generates the content in the data grid.
  * This method is invoked when <b>OnDataBinding</b> event is raised.
  * It builds up the data grid according to column definitions
  * data source.
  * This method should only used by control developers.
  * @param TEventParameter event parameter
  */
 protected function onDataBinding($param)
 {
     parent::onDataBinding($param);
     $this->setViewState('Items', null, null);
     $this->removeBodies();
     foreach ($this->items as $item) {
         $this->removeChild($item);
     }
     if (!is_null($this->header)) {
         $this->removeChild($this->header);
         $this->header = null;
     }
     if (!is_null($this->footer)) {
         $this->removeChild($this->footer);
         $this->footer = null;
     }
     if (!is_null($this->pager)) {
         $this->removeChild($this->pager);
         $this->pager = null;
     }
     $this->items->clear();
     foreach ($this->columns as $column) {
         $column->dataBind();
     }
     if (is_null($this->dataSource)) {
         return;
     }
     if ($this->isAllowPaging()) {
         $pageSize = $this->getPageSize();
         $offset = $this->isAllowCustomPaging() ? 0 : $pageSize * $this->getCurrentPageIndex();
     } else {
         $offset = 0;
         $pageSize = self::MAX_PAGE_SIZE;
     }
     $index = 0;
     $editIndex = $this->getEditItemIndex();
     $selectedIndex = $this->getSelectedItemIndex();
     $this->dataItemCount = 0;
     $dataSource = array();
     foreach ($this->dataSource as $data) {
         $this->dataItemCount++;
         $dataSource[] = $data;
         if ($this->isAllowCustomPaging() && $this->dataItemCount > $offset + $pageSize) {
             break;
         }
         if ($this->dataItemCount <= $offset || $this->dataItemCount > $offset + $pageSize) {
             continue;
         }
         if ($index == 0 && $this->isAutoGenerateColumns()) {
             //foreach($this->autoColumns as $column)
             //	$this->removeChild($column);
             $this->autoColumns->clear();
             $columnIndex = 0;
             foreach ($data as $key => $value) {
                 $column = pradoGetApplication()->createComponent('TBoundColumn', 'AutoColumn' . $columnIndex);
                 $column->setHeaderText($key);
                 $column->setDataField($key);
                 $column->setSortExpression($key);
                 $column->dataBind();
                 $this->autoColumns->add($column);
                 $columnIndex++;
             }
         }
         $item = $this->createComponent('TDataGridItem', self::ID_ITEM . $index);
         if ($index == $editIndex) {
             $type = TDataGridItem::TYPE_EDIT_ITEM;
         } else {
             if ($index == $selectedIndex) {
                 $type = TDataGridItem::TYPE_SELECTED_ITEM;
             } else {
                 if ($index % 2) {
                     $type = TDataGridItem::TYPE_ALTERNATING_ITEM;
                 } else {
                     $type = TDataGridItem::TYPE_ITEM;
                 }
             }
         }
         $item->setType($type);
         $item->setData($data);
         $item->setItemIndex($index);
         $this->items->add($item);
         $this->initializeItem($item);
         $p = new TDataGridItemEventParameter();
         $p->item = $item;
         $this->onItemCreated($p);
         $index++;
     }
     $this->setViewState('Items', $dataSource, array());
     $this->header = $this->createComponent('TDataGridItem', self::ID_HEADER);
     $this->header->setType(TDataGridItem::TYPE_HEADER);
     $this->addBody($this->header);
     $this->initializeItem($this->header);
     $p = new TDataGridItemEventParameter();
     $p->item = $this->header;
     $this->onItemCreated($p);
     $this->footer = $this->createComponent('TDataGridItem', self::ID_FOOTER);
     $this->footer->setType(TDataGridItem::TYPE_FOOTER);
     $this->addBody($this->footer);
     $this->initializeItem($this->footer);
     $p = new TDataGridItemEventParameter();
     $p->item = $this->footer;
     $this->onItemCreated($p);
     if ($this->isAllowPaging()) {
         $this->pager = $this->createComponent('TDataGridItem', self::ID_PAGER);
         $this->pager->setType(TDataGridItem::TYPE_PAGER);
         $this->addBody($this->pager);
         $cell = $this->pager->createComponent('TTableCell');
         $this->pager->addBody($cell);
         $p = new TDataGridItemEventParameter();
         $p->item = $this->pager;
         $this->onItemCreated($p);
         $currentPage = $this->getCurrentPageIndex();
         $pageCount = $this->getPageCount();
         if ($currentPage >= $pageCount) {
             $currentPage = $pageCount - 1;
         }
         if ($currentPage < 0) {
             $currentPage = 0;
         }
         $this->setCurrentPageIndex($currentPage);
         $buttonCount = $this->getPagerButtonCount();
         $fromPage = intval($currentPage / $buttonCount) * $buttonCount;
         $toPage = $fromPage + $buttonCount;
         if ($fromPage > 0) {
             $button = $cell->createComponent('TLinkButton');
             $button->setText('...');
             $button->setCommandName(self::CMD_PAGE);
             $button->setCommandParameter($fromPage - 1);
             $button->setCausesValidation(false);
             $cell->addBody($button);
             $cell->addBody(' ');
         }
         for ($i = $fromPage; $i < $toPage; ++$i) {
             if ($i >= $pageCount) {
                 break;
             }
             if ($i == $currentPage) {
                 $cell->addBody(strval($i + 1));
                 $cell->addBody(' ');
             } else {
                 $button = $cell->createComponent('TLinkButton');
                 $button->setText(strval($i + 1));
                 $button->setCommandName(self::CMD_PAGE);
                 $button->setCommandParameter($i);
                 $button->setCausesValidation(false);
                 $cell->addBody($button);
                 $cell->addBody(' ');
             }
         }
         if ($toPage < $pageCount) {
             $button = $cell->createComponent('TLinkButton');
             $button->setText('...');
             $button->setCommandName(self::CMD_PAGE);
             $button->setCommandParameter($toPage);
             $button->setCausesValidation(false);
             $cell->addBody($button);
         }
     }
 }
 /**
  * Parses and intantiates templates.
  * This method is invoked when <b>OnDataBinding</b> event is raised.
  * It parses and instantiates all assoicated templates for the 
  * data listing control and raises related events.
  * This method should only used by control developers.
  * @param TEventParameter event parameter
  */
 protected function onDataBinding($param)
 {
     parent::onDataBinding($param);
     $this->setViewState('Items', null, null);
     $this->removeChildren();
     $this->removeBodies();
     $this->items->clear();
     $this->separators->clear();
     $this->header = null;
     $this->footer = null;
     if (is_null($this->dataSource)) {
         return;
     }
     if (strlen($this->headerTemplate)) {
         $this->header = $this->createComponent('TDataListItem', self::ID_HEADER);
         $this->header->setType(TDataListItem::TYPE_HEADER);
         $this->header->instantiateTemplate($this->headerTemplate);
         $this->addBody($this->header);
         $p = new TDataListItemEventParameter();
         $p->item = $this->header;
         $this->onItemCreated($p);
     }
     $selectedIndex = $this->getSelectedItemIndex();
     $editIndex = $this->getEditItemIndex();
     $count = 0;
     foreach ($this->dataSource as $key => $value) {
         if ($count > 0 && strlen($this->separatorTemplate)) {
             $separator = $this->createComponent('TDataListItem', self::ID_SEPARATOR . "{$count}");
             $separator->setType(TDataListItem::TYPE_SEPARATOR);
             $separator->instantiateTemplate($this->separatorTemplate);
             $this->addBody($separator);
             $this->separators->add($separator);
         }
         $item = null;
         if ($count == $selectedIndex && strlen($this->selectedItemTemplate)) {
             $item = $this->createComponent('TDataListItem', self::ID_ITEM . "{$count}");
             $item->setType(TDataListItem::TYPE_SELECTED_ITEM);
             $item->instantiateTemplate($this->selectedItemTemplate);
         } else {
             if ($count == $editIndex && strlen($this->editItemTemplate)) {
                 $item = $this->createComponent('TDataListItem', self::ID_ITEM . "{$count}");
                 $item->setType(TDataListItem::TYPE_EDIT_ITEM);
                 $item->instantiateTemplate($this->editItemTemplate);
             } else {
                 if ($count % 2 == 1 && strlen($this->alternatingItemTemplate)) {
                     $item = $this->createComponent('TDataListItem', self::ID_ITEM . "{$count}");
                     $item->setType(TDataListItem::TYPE_ALTERNATING_ITEM);
                     $item->instantiateTemplate($this->alternatingItemTemplate);
                 } else {
                     if (strlen($this->itemTemplate)) {
                         $item = $this->createComponent('TDataListItem', self::ID_ITEM . "{$count}");
                         $item->setType(TDataListItem::TYPE_ITEM);
                         $item->instantiateTemplate($this->itemTemplate);
                     }
                 }
             }
         }
         if (!is_null($item)) {
             $item->setItemIndex($count);
             $item->setData($value);
             $this->items->add($item);
             $p = new TDataListItemEventParameter();
             $p->item = $item;
             $this->onItemCreated($p);
         }
         $count++;
     }
     if (strlen($this->footerTemplate)) {
         $this->footer = $this->createComponent('TDataListItem', self::ID_FOOTER);
         $this->footer->setType(TDataListItem::TYPE_FOOTER);
         $this->footer->instantiateTemplate($this->footerTemplate);
         $this->addBody($this->footer);
         $p = new TDataListItemEventParameter();
         $p->item = $this->footer;
         $this->onItemCreated($p);
     }
 }