/**
  * 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);
     }
 }